documentation
Kohinos v3 Doc générée le commit 8d60b1904

Modèle de domaine

Le domaine s'articule autour de quatre familles d'entités : les acteurs (User, Adherent, Prestataire, Comptoir, Groupe, Siège), les comptes (Account*), les flux et opérations (Flux*, Operation*), et les artefacts financiers (SepaMandate, Recurring*, SSA*, HelloAsso, PendingPaymentData).

Diagramme d'entités (vue financière)

classDiagram
    direction LR

    class Account {
      <<MappedSuperclass>>
      +UUID id
      +decimal balance
      +postPersist()
    }
    class AccountAdherent
    class AccountPrestataire
    class AccountComptoir
    class AccountGroupe
    class AccountSiege
    Account <|-- AccountAdherent
    Account <|-- AccountPrestataire
    Account <|-- AccountComptoir
    Account <|-- AccountGroupe
    Account <|-- AccountSiege

    class Flux {
      <<abstract>>
      +UUID id
      +decimal montant
      +datetime createdAt
      +string hash
      +string reference
    }
    class AchatMonnaie
    class Retrait
    class Change
    class Don
    class Cotisation
    class Transaction
    Flux <|-- AchatMonnaie
    Flux <|-- Retrait
    Flux <|-- Change
    Flux <|-- Don
    Flux <|-- Cotisation
    Flux <|-- Transaction

    class Operation {
      <<abstract>>
      +UUID id
      +decimal montant
      +string hash
    }
    Account "1" --> "*" Operation : a
    Flux "1" --> "*" Operation : genere

    class SepaMandate {
      +UUID id
      +string umr
      +string status
      +string ibanEncrypted
      +datetime signedAt
    }
    class RecurringSubscriptionRequest {
      <<abstract>>
    }
    class RecurringPurchaseRequest
    SepaMandate "1" --> "*" RecurringPurchaseRequest : couvre
    SepaMandate "0..1" --> "*" RecurringSubscriptionRequest : couvre

    class SolidoumeParameter {
      +UUID id
      +string strategy
      +decimal targetAmount
      +decimal rate
    }
    
Vue financière simplifiée (héritages STI Flux et MappedSuperclass Account). UMR au format KOHINOS-YYYYMMDD-XXXXXXXX.

Comptes (Account*)

Account est une MappedSuperclass (pas une table) dont chaque type d'acteur hérite avec sa propre table. Tous les comptes partagent :

⚠ Règle absolue

Le solde est recalculé en temps réel depuis les opérations. Ne jamais le cacher en dehors d'une transaction atomique avec un lock pessimiste : $em->find(Account::class, $id, LockMode::PESSIMISTIC_WRITE).

Flux & Opérations

Le Flux est le pivot monétaire de toute transaction. Il est en STI (single table inheritance) avec un discriminator (achat, retrait, change, don, cotisation, transaction). Chaque flux génère au moins deux Operation (une débit, une crédit) qui appliquent l'effet sur les comptes.

Chaque Operation est signée cryptographiquement en référence à la précédente (chaînage), formant une chaîne vérifiable de toutes les écritures financières.

Patterns de référence (champ reference)

CasPattern
SSA prélèvementSolidoume prélèvement {month}
SSA redistributionSolidoume {month}
SSA cotisation participantSolidoume cotisation {month}
Achat récurrent SEPAAchat récurrent {month}
Cotisation annuelle MLCCotisation MLC {year}

SEPA

SSA — fonds SSA

Un SolidoumeParameter définit un fonds (taux de prélèvement, stratégie de redistribution, SSA principal vs régional). Plusieurs fonds coexistent. La stratégie est une instance de RedistributionStrategy :

Enums & types

Invariants à toujours protéger

  • 1 eMLc émis = 1 € en réserve (conservation).
  • Toute modification de solde = 1 lock pessimiste + 1 Operation dans la même transaction.
  • Pas d'écriture dans operation_* sans Flux parent en base (FK flux_id).
  • Pas de modification de flux.hash ou operation.hash après création (chaînage).
  • Mandat active ⇒ signed_at IS NOT NULL. Mandat cancelled ⇒ cancelled_at IS NOT NULL.
  • last_processed_month empêche le double-prélèvement SEPA.