Týdenní stav vybavení

Zadávání a historie

  • /equipment: jeden výkaz pro jeden sklad a středeční datum. Rozbalovací seznam nabízí středu aktuálního kalendářního týdne a dvě následující středy. Výchozí je středa aktuálního týdne (i o víkendu). Starší výkazy se doplňují a opravují přes historii.
  • Aktuální týden a výchozí měsíc historie se určují podle Europe/Prague, včetně letního času, nezávisle na časové zóně serveru. Čas posledního uložení zůstává v UTC.
  • V režimu opravy (edit=1) se datum pouze zobrazuje, bez výběru. Starší přímé odkazy se středečním datem mimo nabídku se přesměrují do tohoto režimu. Nové zadání bez edit=1 přijímá pouze jednu ze tří nabízených kontrol.
  • Šest kategorií: naskladňovací místa, tablety, váhy, balicí místa, páskovačky, odesílací místa. Funkční místo zahrnuje i potřebný tablet a váhu.
  • Počty total (celkem) a functional (funkční) jsou nepovinné. Vyplněné hodnoty musí být celá čísla od 0 do 999999999; pokud jsou vyplněné obě, platí functional <= total. Prázdné pole je nezadaná hodnota, nikoli nula. Lze uložit i celý prázdný výkaz.
  • Formulář vždy načte uložené hodnoty pro vybraný sklad a středu, pokud výkaz existuje; jinak jsou početní pole prázdná. Stejně funguje nové zadání i oprava z historie. Neuložené změny při změně skladu nebo data vyžadují potvrzení.
  • Uložení nahrazuje celý výkaz včetně prázdných polí. Sklad a středeční datum jsou povinné.
  • /equipment/history: výběr skladu, roku a měsíce, všechny středy daného měsíce, přehled celkem / funkční (pomlčka = nezadáno), odkazy Upravit/Doplnit. Chybějící výkaz není nula a nepřebírá hodnoty z minulého týdne.
  • Přístup mají stejní uživatelé jako k denním formulářům (access=true); administrátor není vyžadován. POST vyžaduje také token formuláře uložený v session.
  • Nabídka Směny sdružuje Aktivní dny kontroly, Obsazenost směn a Do CME. Odkaz Obsazenost směn zůstává dostupný pouze oprávněným administrátorům.

Dříve uložené páteční výkazy zůstávají pod původním datem dostupné v historii a API a lze je opravit. Nový páteční výkaz již nelze vytvořit.

CSV

Soubor ${DATA_DIR}/sp-equipment.csv vzniká při prvním uložení. Klíč je warehouse_id,inspection_date. Oprava nahradí daný záznam, ostatní sklady a týdny zachová. Ukládá se poslední podoba výkazu, nikoli historie jednotlivých změn.

Sloupce: warehouse_id, inspection_date, pro každou kategorii níže sloupce <key>_total a <key>_functional, dále updated_at (UTC ISO 8601) a updated_by (ID uživatele). Souběžné zápisy aplikace jsou serializovány pomocí sp-equipment.csv.lock; soubor se nahrazuje atomicky. Externí editory tento zámek musí respektovat. Při současné opravě stejného výkazu platí poslední uložená verze.

Čtecí API

GET /api/v1/warehouses/equipment?from=2026-10-01&to=2026-10-31&warehouse_id=1

  • Povinné from a to: YYYY-MM-DD, včetně obou mezí, nejvýše 366 dní, roky 2020–2100. Meze nemusejí být středy.
  • Volitelné warehouse_id: ID existujícího skladu; bez něj všechny sklady.
  • Vyžaduje Authorization: Bearer <token> ze stávajícího registru sp-api-tokens.csv, také při AUTH_REQUIRED=0. Browser session token nenahrazuje.
  • 401: chybějící, neplatný či vypnutý token. 400: neplatné filtry.
  • 200: pouze uložené výkazy, vzestupně podle data kontroly a ID skladu. Prázdný výsledek má data: [] a meta.record_count: 0.

Každá položka data obsahuje warehouse: {id, name}, inspection_date, equipment, updated_at a updated_by. Objekt equipment obsahuje šest klíčů, každý s hodnotami {total, functional}: celé číslo nebo null pro nezadaný počet. V CSV jsou nezadané počty prázdné buňky; nuly se zachovávají jako 0.

Klíč Kategorie
stocking_stations Naskladňovací místa
tablets Tablety
scales Váhy
packing_stations Balicí místa
strapping_machines Páskovačky
dispatch_stations Odesílací místa

Příklad volání

Proměnná API_TOKEN obsahuje platný token z registru; skutečný token nepatří do dokumentace ani do verzovaného kódu.

curl --fail-with-body \
  -H "Authorization: Bearer $API_TOKEN" \
  "http://127.0.0.1:5004/api/v1/warehouses/equipment?from=2026-10-01&to=2026-10-31&warehouse_id=1"

Pro všechny sklady vynechte warehouse_id. Pro jednu konkrétní středu nastavte from i to na stejné datum. Filtr se vztahuje k datu kontroly, nikoli k času poslední úpravy.

Příklad odpovědi

Ilustrační hodnoty, nikoli skutečná provozní data:

{
  "data": [
    {
      "warehouse": {"id": 1, "name": "Jablonec"},
      "inspection_date": "2026-10-28",
      "equipment": {
        "stocking_stations": {"total": 16, "functional": 15},
        "tablets": {"total": 66, "functional": 58},
        "scales": {"total": 2, "functional": 1},
        "packing_stations": {"total": 38, "functional": 38},
        "strapping_machines": {"total": 3, "functional": 2},
        "dispatch_stations": {"total": null, "functional": null}
      },
      "updated_at": "2026-10-30T10:21:29Z",
      "updated_by": "10655"
    }
  ],
  "meta": {"record_count": 1}
}

updated_at je čas posledního uložení v UTC, updated_by je ID autora jako řetězec. Oprava vrací poslední uloženou podobu výkazu. I zcela prázdný uložený výkaz je samostatný záznam se všemi počty null; chybějící výkaz v odpovědi vůbec není.

Bez odpovídajících záznamů vrátí API HTTP 200:

{"data": [], "meta": {"record_count": 0}}

Chyby mají tvar {"error": {"message": "..."}}. Odpověď 401 navíc obsahuje hlavičku WWW-Authenticate: Bearer realm="shift-planner-app-api".

Výkazy jsou podkladem pro ruční plánování. Automatický výpočet počtu lidí ani pravidelné připomínky nejsou součástí této funkce.