Class: Edi::Wayfair::Orchestrator
- Inherits:
-
BaseOrchestrator
- Object
- BaseOrchestrator
- Edi::Wayfair::Orchestrator
- Defined in:
- app/services/edi/wayfair/orchestrator.rb
Overview
Service object: orchestrator.
Constant Summary collapse
- DOUBLE_QUOTE_CHARACTERS_TO_REPLACE =
['"', '“', '”', '“', '“', '«', '»', '“', '”', '„'].freeze
- SINGLE_QUOTE_CHARACTERS_TO_REPLACE =
last one is not a comma though it looks like it
['‘', '’', '‹', '›', '′', '‚'].freeze
- GOLIVE_DATE_STR =
"November 12, 2020"
'November 10, 2020'
Constants inherited from BaseOrchestrator
BaseOrchestrator::DEFAULT_PENDING_DISCONTINUE_LIFETIME, BaseOrchestrator::ORCHESTRATORS, BaseOrchestrator::RECOMMENDED_EXECUTE_FLOW_EVERY_X_HOUR
Instance Attribute Summary
Attributes inherited from BaseOrchestrator
Class Method Summary collapse
Instance Method Summary collapse
- #acknowledge_message_enabled? ⇒ Boolean
- #acknowledge_message_sender ⇒ Object
- #catalog_item_information_processor ⇒ Object
-
#catalog_item_information_retriever ⇒ Object
Catalog Item Information API methods Uses the new Supplier Catalog API at https://api.wayfair.io/v1/product-catalog-api/graphql.
-
#catalog_item_information_updater ⇒ Object
Catalog Item Update methods Uses the inventory mutation to update product attributes.
-
#catalog_item_update_sender ⇒ Object
Catalog Update methods Uses the Product Catalog Update API with updateMarketSpecificCatalogItems mutation.
-
#catalog_update_coverage(catalog_item) ⇒ Hash
Get attribute coverage report for a catalog item.
-
#check_catalog_update_status(request_id) ⇒ CatalogItemUpdateSender::StatusResult
Check the status of a previous catalog update request.
- #clean_string(str) ⇒ Object
- #confirm_message_enabled? ⇒ Boolean
- #confirm_message_processor ⇒ Object
- #confirm_message_sender ⇒ Object
- #execute_inventory_flow ⇒ Object
- #execute_order_flow ⇒ Object
-
#execute_product_data_flow ⇒ Object
Pulls catalog information from Wayfair's Supplier Catalog API Updates retail prices, product identifiers, taxonomy data, and URLs Called by EdiProductDataFlowWorker (daily at 2:15 AM).
- #feed_submission_result_enabled? ⇒ Boolean
- #feed_submission_result_processor ⇒ Object
- #get_orders_query ⇒ Object
- #ignore_back_orders ⇒ Object
- #inventory_message_enabled? ⇒ Boolean
- #inventory_message_processor ⇒ Object
- #inventory_message_sender ⇒ Object
- #invoice_message_enabled? ⇒ Boolean
- #invoice_message_processor ⇒ Object
- #invoice_message_sender ⇒ Object
-
#market_country ⇒ Object
Get market country based on partner.
-
#market_locale ⇒ Object
Get market locale based on partner.
- #order_message_enabled? ⇒ Boolean
- #order_message_processor ⇒ Object
- #order_message_retriever ⇒ Object
- #packing_slip_enabled? ⇒ Boolean
- #packing_slip_processor ⇒ Object
- #packing_slip_retriever ⇒ Object
-
#preview_catalog_update(catalog_item) ⇒ Hash
Preview what would be sent for a catalog item (for debugging).
-
#pull_catalog_information(sku) ⇒ Hash
Pull catalog information for a specific SKU.
-
#pull_catalog_information_all(page: 1, page_size: 25, dry_run: false) ⇒ Hash
Pull catalog information for all products (paginated).
-
#pull_taxonomy_schema(taxonomy_category_id, brand: 'WAYFAIR', country: 'UNITED_STATES', locale: 'en-US') ⇒ WayfairSchema?
Pull taxonomy schema for a specific category.
-
#pull_taxonomy_schema_for_category(taxonomy_category_id, wayfair_schema: nil) ⇒ WayfairSchema?
Pull taxonomy schema for a category and update an existing WayfairSchema record.
-
#push_catalog_update(catalog_item, attributes: nil, dry_run: false, validate_only: false) ⇒ CatalogItemUpdateSender::UpdateResult
Push a catalog item update to Wayfair.
-
#push_inventory_update(sku, inventory_data:, dry_run: false) ⇒ Edi::Wayfair::CatalogItemInformationUpdater::UpdateResult
Update inventory data on Wayfair (quantity, discontinued status, etc.).
- #return_notification_message_enabled? ⇒ Boolean
- #return_notification_message_processor ⇒ Object
- #return_notification_message_sender ⇒ Object
- #ship_code_mapper ⇒ Object
-
#taxonomy_attribute_retriever ⇒ Object
Taxonomy Attribute methods Uses the Product Catalog API to fetch and cache taxonomy attribute definitions Similar to Amazon's product type schema system.
-
#wayfair_schema_for(taxonomy_category_id, refresh: false) ⇒ WayfairSchema?
Get or create WayfairSchema for a category, fetching from API if not cached.
Methods inherited from BaseOrchestrator
all_orchestrators_class, build, build_customer_id_to_partner_key_map, cached_build, cached_orchestrators, catalog_id_to_pending_discontinue_lifetime, catalog_ids_edi_enabled, #confirm_outbound_processing?, #customer, #customer_catalog, customer_id_to_partner_key_map, #customer_ids, customer_ids_edi_enabled, customer_ids_with_invoice_message_enabled, #customers, execute_discontinue_flow, execute_flow, execute_inventory_flow, execute_listing_message_feed_flow, execute_order_flow, execute_price_flow, #execute_price_flow, execute_product_data_flow, #initialize, orchestrator_for_customer_id, orchestrators, #pending_discontinue_lifetime, #price_message_enabled?, #product_data_enabled?, #should_execute_flow?, #should_execute_order_flow?, #should_execute_product_data_flow?, #test_mode?
Constructor Details
This class inherits a constructor from Edi::BaseOrchestrator
Class Method Details
.partners ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 11 def self.partners { wayfair_us: { active: true, partner: :wayfair_us, warehouse_code: '7083', customer_id: 175_360, transporter: :http_graphql_api, transporter_profile: :wayfair_api, inventory_transporter: :http_graphql_api, inventory_transporter_profile: :wayfair_api, inventory_enabled: true, order_enabled: true, invoice_enabled: false, product_data_enabled: true, # Catalog READ live in prod both regions (2026-06-12); daily worker pulls MSRP + canonical PDP URL + taxonomy packing_slip_remote_path: 'https://api.wayfair.com/v1/packing_slip', support_contact: 'supplierservicedesk@wayfair.com' }, wayfair_ca: { active: true, partner: :wayfair_ca, warehouse_code: '24331', customer_id: 2_727_071, transporter: :http_graphql_api, transporter_profile: :wayfair_api, inventory_transporter: :http_graphql_api, inventory_transporter_profile: :wayfair_api, inventory_enabled: true, order_enabled: true, invoice_enabled: false, product_data_enabled: true, # Catalog READ live in prod both regions (2026-06-12); daily worker pulls MSRP + canonical PDP URL + taxonomy packing_slip_remote_path: 'https://api.wayfair.com/v1/packing_slip', support_contact: 'supplierservicedesk@wayfair.com' } } end |
Instance Method Details
#acknowledge_message_enabled? ⇒ Boolean
210 211 212 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 210 def try(:order_enabled).present? end |
#acknowledge_message_sender ⇒ Object
214 215 216 217 218 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 214 def return Edi::NullProcessor.new(self, :acknowledge_message_sender, ) unless AcknowledgeMessageSender.new(self, ) end |
#catalog_item_information_processor ⇒ Object
334 335 336 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 334 def catalog_item_information_processor CatalogItemInformationProcessor.new(self, ) end |
#catalog_item_information_retriever ⇒ Object
Catalog Item Information API methods
Uses the new Supplier Catalog API at https://api.wayfair.io/v1/product-catalog-api/graphql
330 331 332 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 330 def catalog_item_information_retriever CatalogItemInformationRetriever.new(self, ) end |
#catalog_item_information_updater ⇒ Object
Catalog Item Update methods
Uses the inventory mutation to update product attributes
NOTE: The Wayfair inventory API has LIMITED capabilities:
- CAN update: quantity, discontinued status, product name
- CANNOT update: dimensions, pricing, images (these are read-only or Wayfair-managed)
380 381 382 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 380 def catalog_item_information_updater CatalogItemInformationUpdater.new(self, ) end |
#catalog_item_update_sender ⇒ Object
Catalog Update methods
Uses the Product Catalog Update API with updateMarketSpecificCatalogItems mutation
500 501 502 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 500 def catalog_item_update_sender CatalogItemUpdateSender.new(self, ) end |
#catalog_update_coverage(catalog_item) ⇒ Hash
Get attribute coverage report for a catalog item
557 558 559 560 561 562 563 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 557 def catalog_update_coverage(catalog_item) wayfair_schema = wayfair_schema_for(catalog_item.wayfair_taxonomy_category_id_in_effect) return { error: 'No schema available' } unless wayfair_schema generator = ListingGenerator::ListingGenerator.new(catalog_item, wayfair_schema: wayfair_schema) generator.attribute_coverage end |
#check_catalog_update_status(request_id) ⇒ CatalogItemUpdateSender::StatusResult
Check the status of a previous catalog update request
531 532 533 534 535 536 537 538 539 540 541 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 531 def check_catalog_update_status(request_id) catalog_item_update_sender.check_status(request_id) rescue StandardError => e Rails.logger.error "Wayfair check_catalog_update_status error: #{e.}" CatalogItemUpdateSender::StatusResult.new( success: false, status: 'ERROR', message: e., details: nil ) end |
#clean_string(str) ⇒ Object
400 401 402 403 404 405 406 407 408 409 410 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 400 def clean_string(str) # Ensure to replace all double quotes with two single quotes, along with all the various variations, based on testing and: # https://unicode-table.com/en/sets/quotation-marks/ DOUBLE_QUOTE_CHARACTERS_TO_REPLACE.each do |c| str = str.gsub(c, "''") end SINGLE_QUOTE_CHARACTERS_TO_REPLACE.each do |c| str = str.gsub(c, "'") end str end |
#confirm_message_enabled? ⇒ Boolean
194 195 196 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 194 def try(:order_enabled).present? end |
#confirm_message_processor ⇒ Object
198 199 200 201 202 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 198 def return Edi::NullProcessor.new(self, :confirm_message_processor, ) unless ConfirmMessageProcessor.new(self, ) end |
#confirm_message_sender ⇒ Object
204 205 206 207 208 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 204 def return Edi::NullProcessor.new(self, :confirm_message_sender, ) unless ConfirmMessageSender.new(self, ) end |
#execute_inventory_flow ⇒ Object
262 263 264 265 266 267 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 262 def execute_inventory_flow return unless active .process .process end |
#execute_order_flow ⇒ Object
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 246 def execute_order_flow return unless active .process sleep(1) .process sleep(1) # we get packing slips inline directly from order batch queries # packing_slip_processor.process # sleep(1) .process sleep(1) .process sleep(1) end |
#execute_product_data_flow ⇒ Object
Pulls catalog information from Wayfair's Supplier Catalog API
Updates retail prices, product identifiers, taxonomy data, and URLs
Called by EdiProductDataFlowWorker (daily at 2:15 AM)
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 272 def execute_product_data_flow return unless active return unless product_data_enabled? logger.info "Wayfair: Starting product data flow for #{partner}" total_processed = 0 total_skipped = 0 total_errors = 0 page = 1 max_pages = 100 # Safety limit loop do break if page > max_pages result = pull_catalog_information_all(page: page, page_size: 25) # Per-item save errors must NOT halt the whole backfill — they make # result[:success] false (success = result.errors.empty?), so the old # `break` here stalled the sync on page 1 whenever a single item failed. # Tally the errors and keep paging; only stop when there is no further # page to fetch (page_info absent = hard failure / no data). if result[:result] total_processed += result[:result].processed total_skipped += result[:result].skipped total_errors += result[:result].errors.size end page_info = result[:page_info] unless page_info logger.warn "Wayfair: Product data flow stopped at page #{page}: #{result[:message] || 'no page info returned'}" total_errors += 1 unless result[:success] break end logger.warn "Wayfair: Product data flow page #{page} had #{result[:result]&.errors&.size} item error(s); continuing" unless result[:success] break unless page_info['hasNextPage'] page += 1 sleep(0.5) # Rate limiting between pages end logger.info "Wayfair: Product data flow completed for #{partner}: " \ "#{total_processed} processed, #{total_skipped} skipped, #{total_errors} errors" end |
#feed_submission_result_enabled? ⇒ Boolean
220 221 222 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 220 def feed_submission_result_enabled? try(:feed_submission_result_remote_path).present? end |
#feed_submission_result_processor ⇒ Object
224 225 226 227 228 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 224 def feed_submission_result_processor return Edi::NullProcessor.new(self, :inventory_message_processor, ) unless feed_submission_result_enabled? InventoryMessageProcessor.new(self, ) end |
#get_orders_query ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 74 def get_orders_query %( query purchaseOrders { purchaseOrders( filters: [ { field: open, equals: \\"true\\" }, { field: supplierId, equals: \\"#{try(:warehouse_code)}\\" }, { field: poDate, greaterThan: \\"#{DateTime.parse(GOLIVE_DATE_STR).iso8601}\\" } ], limit: 10, ordering: [ { desc: \\"poDate\\" } ] ) { id, poNumber, poDate, estimatedShipDate, customerName, customerAddress1, customerAddress2, customerCity, customerState, customerCountry, customerPostalCode, orderType, shippingInfo { shipSpeed, carrierCode }, packingSlipUrl, warehouse { id, name, address { name, address1, address2, address3, city, state, country, postalCode } }, products { partNumber, quantity, price, event { id, type, name, startDate, endDate } }, shipTo { name, address1, address2, address3, city, state, country, postalCode, phoneNumber } } } ).squish end |
#ignore_back_orders ⇒ Object
323 324 325 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 323 def ignore_back_orders false end |
#inventory_message_enabled? ⇒ Boolean
48 49 50 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 48 def try(:inventory_enabled).present? end |
#inventory_message_processor ⇒ Object
52 53 54 55 56 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 52 def return Edi::NullProcessor.new(self, :inventory_message_processor, ) unless InventoryMessageProcessor.new(self, ) end |
#inventory_message_sender ⇒ Object
58 59 60 61 62 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 58 def return Edi::NullProcessor.new(self, :inventory_message_sender, ) unless InventoryMessageSender.new(self, ) end |
#invoice_message_enabled? ⇒ Boolean
164 165 166 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 164 def try(:invoice_enabled).present? end |
#invoice_message_processor ⇒ Object
168 169 170 171 172 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 168 def return Edi::NullProcessor.new(self, :invoice_message_processor, ) unless InvoiceMessageProcessor.new(self, ) end |
#invoice_message_sender ⇒ Object
174 175 176 177 178 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 174 def return Edi::NullProcessor.new(self, :invoice_message_sender, ) unless InvoiceMessageSender.new(self, ) end |
#market_country ⇒ Object
Get market country based on partner
474 475 476 477 478 479 480 481 482 483 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 474 def market_country case partner when :wayfair_us 'UNITED_STATES' when :wayfair_ca 'CANADA' else 'UNITED_STATES' end end |
#market_locale ⇒ Object
Get market locale based on partner
486 487 488 489 490 491 492 493 494 495 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 486 def market_locale case partner when :wayfair_us 'en-US' when :wayfair_ca 'en-CA' else 'en-US' end end |
#order_message_enabled? ⇒ Boolean
64 65 66 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 64 def try(:order_enabled).present? end |
#order_message_processor ⇒ Object
158 159 160 161 162 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 158 def return Edi::NullProcessor.new(self, :order_message_processor, ) unless OrderMessageProcessor.new(self, ) end |
#order_message_retriever ⇒ Object
68 69 70 71 72 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 68 def return Edi::NullProcessor.new(self, :order_message_processor, ) unless OrderMessageRetriever.new(self, ) end |
#packing_slip_enabled? ⇒ Boolean
180 181 182 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 180 def packing_slip_enabled? try(:packing_slip_remote_path).present? end |
#packing_slip_processor ⇒ Object
190 191 192 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 190 def packing_slip_processor Edi::NullProcessor.new(self, :packing_slip_processor, ) # here we don't need to process anything, just retrieve end |
#packing_slip_retriever ⇒ Object
184 185 186 187 188 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 184 def packing_slip_retriever return Edi::NullProcessor.new(self, :packing_slip_retriever, ) unless packing_slip_enabled? PackingSlipRetriever.new(self, ) end |
#preview_catalog_update(catalog_item) ⇒ Hash
Preview what would be sent for a catalog item (for debugging)
546 547 548 549 550 551 552 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 546 def preview_catalog_update(catalog_item) wayfair_schema = wayfair_schema_for(catalog_item.wayfair_taxonomy_category_id_in_effect) return { error: 'No schema available' } unless wayfair_schema generator = ListingGenerator::ListingGenerator.new(catalog_item, wayfair_schema: wayfair_schema) generator.preview end |
#pull_catalog_information(sku) ⇒ Hash
Pull catalog information for a specific SKU
341 342 343 344 345 346 347 348 349 350 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 341 def pull_catalog_information(sku) ecl = catalog_item_information_retriever.process(supplier_part_number: sku) return { success: false, ecl: nil, result: nil, message: 'No data returned from Wayfair API' } unless ecl result = catalog_item_information_processor.process(ecl) { success: result.errors.empty?, ecl: ecl, result: result } rescue StandardError => e Rails.logger.error "Wayfair pull_catalog_information error for #{sku}: #{e.}" { success: false, ecl: nil, result: nil, message: e. } end |
#pull_catalog_information_all(page: 1, page_size: 25, dry_run: false) ⇒ Hash
Pull catalog information for all products (paginated)
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 357 def pull_catalog_information_all(page: 1, page_size: 25, dry_run: false) ecl = catalog_item_information_retriever.process_all(page: page, page_size: page_size) return { success: false, ecl: nil, result: nil, message: 'No data returned from Wayfair API' } unless ecl result = catalog_item_information_processor.process(ecl, dry_run: dry_run) page_info = begin JSON.parse(ecl.data).dig('data', 'supplierCatalog', 'pageInfo') rescue StandardError nil end { success: result.errors.empty?, ecl: ecl, result: result, page_info: page_info } rescue StandardError => e Rails.logger.error "Wayfair pull_catalog_information_all error: #{e.}" { success: false, ecl: nil, result: nil, message: e. } end |
#pull_taxonomy_schema(taxonomy_category_id, brand: 'WAYFAIR', country: 'UNITED_STATES', locale: 'en-US') ⇒ WayfairSchema?
Pull taxonomy schema for a specific category
426 427 428 429 430 431 432 433 434 435 436 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 426 def pull_taxonomy_schema(taxonomy_category_id, brand: 'WAYFAIR', country: 'UNITED_STATES', locale: 'en-US') taxonomy_attribute_retriever.process( taxonomy_category_id: taxonomy_category_id, brand: brand, country: country, locale: locale ) rescue StandardError => e Rails.logger.error "Wayfair pull_taxonomy_schema error for category #{taxonomy_category_id}: #{e.}" nil end |
#pull_taxonomy_schema_for_category(taxonomy_category_id, wayfair_schema: nil) ⇒ WayfairSchema?
Pull taxonomy schema for a category and update an existing WayfairSchema record.
Forwards arbitrary keyword arguments (**) to the taxonomy_attribute_retriever
for additional market-context options.
445 446 447 448 449 450 451 452 453 454 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 445 def pull_taxonomy_schema_for_category(taxonomy_category_id, wayfair_schema: nil, **) taxonomy_attribute_retriever.process( taxonomy_category_id: taxonomy_category_id, wayfair_schema: wayfair_schema, ** ) rescue StandardError => e Rails.logger.error "Wayfair pull_taxonomy_schema_for_category error: #{e.}" nil end |
#push_catalog_update(catalog_item, attributes: nil, dry_run: false, validate_only: false) ⇒ CatalogItemUpdateSender::UpdateResult
Push a catalog item update to Wayfair
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 510 def push_catalog_update(catalog_item, attributes: nil, dry_run: false, validate_only: false) catalog_item_update_sender.process( catalog_item: catalog_item, attributes: attributes, dry_run: dry_run, validate_only: validate_only ) rescue StandardError => e Rails.logger.error "Wayfair push_catalog_update error: #{e.}" CatalogItemUpdateSender::UpdateResult.new( success: false, request_id: nil, errors: [e.], ecl: nil, payload: nil ) end |
#push_inventory_update(sku, inventory_data:, dry_run: false) ⇒ Edi::Wayfair::CatalogItemInformationUpdater::UpdateResult
Update inventory data on Wayfair (quantity, discontinued status, etc.)
389 390 391 392 393 394 395 396 397 398 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 389 def push_inventory_update(sku, inventory_data:, dry_run: false) catalog_item_information_updater.process( supplier_part_number: sku, inventory_data: inventory_data, dry_run: dry_run ) rescue StandardError => e Rails.logger.error "Wayfair push_inventory_update error for #{sku}: #{e.}" CatalogItemInformationUpdater::UpdateResult.new(success: false, handle: nil, errors: [e.], ecl: nil) end |
#return_notification_message_enabled? ⇒ Boolean
230 231 232 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 230 def try(:return_notification_message_remote_path).present? end |
#return_notification_message_processor ⇒ Object
234 235 236 237 238 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 234 def return Edi::NullProcessor.new(self, :return_notification_message_processor, ) unless ReturnNotificationMessageProcessor.new(self, ) end |
#return_notification_message_sender ⇒ Object
240 241 242 243 244 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 240 def return Edi::NullProcessor.new(self, :return_notification_message_sender, ) unless ReturnNotificationMessageSender.new(self, ) end |
#ship_code_mapper ⇒ Object
319 320 321 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 319 def ship_code_mapper ShipCodeMapper.new(self) end |
#taxonomy_attribute_retriever ⇒ Object
Taxonomy Attribute methods
Uses the Product Catalog API to fetch and cache taxonomy attribute definitions
Similar to Amazon's product type schema system
416 417 418 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 416 def taxonomy_attribute_retriever TaxonomyAttributeRetriever.new(self, ) end |
#wayfair_schema_for(taxonomy_category_id, refresh: false) ⇒ WayfairSchema?
Get or create WayfairSchema for a category, fetching from API if not cached
460 461 462 463 464 465 466 467 468 469 470 471 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 460 def wayfair_schema_for(taxonomy_category_id, refresh: false) schema = WayfairSchema.for_category(taxonomy_category_id) .for_brand('WAYFAIR') .for_country(market_country) .first # Return cached schema if available and not stale (less than 7 days old) return schema if schema.present? && !refresh && schema.updated_at > 7.days.ago # Fetch fresh schema from API pull_taxonomy_schema(taxonomy_category_id, country: market_country) end |