package com.pmumali.simple.exception; /** * Exception métier pour les erreurs spécifiques aux paris PMU Mali * conforme aux règles du "Jumelé Placé" */ public class PariException extends RuntimeException { private final ErrorCode errorCode; private final String details; // Codes d'erreur standardisés public enum ErrorCode { // Article 1 - Règles de base MISE_MINIMALE_NON_ATTEINTE("La mise minimale est de 500 FCFA"), // Article 2 - Limitation des enjeux LIMITE_MISE_DEPASSEE("Limite de mise dépassée (20x500 FCFA maximum)"), // Article 3 - Dead Heat CALCUL_RAPPORT_IMPOSSIBLE("Impossible de calculer les rapports pour ce Dead Heat"), // Article 4 - Non-partants CHEVAL_NON_PARTANT("Pari invalide : cheval non-partant"), // Article 5 - Calcul des rapports RAPPORT_INVALIDE("Rapport calculé invalide (<1.1)"), // Article 6 - Formules FORMULE_INVALIDE("Formule de pari invalide"), // Article 8 - Cas particuliers COURSE_ANNULEE("Course annulée - paris remboursés"), // Validations générales PARI_INVALIDE("Pari invalide"), SOLDE_INSUFFISANT("Solde insuffisant pour placer ce pari"), CLIENT_BLOQUE("Compte client bloqué"); private final String message; ErrorCode(String message) { this.message = message; } public String getMessage() { return message; } } // Constructeurs public PariException(ErrorCode errorCode) { super(errorCode.getMessage()); this.errorCode = errorCode; this.details = null; } public PariException(ErrorCode errorCode, String details) { super(errorCode.getMessage() + " : " + details); this.errorCode = errorCode; this.details = details; } public PariException(ErrorCode errorCode, Throwable cause) { super(errorCode.getMessage(), cause); this.errorCode = errorCode; this.details = null; } // Getters public ErrorCode getErrorCode() { return errorCode; } public String getDetails() { return details; } // Méthode utilitaire pour construire les messages public static String buildLimiteMiseMessage(double limite) { return String.format("Limite de mise dépassée (max %,.0f FCFA par course selon Article 2)", limite); } }