Module: SpreeCmCommissioner::OrderDecorator

Defined in:
app/models/spree_cm_commissioner/order_decorator.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.prepended(base) ⇒ Object

rubocop:disable Metrics/MethodLength,Metrics/AbcSize



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 3

def self.prepended(base) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
  base.include SpreeCmCommissioner::PhoneNumberSanitizer
  base.include SpreeCmCommissioner::OrderStateMachine

  base.scope :subscription, -> { where.not(subscription_id: nil) }
  base.scope :paid, -> { where(payment_state: :paid) }
  base.scope :complete_or_canceled, -> { complete.or(where(state: 'canceled')) }
  base.scope :payment, -> { incomplete.where(state: 'payment') }
  base.scope :archived, -> { where.not(archived_at: nil) }
  base.scope :not_archived, -> { where(archived_at: nil) }
  base.scope :without_user, -> { where(user_id: nil) }

  base.scope :filter_by_match_user_contact, lambda { |user|
    complete.where(
      '(email = :email OR intel_phone_number = :intel_phone_number) AND user_id IS NULL',
      email: user.email,
      intel_phone_number: user.intel_phone_number
    )
  }

  base.scope :filter_by_vendor, lambda { |vendor|
    joins(:line_items).where(spree_line_items: { vendor_id: vendor }).distinct
  }

  base.before_create :link_by_phone_number
  base.before_create :associate_customer
  base.before_create :set_tenant_id

  base.validates :promo_total, base::MONEY_VALIDATION
  base.validate :validate_channel_prefix, if: :channel_changed?
  base.validates :phone_number, presence: true, if: :require_phone_number

  base.has_one :invoice, dependent: :destroy, class_name: 'SpreeCmCommissioner::Invoice'
  base.has_one :customer, class_name: 'SpreeCmCommissioner::Customer', through: :subscription

  base.belongs_to :tenant, class_name: 'SpreeCmCommissioner::Tenant', optional: true
  base.belongs_to :subscription, class_name: 'SpreeCmCommissioner::Subscription', optional: true

  base.has_many :taxons, class_name: 'Spree::Taxon', through: :customer
  base.has_many :vendors, through: :products, class_name: 'Spree::Vendor'
  base.has_many :taxons, through: :products, class_name: 'Spree::Taxon'
  base.has_many :guests, through: :line_items, class_name: 'SpreeCmCommissioner::Guest'
  base.has_many :guest_card_classes, class_name: 'SpreeCmCommissioner::GuestCardClass', through: :variants

  base.delegate :customer, to: :user, allow_nil: true

  base.whitelisted_ransackable_associations |= %w[customer taxon payments guests invoice]
  base.whitelisted_ransackable_attributes |= %w[intel_phone_number phone_number email number state]

  def base.search_by_qr_data!(data)
    token = data.match(/^R\d{9,}-([A-Za-z0-9_\-]+)$/)&.captures

    raise ActiveRecord::RecordNotFound, "Couldn't find Spree::Order with QR data: #{data}" unless token

    find_by!(token: token)
  end
end

Instance Method Details

#associate_user!(user, override_email = true) ⇒ Object

overrided add phone_number trigger when update customer detail



95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 95

def associate_user!(user, override_email = true) # rubocop:disable Style/OptionalBooleanParameter
  self.user           = user
  self.email          = user.email if override_email
  self.phone_number   = user.phone_number if user.phone_number.present?
  self.created_by   ||= user
  self.bill_address ||= user.bill_address.try(:clone)
  self.ship_address ||= user.ship_address.try(:clone)

  changes = slice(:user_id, :email, :phone_number, :created_by_id, :bill_address_id, :ship_address_id)

  self.class.unscoped.where(id: self).update_all(changes) # rubocop:disable Rails/SkipsModelValidations
end

#collect_payment_methods(store = nil) ⇒ Object

override



68
69
70
71
72
73
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 68

def collect_payment_methods(store = nil)
  return super if user.blank?
  return super unless user.early_adopter?

  collect_payment_methods_for_early_adopter(store)
end

#collect_payment_methods_for_early_adopter(store = nil) ⇒ Object



75
76
77
78
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 75

def collect_payment_methods_for_early_adopter(store = nil)
  store ||= self.store
  store.payment_methods.available_on_frontend_for_early_adopter.select { |pm| pm.available_for_order?(self) }
end

#create_default_payment_if_eligbleObject

assume check is default payment method for subscription



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 122

def create_default_payment_if_eligble
  return unless subscription?

  if covered_by_store_credit
    payment_method = Spree::PaymentMethod::StoreCredit.available_on_back_end.first_or_create! do |method|
      method.name ||= 'StoreCredit'
      method.stores = [Spree::Store.default] if method.stores.empty?
    end
    source_id = user.store_credit_ids.last
    source_type = 'Spree::StoreCredit'
  else
    payment_method = Spree::PaymentMethod::Check.available_on_back_end.first_or_create! do |method|
      method.name ||= 'Invoice'
      method.stores = [Spree::Store.default] if method.stores.empty?
    end
  end
  payments.create!(
    payment_method: payment_method,
    amount: total,
    source_id: source_id,
    source_type: source_type
  )
  Spree::Checkout::Advance.call(order: self)
end

#customer_addressObject



151
152
153
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 151

def customer_address
  bill_address || ship_address
end

#delivery_required?Boolean

override

Returns:

  • (Boolean)


81
82
83
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 81

def delivery_required?
  line_items.any?(&:delivery_required?)
end

#display_outstanding_balanceObject



191
192
193
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 191

def display_outstanding_balance
  Spree::Money.new(outstanding_balance, currency: currency).to_s
end

#generate_png_qr(size = 120) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 171

def generate_png_qr(size = 120)
  qrcode = RQRCode::QRCode.new(qr_data)
  qrcode.as_png(
    bit_depth: 1,
    border_modules: 1,
    color_mode: ChunkyPNG::COLOR_GRAYSCALE,
    color: 'black',
    file: nil,
    fill: 'white',
    module_px_size: 4,
    resize_exactly_to: false,
    resize_gte_to: false,
    size: size
  )
end

#generate_svg_qrObject



159
160
161
162
163
164
165
166
167
168
169
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 159

def generate_svg_qr
  qrcode = RQRCode::QRCode.new(qr_data)
  qrcode.as_svg(
    color: '000',
    shape_rendering: 'crispEdges',
    module_size: 5,
    standalone: true,
    use_path: true,
    viewbox: '0 0 20 10'
  )
end

#mark_as_archiveObject



108
109
110
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 108

def mark_as_archive
  update(archived_at: Time.current)
end

#order_completed?Boolean

Returns:

  • (Boolean)


155
156
157
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 155

def order_completed?
  complete? && need_confirmation? == false
end

#payment_required?Boolean

overrided

Returns:

  • (Boolean)


86
87
88
89
90
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 86

def payment_required?
  return false if need_confirmation?

  super
end

#qr_dataObject



187
188
189
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 187

def qr_data
  "#{number}-#{token}"
end

#subscription?Boolean

Returns:

  • (Boolean)


147
148
149
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 147

def subscription?
  subscription.present?
end

#ticket_seller_user?Boolean

Returns:

  • (Boolean)


61
62
63
64
65
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 61

def ticket_seller_user?
  return false if user.nil?

  user.has_spree_role?('ticket_seller')
end

#valid_promotion_idsObject

overrided avoid raise error when source_id is nil. github.com/channainfo/commissioner/pull/843



115
116
117
118
119
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 115

def valid_promotion_ids
  all_adjustments.eligible.nonzero.promotion
                 .where.not(source_id: nil)
                 .map { |a| a.source.promotion_id }.uniq
end