shift-planner-app

Hlavni webova aplikace pro zadavani denniho stavu pallet a roll_cage.

Ports used

  • Host: 5004
  • Container: 5000

Run and Deploy

Pouzij operacni skripty:

  • start local (DEV): ../scripts/start-shift-planner-app.sh
  • stop local (DEV): ../scripts/stop-shift-planner-app.sh
  • deploy (PROD): ../scripts/deploy-shift-planner-app.sh

CME mock start/stop je ve skriptech:

  • ../scripts/start-cme-authentication-mock.sh
  • ../scripts/stop-cme-authentication-mock.sh

Prehled vsech skriptu je v scripts/README.md.

APP ENV konfigurace

  • PORT
  • DATA_DIR
  • WAREHOUSE_FILE
  • LOG_DIR
  • CME_URL
  • DEFAULT_USER_ID
  • DEFAULT_USER_NAME
  • DEFAULT_USER_EMAIL
  • SECRET_KEY
  • AUTH_REQUIRED
  • CME_AUTH_ENDPOINT (nastavuje se v conf/shift-planner-app.conf)
  • RP_CALLBACK_URL (nastavuje se v conf/shift-planner-app.conf)
  • SHARED_SECRET (base64, min 32 bytes po decode; nastavuje se v conf/shift-planner-app.conf)
  • CLOCK_SKEW_SECONDS (default 120)
  • NONCE_TTL_SECONDS (default 600)
  • PLANNED_HOURS_URL (default https://knihy.90.cz/skripty/sklad_frontend/matematiciAPI.php?naplanovane_hodiny)
  • PLANNED_HOURS_AUTH (username:password pro Basic auth na CME API; nastavuje se v conf/shift-planner-app.conf)
  • PLANNED_HOURS_METHOD (default POST)
  • PLANNED_HOURS_TIMEOUT_SECONDS (default 8)
  • CME_DB_CONFIG_FILE (default ${DATA_DIR}/cme-db.ini)
  • LOCK_SHIFT_SCRIPT_FILE (default ${DATA_DIR}/lock_shift.py v PROD compose; v DEV compose /app/jobs/nudge/lock_shift.py)
  • LOCK_SHIFT_URL (default https://knihy.90.cz/api/v2/lock_shift)
  • LOCK_SHIFT_AUTH (optional username:password pro Basic auth)
  • LOCK_SHIFT_X_API_KEY (X-API-KEY pro lock API)
  • LOCK_SHIFT_TIMEOUT_SECONDS (default 15)

Endpoints

  • GET / -> redirect na denni formular
  • GET /auth/login -> RP redirect na CME provider
  • GET /auth/callback -> validace id_res odpovedi + vytvoreni session
  • GET /entry/new -> prazdny formular
  • GET /entry/edit -> editace konkretniho dne/skladu
  • POST /records/save -> validace + ulozeni dat
  • GET /history -> historie dle skladu/mesice
  • GET /history/edit -> redirect do editace z historie
  • GET /shift-locking -> mesicni kalendar pro zamykani smen
  • GET /shift-occupancy -> mesicni pohled obsazenosti smen (Obsazeno z API + Ocekavano z CME DB)
  • POST /shift-locking/toggle -> okamzite prepnuti lokalniho stavu dne (defaultne povoleno, klik prepina povoleno/vypnuto)
  • POST /shift-occupancy/toggle-lock -> lock/unlock smen v CME pres lock_shift.py (pomoci planovac_den_id)
  • POST /shift-locking/save -> ulozeni stavu automatickeho zamykani smen (boolean)
  • GET /healthz -> healthcheck (200 {"status":"ok"} nebo 503 {"status":"unhealthy","reason":"..."})

Dulezite rozliseni zamykani

  • POST /shift-locking/toggle meni pouze lokalni nastaveni auto-lock (auto_shift_lock_enabled) v CSV.
  • POST /shift-occupancy/toggle-lock zamyka/odemyka realne smeny v CME pres planovac_den_id.
  • Auto-lock jobs (shift-planner-jobs) zamyka jen tehdy, kdyz je den over-capacity a auto_shift_lock_enabled=1.

Data and Logs

DEV defaults:

  • data: ../data
  • logs: ../target/logs

PROD defaults:

  • data: /home/agent/shift-planner/data
  • logs: /home/agent/shift-planner/logs
  • runtime conf mount: /home/agent/shift-planner/conf -> /app/conf
  • produkcni shift-planner-app.conf v /home/agent/shift-planner/conf je server-managed runtime konfigurace; deploy ji neprepisuje
  • planned hours auth: PLANNED_HOURS_AUTH v conf/shift-planner-app.conf

CSV soubory jsou UTF-8 a rotace logu je nastavena na 100 MB.

Log naming standard:

  • aktivni app log: /home/agent/shift-planner/logs/shift-planner-app.log
  • rotace po 100 MB na format <module_name>.0001.log, <module_name>.0002.log, ...

CME DB konfigurace pro Ocekavano

Ocekavano se cte z CME DB (expedice_prehled_plan, typ planu 3) pro vybrany sklad (CME_ID ve sp-warehouse.csv) a zobrazeny mesic.

Konfigurace je v INI souboru (default: ${DATA_DIR}/cme-db.ini), napr.:

[cme_db]
host = knihy.90.cz
port = 3306
user = change-me
password = change-me
database = knihy-cme
connect_timeout_seconds = 8
read_timeout_seconds = 8
write_timeout_seconds = 8

Referencni sablona je v cme-db.example.ini.

Deploy skript deploy-shift-planner-app.sh kopiruje shift-planner-jobs/jobs/nudge/lock_shift.py na server do ${REMOTE_DATA_DIR}/lock_shift.py, aby POST /shift-occupancy/toggle-lock mel script dostupny i v produkcnim kontejneru.

Tests

Smoke test hlavniho flow:

python3 -m unittest tests/test_shift_planner_smoke.py