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.
176 lines
4.2 KiB
Python
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
|