"""EquipmentGroup (Bundle) model for grouping equipment items.""" import uuid from datetime import datetime from sqlalchemy import String, DateTime, ForeignKey, func, Float, Text, Table, Column from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.base import Base # Many-to-many association table: equipment_groups ↔ equipment equipment_group_items = Table( "equipment_group_items", Base.metadata, Column( "group_id", String(36), ForeignKey("equipment_groups.id", ondelete="CASCADE"), primary_key=True, ), Column( "equipment_id", String(36), ForeignKey("equipment.id", ondelete="CASCADE"), primary_key=True, ), Column( "quantity", Float, nullable=False, default=1.0, ), ) class EquipmentGroup(Base): """Represents a bundle/group of equipment items.""" __tablename__ = "equipment_groups" id: Mapped[str] = mapped_column( String(36), primary_key=True, default=lambda: str(uuid.uuid4()) ) account_id: Mapped[str] = mapped_column( String(36), ForeignKey("accounts.id", ondelete="CASCADE"), nullable=False ) name: Mapped[str] = mapped_column(String(255), nullable=False) description: Mapped[str | None] = mapped_column(Text, nullable=True) daily_rate: Mapped[float | None] = mapped_column(Float, nullable=True) default_location_id: Mapped[str | None] = mapped_column( String(36), ForeignKey("stock_locations.id", ondelete="SET NULL"), nullable=True ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), nullable=False ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, ) # Relationships account: Mapped["Account"] = relationship( "Account", back_populates="equipment_groups" ) default_location: Mapped["StockLocation"] = relationship( "StockLocation", back_populates="equipment_groups" ) items: Mapped[list["Equipment"]] = relationship( "Equipment", secondary=equipment_group_items, backref="groups" ) def __repr__(self) -> str: return f""