groupe-meditation/backend/app/schemas/phase1.py
Daniel Allaire 69309acd13 Intégrer rencontres et assemblées pilotées par tuiles
Refond les pages Rencontres et Assemblées autour de tuiles ouvrables avec actions locales, PDF serveur, ventes, collectes, présences, décisions, postes et contributions.

Ajoute les invitations publiques d'assemblée en lecture seule avec lien expirant, l'adoption formelle du rapport du trésorier avec proposeur/secondeur, et bloque les contributions tant que ce rapport n'est pas adopté.

Uniformise la navigation et les entêtes, retire les modules redondants des contextes, ajoute la création de comptes membres par exécutif et les données démo reliées aux nouveaux processus.

Ce commit capture un lot fonctionnel important; une refactorisation ciblée du module Assemblées, puis Trésorerie/Gouvernance, est maintenant pertinente pour isoler les règles métier et faciliter les tests.
2026-05-31 09:02:02 -04:00

172 lines
4.1 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
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
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