groupe-meditation/backend/app/schemas/phase7.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

108 lines
2.5 KiB
Python

"""Schémas Phase 7 — Finances avancé : contributions, répartition, rapport complet."""
from pydantic import BaseModel
from datetime import date, datetime
from uuid import UUID
from typing import Optional
DESTINATIONS = ["District 87-16"]
DESTINATIONS_LABELS = {
"District 87-16": "District 87-16",
"district": "District 87-16",
"region": "Région 87",
"bsg": "BSG",
"intergroupe": "Intergroupe",
}
METHODES_CONTRIBUTION = ["DU", "VIREMENT", "CHEQUE"]
# ── M4 Envoi de contributions ──
class EnvoiContributionCreate(BaseModel):
date_envoi: date
destination: str
montant: float
methode: str # DU, VIREMENT, CHEQUE
resolution_id: Optional[UUID] = None
proposeur_id: UUID
secondeur_id: UUID
class EnvoiContributionOut(BaseModel):
id: UUID
date_envoi: date
destination: str
destination_label: str
montant: float
methode: str
resolution_id: Optional[UUID] = None
engagee: bool = False
debitee: bool = False
saisi_par_prenom: Optional[str] = None
cree_le: datetime
modifie_le: datetime
model_config = {"from_attributes": True}
class CalculRepartitionIn(BaseModel):
"""Montant à répartir — le backend calcule les montants par destination."""
montant_total: float
class CalculRepartitionOut(BaseModel):
destination: str
destination_label: str
pourcentage: float
montant: float
class DestinataireContributionCreate(BaseModel):
nom: str
class DestinataireContributionUpdate(BaseModel):
nom: str
class DestinataireContributionOut(BaseModel):
id: UUID
nom: str
protege: bool = False
actif: bool = True
modifie_le: datetime
model_config = {"from_attributes": True}
# ── G8 Config répartition ──
class ConfigRepartitionItem(BaseModel):
destination: str
pourcentage: float
class ConfigRepartitionOut(BaseModel):
destination: str
destination_label: str
pourcentage: float
actif_depuis: date
model_config = {"from_attributes": True}
class ConfigRepartitionBatch(BaseModel):
"""Mettre à jour toutes les répartitions d'un coup."""
items: list[ConfigRepartitionItem]
# ── Rapport financier complet ──
class RapportFinancierComplet(BaseModel):
mois: int
annee: int
total_collectes: float
total_depenses: float
total_contributions: float
solde_mois: float
nb_collectes: int
nb_depenses: int
nb_contributions: int
depenses_impayees: float