API-referencia
Base URL https://api.operex.eu · szerződés-verzió v1. A kulcsot így küldd: Authorization: Bearer <key>.
A mező-, enum- és jel-nevek a SZERZŐDÉS részei, minden nyelven angolul maradnak; csak a próza fordul. A sémák a szállított motort követik (apps/shift-engine).
⬇ OpenAPI spec (JSON)OpenAPI specifikáció ↓
Végpontok
| POST | /v1/schedule:build | Egy hónap beosztásának felépítése; opcionális megfelelőség-kiértékelés |
| POST | /v1/schedule:build-range | Beosztás tetszőleges dátumtartományra; opcionális megfelelőség-kiértékelés |
| GET | /v1/version | Motor- + szabály-verziók (rögzítsd a reprodukálhatósághoz) |
| GET | /v1/patterns | Az elérhető műszak-minták listája |
| GET | /v1/holidays?year= | Egy év alap ünnepnapjai (szerkeszthető alapadat) |
| GET | /v1/rules | Az alap megfelelőségi szabályok, szerkeszthető küszöbökkel |
| GET | /health | Élet-ellenőrzés |
Hitelesítés
Minden kérés egy API-kulcsot visz bearer-tokenként: Authorization: Bearer <key>. A kulcsok fiókonkéntiek és rotálhatók. A GET /health nem igényel kulcsot.
POST /v1/schedule:build
Egy telephely egy hónapját építi fel, és ha az evaluate igaz, lefuttatja a megfelelőség-kiértékelőt.
POST /v1/schedule:build
Authorization: Bearer sk_…
Content-Type: application/json
{
"site": {
"site_id": "plant-01",
"shift_pattern_key": "12h-2-2-4",
"anchor": "2022-08-09",
"n_crews": 4,
"dayworker_anchor": "2022-08-08",
"min_headcount": { "safety_total": 8 },
"employees": [
{ "staff_id": "1000001", "name": "…", "role": "Operator", "kind": "shift", "crew": 0 },
{ "staff_id": "9000001", "name": "…", "role": "Engineer", "kind": "dayworker" }
]
},
"year": 2025,
"month": 12,
"evaluate": true
}Kérés — felső szint
| site | Site | A telephely-konfiguráció (lentebb). |
| year | int | Cél-év (1900–2200). |
| month | int | Cél-hónap (1–12). |
| evaluate | bool | A megfelelőség-kiértékelő futtatása (alap: true). |
| holidays | date[]? | A tényleges ünnepnap-naptár (szerkesztett alapadat). Elhagyva a motor számolja; [] = nincs ünnep. |
| rule_overrides | object? | Szabályonkénti küszöb/be-ki felülírás: rule_id → { param: érték, "enabled": 0|1 }. Ismeretlen id kihagyva. |
| assignments | object? | Cella-szintű kézi terv-felülírás: staff_id → { "ÉÉÉÉ-HH-NN": jel }. Az adott személy adott napi jelét cseréli; a lefedettség és a compliance a szerkesztett tervre számol. Ismeretlen staff_id / tartományon kívüli nap kihagyva. |
Site
| site_id | string | A telephely stabil azonosítója. |
| name | string? | Ember-olvasható telephely-név. |
| shift_pattern_key | string | A műszakok mintája, a GET /v1/patterns-ből (pl. "12h-2-2-4"). |
| anchor | date | Fix bázisnap (Alapnap), ami fázisba állítja a rotációt. ISO ÉÉÉÉ-HH-NN. |
| n_crews | int | Műszakok száma (1–12). A minta ciklushosszának oszthatónak kell lennie ezzel. |
| dayworker_pattern_key | string? | A nappalosok mintája (alap: "nappalos"). |
| dayworker_anchor | date | A heti nappalos-minta bázisnapja (hétfő igazítja a hétvégéket). |
| employees | Employee[] | A névsor (lentebb). |
| min_headcount | MinHeadcount? | Üzembiztonsági minimumok (lentebb). |
| timezone | string? | Az IANA időzóna, amihez az óraidők horgonyoznak (alap: "Europe/Budapest"). A DST-helyes munkaórákat vezérli. |
Employee
| staff_id | string | Személyenként egyedi; a válasz sorait kulcsolja. |
| name | string | Megjelenített név. |
| role | string? | Beosztás (pl. Kezelő, Műszakvezető). |
| kind | enum | Egy ezek közül: shift, dayworker, standby_crew, standby_day, lean. |
| crew | int? | shift és standby_crew esetén kötelező — a 0-alapú műszak-index. |
| lean_pattern_key | string? | lean esetén kötelező — a LEAN minta kulcsa. |
MinHeadcount
| safety_total | int | Minimum létszám staffolt műszakonként (Biztonsági / BLTSZ). 0 kikapcsolja. |
| per_role | object | Opcionális beosztás → minimum-per-műszak leképzés. |
Válasz
{
"engine_version": "0.6.2",
"schedule": {
"site_id": "plant-01", "year": 2025, "month": 12,
"days": [ "2025-12-01", … ],
"rows": { "1000001": [ "É","É","-","-", … ], "9000001": [ "N","N", …, "Üp","Üp" ] },
"coverage": [ { "day": "2025-12-01", "morning": 1, "afternoon": 0, "night": 1, "dayworker": 1, "understaffed": [] }, … ],
"statistics": { "1000001": { "worked_hours": 192, "night_count": 8, "shift_count": 16, "vacation_days": 0, "flex_days": 0, "holiday_rest_days": 0, "expected_hours": 176, "balance": 16 }, … }
},
"compliance": {
"rulebook_version": "2026-09-03-draft",
"violations": [],
"notes": [ "This report signals and justifies; it does not guarantee compliance. …" ],
"any_needs_review": false
}
}Felső szint: engine_version, schedule, és compliance (null, ha az evaluate false).
schedule
| site_id | string | A kérésből visszaadva. |
| year | int | Visszaadva. |
| month | int | Visszaadva (1–12). |
| days | date[] | A hónap minden naptári napja, sorrendben. |
| rows | object | staff_id → jelek tömbje, a days-szel igazítva. |
| coverage | DayCoverage[] | Napi dolgozó-létszám műszakonként (lentebb). |
| statistics | object | staff_id → PersonStats havi összesítő (lentebb). |
coverage[]
| day | date | A naptári nap. |
| morning | int | Reggeli/nappali műszakon (r + R). |
| afternoon | int | Délutáni műszakon (d). |
| night | int | Éjszakai műszakon (é + É). |
| dayworker | int | Nappalos mintán (N). |
| understaffed | string[] | A safety_total alatti műszak-kategóriák, ha vannak. |
statistics (PersonStats)
| worked_hours | int | Motor-hiteles ledolgozott óra a Jelek belső óráiból. |
| night_count | int | Éjszakai műszakok száma (é + É). |
| shift_count | int | Ledolgozott műszakok száma (a készenlét nélkül). |
| vacation_days | int | Szabadságnapok (Sz). |
| flex_days | int | Csúszó (munkaidőkeret) napok (CS). |
| holiday_rest_days | int | Ünnepi pihenő napok (Üp). |
| expected_hours | int | A hó elvárt órája (általános munkanapok × weekly_hours / 5). |
| balance | int | Munkaidőkeret-egyenleg a hóra (ledolgozott − elvárt). |
POST /v1/schedule:build-range
Ugyanaz, mint a POST /v1/schedule:build, de egy hónap helyett tetszőleges, inkluzív dátumtartományra — egy hívás egy két hétre, egy negyedévre vagy egy egész évre. A rotáció, az ünnepnapok, a rule_overrides és a cellánkénti assignments azonosan viselkedik; a megfelelőség gördülő ablakai a TELJES tartományon futnak, a statistics pedig a tartományra összesít. A schedule egy RangeSchedule: ugyanaz az alak, mint a schedule, de year/month helyett start és end horgonyozza.
Kérés — felső szint
| site | Site | A telephely-konfiguráció (mint a build-nél). |
| start | date | A tartomány első napja, inkluzív (ISO ÉÉÉÉ-HH-NN). |
| end | date | Az utolsó nap, inkluzív. Legfeljebb 366 nappal a start után (fölötte 422). |
| evaluate | bool | A megfelelőség-kiértékelő futtatása (alap: true). |
| holidays | date[]? | Tényleges ünnepnaptár; kihagyva a motor a tartomány által érintett minden évre kiszámolja. |
| rule_overrides | object? | Mint a build-nél (rule_id → { param: érték, "enabled": 0|1 }). |
| assignments | object? | Mint a build-nél; a per-fő napi korlát a teljes tartományra tágul (≤ 366 nap). |
Műszakjelek
A rows minden cellája egy jel:
| r / d / é | 8h reggel / délután / éjszaka |
| R / É | 12h nappal / éjszaka |
| N | nappalos |
| - | pihenő / szabadnap |
| Sz | éves szabadság |
| CS | csúszó (munkaidőkeret-nap) |
| Üp | fizetett ünnepi pihenő |
| B | beugrós / készenlét |
Dolgozó-típusok
| shift | A műszaka rotáció-mintáját futtatja. |
| dayworker | Heti nappalos-minta (N), hétvégén pihenő. |
| standby_crew | A műszak-mintából származó készenlét (éjszaka → nappali változat). |
| standby_day | A nappalos-mintából származó készenlét. |
| lean | Egy nevesített LEAN készenléti minta. |
Megfelelőségi jelentés
Ha az evaluate igaz, a compliance tartalmazza a jelzéseket. Jelez és indokol; nem garantál megfelelőséget. Minden sértés citálja a paragrafusát; a piszkozat-szabály jelzései needs_review: true értékkel jönnek. Ellenőrzött szabályok: napi pihenő, napi és heti max óra, éjszakai korlát, heti pihenőnap.
violation
| staff_id | string | Az érintett személy. |
| rule_id | string | A megszólalt szabály (pl. "daily-rest-11h"). |
| rule_type | enum | daily_rest | max_daily_hours | max_weekly_hours | night_work | weekly_rest. |
| day | date | A nap, amihez a jelzés horgonyzik. |
| measured | number | A mért érték (óra vagy nap). |
| limit | number | A szabály küszöbe. |
| statute_section | string | A citált paragrafus (pl. "104. § (1)"). |
| message | string | A magyar nyelvű üzenet. |
| severity | string | pl. "warning". |
| needs_review | bool | Igaz, amíg a küszöb jogi megerősítésre vár. |
GET /v1/patterns
Az elérhető műszak-mintákat listázza: key, name, hours, cycle_length. Egy key-t shift_pattern_key-ként vagy dayworker_pattern_key-ként használj.
GET /v1/holidays?year=
Egy év alap ünnepnapjait adja vissza (fix dátumok + húsvéthoz kötött mozgó ünnepek). Ez a szerkesztő alapadata: írd felül (átnevezés, hozzáadás, törlés), és a tényleges halmazt a build kérés holidays mezőjében küldd vissza. A motor csak az alaphalmazt számolja; szerkesztést nem tárol.
| day | date | Az ünnepnap dátuma (ISO ÉÉÉÉ-HH-NN). |
| name | string | Magyar ünnepnév (pl. "Karácsony", "Húsvéthétfő"). |
GET /v1/rules
Az alap megfelelőségi szabályokat adja vissza a szerkeszthető küszöbökkel. Ez a jogi-megfelelőségi szerkesztő alapadata: állítsd a számszerű küszöböket (min. pihenőóra, max. óra…) és a be-ki kapcsolót, majd a különbségeket a build kérés rule_overrides mezőjében küldd vissza. Hogy MELY szabályok léteznek és a paragrafus-hivatkozásaik: motor-tulajdon, nem szerkeszthető.
| id | string | A szabály azonosítója (pl. "daily-rest-11h") — a rule_overrides kulcsa. |
| rule_type | enum | daily_rest | max_daily_hours | max_weekly_hours | night_work | weekly_rest | work_time_frame. |
| enabled | bool | Aktív-e a szabály. |
| params | object | A szerkeszthető számszerű küszöbök (pl. { min_rest_hours: 11 }). |
| statute_section | string | A citált paragrafus (motor-tulajdon). |
| message_hu | string | A magyar üzenet-sablon. |
| severity | string | pl. "warning". |
| needs_review | bool | Igaz, amíg a küszöb jogi megerősítésre vár. |
GET /v1/version
A motor- és szabály-verziókat adja vissza. Rögzítsd őket egy beosztás reprodukálásához.
{
"engine_version": "0.6.2",
"pattern_library_version": "2026-08-28",
"rulebook_version": "2026-09-03-draft",
"shift_times_version": "2026-08-28"
}Determinizmus, időzónák és verziózás
Ugyanaz a kérés + ugyanaz az engine_version és rulebook_version mindig ugyanazt a beosztást adja. A rotáció a dátum tiszta függvénye a telephely anchor-jához képest; nincs rejtett állapot, nincs véletlen. A munkaórák időzóna-tudatosak (a telephely IANA-zónája, alapból Europe/Budapest): egy óraátállításon átnyúló éjszakai műszak a valós 11 órának (tavasz) vagy 13 órának (ősz) mérődik, és az őszi 13 órás éjszaka megszólaltatja a napi-óra szabályt. A szabály-adat (minták, óraidők, ünnepnapok, munkajogi szabálykönyv) verziózott és kérésenként felülírható, így egy beosztás később reprodukálható és auditálható.
Hibák
| 422 | Unprocessable Entity | Érvénytelen kérés: ismeretlen minta-kulcs, a ciklushossz nem osztható n_crews-zel, a crew-index a 0..n_crews-1 tartományon kívül, duplikált staff_id, nem támogatott kind (lean), nem-véges rule_overrides érték (NaN/Infinity), vagy ismeretlen időzóna. |
| 404 | Not Found | Ismeretlen útvonal. |
| 500 | Internal Server Error | Váratlan motor-hiba. |
OpenAPI specifikáció
A teljes gépi szerződés a /engine/shift-scheduling/openapi.json-on (OpenAPI 3.1). A hosztolt motor a /openapi.json-on is kiszolgálja, interaktív dokumentációval a /docs-on.