@startuml MCD_UnionFlow
!theme plain
skinparam linetype ortho
skinparam packageStyle rectangle
skinparam classAttributeIconSize 0

title UnionFlow - MCD avec Wave Mobile Money

package Base {
abstract class BaseEntity {
    + id : UUID
    + dateCreation : LocalDateTime
    + version : Long
    + actif : Boolean
}
}

package Orgs {
class Organisation {
    + nom : String
    + email : String
    + statut : StatutOrg
}
class TypeOrganisation {
    + code : String
}
class Adresse {
    + ville : String
    + pays : String
}
}

package Membres {
class Membre {
    + numeroMembre : String
    + email : String
    + telephoneWave : String
}
class Role {
    + code : String
}
class Permission {
    + code : String
}
class MembreRole {
}
class RolePermission {
}
}

package Paiements {
class Paiement {
    + montant : BigDecimal
    + methodePaiement : MethodePmt
    + statutPaiement : StatutPmt
}
class Cotisation {
    + montantDu : BigDecimal
    + statut : StatutCot
}
class PaiementCotisation {
    + montantApplique : BigDecimal
}
class Adhesion {
    + fraisAdhesion : BigDecimal
    + statut : StatutAdh
}
class PaiementAdhesion {
    + montantApplique : BigDecimal
}
}

package Wave {
class CompteWave {
    + numeroTelephone : String
    + statutCompte : StatutWave
}
class TransactionWave {
    + waveTransactionId : String
    + montant : BigDecimal
    + statutTransaction : StatutTxWave
}
class WebhookWave {
    + waveEventId : String
    + statutTraitement : StatutWebhook
}
class ConfigurationWave {
    + cle : String
    + valeur : String
}
}

package Compta {
class CompteComptable {
    + numeroCompte : String
    + soldeActuel : BigDecimal
}
class JournalComptable {
    + code : String
}
class EcritureComptable {
    + montantDebit : BigDecimal
    + montantCredit : BigDecimal
}
class LigneEcriture {
    + montantDebit : BigDecimal
    + montantCredit : BigDecimal
}
}

package Evenements {
class Evenement {
    + titre : String
    + typeEvenement : TypeEvt
    + statut : StatutEvt
}
class InscriptionEvenement {
    + statut : StatutInsc
}
class PaiementEvenement {
    + montantApplique : BigDecimal
}
}

package Solidarite {
class DemandeAide {
    + typeAide : TypeAide
    + statut : StatutAide
    + montantDemande : BigDecimal
}
class PaiementAide {
    + montantApplique : BigDecimal
}
}

package Docs {
class Document {
    + nomFichier : String
    + hashMd5 : String
}
class PieceJointe {
    + ordre : Integer
}
}

package Notifs {
class Notification {
    + typeNotification : TypeNotif
    + statut : StatutNotif
}
class TemplateNotification {
    + code : String
}
}

package Audit {
class AuditLog {
    + typeAction : TypeAction
    + severite : Severite
}
class ParametreSysteme {
    + cle : String
    + valeur : String
}
}

BaseEntity <|-- Organisation
BaseEntity <|-- TypeOrganisation
BaseEntity <|-- Adresse
BaseEntity <|-- Membre
BaseEntity <|-- Role
BaseEntity <|-- Permission
BaseEntity <|-- MembreRole
BaseEntity <|-- RolePermission
BaseEntity <|-- Paiement
BaseEntity <|-- Cotisation
BaseEntity <|-- PaiementCotisation
BaseEntity <|-- Adhesion
BaseEntity <|-- PaiementAdhesion
BaseEntity <|-- CompteWave
BaseEntity <|-- TransactionWave
BaseEntity <|-- WebhookWave
BaseEntity <|-- ConfigurationWave
BaseEntity <|-- CompteComptable
BaseEntity <|-- JournalComptable
BaseEntity <|-- EcritureComptable
BaseEntity <|-- LigneEcriture
BaseEntity <|-- Evenement
BaseEntity <|-- InscriptionEvenement
BaseEntity <|-- PaiementEvenement
BaseEntity <|-- DemandeAide
BaseEntity <|-- PaiementAide
BaseEntity <|-- Document
BaseEntity <|-- PieceJointe
BaseEntity <|-- Notification
BaseEntity <|-- TemplateNotification
BaseEntity <|-- AuditLog
BaseEntity <|-- ParametreSysteme

Organisation "1" *-- "0..*" Membre
Organisation "0..1" --o "0..*" Organisation
Organisation "1" *-- "1" TypeOrganisation
Organisation "0..1" --o "0..*" Adresse
Organisation "1" *-- "0..*" CompteWave

Membre "1" *-- "0..*" MembreRole
MembreRole "1" *-- "1" Role
Membre "0..1" --o "0..*" Adresse
Membre "0..1" --o "0..*" CompteWave

Role "1" *-- "0..*" RolePermission
RolePermission "1" *-- "1" Permission

Paiement "1" *-- "0..*" PaiementCotisation
Paiement "1" *-- "0..*" PaiementAdhesion
Paiement "1" *-- "0..*" PaiementEvenement
Paiement "1" *-- "0..*" PaiementAide
Paiement "0..1" --o "1" TransactionWave
Paiement "1" *-- "1" Membre

Cotisation "1" *-- "0..*" PaiementCotisation
PaiementCotisation "1" *-- "1" Paiement
Cotisation "1" *-- "1" Membre
Cotisation "1" *-- "1" Organisation

Adhesion "1" *-- "0..*" PaiementAdhesion
PaiementAdhesion "1" *-- "1" Paiement
Adhesion "1" *-- "1" Membre
Adhesion "1" *-- "1" Organisation

CompteWave "1" *-- "0..*" TransactionWave
TransactionWave "1" *-- "0..*" WebhookWave
WebhookWave "0..1" --o "1" TransactionWave
WebhookWave "0..1" --o "1" Paiement
CompteWave "1" *-- "1" Organisation
CompteWave "0..1" --o "1" Membre

JournalComptable "1" *-- "0..*" EcritureComptable
EcritureComptable "1" *-- "1..*" LigneEcriture
LigneEcriture "1" *-- "1" CompteComptable
EcritureComptable "0..1" --o "1" Paiement
EcritureComptable "1" *-- "1" Organisation

Evenement "1" *-- "0..*" InscriptionEvenement
InscriptionEvenement "1" *-- "1" Membre
InscriptionEvenement "1" *-- "1" Evenement
Evenement "1" *-- "1" Organisation
Evenement "0..1" --o "1" Adresse
Evenement "0..1" --o "0..*" PaiementEvenement
PaiementEvenement "1" *-- "1" Paiement
PaiementEvenement "1" *-- "1" InscriptionEvenement

DemandeAide "1" *-- "0..*" PaiementAide
PaiementAide "1" *-- "1" Paiement
DemandeAide "1" *-- "1" Membre
DemandeAide "0..1" --o "1" Membre
DemandeAide "1" *-- "1" Organisation

PieceJointe "1" *-- "1" Document
Document "0..1" --o "0..*" PieceJointe
PieceJointe "0..1" --o "1" Membre
PieceJointe "0..1" --o "1" Organisation
PieceJointe "0..1" --o "1" Cotisation
PieceJointe "0..1" --o "1" Adhesion
PieceJointe "0..1" --o "1" DemandeAide
PieceJointe "0..1" --o "1" TransactionWave

Notification "0..1" --o "1" TemplateNotification
Notification "1" *-- "1" Membre
Notification "0..1" --o "1" Organisation

AuditLog "0..1" --o "1" Membre
AuditLog "0..1" --o "1" Organisation

@enduml
