From f4b3e1e99258f0bc83bec0a65db040e5fb7995b2 Mon Sep 17 00:00:00 2001
From: derklaro <pasqual.koschmieder@easybill.de>
Date: Tue, 21 Jan 2025 18:36:09 +0100
Subject: [PATCH] fix: improve journey stop collection

---
 .../SimRailServerTimetableCollector.java        | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/info-collector/src/main/java/tools/simrail/backend/collector/journey/SimRailServerTimetableCollector.java b/info-collector/src/main/java/tools/simrail/backend/collector/journey/SimRailServerTimetableCollector.java
index b6e0a38..ed7aa5f 100644
--- a/info-collector/src/main/java/tools/simrail/backend/collector/journey/SimRailServerTimetableCollector.java
+++ b/info-collector/src/main/java/tools/simrail/backend/collector/journey/SimRailServerTimetableCollector.java
@@ -252,6 +252,23 @@ private void collectJourney(
           arrivalEvent.setStopType(JourneyStopType.TECHNICAL);
           previousEvent.setStopType(JourneyStopType.TECHNICAL);
         }
+
+        if (previousEvent.getStopType() == JourneyStopType.PASSENGER && !hasOverlay) {
+          // if the journey has a passenger stop scheduled but no overlay set for
+          // the station, schedule an overlay of 30 seconds for the stations to allow
+          // for passenger change. apparently the SimRail backend can currently not
+          // handle overlay that's only seconds long, therefore all times are rounded
+          // to a full minute
+          var scheduledTime = previousEvent.getScheduledTime();
+          var timeWithOverlay = scheduledTime.plusSeconds(30);
+          previousEvent.setScheduledTime(timeWithOverlay);
+          previousEvent.setRealtimeTime(timeWithOverlay);
+        } else if (!hasOverlay) {
+          // remove the stop type at the point in case there is no overlay time
+          // scheduled for the journey (basically a stop without a stop)
+          arrivalEvent.setStopType(JourneyStopType.NONE);
+          previousEvent.setStopType(JourneyStopType.NONE);
+        }
       }
 
       if (borderPoint != null && wasInBorder) {