Files
Pivot/services/toestellen.py
2026-10-14 13:34:37 +02:00

122 lines
5.5 KiB
Python

"""
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