huginn_bigcommerce_product_agent 1.4.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80abf4633b57aeb958ec7f79f516f860fb099c20e6962de6e4cd0d8d0e1f3f5c
4
- data.tar.gz: df57c8f677d590947fc4fce038740adc6d2aba7618acf60eca3c4a9bcaa5700a
3
+ metadata.gz: ce068992ff7f5e99b7f7656d246d104b60bc1a12c836c84d3c0156e0fadc9c67
4
+ data.tar.gz: eadfb8e593e0e44a806f6cbcffbbe8f0b6d364f73215ffd2565c91be80c6b885
5
5
  SHA512:
6
- metadata.gz: 817b6c0d76780bfab457aaf7a6b67693caf97d6d7c581361270adb1ff874cef268a63adf74b52846d7278c4ad02c9d095c230e7af7ffc77ac3572b73a121b505
7
- data.tar.gz: a87ce903ed0c6c9c9e47fdb68acefcf1de788f8f6f754d02aa149793bed703846087a324b9c4004a99b5d3d9bf4de83de6dc223a5c59cf451093f4961dad5f22
6
+ metadata.gz: 3b8cbc08bc80f5cf0e811fa61874545ce54cb2ee4af113cc3f43fc102959690b32d8e7ce8ec027e29d836c60db78d4d7c50aca414ca24149f66dae1756879032
7
+ data.tar.gz: a1ee6941129e2df489daa52077f5bd9daa57943ebc6328880a8cbf7b8747a3c59ebdd16634f9ed8398f48e2490ffee278c0360d472b8989c45c6fa629d27da52
@@ -28,7 +28,9 @@ module Agents
28
28
  'custom_fields_map' => {},
29
29
  'meta_fields_map' => {},
30
30
  'meta_fields_namespace' => '',
31
- 'mode' => modes[0]
31
+ 'mode' => modes[0],
32
+ 'not_purchasable_format_list' => [],
33
+ 'should_disambiguate' => false
32
34
  }
33
35
  end
34
36
 
@@ -62,6 +64,15 @@ module Agents
62
64
  unless options['mode'].present? && modes.include?(options['mode'])
63
65
  errors.add(:base, "mode is a required field and must be one of: #{modes.join(', ')}")
64
66
  end
67
+
68
+ if options['not_purchasable_format_list'].present? && !options['not_purchasable_format_list'].is_a?(Array)
69
+ errors.add(:base, 'not_purchasable_format_list must be an Array')
70
+ end
71
+
72
+ if options.has_key?('should_disambiguate') && boolify(options['should_disambiguate']).nil?
73
+ errors.add(:base, 'when provided, `should_disambiguate` must be either true or false')
74
+ end
75
+
65
76
  end
66
77
 
67
78
  def working?
@@ -119,6 +130,16 @@ module Agents
119
130
  wrapper_skus.map {|k,v| v},
120
131
  %w[custom_fields options]
121
132
  )
133
+ #save skus
134
+ digital_skus = []
135
+ physical_skus = []
136
+ if split[:digital] and split[:physical]
137
+ digital_skus.concat([wrapper_skus[:digital]])
138
+ digital_skus.concat(get_mapper(:ProductMapper).get_product_skus(split[:digital])).join(",")
139
+ physical_skus.concat([wrapper_skus[:physical]])
140
+ physical_skus.concat(get_mapper(:ProductMapper).get_product_skus(split[:physical])).join(",")
141
+ end
142
+
122
143
  # upsert wrapper products
123
144
  split.each do |type, product|
124
145
  is_digital = type == :digital ? true : false
@@ -128,15 +149,26 @@ module Agents
128
149
  product['name'] = "#{product['name']} (Digital)"
129
150
  end
130
151
 
152
+ # Ignatius Press -- some products have the same name and must be disambiguated.
153
+ # ...by adding a list of the product types (hardback, paperback, etc.) to their names
154
+ if boolify(options['should_disambiguate'])
155
+ product['name'] += " |~ " + product['model'].map { |m|
156
+ m['additionalProperty'].find { |p|
157
+ p['propertyID'] == 'option'
158
+ }['value']
159
+ }.join(", ")
160
+ end
161
+
131
162
  wrapper_sku = wrapper_skus[type]
132
163
  bc_product = bc_products[wrapper_sku]
133
164
  variant_option_name = get_mapper(:OptionMapper).variant_option_name
134
165
  bc_option = !bc_product.nil? ? bc_product['options'].select {|opt| opt['display_name'] === variant_option_name}.first : nil
135
166
 
167
+ search_skus = is_digital ? physical_skus : digital_skus
136
168
  # ##############################
137
169
  # 1. update wrapper product
138
170
  # ##############################
139
- upsert_result = upsert_product(wrapper_sku, product, bc_product, is_digital)
171
+ upsert_result = upsert_product(wrapper_sku, product, bc_product, is_digital, search_skus)
140
172
  bc_product = upsert_result[:product]
141
173
 
142
174
  # clean up custom/meta fields. there are not batch operations so we might as well do them here.
@@ -183,6 +215,8 @@ module Agents
183
215
  [option_value],
184
216
  product_id,
185
217
  bc_variant.nil? ? nil : bc_variant['id'],
218
+ interpolated['not_purchasable_format_list'],
219
+ bc_option_value
186
220
  )
187
221
  end
188
222
 
@@ -330,7 +364,7 @@ module Agents
330
364
  return ::BigcommerceProductAgent::Mapper.const_get(class_name.to_sym)
331
365
  end
332
366
 
333
- def upsert_product(sku, product, bc_product = nil, is_digital=false)
367
+ def upsert_product(sku, product, bc_product = nil, is_digital=false, search_skus=[])
334
368
  custom_fields_updates = get_mapper(:CustomFieldMapper).map(
335
369
  interpolated['custom_fields_map'],
336
370
  product,
@@ -343,7 +377,10 @@ module Agents
343
377
  sku,
344
378
  product,
345
379
  product_id,
346
- { custom_fields: custom_fields_updates[:upsert] },
380
+ {
381
+ additional_search_terms: search_skus,
382
+ custom_fields: custom_fields_updates[:upsert]
383
+ },
347
384
  is_digital,
348
385
  )
349
386
 
@@ -19,6 +19,9 @@ module BigcommerceProductAgent
19
19
  "width" => default_variant['width'],
20
20
  "depth" => default_variant['depth'],
21
21
  "height" => default_variant['height'],
22
+ "releaseDate" => default_variant['releaseDate'],
23
+ "datePublished" => default_variant['datePublished'],
24
+ "availability" => self.get_availability_offer(product, default_variant),
22
25
  }.merge(product)
23
26
  end
24
27
  end
@@ -28,18 +31,21 @@ module BigcommerceProductAgent
28
31
  sku: product ? product['sku'] : default_sku,
29
32
  is_default: product['isDefault'],
30
33
  type: product['isDigital'] == true || is_digital ? 'digital' : 'physical',
31
- description: product['description'],
34
+ description: product['description'] || '',
32
35
  price: product['offers'] && product['offers'][0] ? product['offers'][0]['price'] : '0',
33
36
  categories: self.get_categories(product),
34
- available: 'available',
37
+ availability: self.get_availability(product),
35
38
  weight: product['weight'] ? product['weight']['value'] : '0',
36
39
  width: product['width'] ? product['width']['value'] : '0',
37
40
  depth: product['depth'] ? product['depth']['value'] : '0',
38
41
  height: product['height'] ? product['height']['value'] : '0',
39
42
  meta_keywords: self.meta_keywords(product),
40
- meta_description: self.meta_description(product),
41
- search_keywords: self.meta_keywords(product).join(','),
43
+ meta_description: self.meta_description(product) || '',
44
+ search_keywords: self.get_search_keywords(additional_data.delete(:additional_search_terms), product),
42
45
  is_visible: variant ? false : true,
46
+ preorder_release_date: product['releaseDate'] && product['releaseDate'].to_datetime ? product['releaseDate'].to_datetime.strftime("%FT%T%:z") : nil,
47
+ preorder_message: self.get_availability(product) == 'preorder' ? product['availability'] : '',
48
+ is_preorder_only: self.get_availability(product) == 'preorder' ? true : false,
43
49
  }
44
50
  result[:upc] = product['gtin12'] if product['gtin12']
45
51
 
@@ -182,6 +188,38 @@ module BigcommerceProductAgent
182
188
  end
183
189
  end
184
190
  end
191
+
192
+ # get a list of search keywords for the products
193
+ def self.get_search_keywords(additional_search_terms, product)
194
+ return (self.meta_keywords(product) + additional_search_terms.split(",")).join(",")
195
+ end
196
+
197
+ def self.get_availability(product)
198
+ if product['datePublished'] && product['datePublished'].to_datetime && product['datePublished'].to_datetime < DateTime.now
199
+ return 'available'
200
+ else
201
+ if product['releaseDate'] && product['releaseDate'].to_datetime
202
+ if product['releaseDate'].to_datetime > DateTime.now
203
+ return 'preorder'
204
+ else
205
+ return 'available'
206
+ end
207
+ else
208
+ return 'disabled'
209
+ end
210
+ end
211
+ end
212
+
213
+ def self.get_availability_offer(product, variant)
214
+ if product['offers'] && product['offers'][0]
215
+ return product['offers'][0]['availability']
216
+ else
217
+ if variant['offers'] && variant['offers'][0]
218
+ return variant['offers'][0]['availability']
219
+ end
220
+ end
221
+ return ''
222
+ end
185
223
  end
186
224
  end
187
225
  end
@@ -2,7 +2,7 @@ module BigcommerceProductAgent
2
2
  module Mapper
3
3
  class VariantMapper
4
4
 
5
- def self.map(variant, option_values, product_id, variant_id=nil)
5
+ def self.map(variant, option_values, product_id, variant_id=nil, not_purchasable_format_list, bc_option_value)
6
6
  mapped = {
7
7
  product_id: product_id,
8
8
  sku: variant['sku'],
@@ -29,6 +29,14 @@ module BigcommerceProductAgent
29
29
  mapped[:id] = variant_id
30
30
  end
31
31
 
32
+ unless not_purchasable_format_list.nil?
33
+ not_purchasable_format_list.each do |format|
34
+ if format == bc_option_value['label']
35
+ mapped[:purchasing_disabled] = true
36
+ end
37
+ end
38
+ end
39
+
32
40
  return mapped
33
41
  end
34
42
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: huginn_bigcommerce_product_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Spizziri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-26 00:00:00.000000000 Z
11
+ date: 2020-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler