""" Hulpfuncties rond toestellen (tabellen Toestellen, Signpost_DB, Opmerkingen, Eigendom). Het toestelnummer dat gebruikers intypen (vroeger 'KAMXM_nummer') is Toestellen.Schooleigen_ID. """ from datetime import datetime, date from database import execute_query, execute_insert # Laatste opmerking van een toestel (subquery, t = alias van Toestellen) LAATSTE_OPMERKING = ("(SELECT o.Opmerking FROM Opmerkingen o WHERE o.Toestel_ID = t.Toestel_ID " "ORDER BY o.Timestamp DESC, o.Opmerking_ID DESC LIMIT 1)") def zoek_toestel(nummer): """Toestel op toestelnummer (Schooleigen_ID) of, als dat niet bestaat, op serienummer.""" nummer = str(nummer or '').strip() if not nummer: return None rows = execute_query("SELECT * FROM Toestellen WHERE Schooleigen_ID = %s", (nummer,)) if not rows: rows = execute_query("SELECT * FROM Toestellen WHERE Serienummer = %s", (nummer,)) return rows[0] if rows else None def zoek_leerling(nummer): """Leerling op internnummer of Smartschool-nummer.""" rows = execute_query("SELECT * FROM Leerlingen WHERE Internnummer = %s OR SS_nummer = %s LIMIT 1", (str(nummer).strip(), str(nummer).strip())) return rows[0] if rows else None def laatste_opmerking(toestel_id): rows = execute_query("SELECT Opmerking FROM Opmerkingen WHERE Toestel_ID = %s " "ORDER BY Timestamp DESC, Opmerking_ID DESC LIMIT 1", (toestel_id,)) return rows[0]['Opmerking'] if rows else None def voeg_opmerking_toe(toestel_id, tekst, gebruiker=None): """Bewaart een opmerking als die verschilt van de laatste (zo blijft de geschiedenis bewaard).""" tekst = (tekst or '').strip() if tekst and tekst != (laatste_opmerking(toestel_id) or ''): execute_query("INSERT INTO Opmerkingen (Toestel_ID, Opmerking, Timestamp, Gebruiker) VALUES (%s, %s, NOW(), %s)", (toestel_id, tekst, gebruiker), commit=True) def lees_datum(waarde): """'2027-08-31', '31-08-2027' of '31/08/2027' → date. Leeg → None. Ongeldig → ValueError.""" if isinstance(waarde, date): return waarde w = (waarde or '').strip() if not w: return None for fmt in ('%Y-%m-%d', '%d-%m-%Y', '%d/%m/%Y', '%d.%m.%Y'): try: return datetime.strptime(w, fmt).date() except ValueError: pass raise ValueError(f"'{w}' is geen geldige datum (gebruik dd-mm-jjjj).") def bewaar_signpost(toestel_id, signpostnummer=None, garantie=None): """Maakt/werkt de Signpost-gegevens van een toestel bij (enkel ingevulde velden).""" signpostnummer = (signpostnummer or '').strip() or None garantie = lees_datum(garantie) if not signpostnummer and not garantie: return execute_query( "INSERT INTO Signpost_DB (Toestel_ID, Signpostnummer, Garantie) VALUES (%s, %s, %s) " "ON DUPLICATE KEY UPDATE Signpostnummer = COALESCE(VALUES(Signpostnummer), Signpostnummer), " "Garantie = COALESCE(VALUES(Garantie), Garantie)", (toestel_id, signpostnummer, garantie), commit=True) def nieuw_toestel(schooleigen_id=None, serienummer=None, type_toestel=None, status='Beschikbaar'): return execute_insert( "INSERT INTO Toestellen (Schooleigen_ID, Serienummer, Type, Status) VALUES (%s, %s, %s, %s)", ((schooleigen_id or None), (serienummer or None), (type_toestel or None), status)) def actieve_eigendom(toestel_id): """Huidige toekenning van een toestel (Datum_inlevering leeg) of None.""" rows = execute_query("SELECT * FROM Eigendom WHERE Toestel_ID = %s AND Datum_inlevering IS NULL " "ORDER BY Datum_toekenning DESC LIMIT 1", (toestel_id,)) return rows[0] if rows else None # --------------------------------------------------------------------------- # Geblokkeerd in Google (kolom Toestellen.Geblokkeerd) # --------------------------------------------------------------------------- def ensure_geblokkeerd(): """Voegt de kolom Toestellen.Geblokkeerd toe als die nog niet bestaat. Bij het toevoegen krijgen toestellen die bij een leerling geblokkeerd staan (Eigendom.Status = 1) meteen de waarde 1. Eén keer per school en proces.""" from tenancy import huidige_school school = huidige_school() if school.cache.get('kol_geblokkeerd'): return if not execute_query("SHOW COLUMNS FROM Toestellen LIKE 'Geblokkeerd'"): execute_query("ALTER TABLE Toestellen ADD COLUMN Geblokkeerd TINYINT(1) NOT NULL DEFAULT 0 AFTER Status", commit=True) execute_query("UPDATE Toestellen t JOIN Eigendom e ON e.Toestel_ID = t.Toestel_ID " "AND e.Datum_inlevering IS NULL AND e.Status = 1 SET t.Geblokkeerd = 1", commit=True) school.cache['kol_geblokkeerd'] = True def zet_geblokkeerd(toestel_id, geblokkeerd): """Bewaart de blokkeerstatus van een toestel, ook bij de huidige eigenaar (Eigendom.Status).""" ensure_geblokkeerd() w = 1 if geblokkeerd else 0 execute_query("UPDATE Toestellen SET Geblokkeerd = %s WHERE Toestel_ID = %s", (w, toestel_id), commit=True) execute_query("UPDATE Eigendom SET Status = %s WHERE Toestel_ID = %s AND Datum_inlevering IS NULL", (w, toestel_id), commit=True) def is_geblokkeerd(toestel_id): try: ensure_geblokkeerd() rows = execute_query("SELECT Geblokkeerd FROM Toestellen WHERE Toestel_ID = %s", (toestel_id,)) return bool(rows and int(rows[0]['Geblokkeerd'] or 0)) except Exception: return False