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
# 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::OrderBibNumberConcern
  base.include SpreeCmCommissioner::OrderRequestable

  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 :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.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.belongs_to :subscription, class_name: 'SpreeCmCommissioner::Subscription', optional: true
  base.has_one :customer, class_name: 'SpreeCmCommissioner::Customer', through: :subscription
  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.delegate :customer, to: :user, allow_nil: true

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

  base.after_update :precalculate_conversion, if: -> { state_changed_to_complete? }
  base.after_update :precalculate_conversion, if: -> { state_changed_to_canceled? }

  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

  base.belongs_to :tenant, class_name: 'SpreeCmCommissioner::Tenant'
  base.before_create :set_tenant_id
end

Instance Method Details

#after_cancelObject

override



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

def after_cancel
  super

  precalculate_conversion
end

#after_resumeObject

override



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

def after_resume
  super

  precalculate_conversion
end

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

overrided add phone_number trigger when update customer detail



127
128
129
130
131
132
133
134
135
136
137
138
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 127

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



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

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



94
95
96
97
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 94

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

#confirmation_delivered?Boolean

overrided not to send email yet to user if order needs confirmation it will send after vendors accepted.



113
114
115
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 113

def confirmation_delivered?
  confirmation_delivered || need_confirmation?
end

#create_default_payment_if_eligbleObject

assume check is default payment method for subscription



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 150

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



179
180
181
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 179

def customer_address
  bill_address || ship_address
end

#delivery_required?Boolean



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

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

#display_outstanding_balanceObject



219
220
221
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 219

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

#generate_png_qr(size = 120) ⇒ Object



199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 199

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



187
188
189
190
191
192
193
194
195
196
197
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 187

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

#order_completed?Boolean



183
184
185
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 183

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

#payment_required?Boolean

overrided



118
119
120
121
122
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 118

def payment_required?
  return false if need_confirmation?

  super
end

#precalculate_conversionObject



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

def precalculate_conversion
  line_items.each do |item|
    SpreeCmCommissioner::ConversionPreCalculatorJob.perform_later(item.product_id)
  end
end

#qr_dataObject



215
216
217
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 215

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

#state_changed_to_canceled?Boolean



103
104
105
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 103

def state_changed_to_canceled?
  saved_change_to_state? && state == 'canceled'
end

#state_changed_to_complete?Boolean



99
100
101
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 99

def state_changed_to_complete?
  saved_change_to_state? && state == 'complete'
end

#subscription?Boolean



175
176
177
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 175

def subscription?
  subscription.present?
end

#ticket_seller_user?Boolean



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

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



143
144
145
146
147
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 143

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