Method: ActiveShipping::RateEstimate#delivery_range

Defined in:
lib/active_shipping/rate_estimate.rb,
lib/active_shipping/rate_estimate.rb

#delivery_rangeArray<Date>

The minimum and maximum date of when the shipment is expected to be delivered.

Returns:

  • (Array<Date>)


65
66
67
68
69
70
71
72
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
# File 'lib/active_shipping/rate_estimate.rb', line 65

class RateEstimate
  attr_reader :origin, :destination, :package_rates,
              :carrier, :service_name, :service_code,
              :shipping_date, :delivery_date, :delivery_range,
              :currency, :negotiated_rate, :insurance_price,
              :estimate_reference, :expires_at, :pickup_time,
              :compare_price, :phone_required

  def initialize(origin, destination, carrier, service_name, options = {})
    @origin, @destination, @carrier, @service_name = origin, destination, carrier, service_name
    @service_code = options[:service_code]
    @estimate_reference = options[:estimate_reference]
    @pickup_time = options[:pickup_time]
    @expires_at = options[:expires_at]
    if options[:package_rates]
      @package_rates = options[:package_rates].map { |p| p.update(:rate => Package.cents_from(p[:rate])) }
    else
      @package_rates = Array(options[:packages]).map { |p| {:package => p} }
    end
    @total_price = Package.cents_from(options[:total_price])
    @negotiated_rate = options[:negotiated_rate] ? Package.cents_from(options[:negotiated_rate]) : nil
    @compare_price = options[:compare_price] ? Package.cents_from(options[:compare_price]) : nil
    @phone_required = !!options[:phone_required]
    @currency = ActiveUtils::CurrencyCode.standardize(options[:currency])
    @delivery_range = options[:delivery_range] ? options[:delivery_range].map { |date| date_for(date) }.compact : []
    @shipping_date = date_for(options[:shipping_date])
    @delivery_date = @delivery_range.last
    @insurance_price = Package.cents_from(options[:insurance_price])
  end

  # The total price of the shipments in cents.
  # @return [Integer]
  def total_price
    @total_price || @package_rates.sum { |pr| pr[:rate] }
  rescue NoMethodError
    raise ArgumentError.new("RateEstimate must have a total_price set, or have a full set of valid package rates.")
  end
  alias_method :price, :total_price

  # Adds a package to this rate estimate
  # @param package [ActiveShipping::Package] The package to add.
  # @param rate [#cents, Float, String, nil] The rate for this package. This is only required if
  #   there is no total price for this shipment
  # @return [self]
  def add(package, rate = nil)
    cents = Package.cents_from(rate)
    raise ArgumentError.new("New packages must have valid rate information since this RateEstimate has no total_price set.") if cents.nil? and total_price.nil?
    @package_rates << {:package => package, :rate => cents}
    self
  end

  # The list of packages for which rate estimates are given.
  # @return [Array<ActiveShipping::Package>]
  def packages
    package_rates.map { |p| p[:package] }
  end

  # The number of packages for which rate estimates are given.
  # @return [Integer]
  def package_count
    package_rates.length
  end

  private

  # Returns a Date object for a given input
  # @param [String, Date, Time, DateTime, ...] The object to infer a date from.
  # @return [Date, nil] The Date object absed on the input, or `nil` if no date
  #   could be determined.
  def date_for(date)
    date && DateTime.strptime(date.to_s, "%Y-%m-%d")
  rescue ArgumentError
    nil
  end
end