← OPEREX Műszakütemező motor

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:buildEgy hónap beosztásának felépítése; opcionális megfelelőség-kiértékelés
POST/v1/schedule:build-rangeBeosztás tetszőleges dátumtartományra; opcionális megfelelőség-kiértékelés
GET/v1/versionMotor- + szabály-verziók (rögzítsd a reprodukálhatósághoz)
GET/v1/patternsAz elérhető műszak-minták listája
GET/v1/holidays?year=Egy év alap ünnepnapjai (szerkeszthető alapadat)
GET/v1/rulesAz 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

siteSiteA telephely-konfiguráció (lentebb).
yearintCél-év (1900–2200).
monthintCél-hónap (1–12).
evaluateboolA megfelelőség-kiértékelő futtatása (alap: true).
holidaysdate[]?A tényleges ünnepnap-naptár (szerkesztett alapadat). Elhagyva a motor számolja; [] = nincs ünnep.
rule_overridesobject?Szabályonkénti küszöb/be-ki felülírás: rule_id → { param: érték, "enabled": 0|1 }. Ismeretlen id kihagyva.
assignmentsobject?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_idstringA telephely stabil azonosítója.
namestring?Ember-olvasható telephely-név.
shift_pattern_keystringA műszakok mintája, a GET /v1/patterns-ből (pl. "12h-2-2-4").
anchordateFix bázisnap (Alapnap), ami fázisba állítja a rotációt. ISO ÉÉÉÉ-HH-NN.
n_crewsintMűszakok száma (1–12). A minta ciklushosszának oszthatónak kell lennie ezzel.
dayworker_pattern_keystring?A nappalosok mintája (alap: "nappalos").
dayworker_anchordateA heti nappalos-minta bázisnapja (hétfő igazítja a hétvégéket).
employeesEmployee[]A névsor (lentebb).
min_headcountMinHeadcount?Üzembiztonsági minimumok (lentebb).
timezonestring?Az IANA időzóna, amihez az óraidők horgonyoznak (alap: "Europe/Budapest"). A DST-helyes munkaórákat vezérli.

Employee

staff_idstringSzemélyenként egyedi; a válasz sorait kulcsolja.
namestringMegjelenített név.
rolestring?Beosztás (pl. Kezelő, Műszakvezető).
kindenumEgy ezek közül: shift, dayworker, standby_crew, standby_day, lean.
crewint?shift és standby_crew esetén kötelező — a 0-alapú műszak-index.
lean_pattern_keystring?lean esetén kötelező — a LEAN minta kulcsa.

MinHeadcount

safety_totalintMinimum létszám staffolt műszakonként (Biztonsági / BLTSZ). 0 kikapcsolja.
per_roleobjectOpcioná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_idstringA kérésből visszaadva.
yearintVisszaadva.
monthintVisszaadva (1–12).
daysdate[]A hónap minden naptári napja, sorrendben.
rowsobjectstaff_id → jelek tömbje, a days-szel igazítva.
coverageDayCoverage[]Napi dolgozó-létszám műszakonként (lentebb).
statisticsobjectstaff_id → PersonStats havi összesítő (lentebb).

coverage[]

daydateA naptári nap.
morningintReggeli/nappali műszakon (r + R).
afternoonintDélutáni műszakon (d).
nightintÉjszakai műszakon (é + É).
dayworkerintNappalos mintán (N).
understaffedstring[]A safety_total alatti műszak-kategóriák, ha vannak.

statistics (PersonStats)

worked_hoursintMotor-hiteles ledolgozott óra a Jelek belső óráiból.
night_countintÉjszakai műszakok száma (é + É).
shift_countintLedolgozott műszakok száma (a készenlét nélkül).
vacation_daysintSzabadságnapok (Sz).
flex_daysintCsúszó (munkaidőkeret) napok (CS).
holiday_rest_daysintÜnnepi pihenő napok (Üp).
expected_hoursintA hó elvárt órája (általános munkanapok × weekly_hours / 5).
balanceintMunkaidő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

siteSiteA telephely-konfiguráció (mint a build-nél).
startdateA tartomány első napja, inkluzív (ISO ÉÉÉÉ-HH-NN).
enddateAz utolsó nap, inkluzív. Legfeljebb 366 nappal a start után (fölötte 422).
evaluateboolA megfelelőség-kiértékelő futtatása (alap: true).
holidaysdate[]?Tényleges ünnepnaptár; kihagyva a motor a tartomány által érintett minden évre kiszámolja.
rule_overridesobject?Mint a build-nél (rule_id → { param: érték, "enabled": 0|1 }).
assignmentsobject?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
Nnappalos
-pihenő / szabadnap
Széves szabadság
CScsúszó (munkaidőkeret-nap)
Üpfizetett ünnepi pihenő
Bbeugrós / készenlét

Dolgozó-típusok

shiftA műszaka rotáció-mintáját futtatja.
dayworkerHeti nappalos-minta (N), hétvégén pihenő.
standby_crewA műszak-mintából származó készenlét (éjszaka → nappali változat).
standby_dayA nappalos-mintából származó készenlét.
leanEgy 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_idstringAz érintett személy.
rule_idstringA megszólalt szabály (pl. "daily-rest-11h").
rule_typeenumdaily_rest | max_daily_hours | max_weekly_hours | night_work | weekly_rest.
daydateA nap, amihez a jelzés horgonyzik.
measurednumberA mért érték (óra vagy nap).
limitnumberA szabály küszöbe.
statute_sectionstringA citált paragrafus (pl. "104. § (1)").
messagestringA magyar nyelvű üzenet.
severitystringpl. "warning".
needs_reviewboolIgaz, 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.

daydateAz ünnepnap dátuma (ISO ÉÉÉÉ-HH-NN).
namestringMagyar ü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ő.

idstringA szabály azonosítója (pl. "daily-rest-11h") — a rule_overrides kulcsa.
rule_typeenumdaily_rest | max_daily_hours | max_weekly_hours | night_work | weekly_rest | work_time_frame.
enabledboolAktív-e a szabály.
paramsobjectA szerkeszthető számszerű küszöbök (pl. { min_rest_hours: 11 }).
statute_sectionstringA citált paragrafus (motor-tulajdon).
message_hustringA magyar üzenet-sablon.
severitystringpl. "warning".
needs_reviewboolIgaz, 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

422Unprocessable 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.
404Not FoundIsmeretlen útvonal.
500Internal Server ErrorVá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.

Hírlevél

Kövesd az OPEREX fejlődését

Új modulok, ipari műszaknapló-tippek és ISO 45001-es gyakorlatok — havonta legfeljebb egyszer, spam nélkül.

Bármikor leiratkozhatsz — minden levél alján ott a link.