Files
MABEA/backend/app/services/personal.py
T
patrickandClaude Sonnet 5 7dc6446a56
CI / backend-tests (push) Successful in 2m29s
CI / frontend-build (push) Successful in 28s
feat(personal): PERS-001/002 Person fachlich von Benutzer getrennt
Neue Tabelle person (Migration 0034, Backfill bestehender Benutzer 1:1
per Zeilennummer, keine Datenverluste). Benutzer.person_id optional -
Login kann bestehende Person verknüpfen oder legt automatisch eine neue
an (Rückwärtskompatibilität zum bisherigen Anlegen-Flow). /personen-CRUD
(admin-only), neue PersonSection.tsx im Personal-Tab, BenutzerSection
um Personen-Auswahl erweitert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 22:31:46 +02:00

67 lines
2.1 KiB
Python

from datetime import date
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.objekt import Objekt
from app.models.personal import (
BenutzerQualifikation,
ObjekttypQualifikationsanforderung,
Person,
Qualifikationstyp,
)
async def erstelle_person(db: AsyncSession, *, name: str, geburtsdatum, kontakt: str | None) -> Person:
person = Person(name=name, geburtsdatum=geburtsdatum, kontakt=kontakt)
db.add(person)
await db.flush()
return person
async def liste_personen(db: AsyncSession) -> list[Person]:
result = await db.execute(select(Person))
return list(result.scalars().all())
async def pruefe_berechtigung(db: AsyncSession, *, benutzer_id: int, objekt_id: int) -> list[Qualifikationstyp]:
"""Nutzer-Beispiel Personal-Modul: "wer darf dieses Fahrzeug fahren?".
Liefert die Qualifikationstypen, die der Objekttyp verlangt, aber der
Benutzer nicht (mehr) gültig nachgewiesen hat - leere Liste = berechtigt."""
objekt = await db.get(Objekt, objekt_id)
if objekt is None:
return []
erforderlich = (
(
await db.execute(
select(Qualifikationstyp)
.join(
ObjekttypQualifikationsanforderung,
ObjekttypQualifikationsanforderung.qualifikationstyp_id == Qualifikationstyp.id,
)
.where(ObjekttypQualifikationsanforderung.objekttyp_id == objekt.objekttyp_id)
)
)
.scalars()
.all()
)
if not erforderlich:
return []
heute = date.today()
gueltige_ids = set(
(
await db.execute(
select(BenutzerQualifikation.qualifikationstyp_id).where(
BenutzerQualifikation.benutzer_id == benutzer_id,
(BenutzerQualifikation.gueltig_bis.is_(None))
| (BenutzerQualifikation.gueltig_bis >= heute),
)
)
)
.scalars()
.all()
)
return [q for q in erforderlich if q.id not in gueltige_ids]