feat(api): Phase 1 - Extensions API LCB-FT (Spec 001)

Extensions API pour conformité BCEAO/OHADA - Lutte contre le Blanchiment
des Capitaux et le Financement du Terrorisme (LCB-FT).

Changements :

1. DTOs Transaction Épargne (déjà présents, validation effectuée)
   - TransactionEpargneRequest : origineFonds, pieceJustificativeId
   - TransactionEpargneResponse : origineFonds, pieceJustificativeId

2. Enums et DTOs KYC Membre (déjà présents, validation effectuée)
   - NiveauVigilanceKyc : SIMPLIFIE, RENFORCE
   - StatutKyc : NON_VERIFIE, EN_COURS, VERIFIE, REFUSE
   - MembreResponse : niveauVigilanceKyc, statutKyc, dateVerificationIdentite

3. Extensions DTOs Paiement
   - TypeObjetIntentionPaiement : +RETRAIT_EPARGNE, +CREDIT_REMBOURSEMENT
   - InitierDepotEpargneRequest : +origineFonds, +justificationLcbFt
   - DeclarerPaiementManuelRequest : +origineFonds, +justificationLcbFt
   - InitierPaiementEnLigneRequest : +origineFonds, +justificationLcbFt

4. Nouveaux DTOs Paramètres LCB-FT
   - ParametresLcbFtRequest : seuils justification et validation manuelle
   - ParametresLcbFtResponse : configuration org/plateforme

Tâches : T001-T005 complétées
Prochaine étape : Phase 2 - Migrations Flyway

Spec : specs/001-mutuelles-anti-blanchiment/spec.md

Signed-off-by: lions dev Team
This commit is contained in:
dahoud
2026-03-15 02:17:25 +00:00
parent e8ad874015
commit 309edc4e23
6 changed files with 123 additions and 4 deletions

View File

@@ -0,0 +1,50 @@
package dev.lions.unionflow.server.api.dto.config.request;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import java.math.BigDecimal;
/**
* Requête de création/mise à jour des paramètres LCB-FT (Lutte contre le Blanchiment et le Financement du Terrorisme).
* Définit les seuils au-dessus desquels les justifications d'origine des fonds sont obligatoires.
*
* @author lions dev Team
* @version 1.0
* @since 2026-03-13
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(description = "Paramètres LCB-FT (seuils de vigilance)")
public class ParametresLcbFtRequest {
@Schema(description = "ID de l'organisation (null pour paramètres plateforme)")
private String organisationId;
@NotNull(message = "Le montant seuil de justification est obligatoire")
@DecimalMin(value = "0", message = "Le montant doit être positif ou nul")
@Schema(description = "Montant au-dessus duquel l'origine des fonds est obligatoire (ex. 500000 XOF)", example = "500000")
private BigDecimal montantSeuilJustification;
@NotNull(message = "Le montant seuil de validation manuelle est obligatoire")
@DecimalMin(value = "0", message = "Le montant doit être positif ou nul")
@Schema(description = "Montant au-dessus duquel une validation manuelle est requise (ex. 1000000 XOF)", example = "1000000")
private BigDecimal montantSeuilValidationManuelle;
@NotBlank(message = "Le code devise est obligatoire")
@Size(max = 3, message = "Le code devise doit faire 3 caractères (ISO 4217)")
@Schema(description = "Code devise ISO 4217 (ex. XOF, EUR, USD)", example = "XOF")
private String codeDevise;
@Schema(description = "Notes ou commentaires sur la configuration")
private String notes;
}

View File

@@ -0,0 +1,49 @@
package dev.lions.unionflow.server.api.dto.config.response;
import dev.lions.unionflow.server.api.dto.base.BaseResponse;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import java.math.BigDecimal;
/**
* Réponse contenant les paramètres LCB-FT (Lutte contre le Blanchiment et le Financement du Terrorisme).
* Retourne les seuils configurés pour une organisation ou la plateforme.
*
* @author lions dev Team
* @version 1.0
* @since 2026-03-13
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(description = "Paramètres LCB-FT avec seuils de vigilance")
public class ParametresLcbFtResponse extends BaseResponse {
@Schema(description = "ID de l'organisation (null si paramètres plateforme)")
private String organisationId;
@Schema(description = "Nom de l'organisation (null si paramètres plateforme)")
private String organisationNom;
@Schema(description = "Montant au-dessus duquel l'origine des fonds est obligatoire", example = "500000")
private BigDecimal montantSeuilJustification;
@Schema(description = "Montant au-dessus duquel une validation manuelle est requise", example = "1000000")
private BigDecimal montantSeuilValidationManuelle;
@Schema(description = "Code devise ISO 4217", example = "XOF")
private String codeDevise;
@Schema(description = "Notes ou commentaires sur la configuration")
private String notes;
@Schema(description = "Indique si ces paramètres s'appliquent à toute la plateforme")
private Boolean estParametrePlateforme;
}

View File

@@ -16,6 +16,8 @@ import lombok.Builder;
* @param methodePaiement Méthode de paiement (ESPECES, VIREMENT, CHEQUE, AUTRE)
* @param reference Référence du paiement (numéro de transaction, numéro de chèque, etc.)
* @param commentaire Commentaire optionnel
* @param origineFonds Origine des fonds (LCB-FT) — obligatoire au-dessus du seuil configuré
* @param justificationLcbFt Justification complémentaire LCB-FT si nécessaire
*
* @author UnionFlow Team
* @version 1.0
@@ -35,6 +37,10 @@ public record DeclarerPaiementManuelRequest(
String reference,
@Size(max = 500, message = "Le commentaire ne doit pas dépasser 500 caractères")
String commentaire
String commentaire,
String origineFonds,
String justificationLcbFt
) {
}

View File

@@ -15,6 +15,8 @@ import lombok.Builder;
* @param compteId ID du compte épargne à créditer
* @param montant Montant du dépôt (XOF)
* @param numeroTelephone Numéro Wave du membre (9 chiffres)
* @param origineFonds Origine des fonds (LCB-FT) — obligatoire au-dessus du seuil configuré
* @param justificationLcbFt Justification complémentaire LCB-FT si nécessaire
*/
@Builder
public record InitierDepotEpargneRequest(
@@ -27,6 +29,10 @@ public record InitierDepotEpargneRequest(
@NotBlank(message = "Le numéro de téléphone Wave est obligatoire")
@Pattern(regexp = "^\\d{9,15}$", message = "Numéro de téléphone invalide (9-15 chiffres)")
String numeroTelephone
String numeroTelephone,
String origineFonds,
String justificationLcbFt
) {
}

View File

@@ -12,6 +12,8 @@ import lombok.Builder;
* @param cotisationId ID de la cotisation à payer
* @param methodePaiement Méthode de paiement (WAVE, ORANGE_MONEY, FREE_MONEY, CARTE_BANCAIRE)
* @param numeroTelephone Numéro de téléphone pour Wave/Orange/Free (format: 221771234567)
* @param origineFonds Origine des fonds (LCB-FT) — obligatoire au-dessus du seuil configuré
* @param justificationLcbFt Justification complémentaire LCB-FT si nécessaire
*
* @author UnionFlow Team
* @version 1.0
@@ -29,6 +31,10 @@ public record InitierPaiementEnLigneRequest(
@NotBlank(message = "Le numéro de téléphone est obligatoire")
@Pattern(regexp = "^\\d{9,15}$", message = "Numéro de téléphone invalide (9-15 chiffres)")
String numeroTelephone
String numeroTelephone,
String origineFonds,
String justificationLcbFt
) {
}

View File

@@ -5,7 +5,9 @@ public enum TypeObjetIntentionPaiement {
ADHESION("Frais d'adhésion"),
EVENEMENT("Participation événement"),
ABONNEMENT_UNIONFLOW("Abonnement forfait UnionFlow"),
DEPOT_EPARGNE("Dépôt compte épargne");
DEPOT_EPARGNE("Dépôt compte épargne"),
RETRAIT_EPARGNE("Retrait compte épargne"),
CREDIT_REMBOURSEMENT("Remboursement crédit");
private final String libelle;