""" 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): """{'::': 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