huginn_bigcommerce_product_agent 1.11.1 → 1.12.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: 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