aboutsummaryrefslogtreecommitdiffstats
path: root/app/controllers/referential_vehicle_journeys_controller.rb
blob: 917326a6d44f46ee3e6b2ba7232c34deed5edd16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
#
# Browse all VehicleJourneys of the Referential
#
class ReferentialVehicleJourneysController < ChouetteController
  include ReferentialSupport
  include RansackDateFilter

  before_action only: [:index] { set_date_time_params("purchase_window", Date, prefix: :purchase_window) }
  before_action only: [:index] { set_date_time_params("time_table", Date, prefix: :time_table) }

  defaults :resource_class => Chouette::VehicleJourney, collection_name: :vehicle_journeys

  requires_feature :referential_vehicle_journeys

  def index
    if params[:q] && params[:q][:route_line_id_eq].present?
      @filtered_line = Chouette::Line.find(params[:q][:route_line_id_eq])
    end

    index!
  end

  private

  def collection
    @q ||= end_of_association_chain.select("vehicle_journeys.id", "vehicle_journeys.journey_pattern_id", "vehicle_journeys.route_id", "vehicle_journeys.objectid", "vehicle_journeys.published_journey_name")
    @q = @q.with_stop_area_ids(params[:q][:stop_area_ids]) if params[:q] && params[:q][:stop_area_ids]
    @q = ransack_period_range(scope: @q, error_message:  t('vehicle_journeys.errors.purchase_window'), query: :in_purchase_window, prefix: :purchase_window)
    @q = ransack_period_range(scope: @q, error_message:  t('vehicle_journeys.errors.time_table'), query: :with_matching_timetable, prefix: :time_table)
    @starting_stop = params[:q] && params[:q][:stop_areas] && params[:q][:stop_areas][:start].present? ? Chouette::StopArea.find(params[:q][:stop_areas][:start]) : nil
    @ending_stop = params[:q] && params[:q][:stop_areas] && params[:q][:stop_areas][:end].present? ? Chouette::StopArea.find(params[:q][:stop_areas][:end]) : nil

    if @starting_stop
      @q =
        unless @ending_stop
          @q.with_stop_area_id(@starting_stop.id)
        else
          @q.with_ordered_stop_area_ids(@starting_stop.id, @ending_stop.id)
        end
    end

    @q = @q.ransack(params[:q])
    @vehicle_journeys ||= @q.result
    @vehicle_journeys = parse_order @vehicle_journeys
    @all_companies = Chouette::Company.where("id IN (#{@referential.vehicle_journeys.select(:company_id).to_sql})").distinct
    @consolidated = ReferentialConsolidated.new @vehicle_journeys, params
    @vehicle_journeys = @vehicle_journeys.paginate page: params[:page], per_page: params[:per_page] || 10
  end

  def parse_order scope
    return scope.order(:published_journey_name) unless params[:sort].present?
    direction = params[:direction] || "asc"
    attributes = Chouette::VehicleJourney.column_names.map{|n| "vehicle_journeys.#{n}"}.join(',')
    case params[:sort]
      when "line"
        scope.order("lines.name #{direction}").joins(route: :line)
      when "route"
        scope.order("routes.name #{direction}").joins(:route)
      when "departure_time"
        scope.joins(:vehicle_journey_at_stops).group(attributes).select(attributes).order("MIN(vehicle_journey_at_stops.departure_time) #{direction}")
      when "arrival_time"
        scope.joins(:vehicle_journey_at_stops).group(attributes).select(attributes).order("MAX(vehicle_journey_at_stops.departure_time) #{direction}")
      else
        scope.order "#{params[:sort]} #{direction}"
      end
  end
end