Class: SpreeCmCommissioner::TripQueryResult

Inherits:
Object
  • Object
show all
Defined in:
lib/spree_cm_commissioner/trip_query_result.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(trips:, parent_trip: nil) ⇒ TripQueryResult

Returns a new instance of TripQueryResult.



5
6
7
8
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 5

def initialize(trips:, parent_trip: nil)
  @trips = Array(trips)
  @parent_trip = parent_trip
end

Instance Attribute Details

#parent_tripObject (readonly)

Returns the value of attribute parent_trip.



3
4
5
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 3

def parent_trip
  @parent_trip
end

#tripsObject (readonly)

Returns the value of attribute trips.



3
4
5
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 3

def trips
  @trips
end

Class Method Details

.from_hash(hash) ⇒ Object

Accepts either: { parent_trip: <Trip>, legs: [<Trip>, <Trip>] } OR { parent_trip: <Trip>, trips: [<TripResult>, <TripResult>] }



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 13

def self.from_hash(hash)
  parent = hash[:parent_trip] || hash['parent_trip']

  raw = hash[:trips] || hash['trips']
  trips =
    if raw
      raw.map { |t| t.is_a?(SpreeCmCommissioner::TripResult) ? t : SpreeCmCommissioner::TripResult.from_trip(t) }.compact
    else
      legs = hash[:legs] || hash['legs'] || []
      legs.map { |leg| SpreeCmCommissioner::TripResult.from_trip(leg) }.compact
    end

  new(trips: trips, parent_trip: parent)
end

Instance Method Details

#amenitiesObject



162
163
164
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 162

def amenities
  @trips.flat_map(&:amenities).uniq { |a| a[:id] }
end

#arrival_timeObject



137
138
139
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 137

def arrival_time
  @trips.last&.arrival_time
end

#compare_at_priceObject



60
61
62
63
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 60

def compare_at_price
  values = @trips.map(&:compare_at_price).compact
  values.empty? ? nil : values.sum
end

#currencyObject



65
66
67
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 65

def currency
  @trips.first&.currency
end

#departure_timeObject



133
134
135
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 133

def departure_time
  @trips.first&.departure_time
end

#direct?Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 41

def direct?
  @trips.size == 1
end

#display_compare_at_priceObject



75
76
77
78
79
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 75

def display_compare_at_price
  return nil if compare_at_price.nil? || currency.nil?

  Spree::Money.new(compare_at_price, currency: currency).to_s
end

#display_include_return_compare_at_priceObject



113
114
115
116
117
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 113

def display_include_return_compare_at_price
  return nil if include_return_compare_at_price.nil? || currency.nil?

  Spree::Money.new(include_return_compare_at_price, currency: currency).to_s
end

#display_include_return_priceObject



107
108
109
110
111
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 107

def display_include_return_price
  return nil if include_return_price.nil? || currency.nil?

  Spree::Money.new(include_return_price, currency: currency).to_s
end

#display_priceObject



69
70
71
72
73
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 69

def display_price
  return nil if price.nil? || currency.nil?

  Spree::Money.new(price, currency: currency).to_s
end

#has_return_trip_globallyObject

Always present on direct trips: whether the reverse route (B→A) exists in any operator / this operator.



142
143
144
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 142

def has_return_trip_globally # rubocop:disable Naming/PredicateName
  @trips.first&.has_return_trip_globally
end

#has_return_trip_in_vendorObject

rubocop:disable Naming/PredicateName



146
147
148
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 146

def has_return_trip_in_vendor # rubocop:disable Naming/PredicateName
  @trips.first&.has_return_trip_in_vendor
end

#idObject



28
29
30
31
32
33
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 28

def id
  return parent_trip[:id] if parent_trip.is_a?(Hash) && parent_trip.key?(:id)
  return parent_trip['id'] if parent_trip.is_a?(Hash) && parent_trip.key?('id')

  parent_trip&.try(:id) || @trips.first&.id
end

#include_return?Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 88

def include_return?
  include_return_product_id.present?
end

#include_return_compare_at_priceObject



99
100
101
102
103
104
105
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 99

def include_return_compare_at_price
  return compare_at_price unless include_return?

  trip = @trips.first
  base = compare_at_price || total_price
  base.to_d + (trip.open_dated_compare_at_price || trip.open_dated_price).to_d
end

#include_return_priceObject

Outbound price + the add-on’s master price (the add-on is master-only, so price lives on master).



93
94
95
96
97
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 93

def include_return_price
  return total_price unless include_return?

  total_price + @trips.first.open_dated_price.to_d
end

#include_return_product_idObject

The id of the ecommerce add-on offered as the “Return Included” option. Only direct trips carry one.



82
83
84
85
86
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 82

def include_return_product_id
  return nil unless direct?

  open_dated_product_id
end

#max_capacityObject



49
50
51
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 49

def max_capacity
  @trips.map(&:max_capacity).compact.min
end

#open_dated_product_idObject



158
159
160
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 158

def open_dated_product_id
  @trips.first&.open_dated_product_id
end

#priceObject Also known as: total_price



53
54
55
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 53

def price
  @trips.map(&:price).compact.sum
end

#quantity_availableObject



45
46
47
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 45

def quantity_available
  @trips.map(&:quantity_available).compact.min
end

#total_durationObject



119
120
121
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 119

def total_duration
  @trips.map { |trip| trip.respond_to?(:duration_with_offset) ? trip.duration_with_offset : trip.duration }.compact.sum
end

#total_duration_in_hmsObject



123
124
125
126
127
128
129
130
131
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 123

def total_duration_in_hms
  total_seconds = total_duration || 0
  return { hours: 0, minutes: 0, seconds: 0 } if total_seconds.nil? || total_seconds <= 0

  hours = total_seconds / 3600
  minutes = (total_seconds % 3600) / 60
  seconds = total_seconds % 60
  { hours: hours, minutes: minutes, seconds: seconds }
end

#trip_idsObject



35
36
37
38
39
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 35

def trip_ids
  return @trips.map(&:id) unless direct?

  @trips.sort_by { |trip| trip.respond_to?(:sequence) ? trip.sequence.to_i : 0 }.map(&:id)
end

#vehicle_typesObject



154
155
156
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 154

def vehicle_types
  @trips.map(&:vehicle_type).uniq
end

#vendorsObject



150
151
152
# File 'lib/spree_cm_commissioner/trip_query_result.rb', line 150

def vendors
  @trips.map(&:vendor).uniq
end