@golemio/pid 5.8.3 → 5.8.4-dev.2436767567

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/db/example/13_http-propagate-delay.sql +3 -0
  2. package/db/migrations/postgresql/20260325161451-add-new-columns-to-precomputed-table.js +53 -0
  3. package/db/migrations/postgresql/20260407082406-add-new-columns-to-getDepartures().js +53 -0
  4. package/db/migrations/postgresql/sqls/20260325161451-add-new-columns-to-precomputed-table-down.sql +4 -0
  5. package/db/migrations/postgresql/sqls/20260325161451-add-new-columns-to-precomputed-table-up.sql +4 -0
  6. package/db/migrations/postgresql/sqls/20260407082406-add-new-columns-to-getDepartures()-down.sql +152 -0
  7. package/db/migrations/postgresql/sqls/20260407082406-add-new-columns-to-getDepartures()-up.sql +158 -0
  8. package/dist/integration-engine/ropid-gtfs/data-access/precomputed/DeparturesRepository.js +32 -3
  9. package/dist/integration-engine/ropid-gtfs/data-access/precomputed/DeparturesRepository.js.map +1 -1
  10. package/dist/integration-engine/vehicle-positions/workers/runs/transformations/CommonRunsMessagesTransformation.js +2 -2
  11. package/dist/integration-engine/vehicle-positions/workers/runs/transformations/CommonRunsMessagesTransformation.js.map +1 -1
  12. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/helpers/PositionsMapper.js +3 -2
  13. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/helpers/PositionsMapper.js.map +1 -1
  14. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/compute-positions/strategy/CommonDelayAtStop.js +8 -2
  15. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/compute-positions/strategy/CommonDelayAtStop.js.map +1 -1
  16. package/dist/output-gateway/pid/controllers/v2/V2DepartureBoardsController.js +1 -0
  17. package/dist/output-gateway/pid/controllers/v2/V2DepartureBoardsController.js.map +1 -1
  18. package/dist/output-gateway/pid/dto/DepartureBoardsDTO.d.ts +1 -0
  19. package/dist/output-gateway/pid/dto/DepartureBoardsDTO.js +4 -0
  20. package/dist/output-gateway/pid/dto/DepartureBoardsDTO.js.map +1 -1
  21. package/dist/output-gateway/pid/dto/interfaces/IDepartureBoardsQueryDTO.d.ts +1 -0
  22. package/dist/output-gateway/pid/helpers/DepartureBoardMapper.d.ts +2 -1
  23. package/dist/output-gateway/pid/helpers/DepartureBoardMapper.js +28 -4
  24. package/dist/output-gateway/pid/helpers/DepartureBoardMapper.js.map +1 -1
  25. package/dist/output-gateway/pid/interfaces/IPIDDeparture.d.ts +3 -0
  26. package/dist/output-gateway/pid/models/PIDDepartureBoardsModel.js +1 -0
  27. package/dist/output-gateway/pid/models/PIDDepartureBoardsModel.js.map +1 -1
  28. package/dist/output-gateway/pid/models/helpers/PIDDepartureModel.js +1 -1
  29. package/dist/output-gateway/pid/models/helpers/PIDDepartureModel.js.map +1 -1
  30. package/dist/output-gateway/pid/models/helpers/interfaces/IPIDDepartureQueryOptions.d.ts +1 -0
  31. package/dist/output-gateway/pid/models/interfaces/IGetDeparturesOptions.d.ts +1 -0
  32. package/dist/output-gateway/pid/routers/v2/V2PIDRouter.js +1 -0
  33. package/dist/output-gateway/pid/routers/v2/V2PIDRouter.js.map +1 -1
  34. package/dist/schema-definitions/ropid-gtfs/models/precomputed/DeparturesModel.d.ts +3 -0
  35. package/dist/schema-definitions/ropid-gtfs/models/precomputed/DeparturesModel.js +12 -0
  36. package/dist/schema-definitions/ropid-gtfs/models/precomputed/DeparturesModel.js.map +1 -1
  37. package/dist/schema-definitions/ropid-gtfs/models/precomputed/interfaces/IDeparturesModel.d.ts +3 -0
  38. package/docs/asyncapi.yaml +27 -4
  39. package/docs/cache/types/psql.md +3 -3
  40. package/docs/cache/types/redis.md +30 -2
  41. package/docs/implementation_documentation.md +96 -3
  42. package/docs/jis/index.md +17 -0
  43. package/docs/openapi-output.yaml +20 -3
  44. package/docs/processing/input_realtime_data/http_mpvnet.md +21 -0
  45. package/docs/processing/input_realtime_data/tcp_dpp_bus.md +3 -3
  46. package/docs/processing/input_realtime_data/tcp_dpp_tram.md +3 -3
  47. package/docs/processing/state_position_tracking/http_mpvnet.md +1 -0
  48. package/docs/processing/state_position_tracking/tcp_dpp_common.md +2 -1
  49. package/docs/processing/transferboards_filtering.md +312 -0
  50. package/package.json +1 -1
@@ -264,12 +264,14 @@ _:warning: Původním záměrem bylo využití OIS číselníku během zpracová
264
264
  - baseUrl: module.pid.staticData.baseUrl
265
265
  - departure directions url: module.pid.staticData.departuresDirection.path
266
266
  - metro rail track url: module.pid.staticData.metroRailTracks.path
267
+ - not public vehicles url: module.pid.staticData.notPublicVehicles.path
267
268
  - formát dat
268
269
  - protokol: http
269
- - datový typ: csv
270
+ - datový typ: csv (DeparturesDirection, MetroRailTrack), json (NotPublicVehicles)
270
271
  - validační schéma:
271
272
  - [MetroRailTrack](../src/schema-definitions/datasources/static-data/MetroRailTrackJsonSchema.ts)
272
273
  - [DeparturesDirection](../src/schema-definitions/datasources/static-data/DeparturesDirectionsJsonSchema.ts)
274
+ - [NotPublicVehicles](../src/schema-definitions/datasources/static-data/interfaces/NotPublicVehiclesDataInterface.ts) – interface `INotPublicVehicles`
273
275
  - příklad vstupnich dat: viz zdroj data
274
276
  - frekvence stahování
275
277
  - Po nacteni jizdnich radu (fronta: vehicle-positions.ropidgtfs.checkForNewData)
@@ -512,6 +514,9 @@ Všechny tabulky se nachází ve schématu `pid`
512
514
  - [RopidGTFSRunNumbersTransformation](https://gitlab.com/operator-ict/golemio/code/modules/pid/-/blob/development/src/integration-engine/ropid-gtfs/transformations/RopidGTFSRunNumbersTransformation.ts)
513
515
  - [RopidGtfsRouteSubAgencyTransformation](https://gitlab.com/operator-ict/golemio/code/modules/pid/-/blob/development/src/integration-engine/ropid-gtfs/transformations/RopidGtfsRouteSubAgencyTransformation.ts)
514
516
  - on top of transformation functionality it also removes duplicates. Rule: If there are multiple rows with same `route_id` and `sub_agency_id` only the first with filled licence number is kept.
517
+ - rozšířené sloupce GTFS souborů (nestandardní rozšíření ROPID)
518
+ - `trips.txt` – sloupec `headsign_icons`: řetězec dvouznakových kódů ikon (např. `"MbSb"`), uložen do `ropidgtfs_trips.headsign_icons`
519
+ - `stop_times.txt` – sloupec `headsign_icons`: přepis na úrovni zastávky, uložen do `ropidgtfs_stop_times.headsign_icons`; má přednost před hodnotou z `trips.txt` pokud je zároveň vyplněn `stop_headsign`
515
520
  - data modely
516
521
  - RopidGTFSMetadataModel `ropidgtfs_metadata`
517
522
  - RopidGTFSAgencyModel `ropidgtfs_agency`
@@ -562,6 +567,7 @@ Všechny tabulky se nachází ve schématu `pid`
562
567
  - RopidGTFSPrecomputedMinMaxStopSequencesModel `ropidgtfs_precomputed_minmax_stop_sequences`
563
568
  - RopidGTFSPrecomputedDeparturesModel `ropidgtfs_precomputed_departures`
564
569
  - RopidGTFSPrecomputedTripScheduleModel `ropidgtfs_precomputed_trip_schedule`
570
+ - RopidGTFSPrecomputedTripConnectionsModel `ropidgtfs_precomputed_trip_connections`
565
571
 
566
572
  #### task _RefreshPrecomputedTables_
567
573
 
@@ -581,6 +587,7 @@ Všechny tabulky se nachází ve schématu `pid`
581
587
  - RopidGTFSPrecomputedMinMaxStopSequencesModel `ropidgtfs_precomputed_minmax_stop_sequences`
582
588
  - RopidGTFSPrecomputedDeparturesModel `ropidgtfs_precomputed_departures`
583
589
  - RopidGTFSPrecomputedTripScheduleModel `ropidgtfs_precomputed_trip_schedule`
590
+ - RopidGTFSPrecomputedTripConnectionsModel `ropidgtfs_precomputed_trip_connections`
584
591
 
585
592
  #### task _RefreshPublicGtfsDepartureCacheTask_
586
593
 
@@ -596,8 +603,10 @@ Task se stará o aktualizaci cache pro public odjezdy. Pouští se pravidelně c
596
603
  - ROPID FTP
597
604
  - transformace
598
605
  - [PublicDepartureCacheTransformation](../src/integration-engine/ropid-gtfs/transformations/PublicDepartureCacheTransformation.ts)
606
+ - výsledný cache záznam obsahuje pole `connections` (garantované přestupy – přednačtené z `ropidgtfs_precomputed_trip_connections`, původně z `transfers.txt` kde `transfer_type = 1`) a pole `wheelchair_accessible` (přístupnost vozidla pro vozíčkáře z GTFS `trips.txt`)
607
+ - pole `trip_headsign_icons`: pokud je pro danou zastávku spoje vyplněn `stop_headsign`, použije se `stop_headsign_icons` z `ropidgtfs_stop_times`; jinak se použije `headsign_icons` z `ropidgtfs_trips`; výsledek je řetězec dvouznakových kódů (např. `"MbMcSb"`) nebo `null`
599
608
  - data modely
600
- - RopidGTFSPrecomputedDeparturesModel `ropidgtfs_precomputed_departures`
609
+ - RopidGTFSPrecomputedDeparturesModel `ropidgtfs_precomputed_departures` (obsahuje JOIN na `ropidgtfs_precomputed_trip_connections_tmp` přes `to_trip_id` a `to_stop_id`)
601
610
 
602
611
  #### task _SaveStaticData_
603
612
 
@@ -613,9 +622,19 @@ Task se stará o aktualizaci statickych dat. Pouští se po dokončení načten
613
622
  - transformace
614
623
  - [DeparturesDirectionTransformation](../src/integration-engine/ropid-gtfs/workers/timetables/tasks/transformations/DeparturesDirectionTransformation.ts)
615
624
  - [MetroRailtrackDataTransformation](../src/integration-engine/ropid-gtfs/workers/timetables/tasks/transformations/MetroRailtrackDataTransformation.ts)
625
+ - `NotPublicVehicles` – data se ukládají přímo do cache klíče `config:notPublicVehicles` přes `NotPublicVehiclesRedisRepository` (žádná DB tabulka)
616
626
  - data modely
617
627
  - RopidDeparturesDirections `ropid_departures_directions`
618
628
  - RopidGtfsMetroRailtrackGps `ropidgtfs_metro_railtrack_gps`
629
+ - Cache `config:notPublicVehicles` – JSON blob struktury `INotPublicVehicles`:
630
+ ```json
631
+ {
632
+ "tram": { "registrationNumbers": ["string"] },
633
+ "road": { "registrationNumbers": ["string"] },
634
+ "routeIds": ["string"]
635
+ }
636
+ ```
637
+ `road` pokrývá autobusy i trolejbusy (evidenční čísla se mohou překrývat s tramvajemi, proto jsou oddělena). `routeIds` je whitelist číselných identifikátorů náhradních nebo dočasných linek (např. náhradní autobus za metro při výluce nebo mimořádné události), které se mají zobrazovat i bez platného JŘ spoje.
619
638
 
620
639
  #### task _EnsureCacheTask_
621
640
 
@@ -1086,6 +1105,18 @@ Worker má na starost generování souborů s realtime daty pro `gtfsrt` endpoin
1086
1105
  - VPTripsModel `vehiclepositions_trips`
1087
1106
  - VPPositionsModel `vehiclepositions_positions`
1088
1107
 
1108
+ **`wheelchairAccessible` ve VehicleDescriptor**
1109
+
1110
+ Pole `wheelchairAccessible` je součástí standardního `VehicleDescriptor` ve feedech `vehicle_positions.pb` a `pid_feed.pb`:
1111
+
1112
+ | Interní hodnota | Proto enum |
1113
+ |---|---|
1114
+ | `null` | `WHEELCHAIR_ACCESSIBLE_UNSPECIFIED = 0` |
1115
+ | `true` | `WHEELCHAIR_ACCESSIBLE = 1` |
1116
+ | `false` | `WHEELCHAIR_INACCESSIBLE = 2` |
1117
+
1118
+ Zdrojem je pole `wheelchair_accessible` z tabulky `vehiclepositions_trips` (přenášené přes `IGtfsRtTripDto`). Vedle standardního pole zůstává zachováno rozšíření `.transit_realtime.ovapiVehicleDescriptor.wheelchairAccessible` s původní boolean/null hodnotou.
1119
+
1089
1120
  **Určení zpoždění v trip_updates.pb**
1090
1121
 
1091
1122
  Predikce odjezdů probíhá podle vzorce:
@@ -1191,6 +1222,10 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
1191
1222
  - data modely
1192
1223
  - JISEventsModel `jis_events`
1193
1224
  - JISEventsRopidGTFSRoutesModel `jis_events_ropidgtfs_routes`
1225
+ - poznámky k datovému modelu
1226
+ - pole `effects` je pole až 3 unikátních řetězců; v GTFS-RT `Alert.effect` se použije pouze `effects[0]`, zbývající hodnoty jsou dostupné pouze v custom-format exportu
1227
+ - pole `cause_detail` je volný text zpřesňující příčinu události; může být `null`
1228
+ - pole `cause` obsahuje překlady do češtiny i angličtiny; anglické hodnoty jsou zahrnuty i ve výstupu GTFS-RT alert feedu
1194
1229
 
1195
1230
  #### _task: RefreshJISInfotextsTask_
1196
1231
 
@@ -1285,7 +1320,7 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
1285
1320
  - retence dat
1286
1321
  - jízdní řády se generují 1-2x denně na 14 dní dopředu
1287
1322
  - polohová data si uchováváme 24 hodin (30 minut od poslední aktualizace, poté v historických tabulkách)
1288
- - popis vozidel si uchováváme 24 hodin
1323
+ - popis vozidel se nepromazává přetrvávají do přepsání novými daty (fixní TTL bylo odstraněno)
1289
1324
  - preset logy si uchováváme 8 hodin
1290
1325
  - JIS události a infotexty si uchováváme neomezeně
1291
1326
 
@@ -1428,6 +1463,12 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
1428
1463
 
1429
1464
  - zdrojové tabulky
1430
1465
  - `ropidgtfs_precomputed_departures`, `ropidgtfs_stops`, `ropidgtfs_cis_stops`, `jis_infotexts`, `jis_infotexts_ropidgtfs_stops`, `ropid_departures_directions`, `vehiclepositions_positions`, `vehiclepositions_trips`
1466
+ - odpověď obsahuje hlavičku `X-Golemio-Preset-Metadata: airConditionPossible=0|1`
1467
+ - `1` pokud byl zadán query parametr `airCondition` s pravdivou hodnotou, `0` jinak
1468
+ - slouží monitorovacím systémům (preset systémy monitorovacího centra ROPID) k detekci aktivního filtrování dle klimatizace
1469
+ - kód nástupiště (`platform_code`)
1470
+ - **vlaky**: preferuje se CIS hodnota `cis_stop_platform_code` uložená z MPVNet zpráv (`PlatformCodeResolver`); MPVNet atribut `$.stan` je před uložením oříznut na první platný segment (viz [parsování `stan` u vlaků](../processing/input_realtime_data/http_mpvnet.md#parsování-stanoviště-stan-u-vlaků))
1471
+ - **ostatní typy**: používá se GTFS `platform_code` ze `stop_times.txt`
1431
1472
 
1432
1473
  ### PID Departure Boards v3
1433
1474
 
@@ -1435,6 +1476,42 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
1435
1476
 
1436
1477
  - načte odjezdy pro přestupní tabule ve vozidlech a aktivní infotexty exportované z aplikace VYMI (JIS) Infotexty
1437
1478
 
1479
+ ### PID Departure Boards v4
1480
+
1481
+ #### _/v4/pid/transferboards_
1482
+
1483
+ - načte odjezdy pro přestupní tabule ve vozidlech na základě aktuální polohy vozidla a aktivní infotexty exportované z aplikace VYMI (JIS) Infotexty
1484
+ - parametry
1485
+ - `aswId` + `vehicleRegistrationNumber` + `routeType` – identifikace zastávky a vozidla přes ASW číselník (vzájemně se vylučuje s `cisId`+`tripNumber`)
1486
+ - `cisId` + `tripNumber` – identifikace zastávky a spoje přes CIS číselník (zatím neimplementováno, vrací 501)
1487
+ - `timeFrom` – volitelný ISO8601 čas příjezdu (pokud není zadán, použije se reálný čas příjezdu z RT dat)
1488
+ - `limit` – volitelný počet odjezdů (výchozí 8, max 30)
1489
+ - cachováno na 5 sekund (stale-while-revalidate 5 sekund)
1490
+ - zdrojové cache záznamy
1491
+ - `gtfsStopsCache:*` – převod ASW node ID na GTFS stop_id
1492
+ - `gtfsDelayComputation:*` – zjištění zastávek spoje a predikovaného času příjezdu
1493
+ - `vpPublicCache:*` – aktuální poloha a zpoždění vozidla
1494
+ - `gtfsPublicDepartureCache:*` – statické odjezdy ze zastávek (vč. `connections` a `wheelchair_accessible`)
1495
+ - `vpPublicStopTimeCache:*` – live zastávkové časy pro spoje se známou polohou
1496
+ - `jisCache:*` – aktivní infotexty pro dané zastávky
1497
+ - načítání odjezdů z cache (`gtfsPublicDepartureCache`)
1498
+ - z každé zastávky se načte `max(80, min(120, limit × 10))` položek v časovém okně `[plannedTimeFrom − 61 min, plannedTimeFrom + 60 min + delay]`; lookback 61 minut zajišťuje, že se zachytí i navazující spoj, jehož plánovaný odjezd je v minulosti, ale díky vlastnímu zpoždění (až 60 minut) dorazí na zastávku až po příjezdu aktuálního vozidla
1499
+ - ihned po načtení se aplikuje pre-filter: odjezdy autobusů, tramvají a trolejbusů ze zastávek s jiným názvem než aktuální zastávka jsou zahozeny; metro/vlak/přívoz/lanovka procházejí vždy; odjezdy s neprázdným polem `connections[]` jsou zachovány bez ohledu na název zastávky (potenciální garantovaný přestup)
1500
+ - garantované přestupy (`is_guaranteed_transfer`)
1501
+ - označují odjezdy, které na příjezd aktuálního spoje čekají – detekováno z pole `connections` v `gtfsPublicDepartureCache`, kde `from_trip_id` odpovídá aktuálnímu spoji a `arrivalTime < departure_datetime + max_wait_sec`
1502
+ - zobrazované minuty u garantovaného přestupu jsou nastaveny na čas příjezdu aktuálního spoje (ne na plánovaný odjezd navazujícího spoje)
1503
+ - garantované přestupy jsou vyjmuty z filtru opačného směru a filtru podskupiny linky – jsou přidány do `tripIdsToKeep` před spuštěním `findRelevantTripIdsFromLines`, takže projdou bez ohledu na zastávkovou sekvenci
1504
+ - typy "vždy zobrazit" (metro, vlak, přívoz, lanovka) filtr `findRelevantTripIdsFromLines` zcela přeskakují
1505
+ - dostupnost pro vozíčkáře (`is_wheelchair_accessible`)
1506
+ - **metro**: určeno výhradně podle `wheelchair_boarding` zastávky (hodnota `1` = přístupná)
1507
+ - **ostatní typy dopravy**: primárně z RT dat vozidla (`detailed_info.is_wheelchair_accessible`); pokud RT data nejsou k dispozici, použije se GTFS příznak `wheelchair_accessible` z `trips.txt` (`1` = přístupné vozidlo)
1508
+ - seskupování a omezení výstupu (`TransferDepartureCacheTransformation`)
1509
+ - **metro**: seskupuje se podle `route_short_name + stop_id`; na jeden záznam výstupu připadají až 2 hodnoty v poli `departure_timestamp.minutes[]`
1510
+ - **ostatní typy**: seskupuje se podle `route_short_name + direction_id`; na skupinu připadají nejvýše 2 samostatné záznamy odjezdů; `direction_id` se získává z cache poloh vozidel (klíč `route_short_name + trip_headsign`), výchozí hodnota je `0`
1511
+ - konfigurace filtrování opačného směru (backtracking)
1512
+ - `module.pid.vehicle-positions.transferboards.isOppositeDirectionFilterStopNameStrict` (boolean, výchozí `true`) – pokud `true`, zastávka je považována za "zpětnou" pouze pokud se shoduje `stop_id` i `stop_name`; pokud `false`, stačí shoda `stop_id`
1513
+ - `module.pid.vehicle-positions.transferboards.countPreviousStopsToAllow` (integer, výchozí `0`) – kolik předchozích zastávek aktuálního spoje smí kandidátní spoj sdílet ve svých nadcházejících zastávkách, než je považován za zpětný směr a odfiltrován; `0` znamená žádná shoda není povolena
1514
+
1438
1515
  #### _/v3/pid/infotexts_
1439
1516
 
1440
1517
  - načte aktivní infotexty exportované z aplikace VYMI (JIS) Infotexty
@@ -1482,4 +1559,20 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
1482
1559
  - podle názvů linek a jak daleko do budoucnosti se mají odjezdy navracet
1483
1560
  - limitování počtu odjezdů v každé skupině
1484
1561
  - EP je optimalizován pro vyšší zátěž z mobilní aplikace PID lítačka - požadavek do databáze z OG pouze v případě nutnosti obnovit cache s vehicle descriptory (klimatizace, usb nabíječky), jinak je vše z Redisu
1562
+ - deduplikace odjezdů (pro seskupení "jeden za linka+směr") se provádí podle klíče `route_id + trip_headsign + platform_code`; toto se liší od původního přístupu deduplikace podle `stop_id` a správně pokrývá situace, kdy jeden ASW uzel odpovídá více GTFS `stop_id`
1563
+ - dostupnost pro vozíčkáře (`is_wheelchair_accessible`) se určuje v pořadí priority:
1564
+ 1. RT descriptor vozidla (`detailed_info.is_wheelchair_accessible` z vehicle positions)
1565
+ 2. GTFS statický příznak `wheelchair_accessible` z `trips.txt` (`1` = přístupné), pokud RT data nejsou k dispozici
1485
1566
  - je použit `CompressionByDefaultMiddleware` a odpovědi jsou tak na output gateway komprimovány i pokud klient explicitně nepovolí komprimaci vhodnou hodnotou hlavičky `Accept-Encoding` (lze však komprimaci explicitně zakázat hodnotou `identity`)
1567
+
1568
+ ### JIS v1
1569
+
1570
+ #### _/v1/jis/events/custom-format_
1571
+
1572
+ - vrátí seznam publikovaných událostí ve vlastním formátu pro externí konzumenty (fallback endpoint pro webhooky)
1573
+ - parametry
1574
+ - `displayPeriodStart` / `displayPeriodEnd` – filtrování podle překryvu zobrazovacího okna události s požadovaným rozsahem (ISO 8601)
1575
+ - `organizationNames` – filtrování podle organizace (pole řetězců)
1576
+ - `type` – filtrování podle typu události (`INCIDENT`, `DISRUPTION`, `SERVICE_CHANGE`)
1577
+ - zdrojové tabulky: `jis_events`, `jis_events_ropidgtfs_routes`
1578
+ - formát odpovědi: viz schéma `EventCustomFormat` v [openapi-output.yaml](./openapi-output.yaml)
package/docs/jis/index.md CHANGED
@@ -246,3 +246,20 @@ flowchart TB
246
246
  ```
247
247
 
248
248
  Zdroj a formát dat pro aktivní stahování jsou dále více popsány v implementační dokumentaci ([události](../implementation_documentation.md#jis-events), [infotexty](../implementation_documentation.md#jis-infotexts)), stejně tak jako [worker a tasky](../implementation_documentation.md#jisworker) a popis [uložení dat](../implementation_documentation.md#uložení-dat) včetně databázového schema a popisu retence.
249
+
250
+ ## Datový model událostí — vybraná pole
251
+
252
+ ### `cause_detail`
253
+
254
+ Volitelné textové upřesnění příčiny události (`cause_detail`). Může být `null`. Dostupné v custom-format exportu (`/v1/jis/events/custom-format`) i v GTFS-RT alert feedu jako rozšíření. Struktura:
255
+ ```json
256
+ { "cs": "Nehoda na křižovatce", "en": null }
257
+ ```
258
+
259
+ ### `cause` — anglický překlad
260
+
261
+ Pole `cause` obsahuje překlad příčiny události do češtiny i do angličtiny. Anglická hodnota je zahrnuta i ve výstupu GTFS-RT alert feedu (pole `Alert.cause` v `pid_feed.pb` i `alerts.pb`).
262
+
263
+ ### `effects` (pole příčin dopadu)
264
+
265
+ Pole `effects` může obsahovat 1–3 unikátní řetězcové hodnoty. Pouze `effects[0]` se mapuje na standardní GTFS-RT `Alert.effect`; zbývající hodnoty jsou dostupné výhradně v custom-format exportu.
@@ -1022,6 +1022,16 @@ paths:
1022
1022
  type: number
1023
1023
  format: int64
1024
1024
  example: 0
1025
+ - name: appendHeadsignsLimit
1026
+ in: query
1027
+ description: >-
1028
+ Number of stops before route switch at which headsign is enriched with continuation info.
1029
+ When set and a departure has route-switch data, headsign becomes `&lt;headsign&gt; → &lt;next_route&gt; &lt;next_headsign&gt;`.
1030
+ required: false
1031
+ schema:
1032
+ type: integer
1033
+ minimum: 0
1034
+ example: 3
1025
1035
 
1026
1036
  responses:
1027
1037
  "200":
@@ -2644,7 +2654,9 @@ components:
2644
2654
  example: false
2645
2655
  origin_timestamp:
2646
2656
  type: string
2647
- description: Time at which the position was sent from the vehicle (UTC)
2657
+ description: >
2658
+ Transmission time of the message from the vehicle (UTC).
2659
+ Corresponds to the lat/lng position reported in the same message.
2648
2660
  example: "2019-03-18T11:00:00.000Z"
2649
2661
  speed:
2650
2662
  type: number
@@ -2766,7 +2778,10 @@ components:
2766
2778
  example: "top-left"
2767
2779
  headsign:
2768
2780
  type: string
2769
- description: Trip headsign (usually the final stop).
2781
+ description: >-
2782
+ Trip headsign (usually the final stop). When the `appendHeadsignsLimit` parameter is used and the departure
2783
+ has route-switch data, this field may contain appended continuation info in the form
2784
+ `&lt;headsign&gt; → &lt;next_route&gt; &lt;next_headsign&gt;`.
2770
2785
  example: "Chodov"
2771
2786
  id:
2772
2787
  type: string
@@ -3175,7 +3190,9 @@ components:
3175
3190
  origin_timestamp:
3176
3191
  type: string
3177
3192
  nullable: true
3178
- description: "time when vehicle send last update"
3193
+ description: >
3194
+ Transmission time of the last message from the vehicle.
3195
+ Corresponds to the lat/lng position reported in the same message.
3179
3196
  example: "2023-12-06T12:00:00+01:00"
3180
3197
 
3181
3198
  ScopeStaticInfo:
@@ -92,6 +92,27 @@
92
92
  ```
93
93
 
94
94
  ## Vlaky
95
+
96
+ ### Parsování stanoviště (`stan`) u vlaků
97
+
98
+ Atribut `stan` v elementu `<zast>` u vlaků může obsahovat složený řetězec ve formátu `část1/část2` nebo `část1 část2` (např. `5S/22S`, `-/6`, `2/3`). Jako kanonický kód nástupiště se použije **první platný segment** – první token oddělený lomítkem nebo mezerou, pokud není prázdný nebo `-`.
99
+
100
+ Příklady výsledků po parsování:
101
+
102
+ | Vstup (`stan`) | Výsledný `platform_code` |
103
+ |---|---|
104
+ | `1/3` | `1` |
105
+ | `-/BUS` | `BUS` |
106
+ | `2/100V` | `2` |
107
+ | `5A/- A C` | `5A` |
108
+ | `5S/22S` | `5S` |
109
+
110
+ Parsování provádí `MpvStopParser.parsePlatformCode()`. Výsledný kód je uložen jako `cis_stop_platform_code` v tabulce `vehiclepositions_positions` a na výstupu se pro vlaky preferuje před GTFS `platform_code` (viz `PlatformCodeResolver`).
111
+
112
+ ### Zprávy s informací o nástupišti jako syntetická poloha
113
+
114
+ Pokud MPVNet zpráva vlaku obsahuje informaci o nástupišti (`$.stan`) pro budoucí zastávku a vlak ještě nemá žádnou aktivní RT polohu, vytvoří se syntetická poloha ve stavu `before_track` na základě dat z této zastávky. Díky tomu lze zobrazit kód nástupiště ještě před fyzickým příjezdem vlaku na stanoviště. Kód nástupiště se parsuje stejným způsobem jako výše (`MpvStopParser.parsePlatformCode()`).
115
+
95
116
  ```xml
96
117
  <?xml version="1.0" encoding="utf-8"?>
97
118
 
@@ -15,11 +15,11 @@
15
15
  - **lat** - zeměpisná šířka
16
16
  - **lng** - zeměpisná délka
17
17
  - **akt** - poslední projetá zastávka, nepoužíváme
18
- - **takt** - timestamp odeslání zprávy z vozidla
18
+ - **takt** - čas události (reálný čas příjezdu/odjezdu vozidla na zastávce); mapuje se na `scheduled_timestamp`
19
19
  - **konc** - poslední ASW zastávka spoje, nepoužíváme
20
- - **tjr** - timestamp odeslání zprávy podle (v jaký čas mělo vozidlo na daném bodě být)
20
+ - **tjr** - plánovaný čas podle jízdního řádu (v jaký čas mělo vozidlo na daném bodě být); nepoužíváme pro určení pozice
21
21
  - **pkt** - identifikátor zprávy z vozidla/číslo TCP packetu??? Nepoužíváme
22
- - **tm** - timestamp odeslání zprávy od DPP
22
+ - **tm** - čas přenosu zprávy od DPP (transmission time); odpovídá aktuální zeměpisné poloze vozidla (lat/lng); mapuje se na `origin_timestamp`
23
23
  - **events** - událost asociovaná se zprávou
24
24
  - P - příjezd do zastávky
25
25
  - O - odjezd ze zastávky
@@ -14,11 +14,11 @@
14
14
  - **lat** - zeměpisná šířka
15
15
  - **lng** - zeměpisná délka
16
16
  - **akt** - poslední projetá zastávka, nepoužíváme
17
- - **takt** - timestamp odeslání zprávy z vozidla
17
+ - **takt** - čas události (reálný čas příjezdu/odjezdu vozidla na zastávce); mapuje se na `scheduled_timestamp`
18
18
  - **konc** - poslední ASW zastávka spoje, nepoužíváme
19
- - **tjr** - timestamp odeslání zprávy podle (v jaký čas mělo vozidlo na daném bodě být)
19
+ - **tjr** - plánovaný čas podle jízdního řádu (v jaký čas mělo vozidlo na daném bodě být); nepoužíváme pro určení pozice
20
20
  - **pkt** - identifikátor zprávy z vozidla/číslo TCP packetu??? Nepoužíváme
21
- - **tm** - timestamp odeslání zprávy od DPP
21
+ - **tm** - čas přenosu zprávy od DPP (transmission time); odpovídá aktuální zeměpisné poloze vozidla (lat/lng); mapuje se na `origin_timestamp`
22
22
  - **events** - událost asociovaná se zprávou
23
23
  - P - příjezd do zastávky
24
24
  - O - odjezd ze zastávky
@@ -13,6 +13,7 @@
13
13
  - duplikace vlakových spojů a pozic podle block id (určení tracking podle cis stop id)
14
14
  - obohacení spojů GTFS daty (včetně oběhu a kmenové linky)
15
15
  - upsert asociovaných pozic
16
+ - **syntetická poloha z informace o nástupišti**: pokud zpráva obsahuje atribut `$.stan` pro budoucí zastávku a vlak ještě nemá aktivní RT polohu, vytvoří se syntetická pozice ve stavu `before_track` pro tuto zastávku – umožňuje zobrazit kód nástupiště před fyzickým příjezdem vlaku
16
17
  - spoje se pošlou do fronty `updateDelay`
17
18
  - updateDelay
18
19
  - opět duplikace vlakových spojů, upsert asociovaných pozic
@@ -14,7 +14,7 @@
14
14
  - pokud je tramvaj, je `tracking 2`
15
15
  - nebo pokud je autobus
16
16
  - pokud vozidlo odeslalo zprávu `O`, je `tracking 2`
17
- - pokud je vozidlo v první zastávce (tjr), nebo pokud vozidlo vyjelo z první zastávky (takt), je `tracking 2`
17
+ - pokud je vozidlo v první zastávce (dle `tjr` — plánovaný čas JŘ), nebo pokud vozidlo vyjelo z první zastávky (dle `takt` — čas události), je `tracking 2`
18
18
  - nebo je `tjr` atribut větší než příjezd do první zastávky spoje, je `tracking 2`
19
19
  - jinak je `tracking 0`
20
20
  - Rovněž se podle kmenové linky a oběhu vytvoří následující spoje (stav je `unknown`, `tracking` je vždy 0)
@@ -33,6 +33,7 @@
33
33
  - pokud je pozice duplicitní (existuje pozice se stejným `origin_timestamp`), stav je `duplicate`
34
34
  - pokud vozidlo jede do garáže, je stav `invisible`
35
35
  - jinak je stav `after_track`
36
+ - **zvláštní případ**: pokud má pozice `cis_last_stop_id = null`, stav se znovu nevyhodnocuje – pozice si zachovává poslední známý stav (zmrazení stavu); to zabraňuje nežádoucímu cyklování zpět do `untracked` pouze kvůli chybějící CIS zastávce
36
37
  - Tracking (`tracking` je `2`)
37
38
  - pokud je vozidlo 200 metrů od nejblizšího bodu na trase, stav je `off_track`
38
39
  - pokud je vozidlo v zastávce, je stav `at_stop`