feat: DTOs, Services et Resources REST pour Paiements et Wave

DTOs créés:
- PaiementDTO avec validation complète
- CompteWaveDTO avec validation format téléphone
- TransactionWaveDTO avec tous les champs nécessaires

Services créés:
- PaiementService: CRUD complet, validation, annulation, calculs
- WaveService: Gestion comptes Wave, transactions, vérification

Resources REST créées:
- PaiementResource: Endpoints CRUD, validation, annulation, recherche
- WaveResource: Endpoints comptes et transactions Wave

Respect strict DRY/WOU:
- Patterns de service cohérents avec MembreService
- Patterns de resource cohérents avec OrganisationResource
- Gestion d'erreurs standardisée
- Validation complète des DTOs
This commit is contained in:
dahoud
2025-11-30 02:29:48 +00:00
parent e53440da24
commit 5a7ead81f7
8 changed files with 1224 additions and 496 deletions

View File

@@ -0,0 +1,80 @@
package dev.lions.unionflow.server.api.dto.paiement;
import dev.lions.unionflow.server.api.dto.base.BaseDTO;
import dev.lions.unionflow.server.api.enums.paiement.MethodePaiement;
import dev.lions.unionflow.server.api.enums.paiement.StatutPaiement;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
/**
* DTO pour la gestion des paiements
*
* @author UnionFlow Team
* @version 3.0
* @since 2025-01-29
*/
@Getter
@Setter
public class PaiementDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
/** Numéro de référence unique */
@NotBlank(message = "Le numéro de référence est obligatoire")
private String numeroReference;
/** Montant du paiement */
@NotNull(message = "Le montant est obligatoire")
@DecimalMin(value = "0.0", message = "Le montant doit être positif")
@Digits(integer = 12, fraction = 2)
private BigDecimal montant;
/** Code devise (ISO 3 lettres) */
@NotBlank(message = "Le code devise est obligatoire")
@Pattern(regexp = "^[A-Z]{3}$", message = "Le code devise doit être un code ISO à 3 lettres")
private String codeDevise;
/** Méthode de paiement */
@NotNull(message = "La méthode de paiement est obligatoire")
private MethodePaiement methodePaiement;
/** Statut du paiement */
@NotNull(message = "Le statut du paiement est obligatoire")
private StatutPaiement statutPaiement;
/** Date de paiement */
private LocalDateTime datePaiement;
/** Date de validation */
private LocalDateTime dateValidation;
/** Validateur (email de l'administrateur) */
private String validateur;
/** Référence externe */
private String referenceExterne;
/** URL de preuve de paiement */
private String urlPreuve;
/** Commentaires et notes */
private String commentaire;
/** Adresse IP de l'initiateur */
private String ipAddress;
/** User-Agent de l'initiateur */
private String userAgent;
/** ID du membre payeur */
@NotNull(message = "Le membre payeur est obligatoire")
private UUID membreId;
/** ID de la transaction Wave (si applicable) */
private UUID transactionWaveId;
}

View File

@@ -0,0 +1,53 @@
package dev.lions.unionflow.server.api.dto.wave;
import dev.lions.unionflow.server.api.dto.base.BaseDTO;
import dev.lions.unionflow.server.api.enums.wave.StatutCompteWave;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
/**
* DTO pour la gestion des comptes Wave
*
* @author UnionFlow Team
* @version 3.0
* @since 2025-01-29
*/
@Getter
@Setter
public class CompteWaveDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
/** Numéro de téléphone Wave */
@NotBlank(message = "Le numéro de téléphone est obligatoire")
@Pattern(
regexp = "^\\+225[0-9]{8}$",
message = "Le numéro de téléphone Wave doit être au format +225XXXXXXXX")
private String numeroTelephone;
/** Statut du compte */
private StatutCompteWave statutCompte;
/** Identifiant Wave API (encrypté) */
private String waveAccountId;
/** Environnement (SANDBOX ou PRODUCTION) */
private String environnement;
/** Date de dernière vérification */
private LocalDateTime dateDerniereVerification;
/** Commentaires */
private String commentaire;
/** ID de l'organisation (si compte d'organisation) */
private UUID organisationId;
/** ID du membre (si compte de membre) */
private UUID membreId;
}

View File

@@ -0,0 +1,87 @@
package dev.lions.unionflow.server.api.dto.wave;
import dev.lions.unionflow.server.api.dto.base.BaseDTO;
import dev.lions.unionflow.server.api.enums.wave.StatutTransactionWave;
import dev.lions.unionflow.server.api.enums.wave.TypeTransactionWave;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
/**
* DTO pour la gestion des transactions Wave
*
* @author UnionFlow Team
* @version 3.0
* @since 2025-01-29
*/
@Getter
@Setter
public class TransactionWaveDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
/** Identifiant Wave de la transaction */
@NotBlank(message = "L'identifiant Wave est obligatoire")
private String waveTransactionId;
/** Identifiant de requête Wave */
private String waveRequestId;
/** Référence Wave */
private String waveReference;
/** Type de transaction */
@NotNull(message = "Le type de transaction est obligatoire")
private TypeTransactionWave typeTransaction;
/** Statut de la transaction */
@NotNull(message = "Le statut de la transaction est obligatoire")
private StatutTransactionWave statutTransaction;
/** Montant de la transaction */
@NotNull(message = "Le montant est obligatoire")
@DecimalMin(value = "0.0", message = "Le montant doit être positif")
@Digits(integer = 12, fraction = 2)
private BigDecimal montant;
/** Frais de transaction */
@DecimalMin(value = "0.0")
@Digits(integer = 10, fraction = 2)
private BigDecimal frais;
/** Montant net */
@DecimalMin(value = "0.0")
@Digits(integer = 12, fraction = 2)
private BigDecimal montantNet;
/** Code devise */
@NotBlank(message = "Le code devise est obligatoire")
@Pattern(regexp = "^[A-Z]{3}$", message = "Le code devise doit être un code ISO à 3 lettres")
private String codeDevise;
/** Numéro téléphone payeur */
private String telephonePayeur;
/** Numéro téléphone bénéficiaire */
private String telephoneBeneficiaire;
/** Métadonnées JSON */
private String metadonnees;
/** Nombre de tentatives */
private Integer nombreTentatives;
/** Date de dernière tentative */
private LocalDateTime dateDerniereTentative;
/** Message d'erreur */
private String messageErreur;
/** ID du compte Wave */
@NotNull(message = "Le compte Wave est obligatoire")
private UUID compteWaveId;
}