import enum import uuid from datetime import datetime from sqlalchemy import ForeignKey, String from sqlalchemy.dialects.postgresql import ENUM as PgEnum, TIMESTAMP, UUID from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base class MindermengeStatus(str, enum.Enum): aktiv = "aktiv" abgelaufen = "abgelaufen" beendet_durch_erledigung = "beendet_durch_erledigung" mindermenge_status_pg = PgEnum(MindermengeStatus, name="mindermenge_status", create_type=False) class MindermengenGenehmigung(Base): """Prompt 04: reine fachliche Bewertung, ändert NIEMALS Ist-Menge/Fehlmenge/ Fehlbestand-Status (Leitplanke, U2). Gilt automatisch nur bis zur nächsten Kontrolle desselben Objekts (Karte 08, U6) oder bis der Fehlbestand durch Nachfüllung erledigt wird (U7) - beides ohne separaten Zeit-Trigger.""" __tablename__ = "mindermengen_genehmigung" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) fehlbestand_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey("fehlbestand.id"), nullable=False ) genehmigt_von: Mapped[int] = mapped_column(ForeignKey("benutzer.id"), nullable=False) begruendung: Mapped[str] = mapped_column(String, nullable=False) genehmigt_am: Mapped[datetime] = mapped_column(TIMESTAMP(timezone=True), nullable=False) ausloesende_kontrolle_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey("kontrolle.id"), nullable=False ) status: Mapped[MindermengeStatus] = mapped_column( mindermenge_status_pg, nullable=False, default=MindermengeStatus.aktiv ) beendet_am: Mapped[datetime | None] = mapped_column(TIMESTAMP(timezone=True)) beendende_kontrolle_id: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), ForeignKey("kontrolle.id") )