Load Sessions API
API pro správu nakládacích sessions a zpracování skenů během nakládky.
Přehled
Load Sessions umožňují řídit proces nakládky pro konkrétní projekt. Každá session má:
- Plán nakládky - seznam položek, které mají být naloženy
- Realitu - co je skutečně naloženo (skeny, qty operace)
- Missing/Extra - kalkulace chybějících a navíc naložených položek
Endpointy
POST /projects/:id/load-sessions
Vytvoří novou load session pro projekt.
Oprávnění: Loader, Producer, Admin
Request:
{}
Response:
{
"success": true,
"data": {
"id": 1,
"project_id": 5,
"status": "OPEN",
"started_at": 1704067200,
"started_by_user_id": 1
}
}
GET /load-sessions
Seznam load sessions s volitelným filtrem podle statusu.
Oprávnění: Bearer token (vyžaduje autentizaci)
Query parametry:
status(volitelné): Filtr podle statusu (OPEN,CLOSED)page(volitelné): Číslo stránky (výchozí: 1)pageSize(volitelné): Počet položek na stránku (výchozí: 50)
Response:
{
"success": true,
"data": {
"sessions": [
{
"id": 1,
"project_id": 5,
"status": "OPEN",
"started_at": 1704067200,
"closed_at": null,
"project_name": "Summer Festival 2024",
"project_date_from": 1704067200,
"project_date_to": 1704153600
}
],
"pagination": {
"total": 10,
"page": 1,
"pageSize": 50,
"totalPages": 1
}
}
}
GET /load-sessions/:id
Získá detail load session.
Oprávnění: Bearer token (vyžaduje autentizaci)
Response:
{
"success": true,
"data": {
"id": 1,
"project_id": 5,
"status": "OPEN",
"started_at": 1704067200,
"closed_at": null,
"started_by_user_id": 1,
"closed_by_user_id": null
}
}
GET /load-sessions/:id/plan
Získá plán nakládky s rozřešenými daty (assets, items, kits).
Oprávnění: Bearer token (vyžaduje autentizaci)
Response:
{
"success": true,
"data": {
"lines": [
{
"id": 1,
"session_id": 1,
"line_type": "ASSET",
"ref_id": 5,
"qty": null,
"section": "Sekce A",
"created_at": 1704067200,
"asset": {
"id": 5,
"scan_id": 12345,
"item_name": "Microphone Shure SM58"
}
},
{
"id": 2,
"session_id": 1,
"line_type": "ITEM_QTY",
"ref_id": 10,
"qty": 5,
"section": null,
"created_at": 1704067200,
"item": {
"id": 10,
"name": "XLR Cable 10m"
}
}
]
}
}
GET /load-sessions/:id/status
Získá status load session včetně missing/extra kalkulace.
Oprávnění: Bearer token (vyžaduje autentizaci)
Response:
{
"success": true,
"data": {
"planned": {
"assets": 10,
"items": 5,
"globalKits": 2,
"projectKits": 1
},
"loaded": {
"assets": 8,
"items": 3
},
"missing": {
"assets": 2,
"items": 2
},
"extra": {
"assets": 0,
"items": 0
}
}
}
POST /load-sessions/:id/scan
Zpracuje sken QR kódu během nakládky.
Oprávnění: Loader, Producer, Admin
Podporuje 3 typy skenů:
- Asset (konkrétní kus) - podle zadani.md sekce 6.3
- Global Kit - podle zadani.md sekce 6.4
- Project Kit - podle zadani.md sekce 6.5
Request:
{
"scan_id": 12345
}
Response - Asset v plánu:
{
"success": true,
"data": {
"message": "Asset naložen",
"asset": {
"id": 1,
"scan_id": 12345,
"item_id": 5,
"functional_status": "OK_100",
"availability_status": "AVAILABLE"
},
"loaded": true
}
}
Response - Asset mimo plán (vyžaduje potvrzení):
{
"success": true,
"data": {
"requiresConfirmation": true,
"confirmationType": "asset_not_in_plan",
"message": "Asset není v nakládce. Opravdu naložit?",
"asset": {
"id": 1,
"scan_id": 12345,
"item_id": 5
},
"collision": {
"hasCollision": true,
"reasons": [
"Asset je plánovaný na jiné akci: Koncert Praha",
"Asset is not 100% functional"
],
"requiresOverride": true
}
}
}
Response - Global Kit kompletní:
{
"success": true,
"data": {
"requiresConfirmation": true,
"confirmationType": "global_kit_bulk",
"message": "Kit je kompletní. Naložit všechny položky?",
"kit": {
"id": 1,
"name": "ADJ spoty #1",
"scan_id": 67890
},
"completeness": {
"isComplete": true,
"missingAssets": [],
"missingItems": []
}
}
}
Response - Global Kit nekompletní:
{
"success": true,
"data": {
"requiresConfirmation": false,
"kitType": "global",
"message": "Kit je rozebraný. Naskenujte zbývající konkrétní kusy.",
"kit": {
"id": 1,
"name": "ADJ spoty #1"
},
"completeness": {
"isComplete": false,
"missingAssets": [
{
"asset_id": 5,
"scan_id": 12345,
"name": "ADJ Spot 1"
}
],
"missingItems": [
{
"item_id": 10,
"name": "XLR kabel",
"required": 5,
"available": 3
}
]
}
}
}
Response - Project Kit:
{
"success": true,
"data": {
"requiresConfirmation": false,
"kitType": "project",
"message": "Project kit detail",
"kit": {
"id": 1,
"name": "Kabelovka pro akci",
"scan_id": 11111
},
"lines": [
{
"id": 1,
"asset_id": 5,
"asset_scan_id": 12345,
"item_id": null,
"item_name": null,
"qty": null
},
{
"id": 2,
"asset_id": null,
"asset_scan_id": null,
"item_id": 10,
"item_name": "XLR kabel",
"qty": 5
}
],
"note": "Project kit nelze naložit hromadně. Naskenujte jednotlivé položky."
}
}
POST /load-sessions/:id/scan/confirm
Potvrdí scan assetu mimo plán nebo bulk loading global kitu.
Oprávnění: Loader, Producer, Admin
Request - Asset mimo plán:
{
"confirmType": "asset_not_in_plan",
"asset_id": 1,
"override_reason": "Nouzová situace - asset je potřeba na této akci"
}
Request - Global Kit bulk:
{
"confirmType": "global_kit_bulk",
"kit_id": 1
}
Response:
{
"success": true,
"data": {
"message": "Asset přidán do plánu a naložen",
"asset": {
"id": 1,
"scan_id": 12345
}
}
}
POST /load-sessions/:id/plan/add
Přidá položku do plánu nakládky.
Oprávnění: Loader, Producer, Admin
Podporuje 4 typy položek:
ASSET- konkrétní kusITEM_QTY- nekonkrétní položka s množstvímGLOBAL_KIT- globální kitPROJECT_KIT- akcový kit
Request:
{
"line_type": "ASSET",
"ref_id": 1,
"section": "Sekce A"
}
Response:
{
"success": true,
"data": {
"message": "Položka přidána do plánu",
"planLine": {
"id": 1,
"session_id": 1,
"line_type": "ASSET",
"ref_id": 1,
"qty": null,
"section": "Sekce A",
"created_at": 1704067200
}
}
}
POST /load-sessions/:id/plan/remove
Odebere položku z plánu nakládky.
Oprávnění: Loader, Producer, Admin
Request:
{
"plan_line_id": 1,
"unload": true
}
Response:
{
"success": true,
"data": {
"message": "Položka odebrána z plánu"
}
}
Poznámka: Pokud je položka už naložena a unload je false, endpoint vrátí requiresConfirmation: true s dotazem, zda označit k vyložení.
POST /load-sessions/:id/qty
Změní množství nekonkrétní položky v session.
Oprávnění: Loader, Producer, Admin
Request - Přidat množství:
{
"item_id": 10,
"operation": "add",
"qty": 5
}
Request - Odebrat množství:
{
"item_id": 10,
"operation": "remove",
"qty": 2
}
Request - Nastavit přesné množství:
{
"item_id": 10,
"operation": "set",
"qty": 10
}
Response:
{
"success": true,
"data": {
"message": "Množství přidáno",
"item_id": 10,
"qty_delta": 5
}
}
POST /load-sessions/:id/close
Uzavře load session.
Oprávnění: Producer, Admin
Request:
{
"reason": "Nakládka dokončena"
}
Response:
{
"success": true,
"data": {
"message": "Session uzavřena",
"closed_at": 1704067200
}
}
Business pravidla
Tok skenování assetu
-
Asset v plánu:
- Pokud není naložen →
SCAN_LOAD - Pokud už je naložen → info "už naloženo"
- Pokud není naložen →
-
Asset mimo plán:
- Potvrzení 1: "Není v nakládce. Opravdu naložit?"
- Pokud Ano → collision check
- Pokud kolize → potvrzení 2: "Je plánovaný jinde nebo není 100% OK. Přesto naložit?"
- Pokud Ano →
PLAN_ADD+SCAN_LOADsoverride_reason
Skenování globálního kitu
- Kompletní kit: Může být naložen hromadně (všechny assety + qty pro items)
- Nekompletní kit: Vrátí seznam chybějících položek, nelze naložit hromadně
Skenování projektového kitu
- Vždy pouze detail: Project kit nelze naložit hromadně
- Uživatel musí naskenovat jednotlivé položky
Detekce kolizí
Asset je v kolizi pokud:
- Je plánovaný na jinou akci v časovém překryvu
- Nemá funkčnost
OK_100
Kolize vždy vyvolá druhé potvrzení s možností override.
GET /load-sessions
Seznam load sessions s volitelným filtrem podle statusu. Používá se hlavně pro wallboard.
Oprávnění: Bearer token (vyžaduje autentizaci)
Query parametry:
status(volitelné): Filtr podle statusu (OPEN,CLOSED)page(volitelné): Číslo stránky (výchozí: 1)pageSize(volitelné): Počet položek na stránku (výchozí: 50)
Response:
{
"success": true,
"data": {
"sessions": [
{
"id": 1,
"project_id": 5,
"status": "OPEN",
"started_at": 1704067200,
"closed_at": null,
"project_name": "Summer Festival 2024",
"project_date_from": 1704067200,
"project_date_to": 1704153600
}
],
"pagination": {
"total": 10,
"page": 1,
"pageSize": 50,
"totalPages": 1
}
}
}
Kódy chyb
VALIDATION_ERROR- Neplatné parametryNOT_FOUND- Session, asset nebo kit nenalezenINVALID_STATE- Session není otevřenáALREADY_IN_PLAN- Položka už je v plánuKIT_INCOMPLETE- Kit není kompletníINTERNAL_ERROR- Vnitřní chyba serveru