import enum from decimal import Decimal from sqlalchemy import ForeignKey, Integer, Numeric, String, UniqueConstraint from sqlalchemy.dialects.postgresql import ENUM as PgEnum from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base class VorlageStatus(str, enum.Enum): aktiv = "aktiv" veraltet = "veraltet" vorlage_status_pg = PgEnum(VorlageStatus, name="vorlage_status", create_type=False) class Beladungsvorlage(Base): """Prompt 08: Vorlage ist versioniert – Änderungen erzeugen eine neue Version statt die bestehende zu überschreiben (siehe app/services/vorlagen.py).""" __tablename__ = "beladungsvorlage" __table_args__ = (UniqueConstraint("objekttyp_id", "name", "version"),) id: Mapped[int] = mapped_column(primary_key=True) objekttyp_id: Mapped[int] = mapped_column(ForeignKey("objekttyp.id"), nullable=False) name: Mapped[str] = mapped_column(String, nullable=False) version: Mapped[int] = mapped_column(Integer, nullable=False) status: Mapped[VorlageStatus] = mapped_column( vorlage_status_pg, nullable=False, default=VorlageStatus.aktiv ) class Vorlagenposition(Base): __tablename__ = "vorlagenposition" __table_args__ = (UniqueConstraint("vorlage_id", "material_id"),) id: Mapped[int] = mapped_column(primary_key=True) vorlage_id: Mapped[int] = mapped_column(ForeignKey("beladungsvorlage.id"), nullable=False) material_id: Mapped[int] = mapped_column(ForeignKey("material.id"), nullable=False) fach: Mapped[str | None] = mapped_column(String) sollmenge: Mapped[Decimal] = mapped_column(Numeric, nullable=False)