Module: Spree::FlowIoOrderDecorator

Defined in:
app/models/spree/flow_io_order_decorator.rb

Overview

Added flow specific methods to Spree::Order

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



6
7
8
9
10
# File 'app/models/spree/flow_io_order_decorator.rb', line 6

def self.included(base)
  base.serialize :meta, ActiveRecord::Coders::JSON.new(symbolize_keys: true)

  base.store_accessor :meta, :flow_data
end

Instance Method Details

#add_user_uuid_to_flow_dataObject



78
79
80
81
82
# File 'app/models/spree/flow_io_order_decorator.rb', line 78

def add_user_uuid_to_flow_data
  self.flow_data['order'] ||= {}
  self.flow_data['order']['attributes'] ||= {}
  self.flow_data['order']['attributes']['user_uuid'] = user&.uuid || ''
end

#display_totalObject



16
17
18
19
20
# File 'app/models/spree/flow_io_order_decorator.rb', line 16

def display_total
  return unless flow_data&.[]('order')

  Spree::Money.new(flow_io_total_amount, currency: currency)
end

#flow_allocationsObject



161
162
163
164
165
# File 'app/models/spree/flow_io_order_decorator.rb', line 161

def flow_allocations
  return @flow_allocations if @flow_allocations

  @flow_allocations = flow_order&.[]('allocations')
end

#flow_bill_addressObject



129
130
131
132
133
134
135
136
137
138
139
140
# File 'app/models/spree/flow_io_order_decorator.rb', line 129

def flow_bill_address
  flow_payment_address = flow_data.dig('order', 'payments')&.last&.[]('address')
  return unless flow_payment_address

  flow_payment_address['first'] = flow_payment_address.dig('name', 'first')
  flow_payment_address['last']  = flow_payment_address.dig('name', 'last')
  flow_payment_address['phone'] = ship_address['phone']

  b_address = bill_address || build_bill_address
  b_address.prepare_from_flow_attributes(flow_payment_address)
  b_address
end

#flow_customer_emailObject



112
113
114
# File 'app/models/spree/flow_io_order_decorator.rb', line 112

def flow_customer_email
  flow_data.dig('order', 'customer', 'email')
end

#flow_io_attr_user_uuidObject



84
85
86
# File 'app/models/spree/flow_io_order_decorator.rb', line 84

def flow_io_attr_user_uuid
  flow_data&.dig('order', 'attributes', 'user_uuid')
end

#flow_io_attribute_add(attr_key, value) ⇒ Object



72
73
74
75
76
# File 'app/models/spree/flow_io_order_decorator.rb', line 72

def flow_io_attribute_add(attr_key, value)
  self.flow_data['order'] ||= {}
  self.flow_data['order']['attributes'] ||= {}
  self.flow_data['order']['attributes'][attr_key] = value
end

#flow_io_attributesObject



68
69
70
# File 'app/models/spree/flow_io_order_decorator.rb', line 68

def flow_io_attributes
  flow_data&.dig('order', 'attributes') || {}
end

#flow_io_balance_amountObject



104
105
106
# File 'app/models/spree/flow_io_order_decorator.rb', line 104

def flow_io_balance_amount
  flow_data&.dig('order', 'balance', 'amount')&.to_d || 0
end

#flow_io_capturesObject



88
89
90
# File 'app/models/spree/flow_io_order_decorator.rb', line 88

def flow_io_captures
  flow_data&.[]('captures')
end

#flow_io_captures_sumObject



92
93
94
95
96
97
98
99
100
101
102
# File 'app/models/spree/flow_io_order_decorator.rb', line 92

def flow_io_captures_sum
  captures_sum = 0
  flow_data&.[]('captures')&.each do |c|
    next if c['status'] != 'succeeded'

    amount = c['amount']
    amount = amount.to_d if amount.is_a?(String)
    captures_sum += amount
  end
  captures_sum.to_d
end

#flow_io_experience_from_zoneObject



60
61
62
# File 'app/models/spree/flow_io_order_decorator.rb', line 60

def flow_io_experience_from_zone
  self.flow_data = (flow_data || {}).merge!('exp' => zone.flow_io_experience)
end

#flow_io_experience_keyObject



56
57
58
# File 'app/models/spree/flow_io_order_decorator.rb', line 56

def flow_io_experience_key
  flow_data&.[]('exp')
end

#flow_io_order_idObject



64
65
66
# File 'app/models/spree/flow_io_order_decorator.rb', line 64

def flow_io_order_id
  flow_data&.dig('order', 'id')
end

#flow_io_paymentsObject



108
109
110
# File 'app/models/spree/flow_io_order_decorator.rb', line 108

def flow_io_payments
  flow_data.dig('order', 'payments')
end

#flow_io_total_amountObject

shows localized total, if possible. if not, fall back to Spree default



52
53
54
# File 'app/models/spree/flow_io_order_decorator.rb', line 52

def flow_io_total_amount
  flow_data&.dig('order', 'total', 'amount')&.to_d || 0
end

#flow_line_item_price(line_item, total = false) ⇒ Object

accepts line item, usually called from views



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'app/models/spree/flow_io_order_decorator.rb', line 33

def flow_line_item_price(line_item, total = false)
  result = if (order = flow_order)
             item = order['lines']&.find { |el| el['item_number'] == line_item.variant.sku }

             return 'n/a' unless item

             total ? item['total']['label'] : item['price']['label']
           else
             FlowcommerceSpree::Api.format_default_price(line_item.price * (total ? line_item.quantity : 1))
           end

  # add line item promo
  # promo_total, adjustment_total
  result += " (#{FlowcommerceSpree::Api.format_default_price(line_item.promo_total)})" if line_item.promo_total > 0

  result
end

#flow_orderObject



22
23
24
# File 'app/models/spree/flow_io_order_decorator.rb', line 22

def flow_order
  flow_data&.[]('order')
end

#flow_order_with_payments?Boolean

Returns:

  • (Boolean)


26
27
28
29
30
# File 'app/models/spree/flow_io_order_decorator.rb', line 26

def flow_order_with_payments?
  payment = payments.completed.first

  payment&.payment_method&.type == 'Spree::Gateway::FlowIo'
end

#flow_ship_addressObject



116
117
118
119
120
121
122
123
124
125
126
127
# File 'app/models/spree/flow_io_order_decorator.rb', line 116

def flow_ship_address
  flow_destination = flow_data.dig('order', 'destination')
  return unless flow_destination.present?

  flow_destination['first'] = flow_destination.dig('contact', 'name', 'first')
  flow_destination['last']  = flow_destination.dig('contact', 'name', 'last')
  flow_destination['phone'] = flow_destination.dig('contact', 'phone')

  s_address = ship_address || build_ship_address
  s_address.prepare_from_flow_attributes(flow_destination)
  s_address
end

#flow_tax_cache_keyObject



12
13
14
# File 'app/models/spree/flow_io_order_decorator.rb', line 12

def flow_tax_cache_key
  [number, 'flowcommerce', 'allocation', line_items.sum(:quantity)].join('-')
end

#flow_tax_for_item(item, tax_key, included_in_price = true) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
# File 'app/models/spree/flow_io_order_decorator.rb', line 167

def flow_tax_for_item(item, tax_key, included_in_price = true)
  return {} if flow_allocations.blank?

  item_details = flow_allocations['details']&.find do |el|
    item.is_a?(Spree::LineItem) ? el['number'] == item.variant.sku : el['key'] == 'shipping'
  end
  return {} if item_details.blank?

  price_components = included_in_price ? item_details['included'] : item_details['not_included']
  price_components&.find { |el| el['key'] == tax_key }
end

#prepare_flow_addressesObject



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'app/models/spree/flow_io_order_decorator.rb', line 142

def prepare_flow_addresses
  address_attributes = {}

  s_address = flow_ship_address

  if s_address&.changes&.any?
    s_address.save!
    address_attributes[:ship_address_id] = s_address.id unless ship_address_id
  end

  b_address = flow_bill_address
  if b_address&.changes&.any?
    b_address.save!
    address_attributes[:bill_address_id] = b_address.id unless bill_address_id
  end

  address_attributes
end