Class: SpreeCmCommissioner::TripQuery
- Inherits:
-
Object
- Object
- SpreeCmCommissioner::TripQuery
- Defined in:
- app/queries/spree_cm_commissioner/trip_query.rb
Instance Attribute Summary collapse
-
#date ⇒ Object
readonly
Returns the value of attribute date.
-
#destination_id ⇒ Object
readonly
Returns the value of attribute destination_id.
-
#number_of_guests ⇒ Object
readonly
Returns the value of attribute number_of_guests.
-
#origin_id ⇒ Object
readonly
Returns the value of attribute origin_id.
-
#params ⇒ Object
readonly
Returns the value of attribute params.
-
#vendor_id ⇒ Object
readonly
Returns the value of attribute vendor_id.
Instance Method Summary collapse
- #call ⇒ Object
- #direct_trips ⇒ Object
-
#initialize(origin_id:, destination_id:, date:, vendor_id: nil, number_of_guests: nil, params: {}) ⇒ TripQuery
constructor
rubocop:disable Metrics/ParameterLists.
- #product_inventory_totals ⇒ Object
Constructor Details
#initialize(origin_id:, destination_id:, date:, vendor_id: nil, number_of_guests: nil, params: {}) ⇒ TripQuery
rubocop:disable Metrics/ParameterLists
5 6 7 8 9 10 11 12 13 14 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 5 def initialize(origin_id:, destination_id:, date:, vendor_id: nil, number_of_guests: nil, params: {}) # rubocop:disable Metrics/ParameterLists @origin_id = origin_id @destination_id = destination_id @date = date.to_date == Time.zone.now.to_date ? Time.zone.now : Time.zone.parse(date.to_s) @vendor_id = vendor_id @number_of_guests = number_of_guests || 1 @params = params @page = (params[:page] || 1).to_i @per_page = params[:per_page] end |
Instance Attribute Details
#date ⇒ Object (readonly)
Returns the value of attribute date.
3 4 5 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 3 def date @date end |
#destination_id ⇒ Object (readonly)
Returns the value of attribute destination_id.
3 4 5 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 3 def destination_id @destination_id end |
#number_of_guests ⇒ Object (readonly)
Returns the value of attribute number_of_guests.
3 4 5 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 3 def number_of_guests @number_of_guests end |
#origin_id ⇒ Object (readonly)
Returns the value of attribute origin_id.
3 4 5 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 3 def origin_id @origin_id end |
#params ⇒ Object (readonly)
Returns the value of attribute params.
3 4 5 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 3 def params @params end |
#vendor_id ⇒ Object (readonly)
Returns the value of attribute vendor_id.
3 4 5 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 3 def vendor_id @vendor_id end |
Instance Method Details
#call ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 16 def call return Kaminari.paginate_array([]) if date.to_date < Date.current paginated_relation = direct_trips return Kaminari.paginate_array([]) if paginated_relation.empty? unique_trips = paginated_relation.uniq(&:id) results_array = unique_trips.map do |trip| result = build_trip_result(trip) SpreeCmCommissioner::TripQueryResult.new([result]) end Kaminari.paginate_array( results_array, total_count: unique_trips.size, limit: unique_trips.size, offset: paginated_relation.offset_value ) end |
#direct_trips ⇒ Object
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 36 def direct_trips @inventory_sql ||= product_inventory_totals result = SpreeCmCommissioner::Trip .select(<<~SQL.squish) .includes(vendor: :logo, vehicle: :option_values) .joins(<<~SQL.squish) INNER JOIN cm_trip_stops AS boarding ON boarding.trip_id = cm_trips.id AND boarding.stop_type = 0 INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = cm_trips.id AND drop_off.stop_type = 1 INNER JOIN cm_places AS origin_places ON origin_places.id = cm_trips.origin_place_id INNER JOIN cm_places AS dest_places ON dest_places.id = cm_trips.destination_place_id INNER JOIN spree_variants AS master ON master.product_id = cm_trips.product_id AND master.is_master = true INNER JOIN spree_prices AS prices ON prices.variant_id = master.id AND prices.deleted_at IS NULL SQL .where('(boarding.location_place_id = ? OR boarding.stop_place_id = ? OR cm_trips.origin_place_id = ?) AND (drop_off.location_place_id = ? OR drop_off.stop_place_id = ? OR cm_trips.destination_place_id = ?)', origin_id, origin_id, origin_id, destination_id, destination_id, destination_id ) .joins("INNER JOIN (#{@inventory_sql.to_sql}) iv ON cm_trips.product_id = iv.product_id") result = result.where(vendor_id: vendor_id) if vendor_id.present? @per_page.to_i.positive? ? result.page(@page).per(@per_page) : result.page(@page) end |
#product_inventory_totals ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 |
# File 'app/queries/spree_cm_commissioner/trip_query.rb', line 70 def product_inventory_totals Spree::Product .select( 'spree_products.id AS product_id, SUM(cm_inventory_items.max_capacity) AS max_capacity, SUM(cm_inventory_items.quantity_available) AS quantity_available' ) .joins(variants: :inventory_items) .where('cm_inventory_items.inventory_date = ? AND cm_inventory_items.quantity_available >= ?', @date.to_date, @number_of_guests) .group('spree_products.id') end |