import enum from sqlalchemy import Boolean, ForeignKey, String, Text from sqlalchemy.dialects.postgresql import ENUM as PgEnum from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base class MaterialTyp(str, enum.Enum): standard = "standard" ablauf_charge = "ablauf_charge" geraet_sn = "geraet_sn" materialtyp_pg = PgEnum(MaterialTyp, name="materialtyp", create_type=False) class Bereich(Base): __tablename__ = "bereich" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String, unique=True, nullable=False) beschreibung: Mapped[str | None] = mapped_column(Text) class Kategorie(Base): __tablename__ = "kategorie" id: Mapped[int] = mapped_column(primary_key=True) bereich_id: Mapped[int] = mapped_column(ForeignKey("bereich.id"), nullable=False) name: Mapped[str] = mapped_column(String, nullable=False) ueberkategorie_id: Mapped[int | None] = mapped_column(ForeignKey("kategorie.id")) class Standort(Base): __tablename__ = "standort" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String, unique=True, nullable=False) adresse: Mapped[str | None] = mapped_column(Text) class Objekttyp(Base): __tablename__ = "objekttyp" id: Mapped[int] = mapped_column(primary_key=True) bereich_id: Mapped[int] = mapped_column(ForeignKey("bereich.id"), nullable=False) kategorie_id: Mapped[int | None] = mapped_column(ForeignKey("kategorie.id")) name: Mapped[str] = mapped_column(String, nullable=False) # Karte 11 Nachtrag: nur Objekte dieses Typs dürfen als Fahrzeug (Objekt. # fahrzeug_id) zugeordnet werden - grenzt die Fahrzeug-Dropdowns serverseitig # ein, ohne einen eigenen Fahrzeug-Objekttyp fachlich zu erzwingen. ist_zugfahrzeug: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) class Fach(Base): """Nutzer-Vorgabe: feste Fächer-Liste je Objekttyp, damit beim Anlegen einer Vorlagenposition nicht jedes Mal Freitext getippt werden muss. `sortierung` steuert die Anzeigereihenfolge (z. B. von oben nach unten im Rucksack).""" __tablename__ = "fach" 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) sortierung: Mapped[int] = mapped_column(default=0) class Material(Base): __tablename__ = "material" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String, nullable=False) artikelnummer: Mapped[str | None] = mapped_column(String) einheit: Mapped[str] = mapped_column(String, nullable=False) materialtyp: Mapped[MaterialTyp] = mapped_column(materialtyp_pg, nullable=False) kategorie_id: Mapped[int | None] = mapped_column(ForeignKey("kategorie.id")) hersteller: Mapped[str | None] = mapped_column(String) beschreibung: Mapped[str | None] = mapped_column(Text) code: Mapped[str | None] = mapped_column(String, unique=True) warnzeitraum_tage: Mapped[int | None] = mapped_column() aktiv: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)