commit v1
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user