Class: ShippingCost
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- ShippingCost
- Defined in:
- app/models/shipping_cost.rb
Overview
== Schema Information
Table name: shipping_costs
Database name: primary
id :integer not null, primary key
cod :boolean default(FALSE)
cost :decimal(8, 2) default(0.0), not null
description_override :string
insured_value :decimal(8, 2)
is_free_ground_shipping :boolean default(FALSE)
rate_data :jsonb
saturday_delivery :boolean default(FALSE)
service_options_charges :decimal(8, 2) default(0.0), not null
signature_confirmation :boolean default(FALSE)
transportation_charges :decimal(8, 2) default(0.0), not null
created_at :datetime
updated_at :datetime
delivery_id :integer
shipping_account_number_id :integer
shipping_option_id :integer
Indexes
idx_delivery_id_shipping_option_id (delivery_id,shipping_option_id)
index_shipping_costs_on_delivery_id (delivery_id) USING hash
index_shipping_costs_on_shipping_option_id (shipping_option_id)
Foreign Keys
fk_rails_... (shipping_option_id => shipping_options.id) ON DELETE => cascade
shipping_costs_delivery_id_fk (delivery_id => deliveries.id) ON DELETE => cascade
Instance Attribute Summary collapse
- #cost ⇒ Object readonly
Belongs to collapse
- #delivery ⇒ Delivery
- #shipping_account_number ⇒ ShippingAccountNumber
- #shipping_option ⇒ ShippingOption
Has many collapse
Delegated Instance Attributes collapse
-
#information ⇒ Object
Alias for Shipping_option#information.
-
#is_fedex_ca? ⇒ Object
Alias for Shipping_option#is_fedex_ca?.
-
#is_freightquote? ⇒ Object
Alias for Shipping_option#is_freightquote?.
-
#is_override? ⇒ Object
Alias for Shipping_option#is_override?.
-
#is_third_party_only? ⇒ Object
Alias for Shipping_option#is_third_party_only?.
-
#name ⇒ Object
Alias for Shipping_option#name.
-
#service_code ⇒ Object
Alias for Shipping_option#service_code.
Class Method Summary collapse
-
.amzbs_only ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are amzbs only.
-
.override_only ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are override only.
-
.skip_3rd_party ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are skip 3rd party.
-
.skip_canadapost ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are skip canadapost.
-
.skip_freight ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are skip freight.
-
.skip_override ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are skip override.
-
.supported ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are supported.
-
.sww_only ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are sww only.
Instance Method Summary collapse
-
#amzbs_delivery_date_from_window ⇒ Object
Extracts a delivery date from the AMZBS delivery window when transit_days fields are nil.
- #calculated_cost ⇒ Object
-
#carrier_estimated_delivery_date ⇒ Object
Returns the estimated delivery date from any carrier (SWW, AMZBS, or ShipEngine).
- #days_commitment ⇒ Object
- #delivery_commitment ⇒ Object
- #description ⇒ Object
- #hide? ⇒ Boolean
-
#is_amzbs? ⇒ Boolean
Returns true if this is an Amazon Buy Shipping cost.
-
#is_amzbs_ptp? ⇒ Boolean
Returns true if this is an Amazon Buy Shipping pass-through (PTP) rate using the seller's own linked carrier account (UPS, FedEx, USPS).
-
#is_sww? ⇒ Boolean
Returns true if this is a Ship with Walmart shipping cost.
- #set_line_items_price ⇒ Object
-
#sww_estimated_delivery_date ⇒ Object
Returns the estimated delivery date for SWW rates.
Methods inherited from ApplicationRecord
ransackable_associations, ransackable_attributes, ransackable_scopes, ransortable_attributes, #to_relation
Methods included from Models::EventPublishable
Instance Attribute Details
#cost ⇒ Object (readonly)
41 |
# File 'app/models/shipping_cost.rb', line 41 validates :cost, numericality: true |
Class Method Details
.amzbs_only ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are amzbs only. Active Record Scope
85 |
# File 'app/models/shipping_cost.rb', line 85 scope :amzbs_only, -> { joins(:shipping_option).where(shipping_options: { carrier: 'AmazonSeller' }) } |
.override_only ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are override only. Active Record Scope
83 |
# File 'app/models/shipping_cost.rb', line 83 scope :override_only, -> { joins(:shipping_option).where(shipping_options: { name: 'override' }) } |
.skip_3rd_party ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are skip 3rd party. Active Record Scope
79 |
# File 'app/models/shipping_cost.rb', line 79 scope :skip_3rd_party, -> { joins(:shipping_option).where.not(shipping_options: { is_third_party_only: true }) } |
.skip_canadapost ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are skip canadapost. Active Record Scope
81 |
# File 'app/models/shipping_cost.rb', line 81 scope :skip_canadapost, -> { joins(:shipping_option).where("shipping_options.carrier IS NULL OR shipping_options.carrier <> 'Canadapost'") } |
.skip_freight ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are skip freight. Active Record Scope
80 |
# File 'app/models/shipping_cost.rb', line 80 scope :skip_freight, -> { joins(:shipping_option).where("shipping_options.carrier IS NULL OR shipping_options.carrier <> 'UPSFreight'") } |
.skip_override ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are skip override. Active Record Scope
78 |
# File 'app/models/shipping_cost.rb', line 78 scope :skip_override, -> { joins(:shipping_option).where.not(shipping_options: { name: 'override' }) } |
.supported ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are supported. Active Record Scope
82 |
# File 'app/models/shipping_cost.rb', line 82 scope :supported, -> { joins(:shipping_option).where.not(shipping_options: { is_third_party_only: true, carrier: nil }) } |
.sww_only ⇒ ActiveRecord::Relation<ShippingCost>
A relation of ShippingCosts that are sww only. Active Record Scope
84 |
# File 'app/models/shipping_cost.rb', line 84 scope :sww_only, -> { joins(:shipping_option).where(shipping_options: { carrier: 'WalmartSeller' }) } |
Instance Method Details
#amzbs_delivery_date_from_window ⇒ Object
Extracts a delivery date from the AMZBS delivery window when transit_days
fields are nil. Amazon's Shipping V2 API returns delivery windows for FedEx/UPS
PTP rates instead of transit days.
159 160 161 162 163 164 165 166 167 168 169 |
# File 'app/models/shipping_cost.rb', line 159 def amzbs_delivery_date_from_window return nil unless is_amzbs? window = rate_data&.dig('amz_delivery_window') || rate_data&.dig('raw', 'promise', 'deliveryWindow') end_date = window&.dig('end') || window&.dig(:end) return nil if end_date.blank? Time.zone.parse(end_date.to_s).to_date rescue StandardError nil end |
#calculated_cost ⇒ Object
173 174 175 176 177 |
# File 'app/models/shipping_cost.rb', line 173 def calculated_cost return 0.0 if shipping_account_number.present? cost end |
#carrier_estimated_delivery_date ⇒ Object
Returns the estimated delivery date from any carrier (SWW, AMZBS, or ShipEngine)
141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'app/models/shipping_cost.rb', line 141 def carrier_estimated_delivery_date return sww_estimated_delivery_date if is_sww? && sww_estimated_delivery.present? return estimated_delivery_date.to_date if estimated_delivery_date.present? transit_days = days_in_transit.presence || delivery_days.presence || sww_transit_days.presence || amz_transit_days.presence if transit_days.present? return Date.current + transit_days.to_i.days end amzbs_delivery_date_from_window rescue StandardError nil end |
#days_commitment ⇒ Object
97 98 99 |
# File 'app/models/shipping_cost.rb', line 97 def days_commitment days_in_transit.presence || sww_transit_days.presence || amz_transit_days.presence || shipping_option.days_commitment end |
#delivery ⇒ Delivery
36 |
# File 'app/models/shipping_cost.rb', line 36 belongs_to :delivery, optional: true |
#delivery_commitment ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 |
# File 'app/models/shipping_cost.rb', line 101 def delivery_commitment if days_in_transit.present? "#{days_in_transit} business days." elsif sww_transit_days.present? "#{sww_transit_days} business days via Walmart." elsif amz_transit_days.present? "#{amz_transit_days} business days via Amazon." else shipping_option.delivery_commitment end end |
#description ⇒ Object
87 88 89 90 91 92 93 94 95 |
# File 'app/models/shipping_cost.rb', line 87 def description return description_override || shipping_option.description || 'Override' if is_override? desc = [description_override || shipping_option.description] desc << 'Saturday' if saturday_delivery desc << 'Signature Required' if signature_confirmation # desc << "Cust. Acct. #: #{shipping_account_number.account_number}" if shipping_account_number desc.join(', ') end |
#hide? ⇒ Boolean
184 185 186 187 188 189 190 |
# File 'app/models/shipping_cost.rb', line 184 def hide? country_iso3_sym = shipping_option&.country_iso3&.to_sym Rails.logger.debug do "ShippingCost#hide? country_iso3_sym: #{country_iso3_sym}, shipping_option&.service_code: #{shipping_option&.service_code}, HIDE_SHIPPING_SERVICE_CODES[country_iso3_sym]: #{HIDE_SHIPPING_SERVICE_CODES[country_iso3_sym]}, HIDE_SHIPPING_SERVICE_CODES[country_iso3_sym]&.include?(shipping_option&.service_code): #{HIDE_SHIPPING_SERVICE_CODES[country_iso3_sym]&.include?(shipping_option&.service_code)}" end country_iso3_sym && HIDE_SHIPPING_SERVICE_CODES[country_iso3_sym]&.include?(shipping_option&.service_code) end |
#information ⇒ Object
Alias for Shipping_option#information
171 |
# File 'app/models/shipping_cost.rb', line 171 delegate :information, to: :shipping_option |
#is_amzbs? ⇒ Boolean
Returns true if this is an Amazon Buy Shipping cost
119 120 121 |
# File 'app/models/shipping_cost.rb', line 119 def is_amzbs? shipping_option&.carrier == 'AmazonSeller' || amz_carrier_id.present? end |
#is_amzbs_ptp? ⇒ Boolean
Returns true if this is an Amazon Buy Shipping pass-through (PTP) rate
using the seller's own linked carrier account (UPS, FedEx, USPS).
These rates provide A-to-Z Claims and OTDR protection.
126 127 128 |
# File 'app/models/shipping_cost.rb', line 126 def is_amzbs_ptp? is_amzbs? && amz_carrier_id.present? && amz_carrier_id != 'AMZN_US' end |
#is_fedex_ca? ⇒ Object
Alias for Shipping_option#is_fedex_ca?
72 |
# File 'app/models/shipping_cost.rb', line 72 delegate :is_fedex_ca?, to: :shipping_option |
#is_freightquote? ⇒ Object
Alias for Shipping_option#is_freightquote?
73 |
# File 'app/models/shipping_cost.rb', line 73 delegate :is_freightquote?, to: :shipping_option |
#is_override? ⇒ Object
Alias for Shipping_option#is_override?
70 |
# File 'app/models/shipping_cost.rb', line 70 delegate :is_override?, to: :shipping_option |
#is_sww? ⇒ Boolean
Returns true if this is a Ship with Walmart shipping cost
114 115 116 |
# File 'app/models/shipping_cost.rb', line 114 def is_sww? shipping_option&.carrier == 'WalmartSeller' || sww_carrier_id.present? end |
#is_third_party_only? ⇒ Object
Alias for Shipping_option#is_third_party_only?
71 |
# File 'app/models/shipping_cost.rb', line 71 delegate :is_third_party_only?, to: :shipping_option |
#line_items ⇒ ActiveRecord::Relation<LineItem>
39 |
# File 'app/models/shipping_cost.rb', line 39 has_many :line_items, dependent: :destroy |
#name ⇒ Object
Alias for Shipping_option#name
74 |
# File 'app/models/shipping_cost.rb', line 74 delegate :name, to: :shipping_option |
#service_code ⇒ Object
Alias for Shipping_option#service_code
75 |
# File 'app/models/shipping_cost.rb', line 75 delegate :service_code, to: :shipping_option |
#set_line_items_price ⇒ Object
179 180 181 182 |
# File 'app/models/shipping_cost.rb', line 179 def set_line_items_price Rails.logger.debug { "set_line_items_price: self.name: #{name}, self.calculated_cost: #{calculated_cost}, self.id: #{id}" } line_items.shipping_only.update_all(price: calculated_cost, discounted_price: calculated_cost) end |
#shipping_account_number ⇒ ShippingAccountNumber
37 |
# File 'app/models/shipping_cost.rb', line 37 belongs_to :shipping_account_number, optional: true |
#shipping_option ⇒ ShippingOption
35 |
# File 'app/models/shipping_cost.rb', line 35 belongs_to :shipping_option, optional: true |
#sww_estimated_delivery_date ⇒ Object
Returns the estimated delivery date for SWW rates
131 132 133 134 135 136 137 138 |
# File 'app/models/shipping_cost.rb', line 131 def sww_estimated_delivery_date return nil unless is_sww? return nil if sww_estimated_delivery.blank? sww_estimated_delivery.to_date rescue StandardError nil end |