groupe-meditation/backend/app/schemas/phase1.py
2026-05-25 17:39:38 -04:00

171 lines
4 KiB
Python

"""Schémas Phase 1 — Saisies hebdomadaires."""
from pydantic import BaseModel
from datetime import date, datetime
from uuid import UUID
from typing import Optional
# ── S1 Collecte ──
class CollecteCreate(BaseModel):
date_collecte: date
montant: float
detenteur_id: UUID # qui a l'argent
reunion_id: Optional[UUID] = None
class CollecteOut(BaseModel):
id: UUID
date_collecte: date
montant: float
detenteur_prenom: Optional[str] = None
statut: str
saisi_par_prenom: Optional[str] = None
confirme_par_prenom: Optional[str] = None
date_confirmation: Optional[datetime] = None
recu_par_prenom: Optional[str] = None
date_reception: Optional[date] = None
cree_le: datetime
model_config = {"from_attributes": True}
class CollecteUpdate(BaseModel):
montant: Optional[float] = None
# ── Opérations bancaires ──
class OperationBancaireCreate(BaseModel):
type: str = "depot"
provenance_depot: Optional[str] = "encaisse"
montant: float
date_operation: date
note: Optional[str] = None
class OperationBancaireOut(BaseModel):
id: UUID
type: str
montant: float
date_operation: date
effectue_par_prenom: str
note: Optional[str] = None
cree_le: datetime
model_config = {"from_attributes": True}
class TransactionComptableOut(BaseModel):
id: UUID
date_transaction: date
type: str
compte: str
montant: float
sens: str
source_table: Optional[str] = None
source_id: Optional[UUID] = None
note: Optional[str] = None
cree_par_prenom: Optional[str] = None
cree_le: datetime
class ReserveCreate(BaseModel):
nom: str
montant: float
note: Optional[str] = None
class ReserveUpdate(BaseModel):
nom: Optional[str] = None
montant: Optional[float] = None
note: Optional[str] = None
class ReserveTransfer(BaseModel):
source_id: str
destination_id: str
montant: float
class ReserveOut(BaseModel):
id: UUID
nom: str
montant: float
note: Optional[str] = None
active: bool = True
cree_le: datetime
model_config = {"from_attributes": True}
class ReserveMouvementOut(BaseModel):
id: UUID
source_id: Optional[UUID] = None
source_nom: Optional[str] = None
destination_id: Optional[UUID] = None
destination_nom: Optional[str] = None
montant: float
type: str
note: Optional[str] = None
cree_par_prenom: Optional[str] = None
cree_le: datetime
class SoldesOut(BaseModel):
encaisse: float # cash reçu par trésorier, pas encore déposé
compte_bancaire: float # dépôts - dépenses payées - contributions
en_possession: float # collectes pas encore remises au trésorier
en_possession_details: list[dict] = []
# ── S4 Rapport de réunion ──
class ReunionCreate(BaseModel):
type: str = "reguliere"
date_reunion: datetime
theme: Optional[str] = None
annonces: Optional[list[str]] = None
note: Optional[str] = None
class ReunionOut(BaseModel):
id: UUID
type: str
date_reunion: datetime
animateur_prenom: Optional[str] = None
theme: Optional[str] = None
annonces: Optional[list[str]] = None
note: Optional[str] = None
cree_le: datetime
model_config = {"from_attributes": True}
# ── S5 Dépense (ouvert à tous) ──
class DepenseCreate(BaseModel):
montant: float
quoi: str
membre_id: Optional[UUID] = None
date_depense: Optional[date] = None
# qui = auto, sauf si un exécutif soumet pour un autre membre
# methode renseignée par le trésorier à la confirmation
class DepenseOut(BaseModel):
id: UUID
date_depense: date
montant: float
qui_prenom: Optional[str] = None
quoi: str
paye: bool
methode: Optional[str] = None
preuve_nom: Optional[str] = None
saisi_par_prenom: Optional[str] = None
confirme: bool = False
cree_le: datetime
model_config = {"from_attributes": True}
class DepenseUpdate(BaseModel):
paye: Optional[bool] = None
methode: Optional[str] = None
quoi: Optional[str] = None