commit v1

This commit is contained in:
sidibe
2025-09-17 15:28:14 +00:00
parent e8d993aeb0
commit 2f47046035
278 changed files with 3492 additions and 2670 deletions

View File

@@ -16,12 +16,12 @@ import java.util.stream.Collectors;
public class ServiceMulti {
private final PariMultiRepository pariRepository;
private final CourseRepository courseRepository;
private final ChevalRepository chevalRepository;
private final CourseMultiRepository courseRepository;
private final ChevalMultiRepository chevalRepository;
private final PaiementMultiRepository paiementRepository;
private final ResultatCourseRepository resultatRepository;
private final ResultatCourseMultiRepository resultatRepository;
private final CagnotteMultiRepository cagnotteRepository;
private final ParieurRepository parieurRepository;
private final ParieurMultiRepository parieurRepository;
private static final Double MISE_BASE = 500.0;
private static final Double MISE_MAX = 200 * MISE_BASE;
@@ -50,7 +50,7 @@ public class ServiceMulti {
throw new IllegalArgumentException("La mise doit être au moins " + MISE_BASE + " FCFA");
}
Course course = courseRepository.findById(requete.getCourseId())
CourseMulti course = courseRepository.findById(requete.getCourseId())
.orElseThrow(() -> new RuntimeException("Course non trouvée"));
// Vérification du nombre minimum de chevaux
@@ -58,19 +58,19 @@ public class ServiceMulti {
throw new IllegalArgumentException("La course doit avoir au moins " + NOMBRE_CHEVAUX_MINIMUM + " chevaux partants");
}
List<Cheval> chevaux = chevalRepository.findAllById(requete.getChevalIds());
List<ChevalMulti> chevaux = chevalRepository.findAllById(requete.getChevalIds());
// Validation du nombre de chevaux selon le type MULTI
validerNombreChevaux(requete.getTypeMulti(), chevaux.size());
// Vérification des non-partants
long nonPartants = chevaux.stream().filter(Cheval::getNonPartant).count();
long nonPartants = chevaux.stream().filter(ChevalMulti::getNonPartant).count();
validerNonPartants(requete.getTypeMulti(), nonPartants);
// Limitation de mise selon l'article 2
Double miseEffective = Math.min(requete.getMise(), MISE_MAX);
Parieur parieur = parieurRepository.findById(requete.getParieurId())
ParieurMulti parieur = parieurRepository.findById(requete.getParieurId())
.orElseThrow(() -> new RuntimeException("Parieur non trouvé"));
PariMulti pari = PariMulti.builder()
@@ -123,7 +123,7 @@ public class ServiceMulti {
@Transactional
public List<ReponsePaiementMulti> calculerPaiements(RequeteResultatMulti requete) {
ResultatCourse resultat = creerResultat(requete);
ResultatCourseMulti resultat = creerResultat(requete);
List<PariMulti> paris = pariRepository.findByCourseId(requete.getCourseId());
List<ReponsePaiementMulti> paiements = new ArrayList<>();
@@ -168,9 +168,9 @@ public class ServiceMulti {
return paiements;
}
private ReponsePaiementMulti calculerPaiementPari(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
List<Cheval> chevauxPari = pari.getChevauxSelectionnes();
long nonPartants = chevauxPari.stream().filter(Cheval::getNonPartant).count();
private ReponsePaiementMulti calculerPaiementPari(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
List<ChevalMulti> chevauxPari = pari.getChevauxSelectionnes();
long nonPartants = chevauxPari.stream().filter(ChevalMulti::getNonPartant).count();
// Article 4: Gestion des non-partants et transformations
if (doitEtreRembourse(pari.getTypeMulti(), nonPartants)) {
@@ -180,7 +180,7 @@ public class ServiceMulti {
// Transformer les paris avec non-partants (Article 4)
TypeMulti typeTransforme = transformerPari(pari.getTypeMulti(), nonPartants);
List<Cheval> chevauxParticipants = chevauxPari.stream()
List<ChevalMulti> chevauxParticipants = chevauxPari.stream()
.filter(cheval -> !cheval.getNonPartant())
.collect(Collectors.toList());
@@ -228,7 +228,7 @@ public class ServiceMulti {
}
}
private boolean estCombinaisonGagnante(List<Cheval> chevauxPari, ResultatCourse resultat) {
private boolean estCombinaisonGagnante(List<ChevalMulti> chevauxPari, ResultatCourseMulti resultat) {
// Vérifier si au moins 4 chevaux sont dans les 4 premiers
long countDansTop4 = chevauxPari.stream()
.filter(cheval -> estDansTop4(cheval, resultat))
@@ -236,14 +236,14 @@ public class ServiceMulti {
return countDansTop4 >= 4;
}
private boolean estDansTop4(Cheval cheval, ResultatCourse resultat) {
private boolean estDansTop4(ChevalMulti cheval, ResultatCourseMulti resultat) {
return estDansListe(cheval, resultat.getPremiers()) ||
estDansListe(cheval, resultat.getSeconds()) ||
estDansListe(cheval, resultat.getTroisiemes()) ||
estDansListe(cheval, resultat.getQuatriemes());
}
private boolean estDansListe(Cheval cheval, List<Cheval> liste) {
private boolean estDansListe(ChevalMulti cheval, List<ChevalMulti> liste) {
return liste != null && liste.contains(cheval);
}
@@ -520,7 +520,7 @@ public class ServiceMulti {
}
// Gestion des dead-heat (Article 3)
private TypeDeadHeat detecterDeadHeat(ResultatCourse resultat) {
private TypeDeadHeat detecterDeadHeat(ResultatCourseMulti resultat) {
if (resultat.getPremiers().size() >= 4) return TypeDeadHeat.QUATRE_PREMIERS_OU_PLUS;
if (resultat.getPremiers().size() >= 3 && resultat.getQuatriemes().size() >= 1)
return TypeDeadHeat.TROIS_PREMIERS_UN_QUATRIEME;
@@ -540,7 +540,7 @@ public class ServiceMulti {
return null;
}
private List<ReponsePaiementMulti> gererDeadHeat(ResultatCourse resultat, TypeDeadHeat typeDeadHeat) {
private List<ReponsePaiementMulti> gererDeadHeat(ResultatCourseMulti resultat, TypeDeadHeat typeDeadHeat) {
List<PariMulti> paris = pariRepository.findByCourseId(resultat.getCourse().getId());
List<ReponsePaiementMulti> paiements = new ArrayList<>();
Double masseAPartager = resultat.getMasseAPartager();
@@ -556,7 +556,7 @@ public class ServiceMulti {
return paiements;
}
private ReponsePaiementMulti calculerPaiementDeadHeat(PariMulti pari, ResultatCourse resultat,
private ReponsePaiementMulti calculerPaiementDeadHeat(PariMulti pari, ResultatCourseMulti resultat,
Double masseAPartager, TypeDeadHeat typeDeadHeat) {
// Implémentation spécifique pour chaque type de dead-heat
switch (typeDeadHeat) {
@@ -581,9 +581,9 @@ public class ServiceMulti {
}
}
private ReponsePaiementMulti gererDeadHeatQuatrePremiers(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
private ReponsePaiementMulti gererDeadHeatQuatrePremiers(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
// Article 3a: Dead-heat de 4+ chevaux premiers
List<Cheval> chevauxPari = pari.getChevauxSelectionnes();
List<ChevalMulti> chevauxPari = pari.getChevauxSelectionnes();
// Vérifier si tous les chevaux du pari sont parmi les premiers
if (chevauxPari.stream().allMatch(cheval -> estDansListe(cheval, resultat.getPremiers()))) {
@@ -596,9 +596,9 @@ public class ServiceMulti {
return null;
}
private ReponsePaiementMulti gererDeadHeatTroisPremiersUnQuatrieme(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
private ReponsePaiementMulti gererDeadHeatTroisPremiersUnQuatrieme(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
// Article 3b: Dead-heat de 3 premiers + 1+ quatrième
List<Cheval> chevauxPari = pari.getChevauxSelectionnes();
List<ChevalMulti> chevauxPari = pari.getChevauxSelectionnes();
boolean troisPremiersOk = chevauxPari.subList(0, 3).stream()
.allMatch(cheval -> estDansListe(cheval, resultat.getPremiers()));
@@ -615,40 +615,40 @@ public class ServiceMulti {
}
// Implémentations similaires pour les autres types de dead-heat...
private ReponsePaiementMulti gererDeadHeatDeuxPremiersDeuxTroisiemes(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
private ReponsePaiementMulti gererDeadHeatDeuxPremiersDeuxTroisiemes(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
// Article 3c: Implémentation spécifique
return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 2.0);
}
private ReponsePaiementMulti gererDeadHeatDeuxPremiersUnTroisiemeUnQuatrieme(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
private ReponsePaiementMulti gererDeadHeatDeuxPremiersUnTroisiemeUnQuatrieme(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
// Article 3d: Implémentation spécifique
return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0);
}
private ReponsePaiementMulti gererDeadHeatTroisSeconds(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
private ReponsePaiementMulti gererDeadHeatTroisSeconds(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
// Article 3e: Implémentation spécifique
return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 2.0);
}
private ReponsePaiementMulti gererDeadHeatDeuxSecondsUnQuatrieme(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
private ReponsePaiementMulti gererDeadHeatDeuxSecondsUnQuatrieme(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
// Article 3f: Implémentation spécifique
return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0);
}
private ReponsePaiementMulti gererDeadHeatDeuxTroisiemes(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
private ReponsePaiementMulti gererDeadHeatDeuxTroisiemes(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
// Article 3g: Implémentation spécifique
return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0);
}
private ReponsePaiementMulti gererDeadHeatDeuxQuatriemes(PariMulti pari, ResultatCourse resultat, Double masseAPartager) {
private ReponsePaiementMulti gererDeadHeatDeuxQuatriemes(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) {
// Article 3h: Implémentation spécifique
return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0);
}
private ReponsePaiementMulti calculerPaiementGeneriqueDeadHeat(PariMulti pari, ResultatCourse resultat,
private ReponsePaiementMulti calculerPaiementGeneriqueDeadHeat(PariMulti pari, ResultatCourseMulti resultat,
Double masseAPartager, Double coefficient) {
// Méthode générique pour les dead-heat avec coefficient spécifique
List<Cheval> chevauxPari = pari.getChevauxSelectionnes();
List<ChevalMulti> chevauxPari = pari.getChevauxSelectionnes();
if (chevauxPari.stream().allMatch(cheval ->
estDansListe(cheval, resultat.getPremiers()) ||
@@ -676,14 +676,14 @@ public class ServiceMulti {
return resultat;
}
private int compterCombinaisonsGagnantesDeadHeat(ResultatCourse resultat) {
private int compterCombinaisonsGagnantesDeadHeat(ResultatCourseMulti resultat) {
// Comptage simplifié des combinaisons gagnantes
// Implémentation réelle dépendrait de la structure exacte du dead-heat
return 1;
}
// Gestion de la cagnotte (Articles 9 et 10)
private void transfererEnCagnotte(ResultatCourse resultat) {
private void transfererEnCagnotte(ResultatCourseMulti resultat) {
CagnotteMulti cagnotte = CagnotteMulti.builder()
.montant(resultat.getMasseAPartager())
.dateCreation(LocalDateTime.now())
@@ -707,7 +707,7 @@ public class ServiceMulti {
cagnotteRepository.save(cagnotte);
// Ajouter le montant à la masse à partager de la course
ResultatCourse resultat = resultatRepository.findByCourseId(courseId);
ResultatCourseMulti resultat = resultatRepository.findByCourseId(courseId);
if (resultat != null) {
resultat.setMasseAPartager(resultat.getMasseAPartager() + cagnotte.getMontant());
resultatRepository.save(resultat);
@@ -715,18 +715,18 @@ public class ServiceMulti {
}
// Méthodes utilitaires
private Double calculerMasseAPartager(ResultatCourse resultat) {
private Double calculerMasseAPartager(ResultatCourseMulti resultat) {
// Article 5: MAP = RNET - MREMB - PRELEV
return resultat.getRecetteNette() -
resultat.getMontantRembourse() -
resultat.getPrelevementsLegaux();
}
private ResultatCourse creerResultat(RequeteResultatMulti requete) {
Course course = courseRepository.findById(requete.getCourseId())
private ResultatCourseMulti creerResultat(RequeteResultatMulti requete) {
CourseMulti course = courseRepository.findById(requete.getCourseId())
.orElseThrow(() -> new RuntimeException("Course non trouvée"));
return ResultatCourse.builder()
return ResultatCourseMulti.builder()
.course(course)
.premiers(chevalRepository.findAllById(requete.getPremiersIds()))
.seconds(chevalRepository.findAllById(requete.getSecondsIds()))
@@ -752,7 +752,7 @@ public class ServiceMulti {
// Méthodes supplémentaires pour la gestion des cas particuliers (Article 9)
@Transactional
public List<ReponsePaiementMulti> gererCasParticuliers(RequeteResultatMulti requete) {
ResultatCourse resultat = creerResultat(requete);
ResultatCourseMulti resultat = creerResultat(requete);
List<PariMulti> paris = pariRepository.findByCourseId(requete.getCourseId());
// Article 9: Cas où il n'y a aucune mise sur la combinaison gagnante
@@ -763,7 +763,7 @@ public class ServiceMulti {
return calculerPaiements(requete);
}
private boolean existeParisGagnants(List<PariMulti> paris, ResultatCourse resultat) {
private boolean existeParisGagnants(List<PariMulti> paris, ResultatCourseMulti resultat) {
for (PariMulti pari : paris) {
if (estCombinaisonGagnante(pari.getChevauxSelectionnes(), resultat)) {
return true;
@@ -772,7 +772,7 @@ public class ServiceMulti {
return false;
}
private List<ReponsePaiementMulti> appliquerReglesDegradation(ResultatCourse resultat, List<PariMulti> paris) {
private List<ReponsePaiementMulti> appliquerReglesDegradation(ResultatCourseMulti resultat, List<PariMulti> paris) {
// Article 9: Application des règles de dégradation
List<ReponsePaiementMulti> paiements = new ArrayList<>();
Double masseAPartager = resultat.getMasseAPartager();
@@ -794,10 +794,10 @@ public class ServiceMulti {
return paiements;
}
private ReponsePaiementMulti calculerPaiementDegrade(PariMulti pari, ResultatCourse resultat,
private ReponsePaiementMulti calculerPaiementDegrade(PariMulti pari, ResultatCourseMulti resultat,
Double masseAPartager, int niveauDegradation) {
// Implémentation des règles de dégradation selon l'article 9
List<Cheval> chevauxPari = pari.getChevauxSelectionnes();
List<ChevalMulti> chevauxPari = pari.getChevauxSelectionnes();
// Vérifier différents patterns de dégradation
boolean estGagnant = false;
@@ -826,15 +826,15 @@ public class ServiceMulti {
return null;
}
private boolean estPatternDegrade(List<Cheval> chevauxPari, ResultatCourse resultat,
private boolean estPatternDegrade(List<ChevalMulti> chevauxPari, ResultatCourseMulti resultat,
int pos1, int pos2, int pos3, int pos4) {
// Vérifier un pattern spécifique de dégradation
if (resultat.getOrdreArrivee().size() < 5) return false;
Cheval cheval1 = resultat.getOrdreArrivee().get(pos1);
Cheval cheval2 = resultat.getOrdreArrivee().get(pos2);
Cheval cheval3 = resultat.getOrdreArrivee().get(pos3);
Cheval cheval4 = resultat.getOrdreArrivee().get(pos4);
ChevalMulti cheval1 = resultat.getOrdreArrivee().get(pos1);
ChevalMulti cheval2 = resultat.getOrdreArrivee().get(pos2);
ChevalMulti cheval3 = resultat.getOrdreArrivee().get(pos3);
ChevalMulti cheval4 = resultat.getOrdreArrivee().get(pos4);
return chevauxPari.contains(cheval1) &&
chevauxPari.contains(cheval2) &&
@@ -858,7 +858,7 @@ public class ServiceMulti {
}
public Double getMasseAPartagerCourse(Long courseId) {
ResultatCourse resultat = resultatRepository.findByCourseId(courseId);
ResultatCourseMulti resultat = resultatRepository.findByCourseId(courseId);
return resultat != null ? resultat.getMasseAPartager() : 0.0;
}