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.
108 lines
2.5 KiB
Python
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
|