@@ -15,6 +15,7 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
1515
1616 @ predictions_repo Application . compile_env! ( :dotcom , :repo_modules ) [ :predictions ]
1717 @ schedules_repo Application . compile_env! ( :dotcom , :repo_modules ) [ :schedules ]
18+ @ stops_repo Application . compile_env! ( :dotcom , :repo_modules ) [ :stops ]
1819
1920 defmodule UpcomingDeparture do
2021 @ moduledoc """
@@ -23,9 +24,13 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
2324
2425 defstruct [
2526 :arrival_status ,
27+ :arrival_substatus ,
2628 :headsign ,
29+ :platform_name ,
30+ :status ,
2731 :trip_details ,
28- :trip_id
32+ :trip_id ,
33+ :trip_name
2934 ]
3035
3136 defmodule TripDetails do
@@ -136,15 +141,35 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
136141 route_type: route_type ,
137142 now: now
138143 } ) ,
144+ arrival_substatus:
145+ arrival_substatus ( % {
146+ predicted_schedule: predicted_schedule ,
147+ route_type: route_type
148+ } ) ,
139149 headsign: trip . headsign ,
150+ platform_name: platform_name ( predicted_schedule ) ,
151+ status: predicted_schedule |> PredictedSchedule . status ( ) ,
140152 trip_details: trip_details ,
141- trip_id: trip . id
153+ trip_id: trip . id ,
154+ trip_name: if ( route_type == :commuter_rail , do: trip . name , else: nil )
142155 }
143156 end
144157
145158 defp seconds_between ( nil , _now ) , do: nil
146159 defp seconds_between ( prediction_time , now ) , do: DateTime . diff ( prediction_time , now , :second )
147160
161+ defp platform_name ( predicted_schedule ) do
162+ predicted_schedule
163+ |> PredictedSchedule . platform_stop_id ( )
164+ |> @ stops_repo . get ( )
165+ |> Kernel . then ( & & 1 . platform_name )
166+ |> case do
167+ nil -> nil
168+ "Commuter Rail" -> nil
169+ name -> name |> String . trim ( "Commuter Rail - " )
170+ end
171+ end
172+
148173 defp trip_details ( predictions_by_trip_id , trip_id , stop_id ) do
149174 other_stops = other_stops ( predictions_by_trip_id |> Map . get ( trip_id ) )
150175
@@ -191,6 +216,14 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
191216 } ) ,
192217 do: :hidden
193218
219+ defp arrival_status ( % {
220+ predicted_schedule: % PredictedSchedule { prediction: prediction } ,
221+ route_type: :commuter_rail
222+ } )
223+ when prediction != nil do
224+ { :time , prediction . departure_time }
225+ end
226+
194227 defp arrival_status ( % {
195228 predicted_schedule: % PredictedSchedule { prediction: prediction } ,
196229 route_type: route_type ,
@@ -209,7 +242,15 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
209242
210243 defp arrival_status ( % {
211244 predicted_schedule: % PredictedSchedule { schedule: schedule } ,
212- route_type: _route_type
245+ route_type: :commuter_rail
246+ } )
247+ when schedule != nil do
248+ { :scheduled , schedule . departure_time }
249+ end
250+
251+ defp arrival_status ( % {
252+ predicted_schedule: % PredictedSchedule { schedule: schedule } ,
253+
213254 } )
214255 when schedule != nil do
215256 { :scheduled , prediction_time ( schedule ) }
@@ -249,4 +290,34 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
249290 do: :approaching
250291
251292 defp realtime_arrival_status ( % { arrival_seconds: seconds } ) , do: { :arrival_seconds , seconds }
293+
294+ defp arrival_substatus ( % { route_type: route_type } ) when route_type != :commuter_rail , do: nil
295+
296+ defp arrival_substatus ( % {
297+ predicted_schedule: % PredictedSchedule { prediction: nil }
298+ } ) ,
299+ do: :scheduled
300+
301+ defp arrival_substatus ( % {
302+ predicted_schedule: % PredictedSchedule { prediction: % Prediction { status: status } }
303+ } ) when status != nil ,
304+ do: { :status , status |> String . split ( " " ) |> Enum . map ( & String . capitalize / 1 ) |> Enum . join ( " " ) }
305+
306+ defp arrival_substatus ( % {
307+ predicted_schedule: % PredictedSchedule { schedule: nil }
308+ } ) ,
309+ do: :on_time
310+
311+ defp arrival_substatus ( % {
312+ predicted_schedule: % PredictedSchedule { schedule: schedule , prediction: prediction }
313+ } ) do
314+ scheduled_time = schedule . departure_time
315+ predicted_time = prediction . departure_time
316+
317+ if DateTime . diff ( scheduled_time , predicted_time , :second ) |> abs ( ) < 60 do
318+ :on_time
319+ else
320+ { :scheduled_at , scheduled_time }
321+ end
322+ end
252323end
0 commit comments