Files
Pivot/services/aanwezigheid_service.py
T
2026-10-14 12:29:29 +02:00

70 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Internaat › Aanwezigheden: per intern, per dag een ochtend- en een avondcontrole (aanwezig / afwezig / nog niet
gecontroleerd). De internen komen uit Informat (Internaat-API); de registraties staan in de schooldatabase
(tabel internaat_aanwezigheid) en zijn dus gedeeld met alle opvoeders.
"""
from datetime import date, timedelta
from database import execute_query
MOMENTEN = ('ochtend', 'avond')
STATUSSEN = ('aanwezig', 'afwezig') # 'leeg' = geen rij
DAGEN = ['Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za', 'Zo']
DAGEN_VOLUIT = ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag']
def ensure_table():
execute_query("""
CREATE TABLE IF NOT EXISTS internaat_aanwezigheid (
Datum DATE NOT NULL,
Persoon_ID VARCHAR(64) NOT NULL,
Moment VARCHAR(10) NOT NULL,
Status VARCHAR(10) NOT NULL,
Naam VARCHAR(200) NULL,
Bijgewerkt DATETIME NOT NULL,
Door VARCHAR(255) NULL,
PRIMARY KEY (Datum, Persoon_ID, Moment),
KEY idx_aanw_persoon (Persoon_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci""", commit=True)
def maandag_van(d):
return d - timedelta(days=d.weekday())
def schooljaar_van(d):
start = d.year if d.month >= 9 else d.year - 1
return f"{start}-{str(start + 1)[-2:]}"
def week(maandag):
"""{'<persoon>:<dagindex>:<moment>': status} voor de week vanaf `maandag`."""
ensure_table()
rijen = execute_query("SELECT Datum, Persoon_ID, Moment, Status FROM internaat_aanwezigheid "
"WHERE Datum BETWEEN %s AND %s", (maandag, maandag + timedelta(days=6))) or []
return {f"{r['Persoon_ID']}:{(r['Datum'] - maandag).days}:{r['Moment']}": r['Status'] for r in rijen}
def zet(datum, persoon_id, moment, status, naam=None, door=None):
"""Bewaart één controle. status 'leeg' wist de registratie."""
if moment not in MOMENTEN:
raise ValueError("Onbekend moment.")
ensure_table()
if status == 'leeg':
execute_query("DELETE FROM internaat_aanwezigheid WHERE Datum = %s AND Persoon_ID = %s AND Moment = %s",
(datum, persoon_id, moment), commit=True)
return
if status not in STATUSSEN:
raise ValueError("Onbekende status.")
execute_query("INSERT INTO internaat_aanwezigheid (Datum, Persoon_ID, Moment, Status, Naam, Bijgewerkt, Door) "
"VALUES (%s, %s, %s, %s, %s, NOW(), %s) ON DUPLICATE KEY UPDATE Status = VALUES(Status), "
"Naam = VALUES(Naam), Bijgewerkt = NOW(), Door = VALUES(Door)",
(datum, persoon_id, moment, status, (naam or '')[:200] or None, door), commit=True)
def groep_van(r, meerdere_internaten=False):
"""Groep in het register: het blok van de kamer, anders de vestiging (met het internaat ervoor als er meerdere zijn)."""
blok = (r.get('kamer') or '').split(' verd.')[0].split(' nr.')[0]
groep = blok.replace('blok', 'Blok') if blok.startswith('blok') else (r.get('vestiging') or 'Zonder kamer')
return f"{r['internaat']} · {groep}" if meerdere_internaten else groep