diff --git a/src/main/java/com/pmu/jumele/controller/JumeleController.java b/src/main/java/com/pmu/jumele/controller/JumeleController.java deleted file mode 100644 index 819f861..0000000 --- a/src/main/java/com/pmu/jumele/controller/JumeleController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pmu.jumele.controller; - -import com.pmu.jumele.dto.*; -import com.pmu.jumele.service.JumeleGagnantService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -@RestController -@RequestMapping("/api/jumele") -public class JumeleController { - - private final JumeleGagnantService service; - - public JumeleController(JumeleGagnantService service) { - this.service = service; - } - - @PostMapping("/pari") - public ResponseEntity enregistrerPari(@RequestBody PariRequest req) { - try { - Map res = service.enregistrerPari(req); - return ResponseEntity.ok(res); - } catch (IllegalArgumentException ex) { - return ResponseEntity.badRequest().body(Map.of("error", ex.getMessage())); - } - } - - @PostMapping("/resultat") - public ResponseEntity calculer(@RequestBody PositionsRequest req) { - Map res = service.calculer(req); - return ResponseEntity.ok(res); - } - - @GetMapping("/paris/{courseId}") - public ResponseEntity listerParis(@PathVariable String courseId) { - return ResponseEntity.ok(service.getClass().getName()); // placeholder: add endpoint to fetch from repo if needed - } -} diff --git a/src/main/java/com/pmu/jumele/dto/PaiementResponse.java b/src/main/java/com/pmu/jumele/dto/PaiementResponse.java deleted file mode 100644 index fa34e6d..0000000 --- a/src/main/java/com/pmu/jumele/dto/PaiementResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pmu.jumele.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import java.math.BigDecimal; - -@Data -@AllArgsConstructor -public class PaiementResponse { - private String parieur; - private boolean gagnant; - private BigDecimal gain; - private String combinaison; -} diff --git a/src/main/java/com/pmu/jumele/dto/PariRequest.java b/src/main/java/com/pmu/jumele/dto/PariRequest.java deleted file mode 100644 index 20a6465..0000000 --- a/src/main/java/com/pmu/jumele/dto/PariRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pmu.jumele.dto; - -import lombok.Data; -import java.util.List; - -@Data -public class PariRequest { - private String parieur; - private String courseId; - private List chevaux; // can be 2 (unit), or list to generate combinations (combiné/champ) - private int mise; // montant total for the formula (we'll split for unitary bets) - private String formuleType; // "unitaire","combine","champ_total","champ_partiel" - private List champSelection; // used for champ partiel (if formuleType == champ_partiel) -} diff --git a/src/main/java/com/pmu/jumele/dto/PositionsRequest.java b/src/main/java/com/pmu/jumele/dto/PositionsRequest.java deleted file mode 100644 index 551fd71..0000000 --- a/src/main/java/com/pmu/jumele/dto/PositionsRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pmu.jumele.dto; - -import lombok.Data; -import java.util.List; - -@Data -public class PositionsRequest { - private String courseId; - // positions: list of positions; each position is a list of horse numbers (to represent dead-heat) - // positions.get(0) = list of horses classified first - // positions.get(1) = list of horses classified second, etc. - private List> positions; - private List nonPartants; // optional -} diff --git a/src/main/java/com/pmu/jumele/entity/PariEntity.java b/src/main/java/com/pmu/jumele/entity/PariEntity.java deleted file mode 100644 index 7037655..0000000 --- a/src/main/java/com/pmu/jumele/entity/PariEntity.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pmu.jumele.entity; - -import jakarta.persistence.*; -import lombok.*; - -import java.math.BigDecimal; - -@Entity -@Table(name = "paris_jumele") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class PariEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String parieur; - private String courseId; - // store combinaison as "a,b" - private String combinaison; - private BigDecimal mise; -} diff --git a/src/main/java/com/pmu/jumele/repository/PariRepository.java b/src/main/java/com/pmu/jumele/repository/PariRepository.java deleted file mode 100644 index 2468abb..0000000 --- a/src/main/java/com/pmu/jumele/repository/PariRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmu.jumele.repository; - -import com.pmu.jumele.entity.PariEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; - -public interface PariRepository extends JpaRepository { - List findByCourseId(String courseId); - List findByCourseIdAndParieurAndCombinaison(String courseId, String parieur, String combinaison); -} diff --git a/src/main/java/com/pmu/jumele/service/JumeleGagnantService.java b/src/main/java/com/pmu/jumele/service/JumeleGagnantService.java deleted file mode 100644 index 5cf63b6..0000000 --- a/src/main/java/com/pmu/jumele/service/JumeleGagnantService.java +++ /dev/null @@ -1,290 +0,0 @@ -package com.pmu.jumele.service; - -import com.pmu.jumele.dto.*; -import com.pmu.jumele.entity.PariEntity; -import com.pmu.jumele.repository.PariRepository; -import com.pmu.jumele.util.CombinaisonUtil; -import com.pmu.jumele.util.FormulesTable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.*; -import java.util.stream.Collectors; - -@Service -public class JumeleGagnantService { - - private final PariRepository pariRepository; - private static final BigDecimal MISE_MIN = BigDecimal.valueOf(500); - private static final int PLAFOND_MULT = 20; - private static final BigDecimal RAPPORT_MIN = BigDecimal.valueOf(1.1); - private static final int SCALE = 8; - - // prélèvements légaux (paramétrable) - private BigDecimal prelevements = BigDecimal.ZERO; - - public JumeleGagnantService(PariRepository pariRepository) { - this.pariRepository = pariRepository; - } - - public void setPrelevements(BigDecimal p) { this.prelevements = p == null ? BigDecimal.ZERO : p; } - - /** - * Enregistre un pari request — peut être unitaire ou une formule. - * Pour formules, convertit en paris unitaires (combinaisons) et enregistre chaque unité en respectant le tableau de valeurs. - */ - @Transactional - public Map enregistrerPari(PariRequest req) { - Map result = new HashMap<>(); - // validation minimale - if (req.getMise() < MISE_MIN.intValue()) throw new IllegalArgumentException("Mise minimum = 500"); - - // calculer unités - Set> combsToPlace = new HashSet<>(); - if ("unitaire".equalsIgnoreCase(req.getFormuleType()) || req.getChevaux().size() == 2) { - if (req.getChevaux().size() != 2) throw new IllegalArgumentException("Pari unitaire doit contenir 2 chevaux"); - combsToPlace.add(new HashSet<>(req.getChevaux())); - } else if ("combine".equalsIgnoreCase(req.getFormuleType())) { - combsToPlace = CombinaisonUtil.allPairs(req.getChevaux()); - } else if ("champ_total".equalsIgnoreCase(req.getFormuleType())) { - // champ total: base x all others; req.getChevaux() must contain base + others? - // For API simplicity: req.chevaux contains full list of partants; champ_total of a base is handled client-side by sending combos - combsToPlace = CombinaisonUtil.allPairs(req.getChevaux()); - } else if ("champ_partiel".equalsIgnoreCase(req.getFormuleType())) { - if (req.getChampSelection() == null || req.getChampSelection().isEmpty()) - throw new IllegalArgumentException("Champ partiel nécessite champSelection"); - // base is first element of req.chevaux - Integer base = req.getChevaux().get(0); - for (Integer c : req.getChampSelection()) { - combsToPlace.add(new HashSet<>(Arrays.asList(base, c))); - } - } else { - throw new IllegalArgumentException("FormuleType inconnu"); - } - - // valeur unitaire par combinaison : on divise la mise totale proportionnellement selon tableau ou uniformément - // Simplicité : on divise la mise totale uniformément par le nombre de combinaisons - int nbComb = combsToPlace.size(); - BigDecimal totalMise = BigDecimal.valueOf(req.getMise()); - BigDecimal miseUnitaire = totalMise.divide(BigDecimal.valueOf(nbComb), SCALE, RoundingMode.HALF_UP); - - // enregistrement avec respect du plafond 20 prises par parieur sur même combinaison - BigDecimal plafond = MISE_MIN.multiply(BigDecimal.valueOf(PLAFOND_MULT)); - BigDecimal totalRembourse = BigDecimal.ZERO; - List enregistrés = new ArrayList<>(); - - for (Set comb : combsToPlace) { - String combStr = CombinaisonUtil.combToString(comb); - // somme déjà engagée par ce parieur sur cette combinaison dans la même course - List deja = pariRepository.findByCourseIdAndParieurAndCombinaison(req.getCourseId(), req.getParieur(), combStr); - BigDecimal dejaTotal = deja.stream().map(PariEntity::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal disponible = plafond.subtract(dejaTotal); - BigDecimal toRecord = miseUnitaire.min(disponible); - BigDecimal toRefund = miseUnitaire.subtract(toRecord); - if (toRecord.compareTo(BigDecimal.ZERO) > 0) { - PariEntity e = PariEntity.builder() - .parieur(req.getParieur()) - .courseId(req.getCourseId()) - .combinaison(combStr) - .mise(toRecord) - .build(); - pariRepository.save(e); - enregistrés.add(e); - } - if (toRefund.compareTo(BigDecimal.ZERO) > 0) { - totalRembourse = totalRembourse.add(toRefund); - } - } - - result.put("enregistres", enregistrés.size()); - result.put("a_rembourser", totalRembourse.setScale(2, RoundingMode.HALF_UP)); - return result; - } - - /** - * Enregistre le résultat via PositionsRequest (positions = list of lists to express dead-heats). - */ - public void enregistrerResultat(PositionsRequest req) { - // store positions in memory — for calculation we require positions per course; for simplicity, pass positions during calcul. - // In this implementation, we'll pass PositionsRequest directly to calculer. - // To persist results, create a ResultEntity (omitted here). - } - - /** - * Calculer paiements pour une course en fournissant PositionsRequest (dead-heat possible). - */ - @Transactional(readOnly = true) - public Map calculer(PositionsRequest positionsReq) { - Map out = new HashMap<>(); - String courseId = positionsReq.getCourseId(); - List parisCourse = pariRepository.findByCourseId(courseId); - List nonPartants = positionsReq.getNonPartants() == null ? Collections.emptyList() : positionsReq.getNonPartants(); - - // 1) Générer combinaisons payables selon article 3: - // positionsReq.positions[0] => premiers (list), positionsReq.positions[1] => deuxiemes (list), etc. - List> positions = positionsReq.getPositions(); - if (positions == null || positions.size() < 2) { - // moins de deux classés => tout remboursé (Article 8) - List remboursements = parisCourse.stream() - .map(p -> new PaiementResponse(p.getParieur(), false, p.getMise(), p.getCombinaison())) - .collect(Collectors.toList()); - out.put("paiements", remboursements); - out.put("cagnotte", BigDecimal.ZERO.setScale(2)); - return out; - } - - Set> combPayables = new HashSet<>(); - // a) dead-heat premiers (positions[0] size >=2) -> toutes combinaisons 2-à-2 parmi premiers - List premiers = positions.get(0); - if (premiers.size() >= 2) { - combPayables.addAll(CombinaisonUtil.allPairs(premiers)); - } - - // b) dead-heat seconds (positions[1] size >=2) -> all pairs combining each premier with each second - List deuxiemes = positions.get(1); - if (deuxiemes.size() >= 1 && premiers.size() >= 1) { - for (Integer p : premiers) { - for (Integer d : deuxiemes) { - combPayables.add(new HashSet<>(Arrays.asList(p, d))); - } - } - } - - // c) if positions[0].size()==1 and positions[1].size()==1 and no dead-heat: comb = {1er,2e} - if (premiers.size() == 1 && deuxiemes.size() == 1) { - combPayables.add(new HashSet<>(Arrays.asList(premiers.get(0), deuxiemes.get(0)))); - } - - // Remove combos involving non-partants -> these combos are remboursed (Article 4) - Set> combRemb = combPayables.stream() - .filter(c -> c.stream().anyMatch(nonPartants::contains)) - .collect(Collectors.toSet()); - - // RNET = total des mises enregistrées sur la course - BigDecimal rnet = parisCourse.stream().map(PariEntity::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - - // MREMB = montant des mises sur combRemb - BigDecimal mremb = parisCourse.stream() - .filter(p -> combRemb.contains(stringToComb(p.getCombinaison()))) - .map(PariEntity::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - - BigDecimal map = rnet.subtract(mremb).subtract(prelevements); - if (map.compareTo(BigDecimal.ZERO) < 0) map = BigDecimal.ZERO; - - // Mises par combinaison (pour combPayables not remboursed) - Map, BigDecimal> misesParComb = new HashMap<>(); - for (Set comb : combPayables) { - if (combRemb.contains(comb)) { - misesParComb.put(comb, BigDecimal.ZERO); - } else { - BigDecimal s = parisCourse.stream() - .filter(p -> stringToComb(p.getCombinaison()).equals(comb)) - .map(PariEntity::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - misesParComb.put(comb, s); - } - } - - // cas : aucune comb active => cagnotte - List> combActives = misesParComb.entrySet().stream() - .filter(e -> e.getValue().compareTo(BigDecimal.ZERO) > 0) - .map(Map.Entry::getKey).collect(Collectors.toList()); - - BigDecimal cagnotte = BigDecimal.ZERO; - Map gains = new HashMap<>(); - - if (combActives.isEmpty()) { - cagnotte = cagnotte.add(map); - } else if (combActives.size() == 1) { - // cas normal unique combinaison - Set comb = combActives.get(0); - BigDecimal totMise = misesParComb.get(comb); - if (totMise.compareTo(BigDecimal.ZERO) == 0) { - cagnotte = cagnotte.add(map); - } else { - BigDecimal rapport = map.divide(totMise, SCALE, RoundingMode.HALF_UP).add(BigDecimal.ONE); - if (rapport.compareTo(RAPPORT_MIN) < 0) rapport = RAPPORT_MIN; - // payer chaque parieur sur la combinaison - for (PariEntity p : parisCourse) { - if (stringToComb(p.getCombinaison()).equals(comb)) { - BigDecimal gain = p.getMise().multiply(rapport).setScale(2, RoundingMode.HALF_UP); - gains.put(p.getParieur(), gains.getOrDefault(p.getParieur(), BigDecimal.ZERO).add(gain)); - } - } - } - } else { - // dead-heat / multiple combs payables - BigDecimal totalMisesOnCombActives = combActives.stream().map(misesParComb::get).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal benef = map.subtract(totalMisesOnCombActives); - if (benef.compareTo(BigDecimal.ZERO) < 0) benef = BigDecimal.ZERO; - int nbComb = combActives.size(); - BigDecimal partParComb = benef.divide(BigDecimal.valueOf(nbComb), SCALE, RoundingMode.HALF_UP); - - // allocate for each comb: partParComb distributed proportionally to mises on that comb - // but first for each comb we already have misesParComb.get(comb) that were removed from the map when computing benef - for (Set comb : combActives) { - BigDecimal misesThis = misesParComb.get(comb); - if (misesThis.compareTo(BigDecimal.ZERO) == 0) continue; - BigDecimal ratio = partParComb.divide(misesThis, SCALE, RoundingMode.HALF_UP); - BigDecimal rapport = ratio.add(BigDecimal.ONE); - if (rapport.compareTo(RAPPORT_MIN) < 0) rapport = RAPPORT_MIN; - for (PariEntity p : parisCourse) { - if (stringToComb(p.getCombinaison()).equals(comb)) { - BigDecimal gain = p.getMise().multiply(rapport).setScale(2, RoundingMode.HALF_UP); - gains.put(p.getParieur(), gains.getOrDefault(p.getParieur(), BigDecimal.ZERO).add(gain)); - } - } - } - - // traiter parts non couvertes (combActives avec mises 0): redistribuer their part among covered combs - BigDecimal partsNonCover = BigDecimal.ZERO; - for (Set comb : combActives) { - if (misesParComb.get(comb).compareTo(BigDecimal.ZERO) == 0) { - partsNonCover = partsNonCover.add(partParComb); - } - } - if (partsNonCover.compareTo(BigDecimal.ZERO) > 0) { - BigDecimal totalMisesCouvertes = combActives.stream() - .filter(c -> misesParComb.get(c).compareTo(BigDecimal.ZERO) > 0) - .map(misesParComb::get).reduce(BigDecimal.ZERO, BigDecimal::add); - if (totalMisesCouvertes.compareTo(BigDecimal.ZERO) == 0) { - cagnotte = cagnotte.add(map); - } else { - // redistribute partsNonCover to covered combos proportionally - for (Set comb : combActives) { - BigDecimal misesThis = misesParComb.get(comb); - if (misesThis.compareTo(BigDecimal.ZERO) == 0) continue; - BigDecimal share = partsNonCover.multiply(misesThis).divide(totalMisesCouvertes, SCALE, RoundingMode.HALF_UP); - // distribute share proportionally to parieurs on the comb - for (PariEntity p : parisCourse) { - if (stringToComb(p.getCombinaison()).equals(comb)) { - BigDecimal extra = p.getMise().multiply(share).divide(misesThis, SCALE, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP); - gains.put(p.getParieur(), gains.getOrDefault(p.getParieur(), BigDecimal.ZERO).add(extra)); - } - } - } - } - } - } - - // Build payment responses per record (each pari) - List payments = new ArrayList<>(); - for (PariEntity p : parisCourse) { - BigDecimal gain = gains.getOrDefault(p.getParieur(), BigDecimal.ZERO); - boolean gagnant = gain.compareTo(BigDecimal.ZERO) > 0; - payments.add(new PaiementResponse(p.getParieur(), gagnant, gain, p.getCombinaison())); - } - - out.put("paiements", payments); - out.put("cagnotte", cagnotte.setScale(2, RoundingMode.HALF_UP)); - out.put("rnet", rnet.setScale(2, RoundingMode.HALF_UP)); - out.put("mremb", mremb.setScale(2, RoundingMode.HALF_UP)); - out.put("map", map.setScale(2, RoundingMode.HALF_UP)); - return out; - } - - private Set stringToComb(String s) { - return Arrays.stream(s.split(",")).map(Integer::valueOf).collect(Collectors.toSet()); - } -} diff --git a/src/main/java/com/pmu/jumele/service/JumeleGagnantServiceTest.java b/src/main/java/com/pmu/jumele/service/JumeleGagnantServiceTest.java deleted file mode 100644 index 33ec928..0000000 --- a/src/main/java/com/pmu/jumele/service/JumeleGagnantServiceTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.pmu.jumele.service; - -import com.pmu.jumele.dto.PariRequest; -import com.pmu.jumele.dto.PositionsRequest; -import com.pmu.jumele.entity.PariEntity; -import com.pmu.jumele.repository.PariRepository; - -import org.springframework.beans.factory.annotation.Autowired; - - -import java.util.Arrays; -import java.util.List; -import java.util.Map; - - - -//@DataJpaTest -public class JumeleGagnantServiceTest { - - // @Autowired - PariRepository repo; - - // @Test - void test_simple_flow() { - JumeleGagnantService svc = new JumeleGagnantService(repo); - - PariRequest pr = new PariRequest(); - pr.setParieur("Alice"); - pr.setCourseId("C1"); - pr.setChevaux(Arrays.asList(1,2)); - pr.setMise(500); - pr.setFormuleType("unitaire"); - - svc.enregistrerPari(pr); - - // ajouter un autre pari sur la même comb - pr.setParieur("Bob"); - svc.enregistrerPari(pr); - - PositionsRequest pos = new PositionsRequest(); - pos.setCourseId("C1"); - pos.setPositions(List.of(List.of(1), List.of(2))); // 1er=1 ; 2e=2 - - Map res = svc.calculer(pos); - // assertThat(res).containsKey("paiements"); - } -} diff --git a/src/main/java/com/pmu/jumele/util/CombinaisonUtil.java b/src/main/java/com/pmu/jumele/util/CombinaisonUtil.java deleted file mode 100644 index 0bc65c6..0000000 --- a/src/main/java/com/pmu/jumele/util/CombinaisonUtil.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pmu.jumele.util; - -import java.util.*; -import java.util.stream.Collectors; - -public class CombinaisonUtil { - - // génère toutes paires (unordered) d'une liste de chevaux - public static Set> allPairs(List chevaux) { - Set> res = new HashSet<>(); - int n = chevaux.size(); - for (int i = 0; i < n; i++) { - for (int j = i+1; j < n; j++) { - res.add(new HashSet<>(Arrays.asList(chevaux.get(i), chevaux.get(j)))); - } - } - return res; - } - - // conversion Set -> "a,b" sorted string - public static String combToString(Set comb) { - return comb.stream().sorted().map(Object::toString).collect(Collectors.joining(",")); - } -} diff --git a/src/main/java/com/pmu/jumele/util/FormulesTable.java b/src/main/java/com/pmu/jumele/util/FormulesTable.java deleted file mode 100644 index 42c3a14..0000000 --- a/src/main/java/com/pmu/jumele/util/FormulesTable.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.pmu.jumele.util; - -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.Map; - -public class FormulesTable { - // For simplicity we store unit value per formula (complete combined) and simplified etc. - // We'll only need unit price to split a given "mise" into each unit bet when user submits a formula. - // Here we give reference table values per article 7 (unit values for "complete" formulas) - public static final Map COMBINED_COMPLETE = new HashMap<>(); - public static final Map COMBINED_SIMPLE = new HashMap<>(); - public static final Map CHAMP_TOTAL = new HashMap<>(); - public static final Map CHAMP_PARTIEL = new HashMap<>(); - - static { - // fill a subset (full table can be added) - COMBINED_COMPLETE.put(3, BigDecimal.valueOf(3000)); - COMBINED_COMPLETE.put(4, BigDecimal.valueOf(6000)); - COMBINED_COMPLETE.put(5, BigDecimal.valueOf(10000)); - // ... add rest as needed - - COMBINED_SIMPLE.put(3, BigDecimal.valueOf(1500)); - COMBINED_SIMPLE.put(4, BigDecimal.valueOf(3000)); - // ... - - CHAMP_TOTAL.put(3, BigDecimal.valueOf(1000)); - CHAMP_TOTAL.put(4, BigDecimal.valueOf(1500)); - // ... - - CHAMP_PARTIEL.put(3, BigDecimal.valueOf(1500)); - CHAMP_PARTIEL.put(4, BigDecimal.valueOf(2000)); - // ... - } -} diff --git a/src/main/java/com/pmu/mali/model/Pari.java b/src/main/java/com/pmu/mali/model/Pari.java deleted file mode 100644 index 039a980..0000000 --- a/src/main/java/com/pmu/mali/model/Pari.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pmu.mali.model; - -import lombok.AllArgsConstructor; -import lombok.Data; -import java.math.BigDecimal; - -@Data -@AllArgsConstructor -public class Pari { - private String parieur; // identifiant client ou ticket - private int numeroCheval; // numéro du cheval parié - private TypePari type; // SIMPLE_GAGNANT ou SIMPLE_PLACE - private BigDecimal mise; // montant mis (ex: 500) - private boolean nonPartant; // vrai si cheval non-partant (remboursement) - private String ecurieId; // identifiant d'écurie / coupling (null si aucun) -} diff --git a/src/main/java/com/pmu/mali/model/ResultatCourse.java b/src/main/java/com/pmu/mali/model/ResultatCourse.java deleted file mode 100644 index a0f3c2c..0000000 --- a/src/main/java/com/pmu/mali/model/ResultatCourse.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pmu.mali.model; - -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.util.List; - -@Data -@AllArgsConstructor -public class ResultatCourse { - // listes des numéros de chevaux classés (peuvent contenir plusieurs en cas de dead-heat) - private List premiers; // un ou plusieurs (dead-heat) - private List deuxiemes; // peut être vide - private List troisiemes; // peut être vide - private int nombrePartants; // nombre de chevaux engagés (programme officiel) -} diff --git a/src/main/java/com/pmu/mali/model/TypePari.java b/src/main/java/com/pmu/mali/model/TypePari.java deleted file mode 100644 index 2dcc88b..0000000 --- a/src/main/java/com/pmu/mali/model/TypePari.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pmu.mali.model; - -public enum TypePari { - SIMPLE_GAGNANT, - SIMPLE_PLACE -} diff --git a/src/main/java/com/pmu/mali/service/CalculPariService.java b/src/main/java/com/pmu/mali/service/CalculPariService.java deleted file mode 100644 index 0789f22..0000000 --- a/src/main/java/com/pmu/mali/service/CalculPariService.java +++ /dev/null @@ -1,367 +0,0 @@ -package com.pmu.mali.service; - -import com.pmu.mali.model.Pari; -import com.pmu.mali.model.ResultatCourse; -import com.pmu.mali.model.TypePari; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.*; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -/** - * Service de calcul des gains pour PARI SIMPLE (gagnant / placé) - * Implémente écurie, dead-heat, remboursements, cagnotte, rapport min. - */ -@Service -public class CalculPariService { - - private static final BigDecimal RAPPORT_MIN = BigDecimal.valueOf(1.1); // rapport minimum - private static final int SCALE = 6; // précision interne - - /** - * Résultat retourné : map parieur -> gain (montant payé, inclut la mise). - * On retourne aussi une structure pour la cagnotte (optionnel). - */ - public static class ResultatCalcul { - public Map gainsParParieur = new HashMap<>(); - public BigDecimal cagnotteGagnant = BigDecimal.ZERO; - public BigDecimal cagnottePlace = BigDecimal.ZERO; - } - - /** - * Point d'entrée principal. - * - * @param paris liste de paris (SIMPLE_GAGNANT et SIMPLE_PLACE mélangés) - * @param resultat résultat de la course - * @param prelevements montant total prélevé légalement (sur les deux types, si applicable) - * @return ResultatCalcul - */ - public ResultatCalcul calculer(List paris, ResultatCourse resultat, BigDecimal prelevements) { - ResultatCalcul res = new ResultatCalcul(); - - if (prelevements == null) prelevements = BigDecimal.ZERO; - - // Séparer paris par type - List parisGagnant = filterByType(paris, TypePari.SIMPLE_GAGNANT); - List parisPlace = filterByType(paris, TypePari.SIMPLE_PLACE); - - // 1) Remboursement des non-partants - BigDecimal rembGagnant = rembourserNonPartants(parisGagnant, res); - BigDecimal rembPlace = rembourserNonPartants(parisPlace, res); - - // 2) Calcul des masses à partager (RNET - MREMB - PRELEV) - BigDecimal masseGagnant = totalMise(parisGagnant).subtract(rembGagnant).subtract(prelevements); - BigDecimal massePlace = totalMise(parisPlace).subtract(rembPlace).subtract(prelevements); - - if (masseGagnant.compareTo(BigDecimal.ZERO) < 0) masseGagnant = BigDecimal.ZERO; - if (massePlace.compareTo(BigDecimal.ZERO) < 0) massePlace = BigDecimal.ZERO; - - // 3) Calcul gagnant (avec ecurie et dead-heat) - calculerGagnant(parisGagnant, resultat, masseGagnant, res); - - // 4) Calcul placé (avec règles 4-7 / >=8 et dead-heat) - calculerPlace(parisPlace, resultat, massePlace, res); - - return res; - } - - /* ---------------------- - Méthodes utilitaires - ---------------------- */ - - private List filterByType(List all, TypePari t) { - return all.stream().filter(p -> p.getType() == t).collect(Collectors.toList()); - } - - private BigDecimal totalMise(List list) { - return list.stream().map(Pari::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - } - - /** - * Rembourse toutes les mises dont pari.nonPartant == true - * Ajoute le montant remboursé aux gains du parieur. - * Retourne le total remboursé. - */ - private BigDecimal rembourserNonPartants(List list, ResultatCalcul res) { - return rembourserNonPartants(list, res.gainsParParieur); - } - - private BigDecimal rembourserNonPartants(List list, Map gainsMap) { - BigDecimal total = BigDecimal.ZERO; - for (Pari p : list) { - if (p.isNonPartant()) { - total = total.add(p.getMise()); - gainsMap.put(p.getParieur(), - gainsMap.getOrDefault(p.getParieur(), BigDecimal.ZERO).add(p.getMise())); - } - } - return total; - } - - /* --------------------------------------- - Calcul du GAGNANT (inclut dead-heat/ecurie) - --------------------------------------- */ - private void calculerGagnant(List parisGagnant, ResultatCourse resultat, BigDecimal masse, ResultatCalcul res) { - List premiers = resultat.getPremiers(); // liste des premiers (1 ou plusieurs) - if (premiers == null || premiers.isEmpty()) { - // Aucun cheval classé -> masse va en cagnotte - res.cagnotteGagnant = res.cagnotteGagnant.add(masse); - return; - } - - // Si arrivée normale (un seul premier) - if (premiers.size() == 1) { - int premier = premiers.get(0); - // déterminer écurie du cheval gagnant (s'il y a), puis totaliser mises sur l'écurie - // On crée une clé d'ecurie : si pari.ecurieId == null, utilises le numéro du cheval comme "ecurie" - Map miseParEcurie = new HashMap<>(); - for (Pari p : parisGagnant) { - if (p.isNonPartant()) continue; - String ecurie = keyEcurie(p); - // Si ce cheval appartient à l'écurie gagnante OU il est lui-même le gagnant, on prendra en compte - miseParEcurie.put(ecurie, miseParEcurie.getOrDefault(ecurie, BigDecimal.ZERO).add(p.getMise())); - } - - String ecurieGagnanteKey = null; - // trouver si le gagnant a une écurie dans les paris - Optional anyPariSurGagnant = parisGagnant.stream() - .filter(p -> p.getNumeroCheval() == premier && !p.isNonPartant()).findAny(); - if (anyPariSurGagnant.isPresent()) { - ecurieGagnanteKey = keyEcurie(anyPariSurGagnant.get()); - } else { - // pas de mise sur le gagnant -> vérifier s'il y a mises sur autres chevaux de la même écurie - // chercher toute mise sur chevaux avec même ecurieId (si ecurie known) - // Si pas de mise du tout sur la combinaison gagnante => cagnotte - // So we'll compute totalMisePayable below - } - - // calculer total des mises payables (mises sur le cheval gagnant et, si écurie, sur ses co-écuries) - BigDecimal totalMisePayable = BigDecimal.ZERO; - if (ecurieGagnanteKey != null) { - totalMisePayable = miseParEcurie.getOrDefault(ecurieGagnanteKey, BigDecimal.ZERO); - } else { - // pas de pari identifié sur gagnant -> peut être 0 - // cherché toutes mises portant exactement sur le cheval gagnant - totalMisePayable = parisGagnant.stream() - .filter(p -> p.getNumeroCheval() == premier && !p.isNonPartant()) - .map(Pari::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - } - - if (totalMisePayable.compareTo(BigDecimal.ZERO) <= 0) { - // Aucun pari sur le gagnant (ni sur son ecurie) => vers cagnotte - res.cagnotteGagnant = res.cagnotteGagnant.add(masse); - return; - } - - // Rapport brut = (masse / totalMisePayable) + 1 (on restitue la mise + bénéfice) - BigDecimal rapport = masse.divide(totalMisePayable, SCALE, RoundingMode.HALF_UP).add(BigDecimal.ONE); - if (rapport.compareTo(RAPPORT_MIN) < 0) rapport = RAPPORT_MIN; - - // payer chaque parieur ayant parié sur ce cheval/ecurie - for (Pari p : parisGagnant) { - if (p.isNonPartant()) continue; - String key = keyEcurie(p); - boolean payable = false; - if (ecurieGagnanteKey != null) { - // payables si même ecurie - payable = ecurieGagnanteKey.equals(key); - } else { - payable = (p.getNumeroCheval() == premier); - } - if (payable) { - BigDecimal gain = p.getMise().multiply(rapport).setScale(2, RoundingMode.HALF_UP); - res.gainsParParieur.put(p.getParieur(), - res.gainsParParieur.getOrDefault(p.getParieur(), BigDecimal.ZERO).add(gain)); - } - } - return; - } - - /* ------------------------- - * Cas dead-heat (plusieurs premiers) - * ------------------------- */ - // 1) calculer total mise sur les chevaux payables (les chevaux classés premiers) - // Règle du règlement : "le montant de toutes les mises sur les divers chevaux payables est d’abord retiré de la masse à partager." - BigDecimal misesSurPayables = parisGagnant.stream() - .filter(p -> !p.isNonPartant() && premiers.contains(p.getNumeroCheval())) - .map(Pari::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - - // Bénéfice à répartir - BigDecimal benefice = masse.subtract(misesSurPayables); - if (benefice.compareTo(BigDecimal.ZERO) < 0) benefice = BigDecimal.ZERO; - - int nbChevauxPremiers = premiers.size(); - if (nbChevauxPremiers == 0) { - res.cagnotteGagnant = res.cagnotteGagnant.add(masse); - return; - } - - // Diviser le bénéfice en autant de parts qu'il y a de chevaux classés premiers - BigDecimal partParCheval = benefice.divide(BigDecimal.valueOf(nbChevauxPremiers), SCALE, RoundingMode.HALF_UP); - - // Pour chaque cheval premier : répartir sa part au prorata des mises sur ce cheval - for (Integer cheval : premiers) { - // mises sur ce cheval - BigDecimal misesSurCheval = parisGagnant.stream() - .filter(p -> !p.isNonPartant() && p.getNumeroCheval() == cheval) - .map(Pari::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - - if (misesSurCheval.compareTo(BigDecimal.ZERO) == 0) { - // si aucune mise sur ce cheval, sa part est redistribuée entre les autres premiers - // impl: ajouter cette part à cagnotte temporaire pour redistribution - // pour simplicité on ajoute à cagnotte et on répartira après - res.cagnotteGagnant = res.cagnotteGagnant.add(partParCheval); - continue; - } - - // montant additionnel par unité de mise = partParCheval / misesSurCheval - BigDecimal ratio = partParCheval.divide(misesSurCheval, SCALE, RoundingMode.HALF_UP); - BigDecimal rapport = ratio.add(BigDecimal.ONE); // ajoute la mise - if (rapport.compareTo(RAPPORT_MIN) < 0) rapport = RAPPORT_MIN; - - // payer chaque parieur sur ce cheval - for (Pari p : parisGagnant) { - if (p.isNonPartant()) continue; - if (p.getNumeroCheval() == cheval) { - BigDecimal gain = p.getMise().multiply(rapport).setScale(2, RoundingMode.HALF_UP); - res.gainsParParieur.put(p.getParieur(), - res.gainsParParieur.getOrDefault(p.getParieur(), BigDecimal.ZERO).add(gain)); - } else { - // si écurie: si cheval p appartient à écurie du cheval premier, il peut avoir droit (règle d'écurie) - // on doit totaliser mises par écurie gagnante et partager la part correspondante. - } - } - } - - // NB: gestion complète des écuries dans dead-heat nécessite agrégation par ecurie + redistribution des parts relatives. - // Pour respecter à la lettre, on devrait : - // - agréger mises par ecurie pour les chevaux premiers, - // - distribuer la partParCheval à l'ecurie, puis parmi les chevaux de l'ecurie proportionnellement, - // - ci-dessus on a fait la distribution cheval-par-cheval (simplifié). - } - - private String keyEcurie(Pari p) { - if (p.getEcurieId() != null && !p.getEcurieId().trim().isEmpty()) { - return "E:" + p.getEcurieId(); - } else { - return "H:" + p.getNumeroCheval(); // seul cheval = sa "propre ecurie" - } - } - - /* --------------------------------------- - * Calcul du PLACE (inclut dead-heat/ecurie) - * --------------------------------------- */ - private void calculerPlace(List parisPlace, ResultatCourse resultat, BigDecimal masse, ResultatCalcul res) { - // déterminer horses payable: si >=8 partants => 3 places payées, si 4-7 => 2, sinon mise en cagnotte (article) - int nPartants = resultat.getNombrePartants(); - int nbPlacesPayees; - if (nPartants >= 8) nbPlacesPayees = 3; - else if (nPartants >= 4) nbPlacesPayees = 2; - else { - // si moins de 4 partants, la masse place va en cagnotte - res.cagnottePlace = res.cagnottePlace.add(masse); - return; - } - - // Construction des chevaux payables selon les listes de résultat : - // Remarque : listes peuvent contenir dead-heats (plusieurs elements) - List payables = new ArrayList<>(); - if (nbPlacesPayees == 2) { - payables.addAll(resultat.getPremiers()); - payables.addAll(resultat.getDeuxiemes()); - } else { - // 3 places - payables.addAll(resultat.getPremiers()); - payables.addAll(resultat.getDeuxiemes()); - payables.addAll(resultat.getTroisiemes()); - } - // on conserve distincts tout en gardant l'ordre logique - LinkedHashSet set = new LinkedHashSet<>(payables); - List chevauxPayables = new ArrayList<>(set); - - if (chevauxPayables.isEmpty()) { - res.cagnottePlace = res.cagnottePlace.add(masse); - return; - } - - // Retirer "le montant de toutes les mises sur les divers chevaux payables" de la masse - BigDecimal miseSurPayables = parisPlace.stream() - .filter(p -> !p.isNonPartant() && chevauxPayables.contains(p.getNumeroCheval())) - .map(Pari::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - - BigDecimal benefice = masse.subtract(miseSurPayables); - if (benefice.compareTo(BigDecimal.ZERO) < 0) benefice = BigDecimal.ZERO; - - // Le bénéfice est divisé en autant de parts égales qu'il y a de "combinaisons payables". - // Ici on considère "combinaisons payables" = nombre de positions payées (nbPlacesPayees) - // -> chaque part ensuite partagée proportionnellement entre chevaux payables de la position concernée. - BigDecimal partParCombinaison = benefice.divide(BigDecimal.valueOf(nbPlacesPayees), SCALE, RoundingMode.HALF_UP); - - // Répartition : pour chaque position (1er, 2e, 3e) on divise la part entre les chevaux classés à cette position - // puis, pour chaque cheval, on partage au prorata de ses mises sur cette position parmi les chevaux payables de la position. - // Simplification pratique: on va parcourir les positions et appliquer. - // Position 1 - List premiers = resultat.getPremiers(); - repartirPlacePosition(parisPlace, premiers, partParCombinaison, res); - - if (nbPlacesPayees >= 2) { - List deuxiemes = resultat.getDeuxiemes(); - repartirPlacePosition(parisPlace, deuxiemes, partParCombinaison, res); - } - if (nbPlacesPayees >= 3) { - List troisiemes = resultat.getTroisiemes(); - repartirPlacePosition(parisPlace, troisiemes, partParCombinaison, res); - } - - // Note : si pour une position donnée il n'y a aucune mise, selon le règlement sa part est répartie entre les autres chevaux payables. - // Ici, si aucune mise sur une position entière, on ajoute cette part à la cagnottePlace (impl simplifiée). - } - - private void repartirPlacePosition(List parisPlace, List chevauxPosition, BigDecimal partParCombinaison, ResultatCalcul res) { - if (chevauxPosition == null || chevauxPosition.isEmpty()) { - // pas de cheval classé à cette position -> part va en cagnotte - res.cagnottePlace = res.cagnottePlace.add(partParCombinaison); - return; - } - // total mises sur les chevaux de cette position - BigDecimal totalMises = parisPlace.stream() - .filter(p -> !p.isNonPartant() && chevauxPosition.contains(p.getNumeroCheval())) - .map(Pari::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - - if (totalMises.compareTo(BigDecimal.ZERO) == 0) { - // aucune mise sur cette position -> part est ajoutée à cagnotte pour redistribution (impl simplifiée) - res.cagnottePlace = res.cagnottePlace.add(partParCombinaison); - return; - } - - // chaque cheval recevra une fraction proportionnelle de la partParCombinaison - for (Integer cheval : chevauxPosition) { - BigDecimal misesSurCheval = parisPlace.stream() - .filter(p -> !p.isNonPartant() && p.getNumeroCheval() == cheval) - .map(Pari::getMise).reduce(BigDecimal.ZERO, BigDecimal::add); - - if (misesSurCheval.compareTo(BigDecimal.ZERO) == 0) continue; - - // montant additionnel pour ce cheval = partParCombinaison * (misesSurCheval / totalMises) - BigDecimal share = partParCombinaison.multiply(misesSurCheval).divide(totalMises, SCALE, RoundingMode.HALF_UP); - - // Le rapport brut pour chaque mise sur ce cheval = (share / misesSurCheval) + 1 - BigDecimal ratio = share.divide(misesSurCheval, SCALE, RoundingMode.HALF_UP); - BigDecimal rapport = ratio.add(BigDecimal.ONE); - if (rapport.compareTo(RAPPORT_MIN) < 0) rapport = RAPPORT_MIN; - - // appliquer paiement à tous les parieurs sur ce cheval - for (Pari p : parisPlace) { - if (p.isNonPartant()) continue; - if (p.getNumeroCheval() == cheval) { - BigDecimal gain = p.getMise().multiply(rapport).setScale(2, RoundingMode.HALF_UP); - res.gainsParParieur.put(p.getParieur(), - res.gainsParParieur.getOrDefault(p.getParieur(), BigDecimal.ZERO).add(gain)); - } - } - } - } -} diff --git a/src/main/java/com/pmu/mali/apiplr/ApiPlrApplication.java b/src/main/java/com/pmumali/ApiPlrApplication.java similarity index 91% rename from src/main/java/com/pmu/mali/apiplr/ApiPlrApplication.java rename to src/main/java/com/pmumali/ApiPlrApplication.java index 44ce885..8d14202 100644 --- a/src/main/java/com/pmu/mali/apiplr/ApiPlrApplication.java +++ b/src/main/java/com/pmumali/ApiPlrApplication.java @@ -1,4 +1,4 @@ -package com.pmu.mali.apiplr; +package com.pmumali; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/com/pmumali/ch10_multi/controller/ControleurMulti.java b/src/main/java/com/pmumali/ch10_multi/controller/ControleurMulti.java new file mode 100644 index 0000000..1df92f1 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/controller/ControleurMulti.java @@ -0,0 +1,95 @@ +package com.pmumali.ch10_multi.controller; + +import com.pmumali.ch10_multi.model.*; +import com.pmumali.ch10_multi.repository.*; +import com.pmumali.ch10_multi.service.ServiceMulti; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/multi") +@RequiredArgsConstructor +public class ControleurMulti { + + private final ServiceMulti serviceMulti; + private final PariMultiRepository pariRepository; + private final PaiementMultiRepository paiementRepository; + private final CagnotteMultiRepository cagnotteRepository; + + @PostMapping("/pari") + public ResponseEntity placerPari(@RequestBody RequetePariMulti requete) { + try { + PariMulti pari = serviceMulti.placerPari(requete); + return ResponseEntity.ok(pari); + } catch (Exception e) { + return ResponseEntity.badRequest().build(); + } + } + + @PostMapping("/calculer-paiements") + public ResponseEntity> calculerPaiements(@RequestBody RequeteResultatMulti requete) { + try { + List paiements = serviceMulti.calculerPaiements(requete); + return ResponseEntity.ok(paiements); + } catch (Exception e) { + return ResponseEntity.badRequest().build(); + } + } + + @GetMapping("/calcul-combinaison") + public ResponseEntity calculerCombinaison( + @RequestParam TypeMulti typeMulti, + @RequestParam TypeFormuleMulti typeFormule, + @RequestParam Integer nombreChevauxTotal, + @RequestParam Integer nombreChevauxBase) { + try { + CalculCombinaisonMulti resultat = serviceMulti.calculerCombinaison( + typeMulti, typeFormule, nombreChevauxTotal, nombreChevauxBase); + return ResponseEntity.ok(resultat); + } catch (Exception e) { + return ResponseEntity.badRequest().build(); + } + } + + @PostMapping("/cagnotte/{cagnotteId}/utiliser") + public ResponseEntity utiliserCagnotte( + @PathVariable Long cagnotteId, + @RequestParam Long courseId) { + try { + serviceMulti.utiliserCagnotte(cagnotteId, courseId); + return ResponseEntity.ok().build(); + } catch (Exception e) { + return ResponseEntity.badRequest().build(); + } + } + + @GetMapping("/cagnottes/disponibles") + public ResponseEntity> getCagnottesDisponibles() { + return ResponseEntity.ok(cagnotteRepository.findByUtilisee(false)); + } + + @GetMapping("/paris/course/{courseId}") + public ResponseEntity> getParisCourse(@PathVariable Long courseId) { + return ResponseEntity.ok(pariRepository.findByCourseId(courseId)); + } + + @GetMapping("/paiements/pari/{pariId}") + public ResponseEntity> getPaiementsPari(@PathVariable Long pariId) { + return ResponseEntity.ok(paiementRepository.findByPariId(pariId)); + } + + @GetMapping("/statistiques/course/{courseId}") + public ResponseEntity> getStatistiquesParis(@PathVariable Long courseId) { + Map stats = new HashMap<>(); + for (TypeMulti type : TypeMulti.values()) { + long count = pariRepository.findByCourseIdAndTypeMulti(courseId, type).size(); + stats.put(type, count); + } + return ResponseEntity.ok(stats); + } +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/CagnotteMulti.java b/src/main/java/com/pmumali/ch10_multi/model/CagnotteMulti.java new file mode 100644 index 0000000..edce4ed --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/CagnotteMulti.java @@ -0,0 +1,24 @@ +package com.pmumali.ch10_multi.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Table(name = "cagnotte_multi") +public class CagnotteMulti { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Double montant; + private LocalDateTime dateCreation; + private LocalDateTime dateUtilisation; + private Boolean utilisee; + private Long courseSourceId; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/CalculCombinaisonMulti.java b/src/main/java/com/pmumali/ch10_multi/model/CalculCombinaisonMulti.java new file mode 100644 index 0000000..0c4cf63 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/CalculCombinaisonMulti.java @@ -0,0 +1,15 @@ +package com.pmumali.ch10_multi.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CalculCombinaisonMulti { + private TypeMulti typeMulti; + private TypeFormuleMulti typeFormule; + private Integer nombreChevauxTotal; + private Integer nombreChevauxBase; + private Integer nombreCombinaisons; + private Double valeurMise; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/Cheval.java b/src/main/java/com/pmumali/ch10_multi/model/Cheval.java new file mode 100644 index 0000000..0c492a3 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/Cheval.java @@ -0,0 +1,20 @@ +package com.pmumali.ch10_multi.model; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Table(name = "cheval") +public class Cheval { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nom; + private Integer numero; + private Boolean nonPartant; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/Course.java b/src/main/java/com/pmumali/ch10_multi/model/Course.java new file mode 100644 index 0000000..6454acc --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/Course.java @@ -0,0 +1,29 @@ +package com.pmumali.ch10_multi.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Table(name = "course") +public class Course { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nom; + private LocalDateTime heureCourse; + private Integer nombreChevauxPartants; + + @OneToMany + private List chevaux; + + @Enumerated(EnumType.STRING) + private StatutCourse statut; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/PaiementMulti.java b/src/main/java/com/pmumali/ch10_multi/model/PaiementMulti.java new file mode 100644 index 0000000..cbf7e79 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/PaiementMulti.java @@ -0,0 +1,27 @@ +package com.pmumali.ch10_multi.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Table(name = "paiement_multi") +public class PaiementMulti { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private PariMulti pari; + + private Double montant; + private LocalDateTime heurePaiement; + + @Enumerated(EnumType.STRING) + private TypePaiementMulti typePaiement; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/PariMulti.java b/src/main/java/com/pmumali/ch10_multi/model/PariMulti.java new file mode 100644 index 0000000..a3de198 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/PariMulti.java @@ -0,0 +1,39 @@ +package com.pmumali.ch10_multi.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Table(name = "pari_multi") +public class PariMulti { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private Course course; + + @ManyToMany + private List chevauxSelectionnes; + + private Double mise; + private LocalDateTime heurePari; + + @Enumerated(EnumType.STRING) + private TypeMulti typeMulti; + + @Enumerated(EnumType.STRING) + private TypeFormuleMulti typeFormule; + + @ManyToOne + private Parieur parieur; + + private Integer nombreChevauxBase; +} diff --git a/src/main/java/com/pmumali/quarteplus/model/Parieur.java b/src/main/java/com/pmumali/ch10_multi/model/Parieur.java similarity index 89% rename from src/main/java/com/pmumali/quarteplus/model/Parieur.java rename to src/main/java/com/pmumali/ch10_multi/model/Parieur.java index dadc893..26dd65b 100644 --- a/src/main/java/com/pmumali/quarteplus/model/Parieur.java +++ b/src/main/java/com/pmumali/ch10_multi/model/Parieur.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch10_multi.model; import jakarta.persistence.*; import lombok.*; @@ -17,4 +17,4 @@ public class Parieur { private String nom; private String identification; private Double miseTotale; -} +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch10_multi/model/ReponsePaiementMulti.java b/src/main/java/com/pmumali/ch10_multi/model/ReponsePaiementMulti.java new file mode 100644 index 0000000..9b79849 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/ReponsePaiementMulti.java @@ -0,0 +1,13 @@ +package com.pmumali.ch10_multi.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ReponsePaiementMulti { + private Long pariId; + private Double montant; + private TypePaiementMulti typePaiement; + private String message; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/RequetePariMulti.java b/src/main/java/com/pmumali/ch10_multi/model/RequetePariMulti.java new file mode 100644 index 0000000..a99fdef --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/RequetePariMulti.java @@ -0,0 +1,15 @@ +package com.pmumali.ch10_multi.model; + +import lombok.Data; +import java.util.List; + +@Data +public class RequetePariMulti { + private Long courseId; + private List chevalIds; + private Double mise; + private TypeMulti typeMulti; + private TypeFormuleMulti typeFormule; + private Long parieurId; + private Integer nombreChevauxBase; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/RequeteResultatMulti.java b/src/main/java/com/pmumali/ch10_multi/model/RequeteResultatMulti.java new file mode 100644 index 0000000..40de365 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/RequeteResultatMulti.java @@ -0,0 +1,17 @@ +package com.pmumali.ch10_multi.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class RequeteResultatMulti { + private Long courseId; + private List premiersIds; + private List secondsIds; + private List troisiemesIds; + private List quatriemesIds; + private List ordreArriveeIds; + private Double recetteNette; + private Double prelevementsLegaux; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapport.java b/src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapport.java new file mode 100644 index 0000000..01e2ee2 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapport.java @@ -0,0 +1,12 @@ +package com.pmumali.ch10_multi.model; + +import lombok.Data; + +@Data +public class ResultatCalculRapport { + private Double rapportBase; + private Double rapportMulti4; + private Double rapportMulti5; + private Double rapportMulti6; + private Double rapportMulti7; +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/ResultatCourse.java b/src/main/java/com/pmumali/ch10_multi/model/ResultatCourse.java new file mode 100644 index 0000000..ac22761 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/ResultatCourse.java @@ -0,0 +1,41 @@ +package com.pmumali.ch10_multi.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Table(name = "resultat_course") +public class ResultatCourse { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private Course course; + + @ManyToMany + private List premiers; + + @ManyToMany + private List seconds; + + @ManyToMany + private List troisiemes; + + @ManyToMany + private List quatriemes; + + @ManyToMany + private List ordreArrivee; + + private Double recetteNette; + private Double montantRembourse; + private Double prelevementsLegaux; + private Double masseAPartager; +} diff --git a/src/main/java/com/pmumali/quarteplus/model/StatutCourse.java b/src/main/java/com/pmumali/ch10_multi/model/StatutCourse.java similarity index 64% rename from src/main/java/com/pmumali/quarteplus/model/StatutCourse.java rename to src/main/java/com/pmumali/ch10_multi/model/StatutCourse.java index 875b53f..52afa87 100644 --- a/src/main/java/com/pmumali/quarteplus/model/StatutCourse.java +++ b/src/main/java/com/pmumali/ch10_multi/model/StatutCourse.java @@ -1,5 +1,5 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch10_multi.model; public enum StatutCourse { PROGRAMMEE, EN_COURS, TERMINEE, ANNULEE -} +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/quarteplus/model/TypeDeadHeat.java b/src/main/java/com/pmumali/ch10_multi/model/TypeDeadHeat.java similarity index 88% rename from src/main/java/com/pmumali/quarteplus/model/TypeDeadHeat.java rename to src/main/java/com/pmumali/ch10_multi/model/TypeDeadHeat.java index e661c27..5e509fb 100644 --- a/src/main/java/com/pmumali/quarteplus/model/TypeDeadHeat.java +++ b/src/main/java/com/pmumali/ch10_multi/model/TypeDeadHeat.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch10_multi.model; public enum TypeDeadHeat { QUATRE_PREMIERS_OU_PLUS, diff --git a/src/main/java/com/pmumali/ch10_multi/model/TypeFormuleMulti.java b/src/main/java/com/pmumali/ch10_multi/model/TypeFormuleMulti.java new file mode 100644 index 0000000..d9266ad --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/TypeFormuleMulti.java @@ -0,0 +1,5 @@ +package com.pmumali.ch10_multi.model; + +public enum TypeFormuleMulti { + UNITAIRE, CHAMP_TOTAL, CHAMP_PARTIEL +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/TypeMulti.java b/src/main/java/com/pmumali/ch10_multi/model/TypeMulti.java new file mode 100644 index 0000000..12508ca --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/TypeMulti.java @@ -0,0 +1,5 @@ +package com.pmumali.ch10_multi.model; + +public enum TypeMulti { + MULTI_4, MULTI_5, MULTI_6, MULTI_7 +} diff --git a/src/main/java/com/pmumali/ch10_multi/model/TypePaiementMulti.java b/src/main/java/com/pmumali/ch10_multi/model/TypePaiementMulti.java new file mode 100644 index 0000000..1f6c05d --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/model/TypePaiementMulti.java @@ -0,0 +1,5 @@ +package com.pmumali.ch10_multi.model; + +public enum TypePaiementMulti { + MULTI_4, MULTI_5, MULTI_6, MULTI_7, REMBOURSEMENT +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/CagnotteMultiRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/CagnotteMultiRepository.java new file mode 100644 index 0000000..5074f11 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/CagnotteMultiRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.CagnotteMulti; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CagnotteMultiRepository extends JpaRepository { + List findByUtilisee(Boolean utilisee); + List findByCourseSourceId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ChevalRepository.java new file mode 100644 index 0000000..1b58a0b --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/ChevalRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.Cheval; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ChevalRepository extends JpaRepository { + List findByNonPartant(Boolean nonPartant); + List findByIdIn(List ids); +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/CourseRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/CourseRepository.java new file mode 100644 index 0000000..ca9dcce --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/CourseRepository.java @@ -0,0 +1,12 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.Course; +import com.pmumali.ch10_multi.model.StatutCourse; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CourseRepository extends JpaRepository { + List findByStatut(StatutCourse statut); + List findByNombreChevauxPartantsGreaterThanEqual(Integer nombre); +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/PaiementMultiRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/PaiementMultiRepository.java new file mode 100644 index 0000000..2dc9b0f --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/PaiementMultiRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.PaiementMulti; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface PaiementMultiRepository extends JpaRepository { + List findByPariId(Long pariId); + List findByPariCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/PariMultiRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/PariMultiRepository.java new file mode 100644 index 0000000..b867cd5 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/PariMultiRepository.java @@ -0,0 +1,14 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.PariMulti; +import com.pmumali.ch10_multi.model.TypeFormuleMulti; +import com.pmumali.ch10_multi.model.TypeMulti; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface PariMultiRepository extends JpaRepository { + List findByCourseId(Long courseId); + List findByParieurId(Long parieurId); + List findByCourseIdAndTypeMulti(Long courseId, TypeMulti typeMulti); + List findByCourseIdAndTypeFormule(Long courseId, TypeFormuleMulti typeFormule); +} diff --git a/src/main/java/com/pmumali/quatro/repository/ParieurRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ParieurRepository.java similarity index 70% rename from src/main/java/com/pmumali/quatro/repository/ParieurRepository.java rename to src/main/java/com/pmumali/ch10_multi/repository/ParieurRepository.java index a6a7e5f..55eac05 100644 --- a/src/main/java/com/pmumali/quatro/repository/ParieurRepository.java +++ b/src/main/java/com/pmumali/ch10_multi/repository/ParieurRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quatro.repository; +package com.pmumali.ch10_multi.repository; -import com.pmumali.quatro.model.Parieur; +import com.pmumali.ch10_multi.model.Parieur; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quarteplus/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseRepository.java similarity index 68% rename from src/main/java/com/pmumali/quarteplus/repository/ResultatCourseRepository.java rename to src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseRepository.java index 117badf..3d4c75c 100644 --- a/src/main/java/com/pmumali/quarteplus/repository/ResultatCourseRepository.java +++ b/src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quarteplus.repository; +package com.pmumali.ch10_multi.repository; -import com.pmumali.quarteplus.model.ResultatCourse; +import com.pmumali.ch10_multi.model.ResultatCourse; import org.springframework.data.jpa.repository.JpaRepository; public interface ResultatCourseRepository extends JpaRepository { diff --git a/src/main/java/com/pmumali/ch10_multi/service/ServiceMulti.java b/src/main/java/com/pmumali/ch10_multi/service/ServiceMulti.java new file mode 100644 index 0000000..072e447 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/service/ServiceMulti.java @@ -0,0 +1,875 @@ +package com.pmumali.ch10_multi.service; + +import com.pmumali.ch10_multi.model.*; +import com.pmumali.ch10_multi.repository.*; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + + +@Service +@RequiredArgsConstructor +public class ServiceMulti { + + private final PariMultiRepository pariRepository; + private final CourseRepository courseRepository; + private final ChevalRepository chevalRepository; + private final PaiementMultiRepository paiementRepository; + private final ResultatCourseRepository resultatRepository; + private final CagnotteMultiRepository cagnotteRepository; + private final ParieurRepository parieurRepository; + + private static final Double MISE_BASE = 500.0; + private static final Double MISE_MAX = 200 * MISE_BASE; + private static final Integer NOMBRE_CHEVAUX_MINIMUM = 10; + + // Coefficients pour le calcul des rapports (Article 5) + private static final Map COEFFICIENTS = Map.of( + TypeMulti.MULTI_4, 105, + TypeMulti.MULTI_5, 21, + TypeMulti.MULTI_6, 7, + TypeMulti.MULTI_7, 3 + ); + + // Rapports minimum (Article 6) + private static final Map RAPPORTS_MINIMUM = Map.of( + TypeMulti.MULTI_4, 1.6, + TypeMulti.MULTI_5, 1.4, + TypeMulti.MULTI_6, 1.2, + TypeMulti.MULTI_7, 1.1 + ); + + @Transactional + public PariMulti placerPari(RequetePariMulti requete) { + // Validation de la mise + if (requete.getMise() < MISE_BASE) { + throw new IllegalArgumentException("La mise doit être au moins " + MISE_BASE + " FCFA"); + } + + Course course = courseRepository.findById(requete.getCourseId()) + .orElseThrow(() -> new RuntimeException("Course non trouvée")); + + // Vérification du nombre minimum de chevaux + if (course.getNombreChevauxPartants() < NOMBRE_CHEVAUX_MINIMUM) { + throw new IllegalArgumentException("La course doit avoir au moins " + NOMBRE_CHEVAUX_MINIMUM + " chevaux partants"); + } + + List 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(); + 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()) + .orElseThrow(() -> new RuntimeException("Parieur non trouvé")); + + PariMulti pari = PariMulti.builder() + .course(course) + .chevauxSelectionnes(chevaux) + .mise(miseEffective) + .heurePari(LocalDateTime.now()) + .typeMulti(requete.getTypeMulti()) + .typeFormule(requete.getTypeFormule()) + .parieur(parieur) + .nombreChevauxBase(requete.getNombreChevauxBase()) + .build(); + + return pariRepository.save(pari); + } + + private void validerNombreChevaux(TypeMulti typeMulti, int nombreChevaux) { + switch (typeMulti) { + case MULTI_4: + if (nombreChevaux != 4) throw new IllegalArgumentException("MULTI en 4 nécessite exactement 4 chevaux"); + break; + case MULTI_5: + if (nombreChevaux != 5) throw new IllegalArgumentException("MULTI en 5 nécessite exactement 5 chevaux"); + break; + case MULTI_6: + if (nombreChevaux != 6) throw new IllegalArgumentException("MULTI en 6 nécessite exactement 6 chevaux"); + break; + case MULTI_7: + if (nombreChevaux != 7) throw new IllegalArgumentException("MULTI en 7 nécessite exactement 7 chevaux"); + break; + } + } + + private void validerNonPartants(TypeMulti typeMulti, long nonPartants) { + switch (typeMulti) { + case MULTI_4: + if (nonPartants >= 1) throw new IllegalArgumentException("MULTI en 4 ne permet pas de chevaux non-partants"); + break; + case MULTI_5: + if (nonPartants >= 2) throw new IllegalArgumentException("MULTI en 5 permet maximum 1 cheval non-partant"); + break; + case MULTI_6: + if (nonPartants >= 3) throw new IllegalArgumentException("MULTI en 6 permet maximum 2 chevaux non-partants"); + break; + case MULTI_7: + if (nonPartants >= 4) throw new IllegalArgumentException("MULTI en 7 permet maximum 3 chevaux non-partants"); + break; + } + } + + @Transactional + public List calculerPaiements(RequeteResultatMulti requete) { + ResultatCourse resultat = creerResultat(requete); + List paris = pariRepository.findByCourseId(requete.getCourseId()); + List paiements = new ArrayList<>(); + + // Vérifier si la course a moins de 10 chevaux (Article 1) + if (resultat.getCourse().getNombreChevauxPartants() < NOMBRE_CHEVAUX_MINIMUM) { + transfererEnCagnotte(resultat); + return paiements; + } + + // Calcul de la masse à partager selon l'article 5 + Double masseAPartager = calculerMasseAPartager(resultat); + resultat.setMasseAPartager(masseAPartager); + resultatRepository.save(resultat); + + // Gérer les cas de dead-heat si nécessaire + TypeDeadHeat typeDeadHeat = detecterDeadHeat(resultat); + if (typeDeadHeat != null) { + return gererDeadHeat(resultat, typeDeadHeat); + } + + // Calcul normal des paiements + Map> parisGagnantsParType = new HashMap<>(); + Map nombreParisGagnantsParType = new HashMap<>(); + + for (PariMulti pari : paris) { + ReponsePaiementMulti paiement = calculerPaiementPari(pari, resultat, masseAPartager); + if (paiement != null) { + paiements.add(paiement); + enregistrerPaiement(pari, paiement); + + // Compter les paris gagnants par type + TypeMulti typePari = getTypeMultiFromPaiement(paiement.getTypePaiement()); + parisGagnantsParType.computeIfAbsent(typePari, k -> new ArrayList<>()).add(pari); + nombreParisGagnantsParType.put(typePari, + nombreParisGagnantsParType.getOrDefault(typePari, 0) + 1); + } + } + + // Appliquer les règles de rapport minimum (Article 6) + appliquerReglesRapportMinimum(paiements, masseAPartager, nombreParisGagnantsParType); + + return paiements; + } + + private ReponsePaiementMulti calculerPaiementPari(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + List chevauxPari = pari.getChevauxSelectionnes(); + long nonPartants = chevauxPari.stream().filter(Cheval::getNonPartant).count(); + + // Article 4: Gestion des non-partants et transformations + if (doitEtreRembourse(pari.getTypeMulti(), nonPartants)) { + return new ReponsePaiementMulti(pari.getId(), pari.getMise(), + TypePaiementMulti.REMBOURSEMENT, "Remboursement selon article 4"); + } + + // Transformer les paris avec non-partants (Article 4) + TypeMulti typeTransforme = transformerPari(pari.getTypeMulti(), nonPartants); + List chevauxParticipants = chevauxPari.stream() + .filter(cheval -> !cheval.getNonPartant()) + .collect(Collectors.toList()); + + // Vérifier si les chevaux sont dans les 4 premiers + boolean estGagnant = estCombinaisonGagnante(chevauxParticipants, resultat); + + if (estGagnant) { + Double montant = calculerMontantPari(typeTransforme, masseAPartager); + TypePaiementMulti typePaiement = getTypePaiementFromTypeMulti(typeTransforme); + return new ReponsePaiementMulti(pari.getId(), montant, typePaiement, + "Paiement MULTI " + typeTransforme + " transformé"); + } + + return null; + } + + private boolean doitEtreRembourse(TypeMulti typeMulti, long nonPartants) { + switch (typeMulti) { + case MULTI_4: return nonPartants >= 1; + case MULTI_5: return nonPartants >= 2; + case MULTI_6: return nonPartants >= 3; + case MULTI_7: return nonPartants >= 4; + default: return false; + } + } + + private TypeMulti transformerPari(TypeMulti typeOriginal, long nonPartants) { + // Article 4: Transformations des paris avec non-partants + if (nonPartants == 0) return typeOriginal; + + switch (typeOriginal) { + case MULTI_5: + return nonPartants == 1 ? TypeMulti.MULTI_4 : typeOriginal; + case MULTI_6: + if (nonPartants == 1) return TypeMulti.MULTI_5; + if (nonPartants == 2) return TypeMulti.MULTI_4; + return typeOriginal; + case MULTI_7: + if (nonPartants == 1) return TypeMulti.MULTI_6; + if (nonPartants == 2) return TypeMulti.MULTI_5; + if (nonPartants == 3) return TypeMulti.MULTI_4; + return typeOriginal; + default: + return typeOriginal; + } + } + + private boolean estCombinaisonGagnante(List chevauxPari, ResultatCourse resultat) { + // Vérifier si au moins 4 chevaux sont dans les 4 premiers + long countDansTop4 = chevauxPari.stream() + .filter(cheval -> estDansTop4(cheval, resultat)) + .count(); + return countDansTop4 >= 4; + } + + private boolean estDansTop4(Cheval cheval, ResultatCourse resultat) { + return estDansListe(cheval, resultat.getPremiers()) || + estDansListe(cheval, resultat.getSeconds()) || + estDansListe(cheval, resultat.getTroisiemes()) || + estDansListe(cheval, resultat.getQuatriemes()); + } + + private boolean estDansListe(Cheval cheval, List liste) { + return liste != null && liste.contains(cheval); + } + + private Double calculerMontantPari(TypeMulti typeMulti, Double masseAPartager) { + // Article 5: Calcul basé sur les coefficients + int coefficient = COEFFICIENTS.get(typeMulti); + + // Calcul simplifié - en réalité, il faudrait compter le nombre de paris gagnants + return (masseAPartager * 0.25) / coefficient; // 25% de la masse pour chaque type + } + + private TypePaiementMulti getTypePaiementFromTypeMulti(TypeMulti typeMulti) { + switch (typeMulti) { + case MULTI_4: return TypePaiementMulti.MULTI_4; + case MULTI_5: return TypePaiementMulti.MULTI_5; + case MULTI_6: return TypePaiementMulti.MULTI_6; + case MULTI_7: return TypePaiementMulti.MULTI_7; + default: return TypePaiementMulti.REMBOURSEMENT; + } + } + + private TypeMulti getTypeMultiFromPaiement(TypePaiementMulti typePaiement) { + switch (typePaiement) { + case MULTI_4: return TypeMulti.MULTI_4; + case MULTI_5: return TypeMulti.MULTI_5; + case MULTI_6: return TypeMulti.MULTI_6; + case MULTI_7: return TypeMulti.MULTI_7; + default: return null; + } + } + + private void appliquerReglesRapportMinimum(List paiements, Double masseAPartager, + Map nombreParisGagnantsParType) { + // Article 6: Application des règles de rapport minimum + + // Étape 1: Vérifier MULTI_7 + Double rapportMulti7 = calculerRapportMoyen(paiements, TypeMulti.MULTI_7); + if (rapportMulti7 < RAPPORTS_MINIMUM.get(TypeMulti.MULTI_7)) { + ajusterRapportsMulti7(paiements, masseAPartager, nombreParisGagnantsParType); + // Recalculer après ajustement + rapportMulti7 = RAPPORTS_MINIMUM.get(TypeMulti.MULTI_7); + } + + // Étape 2: Vérifier MULTI_6 + Double rapportMulti6 = calculerRapportMoyen(paiements, TypeMulti.MULTI_6); + if (rapportMulti6 < RAPPORTS_MINIMUM.get(TypeMulti.MULTI_6)) { + ajusterRapportsMulti6(paiements, masseAPartager, nombreParisGagnantsParType); + rapportMulti6 = RAPPORTS_MINIMUM.get(TypeMulti.MULTI_6); + } + + // Étape 3: Vérifier MULTI_5 + Double rapportMulti5 = calculerRapportMoyen(paiements, TypeMulti.MULTI_5); + if (rapportMulti5 < RAPPORTS_MINIMUM.get(TypeMulti.MULTI_5)) { + ajusterRapportsMulti5(paiements, masseAPartager, nombreParisGagnantsParType); + rapportMulti5 = RAPPORTS_MINIMUM.get(TypeMulti.MULTI_5); + } + + // Étape 4: Vérifier MULTI_4 + Double rapportMulti4 = calculerRapportMoyen(paiements, TypeMulti.MULTI_4); + if (rapportMulti4 < RAPPORTS_MINIMUM.get(TypeMulti.MULTI_4)) { + ajusterRapportsMulti4(paiements, masseAPartager, nombreParisGagnantsParType); + } + } + + private Double calculerRapportMoyen(List paiements, TypeMulti typeMulti) { + TypePaiementMulti typePaiement = getTypePaiementFromTypeMulti(typeMulti); + List paiementsType = paiements.stream() + .filter(p -> p.getTypePaiement() == typePaiement) + .collect(Collectors.toList()); + + if (paiementsType.isEmpty()) { + return 0.0; + } + + return paiementsType.stream() + .mapToDouble(ReponsePaiementMulti::getMontant) + .average() + .orElse(0.0); + } + + private void ajusterRapportsMulti7(List paiements, Double masseAPartager, + Map nombreParisGagnantsParType) { + // Article 6.1: Ajustement MULTI_7 + TypePaiementMulti typePaiement = getTypePaiementFromTypeMulti(TypeMulti.MULTI_7); + int nombreGagnants = nombreParisGagnantsParType.getOrDefault(TypeMulti.MULTI_7, 0); + + if (nombreGagnants > 0) { + Double montantTotal = RAPPORTS_MINIMUM.get(TypeMulti.MULTI_7) * nombreGagnants; + + // Ajuster les montants + for (ReponsePaiementMulti paiement : paiements) { + if (paiement.getTypePaiement() == typePaiement) { + paiement.setMontant(RAPPORTS_MINIMUM.get(TypeMulti.MULTI_7)); + } + } + + // Réduire la masse à partager + masseAPartager -= montantTotal; + } + } + + private void ajusterRapportsMulti6(List paiements, Double masseAPartager, + Map nombreParisGagnantsParType) { + // Article 6.2: Ajustement MULTI_6 + TypePaiementMulti typePaiement = getTypePaiementFromTypeMulti(TypeMulti.MULTI_6); + int nombreGagnants = nombreParisGagnantsParType.getOrDefault(TypeMulti.MULTI_6, 0); + + if (nombreGagnants > 0) { + // Calculer le rapport de base + Double rapportBase = masseAPartager / (nombreGagnants * 1 + + nombreParisGagnantsParType.getOrDefault(TypeMulti.MULTI_5, 0) * 3 + + nombreParisGagnantsParType.getOrDefault(TypeMulti.MULTI_4, 0) * 15); + + // Ajuster les montants + for (ReponsePaiementMulti paiement : paiements) { + TypeMulti typeMulti = getTypeMultiFromPaiement(paiement.getTypePaiement()); + if (typeMulti == TypeMulti.MULTI_6) { + paiement.setMontant(rapportBase); + } else if (typeMulti == TypeMulti.MULTI_5) { + paiement.setMontant(rapportBase * 3); + } else if (typeMulti == TypeMulti.MULTI_4) { + paiement.setMontant(rapportBase * 15); + } + } + } + } + + private void ajusterRapportsMulti5(List paiements, Double masseAPartager, + Map nombreParisGagnantsParType) { + // Article 6.3: Ajustement MULTI_5 + TypePaiementMulti typePaiement = getTypePaiementFromTypeMulti(TypeMulti.MULTI_5); + int nombreGagnants = nombreParisGagnantsParType.getOrDefault(TypeMulti.MULTI_5, 0); + + if (nombreGagnants > 0) { + // Calculer le rapport de base + Double rapportBase = masseAPartager / (nombreGagnants * 1 + + nombreParisGagnantsParType.getOrDefault(TypeMulti.MULTI_4, 0) * 5); + + // Ajuster les montants + for (ReponsePaiementMulti paiement : paiements) { + TypeMulti typeMulti = getTypeMultiFromPaiement(paiement.getTypePaiement()); + if (typeMulti == TypeMulti.MULTI_5) { + paiement.setMontant(rapportBase); + } else if (typeMulti == TypeMulti.MULTI_4) { + paiement.setMontant(rapportBase * 5); + } + } + } + } + + private void ajusterRapportsMulti4(List paiements, Double masseAPartager, + Map nombreParisGagnantsParType) { + // Article 6.4: Ajustement MULTI_4 + TypePaiementMulti typePaiement = getTypePaiementFromTypeMulti(TypeMulti.MULTI_4); + int nombreGagnants = nombreParisGagnantsParType.getOrDefault(TypeMulti.MULTI_4, 0); + + if (nombreGagnants > 0) { + // Calculer le rapport de base + Double rapportBase = masseAPartager / nombreGagnants; + + // Forcer le rapport minimum si nécessaire + if (rapportBase < RAPPORTS_MINIMUM.get(TypeMulti.MULTI_4)) { + rapportBase = RAPPORTS_MINIMUM.get(TypeMulti.MULTI_4); + } + + // Ajuster les montants + for (ReponsePaiementMulti paiement : paiements) { + if (paiement.getTypePaiement() == typePaiement) { + paiement.setMontant(rapportBase); + } + } + } + } + + // Méthodes pour le calcul des combinaisons (Article 7) + public CalculCombinaisonMulti calculerCombinaison(TypeMulti typeMulti, TypeFormuleMulti typeFormule, + Integer nombreChevauxTotal, Integer nombreChevauxBase) { + Integer nombreCombinaisons = calculerNombreCombinaisons(typeMulti, typeFormule, nombreChevauxTotal, nombreChevauxBase); + Double valeurMise = nombreCombinaisons * MISE_BASE; + + return CalculCombinaisonMulti.builder() + .typeMulti(typeMulti) + .typeFormule(typeFormule) + .nombreChevauxTotal(nombreChevauxTotal) + .nombreChevauxBase(nombreChevauxBase) + .nombreCombinaisons(nombreCombinaisons) + .valeurMise(valeurMise) + .build(); + } + + private Integer calculerNombreCombinaisons(TypeMulti typeMulti, TypeFormuleMulti typeFormule, + Integer n, Integer p) { + if (typeFormule == TypeFormuleMulti.UNITAIRE) { + return 1; + } + + // Implémentation des formules de combinaison selon l'article 7 + switch (typeMulti) { + case MULTI_4: + return calculerCombinaisonsMulti4(typeFormule, n, p); + case MULTI_5: + return calculerCombinaisonsMulti5(typeFormule, n, p); + case MULTI_6: + return calculerCombinaisonsMulti6(typeFormule, n, p); + case MULTI_7: + return calculerCombinaisonsMulti7(typeFormule, n, p); + default: + return 0; + } + } + + private Integer calculerCombinaisonsMulti4(TypeFormuleMulti typeFormule, Integer n, Integer p) { + if (typeFormule == TypeFormuleMulti.CHAMP_TOTAL) { + if (p == 3) return n - 3; + if (p == 2) return (n - 2) * (n - 3) / 2; + if (p == 1) return (n - 1) * (n - 2) * (n - 3) / 6; + } else { + if (p == 3) return p; + if (p == 2) return p * (p - 1) / 2; + if (p == 1) return p * (p - 1) * (p - 2) / 6; + } + return 0; + } + + private Integer calculerCombinaisonsMulti5(TypeFormuleMulti typeFormule, Integer n, Integer p) { + if (typeFormule == TypeFormuleMulti.CHAMP_TOTAL) { + if (p == 4) return n - 4; + if (p == 3) return (n - 3) * (n - 4) / 2; + if (p == 2) return (n - 2) * (n - 3) * (n - 4) / 6; + if (p == 1) return (n - 1) * (n - 2) * (n - 3) * (n - 4) / 24; + } else { + if (p == 4) return p; + if (p == 3) return p * (p - 1) / 2; + if (p == 2) return p * (p - 1) * (p - 2) / 6; + if (p == 1) return p * (p - 1) * (p - 2) * (p - 3) / 24; + } + return 0; + } + + private Integer calculerCombinaisonsMulti6(TypeFormuleMulti typeFormule, Integer n, Integer p) { + if (typeFormule == TypeFormuleMulti.CHAMP_TOTAL) { + if (p == 5) return n - 5; + if (p == 4) return (n - 4) * (n - 5) / 2; + if (p == 3) return (n - 3) * (n - 4) * (n - 5) / 6; + if (p == 2) return (n - 2) * (n - 3) * (n - 4) * (n - 5) / 24; + if (p == 1) return (n - 1) * (n - 2) * (n - 3) * (n - 4) * (n - 5) / 120; + } else { + if (p == 5) return p; + if (p == 4) return p * (p - 1) / 2; + if (p == 3) return p * (p - 1) * (p - 2) / 6; + if (p == 2) return p * (p - 1) * (p - 2) * (p - 3) / 24; + if (p == 1) return p * (p - 1) * (p - 2) * (p - 3) * (p - 4) / 120; + } + return 0; + } + + private Integer calculerCombinaisonsMulti7(TypeFormuleMulti typeFormule, Integer n, Integer p) { + if (typeFormule == TypeFormuleMulti.CHAMP_TOTAL) { + if (p == 6) return n - 6; + if (p == 5) return (n - 5) * (n - 6) / 2; + if (p == 4) return (n - 4) * (n - 5) * (n - 6) / 6; + if (p == 3) return (n - 3) * (n - 4) * (n - 5) * (n - 6) / 24; + if (p == 2) return (n - 2) * (n - 3) * (n - 4) * (n - 5) * (n - 6) / 120; + if (p == 1) return (n - 1) * (n - 2) * (n - 3) * (n - 4) * (n - 5) * (n - 6) / 720; + } else { + if (p == 6) return p; + if (p == 5) return p * (p - 1) / 2; + if (p == 4) return p * (p - 1) * (p - 2) / 6; + if (p == 3) return p * (p - 1) * (p - 2) * (p - 3) / 24; + if (p == 2) return p * (p - 1) * (p - 2) * (p - 3) * (p - 4) / 120; + if (p == 1) return p * (p - 1) * (p - 2) * (p - 3) * (p - 4) * (p - 5) / 720; + } + return 0; + } + + // Gestion des dead-heat (Article 3) + private TypeDeadHeat detecterDeadHeat(ResultatCourse 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; + if (resultat.getPremiers().size() >= 2 && resultat.getTroisiemes().size() >= 2) + return TypeDeadHeat.DEUX_PREMIERS_DEUX_TROISIEMES; + if (resultat.getPremiers().size() >= 2 && resultat.getTroisiemes().size() == 1 && resultat.getQuatriemes().size() >= 1) + return TypeDeadHeat.DEUX_PREMIERS_UN_TROISIEME_UN_QUATRIEME; + if (resultat.getSeconds().size() >= 3) + return TypeDeadHeat.TROIS_SECONDS_OU_PLUS; + if (resultat.getSeconds().size() >= 2 && resultat.getQuatriemes().size() >= 1) + return TypeDeadHeat.DEUX_SECONDS_UN_QUATRIEME; + if (resultat.getTroisiemes().size() >= 2) + return TypeDeadHeat.DEUX_TROISIEMES_OU_PLUS; + if (resultat.getQuatriemes().size() >= 2) + return TypeDeadHeat.DEUX_QUATRIEMES_OU_PLUS; + + return null; + } + + private List gererDeadHeat(ResultatCourse resultat, TypeDeadHeat typeDeadHeat) { + List paris = pariRepository.findByCourseId(resultat.getCourse().getId()); + List paiements = new ArrayList<>(); + Double masseAPartager = resultat.getMasseAPartager(); + + for (PariMulti pari : paris) { + ReponsePaiementMulti paiement = calculerPaiementDeadHeat(pari, resultat, masseAPartager, typeDeadHeat); + if (paiement != null) { + paiements.add(paiement); + enregistrerPaiement(pari, paiement); + } + } + + return paiements; + } + + private ReponsePaiementMulti calculerPaiementDeadHeat(PariMulti pari, ResultatCourse resultat, + Double masseAPartager, TypeDeadHeat typeDeadHeat) { + // Implémentation spécifique pour chaque type de dead-heat + switch (typeDeadHeat) { + case QUATRE_PREMIERS_OU_PLUS: + return gererDeadHeatQuatrePremiers(pari, resultat, masseAPartager); + case TROIS_PREMIERS_UN_QUATRIEME: + return gererDeadHeatTroisPremiersUnQuatrieme(pari, resultat, masseAPartager); + case DEUX_PREMIERS_DEUX_TROISIEMES: + return gererDeadHeatDeuxPremiersDeuxTroisiemes(pari, resultat, masseAPartager); + case DEUX_PREMIERS_UN_TROISIEME_UN_QUATRIEME: + return gererDeadHeatDeuxPremiersUnTroisiemeUnQuatrieme(pari, resultat, masseAPartager); + case TROIS_SECONDS_OU_PLUS: + return gererDeadHeatTroisSeconds(pari, resultat, masseAPartager); + case DEUX_SECONDS_UN_QUATRIEME: + return gererDeadHeatDeuxSecondsUnQuatrieme(pari, resultat, masseAPartager); + case DEUX_TROISIEMES_OU_PLUS: + return gererDeadHeatDeuxTroisiemes(pari, resultat, masseAPartager); + case DEUX_QUATRIEMES_OU_PLUS: + return gererDeadHeatDeuxQuatriemes(pari, resultat, masseAPartager); + default: + return calculerPaiementPari(pari, resultat, masseAPartager); + } + } + + private ReponsePaiementMulti gererDeadHeatQuatrePremiers(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + // Article 3a: Dead-heat de 4+ chevaux premiers + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si tous les chevaux du pari sont parmi les premiers + if (chevauxPari.stream().allMatch(cheval -> estDansListe(cheval, resultat.getPremiers()))) { + int nombreCombinaisons = calculerNombreCombinaisonsDeadHeat(resultat.getPremiers().size(), 4); + Double montant = masseAPartager / nombreCombinaisons; + return new ReponsePaiementMulti(pari.getId(), montant, + TypePaiementMulti.MULTI_4, "Dead-Heat 4+ premiers"); + } + + return null; + } + + private ReponsePaiementMulti gererDeadHeatTroisPremiersUnQuatrieme(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + // Article 3b: Dead-heat de 3 premiers + 1+ quatrième + List chevauxPari = pari.getChevauxSelectionnes(); + + boolean troisPremiersOk = chevauxPari.subList(0, 3).stream() + .allMatch(cheval -> estDansListe(cheval, resultat.getPremiers())); + boolean quatriemeOk = estDansListe(chevauxPari.get(3), resultat.getQuatriemes()); + + if (troisPremiersOk && quatriemeOk) { + int nombreCombinaisons = resultat.getPremiers().size() * resultat.getQuatriemes().size(); + Double montant = (masseAPartager * 0.4) / (nombreCombinaisons * 6); // 40% pour l'ordre exact, 6 permutations + return new ReponsePaiementMulti(pari.getId(), montant, + TypePaiementMulti.MULTI_4, "Dead-Heat 3 premiers + 1 quatrième"); + } + + return null; + } + + // Implémentations similaires pour les autres types de dead-heat... + private ReponsePaiementMulti gererDeadHeatDeuxPremiersDeuxTroisiemes(PariMulti pari, ResultatCourse 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) { + // Article 3d: Implémentation spécifique + return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); + } + + private ReponsePaiementMulti gererDeadHeatTroisSeconds(PariMulti pari, ResultatCourse 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) { + // Article 3f: Implémentation spécifique + return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); + } + + private ReponsePaiementMulti gererDeadHeatDeuxTroisiemes(PariMulti pari, ResultatCourse 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) { + // Article 3h: Implémentation spécifique + return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); + } + + private ReponsePaiementMulti calculerPaiementGeneriqueDeadHeat(PariMulti pari, ResultatCourse resultat, + Double masseAPartager, Double coefficient) { + // Méthode générique pour les dead-heat avec coefficient spécifique + List chevauxPari = pari.getChevauxSelectionnes(); + + if (chevauxPari.stream().allMatch(cheval -> + estDansListe(cheval, resultat.getPremiers()) || + estDansListe(cheval, resultat.getSeconds()) || + estDansListe(cheval, resultat.getTroisiemes()) || + estDansListe(cheval, resultat.getQuatriemes()))) { + + int nombreCombinaisons = compterCombinaisonsGagnantesDeadHeat(resultat); + Double montant = (masseAPartager * 0.4) / (nombreCombinaisons * coefficient); + return new ReponsePaiementMulti(pari.getId(), montant, + TypePaiementMulti.MULTI_4, "Dead-Heat générique"); + } + return null; + } + + private int calculerNombreCombinaisonsDeadHeat(int nombreChevaux, int prise) { + // Calcul des combinaisons C(n, k) + if (prise == 0) return 1; + if (nombreChevaux < prise) return 0; + + int resultat = 1; + for (int i = 1; i <= prise; i++) { + resultat = resultat * (nombreChevaux - i + 1) / i; + } + return resultat; + } + + private int compterCombinaisonsGagnantesDeadHeat(ResultatCourse 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) { + CagnotteMulti cagnotte = CagnotteMulti.builder() + .montant(resultat.getMasseAPartager()) + .dateCreation(LocalDateTime.now()) + .utilisee(false) + .courseSourceId(resultat.getCourse().getId()) + .build(); + cagnotteRepository.save(cagnotte); + } + + @Transactional + public void utiliserCagnotte(Long cagnotteId, Long courseId) { + CagnotteMulti cagnotte = cagnotteRepository.findById(cagnotteId) + .orElseThrow(() -> new RuntimeException("Cagnotte non trouvée")); + + if (cagnotte.getUtilisee()) { + throw new RuntimeException("Cagnotte déjà utilisée"); + } + + cagnotte.setUtilisee(true); + cagnotte.setDateUtilisation(LocalDateTime.now()); + cagnotteRepository.save(cagnotte); + + // Ajouter le montant à la masse à partager de la course + ResultatCourse resultat = resultatRepository.findByCourseId(courseId); + if (resultat != null) { + resultat.setMasseAPartager(resultat.getMasseAPartager() + cagnotte.getMontant()); + resultatRepository.save(resultat); + } + } + + // Méthodes utilitaires + private Double calculerMasseAPartager(ResultatCourse 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()) + .orElseThrow(() -> new RuntimeException("Course non trouvée")); + + return ResultatCourse.builder() + .course(course) + .premiers(chevalRepository.findAllById(requete.getPremiersIds())) + .seconds(chevalRepository.findAllById(requete.getSecondsIds())) + .troisiemes(chevalRepository.findAllById(requete.getTroisiemesIds())) + .quatriemes(chevalRepository.findAllById(requete.getQuatriemesIds())) + .ordreArrivee(chevalRepository.findAllById(requete.getOrdreArriveeIds())) + .recetteNette(requete.getRecetteNette()) + .prelevementsLegaux(requete.getPrelevementsLegaux()) + .montantRembourse(0.0) + .build(); + } + + private void enregistrerPaiement(PariMulti pari, ReponsePaiementMulti reponse) { + PaiementMulti paiement = PaiementMulti.builder() + .pari(pari) + .montant(reponse.getMontant()) + .heurePaiement(LocalDateTime.now()) + .typePaiement(reponse.getTypePaiement()) + .build(); + paiementRepository.save(paiement); + } + + // Méthodes supplémentaires pour la gestion des cas particuliers (Article 9) + @Transactional + public List gererCasParticuliers(RequeteResultatMulti requete) { + ResultatCourse resultat = creerResultat(requete); + List paris = pariRepository.findByCourseId(requete.getCourseId()); + + // Article 9: Cas où il n'y a aucune mise sur la combinaison gagnante + if (!existeParisGagnants(paris, resultat)) { + return appliquerReglesDegradation(resultat, paris); + } + + return calculerPaiements(requete); + } + + private boolean existeParisGagnants(List paris, ResultatCourse resultat) { + for (PariMulti pari : paris) { + if (estCombinaisonGagnante(pari.getChevauxSelectionnes(), resultat)) { + return true; + } + } + return false; + } + + private List appliquerReglesDegradation(ResultatCourse resultat, List paris) { + // Article 9: Application des règles de dégradation + List paiements = new ArrayList<>(); + Double masseAPartager = resultat.getMasseAPartager(); + + // Essayer successivement les combinaisons dégradées + for (int i = 0; i < 4; i++) { + for (PariMulti pari : paris) { + ReponsePaiementMulti paiement = calculerPaiementDegrade(pari, resultat, masseAPartager, i); + if (paiement != null) { + paiements.add(paiement); + enregistrerPaiement(pari, paiement); + return paiements; // On s'arrête au premier succès + } + } + } + + // Si aucune combinaison dégradée ne fonctionne, transférer en cagnotte + transfererEnCagnotte(resultat); + return paiements; + } + + private ReponsePaiementMulti calculerPaiementDegrade(PariMulti pari, ResultatCourse resultat, + Double masseAPartager, int niveauDegradation) { + // Implémentation des règles de dégradation selon l'article 9 + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier différents patterns de dégradation + boolean estGagnant = false; + switch (niveauDegradation) { + case 0: // 1er, 2ème, 3ème, 5ème + estGagnant = estPatternDegrade(chevauxPari, resultat, 0, 1, 2, 4); + break; + case 1: // 1er, 2ème, 4ème, 5ème + estGagnant = estPatternDegrade(chevauxPari, resultat, 0, 1, 3, 4); + break; + case 2: // 1er, 3ème, 4ème, 5ème + estGagnant = estPatternDegrade(chevauxPari, resultat, 0, 2, 3, 4); + break; + case 3: // 2ème, 3ème, 4ème, 5ème + estGagnant = estPatternDegrade(chevauxPari, resultat, 1, 2, 3, 4); + break; + } + + if (estGagnant) { + Double montant = calculerMontantPari(pari.getTypeMulti(), masseAPartager); + TypePaiementMulti typePaiement = getTypePaiementFromTypeMulti(pari.getTypeMulti()); + return new ReponsePaiementMulti(pari.getId(), montant, typePaiement, + "Paiement dégradé niveau " + niveauDegradation); + } + + return null; + } + + private boolean estPatternDegrade(List chevauxPari, ResultatCourse 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); + + return chevauxPari.contains(cheval1) && + chevauxPari.contains(cheval2) && + chevauxPari.contains(cheval3) && + chevauxPari.contains(cheval4); + } + + // Méthodes pour les statistiques et rapports + public Map getStatistiquesParis(Long courseId) { + List paris = pariRepository.findByCourseId(courseId); + return paris.stream() + .collect(Collectors.groupingBy(PariMulti::getTypeMulti, + Collectors.summingInt(p -> 1))); + } + + public Map getStatistiquesFormules(Long courseId) { + List paris = pariRepository.findByCourseId(courseId); + return paris.stream() + .collect(Collectors.groupingBy(PariMulti::getTypeFormule, + Collectors.summingInt(p -> 1))); + } + + public Double getMasseAPartagerCourse(Long courseId) { + ResultatCourse resultat = resultatRepository.findByCourseId(courseId); + return resultat != null ? resultat.getMasseAPartager() : 0.0; + } + + public List getCagnottesDisponibles() { + return cagnotteRepository.findByUtilisee(false); + } + + public List getHistoriquePaiementsParieur(Long parieurId) { + List paris = pariRepository.findByParieurId(parieurId); + return paris.stream() + .flatMap(pari -> paiementRepository.findByPariId(pari.getId()).stream()) + .collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch11_quinteplus/InitData.java b/src/main/java/com/pmumali/ch11_quinteplus/InitData.java new file mode 100644 index 0000000..f28553d --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/InitData.java @@ -0,0 +1,67 @@ +package com.pmumali.ch11_quinteplus; + +import com.pmumali.ch11_quinteplus.model.Cheval; +import com.pmumali.ch11_quinteplus.model.Course; +import com.pmumali.ch11_quinteplus.repository.ChevalRepository; +import com.pmumali.ch11_quinteplus.repository.CourseRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import java.time.LocalDateTime; +import java.util.Arrays; + +@Component +public class InitData implements CommandLineRunner { + + @Autowired + private CourseRepository repositoryCourse; + + @Autowired + private ChevalRepository repositoryCheval; + + @Override + public void run(String... args) throws Exception { + // Création d'une course de test + Course course = new Course(); + course.setNom("Course du 15 août"); + course.setDate(LocalDateTime.now().plusDays(1)); + course.setLieu("Hippodrome de Bamako"); + course.setEstTerminee(false); + + Course courseSauvee = repositoryCourse.save(course); + + // Création de chevaux de test + Cheval cheval1 = new Cheval(); + cheval1.setNom("Foudre"); + cheval1.setNumero(1); + cheval1.setEstNonPartant(false); + cheval1.setCourse(courseSauvee); + + Cheval cheval2 = new Cheval(); + cheval2.setNom("Éclair"); + cheval2.setNumero(2); + cheval2.setEstNonPartant(false); + cheval2.setCourse(courseSauvee); + + Cheval cheval3 = new Cheval(); + cheval3.setNom("Tonnerre"); + cheval3.setNumero(3); + cheval3.setEstNonPartant(false); + cheval3.setCourse(courseSauvee); + + Cheval cheval4 = new Cheval(); + cheval4.setNom("Vent"); + cheval4.setNumero(4); + cheval4.setEstNonPartant(false); + cheval4.setCourse(courseSauvee); + + Cheval cheval5 = new Cheval(); + cheval5.setNom("Pluie"); + cheval5.setNumero(5); + cheval5.setEstNonPartant(false); + cheval5.setCourse(courseSauvee); + + repositoryCheval.saveAll(Arrays.asList(cheval1, cheval2, cheval3, cheval4, cheval5)); + } +} + diff --git a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCagnotte.java b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCagnotte.java new file mode 100644 index 0000000..8cd4c61 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCagnotte.java @@ -0,0 +1,34 @@ +package com.pmumali.ch11_quinteplus.controller; + + + +import com.pmumali.ch11_quinteplus.model.Cagnotte; +import com.pmumali.ch11_quinteplus.service.ServiceCagnotte; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@RestController +@RequestMapping("/api/cagnotte") +public class ControleurCagnotte { + + @Autowired + private ServiceCagnotte serviceCagnotte; + + @GetMapping("/montant") + public ResponseEntity getMontantCagnotteActive() { + return ResponseEntity.ok(serviceCagnotte.getMontantCagnotteActive()); + } + + @GetMapping("/historique") + public ResponseEntity> getHistoriqueCagnottes() { + return ResponseEntity.ok(serviceCagnotte.getHistoriqueCagnottes()); + } + + @PostMapping("/gerer-cas-particuliers") + public ResponseEntity gererCasParticuliers() { + serviceCagnotte.gererCasParticuliersCagnotte(); + return ResponseEntity.ok("Cas particuliers de cagnotte gérés avec succès"); + } +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourse.java b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourse.java new file mode 100644 index 0000000..a553dce --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourse.java @@ -0,0 +1,55 @@ +package com.pmumali.ch11_quinteplus.controller; + +import com.pmumali.ch11_quinteplus.model.Course; +import com.pmumali.ch11_quinteplus.service.ServiceCourse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/courses") +public class ControleurCourse { + + @Autowired + private ServiceCourse serviceCourse; + + @PostMapping + public ResponseEntity creerCourse(@RequestBody Course course) { + return ResponseEntity.ok(serviceCourse.creerCourse(course)); + } + + @GetMapping + public ResponseEntity> obtenirToutesCourses() { + return ResponseEntity.ok(serviceCourse.obtenirToutesCourses()); + } + + @GetMapping("/{id}") + public ResponseEntity obtenirCourseParId(@PathVariable Long id) { + Course course = serviceCourse.obtenirCourseParId(id); + return course != null ? ResponseEntity.ok(course) : ResponseEntity.notFound().build(); + } + + @GetMapping("/terminees") + public ResponseEntity> obtenirCoursesTerminees() { + return ResponseEntity.ok(serviceCourse.obtenirCoursesTerminees()); + } + + @GetMapping("/avenir") + public ResponseEntity> obtenirCoursesAVenir() { + return ResponseEntity.ok(serviceCourse.obtenirCoursesAVenir()); + } + + @PutMapping("/{id}") + public ResponseEntity mettreAJourCourse(@PathVariable Long id, @RequestBody Course course) { + Course courseMaj = serviceCourse.mettreAJourCourse(id, course); + return courseMaj != null ? ResponseEntity.ok(courseMaj) : ResponseEntity.notFound().build(); + } + + @DeleteMapping("/{id}") + public ResponseEntity supprimerCourse(@PathVariable Long id) { + boolean supprime = serviceCourse.supprimerCourse(id); + return supprime ? ResponseEntity.ok().build() : ResponseEntity.notFound().build(); + } +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurGains.java b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurGains.java new file mode 100644 index 0000000..28f611a --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurGains.java @@ -0,0 +1,29 @@ +package com.pmumali.ch11_quinteplus.controller; + +import com.pmumali.ch11_quinteplus.model.Gains; +import com.pmumali.ch11_quinteplus.model.Resultat; +import com.pmumali.ch11_quinteplus.service.ServiceGains; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/gains") +public class ControleurGains { + + @Autowired + private ServiceGains serviceGains; + + @PostMapping("/calculer/{courseId}") + public ResponseEntity calculerGains(@PathVariable Long courseId, @RequestBody Resultat resultat) { + return ResponseEntity.ok(serviceGains.calculerGains(courseId, resultat)); + } + + @GetMapping("/course/{courseId}") + public ResponseEntity obtenirGainsParCourse(@PathVariable Long courseId) { + Gains gains = serviceGains.obtenirGainsParCourse(courseId); + return gains != null ? ResponseEntity.ok(gains) : ResponseEntity.notFound().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurPari.java b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurPari.java new file mode 100644 index 0000000..3ab1f06 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurPari.java @@ -0,0 +1,51 @@ +package com.pmumali.ch11_quinteplus.controller; + +import com.pmumali.ch11_quinteplus.model.Pari; +import com.pmumali.ch11_quinteplus.service.ServicePari; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/paris") +public class ControleurPari { + + @Autowired + private ServicePari servicePari; + + @PostMapping + public ResponseEntity placerPari(@RequestBody Pari pari) { + return ResponseEntity.ok(servicePari.placerPari(pari)); + } + + @GetMapping("/course/{courseId}") + public ResponseEntity> obtenirParisParCourse(@PathVariable Long courseId) { + return ResponseEntity.ok(servicePari.obtenirParisParCourse(courseId)); + } + + @GetMapping("/parieur/{nomParieur}") + public ResponseEntity> obtenirParisParParieur(@PathVariable String nomParieur) { + return ResponseEntity.ok(servicePari.obtenirParisParParieur(nomParieur)); + } + + @GetMapping("/{id}") + public ResponseEntity obtenirPariParId(@PathVariable Long id) { + Pari pari = servicePari.obtenirPariParId(id); + return pari != null ? ResponseEntity.ok(pari) : ResponseEntity.notFound().build(); + } + + @PutMapping("/{id}") + public ResponseEntity mettreAJourPari(@PathVariable Long id, @RequestBody Pari pari) { + Pari pariMaj = servicePari.mettreAJourPari(id, pari); + return pariMaj != null ? ResponseEntity.ok(pariMaj) : ResponseEntity.notFound().build(); + } + + @DeleteMapping("/{id}") + public ResponseEntity supprimerPari(@PathVariable Long id) { + boolean supprime = servicePari.supprimerPari(id); + return supprime ? ResponseEntity.ok().build() : ResponseEntity.notFound().build(); + } +} + diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Cagnotte.java b/src/main/java/com/pmumali/ch11_quinteplus/model/Cagnotte.java new file mode 100644 index 0000000..93d6b9a --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/Cagnotte.java @@ -0,0 +1,36 @@ +package com.pmumali.ch11_quinteplus.model; + +import jakarta.persistence.*; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class Cagnotte { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private double montant; + private LocalDateTime dateCreation; + private LocalDateTime dateDerniereModification; + private String statut; // ACTIVE, UTILISEE, REPORTEE + + @ManyToOne + @JoinColumn(name = "course_source_id") + private Course courseSource; + + @ManyToOne + @JoinColumn(name = "course_destination_id") + private Course courseDestination; + + private String typeCagnotte; // ORDRE_EXACT, ORDRE_INEXACT, COMBINEE + + public Cagnotte(double montant, Course courseSource, String typeCagnotte) { + this.montant = montant; + this.courseSource = courseSource; + this.typeCagnotte = typeCagnotte; + this.dateCreation = LocalDateTime.now(); + this.statut = "ACTIVE"; + } +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Cheval.java b/src/main/java/com/pmumali/ch11_quinteplus/model/Cheval.java new file mode 100644 index 0000000..a97edca --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/Cheval.java @@ -0,0 +1,23 @@ +package com.pmumali.ch11_quinteplus.model; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "cheval") +public class Cheval { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nom; + private int numero; + private boolean estNonPartant; + + @ManyToOne + @JoinColumn(name = "course_id") + private Course course; +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Course.java b/src/main/java/com/pmumali/ch11_quinteplus/model/Course.java new file mode 100644 index 0000000..0e8e0f2 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/Course.java @@ -0,0 +1,32 @@ +package com.pmumali.ch11_quinteplus.model; + +import jakarta.persistence.*; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "course") +public class Course { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nom; + private LocalDateTime date; + private String lieu; + private boolean estTerminee; + + @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) + private List chevaux; + + @OneToOne(mappedBy = "course", cascade = CascadeType.ALL) + private Resultat resultat; +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/CourseDto.java b/src/main/java/com/pmumali/ch11_quinteplus/model/CourseDto.java new file mode 100644 index 0000000..0397979 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/CourseDto.java @@ -0,0 +1,16 @@ +package com.pmumali.ch11_quinteplus.model; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class CourseDto { + private Long id; + private String nom; + private LocalDateTime date; + private String lieu; + private boolean estTerminee; + private List idsChevaux; +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Gains.java b/src/main/java/com/pmumali/ch11_quinteplus/model/Gains.java new file mode 100644 index 0000000..12d8866 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/Gains.java @@ -0,0 +1,33 @@ +package com.pmumali.ch11_quinteplus.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "gains") +public class Gains { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "course_id") + private Course course; + + private double masseOrdreExact; + private double masseOrdreInexact; + private double masseBonus4; + + private double dividendeOrdreExact; + private double dividendeOrdreInexact; + private double dividendeBonus4; + + private LocalDateTime dateCalcul; + + private double masseCagnotte; +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/GainsDto.java b/src/main/java/com/pmumali/ch11_quinteplus/model/GainsDto.java new file mode 100644 index 0000000..ed4f31a --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/GainsDto.java @@ -0,0 +1,18 @@ +package com.pmumali.ch11_quinteplus.model; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class GainsDto { + private Long id; + private Long courseId; + private double masseOrdreExact; + private double masseOrdreInexact; + private double masseBonus4; + private double dividendeOrdreExact; + private double dividendeOrdreInexact; + private double dividendeBonus4; + private LocalDateTime dateCalcul; +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Pari.java b/src/main/java/com/pmumali/ch11_quinteplus/model/Pari.java new file mode 100644 index 0000000..baf7181 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/Pari.java @@ -0,0 +1,36 @@ +package com.pmumali.ch11_quinteplus.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "pari") +public class Pari { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nomParieur; + private LocalDateTime datePari; + private double mise = 500.0; + + @ManyToOne + @JoinColumn(name = "course_id") + private Course course; + + @ElementCollection + private List chevauxSelectionnes; + + @ElementCollection + private List ordrePredit; + + private String typePari; + + private boolean estPaye; +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/PariDto.java b/src/main/java/com/pmumali/ch11_quinteplus/model/PariDto.java new file mode 100644 index 0000000..1c40a57 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/PariDto.java @@ -0,0 +1,19 @@ +package com.pmumali.ch11_quinteplus.model; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class PariDto { + private Long id; + private String nomParieur; + private LocalDateTime datePari; + private double mise; + private Long courseId; + private List chevauxSelectionnes; + private List ordrePredit; + private String typePari; + private boolean estPaye; +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Resultat.java b/src/main/java/com/pmumali/ch11_quinteplus/model/Resultat.java new file mode 100644 index 0000000..27adaad --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/Resultat.java @@ -0,0 +1,29 @@ +package com.pmumali.ch11_quinteplus.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "resultat") +public class Resultat { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToOne + @JoinColumn(name = "course_id") + private Course course; + + @ElementCollection + private List idsChevauxOrdreArrivee; + + private boolean aDeadHeat; + + @ElementCollection + private List positionsDeadHeat; +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteRepository.java new file mode 100644 index 0000000..3914911 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteRepository.java @@ -0,0 +1,14 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.Cagnotte; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CagnotteRepository extends JpaRepository { + List findByStatut(String statut); + List findByCourseSourceId(Long courseId); + List findByCourseDestinationId(Long courseId); + List findByTypeCagnotte(String typeCagnotte); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalRepository.java new file mode 100644 index 0000000..514e9e8 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalRepository.java @@ -0,0 +1,12 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.Cheval; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ChevalRepository extends JpaRepository { + List findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/CourseRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/CourseRepository.java new file mode 100644 index 0000000..42882cf --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/CourseRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.Course; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseRepository extends JpaRepository { + List findByEstTerminee(boolean estTerminee); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/GainsRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/GainsRepository.java new file mode 100644 index 0000000..ab98abd --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/GainsRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.Gains; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface GainsRepository extends JpaRepository { + Gains findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/PariRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/PariRepository.java new file mode 100644 index 0000000..1e7ab49 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/PariRepository.java @@ -0,0 +1,13 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.Pari; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PariRepository extends JpaRepository { + List findByCourseId(Long courseId); + List findByNomParieur(String nomParieur); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatRepository.java new file mode 100644 index 0000000..4c3cf6a --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatRepository.java @@ -0,0 +1,9 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.Resultat; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResultatRepository extends JpaRepository { + + Resultat findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCagnotte.java b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCagnotte.java new file mode 100644 index 0000000..f283f51 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCagnotte.java @@ -0,0 +1,251 @@ +package com.pmumali.ch11_quinteplus.service; + +import com.pmumali.ch11_quinteplus.model.*; +import com.pmumali.ch11_quinteplus.repository.CagnotteRepository; +import com.pmumali.ch11_quinteplus.repository.CourseRepository; +import com.pmumali.ch11_quinteplus.repository.GainsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +@Transactional +public class ServiceCagnotte { + + @Autowired + private CagnotteRepository cagnotteRepository; + + @Autowired + private CourseRepository repositoryCourse; + + @Autowired + private GainsRepository repositoryGains; + + // Méthode principale pour gérer la cagnotte selon l'article 9 + public void gererCagnotte(Gains gains, List paris, Resultat resultat) { + Course course = gains.getCourse(); + + // Vérifier s'il n'y a aucun gagnant dans une catégorie + List gagnantsOrdreExact = determinerGagnantsOrdreExact(paris, resultat); + List gagnantsOrdreInexact = determinerGagnantsOrdreInexact(paris, resultat); + + double montantCagnotte = 0.0; + boolean cagnotteOrdreExact = false; + boolean cagnotteOrdreInexact = false; + + // Article 9a: Aucun gagnant dans l'ordre exact + if (gagnantsOrdreExact.isEmpty()) { + montantCagnotte += gains.getMasseOrdreExact(); + gains.setMasseOrdreExact(0.0); + gains.setDividendeOrdreExact(0.0); + cagnotteOrdreExact = true; + } + + // Article 9a: Aucun gagnant dans l'ordre inexact + if (gagnantsOrdreInexact.isEmpty()) { + montantCagnotte += gains.getMasseOrdreInexact(); + gains.setMasseOrdreInexact(0.0); + gains.setDividendeOrdreInexact(0.0); + cagnotteOrdreInexact = true; + } + + // Si une cagnotte doit être créée + if (montantCagnotte > 0) { + String typeCagnotte = determinerTypeCagnotte(cagnotteOrdreExact, cagnotteOrdreInexact); + Cagnotte cagnotte = new Cagnotte(montantCagnotte, course, typeCagnotte); + cagnotteRepository.save(cagnotte); + + // Mettre à jour le gain avec le montant de la cagnotte + gains.setMasseCagnotte(montantCagnotte); + } + + // Gérer le report des cagnottes existantes vers la prochaine course + reporterCagnottesVersProchaineCourse(course); + } + + private String determinerTypeCagnotte(boolean ordreExact, boolean ordreInexact) { + if (ordreExact && ordreInexact) { + return "COMBINEE"; + } else if (ordreExact) { + return "ORDRE_EXACT"; + } else { + return "ORDRE_INEXACT"; + } + } + + // Méthode pour reporter les cagnottes vers la prochaine course + public void reporterCagnottesVersProchaineCourse(Course courseActuelle) { + // Trouver toutes les cagnottes actives + List cagnottesActives = cagnotteRepository.findByStatut("ACTIVE"); + + // Trouver la prochaine course + Course prochaineCourse = trouverProchaineCourse(courseActuelle); + + if (prochaineCourse != null) { + for (Cagnotte cagnotte : cagnottesActives) { + // Article 9b: Reporter la cagnotte vers la prochaine course + cagnotte.setCourseDestination(prochaineCourse); + cagnotte.setDateDerniereModification(LocalDateTime.now()); + cagnotteRepository.save(cagnotte); + } + } else { + // Article 9d: Si pas de course la semaine suivante, reporter à la prochaine disponible + for (Cagnotte cagnotte : cagnottesActives) { + cagnotte.setStatut("REPORTEE"); + cagnotte.setDateDerniereModification(LocalDateTime.now()); + cagnotteRepository.save(cagnotte); + } + } + } + + // Méthode pour appliquer les cagnottes reportées à une course + public void appliquerCagnottesReportees(Course course) { + // Trouver toutes les cagnottes reportées pour cette course + List cagnottesReportees = cagnotteRepository.findByCourseDestinationId(course.getId()); + + double montantTotalCagnotte = 0.0; + + for (Cagnotte cagnotte : cagnottesReportees) { + if ("REPORTEE".equals(cagnotte.getStatut())) { + montantTotalCagnotte += cagnotte.getMontant(); + + // Marquer la cagnotte comme utilisée + cagnotte.setStatut("UTILISEE"); + cagnotte.setDateDerniereModification(LocalDateTime.now()); + cagnotteRepository.save(cagnotte); + } + } + + // Appliquer la cagnotte à la masse à partager de la course + if (montantTotalCagnotte > 0) { + Optional gainsOpt = Optional.ofNullable(repositoryGains.findByCourseId(course.getId())); + + if (gainsOpt.isPresent()) { + Gains gains = gainsOpt.get(); + + // Article 9b: Ajouter la cagnotte à la masse à partager de l'ordre exact + gains.setMasseOrdreExact(gains.getMasseOrdreExact() + montantTotalCagnotte); + gains.setMasseCagnotte(montantTotalCagnotte); + + repositoryGains.save(gains); + } + } + } + + // Méthode pour trouver la prochaine course après une date donnée + private Course trouverProchaineCourse(Course courseActuelle) { + List toutesCourses = repositoryCourse.findAll(); + Course prochaineCourse = null; + + for (Course course : toutesCourses) { + if (course.getDate().isAfter(courseActuelle.getDate()) && + (prochaineCourse == null || course.getDate().isBefore(prochaineCourse.getDate()))) { + prochaineCourse = course; + } + } + + return prochaineCourse; + } + + // Méthode pour gérer les cas particuliers de cagnotte (Article 9c) + public void gererCasParticuliersCagnotte() { + // Article 9c: Si plusieurs cagnottes sont constituées dans l'intervalle, + // elles sont toutes ajoutées à la masse à partager de la prochaine course + + List cagnottesActives = cagnotteRepository.findByStatut("ACTIVE"); + + if (cagnottesActives.size() > 1) { + // Trouver la prochaine course + Course prochaineCourse = trouverProchaineCourseParDate(LocalDateTime.now()); + + if (prochaineCourse != null) { + double montantTotal = 0.0; + + for (Cagnotte cagnotte : cagnottesActives) { + montantTotal += cagnotte.getMontant(); + cagnotte.setCourseDestination(prochaineCourse); + cagnotte.setStatut("UTILISEE"); + cagnotte.setDateDerniereModification(LocalDateTime.now()); + cagnotteRepository.save(cagnotte); + } + + // Appliquer le montant total à la prochaine course + appliquerCagnotteACourse(prochaineCourse, montantTotal); + } + } + } + + private Course trouverProchaineCourseParDate(LocalDateTime date) { + List toutesCourses = repositoryCourse.findAll(); + Course prochaineCourse = null; + + for (Course course : toutesCourses) { + if (course.getDate().isAfter(date) && + (prochaineCourse == null || course.getDate().isBefore(prochaineCourse.getDate()))) { + prochaineCourse = course; + } + } + + return prochaineCourse; + } + + private void appliquerCagnotteACourse(Course course, double montant) { + Optional gainsOpt = Optional.ofNullable(repositoryGains.findByCourseId(course.getId())); + + if (gainsOpt.isPresent()) { + Gains gains = gainsOpt.get(); + gains.setMasseOrdreExact(gains.getMasseOrdreExact() + montant); + gains.setMasseCagnotte(montant); + repositoryGains.save(gains); + } else { + // Créer un gains pour la course si il n'existe pas encore + Gains gains = new Gains(); + gains.setCourse(course); + gains.setMasseOrdreExact(montant); + gains.setMasseCagnotte(montant); + gains.setDateCalcul(LocalDateTime.now()); + repositoryGains.save(gains); + } + } + + // Méthode pour obtenir le montant total de la cagnotte active + public double getMontantCagnotteActive() { + List cagnottesActives = cagnotteRepository.findByStatut("ACTIVE"); + return cagnottesActives.stream().mapToDouble(Cagnotte::getMontant).sum(); + } + + // Méthode pour obtenir l'historique des cagnottes + public List getHistoriqueCagnottes() { + return cagnotteRepository.findAll(); + } + + // Méthodes utilitaires pour déterminer les gagnants + private List determinerGagnantsOrdreExact(List paris, Resultat resultat) { + return paris.stream() + .filter(pari -> estOrdreExact(pari, resultat)) + .collect(Collectors.toList()); + } + + private List determinerGagnantsOrdreInexact(List paris, Resultat resultat) { + return paris.stream() + .filter(pari -> estOrdreInexact(pari, resultat)) + .collect(Collectors.toList()); + } + + private boolean estOrdreExact(Pari pari, Resultat resultat) { + return pari.getOrdrePredit().equals(resultat.getIdsChevauxOrdreArrivee()); + } + + private boolean estOrdreInexact(Pari pari, Resultat resultat) { + List chevauxArrivee = resultat.getIdsChevauxOrdreArrivee(); + List chevauxPari = pari.getChevauxSelectionnes(); + + return chevauxArrivee.containsAll(chevauxPari) && + !pari.getOrdrePredit().equals(chevauxArrivee); + } +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourse.java b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourse.java new file mode 100644 index 0000000..8d049b4 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourse.java @@ -0,0 +1,60 @@ +package com.pmumali.ch11_quinteplus.service; + +import com.pmumali.ch11_quinteplus.model.Course; +import com.pmumali.ch11_quinteplus.repository.ChevalRepository; +import com.pmumali.ch11_quinteplus.repository.CourseRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service +public class ServiceCourse { + + @Autowired + private CourseRepository repositoryCourse; + + @Autowired + private ChevalRepository repositoryCheval; + + public Course creerCourse(Course course) { + return repositoryCourse.save(course); + } + + public List obtenirToutesCourses() { + return repositoryCourse.findAll(); + } + + public Course obtenirCourseParId(Long id) { + return repositoryCourse.findById(id).orElse(null); + } + + public List obtenirCoursesTerminees() { + return repositoryCourse.findByEstTerminee(true); + } + + public List obtenirCoursesAVenir() { + return repositoryCourse.findByEstTerminee(false); + } + + public Course mettreAJourCourse(Long id, Course detailsCourse) { + Course course = repositoryCourse.findById(id).orElse(null); + if (course != null) { + course.setNom(detailsCourse.getNom()); + course.setDate(detailsCourse.getDate()); + course.setLieu(detailsCourse.getLieu()); + course.setEstTerminee(detailsCourse.isEstTerminee()); + return repositoryCourse.save(course); + } + return null; + } + + public boolean supprimerCourse(Long id) { + if (repositoryCourse.existsById(id)) { + repositoryCourse.deleteById(id); + return true; + } + return false; + } +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGains.java b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGains.java new file mode 100644 index 0000000..87e6799 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGains.java @@ -0,0 +1,1052 @@ +package com.pmumali.ch11_quinteplus.service; + +import com.pmumali.ch11_quinteplus.model.Course; +import com.pmumali.ch11_quinteplus.model.*; +import com.pmumali.ch11_quinteplus.model.Resultat; +import com.pmumali.ch11_quinteplus.repository.GainsRepository; +import com.pmumali.ch11_quinteplus.repository.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Transactional +public class ServiceGains { + + @Autowired + private PariRepository repositoryPari; + + @Autowired + private GainsRepository repositoryGains; + + @Autowired + private CourseRepository repositoryCourse; + + @Autowired + private ChevalRepository repositoryCheval; + + @Autowired + private ResultatRepository repositoryResultat; + + @Autowired + private ServiceCagnotte serviceCagnotte; + + private static final double MISE_DE_BASE = 500.0; + private static final double RAPPORT_MINIMUM = 1.1; + + public Gains calculerGains(Long courseId, Resultat resultat) { + Course course = repositoryCourse.findById(courseId) + .orElseThrow(() -> new RuntimeException("Course non trouvée")); + + // Appliquer les cagnottes reportées avant le calcul + appliquerCagnottesAvantCalcul(course); + + List tousParis = repositoryPari.findByCourseId(courseId); + + // Calcul de la recette nette (Article 5) + double totalMises = tousParis.stream().mapToDouble(Pari::getMise).sum(); + double recetteNette = totalMises; + + // Calcul des remboursements (Article 4) + double montantRemboursements = calculerRemboursements(tousParis, resultat); + + // Prélèvements légaux (exemple: 15% de prélèvements) + double prelevementsLegaux = recetteNette * 0.15; + + // Masse à partager (Article 5) + double masseAPartager = recetteNette - montantRemboursements - prelevementsLegaux; + + // Répartition de la masse à partager + double masseOrdreExact = masseAPartager * 0.40; + double masseOrdreInexact = masseAPartager * 0.35; + double masseBonus4 = masseAPartager * 0.25; + + // Calcul des rapports + Gains gains = new Gains(); + gains.setCourse(course); + gains.setMasseOrdreExact(masseOrdreExact); + gains.setMasseOrdreInexact(masseOrdreInexact); + gains.setMasseBonus4(masseBonus4); + gains.setDateCalcul(LocalDateTime.now()); + + // Calcul détaillé des gains selon les règles + calculerDetailsGains(gains, tousParis, resultat); + + // Appliquer les règles de proportion minimum (Article 6) + appliquerReglesProportionMinimum(gains, tousParis, resultat); + + // Gérer la cagnotte si nécessaire (Article 9) + gererCagnotte(gains, tousParis, resultat); + + return repositoryGains.save(gains); + } + + private double calculerRemboursements(List paris, Resultat resultat) { + double remboursements = 0.0; + + for (Pari pari : paris) { + int nombreNonPartants = compterNonPartants(pari); + if (nombreNonPartants >= 2) { + // Article 4a: Remboursement si 2 chevaux ou plus non partants + remboursements += pari.getMise(); + pari.setEstPaye(true); // Marquer comme remboursé + } else if (nombreNonPartants == 1) { + // Article 4b: Bonus 4 si un seul non-partant et les 4 autres sont dans les 4 premiers + if (!sontQuatrePremiers(pari, resultat)) { + remboursements += pari.getMise(); + pari.setEstPaye(true); // Marquer comme remboursé + } + } + repositoryPari.save(pari); + } + + return remboursements; + } + + private int compterNonPartants(Pari pari) { + int compte = 0; + List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); + for (Cheval cheval : chevaux) { + if (cheval.isEstNonPartant()) { + compte++; + } + } + return compte; + } + + private boolean sontQuatrePremiers(Pari pari, Resultat resultat) { + // Vérifier si au moins 4 chevaux du pari sont dans les 4 premiers + if (resultat.getIdsChevauxOrdreArrivee().size() < 4) { + return false; + } + + List quatrePremiers = resultat.getIdsChevauxOrdreArrivee().subList(0, 4); + List chevauxPari = pari.getChevauxSelectionnes(); + + long compte = chevauxPari.stream() + .filter(quatrePremiers::contains) + .count(); + + return compte >= 4; + } + + private void calculerDetailsGains(Gains gains, List paris, Resultat resultat) { + // Compter les paris gagnants pour chaque type de gain + List parisOrdreExact = determinerGagnantsOrdreExact(paris, resultat); + List parisOrdreInexact = determinerGagnantsOrdreInexact(paris, resultat); + List parisBonus4 = determinerGagnantsBonus4(paris, resultat); + + // Gérer les cas de dead-heat + if (resultat.isADeadHeat()) { + Map resultatsDeadHeat = gererDeadHeat(resultat, paris); + parisOrdreExact = (List) resultatsDeadHeat.get("parisOrdreExact"); + parisOrdreInexact = (List) resultatsDeadHeat.get("parisOrdreInexact"); + parisBonus4 = (List) resultatsDeadHeat.get("parisBonus4"); + } + + // Calcul des dividendes + double totalMisesOrdreExact = parisOrdreExact.stream().mapToDouble(Pari::getMise).sum(); + double totalMisesOrdreInexact = parisOrdreInexact.stream().mapToDouble(Pari::getMise).sum(); + double totalMisesBonus4 = parisBonus4.stream().mapToDouble(Pari::getMise).sum(); + + if (totalMisesOrdreExact > 0) { + gains.setDividendeOrdreExact(gains.getMasseOrdreExact() / totalMisesOrdreExact); + } else { + gains.setDividendeOrdreExact(0.0); + } + + if (totalMisesOrdreInexact > 0) { + gains.setDividendeOrdreInexact(gains.getMasseOrdreInexact() / totalMisesOrdreInexact); + } else { + gains.setDividendeOrdreInexact(0.0); + } + + if (totalMisesBonus4 > 0) { + gains.setDividendeBonus4(gains.getMasseBonus4() / totalMisesBonus4); + } else { + gains.setDividendeBonus4(0.0); + } + + // Marquer les paris comme payés + parisOrdreExact.addAll(parisOrdreInexact); + parisOrdreExact.addAll(parisBonus4); + marquerParisPayes(parisOrdreExact); + } + + private List determinerGagnantsOrdreExact(List paris, Resultat resultat) { + return paris.stream() + .filter(pari -> estOrdreExact(pari, resultat)) + .collect(Collectors.toList()); + } + + private List determinerGagnantsOrdreInexact(List paris, Resultat resultat) { + return paris.stream() + .filter(pari -> estOrdreInexact(pari, resultat)) + .collect(Collectors.toList()); + } + + private List determinerGagnantsBonus4(List paris, Resultat resultat) { + return paris.stream() + .filter(pari -> estBonus4(pari, resultat)) + .collect(Collectors.toList()); + } + + private boolean estOrdreExact(Pari pari, Resultat resultat) { + // Vérifier si l'ordre prédit correspond exactement à l'ordre d'arrivée + return pari.getOrdrePredit().equals(resultat.getIdsChevauxOrdreArrivee()); + } + + private boolean estOrdreInexact(Pari pari, Resultat resultat) { + List chevauxArrivee = resultat.getIdsChevauxOrdreArrivee(); + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si les 5 chevaux sont dans les 5 premiers mais pas dans le bon ordre + return chevauxArrivee.containsAll(chevauxPari) && + !pari.getOrdrePredit().equals(chevauxArrivee); + } + + private boolean estBonus4(Pari pari, Resultat resultat) { + if (resultat.getIdsChevauxOrdreArrivee().size() < 4) { + return false; + } + + List quatrePremiers = resultat.getIdsChevauxOrdreArrivee().subList(0, 4); + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si au moins 4 chevaux du pari sont dans les 4 premiers + long compte = chevauxPari.stream() + .filter(quatrePremiers::contains) + .count(); + + return compte >= 4; + } + + private void marquerParisPayes(List paris) { + for (Pari pari : paris) { + if (!pari.isEstPaye()) { + // Vérifier si le pari est gagnant + Resultat resultat = repositoryResultat.findByCourseId(pari.getCourse().getId()); + if (estOrdreExact(pari, resultat) || estOrdreInexact(pari, resultat) || estBonus4(pari, resultat)) { + pari.setEstPaye(true); + repositoryPari.save(pari); + } + } + } + } + + private Map gererDeadHeat(Resultat resultat, List paris) { + Map resultatsDeadHeat = new HashMap<>(); + + // Déterminer le type de dead-heat et appliquer les règles appropriées + String typeDeadHeat = determinerTypeDeadHeat(resultat); + resultatsDeadHeat.put("typeDeadHeat", typeDeadHeat); + + List parisOrdreExact = new ArrayList<>(); + List parisOrdreInexact = new ArrayList<>(); + List parisBonus4 = new ArrayList<>(); + + switch (typeDeadHeat) { + case "CINQ_PREMIERS": + Map> resultats = traiterDeadHeatCinqPremiers(resultat, paris); + parisOrdreExact = resultats.get("ordreExact"); + parisOrdreInexact = resultats.get("ordreInexact"); + break; + + case "QUATRE_PREMIERS_UN_CINQUIEME": + Map> resultats2 = traiterDeadHeatQuatrePremiersUnCinquieme(resultat, paris); + parisOrdreExact = resultats2.get("ordreExact"); + parisOrdreInexact = resultats2.get("ordreInexact"); + break; + + case "TROIS_PREMIERS_DEUX_QUATRIEMES": + Map> resultats3 = traiterDeadHeatTroisPremiersDeuxQuatriemes(resultat, paris); + parisOrdreExact = resultats3.get("ordreExact"); + parisOrdreInexact = resultats3.get("ordreInexact"); + break; + + // Ajouter les autres cas de dead-heat selon l'article 3 + + default: + // Par défaut, utiliser la méthode standard de détermination des gagnants + parisOrdreExact = determinerGagnantsOrdreExact(paris, resultat); + parisOrdreInexact = determinerGagnantsOrdreInexact(paris, resultat); + parisBonus4 = determinerGagnantsBonus4(paris, resultat); + } + + resultatsDeadHeat.put("parisOrdreExact", parisOrdreExact); + resultatsDeadHeat.put("parisOrdreInexact", parisOrdreInexact); + resultatsDeadHeat.put("parisBonus4", parisBonus4); + + return resultatsDeadHeat; + } + + private String determinerTypeDeadHeat(Resultat resultat) { + // Implémentation de la logique pour déterminer le type de dead-heat + // Basé sur les positions avec dead-heat + + List positionsDeadHeat = resultat.getPositionsDeadHeat(); + if (positionsDeadHeat == null || positionsDeadHeat.isEmpty()) { + return "AUCUN"; + } + + Collections.sort(positionsDeadHeat); + + // Détermination basée sur les positions en dead-heat + if (positionsDeadHeat.contains(1) && positionsDeadHeat.size() >= 5) { + return "CINQ_PREMIERS"; + } else if (positionsDeadHeat.contains(1) && positionsDeadHeat.contains(2) + && positionsDeadHeat.contains(3) && positionsDeadHeat.contains(4)) { + return "QUATRE_PREMIERS_UN_CINQUIEME"; + } else if (positionsDeadHeat.contains(1) && positionsDeadHeat.contains(2) + && positionsDeadHeat.contains(3) && positionsDeadHeat.contains(4) + && positionsDeadHeat.contains(5)) { + return "TROIS_PREMIERS_DEUX_QUATRIEMES"; + } + // ... autres cas à implémenter selon l'article 3 + + return "AUTRE"; + } + + // Implémentations des différents cas de dead-heat (Article 3) + private Map> traiterDeadHeatCinqPremiers(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + List ordreExact = new ArrayList<>(); + List ordreInexact = new ArrayList<>(); + + // Article 3a: Dead-heat de cinq chevaux ou plus classés à la première place + // Tous les paris avec 5 chevaux parmi les premiers sont gagnants + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + + for (Pari pari : paris) { + if (chevauxPremiers.containsAll(pari.getChevauxSelectionnes())) { + if (estOrdreExact(pari, resultat)) { + ordreExact.add(pari); + } else { + ordreInexact.add(pari); + } + } + } + + resultats.put("ordreExact", ordreExact); + resultats.put("ordreInexact", ordreInexact); + return resultats; + } + + private Map> traiterDeadHeatQuatrePremiersUnCinquieme(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + List ordreExact = new ArrayList<>(); + List ordreInexact = new ArrayList<>(); + + // Article 3b: Dead-heat de quatre chevaux classés à la première place et un ou plusieurs classés cinquième + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + for (Pari pari : paris) { + // Vérifier si le pari contient les 4 premiers et un cinquième + if (chevauxPremiers.containsAll(pari.getChevauxSelectionnes().subList(0, 4)) && + chevauxCinquiemes.contains(pari.getChevauxSelectionnes().get(4))) { + + if (estOrdreExact(pari, resultat)) { + ordreExact.add(pari); + } else { + ordreInexact.add(pari); + } + } + } + + resultats.put("ordreExact", ordreExact); + resultats.put("ordreInexact", ordreInexact); + return resultats; + } + + private Map> traiterDeadHeatTroisPremiersDeuxQuatriemes(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + List ordreExact = new ArrayList<>(); + List ordreInexact = new ArrayList<>(); + + // Article 3c: Dead-heat de trois chevaux classés à la première place et deux chevaux classés à la quatrième place + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); + + for (Pari pari : paris) { + // Vérifier si le pari contient les 3 premiers et 2 quatrièmes + if (chevauxPremiers.containsAll(pari.getChevauxSelectionnes().subList(0, 3)) && + chevauxQuatriemes.containsAll(pari.getChevauxSelectionnes().subList(3, 5))) { + + if (estOrdreExact(pari, resultat)) { + ordreExact.add(pari); + } else { + ordreInexact.add(pari); + } + } + } + + resultats.put("ordreExact", ordreExact); + resultats.put("ordreInexact", ordreInexact); + return resultats; + } + private Map> traiterDeadHeatTroisPremiersUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3d: Dead-heat de trois chevaux classés à la première place, un seul classé quatrième et un ou plusieurs classés cinquième + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient 3 premiers, 1 quatrième et 1 cinquième + if (chevauxPremiers.containsAll(chevauxPari.subList(0, 3)) && + chevauxQuatriemes.contains(chevauxPari.get(3)) && + chevauxCinquiemes.contains(chevauxPari.get(4))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatDeuxPremiersTroisTroisiemes(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3e: Dead-heat de deux chevaux classés à la première place et trois chevaux ou plus classés à la troisième place + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient 2 premiers et 3 troisièmes + if (chevauxPremiers.containsAll(chevauxPari.subList(0, 2)) && + chevauxTroisiemes.containsAll(chevauxPari.subList(2, 5))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatDeuxPremiersDeuxTroisiemesUnCinquieme(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3f: Dead-heat de deux chevaux classés à la première place, deux chevaux classés à la troisième place et un ou plusieurs classés cinquième + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient 2 premiers, 2 troisièmes et 1 cinquième + if (chevauxPremiers.containsAll(chevauxPari.subList(0, 2)) && + chevauxTroisiemes.containsAll(chevauxPari.subList(2, 4)) && + chevauxCinquiemes.contains(chevauxPari.get(4))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatDeuxPremiersUnTroisiemeDeuxQuatriemes(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3g: Dead-heat de deux chevaux classés à la première place, un seul classé troisième et deux chevaux ou plus classés à la quatrième place + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); + List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient 2 premiers, 1 troisième et 2 quatrièmes + if (chevauxPremiers.containsAll(chevauxPari.subList(0, 2)) && + chevauxTroisiemes.contains(chevauxPari.get(2)) && + chevauxQuatriemes.containsAll(chevauxPari.subList(3, 5))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + + private Map> traiterDeadHeatDeuxPremiersUnTroisiemeUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3h: Dead-heat de deux chevaux classés à la première place, un cheval classé troisième, un cheval classé quatrième et un ou plusieurs classés cinquième + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); + List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient 2 premiers, 1 troisième, 1 quatrième et 1 cinquième + if (chevauxPremiers.containsAll(chevauxPari.subList(0, 2)) && + chevauxTroisiemes.contains(chevauxPari.get(2)) && + chevauxQuatriemes.contains(chevauxPari.get(3)) && + chevauxCinquiemes.contains(chevauxPari.get(4))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatQuatreDeuxiemes(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3i: Dead-heat de quatre chevaux ou plus classés à la deuxième place + List chevauxPremier = obtenirChevauxParPosition(resultat, 1); + List chevauxDeuxiemes = obtenirChevauxParPosition(resultat, 2); + + // Toutes les combinaisons de 4 chevaux parmi les deuxièmes + List> combinaisons = genererCombinaisons(chevauxDeuxiemes, 4); + + for (Pari pari : paris) { + for (List combinaison : combinaisons) { + List combinaisonComplete = new ArrayList<>(); + combinaisonComplete.add(chevauxPremier.get(0)); // Le cheval premier + combinaisonComplete.addAll(combinaison); + + if (new HashSet<>(pari.getChevauxSelectionnes()).equals(new HashSet<>(combinaisonComplete))) { + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + break; + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatTroisDeuxiemesUnCinquieme(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3j: Dead-heat de trois chevaux classés à la deuxième place et un ou plusieurs classés cinquième + List chevauxPremier = obtenirChevauxParPosition(resultat, 1); + List chevauxDeuxiemes = obtenirChevauxParPosition(resultat, 2); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient le premier, 3 deuxièmes et 1 cinquième + if (chevauxPari.contains(chevauxPremier.get(0)) && + chevauxDeuxiemes.containsAll(chevauxPari.subList(1, 4)) && + chevauxCinquiemes.contains(chevauxPari.get(4))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatDeuxDeuxiemesDeuxQuatriemes(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3k: Dead-heat de deux chevaux classés à la deuxième place et deux chevaux ou plus classés à la quatrième place + List chevauxPremier = obtenirChevauxParPosition(resultat, 1); + List chevauxDeuxiemes = obtenirChevauxParPosition(resultat, 2); + List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient le premier, 2 deuxièmes et 2 quatrièmes + if (chevauxPari.contains(chevauxPremier.get(0)) && + chevauxDeuxiemes.containsAll(chevauxPari.subList(1, 3)) && + chevauxQuatriemes.containsAll(chevauxPari.subList(3, 5))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatDeuxDeuxiemesUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3l: Dead-heat de deux chevaux classés deuxièmes, un cheval classé à la quatrième place et un ou plusieurs classés cinquième + List chevauxPremier = obtenirChevauxParPosition(resultat, 1); + List chevauxDeuxiemes = obtenirChevauxParPosition(resultat, 2); + List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient le premier, 2 deuxièmes, 1 quatrième et 1 cinquième + if (chevauxPari.contains(chevauxPremier.get(0)) && + chevauxDeuxiemes.containsAll(chevauxPari.subList(1, 3)) && + chevauxQuatriemes.contains(chevauxPari.get(3)) && + chevauxCinquiemes.contains(chevauxPari.get(4))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatTroisTroisiemes(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3m: Dead-heat de trois chevaux ou plus classés à la troisième place + List chevauxPremier = obtenirChevauxParPosition(resultat, 1); + List chevauxDeuxieme = obtenirChevauxParPosition(resultat, 2); + List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); + + // Toutes les combinaisons de 3 chevaux parmi les troisièmes + List> combinaisons = genererCombinaisons(chevauxTroisiemes, 3); + + for (Pari pari : paris) { + for (List combinaison : combinaisons) { + List combinaisonComplete = new ArrayList<>(); + combinaisonComplete.add(chevauxPremier.get(0)); // Le cheval premier + combinaisonComplete.add(chevauxDeuxieme.get(0)); // Le cheval deuxième + combinaisonComplete.addAll(combinaison); + + if (new HashSet<>(pari.getChevauxSelectionnes()).equals(new HashSet<>(combinaisonComplete))) { + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + break; + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatDeuxTroisiemesUnCinquieme(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3n: Dead-heat de deux chevaux classés à la troisième place et un ou plusieurs classés cinquième + List chevauxPremier = obtenirChevauxParPosition(resultat, 1); + List chevauxDeuxieme = obtenirChevauxParPosition(resultat, 2); + List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient le premier, le deuxième, 2 troisièmes et 1 cinquième + if (chevauxPari.contains(chevauxPremier.get(0)) && + chevauxPari.contains(chevauxDeuxieme.get(0)) && + chevauxTroisiemes.containsAll(chevauxPari.subList(2, 4)) && + chevauxCinquiemes.contains(chevauxPari.get(4))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatDeuxQuatriemes(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3o: Dead-heat de deux chevaux ou plus classés à la quatrième place + List chevauxPremier = obtenirChevauxParPosition(resultat, 1); + List chevauxDeuxieme = obtenirChevauxParPosition(resultat, 2); + List chevauxTroisieme = obtenirChevauxParPosition(resultat, 3); + List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); + + // Toutes les combinaisons de 2 chevaux parmi les quatrièmes + List> combinaisons = genererCombinaisons(chevauxQuatriemes, 2); + + for (Pari pari : paris) { + for (List combinaison : combinaisons) { + List combinaisonComplete = new ArrayList<>(); + combinaisonComplete.add(chevauxPremier.get(0)); // Le cheval premier + combinaisonComplete.add(chevauxDeuxieme.get(0)); // Le cheval deuxième + combinaisonComplete.add(chevauxTroisieme.get(0)); // Le cheval troisième + combinaisonComplete.addAll(combinaison); + + if (new HashSet<>(pari.getChevauxSelectionnes()).equals(new HashSet<>(combinaisonComplete))) { + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + break; + } + } + } + + return resultats; + } + + private Map> traiterDeadHeatDeuxCinquiemes(Resultat resultat, List paris) { + Map> resultats = new HashMap<>(); + resultats.put("ordreExact", new ArrayList<>()); + resultats.put("ordreInexact", new ArrayList<>()); + resultats.put("bonus4", new ArrayList<>()); + + // Article 3p: Dead-heat de deux chevaux ou plus classés à la cinquième place + List chevauxPremier = obtenirChevauxParPosition(resultat, 1); + List chevauxDeuxieme = obtenirChevauxParPosition(resultat, 2); + List chevauxTroisieme = obtenirChevauxParPosition(resultat, 3); + List chevauxQuatrieme = obtenirChevauxParPosition(resultat, 4); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + for (Pari pari : paris) { + List chevauxPari = pari.getChevauxSelectionnes(); + + // Vérifier si le pari contient les 4 premiers et 1 cinquième + if (chevauxPari.contains(chevauxPremier.get(0)) && + chevauxPari.contains(chevauxDeuxieme.get(0)) && + chevauxPari.contains(chevauxTroisieme.get(0)) && + chevauxPari.contains(chevauxQuatrieme.get(0)) && + chevauxCinquiemes.contains(chevauxPari.get(4))) { + + if (estOrdreExact(pari, resultat)) { + resultats.get("ordreExact").add(pari); + } else { + resultats.get("ordreInexact").add(pari); + } + } + } + + return resultats; + } + + private List obtenirChevauxParPosition(Resultat resultat, int position) { + // Implémentation simplifiée: retourne les chevaux à une position donnée + // Dans une implémentation réelle, il faudrait gérer les dead-heats + + List chevaux = new ArrayList<>(); + if (resultat.getIdsChevauxOrdreArrivee().size() >= position) { + chevaux.add(resultat.getIdsChevauxOrdreArrivee().get(position - 1)); + } + return chevaux; + } + + private List> genererCombinaisons(List elements, int k) { + List> combinaisons = new ArrayList<>(); + genererCombinaisonsRecursif(elements, k, 0, new ArrayList<>(), combinaisons); + return combinaisons; + } + + private void genererCombinaisonsRecursif(List elements, int k, int debut, + List combinaisonCourante, List> combinaisons) { + if (combinaisonCourante.size() == k) { + combinaisons.add(new ArrayList<>(combinaisonCourante)); + return; + } + + for (int i = debut; i < elements.size(); i++) { + combinaisonCourante.add(elements.get(i)); + genererCombinaisonsRecursif(elements, k, i + 1, combinaisonCourante, combinaisons); + combinaisonCourante.remove(combinaisonCourante.size() - 1); + } + } + + private void calculerDividendesDeadHeat(Gains gains, List parisOrdreExact, List parisOrdreInexact, List parisBonus4) { + // Calcul des dividendes pour les cas de dead-heat + // Répartition égale de la masse entre les combinaisons payables + + int nbCombinaisonsOrdreExact = parisOrdreExact.size(); + int nbCombinaisonsOrdreInexact = parisOrdreInexact.size(); + int nbCombinaisonsBonus4 = parisBonus4.size(); + + if (nbCombinaisonsOrdreExact > 0) { + gains.setDividendeOrdreExact(gains.getMasseOrdreExact() / nbCombinaisonsOrdreExact); + } + + if (nbCombinaisonsOrdreInexact > 0) { + gains.setDividendeOrdreInexact(gains.getMasseOrdreInexact() / nbCombinaisonsOrdreInexact); + } + + if (nbCombinaisonsBonus4 > 0) { + gains.setDividendeBonus4(gains.getMasseBonus4() / nbCombinaisonsBonus4); + } + } + + private void calculerDividendesNormaux(Gains gains, List parisOrdreExact, List parisOrdreInexact, List parisBonus4) { + // Calcul des dividendes pour les cas normaux (sans dead-heat) + double totalMisesOrdreExact = parisOrdreExact.stream().mapToDouble(Pari::getMise).sum(); + double totalMisesOrdreInexact = parisOrdreInexact.stream().mapToDouble(Pari::getMise).sum(); + double totalMisesBonus4 = parisBonus4.stream().mapToDouble(Pari::getMise).sum(); + + if (totalMisesOrdreExact > 0) { + gains.setDividendeOrdreExact(gains.getMasseOrdreExact() / totalMisesOrdreExact); + } + + if (totalMisesOrdreInexact > 0) { + gains.setDividendeOrdreInexact(gains.getMasseOrdreInexact() / totalMisesOrdreInexact); + } + + if (totalMisesBonus4 > 0) { + gains.setDividendeBonus4(gains.getMasseBonus4() / totalMisesBonus4); + } + } + private void appliquerReglesProportionMinimum(Gains gains, List paris, Resultat resultat) { + // Application de l'article 6 - Proportion minimum des rapports + + // Règle 6a: Rapport ordre exact doit être au moins 25 fois le rapport ordre inexact + if (gains.getDividendeOrdreExact() > 0 && gains.getDividendeOrdreInexact() > 0 && + gains.getDividendeOrdreExact() < 25 * gains.getDividendeOrdreInexact()) { + + double nouveauDividendeOrdreExact = 25 * gains.getDividendeOrdreInexact(); + gains.setDividendeOrdreExact(nouveauDividendeOrdreExact); + } + + // Règle 6a: Rapport ordre inexact doit être au moins 15 fois le rapport Bonus 4 + if (gains.getDividendeOrdreInexact() > 0 && gains.getDividendeBonus4() > 0 && + gains.getDividendeOrdreInexact() < 15 * gains.getDividendeBonus4()) { + + double nouveauDividendeOrdreInexact = 15 * gains.getDividendeBonus4(); + gains.setDividendeOrdreInexact(nouveauDividendeOrdreInexact); + } + + // Règles pour les différents cas de dead-heat (6b à 6f) + if (resultat.isADeadHeat()) { + String typeDeadHeat = determinerTypeDeadHeat(resultat); + + switch (typeDeadHeat) { + case "CINQ_PREMIERS": + case "QUATRE_DEUXIEMES": + // Règle 6b: Rapport ordre exact = rapport ordre inexact + if (gains.getDividendeOrdreExact() > 0 && gains.getDividendeOrdreInexact() > 0 && + gains.getDividendeOrdreExact() < gains.getDividendeOrdreInexact()) { + + gains.setDividendeOrdreExact(gains.getDividendeOrdreInexact()); + } + break; + + case "TROIS_PREMIERS_DEUX_QUATRIEMES": + case "DEUX_PREMIERS_TROIS_TROISIEMES": + // Règle 6c: Rapport ordre exact = 2 fois rapport ordre inexact + if (gains.getDividendeOrdreExact() > 0 && gains.getDividendeOrdreInexact() > 0 && + gains.getDividendeOrdreExact() < 2 * gains.getDividendeOrdreInexact()) { + + gains.setDividendeOrdreExact(2 * gains.getDividendeOrdreInexact()); + } + break; + + case "TROIS_PREMIERS_UN_QUATRIEME_UN_CINQUIEME": + case "TROIS_DEUXIEMES_UN_CINQUIEME": + case "TROIS_TROISIEMES": + // Règle 6d: Rapport ordre exact = 4 fois rapport ordre inexact + if (gains.getDividendeOrdreExact() > 0 && gains.getDividendeOrdreInexact() > 0 && + gains.getDividendeOrdreExact() < 4 * gains.getDividendeOrdreInexact()) { + + gains.setDividendeOrdreExact(4 * gains.getDividendeOrdreInexact()); + } + break; + + case "DEUX_PREMIERS_DEUX_TROISIEMES_UN_CINQUIEME": + case "DEUX_PREMIERS_UN_TROISIEME_DEUX_QUATRIEMES": + case "DEUX_DEUXIEMES_DEUX_QUATRIEMES": + // Règle 6e: Rapport ordre exact = 6 fois rapport ordre inexact + if (gains.getDividendeOrdreExact() > 0 && gains.getDividendeOrdreInexact() > 0 && + gains.getDividendeOrdreExact() < 6 * gains.getDividendeOrdreInexact()) { + + gains.setDividendeOrdreExact(6 * gains.getDividendeOrdreInexact()); + } + break; + + case "DEUX_PREMIERS_UN_TROISIEME_UN_QUATRIEME_UN_CINQUIEME": + case "DEUX_DEUXIEMES_UN_QUATRIEME_UN_CINQUIEME": + case "DEUX_TROISIEMES_UN_CINQUIEME": + case "DEUX_QUATRIEMES": + // Règle 6f: Rapport ordre exact = 12 fois rapport ordre inexact + if (gains.getDividendeOrdreExact() > 0 && gains.getDividendeOrdreInexact() > 0 && + gains.getDividendeOrdreExact() < 12 * gains.getDividendeOrdreInexact()) { + + gains.setDividendeOrdreExact(12 * gains.getDividendeOrdreInexact()); + } + break; + } + } + + // Garantir un rapport minimum de 1.1 par unité de mise (Article 5c) + gains.setDividendeOrdreExact(Math.max(gains.getDividendeOrdreExact(), RAPPORT_MINIMUM)); + gains.setDividendeOrdreInexact(Math.max(gains.getDividendeOrdreInexact(), RAPPORT_MINIMUM)); + gains.setDividendeBonus4(Math.max(gains.getDividendeBonus4(), RAPPORT_MINIMUM)); + } + + + + private void gererCagnotte(Gains gains, List paris, Resultat resultat) { + serviceCagnotte.gererCagnotte(gains, paris, resultat); + } + + // Ajouter cette méthode pour appliquer les cagnottes reportées avant le calcul des gains + public void appliquerCagnottesAvantCalcul(Course course) { + serviceCagnotte.appliquerCagnottesReportees(course); + } + public Gains obtenirGainsParCourse(Long courseId) { + return repositoryGains.findByCourseId(courseId); + } + + public List obtenirTousGains() { + return repositoryGains.findAll(); + } + + // Méthode pour calculer les gains d'un pari spécifique + public double calculerGainsParieur(Pari pari, Gains gains) { + double gainsParieur = 0.0; + + if (pari.isEstPaye()) { + // Vérifier le type de gain + Resultat resultat = repositoryResultat.findByCourseId(pari.getCourse().getId()); + + if (estOrdreExact(pari, resultat)) { + gainsParieur = pari.getMise() * gains.getDividendeOrdreExact(); + } else if (estOrdreInexact(pari, resultat)) { + gainsParieur = pari.getMise() * gains.getDividendeOrdreInexact(); + } else if (estBonus4(pari, resultat)) { + gainsParieur = pari.getMise() * gains.getDividendeBonus4(); + } + } + + + + return gainsParieur; + } + + // Méthode pour générer un rapport détaillé des gains + public Map genererRapportGains(Long courseId) { + Map rapport = new HashMap<>(); + + Gains gains = obtenirGainsParCourse(courseId); + if (gains == null) { + rapport.put("erreur", "Aucun gain calculé pour cette course"); + return rapport; + } + + Course course = gains.getCourse(); + List tousParis = repositoryPari.findByCourseId(courseId); + + rapport.put("course", course.getNom()); + rapport.put("date", course.getDate()); + rapport.put("masseOrdreExact", gains.getMasseOrdreExact()); + rapport.put("masseOrdreInexact", gains.getMasseOrdreInexact()); + rapport.put("masseBonus4", gains.getMasseBonus4()); + rapport.put("dividendeOrdreExact", gains.getDividendeOrdreExact()); + rapport.put("dividendeOrdreInexact", gains.getDividendeOrdreInexact()); + rapport.put("dividendeBonus4", gains.getDividendeBonus4()); + rapport.put("masseCagnotte", gains.getMasseCagnotte()); + + // Compter les gagnants par catégorie + Resultat resultat = repositoryResultat.findByCourseId(courseId); + List gagnantsOrdreExact = determinerGagnantsOrdreExact(tousParis, resultat); + List gagnantsOrdreInexact = determinerGagnantsOrdreInexact(tousParis, resultat); + List gagnantsBonus4 = determinerGagnantsBonus4(tousParis, resultat); + + rapport.put("nombreGagnantsOrdreExact", gagnantsOrdreExact.size()); + rapport.put("nombreGagnantsOrdreInexact", gagnantsOrdreInexact.size()); + rapport.put("nombreGagnantsBonus4", gagnantsBonus4.size()); + + // Calculer le total des gains distribués + double totalGagnes = gagnantsOrdreExact.stream() + .mapToDouble(p -> calculerGainsParieur(p, gains)) + .sum(); + + totalGagnes += gagnantsOrdreInexact.stream() + .mapToDouble(p -> calculerGainsParieur(p, gains)) + .sum(); + + totalGagnes += gagnantsBonus4.stream() + .mapToDouble(p -> calculerGainsParieur(p, gains)) + .sum(); + + rapport.put("totalGagnes", totalGagnes); + + return rapport; + } +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch11_quinteplus/service/ServicePari.java b/src/main/java/com/pmumali/ch11_quinteplus/service/ServicePari.java new file mode 100644 index 0000000..58cb54f --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/service/ServicePari.java @@ -0,0 +1,619 @@ +package com.pmumali.ch11_quinteplus.service; + + +import com.pmumali.ch11_quinteplus.model.Cheval; +import com.pmumali.ch11_quinteplus.model.Pari; +import com.pmumali.ch11_quinteplus.model.Resultat; +import com.pmumali.ch11_quinteplus.repository.ChevalRepository; +import com.pmumali.ch11_quinteplus.repository.CourseRepository; +import com.pmumali.ch11_quinteplus.repository.GainsRepository; +import com.pmumali.ch11_quinteplus.repository.PariRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Transactional +public class ServicePari { + + @Autowired + private PariRepository repositoryPari; + + @Autowired + private CourseRepository repositoryCourse; + + @Autowired + private ChevalRepository repositoryCheval; + + @Autowired + private GainsRepository repositoryGains; + + private static final double MISE_DE_BASE = 500.0; + private static final double MISE_MAXIMALE = 20 * MISE_DE_BASE; + + public Pari placerPari(Pari pari) { + // Vérification de la limite d'enjeu (Article 2) + if (pari.getMise() > MISE_MAXIMALE) { + pari.setMise(MISE_MAXIMALE); + // TODO: Implémenter le remboursement de la différence + } + + // Vérification de la validité du pari selon le type + if (!estPariValide(pari)) { + throw new IllegalArgumentException("Pari invalide"); + } + + return repositoryPari.save(pari); + } + + private boolean estPariValide(Pari pari) { + // Vérifier que le pari a exactement 5 chevaux sélectionnés + if (pari.getChevauxSelectionnes() == null || pari.getChevauxSelectionnes().size() != 5) { + return false; + } + + // Vérifier que l'ordre prédit a exactement 5 positions + if (pari.getOrdrePredit() == null || pari.getOrdrePredit().size() != 5) { + return false; + } + + // Vérifier que tous les chevaux sélectionnés existent + List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); + if (chevaux.size() != 5) { + return false; + } + + // Vérifier que la course existe + if (pari.getCourse() == null || !repositoryCourse.existsById(pari.getCourse().getId())) { + return false; + } + + return true; + } + + public List obtenirParisParCourse(Long courseId) { + return repositoryPari.findByCourseId(courseId); + } + + public List obtenirParisParParieur(String nomParieur) { + return repositoryPari.findByNomParieur(nomParieur); + } + + public Pari obtenirPariParId(Long id) { + return repositoryPari.findById(id).orElse(null); + } + + public Pari mettreAJourPari(Long id, Pari detailsPari) { + Pari pari = repositoryPari.findById(id).orElse(null); + if (pari != null) { + pari.setNomParieur(detailsPari.getNomParieur()); + pari.setMise(detailsPari.getMise()); + pari.setChevauxSelectionnes(detailsPari.getChevauxSelectionnes()); + pari.setOrdrePredit(detailsPari.getOrdrePredit()); + pari.setTypePari(detailsPari.getTypePari()); + return repositoryPari.save(pari); + } + return null; + } + + public boolean supprimerPari(Long id) { + if (repositoryPari.existsById(id)) { + repositoryPari.deleteById(id); + return true; + } + return false; + } + + // Méthodes pour gérer les dead-heats (Article 3) + public Map gererDeadHeat(Resultat resultat, List paris) { + Map resultatsDeadHeat = new HashMap<>(); + + if (!resultat.isADeadHeat()) { + resultatsDeadHeat.put("message", "Aucun dead-heat à traiter"); + return resultatsDeadHeat; + } + + // Déterminer le type de dead-heat et appliquer les règles appropriées + String typeDeadHeat = determinerTypeDeadHeat(resultat); + resultatsDeadHeat.put("typeDeadHeat", typeDeadHeat); + + switch (typeDeadHeat) { + case "CINQ_PREMIERS": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatCinqPremiers(resultat, paris)); + break; + case "QUATRE_PREMIERS_UN_CINQUIEME": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatQuatrePremiersUnCinquieme(resultat, paris)); + break; + case "TROIS_PREMIERS_DEUX_QUATRIEMES": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatTroisPremiersDeuxQuatriemes(resultat, paris)); + break; + case "TROIS_PREMIERS_UN_QUATRIEME_UN_CINQUIEME": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatTroisPremiersUnQuatriemeUnCinquieme(resultat, paris)); + break; + case "DEUX_PREMIERS_TROIS_TROISIEMES": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxPremiersTroisTroisiemes(resultat, paris)); + break; + case "DEUX_PREMIERS_DEUX_TROISIEMES_UN_CINQUIEME": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxPremiersDeuxTroisiemesUnCinquieme(resultat, paris)); + break; + case "DEUX_PREMIERS_UN_TROISIEME_DEUX_QUATRIEMES": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxPremiersUnTroisiemeDeuxQuatriemes(resultat, paris)); + break; + case "DEUX_PREMIERS_UN_TROISIEME_UN_QUATRIEME_UN_CINQUIEME": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxPremiersUnTroisiemeUnQuatriemeUnCinquieme(resultat, paris)); + break; + case "QUATRE_DEUXIEMES": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatQuatreDeuxiemes(resultat, paris)); + break; + case "TROIS_DEUXIEMES_UN_CINQUIEME": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatTroisDeuxiemesUnCinquieme(resultat, paris)); + break; + case "DEUX_DEUXIEMES_DEUX_QUATRIEMES": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxDeuxiemesDeuxQuatriemes(resultat, paris)); + break; + case "DEUX_DEUXIEMES_UN_QUATRIEME_UN_CINQUIEME": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxDeuxiemesUnQuatriemeUnCinquieme(resultat, paris)); + break; + case "TROIS_TROISIEMES": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatTroisTroisiemes(resultat, paris)); + break; + case "DEUX_TROISIEMES_UN_CINQUIEME": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxTroisiemesUnCinquieme(resultat, paris)); + break; + case "DEUX_QUATRIEMES": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxQuatriemes(resultat, paris)); + break; + case "DEUX_CINQUIEMES": + resultatsDeadHeat.put("combinaisons", traiterDeadHeatDeuxCinquiemes(resultat, paris)); + break; + default: + resultatsDeadHeat.put("erreur", "Type de dead-heat non reconnu"); + } + + return resultatsDeadHeat; + } + + private String determinerTypeDeadHeat(Resultat resultat) { + // Implémentation de la logique pour déterminer le type de dead-heat + // Basé sur les positions avec dead-heat + + List positionsDeadHeat = resultat.getPositionsDeadHeat(); + Collections.sort(positionsDeadHeat); + + // Simplification: détermination basée sur les positions en dead-heat + if (positionsDeadHeat.contains(1) && positionsDeadHeat.size() >= 5) { + return "CINQ_PREMIERS"; + } else if (positionsDeadHeat.contains(1) && positionsDeadHeat.contains(2) + && positionsDeadHeat.contains(3) && positionsDeadHeat.contains(4)) { + return "QUATRE_PREMIERS_UN_CINQUIEME"; + } else if (positionsDeadHeat.contains(1) && positionsDeadHeat.contains(2) + && positionsDeadHeat.contains(3) && positionsDeadHeat.contains(4) + && positionsDeadHeat.contains(5)) { + return "TROIS_PREMIERS_DEUX_QUATRIEMES"; + } + // ... autres cas à implémenter selon l'article 3 + + return "AUTRE"; + } + + // Implémentations des différents cas de dead-heat (Article 3) + private List> traiterDeadHeatCinqPremiers(Resultat resultat, List paris) { + List> combinaisonsPayables = new ArrayList<>(); + + // Article 3a: Dead-heat de cinq chevaux ou plus classés à la première place + // Toutes les combinaisons des chevaux classés premiers pris cinq à cinq + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + + // Générer toutes les combinaisons de 5 chevaux parmi les premiers + List> combinaisons = genererCombinaisons(chevauxPremiers, 5); + + for (List combinaison : combinaisons) { + Map details = new HashMap<>(); + details.put("combinaison", combinaison); + details.put("type", "QUINTE_PLUS"); + details.put("permutations", 120); // 120 ordres possibles + details.put("rapportUnique", true); + + combinaisonsPayables.add(details); + } + + return combinaisonsPayables; + } + + private List> traiterDeadHeatQuatrePremiersUnCinquieme(Resultat resultat, List paris) { + List> combinaisonsPayables = new ArrayList<>(); + + // Article 3b: Dead-heat de quatre chevaux classés à la première place et un ou plusieurs classés cinquième + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); + + // Combinaisons des quatre premiers avec un des cinquièmes + for (Long chevalCinquieme : chevauxCinquiemes) { + List combinaison = new ArrayList<>(chevauxPremiers); + combinaison.add(chevalCinquieme); + + Map details = new HashMap<>(); + details.put("combinaison", combinaison); + details.put("type", "QUINTE_PLUS"); + details.put("ordreExactPermutations", 24); // 24 permutations pour l'ordre exact + details.put("ordreInexactPermutations", 96); // 96 permutations pour l'ordre inexact + + combinaisonsPayables.add(details); + } + + return combinaisonsPayables; + } + + private List> traiterDeadHeatTroisPremiersDeuxQuatriemes(Resultat resultat, List paris) { + List> combinaisonsPayables = new ArrayList<>(); + + // Article 3c: Dead-heat de trois chevaux classés à la première place et deux chevaux classés à la quatrième place + List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); + List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); + + // Générer toutes les combinaisons de 2 chevaux parmi les quatrièmes + List> combinaisonsQuatriemes = genererCombinaisons(chevauxQuatriemes, 2); + + for (List combinaisonQuatriemes : combinaisonsQuatriemes) { + List combinaison = new ArrayList<>(chevauxPremiers); + combinaison.addAll(combinaisonQuatriemes); + + Map details = new HashMap<>(); + details.put("combinaison", combinaison); + details.put("type", "QUINTE_PLUS"); + details.put("ordreExactPermutations", 12); // 12 permutations pour l'ordre exact + details.put("ordreInexactPermutations", 108); // 108 permutations pour l'ordre inexact + + combinaisonsPayables.add(details); + } + + return combinaisonsPayables; + } + + // Méthodes pour les autres cas de dead-heat (à implémenter selon l'article 3) + private List> traiterDeadHeatTroisPremiersUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + // Article 3d: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxPremiersTroisTroisiemes(Resultat resultat, List paris) { + // Article 3e: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxPremiersDeuxTroisiemesUnCinquieme(Resultat resultat, List paris) { + // Article 3f: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxPremiersUnTroisiemeDeuxQuatriemes(Resultat resultat, List paris) { + // Article 3g: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxPremiersUnTroisiemeUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + // Article 3h: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatQuatreDeuxiemes(Resultat resultat, List paris) { + // Article 3i: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatTroisDeuxiemesUnCinquieme(Resultat resultat, List paris) { + // Article 3j: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxDeuxiemesDeuxQuatriemes(Resultat resultat, List paris) { + // Article 3k: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxDeuxiemesUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + // Article 3l: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatTroisTroisiemes(Resultat resultat, List paris) { + // Article 3m: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxTroisiemesUnCinquieme(Resultat resultat, List paris) { + // Article 3n: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxQuatriemes(Resultat resultat, List paris) { + // Article 3o: Implémentation à compléter + return new ArrayList<>(); + } + + private List> traiterDeadHeatDeuxCinquiemes(Resultat resultat, List paris) { + // Article 3p: Implémentation à compléter + return new ArrayList<>(); + } + + // Méthodes utilitaires pour les dead-heats + private List obtenirChevauxParPosition(Resultat resultat, int position) { + // Implémentation simplifiée: retourne les chevaux à une position donnée + // Dans une implémentation réelle, il faudrait gérer les dead-heats + + List chevaux = new ArrayList<>(); + if (resultat.getIdsChevauxOrdreArrivee().size() >= position) { + chevaux.add(resultat.getIdsChevauxOrdreArrivee().get(position - 1)); + } + return chevaux; + } + + private List> genererCombinaisons(List elements, int k) { + List> combinaisons = new ArrayList<>(); + genererCombinaisonsRecursif(elements, k, 0, new ArrayList<>(), combinaisons); + return combinaisons; + } + + private void genererCombinaisonsRecursif(List elements, int k, int debut, + List combinaisonCourante, List> combinaisons) { + if (combinaisonCourante.size() == k) { + combinaisons.add(new ArrayList<>(combinaisonCourante)); + return; + } + + for (int i = debut; i < elements.size(); i++) { + combinaisonCourante.add(elements.get(i)); + genererCombinaisonsRecursif(elements, k, i + 1, combinaisonCourante, combinaisons); + combinaisonCourante.remove(combinaisonCourante.size() - 1); + } + } + + // Méthodes pour gérer les différents types de paris (Article 7) + public Map calculerCoutFormule(String typeFormule, int nombreChevauxBase, int nombreChevauxSelection) { + Map resultat = new HashMap<>(); + resultat.put("typeFormule", typeFormule); + resultat.put("nombreChevauxBase", nombreChevauxBase); + resultat.put("nombreChevauxSelection", nombreChevauxSelection); + + int nombreCombinaisons = 0; + double cout = 0; + + switch (typeFormule) { + case "FORMULE_SIMPLIFIEE": + nombreCombinaisons = calculerFormuleSimplifiee(nombreChevauxBase); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "FORMULE_TOUS_ORDRES": + nombreCombinaisons = calculerFormuleTousOrdres(nombreChevauxBase); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "CHAMP_TOTAL_4": + nombreCombinaisons = calculerChampTotal4(nombreChevauxBase, nombreChevauxSelection); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "CHAMP_PARTIEL_4": + nombreCombinaisons = calculerChampPartiel4(nombreChevauxBase, nombreChevauxSelection); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "CHAMP_TOTAL_3": + nombreCombinaisons = calculerChampTotal3(nombreChevauxBase, nombreChevauxSelection); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "CHAMP_PARTIEL_3": + nombreCombinaisons = calculerChampPartiel3(nombreChevauxBase, nombreChevauxSelection); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "CHAMP_TOTAL_2": + nombreCombinaisons = calculerChampTotal2(nombreChevauxBase, nombreChevauxSelection); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "CHAMP_PARTIEL_2": + nombreCombinaisons = calculerChampPartiel2(nombreChevauxBase, nombreChevauxSelection); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "CHAMP_TOTAL_1": + nombreCombinaisons = calculerChampTotal1(nombreChevauxBase, nombreChevauxSelection); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + case "CHAMP_PARTIEL_1": + nombreCombinaisons = calculerChampPartiel1(nombreChevauxBase, nombreChevauxSelection); + cout = nombreCombinaisons * MISE_DE_BASE; + break; + + default: + resultat.put("erreur", "Type de formule non reconnu"); + return resultat; + } + + resultat.put("nombreCombinaisons", nombreCombinaisons); + resultat.put("coutTotal", cout); + + return resultat; + } + + // Implémentation des calculs de formules selon l'article 7 + private int calculerFormuleSimplifiee(int k) { + // Formule simplifiée: K x (K-1) x (K-2) x (K-3) x (K-4) / 120 + if (k < 5) return 0; + return (k * (k-1) * (k-2) * (k-3) * (k-4)) / 120; + } + + private int calculerFormuleTousOrdres(int k) { + // Formule tous ordres: K x (K-1) x (K-2) x (K-3) x (K-4) + if (k < 5) return 0; + return k * (k-1) * (k-2) * (k-3) * (k-4); + } + + private int calculerChampTotal4(int n, int k) { + // Champ total de 4 chevaux: 120 x (N-4) paris en formule tous ordres + // ou (N-4) paris en formule simplifiée + // Ici, nous calculons la formule tous ordres + if (n < 5) return 0; + return 120 * (n - 4); + } + + private int calculerChampPartiel4(int p, int k) { + // Champ partiel de 4 chevaux: 120 x P paris en formule tous ordres + // ou P paris en formule simplifiée + // Ici, nous calculons la formule tous ordres + return 120 * p; + } + + private int calculerChampTotal3(int n, int k) { + // Champ total de 3 chevaux: 60 x (N-3) x (N-4) paris en formule tous ordres + if (n < 5) return 0; + return 60 * (n-3) * (n-4); + } + + private int calculerChampPartiel3(int p, int k) { + // Champ partiel de 3 chevaux: 60 x P x (P-1) paris en formule tous ordres + if (p < 2) return 0; + return 60 * p * (p-1); + } + + private int calculerChampTotal2(int n, int k) { + // Champ total de 2 chevaux: 20 x (N-2) x (N-3) x (N-4) paris en formule tous ordres + if (n < 5) return 0; + return 20 * (n-2) * (n-3) * (n-4); + } + + private int calculerChampPartiel2(int p, int k) { + // Champ partiel de 2 chevaux: 20 x P x (P-1) x (P-2) paris en formule tous ordres + if (p < 3) return 0; + return 20 * p * (p-1) * (p-2); + } + + private int calculerChampTotal1(int n, int k) { + // Champ total d'1 cheval: 5 x (N-1) x (N-2) x (N-3) x (N-4) paris en formule tous ordres + if (n < 5) return 0; + return 5 * (n-1) * (n-2) * (n-3) * (n-4); + } + + private int calculerChampPartiel1(int p, int k) { + // Champ partiel d'1 cheval: 5 x P x (P-1) x (P-2) x (P-3) paris en formule tous ordres + if (p < 4) return 0; + return 5 * p * (p-1) * (p-2) * (p-3); + } + + // Méthodes pour gérer les non-partants (Article 4) + public Map traiterNonPartants(List paris, Resultat resultat) { + Map resultats = new HashMap<>(); + List parisARembourser = new ArrayList<>(); + List parisBonus4 = new ArrayList<>(); + + for (Pari pari : paris) { + int nombreNonPartants = compterNonPartants(pari); + + if (nombreNonPartants >= 2) { + // Article 4a: Remboursement si 2 chevaux ou plus non partants + parisARembourser.add(pari); + } else if (nombreNonPartants == 1) { + // Article 4b: Bonus 4 si un seul non-partant et les 4 autres sont dans les 4 premiers + if (sontQuatrePremiers(pari, resultat)) { + parisBonus4.add(pari); + } else { + parisARembourser.add(pari); + } + } + } + + resultats.put("parisARembourser", parisARembourser); + resultats.put("parisBonus4", parisBonus4); + resultats.put("montantRemboursements", calculerMontantRemboursements(parisARembourser)); + + return resultats; + } + + private int compterNonPartants(Pari pari) { + int compte = 0; + List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); + for (Cheval cheval : chevaux) { + if (cheval.isEstNonPartant()) { + compte++; + } + } + return compte; + } + + private boolean sontQuatrePremiers(Pari pari, Resultat resultat) { + // Vérifier si au moins 4 chevaux du pari sont dans les 4 premiers + List quatrePremiers = resultat.getIdsChevauxOrdreArrivee().subList(0, Math.min(4, resultat.getIdsChevauxOrdreArrivee().size())); + List chevauxPari = pari.getChevauxSelectionnes(); + + long compte = chevauxPari.stream() + .filter(quatrePremiers::contains) + .count(); + + return compte >= 4; + } + + private double calculerMontantRemboursements(List paris) { + return paris.stream() + .mapToDouble(Pari::getMise) + .sum(); + } + + // Méthode pour déterminer les gagnants d'une course + public Map determinerGagnants(Long courseId, Resultat resultat) { + Map resultats = new HashMap<>(); + List tousParis = repositoryPari.findByCourseId(courseId); + + List gagnantsOrdreExact = new ArrayList<>(); + List gagnantsOrdreInexact = new ArrayList<>(); + List gagnantsBonus4 = new ArrayList<>(); + + for (Pari pari : tousParis) { + if (estGagnantOrdreExact(pari, resultat)) { + gagnantsOrdreExact.add(pari); + } else if (estGagnantOrdreInexact(pari, resultat)) { + gagnantsOrdreInexact.add(pari); + } else if (estGagnantBonus4(pari, resultat)) { + gagnantsBonus4.add(pari); + } + } + + resultats.put("gagnantsOrdreExact", gagnantsOrdreExact); + resultats.put("gagnantsOrdreInexact", gagnantsOrdreInexact); + resultats.put("gagnantsBonus4", gagnantsBonus4); + + return resultats; + } + + private boolean estGagnantOrdreExact(Pari pari, Resultat resultat) { + // Vérifier si l'ordre prédit correspond exactement à l'ordre d'arrivée + return pari.getOrdrePredit().equals(resultat.getIdsChevauxOrdreArrivee()); + } + + private boolean estGagnantOrdreInexact(Pari pari, Resultat resultat) { + // Vérifier si les 5 chevaux sont dans les 5 premiers mais pas dans le bon ordre + List cinqPremiers = resultat.getIdsChevauxOrdreArrivee().subList(0, Math.min(5, resultat.getIdsChevauxOrdreArrivee().size())); + List chevauxPari = pari.getChevauxSelectionnes(); + + return cinqPremiers.containsAll(chevauxPari) && + !pari.getOrdrePredit().equals(resultat.getIdsChevauxOrdreArrivee()); + } + + private boolean estGagnantBonus4(Pari pari, Resultat resultat) { + // Vérifier si au moins 4 chevaux du pari sont dans les 4 premiers + List quatrePremiers = resultat.getIdsChevauxOrdreArrivee().subList(0, Math.min(4, resultat.getIdsChevauxOrdreArrivee().size())); + List chevauxPari = pari.getChevauxSelectionnes(); + + long compte = chevauxPari.stream() + .filter(quatrePremiers::contains) + .count(); + + return compte >= 4; + } +} diff --git a/src/main/java/com/pmumali/jumeleordre/controller/CourseController.java b/src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseController.java similarity index 74% rename from src/main/java/com/pmumali/jumeleordre/controller/CourseController.java rename to src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseController.java index 5ea9ab5..516decf 100644 --- a/src/main/java/com/pmumali/jumeleordre/controller/CourseController.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseController.java @@ -1,11 +1,11 @@ // CourseController.java -package com.pmumali.jumeleordre.controller; +package com.pmumali.ch4_jumeleordre.controller; -import com.pmumali.jumeleordre.dto.ResultatCourseDto; -import com.pmumali.jumeleordre.exception.ResultatCourseInvalideException; -import com.pmumali.jumeleordre.model.Course; -import com.pmumali.jumeleordre.service.ResultatCourseService; -import com.pmumali.jumeleordre.service.CourseService; +import com.pmumali.ch4_jumeleordre.dto.ResultatCourseDto; +import com.pmumali.ch4_jumeleordre.exception.ResultatCourseInvalideException; +import com.pmumali.ch4_jumeleordre.model.Course; +import com.pmumali.ch4_jumeleordre.service.ResultatCourseService; +import com.pmumali.ch4_jumeleordre.service.CourseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/jumeleordre/controller/ParisController.java b/src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisController.java similarity index 78% rename from src/main/java/com/pmumali/jumeleordre/controller/ParisController.java rename to src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisController.java index 2180803..b5f6fa8 100644 --- a/src/main/java/com/pmumali/jumeleordre/controller/ParisController.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisController.java @@ -1,11 +1,11 @@ // ParisController.java -package com.pmumali.jumeleordre.controller; +package com.pmumali.ch4_jumeleordre.controller; -import com.pmumali.jumeleordre.dto.ParisDto; -import com.pmumali.jumeleordre.dto.GainsDto; -import com.pmumali.jumeleordre.exception.ParisInvalideException; -import com.pmumali.jumeleordre.model.Paris; -import com.pmumali.jumeleordre.service.ParisService; +import com.pmumali.ch4_jumeleordre.dto.ParisDto; +import com.pmumali.ch4_jumeleordre.dto.GainsDto; +import com.pmumali.ch4_jumeleordre.exception.ParisInvalideException; +import com.pmumali.ch4_jumeleordre.model.Paris; +import com.pmumali.ch4_jumeleordre.service.ParisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/jumeleordre/dto/GainsDto.java b/src/main/java/com/pmumali/ch4_jumeleordre/dto/GainsDto.java similarity index 78% rename from src/main/java/com/pmumali/jumeleordre/dto/GainsDto.java rename to src/main/java/com/pmumali/ch4_jumeleordre/dto/GainsDto.java index 51d4152..53c8047 100644 --- a/src/main/java/com/pmumali/jumeleordre/dto/GainsDto.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/dto/GainsDto.java @@ -1,5 +1,5 @@ // GainsDto.java -package com.pmumali.jumeleordre.dto; +package com.pmumali.ch4_jumeleordre.dto; import lombok.Data; diff --git a/src/main/java/com/pmumali/jumeleordre/dto/ParisDto.java b/src/main/java/com/pmumali/ch4_jumeleordre/dto/ParisDto.java similarity index 84% rename from src/main/java/com/pmumali/jumeleordre/dto/ParisDto.java rename to src/main/java/com/pmumali/ch4_jumeleordre/dto/ParisDto.java index 5024d78..3ba14f5 100644 --- a/src/main/java/com/pmumali/jumeleordre/dto/ParisDto.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/dto/ParisDto.java @@ -1,5 +1,5 @@ // ParisDto.java -package com.pmumali.jumeleordre.dto; +package com.pmumali.ch4_jumeleordre.dto; import lombok.Data; diff --git a/src/main/java/com/pmumali/jumeleordre/dto/ResultatCourseDto.java b/src/main/java/com/pmumali/ch4_jumeleordre/dto/ResultatCourseDto.java similarity index 85% rename from src/main/java/com/pmumali/jumeleordre/dto/ResultatCourseDto.java rename to src/main/java/com/pmumali/ch4_jumeleordre/dto/ResultatCourseDto.java index 1451a3c..614d862 100644 --- a/src/main/java/com/pmumali/jumeleordre/dto/ResultatCourseDto.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/dto/ResultatCourseDto.java @@ -1,5 +1,5 @@ // ResultatCourseDto.java -package com.pmumali.jumeleordre.dto; +package com.pmumali.ch4_jumeleordre.dto; import lombok.Data; diff --git a/src/main/java/com/pmumali/jumeleordre/exception/ChevalInvalideException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/ChevalInvalideException.java similarity index 86% rename from src/main/java/com/pmumali/jumeleordre/exception/ChevalInvalideException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/ChevalInvalideException.java index 2487ab9..79bbd2b 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/ChevalInvalideException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/ChevalInvalideException.java @@ -1,5 +1,5 @@ // ChevalInvalideException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class ChevalInvalideException extends JumeleOrdreException { public ChevalInvalideException(String message) { diff --git a/src/main/java/com/pmumali/jumeleordre/exception/CourseDejaTermineeException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/CourseDejaTermineeException.java similarity index 84% rename from src/main/java/com/pmumali/jumeleordre/exception/CourseDejaTermineeException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/CourseDejaTermineeException.java index 8cfe183..e1319e1 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/CourseDejaTermineeException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/CourseDejaTermineeException.java @@ -1,5 +1,5 @@ // CourseDejaTermineeException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class CourseDejaTermineeException extends CourseInvalideException { public CourseDejaTermineeException(Long idCourse) { diff --git a/src/main/java/com/pmumali/jumeleordre/exception/CourseInvalideException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/CourseInvalideException.java similarity index 86% rename from src/main/java/com/pmumali/jumeleordre/exception/CourseInvalideException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/CourseInvalideException.java index 85cb80c..9309e0b 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/CourseInvalideException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/CourseInvalideException.java @@ -1,5 +1,5 @@ // CourseInvalideException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class CourseInvalideException extends JumeleOrdreException { public CourseInvalideException(String message) { diff --git a/src/main/java/com/pmumali/jumeleordre/exception/GlobalExceptionHandler.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandler.java similarity index 97% rename from src/main/java/com/pmumali/jumeleordre/exception/GlobalExceptionHandler.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandler.java index f2bd759..bb7e188 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandler.java @@ -1,4 +1,4 @@ -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/pmumali/jumeleordre/exception/JumeleOrdreException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/JumeleOrdreException.java similarity index 84% rename from src/main/java/com/pmumali/jumeleordre/exception/JumeleOrdreException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/JumeleOrdreException.java index 1231af1..3925a85 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/JumeleOrdreException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/JumeleOrdreException.java @@ -1,4 +1,4 @@ -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class JumeleOrdreException extends RuntimeException { public JumeleOrdreException(String message) { diff --git a/src/main/java/com/pmumali/jumeleordre/exception/LimiteMiseDepasseeException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/LimiteMiseDepasseeException.java similarity index 93% rename from src/main/java/com/pmumali/jumeleordre/exception/LimiteMiseDepasseeException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/LimiteMiseDepasseeException.java index 1ee9dfd..bd7a709 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/LimiteMiseDepasseeException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/LimiteMiseDepasseeException.java @@ -1,5 +1,5 @@ // LimiteMiseDepasseeException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class LimiteMiseDepasseeException extends ParisInvalideException { private final double miseActuelle; diff --git a/src/main/java/com/pmumali/jumeleordre/exception/NombreChevauxInvalideException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/NombreChevauxInvalideException.java similarity index 91% rename from src/main/java/com/pmumali/jumeleordre/exception/NombreChevauxInvalideException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/NombreChevauxInvalideException.java index 4073e77..92ecf16 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/NombreChevauxInvalideException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/NombreChevauxInvalideException.java @@ -1,5 +1,5 @@ // NombreChevauxInvalideException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class NombreChevauxInvalideException extends CourseInvalideException { private final int nombreChevaux; diff --git a/src/main/java/com/pmumali/jumeleordre/exception/PaiementInvalideException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/PaiementInvalideException.java similarity index 86% rename from src/main/java/com/pmumali/jumeleordre/exception/PaiementInvalideException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/PaiementInvalideException.java index 2430bc9..e858db9 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/PaiementInvalideException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/PaiementInvalideException.java @@ -1,5 +1,5 @@ // PaiementInvalideException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class PaiementInvalideException extends JumeleOrdreException { public PaiementInvalideException(String message) { diff --git a/src/main/java/com/pmumali/jumeleordre/exception/ParisInvalideException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/ParisInvalideException.java similarity index 86% rename from src/main/java/com/pmumali/jumeleordre/exception/ParisInvalideException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/ParisInvalideException.java index dd29ab8..d43de3d 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/ParisInvalideException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/ParisInvalideException.java @@ -1,5 +1,5 @@ // ParisInvalideException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class ParisInvalideException extends JumeleOrdreException { public ParisInvalideException(String message) { diff --git a/src/main/java/com/pmumali/jumeleordre/exception/ResultatCourseInvalideException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/ResultatCourseInvalideException.java similarity index 87% rename from src/main/java/com/pmumali/jumeleordre/exception/ResultatCourseInvalideException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/ResultatCourseInvalideException.java index 6af9e40..4cb69a6 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/ResultatCourseInvalideException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/ResultatCourseInvalideException.java @@ -1,5 +1,5 @@ // ResultatCourseInvalideException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; public class ResultatCourseInvalideException extends JumeleOrdreException { public ResultatCourseInvalideException(String message) { diff --git a/src/main/java/com/pmumali/jumeleordre/exception/ValidationException.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/ValidationException.java similarity index 88% rename from src/main/java/com/pmumali/jumeleordre/exception/ValidationException.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/ValidationException.java index 33529e5..26cfc28 100644 --- a/src/main/java/com/pmumali/jumeleordre/exception/ValidationException.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/ValidationException.java @@ -1,5 +1,5 @@ // ValidationException.java -package com.pmumali.jumeleordre.exception; +package com.pmumali.ch4_jumeleordre.exception; import java.util.List; diff --git a/src/main/java/com/pmumali/jumeleordre/model/Cheval.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/Cheval.java similarity index 86% rename from src/main/java/com/pmumali/jumeleordre/model/Cheval.java rename to src/main/java/com/pmumali/ch4_jumeleordre/model/Cheval.java index a3806e5..720c4c0 100644 --- a/src/main/java/com/pmumali/jumeleordre/model/Cheval.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/model/Cheval.java @@ -1,4 +1,4 @@ -package com.pmumali.jumeleordre.model; +package com.pmumali.ch4_jumeleordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/jumeleordre/model/Course.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/Course.java similarity index 91% rename from src/main/java/com/pmumali/jumeleordre/model/Course.java rename to src/main/java/com/pmumali/ch4_jumeleordre/model/Course.java index f3efebb..37cc713 100644 --- a/src/main/java/com/pmumali/jumeleordre/model/Course.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/model/Course.java @@ -1,5 +1,5 @@ // Course.java -package com.pmumali.jumeleordre.model; +package com.pmumali.ch4_jumeleordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/jumeleordre/model/Paris.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/Paris.java similarity index 93% rename from src/main/java/com/pmumali/jumeleordre/model/Paris.java rename to src/main/java/com/pmumali/ch4_jumeleordre/model/Paris.java index 27fe6de..7dc8727 100644 --- a/src/main/java/com/pmumali/jumeleordre/model/Paris.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/model/Paris.java @@ -1,5 +1,5 @@ // Paris.java -package com.pmumali.jumeleordre.model; +package com.pmumali.ch4_jumeleordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/jumeleordre/model/ResultatCourse.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourse.java similarity index 92% rename from src/main/java/com/pmumali/jumeleordre/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourse.java index 0f680a7..21d1962 100644 --- a/src/main/java/com/pmumali/jumeleordre/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourse.java @@ -1,5 +1,5 @@ // ResultatCourse.java -package com.pmumali.jumeleordre.model; +package com.pmumali.ch4_jumeleordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/jumeleordre/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalRepository.java similarity index 62% rename from src/main/java/com/pmumali/jumeleordre/repository/ChevalRepository.java rename to src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalRepository.java index 9f5c63e..d762725 100644 --- a/src/main/java/com/pmumali/jumeleordre/repository/ChevalRepository.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalRepository.java @@ -1,7 +1,7 @@ // ChevalRepository.java -package com.pmumali.jumeleordre.repository; +package com.pmumali.ch4_jumeleordre.repository; -import com.pmumali.jumeleordre.model.Cheval; +import com.pmumali.ch4_jumeleordre.model.Cheval; import org.springframework.data.jpa.repository.JpaRepository; public interface ChevalRepository extends JpaRepository { diff --git a/src/main/java/com/pmumali/jumeleordre/repository/CourseRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseRepository.java similarity index 70% rename from src/main/java/com/pmumali/jumeleordre/repository/CourseRepository.java rename to src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseRepository.java index f2e851b..6f91dc7 100644 --- a/src/main/java/com/pmumali/jumeleordre/repository/CourseRepository.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseRepository.java @@ -1,7 +1,7 @@ // CourseRepository.java -package com.pmumali.jumeleordre.repository; +package com.pmumali.ch4_jumeleordre.repository; -import com.pmumali.jumeleordre.model.Course; +import com.pmumali.ch4_jumeleordre.model.Course; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/jumeleordre/repository/ParisRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisRepository.java similarity index 79% rename from src/main/java/com/pmumali/jumeleordre/repository/ParisRepository.java rename to src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisRepository.java index 96f9b09..621b062 100644 --- a/src/main/java/com/pmumali/jumeleordre/repository/ParisRepository.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisRepository.java @@ -1,7 +1,7 @@ // ParisRepository.java -package com.pmumali.jumeleordre.repository; +package com.pmumali.ch4_jumeleordre.repository; -import com.pmumali.jumeleordre.model.Paris; +import com.pmumali.ch4_jumeleordre.model.Paris; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/jumeleordre/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseRepository.java similarity index 69% rename from src/main/java/com/pmumali/jumeleordre/repository/ResultatCourseRepository.java rename to src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseRepository.java index c289b03..f056ae7 100644 --- a/src/main/java/com/pmumali/jumeleordre/repository/ResultatCourseRepository.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseRepository.java @@ -1,7 +1,7 @@ // ResultatCourseRepository.java -package com.pmumali.jumeleordre.repository; +package com.pmumali.ch4_jumeleordre.repository; -import com.pmumali.jumeleordre.model.ResultatCourse; +import com.pmumali.ch4_jumeleordre.model.ResultatCourse; import org.springframework.data.jpa.repository.JpaRepository; public interface ResultatCourseRepository extends JpaRepository { diff --git a/src/main/java/com/pmumali/jumeleordre/service/CourseService.java b/src/main/java/com/pmumali/ch4_jumeleordre/service/CourseService.java similarity index 92% rename from src/main/java/com/pmumali/jumeleordre/service/CourseService.java rename to src/main/java/com/pmumali/ch4_jumeleordre/service/CourseService.java index dd944bc..64be099 100644 --- a/src/main/java/com/pmumali/jumeleordre/service/CourseService.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/service/CourseService.java @@ -1,16 +1,15 @@ -package com.pmumali.jumeleordre.service; +package com.pmumali.ch4_jumeleordre.service; -import com.pmumali.jumeleordre.model.Course; -import com.pmumali.jumeleordre.model.Cheval; -import com.pmumali.jumeleordre.repository.CourseRepository; -import com.pmumali.jumeleordre.repository.ChevalRepository; -import com.pmumali.jumeleordre.exception.CourseInvalideException; +import com.pmumali.ch4_jumeleordre.model.Course; +import com.pmumali.ch4_jumeleordre.model.Cheval; +import com.pmumali.ch4_jumeleordre.repository.CourseRepository; +import com.pmumali.ch4_jumeleordre.repository.ChevalRepository; +import com.pmumali.ch4_jumeleordre.exception.CourseInvalideException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; -import java.util.Optional; @Service public class CourseService { diff --git a/src/main/java/com/pmumali/jumeleordre/service/ParisService.java b/src/main/java/com/pmumali/ch4_jumeleordre/service/ParisService.java similarity index 85% rename from src/main/java/com/pmumali/jumeleordre/service/ParisService.java rename to src/main/java/com/pmumali/ch4_jumeleordre/service/ParisService.java index e337ff6..f1636ed 100644 --- a/src/main/java/com/pmumali/jumeleordre/service/ParisService.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/service/ParisService.java @@ -1,14 +1,14 @@ // ParisService.java -package com.pmumali.jumeleordre.service; +package com.pmumali.ch4_jumeleordre.service; -import com.pmumali.jumeleordre.dto.ParisDto; -import com.pmumali.jumeleordre.exception.ParisInvalideException; -import com.pmumali.jumeleordre.model.Cheval; -import com.pmumali.jumeleordre.model.Course; -import com.pmumali.jumeleordre.model.Paris; -import com.pmumali.jumeleordre.repository.ChevalRepository; -import com.pmumali.jumeleordre.repository.CourseRepository; -import com.pmumali.jumeleordre.repository.ParisRepository; +import com.pmumali.ch4_jumeleordre.dto.ParisDto; +import com.pmumali.ch4_jumeleordre.exception.ParisInvalideException; +import com.pmumali.ch4_jumeleordre.model.Cheval; +import com.pmumali.ch4_jumeleordre.model.Course; +import com.pmumali.ch4_jumeleordre.model.Paris; +import com.pmumali.ch4_jumeleordre.repository.ChevalRepository; +import com.pmumali.ch4_jumeleordre.repository.CourseRepository; +import com.pmumali.ch4_jumeleordre.repository.ParisRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/pmumali/jumeleordre/service/ResultatCourseService.java b/src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseService.java similarity index 95% rename from src/main/java/com/pmumali/jumeleordre/service/ResultatCourseService.java rename to src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseService.java index b42669a..77f4e79 100644 --- a/src/main/java/com/pmumali/jumeleordre/service/ResultatCourseService.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseService.java @@ -1,16 +1,15 @@ // ResultatCourseService.java -package com.pmumali.jumeleordre.service; +package com.pmumali.ch4_jumeleordre.service; -import com.pmumali.jumeleordre.dto.ResultatCourseDto; -import com.pmumali.jumeleordre.exception.ResultatCourseInvalideException; -import com.pmumali.jumeleordre.model.*; -import com.pmumali.jumeleordre.repository.*; +import com.pmumali.ch4_jumeleordre.dto.ResultatCourseDto; +import com.pmumali.ch4_jumeleordre.exception.ResultatCourseInvalideException; +import com.pmumali.ch4_jumeleordre.model.*; +import com.pmumali.ch4_jumeleordre.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.stream.Collectors; @Service public class ResultatCourseService { diff --git a/src/main/java/com/pmumali/trio/controller/ParisTrioController.java b/src/main/java/com/pmumali/ch5_trio/controller/ParisTrioController.java similarity index 78% rename from src/main/java/com/pmumali/trio/controller/ParisTrioController.java rename to src/main/java/com/pmumali/ch5_trio/controller/ParisTrioController.java index 7e752d4..81b6ff9 100644 --- a/src/main/java/com/pmumali/trio/controller/ParisTrioController.java +++ b/src/main/java/com/pmumali/ch5_trio/controller/ParisTrioController.java @@ -1,8 +1,8 @@ -package com.pmumali.trio.controller; +package com.pmumali.ch5_trio.controller; -import com.pmumali.trio.dto.ParisTrioDto; -import com.pmumali.trio.model.ParisTrio; -import com.pmumali.trio.service.ParisTrioService; +import com.pmumali.ch5_trio.dto.ParisTrioDto; +import com.pmumali.ch5_trio.model.ParisTrio; +import com.pmumali.ch5_trio.service.ParisTrioService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/trio/controller/ResultatCourseController.java b/src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseController.java similarity index 82% rename from src/main/java/com/pmumali/trio/controller/ResultatCourseController.java rename to src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseController.java index f326f3b..e84b327 100644 --- a/src/main/java/com/pmumali/trio/controller/ResultatCourseController.java +++ b/src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseController.java @@ -1,7 +1,7 @@ -package com.pmumali.trio.controller; +package com.pmumali.ch5_trio.controller; -import com.pmumali.trio.dto.ResultatCourseDto; -import com.pmumali.trio.service.ResultatCourseService; +import com.pmumali.ch5_trio.dto.ResultatCourseDto; +import com.pmumali.ch5_trio.service.ResultatCourseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/trio/dto/ParisTrioDto.java b/src/main/java/com/pmumali/ch5_trio/dto/ParisTrioDto.java similarity index 74% rename from src/main/java/com/pmumali/trio/dto/ParisTrioDto.java rename to src/main/java/com/pmumali/ch5_trio/dto/ParisTrioDto.java index f700594..69553e5 100644 --- a/src/main/java/com/pmumali/trio/dto/ParisTrioDto.java +++ b/src/main/java/com/pmumali/ch5_trio/dto/ParisTrioDto.java @@ -1,6 +1,6 @@ -package com.pmumali.trio.dto; +package com.pmumali.ch5_trio.dto; -import com.pmumali.trio.model.ParisTrio.TypeFormule; +import com.pmumali.ch5_trio.model.ParisTrio.TypeFormule; import lombok.Data; @Data diff --git a/src/main/java/com/pmumali/trio/dto/ResultatCourseDto.java b/src/main/java/com/pmumali/ch5_trio/dto/ResultatCourseDto.java similarity index 94% rename from src/main/java/com/pmumali/trio/dto/ResultatCourseDto.java rename to src/main/java/com/pmumali/ch5_trio/dto/ResultatCourseDto.java index 3d4e296..5fcd421 100644 --- a/src/main/java/com/pmumali/trio/dto/ResultatCourseDto.java +++ b/src/main/java/com/pmumali/ch5_trio/dto/ResultatCourseDto.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.dto; +package com.pmumali.ch5_trio.dto; import lombok.Data; diff --git a/src/main/java/com/pmumali/trio/exception/ChevalNonPartantException.java b/src/main/java/com/pmumali/ch5_trio/exception/ChevalNonPartantException.java similarity index 83% rename from src/main/java/com/pmumali/trio/exception/ChevalNonPartantException.java rename to src/main/java/com/pmumali/ch5_trio/exception/ChevalNonPartantException.java index 9feba09..d26dfc1 100644 --- a/src/main/java/com/pmumali/trio/exception/ChevalNonPartantException.java +++ b/src/main/java/com/pmumali/ch5_trio/exception/ChevalNonPartantException.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.exception; +package com.pmumali.ch5_trio.exception; public class ChevalNonPartantException extends ParisTrioInvalideException { public ChevalNonPartantException(String nomCheval) { diff --git a/src/main/java/com/pmumali/trio/exception/CourseDejaTermineeException.java b/src/main/java/com/pmumali/ch5_trio/exception/CourseDejaTermineeException.java similarity index 83% rename from src/main/java/com/pmumali/trio/exception/CourseDejaTermineeException.java rename to src/main/java/com/pmumali/ch5_trio/exception/CourseDejaTermineeException.java index 2947c1b..6c07c49 100644 --- a/src/main/java/com/pmumali/trio/exception/CourseDejaTermineeException.java +++ b/src/main/java/com/pmumali/ch5_trio/exception/CourseDejaTermineeException.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.exception; +package com.pmumali.ch5_trio.exception; public class CourseDejaTermineeException extends ParisTrioInvalideException { public CourseDejaTermineeException(Long idCourse) { diff --git a/src/main/java/com/pmumali/trio/exception/CourseInvalideException.java b/src/main/java/com/pmumali/ch5_trio/exception/CourseInvalideException.java similarity index 73% rename from src/main/java/com/pmumali/trio/exception/CourseInvalideException.java rename to src/main/java/com/pmumali/ch5_trio/exception/CourseInvalideException.java index 34af1cc..1848629 100644 --- a/src/main/java/com/pmumali/trio/exception/CourseInvalideException.java +++ b/src/main/java/com/pmumali/ch5_trio/exception/CourseInvalideException.java @@ -1,7 +1,7 @@ // CourseInvalideException.java -package com.pmumali.trio.exception; +package com.pmumali.ch5_trio.exception; -import com.pmumali.jumeleordre.exception.JumeleOrdreException; +import com.pmumali.ch4_jumeleordre.exception.JumeleOrdreException; public class CourseInvalideException extends JumeleOrdreException { public CourseInvalideException(String message) { diff --git a/src/main/java/com/pmumali/trio/exception/LimiteMiseDepasseeException.java b/src/main/java/com/pmumali/ch5_trio/exception/LimiteMiseDepasseeException.java similarity index 93% rename from src/main/java/com/pmumali/trio/exception/LimiteMiseDepasseeException.java rename to src/main/java/com/pmumali/ch5_trio/exception/LimiteMiseDepasseeException.java index 697a6fc..906c862 100644 --- a/src/main/java/com/pmumali/trio/exception/LimiteMiseDepasseeException.java +++ b/src/main/java/com/pmumali/ch5_trio/exception/LimiteMiseDepasseeException.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.exception; +package com.pmumali.ch5_trio.exception; public class LimiteMiseDepasseeException extends ParisTrioInvalideException { private final double miseActuelle; diff --git a/src/main/java/com/pmumali/trio/exception/NombreChevauxInvalideException.java b/src/main/java/com/pmumali/ch5_trio/exception/NombreChevauxInvalideException.java similarity index 83% rename from src/main/java/com/pmumali/trio/exception/NombreChevauxInvalideException.java rename to src/main/java/com/pmumali/ch5_trio/exception/NombreChevauxInvalideException.java index 03fbf6f..c91e7a8 100644 --- a/src/main/java/com/pmumali/trio/exception/NombreChevauxInvalideException.java +++ b/src/main/java/com/pmumali/ch5_trio/exception/NombreChevauxInvalideException.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.exception; +package com.pmumali.ch5_trio.exception; public class NombreChevauxInvalideException extends ParisTrioInvalideException { public NombreChevauxInvalideException(int nombre) { diff --git a/src/main/java/com/pmumali/trio/exception/ParisInvalideException.java b/src/main/java/com/pmumali/ch5_trio/exception/ParisInvalideException.java similarity index 73% rename from src/main/java/com/pmumali/trio/exception/ParisInvalideException.java rename to src/main/java/com/pmumali/ch5_trio/exception/ParisInvalideException.java index 1e84b10..5a4e86d 100644 --- a/src/main/java/com/pmumali/trio/exception/ParisInvalideException.java +++ b/src/main/java/com/pmumali/ch5_trio/exception/ParisInvalideException.java @@ -1,7 +1,7 @@ // ParisInvalideException.java -package com.pmumali.trio.exception; +package com.pmumali.ch5_trio.exception; -import com.pmumali.jumeleordre.exception.JumeleOrdreException; +import com.pmumali.ch4_jumeleordre.exception.JumeleOrdreException; public class ParisInvalideException extends JumeleOrdreException { public ParisInvalideException(String message) { diff --git a/src/main/java/com/pmumali/trio/exception/ParisTrioInvalideException.java b/src/main/java/com/pmumali/ch5_trio/exception/ParisTrioInvalideException.java similarity index 79% rename from src/main/java/com/pmumali/trio/exception/ParisTrioInvalideException.java rename to src/main/java/com/pmumali/ch5_trio/exception/ParisTrioInvalideException.java index 1e9eaa8..498c454 100644 --- a/src/main/java/com/pmumali/trio/exception/ParisTrioInvalideException.java +++ b/src/main/java/com/pmumali/ch5_trio/exception/ParisTrioInvalideException.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.exception; +package com.pmumali.ch5_trio.exception; public class ParisTrioInvalideException extends RuntimeException { public ParisTrioInvalideException(String message) { diff --git a/src/main/java/com/pmumali/trio/model/Cagnotte.java b/src/main/java/com/pmumali/ch5_trio/model/Cagnotte.java similarity index 97% rename from src/main/java/com/pmumali/trio/model/Cagnotte.java rename to src/main/java/com/pmumali/ch5_trio/model/Cagnotte.java index 6186a29..7b35f7e 100644 --- a/src/main/java/com/pmumali/trio/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch5_trio/model/Cagnotte.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.model; +package com.pmumali.ch5_trio.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trio/model/Cheval.java b/src/main/java/com/pmumali/ch5_trio/model/Cheval.java similarity index 88% rename from src/main/java/com/pmumali/trio/model/Cheval.java rename to src/main/java/com/pmumali/ch5_trio/model/Cheval.java index a88b1b7..8035aea 100644 --- a/src/main/java/com/pmumali/trio/model/Cheval.java +++ b/src/main/java/com/pmumali/ch5_trio/model/Cheval.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.model; +package com.pmumali.ch5_trio.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trio/model/Course.java b/src/main/java/com/pmumali/ch5_trio/model/Course.java similarity index 81% rename from src/main/java/com/pmumali/trio/model/Course.java rename to src/main/java/com/pmumali/ch5_trio/model/Course.java index 30685e4..56db2fe 100644 --- a/src/main/java/com/pmumali/trio/model/Course.java +++ b/src/main/java/com/pmumali/ch5_trio/model/Course.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.model; +package com.pmumali.ch5_trio.model; import jakarta.persistence.*; import lombok.Data; @@ -16,7 +16,7 @@ public class Course { private LocalDateTime heureDebut; @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List chevaux; + private List chevaux; private boolean estTerminee; private boolean aDeadHeat; } \ No newline at end of file diff --git a/src/main/java/com/pmumali/trio/model/ParisTrio.java b/src/main/java/com/pmumali/ch5_trio/model/ParisTrio.java similarity index 95% rename from src/main/java/com/pmumali/trio/model/ParisTrio.java rename to src/main/java/com/pmumali/ch5_trio/model/ParisTrio.java index 9e8a0e2..95a945c 100644 --- a/src/main/java/com/pmumali/trio/model/ParisTrio.java +++ b/src/main/java/com/pmumali/ch5_trio/model/ParisTrio.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.model; +package com.pmumali.ch5_trio.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trio/model/ResultatCourse.java b/src/main/java/com/pmumali/ch5_trio/model/ResultatCourse.java similarity index 95% rename from src/main/java/com/pmumali/trio/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch5_trio/model/ResultatCourse.java index f0a9f4f..4be0474 100644 --- a/src/main/java/com/pmumali/trio/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch5_trio/model/ResultatCourse.java @@ -1,4 +1,4 @@ -package com.pmumali.trio.model; +package com.pmumali.ch5_trio.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trio/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/CagnotteRepository.java similarity index 88% rename from src/main/java/com/pmumali/trio/repository/CagnotteRepository.java rename to src/main/java/com/pmumali/ch5_trio/repository/CagnotteRepository.java index c725f90..584ffbc 100644 --- a/src/main/java/com/pmumali/trio/repository/CagnotteRepository.java +++ b/src/main/java/com/pmumali/ch5_trio/repository/CagnotteRepository.java @@ -1,7 +1,7 @@ -package com.pmumali.trio.repository; +package com.pmumali.ch5_trio.repository; -import com.pmumali.trio.model.Cagnotte; -import com.pmumali.trio.model.Course; +import com.pmumali.ch5_trio.model.Cagnotte; +import com.pmumali.ch5_trio.model.Course; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trio/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/ChevalRepository.java similarity index 85% rename from src/main/java/com/pmumali/trio/repository/ChevalRepository.java rename to src/main/java/com/pmumali/ch5_trio/repository/ChevalRepository.java index 2617b1f..27f993f 100644 --- a/src/main/java/com/pmumali/trio/repository/ChevalRepository.java +++ b/src/main/java/com/pmumali/ch5_trio/repository/ChevalRepository.java @@ -1,7 +1,7 @@ -package com.pmumali.trio.repository; +package com.pmumali.ch5_trio.repository; -import com.pmumali.trio.model.Cheval; -import com.pmumali.trio.model.Course; +import com.pmumali.ch5_trio.model.Cheval; +import com.pmumali.ch5_trio.model.Course; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trio/repository/CourseRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/CourseRepository.java similarity index 89% rename from src/main/java/com/pmumali/trio/repository/CourseRepository.java rename to src/main/java/com/pmumali/ch5_trio/repository/CourseRepository.java index 962fb8a..0db5f69 100644 --- a/src/main/java/com/pmumali/trio/repository/CourseRepository.java +++ b/src/main/java/com/pmumali/ch5_trio/repository/CourseRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.trio.repository; +package com.pmumali.ch5_trio.repository; -import com.pmumali.trio.model.Course; +import com.pmumali.ch5_trio.model.Course; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trio/repository/ParisTrioRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/ParisTrioRepository.java similarity index 90% rename from src/main/java/com/pmumali/trio/repository/ParisTrioRepository.java rename to src/main/java/com/pmumali/ch5_trio/repository/ParisTrioRepository.java index d277238..493cd81 100644 --- a/src/main/java/com/pmumali/trio/repository/ParisTrioRepository.java +++ b/src/main/java/com/pmumali/ch5_trio/repository/ParisTrioRepository.java @@ -1,9 +1,9 @@ -package com.pmumali.trio.repository; +package com.pmumali.ch5_trio.repository; -import com.pmumali.trio.model.Course; -import com.pmumali.trio.model.Cheval; -import com.pmumali.trio.model.ParisTrio; -import com.pmumali.trio.model.ParisTrio.StatutParis; +import com.pmumali.ch5_trio.model.Course; +import com.pmumali.ch5_trio.model.Cheval; +import com.pmumali.ch5_trio.model.ParisTrio; +import com.pmumali.ch5_trio.model.ParisTrio.StatutParis; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trio/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseRepository.java similarity index 86% rename from src/main/java/com/pmumali/trio/repository/ResultatCourseRepository.java rename to src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseRepository.java index 736c95e..9d84ea4 100644 --- a/src/main/java/com/pmumali/trio/repository/ResultatCourseRepository.java +++ b/src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseRepository.java @@ -1,7 +1,7 @@ -package com.pmumali.trio.repository; +package com.pmumali.ch5_trio.repository; -import com.pmumali.trio.model.Course; -import com.pmumali.trio.model.ResultatCourse; +import com.pmumali.ch5_trio.model.Course; +import com.pmumali.ch5_trio.model.ResultatCourse; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trio/service/ParisTrioService.java b/src/main/java/com/pmumali/ch5_trio/service/ParisTrioService.java similarity index 92% rename from src/main/java/com/pmumali/trio/service/ParisTrioService.java rename to src/main/java/com/pmumali/ch5_trio/service/ParisTrioService.java index c10e6d4..1d34df3 100644 --- a/src/main/java/com/pmumali/trio/service/ParisTrioService.java +++ b/src/main/java/com/pmumali/ch5_trio/service/ParisTrioService.java @@ -1,16 +1,15 @@ -package com.pmumali.trio.service; +package com.pmumali.ch5_trio.service; -import com.pmumali.jumeleordre.exception.ChevalInvalideException; -import com.pmumali.trio.dto.ParisTrioDto; -import com.pmumali.trio.exception.*; -import com.pmumali.trio.model.*; -import com.pmumali.trio.repository.*; +import com.pmumali.ch4_jumeleordre.exception.ChevalInvalideException; +import com.pmumali.ch5_trio.dto.ParisTrioDto; +import com.pmumali.ch5_trio.exception.*; +import com.pmumali.ch5_trio.model.*; +import com.pmumali.ch5_trio.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.List; @Service public class ParisTrioService { diff --git a/src/main/java/com/pmumali/trio/service/ResultatCourseService.java b/src/main/java/com/pmumali/ch5_trio/service/ResultatCourseService.java similarity index 96% rename from src/main/java/com/pmumali/trio/service/ResultatCourseService.java rename to src/main/java/com/pmumali/ch5_trio/service/ResultatCourseService.java index 8780434..fb22cb2 100644 --- a/src/main/java/com/pmumali/trio/service/ResultatCourseService.java +++ b/src/main/java/com/pmumali/ch5_trio/service/ResultatCourseService.java @@ -1,10 +1,9 @@ -package com.pmumali.trio.service; +package com.pmumali.ch5_trio.service; -import com.pmumali.jumeleordre.exception.ResultatCourseInvalideException; -import com.pmumali.trio.dto.ResultatCourseDto; -import com.pmumali.trio.exception.*; -import com.pmumali.trio.model.*; -import com.pmumali.trio.repository.*; +import com.pmumali.ch4_jumeleordre.exception.ResultatCourseInvalideException; +import com.pmumali.ch5_trio.dto.ResultatCourseDto; +import com.pmumali.ch5_trio.model.*; +import com.pmumali.ch5_trio.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/pmumali/trioordre/controller/ParisTrioOrdreController.java b/src/main/java/com/pmumali/ch6_trioordre/controller/ParisTrioOrdreController.java similarity index 75% rename from src/main/java/com/pmumali/trioordre/controller/ParisTrioOrdreController.java rename to src/main/java/com/pmumali/ch6_trioordre/controller/ParisTrioOrdreController.java index 0e76f3b..5fbc73a 100644 --- a/src/main/java/com/pmumali/trioordre/controller/ParisTrioOrdreController.java +++ b/src/main/java/com/pmumali/ch6_trioordre/controller/ParisTrioOrdreController.java @@ -1,8 +1,8 @@ -package com.pmumali.trioordre.controller; +package com.pmumali.ch6_trioordre.controller; -import com.pmumali.trioordre.dto.ParisTrioOrdreDto; -import com.pmumali.trioordre.model.ParisTrioOrdre; -import com.pmumali.trioordre.service.ParisTrioOrdreService; +import com.pmumali.ch6_trioordre.dto.ParisTrioOrdreDto; +import com.pmumali.ch6_trioordre.model.ParisTrioOrdre; +import com.pmumali.ch6_trioordre.service.ParisTrioOrdreService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/trioordre/controller/ResultatCourseController.java b/src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseController.java similarity index 80% rename from src/main/java/com/pmumali/trioordre/controller/ResultatCourseController.java rename to src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseController.java index 4e48ed0..64cf28f 100644 --- a/src/main/java/com/pmumali/trioordre/controller/ResultatCourseController.java +++ b/src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseController.java @@ -1,7 +1,7 @@ -package com.pmumali.trioordre.controller; +package com.pmumali.ch6_trioordre.controller; -import com.pmumali.trioordre.dto.ResultatCourseDto; -import com.pmumali.trioordre.service.ResultatCourseService; +import com.pmumali.ch6_trioordre.dto.ResultatCourseDto; +import com.pmumali.ch6_trioordre.service.ResultatCourseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/trioordre/dto/ParisTrioOrdreDto.java b/src/main/java/com/pmumali/ch6_trioordre/dto/ParisTrioOrdreDto.java similarity index 71% rename from src/main/java/com/pmumali/trioordre/dto/ParisTrioOrdreDto.java rename to src/main/java/com/pmumali/ch6_trioordre/dto/ParisTrioOrdreDto.java index 2006ceb..0257ef2 100644 --- a/src/main/java/com/pmumali/trioordre/dto/ParisTrioOrdreDto.java +++ b/src/main/java/com/pmumali/ch6_trioordre/dto/ParisTrioOrdreDto.java @@ -1,6 +1,6 @@ -package com.pmumali.trioordre.dto; +package com.pmumali.ch6_trioordre.dto; -import com.pmumali.trioordre.model.ParisTrioOrdre.TypeFormule; +import com.pmumali.ch6_trioordre.model.ParisTrioOrdre.TypeFormule; import lombok.Data; @Data diff --git a/src/main/java/com/pmumali/trioordre/dto/ResultatCourseDto.java b/src/main/java/com/pmumali/ch6_trioordre/dto/ResultatCourseDto.java similarity index 90% rename from src/main/java/com/pmumali/trioordre/dto/ResultatCourseDto.java rename to src/main/java/com/pmumali/ch6_trioordre/dto/ResultatCourseDto.java index 8d75b5b..1cbb4f9 100644 --- a/src/main/java/com/pmumali/trioordre/dto/ResultatCourseDto.java +++ b/src/main/java/com/pmumali/ch6_trioordre/dto/ResultatCourseDto.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.dto; +package com.pmumali.ch6_trioordre.dto; import lombok.Data; diff --git a/src/main/java/com/pmumali/trioordre/exception/CagnotteDejaUtiliseeException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteDejaUtiliseeException.java similarity index 83% rename from src/main/java/com/pmumali/trioordre/exception/CagnotteDejaUtiliseeException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteDejaUtiliseeException.java index 3a0dcdd..d8bc7dd 100644 --- a/src/main/java/com/pmumali/trioordre/exception/CagnotteDejaUtiliseeException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteDejaUtiliseeException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class CagnotteDejaUtiliseeException extends CagnotteException { public CagnotteDejaUtiliseeException(Long idCagnotte) { diff --git a/src/main/java/com/pmumali/trioordre/exception/CagnotteException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteException.java similarity index 75% rename from src/main/java/com/pmumali/trioordre/exception/CagnotteException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteException.java index 68fcef0..d2bad56 100644 --- a/src/main/java/com/pmumali/trioordre/exception/CagnotteException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class CagnotteException extends TrioOrdreException { public CagnotteException(String message) { diff --git a/src/main/java/com/pmumali/trioordre/exception/CagnotteNonDisponibleException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteNonDisponibleException.java similarity index 79% rename from src/main/java/com/pmumali/trioordre/exception/CagnotteNonDisponibleException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteNonDisponibleException.java index 05d5904..b72870d 100644 --- a/src/main/java/com/pmumali/trioordre/exception/CagnotteNonDisponibleException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/CagnotteNonDisponibleException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class CagnotteNonDisponibleException extends CagnotteException { public CagnotteNonDisponibleException() { diff --git a/src/main/java/com/pmumali/trioordre/exception/ChevalException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/ChevalException.java similarity index 75% rename from src/main/java/com/pmumali/trioordre/exception/ChevalException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/ChevalException.java index d9a7f4b..e79fd97 100644 --- a/src/main/java/com/pmumali/trioordre/exception/ChevalException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/ChevalException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class ChevalException extends TrioOrdreException { public ChevalException(String message) { diff --git a/src/main/java/com/pmumali/trioordre/exception/ChevalNonPartantException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/ChevalNonPartantException.java similarity index 81% rename from src/main/java/com/pmumali/trioordre/exception/ChevalNonPartantException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/ChevalNonPartantException.java index 47c0456..e005adf 100644 --- a/src/main/java/com/pmumali/trioordre/exception/ChevalNonPartantException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/ChevalNonPartantException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class ChevalNonPartantException extends ChevalException { public ChevalNonPartantException(String nomCheval) { diff --git a/src/main/java/com/pmumali/trioordre/exception/ChevalNonTrouveException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/ChevalNonTrouveException.java similarity index 81% rename from src/main/java/com/pmumali/trioordre/exception/ChevalNonTrouveException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/ChevalNonTrouveException.java index b62caff..fe62bc9 100644 --- a/src/main/java/com/pmumali/trioordre/exception/ChevalNonTrouveException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/ChevalNonTrouveException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class ChevalNonTrouveException extends ChevalException { public ChevalNonTrouveException(Long idCheval) { diff --git a/src/main/java/com/pmumali/trioordre/exception/CombinaisonInvalideException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/CombinaisonInvalideException.java similarity index 82% rename from src/main/java/com/pmumali/trioordre/exception/CombinaisonInvalideException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/CombinaisonInvalideException.java index d45fbdb..5a66764 100644 --- a/src/main/java/com/pmumali/trioordre/exception/CombinaisonInvalideException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/CombinaisonInvalideException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class CombinaisonInvalideException extends ParisTrioOrdreException { public CombinaisonInvalideException() { diff --git a/src/main/java/com/pmumali/trioordre/exception/CourseDejaTermineeException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/CourseDejaTermineeException.java similarity index 82% rename from src/main/java/com/pmumali/trioordre/exception/CourseDejaTermineeException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/CourseDejaTermineeException.java index 1260fe9..aab03b6 100644 --- a/src/main/java/com/pmumali/trioordre/exception/CourseDejaTermineeException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/CourseDejaTermineeException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class CourseDejaTermineeException extends CourseException { public CourseDejaTermineeException(Long idCourse) { diff --git a/src/main/java/com/pmumali/trioordre/exception/CourseException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/CourseException.java similarity index 75% rename from src/main/java/com/pmumali/trioordre/exception/CourseException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/CourseException.java index 4e63ab3..ed33e58 100644 --- a/src/main/java/com/pmumali/trioordre/exception/CourseException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/CourseException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class CourseException extends TrioOrdreException { public CourseException(String message) { diff --git a/src/main/java/com/pmumali/trioordre/exception/CourseNonEligibleException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/CourseNonEligibleException.java similarity index 88% rename from src/main/java/com/pmumali/trioordre/exception/CourseNonEligibleException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/CourseNonEligibleException.java index 8050fde..652de29 100644 --- a/src/main/java/com/pmumali/trioordre/exception/CourseNonEligibleException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/CourseNonEligibleException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class CourseNonEligibleException extends CourseException { private final int nombreChevaux; diff --git a/src/main/java/com/pmumali/trioordre/exception/GlobalExceptionHandler.java b/src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandler.java similarity index 98% rename from src/main/java/com/pmumali/trioordre/exception/GlobalExceptionHandler.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandler.java index 8533cdc..8ef8c33 100644 --- a/src/main/java/com/pmumali/trioordre/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandler.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/pmumali/trioordre/exception/LimiteMiseDepasseeException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/LimiteMiseDepasseeException.java similarity index 87% rename from src/main/java/com/pmumali/trioordre/exception/LimiteMiseDepasseeException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/LimiteMiseDepasseeException.java index 52288bc..38d59b9 100644 --- a/src/main/java/com/pmumali/trioordre/exception/LimiteMiseDepasseeException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/LimiteMiseDepasseeException.java @@ -1,6 +1,5 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; -import lombok.Data; import lombok.Getter; @Getter diff --git a/src/main/java/com/pmumali/trioordre/exception/MiseInvalideException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/MiseInvalideException.java similarity index 90% rename from src/main/java/com/pmumali/trioordre/exception/MiseInvalideException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/MiseInvalideException.java index 4f2ef0d..99b8969 100644 --- a/src/main/java/com/pmumali/trioordre/exception/MiseInvalideException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/MiseInvalideException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; import lombok.Getter; diff --git a/src/main/java/com/pmumali/trioordre/exception/ParisTrioOrdreException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/ParisTrioOrdreException.java similarity index 77% rename from src/main/java/com/pmumali/trioordre/exception/ParisTrioOrdreException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/ParisTrioOrdreException.java index 27a07fa..b0be467 100644 --- a/src/main/java/com/pmumali/trioordre/exception/ParisTrioOrdreException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/ParisTrioOrdreException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class ParisTrioOrdreException extends TrioOrdreException { public ParisTrioOrdreException(String message) { diff --git a/src/main/java/com/pmumali/trioordre/exception/ResultatCourseException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/ResultatCourseException.java similarity index 77% rename from src/main/java/com/pmumali/trioordre/exception/ResultatCourseException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/ResultatCourseException.java index 4267e5c..8d9d944 100644 --- a/src/main/java/com/pmumali/trioordre/exception/ResultatCourseException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/ResultatCourseException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class ResultatCourseException extends TrioOrdreException { public ResultatCourseException(String message) { diff --git a/src/main/java/com/pmumali/trioordre/exception/ResultatCourseInvalideException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/ResultatCourseInvalideException.java similarity index 74% rename from src/main/java/com/pmumali/trioordre/exception/ResultatCourseInvalideException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/ResultatCourseInvalideException.java index dd4a514..1835215 100644 --- a/src/main/java/com/pmumali/trioordre/exception/ResultatCourseInvalideException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/ResultatCourseInvalideException.java @@ -1,7 +1,7 @@ // ResultatCourseInvalideException.java -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; -import com.pmumali.jumeleordre.exception.JumeleOrdreException; +import com.pmumali.ch4_jumeleordre.exception.JumeleOrdreException; public class ResultatCourseInvalideException extends JumeleOrdreException { public ResultatCourseInvalideException(String message) { diff --git a/src/main/java/com/pmumali/trioordre/exception/ResultatDejaEnregistreException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/ResultatDejaEnregistreException.java similarity index 83% rename from src/main/java/com/pmumali/trioordre/exception/ResultatDejaEnregistreException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/ResultatDejaEnregistreException.java index 8b329c9..7a6f9ca 100644 --- a/src/main/java/com/pmumali/trioordre/exception/ResultatDejaEnregistreException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/ResultatDejaEnregistreException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class ResultatDejaEnregistreException extends ResultatCourseException { public ResultatDejaEnregistreException(Long idCourse) { diff --git a/src/main/java/com/pmumali/trioordre/exception/ResultatIncompletException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/ResultatIncompletException.java similarity index 82% rename from src/main/java/com/pmumali/trioordre/exception/ResultatIncompletException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/ResultatIncompletException.java index 5915098..87fd3fd 100644 --- a/src/main/java/com/pmumali/trioordre/exception/ResultatIncompletException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/ResultatIncompletException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class ResultatIncompletException extends ResultatCourseException { public ResultatIncompletException() { diff --git a/src/main/java/com/pmumali/trioordre/exception/TrioOrdreException.java b/src/main/java/com/pmumali/ch6_trioordre/exception/TrioOrdreException.java similarity index 84% rename from src/main/java/com/pmumali/trioordre/exception/TrioOrdreException.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/TrioOrdreException.java index 4e46de8..b178196 100644 --- a/src/main/java/com/pmumali/trioordre/exception/TrioOrdreException.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/TrioOrdreException.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.exception; +package com.pmumali.ch6_trioordre.exception; public class TrioOrdreException extends RuntimeException { public TrioOrdreException(String message) { diff --git a/src/main/java/com/pmumali/trioordre/model/Cagnotte.java b/src/main/java/com/pmumali/ch6_trioordre/model/Cagnotte.java similarity index 94% rename from src/main/java/com/pmumali/trioordre/model/Cagnotte.java rename to src/main/java/com/pmumali/ch6_trioordre/model/Cagnotte.java index dae08c9..28aa4fe 100644 --- a/src/main/java/com/pmumali/trioordre/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/Cagnotte.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.model; +package com.pmumali.ch6_trioordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trioordre/model/Cheval.java b/src/main/java/com/pmumali/ch6_trioordre/model/Cheval.java similarity index 86% rename from src/main/java/com/pmumali/trioordre/model/Cheval.java rename to src/main/java/com/pmumali/ch6_trioordre/model/Cheval.java index 76c8ea1..3056844 100644 --- a/src/main/java/com/pmumali/trioordre/model/Cheval.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/Cheval.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.model; +package com.pmumali.ch6_trioordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trioordre/model/Course.java b/src/main/java/com/pmumali/ch6_trioordre/model/Course.java similarity index 93% rename from src/main/java/com/pmumali/trioordre/model/Course.java rename to src/main/java/com/pmumali/ch6_trioordre/model/Course.java index 32481cd..50a0417 100644 --- a/src/main/java/com/pmumali/trioordre/model/Course.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/Course.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.model; +package com.pmumali.ch6_trioordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trioordre/model/ParisTrioOrdre.java b/src/main/java/com/pmumali/ch6_trioordre/model/ParisTrioOrdre.java similarity index 96% rename from src/main/java/com/pmumali/trioordre/model/ParisTrioOrdre.java rename to src/main/java/com/pmumali/ch6_trioordre/model/ParisTrioOrdre.java index 48d4dc3..f0a5731 100644 --- a/src/main/java/com/pmumali/trioordre/model/ParisTrioOrdre.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/ParisTrioOrdre.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.model; +package com.pmumali.ch6_trioordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trioordre/model/ResultatCourse.java b/src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourse.java similarity index 96% rename from src/main/java/com/pmumali/trioordre/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourse.java index e96ae46..cf8762c 100644 --- a/src/main/java/com/pmumali/trioordre/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourse.java @@ -1,4 +1,4 @@ -package com.pmumali.trioordre.model; +package com.pmumali.ch6_trioordre.model; import jakarta.persistence.*; import lombok.Data; diff --git a/src/main/java/com/pmumali/trioordre/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteRepository.java similarity index 69% rename from src/main/java/com/pmumali/trioordre/repository/CagnotteRepository.java rename to src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteRepository.java index 94f1333..13a5837 100644 --- a/src/main/java/com/pmumali/trioordre/repository/CagnotteRepository.java +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteRepository.java @@ -1,7 +1,7 @@ -package com.pmumali.trioordre.repository; +package com.pmumali.ch6_trioordre.repository; -import com.pmumali.trioordre.model.Cagnotte; -import com.pmumali.trioordre.model.Course; +import com.pmumali.ch6_trioordre.model.Cagnotte; +import com.pmumali.ch6_trioordre.model.Course; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trioordre/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/ChevalRepository.java similarity index 94% rename from src/main/java/com/pmumali/trioordre/repository/ChevalRepository.java rename to src/main/java/com/pmumali/ch6_trioordre/repository/ChevalRepository.java index aa82c06..ca88d7b 100644 --- a/src/main/java/com/pmumali/trioordre/repository/ChevalRepository.java +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/ChevalRepository.java @@ -1,7 +1,7 @@ -package com.pmumali.trioordre.repository; +package com.pmumali.ch6_trioordre.repository; -import com.pmumali.trioordre.model.Cheval; -import com.pmumali.trioordre.model.Course; +import com.pmumali.ch6_trioordre.model.Cheval; +import com.pmumali.ch6_trioordre.model.Course; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trioordre/repository/CourseRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/CourseRepository.java similarity index 95% rename from src/main/java/com/pmumali/trioordre/repository/CourseRepository.java rename to src/main/java/com/pmumali/ch6_trioordre/repository/CourseRepository.java index 15efdaf..f431436 100644 --- a/src/main/java/com/pmumali/trioordre/repository/CourseRepository.java +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/CourseRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.trioordre.repository; +package com.pmumali.ch6_trioordre.repository; -import com.pmumali.trioordre.model.Course; +import com.pmumali.ch6_trioordre.model.Course; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trioordre/repository/ParisTrioOrdreRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/ParisTrioOrdreRepository.java similarity index 85% rename from src/main/java/com/pmumali/trioordre/repository/ParisTrioOrdreRepository.java rename to src/main/java/com/pmumali/ch6_trioordre/repository/ParisTrioOrdreRepository.java index f908e06..d465ee9 100644 --- a/src/main/java/com/pmumali/trioordre/repository/ParisTrioOrdreRepository.java +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/ParisTrioOrdreRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.trioordre.repository; +package com.pmumali.ch6_trioordre.repository; -import com.pmumali.trioordre.model.*; +import com.pmumali.ch6_trioordre.model.*; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/trioordre/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseRepository.java similarity index 60% rename from src/main/java/com/pmumali/trioordre/repository/ResultatCourseRepository.java rename to src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseRepository.java index 9c00400..0763979 100644 --- a/src/main/java/com/pmumali/trioordre/repository/ResultatCourseRepository.java +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.trioordre.repository; +package com.pmumali.ch6_trioordre.repository; -import com.pmumali.trioordre.model.ResultatCourse; +import com.pmumali.ch6_trioordre.model.ResultatCourse; import org.springframework.data.jpa.repository.JpaRepository; public interface ResultatCourseRepository extends JpaRepository { diff --git a/src/main/java/com/pmumali/trioordre/service/ParisTrioOrdreService.java b/src/main/java/com/pmumali/ch6_trioordre/service/ParisTrioOrdreService.java similarity index 87% rename from src/main/java/com/pmumali/trioordre/service/ParisTrioOrdreService.java rename to src/main/java/com/pmumali/ch6_trioordre/service/ParisTrioOrdreService.java index 9096675..8a92ae6 100644 --- a/src/main/java/com/pmumali/trioordre/service/ParisTrioOrdreService.java +++ b/src/main/java/com/pmumali/ch6_trioordre/service/ParisTrioOrdreService.java @@ -1,18 +1,17 @@ -package com.pmumali.trioordre.service; +package com.pmumali.ch6_trioordre.service; -import com.pmumali.jumeleordre.exception.ChevalInvalideException; -import com.pmumali.trio.exception.CourseInvalideException; -import com.pmumali.trio.exception.ParisInvalideException; -import com.pmumali.trioordre.dto.ParisTrioOrdreDto; -import com.pmumali.trioordre.exception.*; -import com.pmumali.trioordre.model.*; -import com.pmumali.trioordre.repository.*; +import com.pmumali.ch4_jumeleordre.exception.ChevalInvalideException; +import com.pmumali.ch5_trio.exception.CourseInvalideException; +import com.pmumali.ch5_trio.exception.ParisInvalideException; +import com.pmumali.ch6_trioordre.dto.ParisTrioOrdreDto; +import com.pmumali.ch6_trioordre.exception.*; +import com.pmumali.ch6_trioordre.model.*; +import com.pmumali.ch6_trioordre.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.List; @Service public class ParisTrioOrdreService { diff --git a/src/main/java/com/pmumali/trioordre/service/ResultatCourseService.java b/src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseService.java similarity index 97% rename from src/main/java/com/pmumali/trioordre/service/ResultatCourseService.java rename to src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseService.java index 47b9189..125f4b2 100644 --- a/src/main/java/com/pmumali/trioordre/service/ResultatCourseService.java +++ b/src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseService.java @@ -1,10 +1,10 @@ -package com.pmumali.trioordre.service; +package com.pmumali.ch6_trioordre.service; -import com.pmumali.trioordre.dto.ResultatCourseDto; -import com.pmumali.trioordre.exception.*; -import com.pmumali.trioordre.model.*; -import com.pmumali.trioordre.repository.*; +import com.pmumali.ch6_trioordre.dto.ResultatCourseDto; +import com.pmumali.ch6_trioordre.exception.*; +import com.pmumali.ch6_trioordre.model.*; +import com.pmumali.ch6_trioordre.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/pmumali/triplet/controller/CourseController.java b/src/main/java/com/pmumali/ch7_triplet/controller/CourseController.java similarity index 93% rename from src/main/java/com/pmumali/triplet/controller/CourseController.java rename to src/main/java/com/pmumali/ch7_triplet/controller/CourseController.java index 2eab3f9..f57de45 100644 --- a/src/main/java/com/pmumali/triplet/controller/CourseController.java +++ b/src/main/java/com/pmumali/ch7_triplet/controller/CourseController.java @@ -1,7 +1,7 @@ -package com.pmumali.triplet.controller; +package com.pmumali.ch7_triplet.controller; -import com.pmumali.triplet.model.Course; -import com.pmumali.triplet.service.CourseService; +import com.pmumali.ch7_triplet.model.Course; +import com.pmumali.ch7_triplet.service.CourseService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/triplet/controller/PariController.java b/src/main/java/com/pmumali/ch7_triplet/controller/PariController.java similarity index 96% rename from src/main/java/com/pmumali/triplet/controller/PariController.java rename to src/main/java/com/pmumali/ch7_triplet/controller/PariController.java index bd05044..e43ff82 100644 --- a/src/main/java/com/pmumali/triplet/controller/PariController.java +++ b/src/main/java/com/pmumali/ch7_triplet/controller/PariController.java @@ -1,7 +1,7 @@ package com.pmu.mali.triplet.controller; -import com.pmumali.triplet.model.Pari; -import com.pmumali.triplet.service.PariService; +import com.pmumali.ch7_triplet.model.Pari; +import com.pmumali.ch7_triplet.service.PariService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/triplet/controller/ResultatController.java b/src/main/java/com/pmumali/ch7_triplet/controller/ResultatController.java similarity index 91% rename from src/main/java/com/pmumali/triplet/controller/ResultatController.java rename to src/main/java/com/pmumali/ch7_triplet/controller/ResultatController.java index 6cae6b7..2436752 100644 --- a/src/main/java/com/pmumali/triplet/controller/ResultatController.java +++ b/src/main/java/com/pmumali/ch7_triplet/controller/ResultatController.java @@ -1,8 +1,8 @@ package com.pmu.mali.triplet.controller; -import com.pmumali.triplet.model.ResultatCourse; -import com.pmumali.triplet.service.CalculGainsService; -import com.pmumali.triplet.service.ResultatCourseService; +import com.pmumali.ch7_triplet.model.ResultatCourse; +import com.pmumali.ch7_triplet.service.CalculGainsService; +import com.pmumali.ch7_triplet.service.ResultatCourseService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/triplet/model/Cagnotte.java b/src/main/java/com/pmumali/ch7_triplet/model/Cagnotte.java similarity index 95% rename from src/main/java/com/pmumali/triplet/model/Cagnotte.java rename to src/main/java/com/pmumali/ch7_triplet/model/Cagnotte.java index 7ae7b21..a1ef144 100644 --- a/src/main/java/com/pmumali/triplet/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/Cagnotte.java @@ -1,4 +1,4 @@ -package com.pmumali.triplet.model; +package com.pmumali.ch7_triplet.model; import lombok.*; import jakarta.persistence.*; diff --git a/src/main/java/com/pmumali/triplet/model/Cheval.java b/src/main/java/com/pmumali/ch7_triplet/model/Cheval.java similarity index 94% rename from src/main/java/com/pmumali/triplet/model/Cheval.java rename to src/main/java/com/pmumali/ch7_triplet/model/Cheval.java index 84c4752..edeefd3 100644 --- a/src/main/java/com/pmumali/triplet/model/Cheval.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/Cheval.java @@ -1,4 +1,4 @@ -package com.pmumali.triplet.model; +package com.pmumali.ch7_triplet.model; import lombok.*; import jakarta.persistence.*; diff --git a/src/main/java/com/pmumali/triplet/model/Course.java b/src/main/java/com/pmumali/ch7_triplet/model/Course.java similarity index 95% rename from src/main/java/com/pmumali/triplet/model/Course.java rename to src/main/java/com/pmumali/ch7_triplet/model/Course.java index f808d82..29f4738 100644 --- a/src/main/java/com/pmumali/triplet/model/Course.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/Course.java @@ -1,4 +1,4 @@ -package com.pmumali.triplet.model; +package com.pmumali.ch7_triplet.model; import lombok.*; import jakarta.persistence.*; diff --git a/src/main/java/com/pmumali/triplet/model/Pari.java b/src/main/java/com/pmumali/ch7_triplet/model/Pari.java similarity index 97% rename from src/main/java/com/pmumali/triplet/model/Pari.java rename to src/main/java/com/pmumali/ch7_triplet/model/Pari.java index 27bf88c..6c2e862 100644 --- a/src/main/java/com/pmumali/triplet/model/Pari.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/Pari.java @@ -1,4 +1,4 @@ -package com.pmumali.triplet.model; +package com.pmumali.ch7_triplet.model; import lombok.*; import jakarta.persistence.*; diff --git a/src/main/java/com/pmumali/triplet/model/ResultatCourse.java b/src/main/java/com/pmumali/ch7_triplet/model/ResultatCourse.java similarity index 96% rename from src/main/java/com/pmumali/triplet/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch7_triplet/model/ResultatCourse.java index 2a77887..62e8b1a 100644 --- a/src/main/java/com/pmumali/triplet/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/ResultatCourse.java @@ -1,4 +1,4 @@ -package com.pmumali.triplet.model; +package com.pmumali.ch7_triplet.model; import lombok.*; import jakarta.persistence.*; diff --git a/src/main/java/com/pmumali/triplet/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/CagnotteRepository.java similarity index 92% rename from src/main/java/com/pmumali/triplet/repository/CagnotteRepository.java rename to src/main/java/com/pmumali/ch7_triplet/repository/CagnotteRepository.java index 94273c6..4fe987f 100644 --- a/src/main/java/com/pmumali/triplet/repository/CagnotteRepository.java +++ b/src/main/java/com/pmumali/ch7_triplet/repository/CagnotteRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.triplet.repository; +package com.pmumali.ch7_triplet.repository; -import com.pmumali.triplet.model.Cagnotte; +import com.pmumali.ch7_triplet.model.Cagnotte; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/com/pmumali/triplet/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/ChevalRepository.java similarity index 94% rename from src/main/java/com/pmumali/triplet/repository/ChevalRepository.java rename to src/main/java/com/pmumali/ch7_triplet/repository/ChevalRepository.java index 4a543c2..a71e502 100644 --- a/src/main/java/com/pmumali/triplet/repository/ChevalRepository.java +++ b/src/main/java/com/pmumali/ch7_triplet/repository/ChevalRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.triplet.repository; +package com.pmumali.ch7_triplet.repository; -import com.pmumali.triplet.model.Cheval; +import com.pmumali.ch7_triplet.model.Cheval; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/com/pmumali/triplet/repository/CourseRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/CourseRepository.java similarity index 84% rename from src/main/java/com/pmumali/triplet/repository/CourseRepository.java rename to src/main/java/com/pmumali/ch7_triplet/repository/CourseRepository.java index 73b09ee..07b2216 100644 --- a/src/main/java/com/pmumali/triplet/repository/CourseRepository.java +++ b/src/main/java/com/pmumali/ch7_triplet/repository/CourseRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.triplet.repository; +package com.pmumali.ch7_triplet.repository; -import com.pmumali.triplet.model.Course; +import com.pmumali.ch7_triplet.model.Course; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/pmumali/triplet/repository/PariRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/PariRepository.java similarity index 96% rename from src/main/java/com/pmumali/triplet/repository/PariRepository.java rename to src/main/java/com/pmumali/ch7_triplet/repository/PariRepository.java index 725d0aa..7b23e48 100644 --- a/src/main/java/com/pmumali/triplet/repository/PariRepository.java +++ b/src/main/java/com/pmumali/ch7_triplet/repository/PariRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.triplet.repository; +package com.pmumali.ch7_triplet.repository; -import com.pmumali.triplet.model.Pari; +import com.pmumali.ch7_triplet.model.Pari; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/com/pmumali/triplet/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseRepository.java similarity index 94% rename from src/main/java/com/pmumali/triplet/repository/ResultatCourseRepository.java rename to src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseRepository.java index 97d867a..db11aee 100644 --- a/src/main/java/com/pmumali/triplet/repository/ResultatCourseRepository.java +++ b/src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.triplet.repository; +package com.pmumali.ch7_triplet.repository; -import com.pmumali.triplet.model.ResultatCourse; +import com.pmumali.ch7_triplet.model.ResultatCourse; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/com/pmumali/triplet/repository/StatistiqueRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueRepository.java similarity index 98% rename from src/main/java/com/pmumali/triplet/repository/StatistiqueRepository.java rename to src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueRepository.java index affcea5..eb77cdd 100644 --- a/src/main/java/com/pmumali/triplet/repository/StatistiqueRepository.java +++ b/src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueRepository.java @@ -1,4 +1,4 @@ -package com.pmumali.triplet.repository; +package com.pmumali.ch7_triplet.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -7,7 +7,6 @@ import org.springframework.stereotype.Repository; import java.time.LocalDate; import java.util.List; -import java.util.Map; @Repository public interface StatistiqueRepository extends JpaRepository { diff --git a/src/main/java/com/pmumali/triplet/service/CagnotteService.java b/src/main/java/com/pmumali/ch7_triplet/service/CagnotteService.java similarity index 93% rename from src/main/java/com/pmumali/triplet/service/CagnotteService.java rename to src/main/java/com/pmumali/ch7_triplet/service/CagnotteService.java index 5dc4b48..acf820b 100644 --- a/src/main/java/com/pmumali/triplet/service/CagnotteService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/CagnotteService.java @@ -1,8 +1,8 @@ -package com.pmumali.triplet.service; +package com.pmumali.ch7_triplet.service; -import com.pmumali.triplet.model.Cagnotte; -import com.pmumali.triplet.model.Course; -import com.pmumali.triplet.repository.CagnotteRepository; +import com.pmumali.ch7_triplet.model.Cagnotte; +import com.pmumali.ch7_triplet.model.Course; +import com.pmumali.ch7_triplet.repository.CagnotteRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/pmumali/triplet/service/CalculGainsService.java b/src/main/java/com/pmumali/ch7_triplet/service/CalculGainsService.java similarity index 98% rename from src/main/java/com/pmumali/triplet/service/CalculGainsService.java rename to src/main/java/com/pmumali/ch7_triplet/service/CalculGainsService.java index a91157b..a8bf3aa 100644 --- a/src/main/java/com/pmumali/triplet/service/CalculGainsService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/CalculGainsService.java @@ -1,9 +1,9 @@ -package com.pmumali.triplet.service; +package com.pmumali.ch7_triplet.service; -import com.pmumali.triplet.model.*; -import com.pmumali.triplet.repository.ChevalRepository; -import com.pmumali.triplet.repository.PariRepository; -import com.pmumali.triplet.repository.ResultatCourseRepository; +import com.pmumali.ch7_triplet.model.*; +import com.pmumali.ch7_triplet.repository.ChevalRepository; +import com.pmumali.ch7_triplet.repository.PariRepository; +import com.pmumali.ch7_triplet.repository.ResultatCourseRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/pmumali/triplet/service/CourseService.java b/src/main/java/com/pmumali/ch7_triplet/service/CourseService.java similarity index 91% rename from src/main/java/com/pmumali/triplet/service/CourseService.java rename to src/main/java/com/pmumali/ch7_triplet/service/CourseService.java index dbc20f9..3bba32f 100644 --- a/src/main/java/com/pmumali/triplet/service/CourseService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/CourseService.java @@ -1,7 +1,7 @@ -package com.pmumali.triplet.service; +package com.pmumali.ch7_triplet.service; -import com.pmumali.triplet.model.Course; -import com.pmumali.triplet.repository.CourseRepository; +import com.pmumali.ch7_triplet.model.Course; +import com.pmumali.ch7_triplet.repository.CourseRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/pmumali/triplet/service/PariService.java b/src/main/java/com/pmumali/ch7_triplet/service/PariService.java similarity index 93% rename from src/main/java/com/pmumali/triplet/service/PariService.java rename to src/main/java/com/pmumali/ch7_triplet/service/PariService.java index 1d1813c..92bf3ba 100644 --- a/src/main/java/com/pmumali/triplet/service/PariService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/PariService.java @@ -1,7 +1,7 @@ -package com.pmumali.triplet.service; +package com.pmumali.ch7_triplet.service; -import com.pmumali.triplet.model.Pari; -import com.pmumali.triplet.repository.PariRepository; +import com.pmumali.ch7_triplet.model.Pari; +import com.pmumali.ch7_triplet.repository.PariRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/pmumali/triplet/service/ResultatCourseService.java b/src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseService.java similarity index 80% rename from src/main/java/com/pmumali/triplet/service/ResultatCourseService.java rename to src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseService.java index 394f281..3f2adcd 100644 --- a/src/main/java/com/pmumali/triplet/service/ResultatCourseService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseService.java @@ -1,7 +1,7 @@ -package com.pmumali.triplet.service; +package com.pmumali.ch7_triplet.service; -import com.pmumali.triplet.model.ResultatCourse; -import com.pmumali.triplet.repository.ResultatCourseRepository; +import com.pmumali.ch7_triplet.model.ResultatCourse; +import com.pmumali.ch7_triplet.repository.ResultatCourseRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/pmumali/triplet/service/ValidationPariService.java b/src/main/java/com/pmumali/ch7_triplet/service/ValidationPariService.java similarity index 91% rename from src/main/java/com/pmumali/triplet/service/ValidationPariService.java rename to src/main/java/com/pmumali/ch7_triplet/service/ValidationPariService.java index 40a682d..33a1839 100644 --- a/src/main/java/com/pmumali/triplet/service/ValidationPariService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/ValidationPariService.java @@ -1,9 +1,9 @@ -package com.pmumali.triplet.service; +package com.pmumali.ch7_triplet.service; -import com.pmumali.triplet.model.Course; -import com.pmumali.triplet.model.Pari; -import com.pmumali.triplet.repository.ChevalRepository; -import com.pmumali.triplet.repository.CourseRepository; +import com.pmumali.ch7_triplet.model.Course; +import com.pmumali.ch7_triplet.model.Pari; +import com.pmumali.ch7_triplet.repository.ChevalRepository; +import com.pmumali.ch7_triplet.repository.CourseRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/pmumali/quatro/controller/ControllerQuatro.java b/src/main/java/com/pmumali/ch8_quatro/controller/ControllerQuatro.java similarity index 93% rename from src/main/java/com/pmumali/quatro/controller/ControllerQuatro.java rename to src/main/java/com/pmumali/ch8_quatro/controller/ControllerQuatro.java index 3d41f8e..a242b0a 100644 --- a/src/main/java/com/pmumali/quatro/controller/ControllerQuatro.java +++ b/src/main/java/com/pmumali/ch8_quatro/controller/ControllerQuatro.java @@ -1,8 +1,8 @@ -package com.pmumali.quatro.controller; +package com.pmumali.ch8_quatro.controller; -import com.pmumali.quatro.model.*; -import com.pmumali.quatro.repository.*; -import com.pmumali.quatro.service.ServiceQuatro; +import com.pmumali.ch8_quatro.model.*; +import com.pmumali.ch8_quatro.repository.*; +import com.pmumali.ch8_quatro.service.ServiceQuatro; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/quatro/exception/GestionnaireExceptionsGlobal.java b/src/main/java/com/pmumali/ch8_quatro/exception/GestionnaireExceptionsGlobal.java similarity index 95% rename from src/main/java/com/pmumali/quatro/exception/GestionnaireExceptionsGlobal.java rename to src/main/java/com/pmumali/ch8_quatro/exception/GestionnaireExceptionsGlobal.java index 9c198d0..9a16516 100644 --- a/src/main/java/com/pmumali/quatro/exception/GestionnaireExceptionsGlobal.java +++ b/src/main/java/com/pmumali/ch8_quatro/exception/GestionnaireExceptionsGlobal.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.exception; +package com.pmumali.ch8_quatro.exception; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/src/main/java/com/pmumali/quatro/model/Cheval.java b/src/main/java/com/pmumali/ch8_quatro/model/Cheval.java similarity index 82% rename from src/main/java/com/pmumali/quatro/model/Cheval.java rename to src/main/java/com/pmumali/ch8_quatro/model/Cheval.java index dda773f..5199cfd 100644 --- a/src/main/java/com/pmumali/quatro/model/Cheval.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/Cheval.java @@ -1,12 +1,9 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; import jakarta.persistence.*; import lombok.*; -import java.time.LocalDateTime; -import java.util.List; - @Entity @Data @NoArgsConstructor diff --git a/src/main/java/com/pmumali/quatro/model/Course.java b/src/main/java/com/pmumali/ch8_quatro/model/Course.java similarity index 95% rename from src/main/java/com/pmumali/quatro/model/Course.java rename to src/main/java/com/pmumali/ch8_quatro/model/Course.java index 12979f4..c56b0a1 100644 --- a/src/main/java/com/pmumali/quatro/model/Course.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/Course.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/quatro/model/Paiement.java b/src/main/java/com/pmumali/ch8_quatro/model/Paiement.java similarity index 94% rename from src/main/java/com/pmumali/quatro/model/Paiement.java rename to src/main/java/com/pmumali/ch8_quatro/model/Paiement.java index 247a6ca..efcf5c5 100644 --- a/src/main/java/com/pmumali/quatro/model/Paiement.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/Paiement.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/quatro/model/Pari.java b/src/main/java/com/pmumali/ch8_quatro/model/Pari.java similarity index 96% rename from src/main/java/com/pmumali/quatro/model/Pari.java rename to src/main/java/com/pmumali/ch8_quatro/model/Pari.java index 92a7b40..2ed8f12 100644 --- a/src/main/java/com/pmumali/quatro/model/Pari.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/Pari.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/quatro/model/Parieur.java b/src/main/java/com/pmumali/ch8_quatro/model/Parieur.java similarity index 91% rename from src/main/java/com/pmumali/quatro/model/Parieur.java rename to src/main/java/com/pmumali/ch8_quatro/model/Parieur.java index d22250f..80986ab 100644 --- a/src/main/java/com/pmumali/quatro/model/Parieur.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/Parieur.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/quatro/model/Position.java b/src/main/java/com/pmumali/ch8_quatro/model/Position.java similarity index 63% rename from src/main/java/com/pmumali/quatro/model/Position.java rename to src/main/java/com/pmumali/ch8_quatro/model/Position.java index fd8c024..3bd724f 100644 --- a/src/main/java/com/pmumali/quatro/model/Position.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/Position.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; public enum Position { PREMIER, SECOND, TROISIEME, QUATRIEME diff --git a/src/main/java/com/pmumali/quatro/model/ReponsePaiement.java b/src/main/java/com/pmumali/ch8_quatro/model/ReponsePaiement.java similarity index 86% rename from src/main/java/com/pmumali/quatro/model/ReponsePaiement.java rename to src/main/java/com/pmumali/ch8_quatro/model/ReponsePaiement.java index 6e4f232..b2944df 100644 --- a/src/main/java/com/pmumali/quatro/model/ReponsePaiement.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/ReponsePaiement.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/pmumali/quarteplus/model/RequetePari.java b/src/main/java/com/pmumali/ch8_quatro/model/RequetePari.java similarity index 85% rename from src/main/java/com/pmumali/quarteplus/model/RequetePari.java rename to src/main/java/com/pmumali/ch8_quatro/model/RequetePari.java index 345e2d8..1e344b8 100644 --- a/src/main/java/com/pmumali/quarteplus/model/RequetePari.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/RequetePari.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch8_quatro.model; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/pmumali/quatro/model/RequeteResultatCourse.java b/src/main/java/com/pmumali/ch8_quatro/model/RequeteResultatCourse.java similarity index 90% rename from src/main/java/com/pmumali/quatro/model/RequeteResultatCourse.java rename to src/main/java/com/pmumali/ch8_quatro/model/RequeteResultatCourse.java index 7fe3a01..086a160 100644 --- a/src/main/java/com/pmumali/quatro/model/RequeteResultatCourse.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/RequeteResultatCourse.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; import lombok.Data; diff --git a/src/main/java/com/pmumali/quatro/model/ResultatCourse.java b/src/main/java/com/pmumali/ch8_quatro/model/ResultatCourse.java similarity index 97% rename from src/main/java/com/pmumali/quatro/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch8_quatro/model/ResultatCourse.java index cd4fa99..6b7da1b 100644 --- a/src/main/java/com/pmumali/quatro/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/ResultatCourse.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/quatro/model/StatutCourse.java b/src/main/java/com/pmumali/ch8_quatro/model/StatutCourse.java similarity index 66% rename from src/main/java/com/pmumali/quatro/model/StatutCourse.java rename to src/main/java/com/pmumali/ch8_quatro/model/StatutCourse.java index e39b988..30e8b39 100644 --- a/src/main/java/com/pmumali/quatro/model/StatutCourse.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/StatutCourse.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; public enum StatutCourse { PROGRAMMEE, EN_COURS, TERMINEE, ANNULEE diff --git a/src/main/java/com/pmumali/quatro/model/TypePaiement.java b/src/main/java/com/pmumali/ch8_quatro/model/TypePaiement.java similarity index 73% rename from src/main/java/com/pmumali/quatro/model/TypePaiement.java rename to src/main/java/com/pmumali/ch8_quatro/model/TypePaiement.java index 0eedeb5..b27d49f 100644 --- a/src/main/java/com/pmumali/quatro/model/TypePaiement.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/TypePaiement.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; public enum TypePaiement { QUATRO, SPECIAL_TRIO, SPECIAL_JUMELE, SPECIAL_GAGNANT, REMBOURSEMENT diff --git a/src/main/java/com/pmumali/quatro/model/TypePari.java b/src/main/java/com/pmumali/ch8_quatro/model/TypePari.java similarity index 79% rename from src/main/java/com/pmumali/quatro/model/TypePari.java rename to src/main/java/com/pmumali/ch8_quatro/model/TypePari.java index 70f02fb..d81dd73 100644 --- a/src/main/java/com/pmumali/quatro/model/TypePari.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/TypePari.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch8_quatro.model; public enum TypePari { UNITAIRE, COMBINE, CHAMP_TOTAL_3, CHAMP_PARTIEL_3, diff --git a/src/main/java/com/pmumali/quatro/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/ChevalRepository.java similarity index 75% rename from src/main/java/com/pmumali/quatro/repository/ChevalRepository.java rename to src/main/java/com/pmumali/ch8_quatro/repository/ChevalRepository.java index 4363316..d6fce5b 100644 --- a/src/main/java/com/pmumali/quatro/repository/ChevalRepository.java +++ b/src/main/java/com/pmumali/ch8_quatro/repository/ChevalRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quatro.repository; +package com.pmumali.ch8_quatro.repository; -import com.pmumali.quatro.model.Cheval; +import com.pmumali.ch8_quatro.model.Cheval; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quarteplus/repository/CourseRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/CourseRepository.java similarity index 60% rename from src/main/java/com/pmumali/quarteplus/repository/CourseRepository.java rename to src/main/java/com/pmumali/ch8_quatro/repository/CourseRepository.java index 3119900..092793a 100644 --- a/src/main/java/com/pmumali/quarteplus/repository/CourseRepository.java +++ b/src/main/java/com/pmumali/ch8_quatro/repository/CourseRepository.java @@ -1,7 +1,7 @@ -package com.pmumali.quarteplus.repository; +package com.pmumali.ch8_quatro.repository; -import com.pmumali.quarteplus.model.Course; -import com.pmumali.quarteplus.model.StatutCourse; +import com.pmumali.ch8_quatro.model.Course; +import com.pmumali.ch8_quatro.model.StatutCourse; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quatro/repository/PaiementRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/PaiementRepository.java similarity index 74% rename from src/main/java/com/pmumali/quatro/repository/PaiementRepository.java rename to src/main/java/com/pmumali/ch8_quatro/repository/PaiementRepository.java index 71ee9e2..930ea9f 100644 --- a/src/main/java/com/pmumali/quatro/repository/PaiementRepository.java +++ b/src/main/java/com/pmumali/ch8_quatro/repository/PaiementRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quatro.repository; +package com.pmumali.ch8_quatro.repository; -import com.pmumali.quatro.model.Paiement; +import com.pmumali.ch8_quatro.model.Paiement; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quatro/repository/PariRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/PariRepository.java similarity index 71% rename from src/main/java/com/pmumali/quatro/repository/PariRepository.java rename to src/main/java/com/pmumali/ch8_quatro/repository/PariRepository.java index 1ef3588..8408760 100644 --- a/src/main/java/com/pmumali/quatro/repository/PariRepository.java +++ b/src/main/java/com/pmumali/ch8_quatro/repository/PariRepository.java @@ -1,7 +1,7 @@ -package com.pmumali.quatro.repository; +package com.pmumali.ch8_quatro.repository; -import com.pmumali.quatro.model.Pari; -import com.pmumali.quatro.model.TypePari; +import com.pmumali.ch8_quatro.model.Pari; +import com.pmumali.ch8_quatro.model.TypePari; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quarteplus/repository/ParieurRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/ParieurRepository.java similarity index 70% rename from src/main/java/com/pmumali/quarteplus/repository/ParieurRepository.java rename to src/main/java/com/pmumali/ch8_quatro/repository/ParieurRepository.java index 1161b19..5cf1004 100644 --- a/src/main/java/com/pmumali/quarteplus/repository/ParieurRepository.java +++ b/src/main/java/com/pmumali/ch8_quatro/repository/ParieurRepository.java @@ -1,7 +1,6 @@ -package com.pmumali.quarteplus.repository; +package com.pmumali.ch8_quatro.repository; - -import com.pmumali.quarteplus.model.Parieur; +import com.pmumali.ch8_quatro.model.Parieur; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quatro/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseRepository.java similarity index 68% rename from src/main/java/com/pmumali/quatro/repository/ResultatCourseRepository.java rename to src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseRepository.java index bcce8af..513e16c 100644 --- a/src/main/java/com/pmumali/quatro/repository/ResultatCourseRepository.java +++ b/src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quatro.repository; +package com.pmumali.ch8_quatro.repository; -import com.pmumali.quatro.model.ResultatCourse; +import com.pmumali.ch8_quatro.model.ResultatCourse; import org.springframework.data.jpa.repository.JpaRepository; public interface ResultatCourseRepository extends JpaRepository { diff --git a/src/main/java/com/pmumali/quatro/service/ServiceQuatro.java b/src/main/java/com/pmumali/ch8_quatro/service/ServiceQuatro.java similarity index 99% rename from src/main/java/com/pmumali/quatro/service/ServiceQuatro.java rename to src/main/java/com/pmumali/ch8_quatro/service/ServiceQuatro.java index 8bff964..1505e48 100644 --- a/src/main/java/com/pmumali/quatro/service/ServiceQuatro.java +++ b/src/main/java/com/pmumali/ch8_quatro/service/ServiceQuatro.java @@ -1,7 +1,7 @@ -package com.pmumali.quatro.service; +package com.pmumali.ch8_quatro.service; -import com.pmumali.quatro.model.*; -import com.pmumali.quatro.repository.*; +import com.pmumali.ch8_quatro.model.*; +import com.pmumali.ch8_quatro.repository.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/pmumali/quarteplus/controller/ControleurQuartePlus.java b/src/main/java/com/pmumali/ch9_quarteplus/controller/ControleurQuartePlus.java similarity index 91% rename from src/main/java/com/pmumali/quarteplus/controller/ControleurQuartePlus.java rename to src/main/java/com/pmumali/ch9_quarteplus/controller/ControleurQuartePlus.java index 1c08898..6d99715 100644 --- a/src/main/java/com/pmumali/quarteplus/controller/ControleurQuartePlus.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/controller/ControleurQuartePlus.java @@ -1,9 +1,9 @@ -package com.pmumali.quarteplus.controller; +package com.pmumali.ch9_quarteplus.controller; -import com.pmumali.quarteplus.model.*; -import com.pmumali.quarteplus.repository.PaiementRepository; -import com.pmumali.quarteplus.repository.PariQuartePlusRepository; -import com.pmumali.quarteplus.service.ServiceQuartePlus; +import com.pmumali.ch9_quarteplus.model.*; +import com.pmumali.ch9_quarteplus.repository.PaiementRepository; +import com.pmumali.ch9_quarteplus.repository.PariQuartePlusRepository; +import com.pmumali.ch9_quarteplus.service.ServiceQuartePlus; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/pmumali/quarteplus/exception/GestionnaireExceptions.java b/src/main/java/com/pmumali/ch9_quarteplus/exception/GestionnaireExceptions.java similarity index 95% rename from src/main/java/com/pmumali/quarteplus/exception/GestionnaireExceptions.java rename to src/main/java/com/pmumali/ch9_quarteplus/exception/GestionnaireExceptions.java index 11b95ba..4f4c5cf 100644 --- a/src/main/java/com/pmumali/quarteplus/exception/GestionnaireExceptions.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/exception/GestionnaireExceptions.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.exception; +package com.pmumali.ch9_quarteplus.exception; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/src/main/java/com/pmumali/quarteplus/model/Cagnotte.java b/src/main/java/com/pmumali/ch9_quarteplus/model/Cagnotte.java similarity index 90% rename from src/main/java/com/pmumali/quarteplus/model/Cagnotte.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/Cagnotte.java index b2ee54d..38278d9 100644 --- a/src/main/java/com/pmumali/quarteplus/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/Cagnotte.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/quarteplus/model/CalculCombinaison.java b/src/main/java/com/pmumali/ch9_quarteplus/model/CalculCombinaison.java similarity index 84% rename from src/main/java/com/pmumali/quarteplus/model/CalculCombinaison.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/CalculCombinaison.java index d7783cd..6ec03dc 100644 --- a/src/main/java/com/pmumali/quarteplus/model/CalculCombinaison.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/CalculCombinaison.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/com/pmumali/quarteplus/model/Cheval.java b/src/main/java/com/pmumali/ch9_quarteplus/model/Cheval.java similarity index 77% rename from src/main/java/com/pmumali/quarteplus/model/Cheval.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/Cheval.java index 8c848e1..031a2b1 100644 --- a/src/main/java/com/pmumali/quarteplus/model/Cheval.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/Cheval.java @@ -1,9 +1,7 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import jakarta.persistence.*; import lombok.*; -import java.time.LocalDateTime; -import java.util.List; @Entity @Data diff --git a/src/main/java/com/pmumali/quarteplus/model/Course.java b/src/main/java/com/pmumali/ch9_quarteplus/model/Course.java similarity index 91% rename from src/main/java/com/pmumali/quarteplus/model/Course.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/Course.java index 219c979..404836c 100644 --- a/src/main/java/com/pmumali/quarteplus/model/Course.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/Course.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/quarteplus/model/Paiement.java b/src/main/java/com/pmumali/ch9_quarteplus/model/Paiement.java similarity index 91% rename from src/main/java/com/pmumali/quarteplus/model/Paiement.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/Paiement.java index f52b8ec..35f56e4 100644 --- a/src/main/java/com/pmumali/quarteplus/model/Paiement.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/Paiement.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/quarteplus/model/PariQuartePlus.java b/src/main/java/com/pmumali/ch9_quarteplus/model/PariQuartePlus.java similarity index 94% rename from src/main/java/com/pmumali/quarteplus/model/PariQuartePlus.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/PariQuartePlus.java index 27dbe99..5e1a930 100644 --- a/src/main/java/com/pmumali/quarteplus/model/PariQuartePlus.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/PariQuartePlus.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/Parieur.java b/src/main/java/com/pmumali/ch9_quarteplus/model/Parieur.java new file mode 100644 index 0000000..eef0f93 --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/Parieur.java @@ -0,0 +1,20 @@ +package com.pmumali.ch9_quarteplus.model; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Table(name = "parieur") +public class Parieur { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nom; + private String identification; + private Double miseTotale; +} diff --git a/src/main/java/com/pmumali/quarteplus/model/ReponsePaiement.java b/src/main/java/com/pmumali/ch9_quarteplus/model/ReponsePaiement.java similarity index 84% rename from src/main/java/com/pmumali/quarteplus/model/ReponsePaiement.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/ReponsePaiement.java index 41e43ec..d24fb44 100644 --- a/src/main/java/com/pmumali/quarteplus/model/ReponsePaiement.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/ReponsePaiement.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/pmumali/quatro/model/RequetePari.java b/src/main/java/com/pmumali/ch9_quarteplus/model/RequetePari.java similarity index 84% rename from src/main/java/com/pmumali/quatro/model/RequetePari.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/RequetePari.java index d3bd200..bfae1bf 100644 --- a/src/main/java/com/pmumali/quatro/model/RequetePari.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/RequetePari.java @@ -1,4 +1,4 @@ -package com.pmumali.quatro.model; +package com.pmumali.ch9_quarteplus.model; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/pmumali/quarteplus/model/RequeteResultat.java b/src/main/java/com/pmumali/ch9_quarteplus/model/RequeteResultat.java similarity index 89% rename from src/main/java/com/pmumali/quarteplus/model/RequeteResultat.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/RequeteResultat.java index dd6d819..cc12b16 100644 --- a/src/main/java/com/pmumali/quarteplus/model/RequeteResultat.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/RequeteResultat.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import lombok.Data; diff --git a/src/main/java/com/pmumali/quarteplus/model/ResultatCourse.java b/src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourse.java similarity index 94% rename from src/main/java/com/pmumali/quarteplus/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourse.java index fd3e7d7..8432e36 100644 --- a/src/main/java/com/pmumali/quarteplus/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourse.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/StatutCourse.java b/src/main/java/com/pmumali/ch9_quarteplus/model/StatutCourse.java new file mode 100644 index 0000000..9cb65cc --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/StatutCourse.java @@ -0,0 +1,5 @@ +package com.pmumali.ch9_quarteplus.model; + +public enum StatutCourse { + PROGRAMMEE, EN_COURS, TERMINEE, ANNULEE +} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/TypeDeadHeat.java b/src/main/java/com/pmumali/ch9_quarteplus/model/TypeDeadHeat.java new file mode 100644 index 0000000..a2832ce --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/TypeDeadHeat.java @@ -0,0 +1,12 @@ +package com.pmumali.ch9_quarteplus.model; + +public enum TypeDeadHeat { + QUATRE_PREMIERS_OU_PLUS, + TROIS_PREMIERS_UN_QUATRIEME, + DEUX_PREMIERS_DEUX_TROISIEMES, + DEUX_PREMIERS_UN_TROISIEME_UN_QUATRIEME, + TROIS_SECONDS_OU_PLUS, + DEUX_SECONDS_UN_QUATRIEME, + DEUX_TROISIEMES_OU_PLUS, + DEUX_QUATRIEMES_OU_PLUS +} diff --git a/src/main/java/com/pmumali/quarteplus/model/TypePaiement.java b/src/main/java/com/pmumali/ch9_quarteplus/model/TypePaiement.java similarity index 76% rename from src/main/java/com/pmumali/quarteplus/model/TypePaiement.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/TypePaiement.java index 55d3551..4ce23dc 100644 --- a/src/main/java/com/pmumali/quarteplus/model/TypePaiement.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/TypePaiement.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; public enum TypePaiement { QUARTE_PLUS_ORDRE_EXACT, diff --git a/src/main/java/com/pmumali/quarteplus/model/TypePari.java b/src/main/java/com/pmumali/ch9_quarteplus/model/TypePari.java similarity index 77% rename from src/main/java/com/pmumali/quarteplus/model/TypePari.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/TypePari.java index e878749..6e713ec 100644 --- a/src/main/java/com/pmumali/quarteplus/model/TypePari.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/TypePari.java @@ -1,4 +1,4 @@ -package com.pmumali.quarteplus.model; +package com.pmumali.ch9_quarteplus.model; public enum TypePari { UNITAIRE, COMBINE, CHAMP_TOTAL_3, CHAMP_PARTIEL_3, diff --git a/src/main/java/com/pmumali/quarteplus/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteRepository.java similarity index 69% rename from src/main/java/com/pmumali/quarteplus/repository/CagnotteRepository.java rename to src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteRepository.java index 7832a1c..56b9fac 100644 --- a/src/main/java/com/pmumali/quarteplus/repository/CagnotteRepository.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quarteplus.repository; +package com.pmumali.ch9_quarteplus.repository; -import com.pmumali.quarteplus.model.Cagnotte; +import com.pmumali.ch9_quarteplus.model.Cagnotte; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quarteplus/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalRepository.java similarity index 69% rename from src/main/java/com/pmumali/quarteplus/repository/ChevalRepository.java rename to src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalRepository.java index 52ca01a..8c2ddee 100644 --- a/src/main/java/com/pmumali/quarteplus/repository/ChevalRepository.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quarteplus.repository; +package com.pmumali.ch9_quarteplus.repository; -import com.pmumali.quarteplus.model.Cheval; +import com.pmumali.ch9_quarteplus.model.Cheval; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quatro/repository/CourseRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/CourseRepository.java similarity index 58% rename from src/main/java/com/pmumali/quatro/repository/CourseRepository.java rename to src/main/java/com/pmumali/ch9_quarteplus/repository/CourseRepository.java index 36ec37f..48a82cf 100644 --- a/src/main/java/com/pmumali/quatro/repository/CourseRepository.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/CourseRepository.java @@ -1,7 +1,7 @@ -package com.pmumali.quatro.repository; +package com.pmumali.ch9_quarteplus.repository; -import com.pmumali.quatro.model.Course; -import com.pmumali.quatro.model.StatutCourse; +import com.pmumali.ch9_quarteplus.model.Course; +import com.pmumali.ch9_quarteplus.model.StatutCourse; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quarteplus/repository/PaiementRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementRepository.java similarity index 68% rename from src/main/java/com/pmumali/quarteplus/repository/PaiementRepository.java rename to src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementRepository.java index 0745c03..ba03c8f 100644 --- a/src/main/java/com/pmumali/quarteplus/repository/PaiementRepository.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quarteplus.repository; +package com.pmumali.ch9_quarteplus.repository; -import com.pmumali.quarteplus.model.Paiement; +import com.pmumali.ch9_quarteplus.model.Paiement; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/quarteplus/repository/PariQuartePlusRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/PariQuartePlusRepository.java similarity index 73% rename from src/main/java/com/pmumali/quarteplus/repository/PariQuartePlusRepository.java rename to src/main/java/com/pmumali/ch9_quarteplus/repository/PariQuartePlusRepository.java index 5345d49..a63f743 100644 --- a/src/main/java/com/pmumali/quarteplus/repository/PariQuartePlusRepository.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/PariQuartePlusRepository.java @@ -1,6 +1,6 @@ -package com.pmumali.quarteplus.repository; +package com.pmumali.ch9_quarteplus.repository; -import com.pmumali.quarteplus.model.PariQuartePlus; +import com.pmumali.ch9_quarteplus.model.PariQuartePlus; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurRepository.java new file mode 100644 index 0000000..cee68cc --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch9_quarteplus.repository; + + +import com.pmumali.ch9_quarteplus.model.Parieur; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ParieurRepository extends JpaRepository { + List findByNomContaining(String nom); +} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseRepository.java new file mode 100644 index 0000000..fb26428 --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseRepository.java @@ -0,0 +1,8 @@ +package com.pmumali.ch9_quarteplus.repository; + +import com.pmumali.ch9_quarteplus.model.ResultatCourse; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResultatCourseRepository extends JpaRepository { + ResultatCourse findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/quarteplus/service/ServiceQuartePlus.java b/src/main/java/com/pmumali/ch9_quarteplus/service/ServiceQuartePlus.java similarity index 99% rename from src/main/java/com/pmumali/quarteplus/service/ServiceQuartePlus.java rename to src/main/java/com/pmumali/ch9_quarteplus/service/ServiceQuartePlus.java index 7abc9cc..db79922 100644 --- a/src/main/java/com/pmumali/quarteplus/service/ServiceQuartePlus.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/service/ServiceQuartePlus.java @@ -1,7 +1,7 @@ -package com.pmumali.quarteplus.service; +package com.pmumali.ch9_quarteplus.service; -import com.pmumali.quarteplus.model.*; -import com.pmumali.quarteplus.repository.*; +import com.pmumali.ch9_quarteplus.model.*; +import com.pmumali.ch9_quarteplus.repository.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;