Module: SpreeCmCommissioner::OrderDecorator
- Defined in:
- app/models/spree_cm_commissioner/order_decorator.rb
Class Method Summary collapse
-
.prepended(base) ⇒ Object
rubocop:disable Metrics/MethodLength,Metrics/AbcSize.
Instance Method Summary collapse
-
#associate_user!(user, override_email = true) ⇒ Object
overrided add phone_number trigger when update customer detail.
-
#collect_payment_methods(store = nil) ⇒ Object
override.
- #collect_payment_methods_for_early_adopter(store = nil) ⇒ Object
-
#create_default_payment_if_eligble ⇒ Object
assume check is default payment method for subscription.
- #customer_address ⇒ Object
-
#delivery_required? ⇒ Boolean
override.
- #display_outstanding_balance ⇒ Object
- #generate_png_qr(size = 120) ⇒ Object
- #generate_svg_qr ⇒ Object
-
#insufficient_stock_lines ⇒ Object
override spree use this method to check stock availability & consider whether :order can continue to next state.
- #mark_as_archive ⇒ Object
- #order_completed? ⇒ Boolean
-
#payment_host ⇒ Object
override spree_vpago method.
-
#payment_required? ⇒ Boolean
overrided.
- #qr_data ⇒ Object
- #subscription? ⇒ Boolean
- #ticket_seller_user? ⇒ Boolean
-
#valid_promotion_ids ⇒ Object
overrided avoid raise error when source_id is nil.
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 60 61 62 63 |
# 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::OrderSeatable 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 :saved_guests, -> { distinct }, through: :guests, class_name: 'SpreeCmCommissioner::SavedGuest' base.has_many :blocks, through: :guests, class_name: 'SpreeCmCommissioner::Block', source: :block base.has_many :reserved_blocks, through: :guests, class_name: 'SpreeCmCommissioner::ReservedBlock' 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
106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 106 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
79 80 81 82 83 84 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 79 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
86 87 88 89 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 86 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_eligble ⇒ Object
assume check is default payment method for subscription
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 140 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_address ⇒ Object
169 170 171 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 169 def customer_address bill_address || ship_address end |
#delivery_required? ⇒ Boolean
override
92 93 94 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 92 def delivery_required? line_items.any?(&:delivery_required?) end |
#display_outstanding_balance ⇒ Object
209 210 211 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 209 def display_outstanding_balance Spree::Money.new(outstanding_balance, currency: currency).to_s end |
#generate_png_qr(size = 120) ⇒ Object
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 189 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_qr ⇒ Object
177 178 179 180 181 182 183 184 185 186 187 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 177 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 |
#insufficient_stock_lines ⇒ Object
override spree use this method to check stock availability & consider whether :order can continue to next state.
67 68 69 70 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 67 def insufficient_stock_lines checker = SpreeCmCommissioner::Stock::OrderAvailabilityChecker.new(self) checker.insufficient_stock_lines end |
#mark_as_archive ⇒ Object
119 120 121 122 123 124 125 126 127 128 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 119 def mark_as_archive blocks_canceled = begin cancel_blocks! true rescue StandardError false end update(archived_at: Time.current) if blocks_canceled end |
#order_completed? ⇒ Boolean
173 174 175 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 173 def order_completed? complete? && need_confirmation? == false end |
#payment_host ⇒ Object
override spree_vpago method
214 215 216 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 214 def payment_host tenant&.host.presence || ENV.fetch('DEFAULT_URL_HOST') end |
#payment_required? ⇒ Boolean
overrided
97 98 99 100 101 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 97 def payment_required? return false if need_confirmation? super end |
#qr_data ⇒ Object
205 206 207 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 205 def qr_data "#{number}-#{token}" end |
#subscription? ⇒ Boolean
165 166 167 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 165 def subscription? subscription.present? end |
#ticket_seller_user? ⇒ Boolean
72 73 74 75 76 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 72 def ticket_seller_user? return false if user.nil? user.has_spree_role?('ticket_seller') end |
#valid_promotion_ids ⇒ Object
overrided avoid raise error when source_id is nil. github.com/channainfo/commissioner/pull/843
133 134 135 136 137 |
# File 'app/models/spree_cm_commissioner/order_decorator.rb', line 133 def valid_promotion_ids all_adjustments.eligible.nonzero.promotion .where.not(source_id: nil) .map { |a| a.source.promotion_id }.uniq end |