Module: SpreeCmCommissioner::LineItemDecorator
- Defined in:
- app/models/spree_cm_commissioner/line_item_decorator.rb
Class Method Summary collapse
- .include_modules(base) ⇒ Object
- .pending_guests_query ⇒ Object
-
.prepended(base) ⇒ Object
rubocop:disable Metrics/MethodLength,Metrics/AbcSize.
Instance Method Summary collapse
- #accepted? ⇒ Boolean
- #accepted_by(user) ⇒ Object
- #allowed_self_check_in? ⇒ Boolean
- #amount_per_guest ⇒ Object
- #commission_rate ⇒ Object
- #completion_steps ⇒ Object
- #discontinue_on ⇒ Object
- #generate_png_qr(size = 120) ⇒ Object
- #generate_svg_qr ⇒ Object
- #jwt_token ⇒ Object
- #kyc ⇒ Object
- #month ⇒ Object
- #qr_data ⇒ Object
- #rejected? ⇒ Boolean
- #rejected_by(user) ⇒ Object
- #required_self_check_in_location? ⇒ Boolean
-
#sufficient_stock? ⇒ Boolean
override.
-
#update_price ⇒ Object
override to calculate price per date for permanent stock.
-
#update_price_from_modifier(currency, opts) ⇒ Object
override to calculate price per date for permanent stock.
Class Method Details
.include_modules(base) ⇒ Object
67 68 69 70 71 72 73 74 75 76 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 67 def self.include_modules(base) base.include Spree::Core::NumberGenerator.new(prefix: 'L') base.include SpreeCmCommissioner::LineItemDurationable base.include SpreeCmCommissioner::LineItemsFilterScope base.include SpreeCmCommissioner::LineItemGuestsConcern base.include SpreeCmCommissioner::LineItemTransitable base.include SpreeCmCommissioner::ProductType base.include SpreeCmCommissioner::ProductDelegation base.include SpreeCmCommissioner::KycBitwise end |
.pending_guests_query ⇒ Object
82 83 84 85 86 87 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 82 def self.pending_guests_query lambda { left_outer_joins(:id_card) .where(upload_later: true, id_card: { front_image: nil }) } end |
.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 64 65 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 3 def self.prepended(base) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize include_modules(base) base.belongs_to :accepter, class_name: 'Spree::User', optional: true base.belongs_to :rejecter, class_name: 'Spree::User', optional: true base.belongs_to :event, class_name: 'Spree::Taxon', optional: true, inverse_of: :line_items base.has_one :google_wallet, class_name: 'SpreeCmCommissioner::GoogleWallet', through: :product base.has_many :option_types, through: :product base.has_many :inventory_items, lambda { |line_item| where(inventory_date: nil).or(where(inventory_date: line_item.date_range)) }, through: :variant base.has_many :taxons, class_name: 'Spree::Taxon', through: :product base.has_many :guests, class_name: 'SpreeCmCommissioner::Guest', dependent: :destroy base.has_many :guests_with_blocks, -> { where.not(block_id: nil) }, class_name: 'SpreeCmCommissioner::Guest' base.has_many :reserved_blocks, through: :guests, class_name: 'SpreeCmCommissioner::ReservedBlock' base.has_many :pending_guests, pending_guests_query, class_name: 'SpreeCmCommissioner::Guest', dependent: :destroy base.has_many :product_completion_steps, class_name: 'SpreeCmCommissioner::ProductCompletionStep', through: :product base.before_validation -> { self.product_type = variant.product_type || product.product_type }, if: -> { product_type.nil? } base.before_save :update_vendor_id base.after_commit :persist_completion_steps_to_public_metadata, on: :create base.before_create :add_due_date, if: :subscription? base.validate :ensure_not_exceed_max_quantity_per_order, if: -> { variant&.max_quantity_per_order.present? } base.validate :ensure_all_guests_have_blocks, if: -> { variant&.blocks&.any? } base.whitelisted_ransackable_associations |= %w[guests order] base.whitelisted_ransackable_attributes |= %w[number to_date from_date vendor_id] base.delegate :delivery_required?, :high_demand, to: :variant base.accepts_nested_attributes_for :guests, allow_destroy: true def base.json_api_columns json_api_columns = column_names.reject { |c| c.match(/_id$|id|preferences|(.*)password|(.*)token|(.*)api_key/) } json_api_columns << :options_text json_api_columns << :vendor_id end def discontinue_on variant.discontinue_on || product.discontinue_on end def base.search_by_qr_data!(data) matches = data.match(/(R\d+)-([A-Za-z0-9_\-]+)-(L\d+)/)&.captures raise ActiveRecord::RecordNotFound, "Couldn't find Spree::LineItem with QR data: #{data}" unless matches order_number, order_token, line_item_id = matches line_item_id = line_item_id.delete('L').to_i Spree::LineItem.joins(:order) .find_by(id: line_item_id, spree_orders: { number: order_number, token: order_token }) end end |
Instance Method Details
#accepted? ⇒ Boolean
140 141 142 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 140 def accepted? accepted_at.present? end |
#accepted_by(user) ⇒ Object
148 149 150 151 152 153 154 155 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 148 def accepted_by(user) return if accepted_at.present? && accepter_id.present? update( accepted_at: Time.current, accepter: user ) end |
#allowed_self_check_in? ⇒ Boolean
124 125 126 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 124 def allowed_self_check_in? allow_self_check_in? end |
#amount_per_guest ⇒ Object
132 133 134 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 132 def amount_per_guest amount / quantity end |
#commission_rate ⇒ Object
136 137 138 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 136 def commission_rate product.commission_rate || vendor&.commission_rate || 0 end |
#completion_steps ⇒ Object
200 201 202 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 200 def completion_steps [:completion_steps] || [] end |
#discontinue_on ⇒ Object
50 51 52 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 50 def discontinue_on variant.discontinue_on || product.discontinue_on end |
#generate_png_qr(size = 120) ⇒ Object
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 178 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
166 167 168 169 170 171 172 173 174 175 176 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 166 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 |
#jwt_token ⇒ Object
213 214 215 216 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 213 def jwt_token payload = { order_number: order.number, line_item_id: id } SpreeCmCommissioner::OrderJwtToken.encode(payload, order.token) end |
#kyc ⇒ Object
78 79 80 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 78 def kyc variant.kyc || product.kyc end |
#month ⇒ Object
209 210 211 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 209 def month to_date.strftime('%B %Y') end |
#qr_data ⇒ Object
194 195 196 197 198 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 194 def qr_data return nil if order.nil? "#{order.number}-#{order.token}-L#{id}" end |
#rejected? ⇒ Boolean
144 145 146 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 144 def rejected? rejected_at.present? end |
#rejected_by(user) ⇒ Object
157 158 159 160 161 162 163 164 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 157 def rejected_by(user) return if rejected_at.present? && rejecter_id.present? update( rejected_at: Time.current, rejecter: user ) end |
#required_self_check_in_location? ⇒ Boolean
128 129 130 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 128 def required_self_check_in_location? required_self_check_in_location end |
#sufficient_stock? ⇒ Boolean
override
205 206 207 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 205 def sufficient_stock? SpreeCmCommissioner::Stock::LineItemAvailabilityChecker.new(self).can_supply?(quantity) end |
#update_price ⇒ Object
override to calculate price per date for permanent stock
112 113 114 115 116 117 118 119 120 121 122 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 112 def update_price base_price = variant.price_in(order.currency) self.price = if permanent_stock? date_range.map do |date| selected_price = variant.price_for_date(date: date, currency: order.currency) || base_price selected_price.amount || 0 end.sum else base_price.amount || 0 end end |
#update_price_from_modifier(currency, opts) ⇒ Object
override to calculate price per date for permanent stock
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 90 def update_price_from_modifier(currency, opts) self.currency = currency # these fields can be null during this process below. # it is needed for permanent_stock?, date_range to work. self.product_type = variant.product_type self.from_date = opts.delete(:from_date)&.to_datetime self.to_date = opts.delete(:to_date)&.to_datetime base_price = variant.price_in(currency) self.price = if permanent_stock? date_range.map do |date| selected_price = variant.price_for_date(date: date, currency: currency) || base_price (selected_price.amount || 0) + variant.price_modifier_amount_in(currency, opts.merge(date: date)) end.sum else (base_price.amount || 0) + variant.price_modifier_amount_in(currency, opts) end end |