Class: Edi::Wayfair::Orchestrator
- Inherits:
-
BaseOrchestrator
- Object
- BaseOrchestrator
- Edi::Wayfair::Orchestrator
- Defined in:
- app/services/edi/wayfair/orchestrator.rb
Constant Summary collapse
- DOUBLE_QUOTE_CHARACTERS_TO_REPLACE =
['"', '“', '”', '“', '“', '«', '»', '“', '”', '„']
- SINGLE_QUOTE_CHARACTERS_TO_REPLACE =
last one is not a comma though it looks like it
['‘', '’', '‹', '›', '′', '‚']
- 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_handle) ⇒ 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) ⇒ 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, 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
10 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 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 10 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: !Rails.env.production?, # Enabled in dev (sandbox), disabled in production until API keys available 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: !Rails.env.production?, # Enabled in dev (sandbox), disabled in production until API keys available packing_slip_remote_path: 'https://api.wayfair.com/v1/packing_slip', support_contact: 'supplierservicedesk@wayfair.com' } } end |
Instance Method Details
#acknowledge_message_enabled? ⇒ Boolean
209 210 211 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 209 def try(:order_enabled).present? end |
#acknowledge_message_sender ⇒ Object
213 214 215 216 217 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 213 def return Edi::NullProcessor.new(self, :acknowledge_message_sender, ) unless AcknowledgeMessageSender.new(self, ) end |
#catalog_item_information_processor ⇒ Object
326 327 328 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 326 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
322 323 324 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 322 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)
372 373 374 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 372 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
490 491 492 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 490 def catalog_item_update_sender CatalogItemUpdateSender.new(self, ) end |
#catalog_update_coverage(catalog_item) ⇒ Hash
Get attribute coverage report for a catalog item
545 546 547 548 549 550 551 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 545 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_handle) ⇒ CatalogItemUpdateSender::StatusResult
Check the status of a previous catalog update request
519 520 521 522 523 524 525 526 527 528 529 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 519 def check_catalog_update_status(request_handle) catalog_item_update_sender.check_status(request_handle) 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
392 393 394 395 396 397 398 399 400 401 402 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 392 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
193 194 195 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 193 def try(:order_enabled).present? end |
#confirm_message_processor ⇒ Object
197 198 199 200 201 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 197 def return Edi::NullProcessor.new(self, :confirm_message_processor, ) unless ConfirmMessageProcessor.new(self, ) end |
#confirm_message_sender ⇒ Object
203 204 205 206 207 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 203 def return Edi::NullProcessor.new(self, :confirm_message_sender, ) unless ConfirmMessageSender.new(self, ) end |
#execute_inventory_flow ⇒ Object
261 262 263 264 265 266 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 261 def execute_inventory_flow return unless active .process .process end |
#execute_order_flow ⇒ Object
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 245 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)
271 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 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 271 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) unless result[:success] logger.warn "Wayfair: Product data flow page #{page} failed: #{result[:message]}" total_errors += 1 break end 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] break unless page_info&.dig('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
219 220 221 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 219 def feed_submission_result_enabled? try(:feed_submission_result_remote_path).present? end |
#feed_submission_result_processor ⇒ Object
223 224 225 226 227 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 223 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
73 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 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 73 def get_orders_query query_str = %( 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
315 316 317 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 315 def ignore_back_orders false end |
#inventory_message_enabled? ⇒ Boolean
47 48 49 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 47 def try(:inventory_enabled).present? end |
#inventory_message_processor ⇒ Object
51 52 53 54 55 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 51 def return Edi::NullProcessor.new(self, :inventory_message_processor, ) unless InventoryMessageProcessor.new(self, ) end |
#inventory_message_sender ⇒ Object
57 58 59 60 61 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 57 def return Edi::NullProcessor.new(self, :inventory_message_sender, ) unless InventoryMessageSender.new(self, ) end |
#invoice_message_enabled? ⇒ Boolean
163 164 165 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 163 def try(:invoice_enabled).present? end |
#invoice_message_processor ⇒ Object
167 168 169 170 171 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 167 def return Edi::NullProcessor.new(self, :invoice_message_processor, ) unless InvoiceMessageProcessor.new(self, ) end |
#invoice_message_sender ⇒ Object
173 174 175 176 177 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 173 def return Edi::NullProcessor.new(self, :invoice_message_sender, ) unless InvoiceMessageSender.new(self, ) end |
#market_country ⇒ Object
Get market country based on partner
464 465 466 467 468 469 470 471 472 473 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 464 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
476 477 478 479 480 481 482 483 484 485 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 476 def market_locale case partner when :wayfair_us 'en-US' when :wayfair_ca 'en-CA' else 'en-US' end end |
#order_message_enabled? ⇒ Boolean
63 64 65 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 63 def try(:order_enabled).present? end |
#order_message_processor ⇒ Object
157 158 159 160 161 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 157 def return Edi::NullProcessor.new(self, :order_message_processor, ) unless OrderMessageProcessor.new(self, ) end |
#order_message_retriever ⇒ Object
67 68 69 70 71 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 67 def return Edi::NullProcessor.new(self, :order_message_processor, ) unless OrderMessageRetriever.new(self, ) end |
#packing_slip_enabled? ⇒ Boolean
179 180 181 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 179 def packing_slip_enabled? try(:packing_slip_remote_path).present? end |
#packing_slip_processor ⇒ Object
189 190 191 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 189 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
183 184 185 186 187 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 183 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)
534 535 536 537 538 539 540 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 534 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
333 334 335 336 337 338 339 340 341 342 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 333 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)
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 349 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
418 419 420 421 422 423 424 425 426 427 428 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 418 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
435 436 437 438 439 440 441 442 443 444 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 435 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) ⇒ CatalogItemUpdateSender::UpdateResult
Push a catalog item update to Wayfair
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 499 def push_catalog_update(catalog_item, attributes: nil, dry_run: false) catalog_item_update_sender.process( catalog_item: catalog_item, attributes: attributes, dry_run: dry_run ) rescue StandardError => e Rails.logger.error "Wayfair push_catalog_update error: #{e.}" CatalogItemUpdateSender::UpdateResult.new( success: false, request_handle: 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.)
381 382 383 384 385 386 387 388 389 390 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 381 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
229 230 231 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 229 def try(:return_notification_message_remote_path).present? end |
#return_notification_message_processor ⇒ Object
233 234 235 236 237 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 233 def return Edi::NullProcessor.new(self, :return_notification_message_processor, ) unless ReturnNotificationMessageProcessor.new(self, ) end |
#return_notification_message_sender ⇒ Object
239 240 241 242 243 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 239 def return Edi::NullProcessor.new(self, :return_notification_message_sender, ) unless ReturnNotificationMessageSender.new(self, ) end |
#ship_code_mapper ⇒ Object
311 312 313 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 311 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
408 409 410 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 408 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
450 451 452 453 454 455 456 457 458 459 460 461 |
# File 'app/services/edi/wayfair/orchestrator.rb', line 450 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 |