Class: Spree::Orders::Approve

Inherits:
Object
  • Object
show all
Includes:
ServiceModule::Base
Defined in:
app/services/spree/orders/approve.rb

Instance Method Summary collapse

Methods included from ServiceModule::Base

prepended

Instance Method Details

#call(order:, approver: nil, level: nil, note: nil) ⇒ Spree::ServiceModule::Result

Approves an order and records a Spree::OrderApproval history record.

The legacy keyword ‘approver:` remains valid; new keywords (`level:`, `note:`) are additive and stored on the approval record.

Parameters:

  • order (Spree::Order)
  • approver (Object, nil) (defaults to: nil)

    the user/admin who approved

  • level (String, nil) (defaults to: nil)

    approval level (used by 6.0 multi-level B2B flow)

  • note (String, nil) (defaults to: nil)

    staff-facing note

Returns:



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/services/spree/orders/approve.rb', line 16

def call(order:, approver: nil, level: nil, note: nil)
  decided_at = Time.current

  order.transaction do
    order.approvals.create!(
      status: 'approved',
      level: level,
      note: note,
      approver: approver,
      decided_at: decided_at,
      created_at: decided_at
    )

    changes = { considered_risky: false, approved_at: decided_at }
    changes[:approver_id] = approver.id if approver.present?
    order.update_columns(changes)
  end

  order.publish_event('order.approved')
  success(order.reload)
rescue ActiveRecord::RecordInvalid, StateMachines::InvalidTransition
  failure(order)
end