122 lines
5.5 KiB
Python
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
|