shopify_transporter 2.2.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6eda8c759a40e474719373d41d3554e10d43f5bf
4
- data.tar.gz: baca1185566a388a56a725e80e641066b91a8b05
3
+ metadata.gz: 29372540546b779b2d3a248f7dd2c2079d9a22a2
4
+ data.tar.gz: b1729a6eea756fceb2871d3a7393170269bc2806
5
5
  SHA512:
6
- metadata.gz: 6589791c84651519d8b184ff6bb1dd077d08711fab9abd522884c8a74a677d57b034d7b23d9f809bc782142e3845825eefcd3f20e6d362669e166dcd6374ac00
7
- data.tar.gz: db735a4ed6eba567b4e4a3ec65f8d2182a34bbe8371ec901ccd56252b3b84485bc6ddf5606d249e6577545cdcc1d5bbc8533e2cade66f59167cd1d8b603b24ef
6
+ metadata.gz: 2ed229bfda72b6f2a0bd1173b7c4dfdbd8cb33527b14da1e38e0482c51325f328778bf454942caf3972c8613626e794ffa2979de45070a851ceb64955f9765f2
7
+ data.tar.gz: 9cc15dd97c160becb4200f49259399f7a879a07b8ca396d4984dc370b1014c4cc10caed7976453fce0e321e16c5190901ca0e9f525c38abdd564c4b57517f097
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+ require 'shopify_transporter/pipeline/stage'
3
+ require 'shopify_transporter/shopify'
4
+
5
+ module ShopifyTransporter
6
+ module Pipeline
7
+ module Magento
8
+ module Order
9
+ class Discounts < Pipeline::Stage
10
+ def convert(input, record)
11
+ record.merge!(
12
+ {
13
+ discounts: discounts(input),
14
+ }.stringify_keys
15
+ )
16
+ end
17
+
18
+ private
19
+
20
+ def discounts(hash)
21
+ [
22
+ shipping_discount(hash),
23
+ fixed_amount_discount(hash),
24
+ percentage_discount(hash),
25
+ ].compact
26
+ end
27
+
28
+ def shipping_discount(hash)
29
+ shipping_discount_amount = value_as_float(hash, 'shipping_discount_amount')
30
+ shipping_amount = value_as_float(hash, 'shipping_amount')
31
+ return unless shipping_discount_amount > shipping_amount
32
+
33
+ {
34
+ code: discount_code(hash),
35
+ amount: shipping_discount_amount,
36
+ type: 'shipping',
37
+ }.stringify_keys
38
+ end
39
+
40
+ def fixed_amount_discount(hash)
41
+ return unless fixed_amount_discount?(hash)
42
+
43
+ {
44
+ code: discount_code(hash),
45
+ amount: discount_amount(hash),
46
+ type: 'fixed_amount',
47
+ }.stringify_keys
48
+ end
49
+
50
+ def percentage_discount(hash)
51
+ return unless percentage_discount?(hash)
52
+
53
+ {
54
+ code: discount_code(hash),
55
+ amount: discount_percentage(hash),
56
+ type: 'percentage',
57
+ }.stringify_keys
58
+ end
59
+
60
+ def discount_percentage(hash)
61
+ if qualifies_for_percentage_discount?(hash)
62
+ if line_items(hash).is_a?(Hash)
63
+ value_as_float(line_items(hash), 'discount_percent')
64
+ elsif line_items(hash).is_a?(Array)
65
+ all_discount_percentages(hash).first
66
+ end
67
+ end
68
+ end
69
+
70
+ def discount_code(hash)
71
+ hash['discount_description'].present? ? hash['discount_description'] : 'Magento'
72
+ end
73
+
74
+ def discount_amount(hash)
75
+ hash['discount_amount'].present? ? hash['discount_amount'].to_f.abs : 0
76
+ end
77
+
78
+ def value_as_float(hash, key)
79
+ hash[key].present? ? hash[key].to_f : 0
80
+ end
81
+
82
+ def qualifies_for_percentage_discount?(hash)
83
+ return false unless line_items?(hash)
84
+
85
+ return true if line_items(hash).is_a?(Hash) && value_as_float(line_items(hash), 'discount_percent') > 0
86
+
87
+ all_discount_percentages(hash).length == 1 && all_discount_percentages(hash).first > 0
88
+ end
89
+
90
+ def line_items?(hash)
91
+ hash.dig('items', 'result', 'items', 'item').present?
92
+ end
93
+
94
+ def line_items(hash)
95
+ hash['items']['result']['items']['item']
96
+ end
97
+
98
+ def all_discount_percentages(hash)
99
+ line_items(hash).map do |line_item|
100
+ value_as_float(line_item, 'discount_percent')
101
+ end.uniq
102
+ end
103
+
104
+ def fixed_amount_discount?(hash)
105
+ discount_amount(hash) > 0 && !qualifies_for_percentage_discount?(hash)
106
+ end
107
+
108
+ def percentage_discount?(hash)
109
+ discount_amount(hash) > 0 && qualifies_for_percentage_discount?(hash)
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -36,7 +36,10 @@ module ShopifyTransporter
36
36
  quantity: item['qty_ordered'],
37
37
  sku: item['sku'],
38
38
  name: item['name'],
39
+ requires_shipping: requires_shipping?(item),
39
40
  price: item['price'],
41
+ taxable: taxable?(item),
42
+ fulfillment_status: fulfillment_status(item),
40
43
  tax_lines: tax_lines(item),
41
44
  }.stringify_keys
42
45
  end
@@ -47,11 +50,47 @@ module ShopifyTransporter
47
50
  {
48
51
  title: 'Tax',
49
52
  price: item['tax_amount'],
50
- rate: item['tax_percent'],
53
+ rate: tax_percentage(item),
51
54
  }.stringify_keys,
52
55
  ]
53
56
  end
54
57
 
58
+ def tax_percentage(item)
59
+ item['tax_percent'].to_f / 100
60
+ end
61
+
62
+ def fulfillment_status(item)
63
+ qty_ordered = qty_by_status(item, 'ordered')
64
+ qty_shipped = qty_by_status(item, 'shipped')
65
+ qty_refunded = qty_by_status(item, 'refunded')
66
+ if fully_fulfilled?(qty_ordered, qty_shipped, qty_refunded)
67
+ 'fulfilled'
68
+ elsif partially_fulfilled?(qty_shipped, qty_ordered)
69
+ 'partial'
70
+ end
71
+ end
72
+
73
+ def fully_fulfilled?(qty_ordered, qty_shipped, qty_refunded)
74
+ qty_ordered == qty_shipped && qty_refunded == 0 && qty_shipped > 0
75
+ end
76
+
77
+ def partially_fulfilled?(qty_shipped, qty_ordered)
78
+ qty_shipped > 0 && qty_shipped < qty_ordered
79
+ end
80
+
81
+ def requires_shipping?(item)
82
+ item['is_virtual'].to_i == 0
83
+ end
84
+
85
+ def taxable?(item)
86
+ item['tax_amount'].to_f > 0
87
+ end
88
+
89
+ def qty_by_status(item, status)
90
+ key = "qty_#{status}"
91
+ item[key].present? ? item[key].to_i : 0
92
+ end
93
+
55
94
  def tax_applied?(item)
56
95
  item['tax_percent'].to_f > 0 && item['tax_amount'].to_f > 0
57
96
  end
@@ -43,21 +43,17 @@ module ShopifyTransporter
43
43
  end
44
44
 
45
45
  def financial_status(hash)
46
- order_state = hash['state']
47
- status = nil
48
-
49
- if order_state == 'Pending Payment'
50
- status = 'pending'
51
- elsif paid?(hash)
52
- status = 'paid'
46
+ if paid?(hash)
47
+ 'paid'
53
48
  elsif partially_paid?(hash)
54
- status = 'partially_paid'
49
+ 'partially_paid'
55
50
  elsif partially_refunded?(hash)
56
- status = 'partially_refunded'
51
+ 'partially_refunded'
57
52
  elsif refunded?(hash)
58
- status = 'refunded'
53
+ 'refunded'
54
+ else
55
+ 'pending'
59
56
  end
60
- status
61
57
  end
62
58
 
63
59
  def fulfillment_status(hash)
@@ -104,7 +100,7 @@ module ShopifyTransporter
104
100
  end
105
101
 
106
102
  def paid?(hash)
107
- total_price(hash) == total_paid(hash) && total_refunded(hash) == 0
103
+ total_price(hash) == total_paid(hash) && total_paid(hash) > 0 && total_refunded(hash) == 0
108
104
  end
109
105
 
110
106
  def partially_paid?(hash)
@@ -38,7 +38,7 @@ module ShopifyTransporter
38
38
  private
39
39
 
40
40
  def input_applies?(input)
41
- true unless input['parent_id'].present?
41
+ input['parent_id'].blank?
42
42
  end
43
43
 
44
44
  def attributes_from(input)
@@ -8,18 +8,15 @@ module ShopifyTransporter
8
8
  module Product
9
9
  class TopLevelVariantAttributes < Pipeline::Stage
10
10
  def convert(hash, record)
11
- return unless input_applies?(hash)
12
- simple_product_in_magento_format = record['variants'].select do |product|
11
+ return {} unless record.key?('variants')
12
+ simple_product_in_magento_format = record['variants'].find do |product|
13
13
  product['product_id'] == hash['product_id']
14
- end.first
14
+ end
15
+ return {} unless simple_product_in_magento_format.present?
15
16
  accumulator = TopLevelVariantAttributesAccumulator.new(simple_product_in_magento_format)
16
17
  accumulator.accumulate(hash)
17
18
  end
18
19
 
19
- def input_applies?(input)
20
- true unless input['parent_id'].nil?
21
- end
22
-
23
20
  class TopLevelVariantAttributesAccumulator < Shopify::AttributesAccumulator
24
21
  COLUMN_MAPPING = {
25
22
  'sku' => 'sku',
@@ -35,6 +32,10 @@ module ShopifyTransporter
35
32
 
36
33
  private
37
34
 
35
+ def input_applies?(input)
36
+ input.present? && input['type'] == 'simple'
37
+ end
38
+
38
39
  def variant_options(input)
39
40
  {
40
41
  'option1' => input['option1_value'],
@@ -14,11 +14,16 @@ module ShopifyTransporter
14
14
 
15
15
  class VariantAttributesAccumulator < Shopify::AttributesAccumulator
16
16
  def accumulate(current_product)
17
- if current_product['parent_id'].present?
18
- @output['variants'] ||= []
19
- @output['variants'] << current_product
20
- @output
21
- end
17
+ return @output unless input_applies?(current_product)
18
+ @output['variants'] ||= []
19
+ @output['variants'] << current_product
20
+ @output
21
+ end
22
+
23
+ private
24
+
25
+ def input_applies?(current_product)
26
+ current_product['type'] == 'simple'
22
27
  end
23
28
  end
24
29
  end
@@ -8,16 +8,12 @@ module ShopifyTransporter
8
8
  module Product
9
9
  class VariantImage < Pipeline::Stage
10
10
  def convert(hash, record)
11
- return unless input_applied?(hash)
11
+ return {} unless hash['images'].present? && hash['parent_id'].present?
12
12
  add_variant_image!(hash, record)
13
13
  add_variant_image_to_parent_images!(hash, record)
14
14
  record
15
15
  end
16
16
 
17
- def input_applied?(input)
18
- input['images'].present? && input['parent_id'].present?
19
- end
20
-
21
17
  def current_variant(input, record)
22
18
  record['variants'].select do |variant|
23
19
  variant['product_id'] == input['product_id']
@@ -14,7 +14,7 @@ module ShopifyTransporter
14
14
  [
15
15
  'Name', 'Email', 'Financial Status', 'Fulfillment Status', 'Currency',
16
16
  'Buyer Accepts Marketing', 'Cancel Reason', 'Cancelled At', 'Closed At', 'Tags', 'Note',
17
- 'Phone', 'Referring Site', 'Processed At', 'Source name', 'Total discounts', 'Total weight',
17
+ 'Phone', 'Referring Site', 'Processed At', 'Source name', 'Total weight',
18
18
  'Total Tax', 'Shipping Company', 'Shipping Name', 'Shipping Phone', 'Shipping First Name',
19
19
  'Shipping Last Name', 'Shipping Address1', 'Shipping Address2', 'Shipping City',
20
20
  'Shipping Province', 'Shipping Province Code', 'Shipping Zip', 'Shipping Country',
@@ -22,10 +22,11 @@ module ShopifyTransporter
22
22
  'Billing First Name', 'Billing Last Name', 'Billing Address1', 'Billing Address2',
23
23
  'Billing City', 'Billing Province', 'Billing Province Code', 'Billing Zip',
24
24
  'Billing Country', 'Billing Country Code', 'Lineitem name', 'Lineitem quantity',
25
- 'Lineitem price', 'Lineitem discount', 'Lineitem compare at price', 'Lineitem sku',
26
- 'Lineitem requires shipping', 'Lineitem taxable', 'Lineitem fulfillment status',
27
- 'Tax 1 Title', 'Tax 1 Price', 'Tax 1 Rate', 'Tax 2 Title', 'Tax 2 Price', 'Tax 2 Rate',
28
- 'Tax 3 Title', 'Tax 3 Price', 'Tax 3 Rate', 'Transaction amount', 'Transaction kind', 'Transaction status',
25
+ 'Lineitem price', 'Lineitem sku', 'Lineitem requires shipping', 'Lineitem taxable',
26
+ 'Lineitem fulfillment status', 'Tax 1 Title', 'Tax 1 Price', 'Tax 1 Rate', 'Tax 2 Title',
27
+ 'Tax 2 Price', 'Tax 2 Rate', 'Tax 3 Title', 'Tax 3 Price', 'Tax 3 Rate',
28
+ 'Transaction amount', 'Transaction kind', 'Transaction status',
29
+ 'Discount code', 'Discount amount', 'Discount type',
29
30
  'Metafield Namespace', 'Metafield Key', 'Metafield Value', 'Metafield Value Type'
30
31
  ].to_csv
31
32
  end
@@ -46,6 +47,7 @@ module ShopifyTransporter
46
47
  csv << top_level_row_values
47
48
  line_item_row_values.each { |row| csv << row }
48
49
  transaction_row_values.each { |row| csv << row }
50
+ discount_row_values.each { |row| csv << row }
49
51
  metafield_row_values.each { |row| csv << row }
50
52
  end
51
53
  end
@@ -65,7 +67,7 @@ module ShopifyTransporter
65
67
  LINE_ITEM_PREFIX = 'lineitem_'
66
68
 
67
69
  LINE_ITEM_ATTRIBUTES = %w(
68
- name quantity price discount compare_at_price sku requires_shipping taxable fulfillment_status
70
+ name quantity price sku requires_shipping taxable fulfillment_status
69
71
  )
70
72
 
71
73
  TRANSACTION_PREFIX = 'transaction_'
@@ -74,6 +76,12 @@ module ShopifyTransporter
74
76
  amount kind status
75
77
  )
76
78
 
79
+ DISCOUNT_PREFIX = 'discount_'
80
+
81
+ DISCOUNT_ATTRIBUTES = %w(
82
+ code amount type
83
+ )
84
+
77
85
  def address_hash_for(address_hash, prefix)
78
86
  return {} if address_hash.blank?
79
87
 
@@ -120,6 +128,17 @@ module ShopifyTransporter
120
128
  row_values_from(transaction) if self.class.has_values?(transaction)
121
129
  end.compact
122
130
  end
131
+
132
+ def discount_row_values
133
+ return [] unless record_hash['discounts']
134
+
135
+ record_hash['discounts'].map do |discount_hash|
136
+ discount = discount_hash.slice(*DISCOUNT_ATTRIBUTES)
137
+ .transform_keys! { |k| "#{DISCOUNT_PREFIX}#{k}" }
138
+
139
+ row_values_from(discount) if self.class.has_values?(discount)
140
+ end.compact
141
+ end
123
142
  end
124
143
  end
125
144
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ShopifyTransporter
3
- VERSION = '2.2.0'
3
+ VERSION = '2.3.1'
4
4
  end
@@ -29,6 +29,7 @@ object_types:
29
29
  - LineItems
30
30
  - AddressesAttribute
31
31
  - Transactions
32
+ - Discounts
32
33
 
33
34
  extract_configuration:
34
35
  soap:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopify_transporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-15 00:00:00.000000000 Z
11
+ date: 2018-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -161,6 +161,7 @@ files:
161
161
  - lib/shopify_transporter/pipeline/magento/customer/addresses_attribute.rb
162
162
  - lib/shopify_transporter/pipeline/magento/customer/top_level_attributes.rb
163
163
  - lib/shopify_transporter/pipeline/magento/order/addresses_attribute.rb
164
+ - lib/shopify_transporter/pipeline/magento/order/discounts.rb
164
165
  - lib/shopify_transporter/pipeline/magento/order/line_items.rb
165
166
  - lib/shopify_transporter/pipeline/magento/order/top_level_attributes.rb
166
167
  - lib/shopify_transporter/pipeline/magento/order/transactions.rb