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
63 64 65 66 67 68 69 70 71 72 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 63 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
78 79 80 81 82 83 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 78 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 |
# 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_save :update_vendor_id base.before_create :add_due_date, if: :subscription? base.before_save -> { self.product_type = variant.product_type }, if: -> { product_type.nil? } base.validate :ensure_not_exceed_max_quantity_per_order, if: -> { variant&.max_quantity_per_order.present? } 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
136 137 138 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 136 def accepted? accepted_at.present? end |
#accepted_by(user) ⇒ Object
144 145 146 147 148 149 150 151 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 144 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
120 121 122 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 120 def allowed_self_check_in? allow_self_check_in? end |
#amount_per_guest ⇒ Object
128 129 130 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 128 def amount_per_guest amount / quantity end |
#commission_rate ⇒ Object
132 133 134 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 132 def commission_rate product.commission_rate || vendor&.commission_rate || 0 end |
#completion_steps ⇒ Object
196 197 198 199 200 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 196 def completion_steps @completion_steps ||= product_completion_steps.map do |completion_step| completion_step.construct_hash(line_item: self) end end |
#discontinue_on ⇒ Object
46 47 48 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 46 def discontinue_on variant.discontinue_on || product.discontinue_on end |
#generate_png_qr(size = 120) ⇒ Object
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 174 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
162 163 164 165 166 167 168 169 170 171 172 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 162 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
211 212 213 214 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 211 def jwt_token payload = { order_number: order.number, line_item_id: id } SpreeCmCommissioner::OrderJwtToken.encode(payload, order.token) end |
#kyc ⇒ Object
74 75 76 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 74 def kyc variant.kyc || product.kyc end |
#month ⇒ Object
207 208 209 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 207 def month to_date.strftime('%B %Y') end |
#qr_data ⇒ Object
190 191 192 193 194 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 190 def qr_data return nil if order.nil? "#{order.number}-#{order.token}-L#{id}" end |
#rejected? ⇒ Boolean
140 141 142 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 140 def rejected? rejected_at.present? end |
#rejected_by(user) ⇒ Object
153 154 155 156 157 158 159 160 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 153 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
124 125 126 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 124 def required_self_check_in_location? required_self_check_in_location end |
#sufficient_stock? ⇒ Boolean
override
203 204 205 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 203 def sufficient_stock? SpreeCmCommissioner::Stock::LineItemAvailabilityChecker.new(self).can_supply?(quantity) end |
#update_price ⇒ Object
override to calculate price per date for permanent stock
108 109 110 111 112 113 114 115 116 117 118 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 108 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
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'app/models/spree_cm_commissioner/line_item_decorator.rb', line 86 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 |