# HTTP MPVNet state_position

-   Batch data chodí na VP-IG (vyšší jednotky MB během špičky)
-   Formát vstupních dat viz [input_realtime_data/http_mpvnet.md](../input_realtime_data/http_mpvnet.md)
-   (HTTP) Input Gateway
    -   Raw data se uloží na blob storage
    -   knihovnou `xml2js` se transformují na JSON
    -   validují se vůči JSON schématu a pošlou na Rabbita do fronty `saveDataToDB`
-   saveDataToDB
    -   data se napasují na struktury tabulek `vehiclepositions_trips` a `vehiclepositions_positions` (stav je `unknown`, `tracking` se bere ze vstupních dat)
    -   všechny spoje se upsertují, nové spoje a jejich pozice se pošlou do fronty `updateGTFSTripId`, existující do `updateDelay`
-   updateGTFSTripId
    -   duplikace vlakových spojů a pozic podle block id (určení tracking podle cis stop id)
    -   obohacení spojů GTFS daty (včetně oběhu a kmenové linky)
    -   upsert asociovaných pozic
    -   **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
    -   spoje se pošlou do fronty `updateDelay`
-   updateDelay
    -   opět duplikace vlakových spojů, upsert asociovaných pozic
    -   opětovné načtení asociovaných pozic z DB
    -   určení trasy spoje podle GTFS shapes a stop times
    -   processing pozic, uložení do databáze
        -   Not tracking (`tracking` je `0` a nebo nepřišly souřadnice)
            -   pokud je poslední pozice neznámá, nebo je známá a ve stavu `on_track` nebo `at_stop`, je aktuální stav `before_track`
            -   pokud je poslední známá pozice s `tracking 2`
                -   pokud je pozice duplicitní (existuje pozice se stejným `origin_timestamp`), stav je `duplicate`
                -   jinak je stav `after_track`
        -   Tracking (`tracking` je `2`, souřadnice jsou známy)
            -   pokud je vozidlo 200 metrů od nejblizšího bodu (anchor points) na trase, stav je `off_track`
            -   pokud je nejbližší bod v zastávce, nastaví se stav na `at_stop`
            -   jinak je stav `on_track`
        -   Zrušený spoj (příznak `canceled` u pozice)
            -   stav je vždy `canceled`
-   propagateDelay
    -   podle kmenové linky a oběhu vyhledáme navazující spoje
    -   podle GTFS trip id a registračního čísla poslední pozici ve stavu `before_track`
    -   přepsání stavu na `before_track_delayed`

```mermaid
flowchart TB;
  A[HTTP data]-->B[VP HTTP Input Gateway]--raw data-->Blob[Azure Blob Storage];
  B--JSON xml2js-->C[AMQP saveDataToDB]--upsert-->trips[(DB trips)];
  C--nové spoje bez GTFS dat-->D[AMQP updateGTFSTripId];
  C--existující spoje-->E[AMQP updateDelay];
  D--upsert-->trips;
  D--upsert-->positions[(DB positions)];
  D--nové spoje s GTFS daty-->E;
  E--upsert-->trips;
  E--upsert-->positions;
  E--select-->trips;
  E--select-->positions;
  E--uložené spoje-->F[AMQP propagateDelay];
  F--select-->trips;
  F--select-->positions;
  F--upsert-->positions;
```
