diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 954b146..6c2657f 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -10,3 +10,4 @@ from app.models.astuce import Astuce # noqa from app.models.recolte import Recolte, Observation # noqa from app.models.meteo import MeteoStation, MeteoOpenMeteo # noqa from app.models.saint import SaintDuJour # noqa +from app.models.intrant import AchatIntrant, Fabrication # noqa diff --git a/backend/app/models/intrant.py b/backend/app/models/intrant.py new file mode 100644 index 0000000..1b481ec --- /dev/null +++ b/backend/app/models/intrant.py @@ -0,0 +1,57 @@ +# backend/app/models/intrant.py +from datetime import datetime, timezone +from typing import List, Optional +from sqlalchemy import Column +from sqlalchemy import JSON as SA_JSON +from sqlmodel import Field, SQLModel + + +class AchatIntrant(SQLModel, table=True): + __tablename__ = "achat_intrant" + + id: Optional[int] = Field(default=None, primary_key=True) + categorie: str # terreau | engrais | traitement | autre + nom: str + marque: Optional[str] = None + boutique_nom: Optional[str] = None + boutique_url: Optional[str] = None + prix: Optional[float] = None + poids: Optional[str] = None # "20L", "1kg", "500ml" + date_achat: Optional[str] = None # ISO date + dluo: Optional[str] = None # ISO date + notes: Optional[str] = None + jardin_id: Optional[int] = Field(default=None, foreign_key="garden.id") + plantation_id: Optional[int] = Field(default=None, foreign_key="planting.id") + tache_id: Optional[int] = Field(default=None, foreign_key="task.id") + created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) + + +class Ingredient(SQLModel): + """Modèle pour un ingrédient de fabrication (non persisté seul).""" + nom: str + quantite: str # "1kg", "10L" + + +class Fabrication(SQLModel, table=True): + __tablename__ = "fabrication" + + id: Optional[int] = Field(default=None, primary_key=True) + type: str # compost | decoction | purin | autre + nom: str + ingredients: Optional[List[dict]] = Field( + default=None, + sa_column=Column("ingredients", SA_JSON, nullable=True), + ) + date_debut: Optional[str] = None # ISO date + date_fin_prevue: Optional[str] = None # ISO date + statut: str = "en_cours" # en_cours | pret | utilise | echec + quantite_produite: Optional[str] = None # "8L", "50kg" + notes: Optional[str] = None + jardin_id: Optional[int] = Field(default=None, foreign_key="garden.id") + plantation_id: Optional[int] = Field(default=None, foreign_key="planting.id") + tache_id: Optional[int] = Field(default=None, foreign_key="task.id") + created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) + + +class FabricationStatutUpdate(SQLModel): + statut: str