Class: ShippingCost

Inherits:
ApplicationRecord show all
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

Belongs to collapse

Has many collapse

Delegated Instance Attributes collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ApplicationRecord

ransackable_associations, ransackable_attributes, ransackable_scopes, ransortable_attributes, #to_relation

Methods included from Models::EventPublishable

#publish_event

Instance Attribute Details

#costObject (readonly)



41
# File 'app/models/shipping_cost.rb', line 41

validates :cost, numericality: true

Class Method Details

.amzbs_onlyActiveRecord::Relation<ShippingCost>

A relation of ShippingCosts that are amzbs only. Active Record Scope

Returns:

See Also:



85
# File 'app/models/shipping_cost.rb', line 85

scope :amzbs_only, -> { joins(:shipping_option).where(shipping_options: { carrier: 'AmazonSeller' }) }

.override_onlyActiveRecord::Relation<ShippingCost>

A relation of ShippingCosts that are override only. Active Record Scope

Returns:

See Also:



83
# File 'app/models/shipping_cost.rb', line 83

scope :override_only, -> { joins(:shipping_option).where(shipping_options: { name: 'override' }) }

.skip_3rd_partyActiveRecord::Relation<ShippingCost>

A relation of ShippingCosts that are skip 3rd party. Active Record Scope

Returns:

See Also:



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_canadapostActiveRecord::Relation<ShippingCost>

A relation of ShippingCosts that are skip canadapost. Active Record Scope

Returns:

See Also:



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_freightActiveRecord::Relation<ShippingCost>

A relation of ShippingCosts that are skip freight. Active Record Scope

Returns:

See Also:



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_overrideActiveRecord::Relation<ShippingCost>

A relation of ShippingCosts that are skip override. Active Record Scope

Returns:

See Also:



78
# File 'app/models/shipping_cost.rb', line 78

scope :skip_override, -> { joins(:shipping_option).where.not(shipping_options: { name: 'override' }) }

.supportedActiveRecord::Relation<ShippingCost>

A relation of ShippingCosts that are supported. Active Record Scope

Returns:

See Also:



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_onlyActiveRecord::Relation<ShippingCost>

A relation of ShippingCosts that are sww only. Active Record Scope

Returns:

See Also:



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_windowObject

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_costObject



173
174
175
176
177
# File 'app/models/shipping_cost.rb', line 173

def calculated_cost
  return 0.0 if .present?

  cost
end

#carrier_estimated_delivery_dateObject

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_commitmentObject



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

#deliveryDelivery

Returns:

See Also:



36
# File 'app/models/shipping_cost.rb', line 36

belongs_to :delivery, optional: true

#delivery_commitmentObject



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

#descriptionObject



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

Returns:

  • (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

#informationObject

Alias for Shipping_option#information

Returns:

  • (Object)

    Shipping_option#information

See Also:



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

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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?

Returns:

  • (Object)

    Shipping_option#is_fedex_ca?

See Also:



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?

Returns:

  • (Object)

    Shipping_option#is_freightquote?

See Also:



73
# File 'app/models/shipping_cost.rb', line 73

delegate :is_freightquote?, to: :shipping_option

#is_override?Object

Alias for Shipping_option#is_override?

Returns:

  • (Object)

    Shipping_option#is_override?

See Also:



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

Returns:

  • (Boolean)


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?

Returns:

  • (Object)

    Shipping_option#is_third_party_only?

See Also:



71
# File 'app/models/shipping_cost.rb', line 71

delegate :is_third_party_only?, to: :shipping_option

#line_itemsActiveRecord::Relation<LineItem>

Returns:

See Also:



39
# File 'app/models/shipping_cost.rb', line 39

has_many :line_items, dependent: :destroy

#nameObject

Alias for Shipping_option#name

Returns:

  • (Object)

    Shipping_option#name

See Also:



74
# File 'app/models/shipping_cost.rb', line 74

delegate :name, to: :shipping_option

#service_codeObject

Alias for Shipping_option#service_code

Returns:

  • (Object)

    Shipping_option#service_code

See Also:



75
# File 'app/models/shipping_cost.rb', line 75

delegate :service_code, to: :shipping_option

#set_line_items_priceObject



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_numberShippingAccountNumber



37
# File 'app/models/shipping_cost.rb', line 37

belongs_to :shipping_account_number, optional: true

#shipping_optionShippingOption



35
# File 'app/models/shipping_cost.rb', line 35

belongs_to :shipping_option, optional: true

#sww_estimated_delivery_dateObject

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