groupe-meditation/backend/app/schemas/phase1.py
Daniel Allaire 6677b0f57b Ajouter historique métier et protection concurrente
Ajoute modifie_le aux objets sensibles et fait transmettre la version affichée par le frontend pour refuser les écritures périmées avec un message HTTP 409.

Ajoute une table historique_modifications et un service d'historique métier afin de journaliser automatiquement les raisons des changements importants sans intervention de l'utilisateur.

Expose l'historique métier dans le module Journal, distinct du journal technique, et documente les processus utilisateurs ainsi qu'une présentation sobre aux membres.
2026-05-31 10:59:41 -04:00

176 lines
4.2 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
modifie_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
modifie_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
animateur_id: Optional[UUID] = None
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
modifie_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
modifie_le: datetime
model_config = {"from_attributes": True}
class DepenseUpdate(BaseModel):
paye: Optional[bool] = None
methode: Optional[str] = None
quoi: Optional[str] = None