Class: Spree::Orders::Create

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

Overview

Admin-side order creation. One-shot: customer, items, addresses, currency, market, locale, notes, metadata, and a coupon code in a single call. Invalid coupons are non-fatal — the order is created and ‘result.value` carries `discount_application_errors`.

Standalone from Spree::Carts::Create (storefront). Admin-created orders are first-class Spree::Order records (status: ‘draft’) in 5.x and remain so in 6.0 — Spree::Cart in 6.0 is storefront-only.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ServiceModule::Base

prepended

Instance Attribute Details

#discount_application_errorsObject (readonly)

Returns the value of attribute discount_application_errors.



14
15
16
# File 'app/services/spree/orders/create.rb', line 14

def discount_application_errors
  @discount_application_errors
end

Instance Method Details

#call(store:, user: nil, params: {}) ⇒ Spree::ServiceModule::Result

Parameters:

  • store (Spree::Store)
  • user (Object, nil) (defaults to: nil)

    resolved customer (Spree.user_class instance)

  • params (Hash) (defaults to: {})

    order params (see admin API docs)

Returns:



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'app/services/spree/orders/create.rb', line 20

def call(store:, user: nil, params: {})
  @store = store
  @user = user
  @params = params.to_h.deep_symbolize_keys
  @discount_application_errors = []

  return failure(:store_is_required) if store.nil?

  order = nil
  ApplicationRecord.transaction do
    order = build_order
    assign_addresses(order)
    order.tags = @params[:tags] if @params[:tags]
    order.save!

    add_items(order) if @params[:items].present?
    build_shipments(order)
    apply_coupon(order) if @params[:coupon_code].present?
    order.update_with_updater!
  end

  success(order.reload)
rescue ActiveRecord::RecordInvalid => e
  failure(e.record, e.record.errors.full_messages.to_sentence)
end