Class: Edi::Amazon::JsonListingGenerator::Attributes::PurchasableOffer

Inherits:
BaseAttribute
  • Object
show all
Defined in:
app/services/edi/amazon/json_listing_generator/attributes/purchasable_offer.rb

Constant Summary

Constants inherited from BaseAttribute

BaseAttribute::RUBY_UNIT_TO_AMAZON_UNIT

Instance Attribute Summary

Attributes inherited from BaseAttribute

#amazon_schema, #attribute_name, #catalog_item, #enum_mapper, #fba, #item, #language_tag, #marketplace, #marketplace_country_iso, #marketplace_id, #value_attribute_name, #variation

Instance Method Summary collapse

Methods inherited from BaseAttribute

#fetch_unit, #fetch_value, #initialize, #map_unit, #value

Constructor Details

This class inherits a constructor from Edi::Amazon::JsonListingGenerator::Attributes::BaseAttribute

Instance Method Details

#buildObject



3
4
5
6
7
8
# File 'app/services/edi/amazon/json_listing_generator/attributes/purchasable_offer.rb', line 3

def build
  offers = []
  offers << build_standard_offer
  offers << build_business_offer if @marketplace.supports_business_offer?
  offers
end

#build_business_offerObject



44
45
46
47
48
49
50
51
52
# File 'app/services/edi/amazon/json_listing_generator/attributes/purchasable_offer.rb', line 44

def build_business_offer
  offer = {}
  offer[:currency] = @catalog_item.currency
  offer[:audience] = 'B2B'
  value_with_tax = @fba ? @catalog_item.amazon_business_price_with_tax_fba : @catalog_item.amazon_business_price_with_tax
  offer[:our_price] = [{ schedule: [{ value_with_tax: value_with_tax }] }]
  offer[:quantity_discount_plan] = build_quantity_discount_plan if @catalog_item.quantity_discount_price_type.present?
  offer
end

#build_quantity_discount_planObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'app/services/edi/amazon/json_listing_generator/attributes/purchasable_offer.rb', line 54

def build_quantity_discount_plan
  return if @catalog_item.quantity_discount_price_type.blank?

  levels = []
  (1..5).to_a.each do |threshold_index|
    price_discount = @catalog_item.send(:"quantity_#{threshold_index}_price_discount")
    lower_bound = @catalog_item.send(:"quantity_#{threshold_index}_lower_bound")
    next unless lower_bound.present? && price_discount.present?

    levels << { lower_bound: lower_bound, value: price_discount }
  end
  return if levels.blank?

  [{ schedule: [{ discount_type: @catalog_item.quantity_discount_price_type, levels: levels }] }]
end

#build_standard_offerObject



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
# File 'app/services/edi/amazon/json_listing_generator/attributes/purchasable_offer.rb', line 10

def build_standard_offer
  offer = {}
  offer[:currency] = @catalog_item.currency
  offer[:audience] = 'ALL'
  value_with_tax = @fba ? @catalog_item.amazon_price_with_tax_fba : @catalog_item.amazon_price_with_tax

  offer[:our_price] = [{ schedule: [{ value_with_tax: value_with_tax }] }]

  if @catalog_item.sale_price_in_effect?
    sale_start_date = @catalog_item.sale_price_effective_date&.beginning_of_day || Time.current.beginning_of_day
    sale_end_date = @catalog_item.sale_price_expiration_date&.end_of_day || 30.days.from_now.end_of_day
    sale_value_with_tax = @fba ? @catalog_item.amazon_sale_price_with_tax_fba : @catalog_item.amazon_sale_price_with_tax

    offer[:discounted_price] = [
      {
        schedule: [
          {
            start_at: sale_start_date.utc.iso8601,
            end_at: sale_end_date.utc.iso8601,
            value_with_tax: sale_value_with_tax
          }
        ]
      }
    ]
  end
  maximum_seller_allowed_price = @fba ? @catalog_item.amazon_maximum_seller_allowed_price_with_tax_fba : @catalog_item.amazon_maximum_seller_allowed_price_with_tax
  minimum_seller_allowed_price = @fba ? @catalog_item.amazon_minimum_seller_allowed_price_with_tax_fba : @catalog_item.amazon_minimum_seller_allowed_price_with_tax

  offer[:maximum_seller_allowed_price] = [{ schedule: [{ value_with_tax: maximum_seller_allowed_price }] }]
  offer[:minimum_seller_allowed_price] = [{ schedule: [{ value_with_tax: minimum_seller_allowed_price }] }] if (minimum_seller_allowed_price.positive? && minimum_seller_allowed_price > 0.1*value_with_tax) # ensure we only send positive reasonable MAP price here, because we can get negative (through landed costs bug), so just skip unless positive and > 10% of the value_with_tax
  offer[:marketplace_id] = @marketplace_id
  offer
end