from __future__ import annotations from datetime import UTC, datetime from uuid import uuid4 from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, String, Text, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base class ZootechComponent(Base): __tablename__ = "zootech_component" __table_args__ = (UniqueConstraint("enterprise_id", "id", name="uq_zootech_component_ent_id"),) enterprise_id: Mapped[str] = mapped_column(String(36), nullable=False, index=True) id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) name: Mapped[str] = mapped_column(String(100), nullable=False) type: Mapped[str] = mapped_column(String(100), nullable=False, default="") is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) dry_matter: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) protein: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) energy: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) price: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) external_no: Mapped[int | None] = mapped_column(Integer, nullable=True) version: Mapped[int] = mapped_column(Integer, nullable=False, default=1) content_hash: Mapped[str] = mapped_column(String(64), nullable=False, default="") is_deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(UTC) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(UTC), onupdate=lambda: datetime.now(UTC), ) class ZootechRecipe(Base): __tablename__ = "zootech_recipe" __table_args__ = (UniqueConstraint("enterprise_id", "id", name="uq_zootech_recipe_ent_id"),) enterprise_id: Mapped[str] = mapped_column(String(36), nullable=False, index=True) id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) name: Mapped[str] = mapped_column(String(100), nullable=False) heads_per_trip: Mapped[int] = mapped_column(Integer, nullable=False, default=1) mixing_time: Mapped[int] = mapped_column(Integer, nullable=False, default=0) trip_percent: Mapped[float] = mapped_column(Float, nullable=False, default=100.0) dry_matter_locked: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) unloading_link_broken: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) target_component_id: Mapped[str | None] = mapped_column(String(36), nullable=True) ration_type: Mapped[str | None] = mapped_column(String(10), nullable=True) version: Mapped[int] = mapped_column(Integer, nullable=False, default=1) content_hash: Mapped[str] = mapped_column(String(64), nullable=False, default="") is_deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) payload_json: Mapped[str | None] = mapped_column(Text, nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(UTC) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(UTC), onupdate=lambda: datetime.now(UTC), ) class ZootechIngredient(Base): __tablename__ = "zootech_ingredient" __table_args__ = (UniqueConstraint("enterprise_id", "id", name="uq_zootech_ingredient_ent_id"),) enterprise_id: Mapped[str] = mapped_column(String(36), nullable=False, index=True) id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) recipe_id: Mapped[str] = mapped_column(String(36), nullable=False, index=True) component_id: Mapped[str | None] = mapped_column(String(36), nullable=True, index=True) name: Mapped[str] = mapped_column(String(100), nullable=False) amount: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) weight_per_head: Mapped[float | None] = mapped_column(Float, nullable=True) dry_matter: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) dry_matter_per_head: Mapped[float | None] = mapped_column(Float, nullable=True) order: Mapped[int] = mapped_column(Integer, nullable=False, default=0) version: Mapped[int] = mapped_column(Integer, nullable=False, default=1) content_hash: Mapped[str] = mapped_column(String(64), nullable=False, default="") is_deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(UTC) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(UTC), onupdate=lambda: datetime.now(UTC), )