huginn_bigcommerce_product_agent 1.11.1 → 1.12.0

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
  SHA256:
3
- metadata.gz: 0ddeb18b4e875ae897160512f80f8af033dbb4cc2e34295f46eb0114e0628298
4
- data.tar.gz: 37b77bfe861b477d65c0c42c359538a4fa9853b5a0840dfd9deb132946ccde49
3
+ metadata.gz: 75db6b836de4031aa33df47c393b0db0b59f99813fa96e98ee15ec10b39b8f91
4
+ data.tar.gz: d5c2bcc87f0fd3f95e489aa651f06297b07225398edfb6dfc8869c976f63caf7
5
5
  SHA512:
6
- metadata.gz: 89d31246d6961bdac0a37f698afb238b6d6820df667a36cbcfde9452733acc07eb0906a38dae6f04fc7be065733cfdcab0434b4b77d5fab9a7dc5a21025365b2
7
- data.tar.gz: 52b2ab013d9e885a14f684aa233b05c69fe1d73aaebf881d2f30da52ee4322fa6727054769dabaafe9e06ee69fde2a69432718f8022dd5051c203eb35dcd9b79
6
+ metadata.gz: 96cc182ce0413cbb9843e4ab435d47ca85540e0025a9cb60579a200f37a3c9c299df0583b20454a83adf23f516e917f75e75942b555245761e21918af79d76b4
7
+ data.tar.gz: 463354a063899f6cb03c253cf65b692ecb2258525e04ce107320f41e03ea6ee4251eda5c8bd4147596a9d6a2fdb90e1e85837b13aa7a05936e7f026d763e22fd
@@ -55,6 +55,13 @@ module BigcommerceProductAgent
55
55
  map
56
56
  end
57
57
 
58
+ def disable(productId)
59
+ upsert({ id: productId, is_visible: false })
60
+ end
61
+
62
+ def enable(productId)
63
+ upsert({ id: productId, is_visible: true })
64
+ end
58
65
  end
59
66
  end
60
67
  end
@@ -100,36 +100,48 @@ module Agents
100
100
  end
101
101
  end
102
102
 
103
- # 1. upsert product
104
- # 2. upsert option & option_values
105
- # 3. delete old option_values
103
+ # 1. Upsert the core product (Wrapper Product)
104
+ # - NOTE: This initial upsert intentionally disables the product.
105
+ # Doing so prevents content hiccups with variants particularly
106
+ # for products going off sale.
107
+ # 2. Upsert option & option_values (BigCommerce Variants)
108
+ # 3. Delete old option_values
106
109
  # - NOTE: deleting an option_value also deletes the variant
107
110
  # associated with the option_value
108
- # 4. upsert variants
111
+ # 4. Upsert variants
109
112
  # - NOTE: because deleting option values deletes variants
110
113
  # we need to fetch the variants AFTER deletion has occurred.
111
114
  # - NOTE: by deleting variants in #3 if option_values on an
112
115
  # existing variant changes over time, we're effectively deleting
113
116
  # and then re-adding the variant. Could get weird.
117
+ # 5. Re-enable the updated product
118
+ # - NOTE: If the product no longer has any variants, it will remain
119
+ # disabled as it can no longer be purchased.
114
120
  def handle_variants(event)
115
121
  product = event.payload
116
122
 
117
123
  split = get_mapper(:ProductMapper).split_digital_and_physical(
118
- product,
119
- interpolated['custom_fields_map']
124
+ product,
125
+ interpolated['custom_fields_map']
120
126
  )
121
127
  physical = split[:physical]
122
128
  digital = split[:digital]
123
129
 
130
+ base_sku = product['additionalProperty'].find { |p|
131
+ p['propertyID'] == 'baseSku'
132
+ }['value']
133
+
124
134
  wrapper_skus = {
125
- physical: get_mapper(:ProductMapper).get_wrapper_sku(physical),
126
- digital: get_mapper(:ProductMapper).get_wrapper_sku(digital),
135
+ # Use the provided base_sku if it exists -- otherwise, infer the SKU from the variant list
136
+ physical: base_sku ? "#{base_sku}-P" : get_mapper(:ProductMapper).get_wrapper_sku(physical),
137
+ digital: base_sku ? "#{base_sku}-D" : get_mapper(:ProductMapper).get_wrapper_sku(digital),
127
138
  }
128
139
 
129
140
  bc_products = @product.get_by_skus(
130
141
  wrapper_skus.map {|k,v| v},
131
142
  %w[custom_fields options]
132
143
  )
144
+
133
145
  #save skus
134
146
  digital_skus = []
135
147
  physical_skus = []
@@ -149,15 +161,13 @@ module Agents
149
161
  product['name'] = "#{product['name']} (Digital)"
150
162
  end
151
163
 
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
164
+ # BigCommerce requires that product names be unique. In some cases, (like book titles from multiple sources),
165
+ # this may be hard to enforce. In those cases, the product SKUs should still be unique, so we append the SKU
166
+ # to the product title with a `|~` separator. We then set the `page_title` to the original product name so
167
+ # users don't see system values.
154
168
  if boolify(options['should_disambiguate'])
155
169
  product['page_title'] = product['name']
156
- product['name'] += " |~ " + product['model'].map { |m|
157
- m['additionalProperty'].find { |p|
158
- p['propertyID'] == 'option'
159
- }['value']
160
- }.join(", ")
170
+ product['name'] += " |~ " + (is_digital ? wrapper_skus[:digital] : wrapper_skus[:physical])
161
171
  end
162
172
 
163
173
  wrapper_sku = wrapper_skus[type]
@@ -166,6 +176,8 @@ module Agents
166
176
  bc_option = !bc_product.nil? ? bc_product['options'].select {|opt| opt['display_name'] === variant_option_name}.first : nil
167
177
 
168
178
  search_skus = is_digital ? physical_skus : digital_skus
179
+
180
+
169
181
  # ##############################
170
182
  # 1. update wrapper product
171
183
  # ##############################
@@ -204,7 +216,7 @@ module Agents
204
216
  # ##############################
205
217
  variant_skus = get_mapper(:ProductMapper).get_product_skus(product)
206
218
  bc_variants = @product_variant.index(product_id)
207
- mapped_variants = product['model'].map do |variant|
219
+ mapped_variants = product['model'].select { |m| m['isAvailableForPurchase'] }.map do |variant|
208
220
  bc_variant = bc_variants.select {|v| v['sku'] === variant['sku']}.first
209
221
  opt = get_mapper(:ProductMapper).get_option(variant)
210
222
  bc_option_value = bc_option['option_values'].select {|ov| ov['label'] == opt}.first
@@ -221,7 +233,15 @@ module Agents
221
233
  )
222
234
  end
223
235
 
224
- bc_product['variants'] = @variant.upsert(mapped_variants)
236
+
237
+ unless (mapped_variants.blank?)
238
+ bc_product['variants'] = @variant.upsert(mapped_variants)
239
+
240
+ # ##############################
241
+ # 5. Re-enable the updated product
242
+ # ##############################
243
+ @product.enable(product_id)
244
+ end
225
245
  end
226
246
 
227
247
  bc_physical = bc_products[wrapper_skus[:physical]]
@@ -329,6 +349,11 @@ module Agents
329
349
  clean_up_modifier_values(modifier_updates[:delete])
330
350
  meta_fields = update_meta_fields(meta_fields_upsert, meta_fields_delete)
331
351
 
352
+ if product['is_visible']
353
+ # If the product should be enabled, re-enable it
354
+ @product.enable(result[:product]['id'])
355
+ end
356
+
332
357
  product['meta_fields'] = meta_fields
333
358
  product['modifiers'] = modifier_updates[:upsert]
334
359
  create_event payload: {
@@ -385,6 +410,12 @@ module Agents
385
410
  is_digital,
386
411
  )
387
412
 
413
+ payload[:is_visible] = false
414
+ # NOTE: Products are intentionally upserted as disabled so that users
415
+ # don't see an incomplete listing (particularly when leveraging variants)
416
+ # The variant and option_list methods will re-enable products after the
417
+ # upsert is complete.
418
+
388
419
  bc_product = @product.upsert(payload, {
389
420
  include: %w[custom_fields variants options].join(',')
390
421
  })
@@ -63,7 +63,7 @@ module BigcommerceProductAgent
63
63
  variant = self.get_variant_by_sku(sku, product)
64
64
  payload = self.map(product, variant, additional_data, is_digital, sku)
65
65
  payload[:id] = product_id unless product_id.nil?
66
- payload[:sku] = self.get_wrapper_sku(product)
66
+ payload[:sku] = sku
67
67
 
68
68
  return payload
69
69
  end
@@ -76,7 +76,9 @@ module BigcommerceProductAgent
76
76
  map = {}
77
77
 
78
78
  product['model'].each do |model|
79
- map[model['sku']] = self.get_option(model)
79
+ if model['isAvailableForPurchase']
80
+ map[model['sku']] = self.get_option(model)
81
+ end
80
82
  end
81
83
 
82
84
  return map
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.11.1
4
+ version: 1.12.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-11-03 00:00:00.000000000 Z
11
+ date: 2020-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler