From 2f470460355e8f40c3ac79f6147b2a9e299da54a Mon Sep 17 00:00:00 2001 From: sidibe Date: Wed, 17 Sep 2025 15:28:14 +0000 Subject: [PATCH] commit v1 --- Dockerfile | 13 + build.gradle | 9 + deployToVPS.sh | 1 + docker-compose.yml | 32 +++ src/main/java/com/pmumali/api/ApiKey.java | 28 ++ .../com/pmumali/api/ApiKeyController.java | 27 ++ .../java/com/pmumali/api/ApiKeyFilter.java | 34 +++ .../com/pmumali/api/ApiKeyRepository.java | 10 + .../java/com/pmumali/api/ApiKeyService.java | 34 +++ .../controller/ControleurMulti.java | 14 +- .../model/{Cheval.java => ChevalMulti.java} | 8 +- .../model/{Course.java => CourseMulti.java} | 7 +- .../ch10_multi/model/PaiementMulti.java | 2 + .../pmumali/ch10_multi/model/PariMulti.java | 6 +- .../model/{Parieur.java => ParieurMulti.java} | 3 +- ...t.java => ResultatCalculRapportMulti.java} | 2 +- ...atCourse.java => ResultatCourseMulti.java} | 18 +- ...atutCourse.java => StatutCourseMulti.java} | 2 +- .../repository/ChevalMultiRepository.java | 11 + .../repository/ChevalRepository.java | 11 - .../repository/CourseMultiRepository.java | 12 + .../repository/CourseRepository.java | 12 - .../repository/ParieurMultiRepository.java | 10 + .../repository/ParieurRepository.java | 10 - .../ResultatCourseMultiRepository.java | 8 + .../repository/ResultatCourseRepository.java | 8 - .../ch10_multi/service/ServiceMulti.java | 98 +++---- .../com/pmumali/ch11_quinteplus/InitData.java | 38 +-- ...java => ControleurCagnotteQuintePlus.java} | 18 +- .../controller/ControleurCourse.java | 55 ---- .../ControleurCourseQuintePlus.java | 55 ++++ .../controller/ControleurGains.java | 29 --- .../controller/ControleurGainsQuintePlus.java | 29 +++ .../controller/ControleurPari.java | 51 ---- .../controller/ControleurPariQuintePlus.java | 51 ++++ ...{Cagnotte.java => CagnotteQuintePlus.java} | 14 +- .../{Cheval.java => ChevalQuintePlus.java} | 7 +- ...ourseDto.java => CourseDtoQuintePlus.java} | 2 +- .../{Course.java => CourseQuintePlus.java} | 7 +- ...{GainsDto.java => GainsDtoQuintePlus.java} | 2 +- .../{Gains.java => GainsQuintePlus.java} | 4 +- .../{PariDto.java => PariDtoQuintePlus.java} | 2 +- .../model/{Pari.java => PariQuintePlus.java} | 6 +- ...{Resultat.java => ResultatQuintePlus.java} | 6 +- .../CagnotteQuintePlusRepository.java | 14 + .../repository/CagnotteRepository.java | 14 - .../ChevalQuintePlusRepository.java | 12 + .../repository/ChevalRepository.java | 12 - .../CourseQuintePlusRepository.java | 11 + .../repository/CourseRepository.java | 11 - .../repository/GainsQuintePlusRepository.java | 10 + .../repository/GainsRepository.java | 10 - .../repository/PariQuintePlusRepository.java | 13 + .../repository/PariRepository.java | 13 - .../ResultatQuintePlusRepository.java | 9 + .../repository/ResultatRepository.java | 9 - ...te.java => ServiceCagnotteQuintePlus.java} | 88 +++---- ...urse.java => ServiceCourseQuintePlus.java} | 26 +- ...Gains.java => ServiceGainsQuintePlus.java} | 246 +++++++++--------- ...cePari.java => ServicePariQuintePlus.java} | 119 +++++---- .../controller/ChevalController.java | 33 --- .../controller/ChevalSimpleController.java | 34 +++ .../controller/CourseController.java | 43 --- .../controller/CourseSimpleController.java | 44 ++++ .../controller/GainsController.java | 28 -- .../controller/GainsSimpleController.java | 28 ++ ...troller.java => PariSimpleController.java} | 12 +- .../model/{Cheval.java => ChevalSimple.java} | 15 +- .../model/{Course.java => CourseSimple.java} | 13 +- .../model/{Gains.java => GainsSimple.java} | 4 +- .../pmumali/ch1_simple/model/PariSimple.java | 18 +- .../ch1_simple/model/ResultatCourse.java | 32 --- .../model/ResultatCourseSimple.java | 24 ++ .../repository/ChevalRepository.java | 13 - .../repository/ChevalSimpleRepository.java | 14 + .../repository/CourseRepository.java | 11 - .../repository/CourseSimpleRepository.java | 11 + .../repository/GainsRepository.java | 10 - .../repository/GainsSimpleRepository.java | 10 + .../repository/ResultatCourseRepository.java | 10 - .../ResultatCourseSimpleRepository.java | 10 + .../ch1_simple/service/ChevalService.java | 27 -- .../service/ChevalSimpleService.java | 28 ++ ...eService.java => CourseSimpleService.java} | 18 +- ...nsService.java => GainsSimpleService.java} | 44 ++-- .../ch1_simple/service/PariSimpleService.java | 12 +- .../controller/ChevalController.java | 32 --- .../ChevalJumeleGagnantController.java | 32 +++ .../controller/CourseController.java | 48 ---- .../CourseJumeleGagnantController.java | 49 ++++ .../controller/GainsController.java | 27 -- .../GainsJumeleGagnantController.java | 27 ++ .../controller/PariJumeleController.java | 12 +- .../{Cheval.java => ChevalJumeleGagnant.java} | 11 +- .../{Course.java => CourseJumeleGagnant.java} | 13 +- .../{Gains.java => GainsJumeleGagnant.java} | 4 +- .../model/PariJumeleGagnant.java | 22 +- ....java => ResultatCourseJumeleGagnant.java} | 12 +- .../ChevalJumeleGagnantRepository.java | 13 + .../repository/ChevalRepository.java | 13 - .../CourseJumeleGagnantRepository.java | 12 + .../repository/CourseRepository.java | 12 - .../GainsJumeleGagnantRepository.java | 10 + .../repository/GainsRepository.java | 10 - ....java => PariJumeleGagnantRepository.java} | 2 +- ...ResultatCourseJumeleGagnantRepository.java | 10 + .../repository/ResultatCourseRepository.java | 10 - .../service/ChevalJumeleGagnantService.java | 27 ++ .../service/ChevalService.java | 27 -- .../service/CourseJumeleGagnantService.java | 40 +++ .../service/CourseService.java | 40 --- ...ce.java => GainsJumeleGagnantService.java} | 38 +-- .../service/PariJumeleService.java | 12 +- .../controller/ChevalController.java | 32 --- .../ChevalJumelePlaceController.java | 33 +++ .../controller/CourseController.java | 47 ---- .../CourseJumelePlaceController.java | 48 ++++ .../controller/GainsController.java | 27 -- .../GainsJumelePlaceController.java | 27 ++ .../controller/PariJumelePlaceController.java | 12 +- .../{Cheval.java => ChevalJumelePlace.java} | 11 +- .../{Course.java => CourseJumelePlace.java} | 13 +- .../{Gains.java => GainsJumelePlace.java} | 4 +- .../model/PariJumelePlace.java | 22 +- ...se.java => ResultatCourseJumelePlace.java} | 16 +- .../ChevalJumelePlaceRepository.java | 14 + .../repository/ChevalRepository.java | 14 - .../CourseJumelePlaceRepository.java | 12 + .../repository/CourseRepository.java | 12 - .../GainsJumelePlaceRepository.java | 10 + .../repository/GainsRepository.java | 10 - .../ResultatCourseJumelePlaceRepository.java | 10 + .../repository/ResultatCourseRepository.java | 10 - .../service/ChevalJumelePlaceService.java | 27 ++ .../service/ChevalService.java | 27 -- .../service/CourseJumelePlaceService.java | 40 +++ .../service/CourseService.java | 40 --- ...vice.java => GainsJumelePlaceService.java} | 36 +-- .../service/PariJumelePlaceService.java | 8 +- ....java => CourseJumeleOrdreController.java} | 26 +- ...r.java => ParisJumeleOrdreController.java} | 24 +- ...er.java => GlobalExceptionHandlerCh4.java} | 2 +- .../pmumali/ch4_jumeleordre/model/Cheval.java | 17 -- .../model/ChevalJumeleOrdre.java | 29 +++ .../pmumali/ch4_jumeleordre/model/Course.java | 23 -- .../model/CourseJumeleOrdre.java | 35 +++ .../pmumali/ch4_jumeleordre/model/Paris.java | 34 --- .../model/ParisJumeleOrdre.java | 48 ++++ .../ch4_jumeleordre/model/ResultatCourse.java | 32 --- .../model/ResultatCourseJumeleOrdre.java | 37 +++ .../ChevalJumeleOrdreRepository.java | 8 + .../repository/ChevalRepository.java | 8 - .../CourseJumeleOrdreRepository.java | 11 + .../repository/CourseRepository.java | 11 - .../ParisJumeleOrdreRepository.java | 14 + .../repository/ParisRepository.java | 14 - .../ResultatCourseJumeleOrdreRepository.java | 9 + .../repository/ResultatCourseRepository.java | 9 - ...ice.java => CourseJumeleOrdreService.java} | 54 ++-- ...vice.java => ParisJumeleOrdreService.java} | 38 +-- ... => ResultatCourseJumeleOrdreService.java} | 45 ++-- .../controller/ParisTrioController.java | 4 +- ...java => ResultatCourseTrioController.java} | 10 +- .../{Cagnotte.java => CagnotteTrio.java} | 8 +- .../model/{Cheval.java => ChevalTrio.java} | 8 +- .../model/{Course.java => CourseTrio.java} | 8 +- .../com/pmumali/ch5_trio/model/ParisTrio.java | 8 +- ...tatCourse.java => ResultatCourseTrio.java} | 16 +- .../repository/CagnotteRepository.java | 29 --- .../repository/CagnotteTrioRepository.java | 29 +++ .../ch5_trio/repository/ChevalRepository.java | 27 -- .../repository/ChevalTrioRepository.java | 27 ++ .../ch5_trio/repository/CourseRepository.java | 24 -- .../repository/CourseTrioRepository.java | 24 ++ .../repository/ParisTrioRepository.java | 16 +- .../repository/ResultatCourseRepository.java | 26 -- .../ResultatCourseTrioRepository.java | 26 ++ .../ch5_trio/service/ParisTrioService.java | 12 +- ...ce.java => ResultatCourseTrioService.java} | 42 +-- .../controller/ParisTrioOrdreController.java | 4 +- ...=> ResultatCourseTrioOrdreController.java} | 10 +- ...er.java => GlobalExceptionHandlerCh6.java} | 2 +- .../{Cagnotte.java => CagnotteTrioOrdre.java} | 8 +- .../{Cheval.java => ChevalTrioOrdre.java} | 8 +- .../{Course.java => CourseTrioOrdre.java} | 8 +- .../ch6_trioordre/model/ParisTrioOrdre.java | 8 +- ...urse.java => ResultatCourseTrioOrdre.java} | 16 +- .../repository/CagnotteRepository.java | 14 - .../CagnotteTrioOrdreRepository.java | 14 + .../repository/ChevalRepository.java | 54 ---- .../repository/ChevalTrioOrdreRepository.java | 54 ++++ .../repository/CourseRepository.java | 47 ---- .../repository/CourseTrioOrdreRepository.java | 47 ++++ .../repository/ParisTrioOrdreRepository.java | 4 +- .../repository/ResultatCourseRepository.java | 7 - .../ResultatCourseTrioOrdreRepository.java | 7 + .../service/ParisTrioOrdreService.java | 12 +- ...va => ResultatCourseTrioOrdreService.java} | 44 ++-- ...ller.java => CourseTripletController.java} | 38 +-- ...roller.java => PariTripletController.java} | 55 ++-- ...er.java => ResultatTripletController.java} | 24 +- .../{Cagnotte.java => CagnotteTriplet.java} | 4 +- .../model/{Cheval.java => ChevalTriplet.java} | 10 +- .../model/{Course.java => CourseTriplet.java} | 16 +- .../model/{Pari.java => PariTriplet.java} | 9 +- ...Course.java => ResultatCourseTriplet.java} | 6 +- .../pmumali/ch7_triplet/model/StatutPari.java | 5 + .../repository/CagnotteRepository.java | 31 --- .../repository/CagnotteTripletRepository.java | 31 +++ .../repository/ChevalRepository.java | 33 --- .../repository/ChevalTripletRepository.java | 33 +++ .../repository/CourseRepository.java | 16 -- .../repository/CourseTripletRepository.java | 16 ++ .../repository/PariRepository.java | 53 ---- .../repository/PariTripletRepository.java | 54 ++++ .../repository/ResultatCourseRepository.java | 35 --- .../ResultatCourseTripletRepository.java | 35 +++ ...java => StatistiqueTripletRepository.java} | 9 +- ...rvice.java => CagnotteTripletService.java} | 26 +- ...ce.java => CalculGainsTripletService.java} | 140 +++++----- ...Service.java => CourseTripletService.java} | 24 +- ...riService.java => PariTripletService.java} | 31 +-- ...java => ResultatCourseTripletService.java} | 12 +- ...java => ValidationPariTripletService.java} | 26 +- .../controller/ControllerQuatro.java | 26 +- .../model/{Cheval.java => ChevalQuatro.java} | 6 +- .../model/{Course.java => CourseQuatro.java} | 4 +- .../{Paiement.java => PaiementQuatro.java} | 4 +- .../model/{Pari.java => PariQuatro.java} | 6 +- ...tCourse.java => ResultatCourseQuatro.java} | 14 +- .../repository/ChevalQuatroRepository.java | 11 + .../repository/ChevalRepository.java | 11 - .../repository/CourseQuatroRepository.java | 11 + .../repository/CourseRepository.java | 11 - .../repository/PaiementQuatroRepository.java | 11 + .../repository/PaiementRepository.java | 11 - .../repository/PariQuatroRepository.java | 12 + .../ch8_quatro/repository/PariRepository.java | 12 - ...tory.java => ParieurQuatroRepository.java} | 2 +- .../ResultatCourseQuatroRepository.java | 8 + .../repository/ResultatCourseRepository.java | 8 - .../ch8_quatro/service/ServiceQuatro.java | 78 +++--- .../controller/ControleurQuartePlus.java | 26 +- ...{Cagnotte.java => CagnotteQuartePlus.java} | 2 +- .../{Cheval.java => ChevalQuartePlus.java} | 7 +- .../{Course.java => CourseQuartePlus.java} | 5 +- ...{Paiement.java => PaiementQuartePlus.java} | 4 +- .../ch9_quarteplus/model/PariQuartePlus.java | 7 +- .../{Parieur.java => ParieurQuartePlus.java} | 3 +- ...rse.java => ResultatCourseQuartePlus.java} | 18 +- .../CagnotteQuartePlusRepository.java | 10 + .../repository/CagnotteRepository.java | 10 - .../ChevalQuartePlusRepository.java | 10 + .../repository/ChevalRepository.java | 10 - .../CourseQuartePlusRepository.java | 11 + .../repository/CourseRepository.java | 11 - .../PaiementQuartePlusRepository.java | 10 + .../repository/PaiementRepository.java | 10 - .../ParieurQuartePlusRepository.java | 11 + .../repository/ParieurRepository.java | 11 - .../ResultatCourseQuartePlusRepository.java | 8 + .../repository/ResultatCourseRepository.java | 8 - .../service/ServiceQuartePlus.java | 96 +++---- .../common/controller/ChevalController.java | 49 ++++ .../common/controller/CourseController.java | 58 +++++ .../common/controller/PariController.java | 55 ++++ .../common/controller/ResultatController.java | 52 ++++ .../java/com/pmumali/common/model/Cheval.java | 24 ++ .../java/com/pmumali/common/model/Course.java | 32 +++ .../java/com/pmumali/common/model/Option.java | 5 + .../java/com/pmumali/common/model/Pari.java | 46 ++++ .../com/pmumali/common/model/Resultat.java | 54 ++++ .../common/util/CollectionTransformer.java | 17 ++ .../java/com/pmumali/config/CorsConfig.java | 29 +++ .../com/pmumali/config/SecurityConfig.java | 32 +++ .../com/pmumali/config/SwaggerConfig.java | 26 ++ src/main/resources/application.properties | 28 +- .../mali/apiplr/ApiPlrApplicationTests.java | 13 - 278 files changed, 3492 insertions(+), 2670 deletions(-) create mode 100644 Dockerfile create mode 100644 deployToVPS.sh create mode 100644 docker-compose.yml create mode 100644 src/main/java/com/pmumali/api/ApiKey.java create mode 100644 src/main/java/com/pmumali/api/ApiKeyController.java create mode 100644 src/main/java/com/pmumali/api/ApiKeyFilter.java create mode 100644 src/main/java/com/pmumali/api/ApiKeyRepository.java create mode 100644 src/main/java/com/pmumali/api/ApiKeyService.java rename src/main/java/com/pmumali/ch10_multi/model/{Cheval.java => ChevalMulti.java} (70%) rename src/main/java/com/pmumali/ch10_multi/model/{Course.java => CourseMulti.java} (77%) rename src/main/java/com/pmumali/ch10_multi/model/{Parieur.java => ParieurMulti.java} (84%) rename src/main/java/com/pmumali/ch10_multi/model/{ResultatCalculRapport.java => ResultatCalculRapportMulti.java} (84%) rename src/main/java/com/pmumali/ch10_multi/model/{ResultatCourse.java => ResultatCourseMulti.java} (55%) rename src/main/java/com/pmumali/ch10_multi/model/{StatutCourse.java => StatutCourseMulti.java} (72%) create mode 100644 src/main/java/com/pmumali/ch10_multi/repository/ChevalMultiRepository.java delete mode 100644 src/main/java/com/pmumali/ch10_multi/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch10_multi/repository/CourseMultiRepository.java delete mode 100644 src/main/java/com/pmumali/ch10_multi/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch10_multi/repository/ParieurMultiRepository.java delete mode 100644 src/main/java/com/pmumali/ch10_multi/repository/ParieurRepository.java create mode 100644 src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseMultiRepository.java delete mode 100644 src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseRepository.java rename src/main/java/com/pmumali/ch11_quinteplus/controller/{ControleurCagnotte.java => ControleurCagnotteQuintePlus.java} (60%) delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourse.java create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourseQuintePlus.java delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurGains.java create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurGainsQuintePlus.java delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurPari.java create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurPariQuintePlus.java rename src/main/java/com/pmumali/ch11_quinteplus/model/{Cagnotte.java => CagnotteQuintePlus.java} (68%) rename src/main/java/com/pmumali/ch11_quinteplus/model/{Cheval.java => ChevalQuintePlus.java} (72%) rename src/main/java/com/pmumali/ch11_quinteplus/model/{CourseDto.java => CourseDtoQuintePlus.java} (89%) rename src/main/java/com/pmumali/ch11_quinteplus/model/{Course.java => CourseQuintePlus.java} (81%) rename src/main/java/com/pmumali/ch11_quinteplus/model/{GainsDto.java => GainsDtoQuintePlus.java} (92%) rename src/main/java/com/pmumali/ch11_quinteplus/model/{Gains.java => GainsQuintePlus.java} (90%) rename src/main/java/com/pmumali/ch11_quinteplus/model/{PariDto.java => PariDtoQuintePlus.java} (92%) rename src/main/java/com/pmumali/ch11_quinteplus/model/{Pari.java => PariQuintePlus.java} (86%) rename src/main/java/com/pmumali/ch11_quinteplus/model/{Resultat.java => ResultatQuintePlus.java} (82%) create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteQuintePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteRepository.java create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalQuintePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/CourseQuintePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/GainsQuintePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/GainsRepository.java create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/PariQuintePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/PariRepository.java create mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatQuintePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatRepository.java rename src/main/java/com/pmumali/ch11_quinteplus/service/{ServiceCagnotte.java => ServiceCagnotteQuintePlus.java} (66%) rename src/main/java/com/pmumali/ch11_quinteplus/service/{ServiceCourse.java => ServiceCourseQuintePlus.java} (56%) rename src/main/java/com/pmumali/ch11_quinteplus/service/{ServiceGains.java => ServiceGainsQuintePlus.java} (79%) rename src/main/java/com/pmumali/ch11_quinteplus/service/{ServicePari.java => ServicePariQuintePlus.java} (84%) delete mode 100644 src/main/java/com/pmumali/ch1_simple/controller/ChevalController.java create mode 100644 src/main/java/com/pmumali/ch1_simple/controller/ChevalSimpleController.java delete mode 100644 src/main/java/com/pmumali/ch1_simple/controller/CourseController.java create mode 100644 src/main/java/com/pmumali/ch1_simple/controller/CourseSimpleController.java delete mode 100644 src/main/java/com/pmumali/ch1_simple/controller/GainsController.java create mode 100644 src/main/java/com/pmumali/ch1_simple/controller/GainsSimpleController.java rename src/main/java/com/pmumali/ch1_simple/controller/{PariController.java => PariSimpleController.java} (83%) rename src/main/java/com/pmumali/ch1_simple/model/{Cheval.java => ChevalSimple.java} (55%) rename src/main/java/com/pmumali/ch1_simple/model/{Course.java => CourseSimple.java} (70%) rename src/main/java/com/pmumali/ch1_simple/model/{Gains.java => GainsSimple.java} (90%) delete mode 100644 src/main/java/com/pmumali/ch1_simple/model/ResultatCourse.java create mode 100644 src/main/java/com/pmumali/ch1_simple/model/ResultatCourseSimple.java delete mode 100644 src/main/java/com/pmumali/ch1_simple/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch1_simple/repository/ChevalSimpleRepository.java delete mode 100644 src/main/java/com/pmumali/ch1_simple/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch1_simple/repository/CourseSimpleRepository.java delete mode 100644 src/main/java/com/pmumali/ch1_simple/repository/GainsRepository.java create mode 100644 src/main/java/com/pmumali/ch1_simple/repository/GainsSimpleRepository.java delete mode 100644 src/main/java/com/pmumali/ch1_simple/repository/ResultatCourseRepository.java create mode 100644 src/main/java/com/pmumali/ch1_simple/repository/ResultatCourseSimpleRepository.java delete mode 100644 src/main/java/com/pmumali/ch1_simple/service/ChevalService.java create mode 100644 src/main/java/com/pmumali/ch1_simple/service/ChevalSimpleService.java rename src/main/java/com/pmumali/ch1_simple/service/{CourseService.java => CourseSimpleService.java} (50%) rename src/main/java/com/pmumali/ch1_simple/service/{GainsService.java => GainsSimpleService.java} (90%) delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/controller/ChevalController.java create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/controller/ChevalJumeleGagnantController.java delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/controller/CourseController.java create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/controller/CourseJumeleGagnantController.java delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/controller/GainsController.java create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/controller/GainsJumeleGagnantController.java rename src/main/java/com/pmumali/ch2_jumelegagnant/model/{Cheval.java => ChevalJumeleGagnant.java} (61%) rename src/main/java/com/pmumali/ch2_jumelegagnant/model/{Course.java => CourseJumeleGagnant.java} (68%) rename src/main/java/com/pmumali/ch2_jumelegagnant/model/{Gains.java => GainsJumeleGagnant.java} (88%) rename src/main/java/com/pmumali/ch2_jumelegagnant/model/{ResultatCourse.java => ResultatCourseJumeleGagnant.java} (55%) create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/repository/ChevalJumeleGagnantRepository.java delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/repository/CourseJumeleGagnantRepository.java delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/repository/GainsJumeleGagnantRepository.java delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/repository/GainsRepository.java rename src/main/java/com/pmumali/ch2_jumelegagnant/repository/{PariJumeleRepository.java => PariJumeleGagnantRepository.java} (83%) create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/repository/ResultatCourseJumeleGagnantRepository.java delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/repository/ResultatCourseRepository.java create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/service/ChevalJumeleGagnantService.java delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/service/ChevalService.java create mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/service/CourseJumeleGagnantService.java delete mode 100644 src/main/java/com/pmumali/ch2_jumelegagnant/service/CourseService.java rename src/main/java/com/pmumali/ch2_jumelegagnant/service/{GainsService.java => GainsJumeleGagnantService.java} (89%) delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/controller/ChevalController.java create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/controller/ChevalJumelePlaceController.java delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/controller/CourseController.java create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/controller/CourseJumelePlaceController.java delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/controller/GainsController.java create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/controller/GainsJumelePlaceController.java rename src/main/java/com/pmumali/ch3_jumeleplace/model/{Cheval.java => ChevalJumelePlace.java} (61%) rename src/main/java/com/pmumali/ch3_jumeleplace/model/{Course.java => CourseJumelePlace.java} (72%) rename src/main/java/com/pmumali/ch3_jumeleplace/model/{Gains.java => GainsJumelePlace.java} (88%) rename src/main/java/com/pmumali/ch3_jumeleplace/model/{ResultatCourse.java => ResultatCourseJumelePlace.java} (55%) create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/repository/ChevalJumelePlaceRepository.java delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/repository/CourseJumelePlaceRepository.java delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/repository/GainsJumelePlaceRepository.java delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/repository/GainsRepository.java create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/repository/ResultatCourseJumelePlaceRepository.java delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/repository/ResultatCourseRepository.java create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/service/ChevalJumelePlaceService.java delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/service/ChevalService.java create mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/service/CourseJumelePlaceService.java delete mode 100644 src/main/java/com/pmumali/ch3_jumeleplace/service/CourseService.java rename src/main/java/com/pmumali/ch3_jumeleplace/service/{GainsService.java => GainsJumelePlaceService.java} (93%) rename src/main/java/com/pmumali/ch4_jumeleordre/controller/{CourseController.java => CourseJumeleOrdreController.java} (53%) rename src/main/java/com/pmumali/ch4_jumeleordre/controller/{ParisController.java => ParisJumeleOrdreController.java} (55%) rename src/main/java/com/pmumali/ch4_jumeleordre/exception/{GlobalExceptionHandler.java => GlobalExceptionHandlerCh4.java} (96%) delete mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/model/Cheval.java create mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/model/ChevalJumeleOrdre.java delete mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/model/Course.java create mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/model/CourseJumeleOrdre.java delete mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/model/Paris.java create mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/model/ParisJumeleOrdre.java delete mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourse.java create mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourseJumeleOrdre.java create mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalJumeleOrdreRepository.java delete mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseJumeleOrdreRepository.java delete mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisJumeleOrdreRepository.java delete mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisRepository.java create mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseJumeleOrdreRepository.java delete mode 100644 src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseRepository.java rename src/main/java/com/pmumali/ch4_jumeleordre/service/{CourseService.java => CourseJumeleOrdreService.java} (60%) rename src/main/java/com/pmumali/ch4_jumeleordre/service/{ParisService.java => ParisJumeleOrdreService.java} (64%) rename src/main/java/com/pmumali/ch4_jumeleordre/service/{ResultatCourseService.java => ResultatCourseJumeleOrdreService.java} (73%) rename src/main/java/com/pmumali/ch5_trio/controller/{ResultatCourseController.java => ResultatCourseTrioController.java} (73%) rename src/main/java/com/pmumali/ch5_trio/model/{Cagnotte.java => CagnotteTrio.java} (87%) rename src/main/java/com/pmumali/ch5_trio/model/{Cheval.java => ChevalTrio.java} (59%) rename src/main/java/com/pmumali/ch5_trio/model/{Course.java => CourseTrio.java} (70%) rename src/main/java/com/pmumali/ch5_trio/model/{ResultatCourse.java => ResultatCourseTrio.java} (63%) delete mode 100644 src/main/java/com/pmumali/ch5_trio/repository/CagnotteRepository.java create mode 100644 src/main/java/com/pmumali/ch5_trio/repository/CagnotteTrioRepository.java delete mode 100644 src/main/java/com/pmumali/ch5_trio/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch5_trio/repository/ChevalTrioRepository.java delete mode 100644 src/main/java/com/pmumali/ch5_trio/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch5_trio/repository/CourseTrioRepository.java delete mode 100644 src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseRepository.java create mode 100644 src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseTrioRepository.java rename src/main/java/com/pmumali/ch5_trio/service/{ResultatCourseService.java => ResultatCourseTrioService.java} (84%) rename src/main/java/com/pmumali/ch6_trioordre/controller/{ResultatCourseController.java => ResultatCourseTrioOrdreController.java} (72%) rename src/main/java/com/pmumali/ch6_trioordre/exception/{GlobalExceptionHandler.java => GlobalExceptionHandlerCh6.java} (98%) rename src/main/java/com/pmumali/ch6_trioordre/model/{Cagnotte.java => CagnotteTrioOrdre.java} (74%) rename src/main/java/com/pmumali/ch6_trioordre/model/{Cheval.java => ChevalTrioOrdre.java} (58%) rename src/main/java/com/pmumali/ch6_trioordre/model/{Course.java => CourseTrioOrdre.java} (75%) rename src/main/java/com/pmumali/ch6_trioordre/model/{ResultatCourse.java => ResultatCourseTrioOrdre.java} (68%) delete mode 100644 src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteRepository.java create mode 100644 src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteTrioOrdreRepository.java delete mode 100644 src/main/java/com/pmumali/ch6_trioordre/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch6_trioordre/repository/ChevalTrioOrdreRepository.java delete mode 100644 src/main/java/com/pmumali/ch6_trioordre/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch6_trioordre/repository/CourseTrioOrdreRepository.java delete mode 100644 src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseRepository.java create mode 100644 src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseTrioOrdreRepository.java rename src/main/java/com/pmumali/ch6_trioordre/service/{ResultatCourseService.java => ResultatCourseTrioOrdreService.java} (87%) rename src/main/java/com/pmumali/ch7_triplet/controller/{CourseController.java => CourseTripletController.java} (53%) rename src/main/java/com/pmumali/ch7_triplet/controller/{PariController.java => PariTripletController.java} (52%) rename src/main/java/com/pmumali/ch7_triplet/controller/{ResultatController.java => ResultatTripletController.java} (66%) rename src/main/java/com/pmumali/ch7_triplet/model/{Cagnotte.java => CagnotteTriplet.java} (93%) rename src/main/java/com/pmumali/ch7_triplet/model/{Cheval.java => ChevalTriplet.java} (80%) rename src/main/java/com/pmumali/ch7_triplet/model/{Course.java => CourseTriplet.java} (73%) rename src/main/java/com/pmumali/ch7_triplet/model/{Pari.java => PariTriplet.java} (89%) rename src/main/java/com/pmumali/ch7_triplet/model/{ResultatCourse.java => ResultatCourseTriplet.java} (91%) create mode 100644 src/main/java/com/pmumali/ch7_triplet/model/StatutPari.java delete mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/CagnotteRepository.java create mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/CagnotteTripletRepository.java delete mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/ChevalTripletRepository.java delete mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/CourseTripletRepository.java delete mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/PariRepository.java create mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/PariTripletRepository.java delete mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseRepository.java create mode 100644 src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseTripletRepository.java rename src/main/java/com/pmumali/ch7_triplet/repository/{StatistiqueRepository.java => StatistiqueTripletRepository.java} (94%) rename src/main/java/com/pmumali/ch7_triplet/service/{CagnotteService.java => CagnotteTripletService.java} (69%) rename src/main/java/com/pmumali/ch7_triplet/service/{CalculGainsService.java => CalculGainsTripletService.java} (77%) rename src/main/java/com/pmumali/ch7_triplet/service/{CourseService.java => CourseTripletService.java} (60%) rename src/main/java/com/pmumali/ch7_triplet/service/{PariService.java => PariTripletService.java} (63%) rename src/main/java/com/pmumali/ch7_triplet/service/{ResultatCourseService.java => ResultatCourseTripletService.java} (52%) rename src/main/java/com/pmumali/ch7_triplet/service/{ValidationPariService.java => ValidationPariTripletService.java} (75%) rename src/main/java/com/pmumali/ch8_quatro/model/{Cheval.java => ChevalQuatro.java} (79%) rename src/main/java/com/pmumali/ch8_quatro/model/{Course.java => CourseQuatro.java} (91%) rename src/main/java/com/pmumali/ch8_quatro/model/{Paiement.java => PaiementQuatro.java} (91%) rename src/main/java/com/pmumali/ch8_quatro/model/{Pari.java => PariQuatro.java} (89%) rename src/main/java/com/pmumali/ch8_quatro/model/{ResultatCourse.java => ResultatCourseQuatro.java} (84%) create mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/ChevalQuatroRepository.java delete mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/CourseQuatroRepository.java delete mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/PaiementQuatroRepository.java delete mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/PaiementRepository.java create mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/PariQuatroRepository.java delete mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/PariRepository.java rename src/main/java/com/pmumali/ch8_quatro/repository/{ParieurRepository.java => ParieurQuatroRepository.java} (74%) create mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseQuatroRepository.java delete mode 100644 src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseRepository.java rename src/main/java/com/pmumali/ch9_quarteplus/model/{Cagnotte.java => CagnotteQuartePlus.java} (92%) rename src/main/java/com/pmumali/ch9_quarteplus/model/{Cheval.java => ChevalQuartePlus.java} (63%) rename src/main/java/com/pmumali/ch9_quarteplus/model/{Course.java => CourseQuartePlus.java} (80%) rename src/main/java/com/pmumali/ch9_quarteplus/model/{Paiement.java => PaiementQuartePlus.java} (82%) rename src/main/java/com/pmumali/ch9_quarteplus/model/{Parieur.java => ParieurQuartePlus.java} (84%) rename src/main/java/com/pmumali/ch9_quarteplus/model/{ResultatCourse.java => ResultatCourseQuartePlus.java} (55%) create mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteQuartePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteRepository.java create mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalQuartePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalRepository.java create mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/CourseQuartePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/CourseRepository.java create mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementQuartePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementRepository.java create mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurQuartePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurRepository.java create mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseQuartePlusRepository.java delete mode 100644 src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseRepository.java create mode 100644 src/main/java/com/pmumali/common/controller/ChevalController.java create mode 100644 src/main/java/com/pmumali/common/controller/CourseController.java create mode 100644 src/main/java/com/pmumali/common/controller/PariController.java create mode 100644 src/main/java/com/pmumali/common/controller/ResultatController.java create mode 100644 src/main/java/com/pmumali/common/model/Cheval.java create mode 100644 src/main/java/com/pmumali/common/model/Course.java create mode 100644 src/main/java/com/pmumali/common/model/Option.java create mode 100644 src/main/java/com/pmumali/common/model/Pari.java create mode 100644 src/main/java/com/pmumali/common/model/Resultat.java create mode 100644 src/main/java/com/pmumali/common/util/CollectionTransformer.java create mode 100644 src/main/java/com/pmumali/config/CorsConfig.java create mode 100644 src/main/java/com/pmumali/config/SecurityConfig.java create mode 100644 src/main/java/com/pmumali/config/SwaggerConfig.java delete mode 100644 src/test/java/com/pmu/mali/apiplr/ApiPlrApplicationTests.java diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5264205 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +# Step 1: Use an official OpenJDK base image from Docker Hub +FROM openjdk:17-jdk-alpine +# Step 2: Set the working directory inside the container +WORKDIR /app + +# Step 3: Copy the Spring Boot JAR file into the container +COPY build/libs/API-PLR-0.0.1-SNAPSHOT.jar /app/app.jar + +# Step 4: Expose the port your application runs on +EXPOSE 8080 + +# Step 5: Define the command to run your Spring Boot application +CMD ["java", "-jar", "/app/app.jar"] \ No newline at end of file diff --git a/build.gradle b/build.gradle index d8fc971..2b5f0d9 100644 --- a/build.gradle +++ b/build.gradle @@ -26,11 +26,20 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + developmentOnly 'org.springframework.boot:spring-boot-docker-compose' + implementation 'org.springframework.boot:spring-boot-starter-validation' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + // + implementation('org.springframework.boot:spring-boot-starter-security') + implementation('io.jsonwebtoken:jjwt-api:0.11.5') + implementation('io.jsonwebtoken:jjwt-impl:0.11.5') + implementation('io.jsonwebtoken:jjwt-jackson:0.11.5') } tasks.named('test') { diff --git a/deployToVPS.sh b/deployToVPS.sh new file mode 100644 index 0000000..ede4331 --- /dev/null +++ b/deployToVPS.sh @@ -0,0 +1 @@ +scp -P 22 build/libs/API-PLR-0.0.1-SNAPSHOT.jar dsit@192.168.1.235:/home/docker/api/ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..128f4ee --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +version: '3.8' +services: + api_app: + build: . + platform: linux/x86_64 + image: pmu_api:1 + container_name: api_app + ports: + - 8183:8080 + restart: on-failure + depends_on: + - api_db + networks: + - api + api_db: + image: postgres + container_name: api_db + ports: + - 5555:5432 + volumes: + - db_api:/var/lib/postgresql/data + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + - POSTGRES_DBNAME="api" + restart: always + networks: + - api +volumes: + db_api: +networks: + api: diff --git a/src/main/java/com/pmumali/api/ApiKey.java b/src/main/java/com/pmumali/api/ApiKey.java new file mode 100644 index 0000000..a990297 --- /dev/null +++ b/src/main/java/com/pmumali/api/ApiKey.java @@ -0,0 +1,28 @@ +package com.pmumali.api; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "api_keys") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ApiKey { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(unique = true, nullable = false, length = 128) + private String keyValue; + + @Column(nullable = false) + private Boolean active; + + @Column(nullable = false) + private LocalDateTime createdAt; +} diff --git a/src/main/java/com/pmumali/api/ApiKeyController.java b/src/main/java/com/pmumali/api/ApiKeyController.java new file mode 100644 index 0000000..660dee4 --- /dev/null +++ b/src/main/java/com/pmumali/api/ApiKeyController.java @@ -0,0 +1,27 @@ +package com.pmumali.api; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; + +@RestController +@RequestMapping("/admin/api-keys") +@RequiredArgsConstructor +public class ApiKeyController { + + private final ApiKeyService apiKeyService; + + @PostMapping("/create") + public ApiKey createApiKey() { + String generatedKey = UUID.randomUUID().toString().replace("-", ""); + return apiKeyService.createKey(generatedKey); + } + + // @PutMapping("/deactivate/{id}") + public String deactivateApiKey(@PathVariable Long id) { + apiKeyService.deactivateKey(id); + return "API Key désactivée avec succès"; + } +} + diff --git a/src/main/java/com/pmumali/api/ApiKeyFilter.java b/src/main/java/com/pmumali/api/ApiKeyFilter.java new file mode 100644 index 0000000..54d9a1e --- /dev/null +++ b/src/main/java/com/pmumali/api/ApiKeyFilter.java @@ -0,0 +1,34 @@ +package com.pmumali.api; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class ApiKeyFilter extends OncePerRequestFilter { + + private final ApiKeyService apiKeyService; + + @Override + protected void doFilterInternal(HttpServletRequest request, + HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + String requestApiKey = request.getHeader("x-api-key"); + + /* if (requestApiKey == null || !apiKeyService.isValid(requestApiKey)) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.getWriter().write("Invalid or missing API Key"); + return; + }*/ + + filterChain.doFilter(request, response); + } +} + diff --git a/src/main/java/com/pmumali/api/ApiKeyRepository.java b/src/main/java/com/pmumali/api/ApiKeyRepository.java new file mode 100644 index 0000000..b5aa1d8 --- /dev/null +++ b/src/main/java/com/pmumali/api/ApiKeyRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.api; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ApiKeyRepository extends JpaRepository { + Optional findByKeyValueAndActiveTrue(String keyValue); +} + diff --git a/src/main/java/com/pmumali/api/ApiKeyService.java b/src/main/java/com/pmumali/api/ApiKeyService.java new file mode 100644 index 0000000..e40b7d5 --- /dev/null +++ b/src/main/java/com/pmumali/api/ApiKeyService.java @@ -0,0 +1,34 @@ +package com.pmumali.api; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class ApiKeyService { + + private final ApiKeyRepository apiKeyRepository; + + public boolean isValid(String key) { + return apiKeyRepository.findByKeyValueAndActiveTrue(key).isPresent(); + } + + public ApiKey createKey(String key) { + ApiKey apiKey = ApiKey.builder() + .keyValue(key) + .active(true) + .createdAt(java.time.LocalDateTime.now()) + .build(); + return apiKeyRepository.save(apiKey); + } + + public void deactivateKey(Long id) { + apiKeyRepository.findById(id).ifPresent(apiKey -> { + apiKey.setActive(false); + apiKeyRepository.save(apiKey); + }); + } +} + diff --git a/src/main/java/com/pmumali/ch10_multi/controller/ControleurMulti.java b/src/main/java/com/pmumali/ch10_multi/controller/ControleurMulti.java index 1df92f1..941c5ba 100644 --- a/src/main/java/com/pmumali/ch10_multi/controller/ControleurMulti.java +++ b/src/main/java/com/pmumali/ch10_multi/controller/ControleurMulti.java @@ -31,7 +31,7 @@ public class ControleurMulti { } } - @PostMapping("/calculer-paiements") + // @PostMapping("/calculer-paiements") public ResponseEntity> calculerPaiements(@RequestBody RequeteResultatMulti requete) { try { List paiements = serviceMulti.calculerPaiements(requete); @@ -41,7 +41,7 @@ public class ControleurMulti { } } - @GetMapping("/calcul-combinaison") + // @GetMapping("/calcul-combinaison") public ResponseEntity calculerCombinaison( @RequestParam TypeMulti typeMulti, @RequestParam TypeFormuleMulti typeFormule, @@ -56,7 +56,7 @@ public class ControleurMulti { } } - @PostMapping("/cagnotte/{cagnotteId}/utiliser") + // @PostMapping("/cagnotte/{cagnotteId}/utiliser") public ResponseEntity utiliserCagnotte( @PathVariable Long cagnotteId, @RequestParam Long courseId) { @@ -68,22 +68,22 @@ public class ControleurMulti { } } - @GetMapping("/cagnottes/disponibles") + // @GetMapping("/cagnottes/disponibles") public ResponseEntity> getCagnottesDisponibles() { return ResponseEntity.ok(cagnotteRepository.findByUtilisee(false)); } - @GetMapping("/paris/course/{courseId}") + // @GetMapping("/paris/course/{courseId}") public ResponseEntity> getParisCourse(@PathVariable Long courseId) { return ResponseEntity.ok(pariRepository.findByCourseId(courseId)); } - @GetMapping("/paiements/pari/{pariId}") + // @GetMapping("/paiements/pari/{pariId}") public ResponseEntity> getPaiementsPari(@PathVariable Long pariId) { return ResponseEntity.ok(paiementRepository.findByPariId(pariId)); } - @GetMapping("/statistiques/course/{courseId}") + // @GetMapping("/statistiques/course/{courseId}") public ResponseEntity> getStatistiquesParis(@PathVariable Long courseId) { Map stats = new HashMap<>(); for (TypeMulti type : TypeMulti.values()) { diff --git a/src/main/java/com/pmumali/ch10_multi/model/Cheval.java b/src/main/java/com/pmumali/ch10_multi/model/ChevalMulti.java similarity index 70% rename from src/main/java/com/pmumali/ch10_multi/model/Cheval.java rename to src/main/java/com/pmumali/ch10_multi/model/ChevalMulti.java index 0c492a3..418100d 100644 --- a/src/main/java/com/pmumali/ch10_multi/model/Cheval.java +++ b/src/main/java/com/pmumali/ch10_multi/model/ChevalMulti.java @@ -9,12 +9,18 @@ import lombok.*; @AllArgsConstructor @Builder @Table(name = "cheval") -public class Cheval { +public class ChevalMulti { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; private Integer numero; + + @Column(name = "non_partant") private Boolean nonPartant; + + @ManyToOne + @JoinColumn(name = "course_id") + private CourseMulti course; } diff --git a/src/main/java/com/pmumali/ch10_multi/model/Course.java b/src/main/java/com/pmumali/ch10_multi/model/CourseMulti.java similarity index 77% rename from src/main/java/com/pmumali/ch10_multi/model/Course.java rename to src/main/java/com/pmumali/ch10_multi/model/CourseMulti.java index 6454acc..2ee8c61 100644 --- a/src/main/java/com/pmumali/ch10_multi/model/Course.java +++ b/src/main/java/com/pmumali/ch10_multi/model/CourseMulti.java @@ -12,18 +12,19 @@ import java.util.List; @AllArgsConstructor @Builder @Table(name = "course") -public class Course { +public class CourseMulti { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; + @Column(name = "heure_course") private LocalDateTime heureCourse; private Integer nombreChevauxPartants; @OneToMany - private List chevaux; + private List chevaux; @Enumerated(EnumType.STRING) - private StatutCourse statut; + private StatutCourseMulti 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 index cbf7e79..66ff6c8 100644 --- a/src/main/java/com/pmumali/ch10_multi/model/PaiementMulti.java +++ b/src/main/java/com/pmumali/ch10_multi/model/PaiementMulti.java @@ -20,8 +20,10 @@ public class PaiementMulti { private PariMulti pari; private Double montant; + @Column(name = "heure_paiement") private LocalDateTime heurePaiement; @Enumerated(EnumType.STRING) + @Column(name = "type_paiement") 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 index a3de198..c0d201f 100644 --- a/src/main/java/com/pmumali/ch10_multi/model/PariMulti.java +++ b/src/main/java/com/pmumali/ch10_multi/model/PariMulti.java @@ -18,10 +18,10 @@ public class PariMulti { private Long id; @ManyToOne - private Course course; + private CourseMulti course; @ManyToMany - private List chevauxSelectionnes; + private List chevauxSelectionnes; private Double mise; private LocalDateTime heurePari; @@ -33,7 +33,7 @@ public class PariMulti { private TypeFormuleMulti typeFormule; @ManyToOne - private Parieur parieur; + private ParieurMulti parieur; private Integer nombreChevauxBase; } diff --git a/src/main/java/com/pmumali/ch10_multi/model/Parieur.java b/src/main/java/com/pmumali/ch10_multi/model/ParieurMulti.java similarity index 84% rename from src/main/java/com/pmumali/ch10_multi/model/Parieur.java rename to src/main/java/com/pmumali/ch10_multi/model/ParieurMulti.java index 26dd65b..cfe668f 100644 --- a/src/main/java/com/pmumali/ch10_multi/model/Parieur.java +++ b/src/main/java/com/pmumali/ch10_multi/model/ParieurMulti.java @@ -9,12 +9,13 @@ import lombok.*; @AllArgsConstructor @Builder @Table(name = "parieur") -public class Parieur { +public class ParieurMulti { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; private String identification; + @Column(name = "mise_totale") private Double miseTotale; } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapport.java b/src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapportMulti.java similarity index 84% rename from src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapport.java rename to src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapportMulti.java index 01e2ee2..625e3de 100644 --- a/src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapport.java +++ b/src/main/java/com/pmumali/ch10_multi/model/ResultatCalculRapportMulti.java @@ -3,7 +3,7 @@ package com.pmumali.ch10_multi.model; import lombok.Data; @Data -public class ResultatCalculRapport { +public class ResultatCalculRapportMulti { private Double rapportBase; private Double rapportMulti4; private Double rapportMulti5; diff --git a/src/main/java/com/pmumali/ch10_multi/model/ResultatCourse.java b/src/main/java/com/pmumali/ch10_multi/model/ResultatCourseMulti.java similarity index 55% rename from src/main/java/com/pmumali/ch10_multi/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch10_multi/model/ResultatCourseMulti.java index ac22761..1bddea7 100644 --- a/src/main/java/com/pmumali/ch10_multi/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch10_multi/model/ResultatCourseMulti.java @@ -11,31 +11,35 @@ import java.util.List; @AllArgsConstructor @Builder @Table(name = "resultat_course") -public class ResultatCourse { +public class ResultatCourseMulti { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne - private Course course; + private CourseMulti course; @ManyToMany - private List premiers; + private List premiers; @ManyToMany - private List seconds; + private List seconds; @ManyToMany - private List troisiemes; + private List troisiemes; @ManyToMany - private List quatriemes; + private List quatriemes; @ManyToMany - private List ordreArrivee; + private List ordreArrivee; + @Column(name = "recette_nette") private Double recetteNette; + @Column(name = "montant_rembourse") private Double montantRembourse; + @Column(name = "prelevements_legaux") private Double prelevementsLegaux; + @Column(name = "masse_apartager") private Double masseAPartager; } diff --git a/src/main/java/com/pmumali/ch10_multi/model/StatutCourse.java b/src/main/java/com/pmumali/ch10_multi/model/StatutCourseMulti.java similarity index 72% rename from src/main/java/com/pmumali/ch10_multi/model/StatutCourse.java rename to src/main/java/com/pmumali/ch10_multi/model/StatutCourseMulti.java index 52afa87..d4307ec 100644 --- a/src/main/java/com/pmumali/ch10_multi/model/StatutCourse.java +++ b/src/main/java/com/pmumali/ch10_multi/model/StatutCourseMulti.java @@ -1,5 +1,5 @@ package com.pmumali.ch10_multi.model; -public enum StatutCourse { +public enum StatutCourseMulti { PROGRAMMEE, EN_COURS, TERMINEE, ANNULEE } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch10_multi/repository/ChevalMultiRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ChevalMultiRepository.java new file mode 100644 index 0000000..8230e9e --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/ChevalMultiRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.ChevalMulti; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ChevalMultiRepository extends JpaRepository { + List findByNonPartant(Boolean nonPartant); + List findByIdIn(List ids); +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ChevalRepository.java deleted file mode 100644 index 1b58a0b..0000000 --- a/src/main/java/com/pmumali/ch10_multi/repository/ChevalRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -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/CourseMultiRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/CourseMultiRepository.java new file mode 100644 index 0000000..cd60672 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/CourseMultiRepository.java @@ -0,0 +1,12 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.CourseMulti; +import com.pmumali.ch10_multi.model.StatutCourseMulti; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CourseMultiRepository extends JpaRepository { + List findByStatut(StatutCourseMulti statut); + List findByNombreChevauxPartantsGreaterThanEqual(Integer nombre); +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/CourseRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/CourseRepository.java deleted file mode 100644 index ca9dcce..0000000 --- a/src/main/java/com/pmumali/ch10_multi/repository/CourseRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -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/ParieurMultiRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ParieurMultiRepository.java new file mode 100644 index 0000000..6248e9e --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/ParieurMultiRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.ParieurMulti; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ParieurMultiRepository extends JpaRepository { + List findByNomContaining(String nom); +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/ParieurRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ParieurRepository.java deleted file mode 100644 index 55eac05..0000000 --- a/src/main/java/com/pmumali/ch10_multi/repository/ParieurRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch10_multi.repository; - -import com.pmumali.ch10_multi.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/ch10_multi/repository/ResultatCourseMultiRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseMultiRepository.java new file mode 100644 index 0000000..6b1f495 --- /dev/null +++ b/src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseMultiRepository.java @@ -0,0 +1,8 @@ +package com.pmumali.ch10_multi.repository; + +import com.pmumali.ch10_multi.model.ResultatCourseMulti; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResultatCourseMultiRepository extends JpaRepository { + ResultatCourseMulti findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseRepository.java deleted file mode 100644 index 3d4c75c..0000000 --- a/src/main/java/com/pmumali/ch10_multi/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pmumali.ch10_multi.repository; - -import com.pmumali.ch10_multi.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/ch10_multi/service/ServiceMulti.java b/src/main/java/com/pmumali/ch10_multi/service/ServiceMulti.java index 072e447..c8ab54c 100644 --- a/src/main/java/com/pmumali/ch10_multi/service/ServiceMulti.java +++ b/src/main/java/com/pmumali/ch10_multi/service/ServiceMulti.java @@ -16,12 +16,12 @@ import java.util.stream.Collectors; public class ServiceMulti { private final PariMultiRepository pariRepository; - private final CourseRepository courseRepository; - private final ChevalRepository chevalRepository; + private final CourseMultiRepository courseRepository; + private final ChevalMultiRepository chevalRepository; private final PaiementMultiRepository paiementRepository; - private final ResultatCourseRepository resultatRepository; + private final ResultatCourseMultiRepository resultatRepository; private final CagnotteMultiRepository cagnotteRepository; - private final ParieurRepository parieurRepository; + private final ParieurMultiRepository parieurRepository; private static final Double MISE_BASE = 500.0; private static final Double MISE_MAX = 200 * MISE_BASE; @@ -50,7 +50,7 @@ public class ServiceMulti { throw new IllegalArgumentException("La mise doit être au moins " + MISE_BASE + " FCFA"); } - Course course = courseRepository.findById(requete.getCourseId()) + CourseMulti course = courseRepository.findById(requete.getCourseId()) .orElseThrow(() -> new RuntimeException("Course non trouvée")); // Vérification du nombre minimum de chevaux @@ -58,19 +58,19 @@ public class ServiceMulti { throw new IllegalArgumentException("La course doit avoir au moins " + NOMBRE_CHEVAUX_MINIMUM + " chevaux partants"); } - List chevaux = chevalRepository.findAllById(requete.getChevalIds()); + 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(); + long nonPartants = chevaux.stream().filter(ChevalMulti::getNonPartant).count(); validerNonPartants(requete.getTypeMulti(), nonPartants); // Limitation de mise selon l'article 2 Double miseEffective = Math.min(requete.getMise(), MISE_MAX); - Parieur parieur = parieurRepository.findById(requete.getParieurId()) + ParieurMulti parieur = parieurRepository.findById(requete.getParieurId()) .orElseThrow(() -> new RuntimeException("Parieur non trouvé")); PariMulti pari = PariMulti.builder() @@ -123,7 +123,7 @@ public class ServiceMulti { @Transactional public List calculerPaiements(RequeteResultatMulti requete) { - ResultatCourse resultat = creerResultat(requete); + ResultatCourseMulti resultat = creerResultat(requete); List paris = pariRepository.findByCourseId(requete.getCourseId()); List paiements = new ArrayList<>(); @@ -168,9 +168,9 @@ public class ServiceMulti { return paiements; } - private ReponsePaiementMulti calculerPaiementPari(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { - List chevauxPari = pari.getChevauxSelectionnes(); - long nonPartants = chevauxPari.stream().filter(Cheval::getNonPartant).count(); + private ReponsePaiementMulti calculerPaiementPari(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { + List chevauxPari = pari.getChevauxSelectionnes(); + long nonPartants = chevauxPari.stream().filter(ChevalMulti::getNonPartant).count(); // Article 4: Gestion des non-partants et transformations if (doitEtreRembourse(pari.getTypeMulti(), nonPartants)) { @@ -180,7 +180,7 @@ public class ServiceMulti { // Transformer les paris avec non-partants (Article 4) TypeMulti typeTransforme = transformerPari(pari.getTypeMulti(), nonPartants); - List chevauxParticipants = chevauxPari.stream() + List chevauxParticipants = chevauxPari.stream() .filter(cheval -> !cheval.getNonPartant()) .collect(Collectors.toList()); @@ -228,7 +228,7 @@ public class ServiceMulti { } } - private boolean estCombinaisonGagnante(List chevauxPari, ResultatCourse resultat) { + private boolean estCombinaisonGagnante(List chevauxPari, ResultatCourseMulti resultat) { // Vérifier si au moins 4 chevaux sont dans les 4 premiers long countDansTop4 = chevauxPari.stream() .filter(cheval -> estDansTop4(cheval, resultat)) @@ -236,14 +236,14 @@ public class ServiceMulti { return countDansTop4 >= 4; } - private boolean estDansTop4(Cheval cheval, ResultatCourse resultat) { + private boolean estDansTop4(ChevalMulti cheval, ResultatCourseMulti resultat) { return estDansListe(cheval, resultat.getPremiers()) || estDansListe(cheval, resultat.getSeconds()) || estDansListe(cheval, resultat.getTroisiemes()) || estDansListe(cheval, resultat.getQuatriemes()); } - private boolean estDansListe(Cheval cheval, List liste) { + private boolean estDansListe(ChevalMulti cheval, List liste) { return liste != null && liste.contains(cheval); } @@ -520,7 +520,7 @@ public class ServiceMulti { } // Gestion des dead-heat (Article 3) - private TypeDeadHeat detecterDeadHeat(ResultatCourse resultat) { + private TypeDeadHeat detecterDeadHeat(ResultatCourseMulti resultat) { if (resultat.getPremiers().size() >= 4) return TypeDeadHeat.QUATRE_PREMIERS_OU_PLUS; if (resultat.getPremiers().size() >= 3 && resultat.getQuatriemes().size() >= 1) return TypeDeadHeat.TROIS_PREMIERS_UN_QUATRIEME; @@ -540,7 +540,7 @@ public class ServiceMulti { return null; } - private List gererDeadHeat(ResultatCourse resultat, TypeDeadHeat typeDeadHeat) { + private List gererDeadHeat(ResultatCourseMulti resultat, TypeDeadHeat typeDeadHeat) { List paris = pariRepository.findByCourseId(resultat.getCourse().getId()); List paiements = new ArrayList<>(); Double masseAPartager = resultat.getMasseAPartager(); @@ -556,7 +556,7 @@ public class ServiceMulti { return paiements; } - private ReponsePaiementMulti calculerPaiementDeadHeat(PariMulti pari, ResultatCourse resultat, + private ReponsePaiementMulti calculerPaiementDeadHeat(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager, TypeDeadHeat typeDeadHeat) { // Implémentation spécifique pour chaque type de dead-heat switch (typeDeadHeat) { @@ -581,9 +581,9 @@ public class ServiceMulti { } } - private ReponsePaiementMulti gererDeadHeatQuatrePremiers(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiementMulti gererDeadHeatQuatrePremiers(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { // Article 3a: Dead-heat de 4+ chevaux premiers - List chevauxPari = pari.getChevauxSelectionnes(); + 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()))) { @@ -596,9 +596,9 @@ public class ServiceMulti { return null; } - private ReponsePaiementMulti gererDeadHeatTroisPremiersUnQuatrieme(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiementMulti gererDeadHeatTroisPremiersUnQuatrieme(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { // Article 3b: Dead-heat de 3 premiers + 1+ quatrième - List chevauxPari = pari.getChevauxSelectionnes(); + List chevauxPari = pari.getChevauxSelectionnes(); boolean troisPremiersOk = chevauxPari.subList(0, 3).stream() .allMatch(cheval -> estDansListe(cheval, resultat.getPremiers())); @@ -615,40 +615,40 @@ public class ServiceMulti { } // Implémentations similaires pour les autres types de dead-heat... - private ReponsePaiementMulti gererDeadHeatDeuxPremiersDeuxTroisiemes(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiementMulti gererDeadHeatDeuxPremiersDeuxTroisiemes(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { // Article 3c: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 2.0); } - private ReponsePaiementMulti gererDeadHeatDeuxPremiersUnTroisiemeUnQuatrieme(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiementMulti gererDeadHeatDeuxPremiersUnTroisiemeUnQuatrieme(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { // Article 3d: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); } - private ReponsePaiementMulti gererDeadHeatTroisSeconds(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiementMulti gererDeadHeatTroisSeconds(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { // Article 3e: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 2.0); } - private ReponsePaiementMulti gererDeadHeatDeuxSecondsUnQuatrieme(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiementMulti gererDeadHeatDeuxSecondsUnQuatrieme(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { // Article 3f: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); } - private ReponsePaiementMulti gererDeadHeatDeuxTroisiemes(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiementMulti gererDeadHeatDeuxTroisiemes(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { // Article 3g: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); } - private ReponsePaiementMulti gererDeadHeatDeuxQuatriemes(PariMulti pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiementMulti gererDeadHeatDeuxQuatriemes(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager) { // Article 3h: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); } - private ReponsePaiementMulti calculerPaiementGeneriqueDeadHeat(PariMulti pari, ResultatCourse resultat, + private ReponsePaiementMulti calculerPaiementGeneriqueDeadHeat(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager, Double coefficient) { // Méthode générique pour les dead-heat avec coefficient spécifique - List chevauxPari = pari.getChevauxSelectionnes(); + List chevauxPari = pari.getChevauxSelectionnes(); if (chevauxPari.stream().allMatch(cheval -> estDansListe(cheval, resultat.getPremiers()) || @@ -676,14 +676,14 @@ public class ServiceMulti { return resultat; } - private int compterCombinaisonsGagnantesDeadHeat(ResultatCourse resultat) { + private int compterCombinaisonsGagnantesDeadHeat(ResultatCourseMulti resultat) { // Comptage simplifié des combinaisons gagnantes // Implémentation réelle dépendrait de la structure exacte du dead-heat return 1; } // Gestion de la cagnotte (Articles 9 et 10) - private void transfererEnCagnotte(ResultatCourse resultat) { + private void transfererEnCagnotte(ResultatCourseMulti resultat) { CagnotteMulti cagnotte = CagnotteMulti.builder() .montant(resultat.getMasseAPartager()) .dateCreation(LocalDateTime.now()) @@ -707,7 +707,7 @@ public class ServiceMulti { cagnotteRepository.save(cagnotte); // Ajouter le montant à la masse à partager de la course - ResultatCourse resultat = resultatRepository.findByCourseId(courseId); + ResultatCourseMulti resultat = resultatRepository.findByCourseId(courseId); if (resultat != null) { resultat.setMasseAPartager(resultat.getMasseAPartager() + cagnotte.getMontant()); resultatRepository.save(resultat); @@ -715,18 +715,18 @@ public class ServiceMulti { } // Méthodes utilitaires - private Double calculerMasseAPartager(ResultatCourse resultat) { + private Double calculerMasseAPartager(ResultatCourseMulti resultat) { // Article 5: MAP = RNET - MREMB - PRELEV return resultat.getRecetteNette() - resultat.getMontantRembourse() - resultat.getPrelevementsLegaux(); } - private ResultatCourse creerResultat(RequeteResultatMulti requete) { - Course course = courseRepository.findById(requete.getCourseId()) + private ResultatCourseMulti creerResultat(RequeteResultatMulti requete) { + CourseMulti course = courseRepository.findById(requete.getCourseId()) .orElseThrow(() -> new RuntimeException("Course non trouvée")); - return ResultatCourse.builder() + return ResultatCourseMulti.builder() .course(course) .premiers(chevalRepository.findAllById(requete.getPremiersIds())) .seconds(chevalRepository.findAllById(requete.getSecondsIds())) @@ -752,7 +752,7 @@ public class ServiceMulti { // Méthodes supplémentaires pour la gestion des cas particuliers (Article 9) @Transactional public List gererCasParticuliers(RequeteResultatMulti requete) { - ResultatCourse resultat = creerResultat(requete); + ResultatCourseMulti resultat = creerResultat(requete); List paris = pariRepository.findByCourseId(requete.getCourseId()); // Article 9: Cas où il n'y a aucune mise sur la combinaison gagnante @@ -763,7 +763,7 @@ public class ServiceMulti { return calculerPaiements(requete); } - private boolean existeParisGagnants(List paris, ResultatCourse resultat) { + private boolean existeParisGagnants(List paris, ResultatCourseMulti resultat) { for (PariMulti pari : paris) { if (estCombinaisonGagnante(pari.getChevauxSelectionnes(), resultat)) { return true; @@ -772,7 +772,7 @@ public class ServiceMulti { return false; } - private List appliquerReglesDegradation(ResultatCourse resultat, List paris) { + private List appliquerReglesDegradation(ResultatCourseMulti resultat, List paris) { // Article 9: Application des règles de dégradation List paiements = new ArrayList<>(); Double masseAPartager = resultat.getMasseAPartager(); @@ -794,10 +794,10 @@ public class ServiceMulti { return paiements; } - private ReponsePaiementMulti calculerPaiementDegrade(PariMulti pari, ResultatCourse resultat, + private ReponsePaiementMulti calculerPaiementDegrade(PariMulti pari, ResultatCourseMulti resultat, Double masseAPartager, int niveauDegradation) { // Implémentation des règles de dégradation selon l'article 9 - List chevauxPari = pari.getChevauxSelectionnes(); + List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier différents patterns de dégradation boolean estGagnant = false; @@ -826,15 +826,15 @@ public class ServiceMulti { return null; } - private boolean estPatternDegrade(List chevauxPari, ResultatCourse resultat, + private boolean estPatternDegrade(List chevauxPari, ResultatCourseMulti resultat, int pos1, int pos2, int pos3, int pos4) { // Vérifier un pattern spécifique de dégradation if (resultat.getOrdreArrivee().size() < 5) return false; - Cheval cheval1 = resultat.getOrdreArrivee().get(pos1); - Cheval cheval2 = resultat.getOrdreArrivee().get(pos2); - Cheval cheval3 = resultat.getOrdreArrivee().get(pos3); - Cheval cheval4 = resultat.getOrdreArrivee().get(pos4); + ChevalMulti cheval1 = resultat.getOrdreArrivee().get(pos1); + ChevalMulti cheval2 = resultat.getOrdreArrivee().get(pos2); + ChevalMulti cheval3 = resultat.getOrdreArrivee().get(pos3); + ChevalMulti cheval4 = resultat.getOrdreArrivee().get(pos4); return chevauxPari.contains(cheval1) && chevauxPari.contains(cheval2) && @@ -858,7 +858,7 @@ public class ServiceMulti { } public Double getMasseAPartagerCourse(Long courseId) { - ResultatCourse resultat = resultatRepository.findByCourseId(courseId); + ResultatCourseMulti resultat = resultatRepository.findByCourseId(courseId); return resultat != null ? resultat.getMasseAPartager() : 0.0; } diff --git a/src/main/java/com/pmumali/ch11_quinteplus/InitData.java b/src/main/java/com/pmumali/ch11_quinteplus/InitData.java index f28553d..4113ad3 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/InitData.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/InitData.java @@ -1,9 +1,9 @@ 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 com.pmumali.ch11_quinteplus.model.ChevalQuintePlus; +import com.pmumali.ch11_quinteplus.model.CourseQuintePlus; +import com.pmumali.ch11_quinteplus.repository.ChevalQuintePlusRepository; +import com.pmumali.ch11_quinteplus.repository.CourseQuintePlusRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @@ -14,54 +14,54 @@ import java.util.Arrays; public class InitData implements CommandLineRunner { @Autowired - private CourseRepository repositoryCourse; + private CourseQuintePlusRepository repositoryCourse; @Autowired - private ChevalRepository repositoryCheval; + private ChevalQuintePlusRepository repositoryCheval; @Override public void run(String... args) throws Exception { // Création d'une course de test - Course course = new Course(); + /* CourseQuintePlus course = new CourseQuintePlus(); 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); + CourseQuintePlus courseSauvee = repositoryCourse.save(course); // Création de chevaux de test - Cheval cheval1 = new Cheval(); + ChevalQuintePlus cheval1 = new ChevalQuintePlus(); cheval1.setNom("Foudre"); cheval1.setNumero(1); - cheval1.setEstNonPartant(false); + cheval1.setNonPartant(false); cheval1.setCourse(courseSauvee); - Cheval cheval2 = new Cheval(); + ChevalQuintePlus cheval2 = new ChevalQuintePlus(); cheval2.setNom("Éclair"); cheval2.setNumero(2); - cheval2.setEstNonPartant(false); + cheval2.setNonPartant(false); cheval2.setCourse(courseSauvee); - Cheval cheval3 = new Cheval(); + ChevalQuintePlus cheval3 = new ChevalQuintePlus(); cheval3.setNom("Tonnerre"); cheval3.setNumero(3); - cheval3.setEstNonPartant(false); + cheval3.setNonPartant(false); cheval3.setCourse(courseSauvee); - Cheval cheval4 = new Cheval(); + ChevalQuintePlus cheval4 = new ChevalQuintePlus(); cheval4.setNom("Vent"); cheval4.setNumero(4); - cheval4.setEstNonPartant(false); + cheval4.setNonPartant(false); cheval4.setCourse(courseSauvee); - Cheval cheval5 = new Cheval(); + ChevalQuintePlus cheval5 = new ChevalQuintePlus(); cheval5.setNom("Pluie"); cheval5.setNumero(5); - cheval5.setEstNonPartant(false); + cheval5.setNonPartant(false); cheval5.setCourse(courseSauvee); - repositoryCheval.saveAll(Arrays.asList(cheval1, cheval2, cheval3, cheval4, cheval5)); + 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/ControleurCagnotteQuintePlus.java similarity index 60% rename from src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCagnotte.java rename to src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCagnotteQuintePlus.java index 8cd4c61..7c3717e 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCagnotte.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCagnotteQuintePlus.java @@ -2,31 +2,31 @@ package com.pmumali.ch11_quinteplus.controller; -import com.pmumali.ch11_quinteplus.model.Cagnotte; -import com.pmumali.ch11_quinteplus.service.ServiceCagnotte; +import com.pmumali.ch11_quinteplus.model.CagnotteQuintePlus; +import com.pmumali.ch11_quinteplus.service.ServiceCagnotteQuintePlus; 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 { +@RequestMapping("/api/quinteplus/cagnotte") +public class ControleurCagnotteQuintePlus { @Autowired - private ServiceCagnotte serviceCagnotte; + private ServiceCagnotteQuintePlus serviceCagnotte; - @GetMapping("/montant") + // @GetMapping("/montant") public ResponseEntity getMontantCagnotteActive() { return ResponseEntity.ok(serviceCagnotte.getMontantCagnotteActive()); } - @GetMapping("/historique") - public ResponseEntity> getHistoriqueCagnottes() { + // @GetMapping("/historique") + public ResponseEntity> getHistoriqueCagnottes() { return ResponseEntity.ok(serviceCagnotte.getHistoriqueCagnottes()); } - @PostMapping("/gerer-cas-particuliers") + // @PostMapping("/gerer-cas-particuliers") public ResponseEntity gererCasParticuliers() { serviceCagnotte.gererCasParticuliersCagnotte(); return ResponseEntity.ok("Cas particuliers de cagnotte gérés avec succès"); diff --git a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourse.java b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourse.java deleted file mode 100644 index a553dce..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourse.java +++ /dev/null @@ -1,55 +0,0 @@ -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/ControleurCourseQuintePlus.java b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourseQuintePlus.java new file mode 100644 index 0000000..1feebdd --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurCourseQuintePlus.java @@ -0,0 +1,55 @@ +package com.pmumali.ch11_quinteplus.controller; + +import com.pmumali.ch11_quinteplus.model.CourseQuintePlus; +import com.pmumali.ch11_quinteplus.service.ServiceCourseQuintePlus; +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/quinteplus/courses") +public class ControleurCourseQuintePlus { + + @Autowired + private ServiceCourseQuintePlus serviceCourse; + + // @PostMapping + public ResponseEntity creerCourse(@RequestBody CourseQuintePlus course) { + return ResponseEntity.ok(serviceCourse.creerCourse(course)); + } + + // @GetMapping + public ResponseEntity> obtenirToutesCourses() { + return ResponseEntity.ok(serviceCourse.obtenirToutesCourses()); + } + + // @GetMapping("/{id}") + public ResponseEntity obtenirCourseParId(@PathVariable Long id) { + CourseQuintePlus 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 CourseQuintePlus course) { + CourseQuintePlus 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 deleted file mode 100644 index 28f611a..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurGains.java +++ /dev/null @@ -1,29 +0,0 @@ -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/ControleurGainsQuintePlus.java b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurGainsQuintePlus.java new file mode 100644 index 0000000..537a711 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurGainsQuintePlus.java @@ -0,0 +1,29 @@ +package com.pmumali.ch11_quinteplus.controller; + +import com.pmumali.ch11_quinteplus.model.GainsQuintePlus; +import com.pmumali.ch11_quinteplus.model.ResultatQuintePlus; +import com.pmumali.ch11_quinteplus.service.ServiceGainsQuintePlus; +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/quinteplus/gains") +public class ControleurGainsQuintePlus { + + @Autowired + private ServiceGainsQuintePlus serviceGains; + + // @PostMapping("/calculer/{courseId}") + public ResponseEntity calculerGains(@PathVariable Long courseId, @RequestBody ResultatQuintePlus resultat) { + return ResponseEntity.ok(serviceGains.calculerGains(courseId, resultat)); + } + + // @GetMapping("/course/{courseId}") + public ResponseEntity obtenirGainsParCourse(@PathVariable Long courseId) { + GainsQuintePlus 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 deleted file mode 100644 index 3ab1f06..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurPari.java +++ /dev/null @@ -1,51 +0,0 @@ -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/controller/ControleurPariQuintePlus.java b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurPariQuintePlus.java new file mode 100644 index 0000000..cb9611c --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/controller/ControleurPariQuintePlus.java @@ -0,0 +1,51 @@ +package com.pmumali.ch11_quinteplus.controller; + +import com.pmumali.ch11_quinteplus.model.PariQuintePlus; +import com.pmumali.ch11_quinteplus.service.ServicePariQuintePlus; +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/quinteplus") +public class ControleurPariQuintePlus { + + @Autowired + private ServicePariQuintePlus servicePari; + + @PostMapping("/pari") + public ResponseEntity placerPari(@RequestBody PariQuintePlus 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) { + PariQuintePlus pari = servicePari.obtenirPariParId(id); + return pari != null ? ResponseEntity.ok(pari) : ResponseEntity.notFound().build(); + } + + // @PutMapping("/{id}") + public ResponseEntity mettreAJourPari(@PathVariable Long id, @RequestBody PariQuintePlus pari) { + PariQuintePlus 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/CagnotteQuintePlus.java similarity index 68% rename from src/main/java/com/pmumali/ch11_quinteplus/model/Cagnotte.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/CagnotteQuintePlus.java index 93d6b9a..8f7e601 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/CagnotteQuintePlus.java @@ -1,12 +1,18 @@ package com.pmumali.ch11_quinteplus.model; import jakarta.persistence.*; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Data -public class Cagnotte { +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "cagnotte_quinteplus") +public class CagnotteQuintePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -18,15 +24,15 @@ public class Cagnotte { @ManyToOne @JoinColumn(name = "course_source_id") - private Course courseSource; + private CourseQuintePlus courseSource; @ManyToOne @JoinColumn(name = "course_destination_id") - private Course courseDestination; + private CourseQuintePlus courseDestination; private String typeCagnotte; // ORDRE_EXACT, ORDRE_INEXACT, COMBINEE - public Cagnotte(double montant, Course courseSource, String typeCagnotte) { + public CagnotteQuintePlus(double montant, CourseQuintePlus courseSource, String typeCagnotte) { this.montant = montant; this.courseSource = courseSource; this.typeCagnotte = typeCagnotte; diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Cheval.java b/src/main/java/com/pmumali/ch11_quinteplus/model/ChevalQuintePlus.java similarity index 72% rename from src/main/java/com/pmumali/ch11_quinteplus/model/Cheval.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/ChevalQuintePlus.java index a97edca..d1dbdcd 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/Cheval.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/ChevalQuintePlus.java @@ -8,16 +8,17 @@ import lombok.*; @NoArgsConstructor @AllArgsConstructor @Table(name = "cheval") -public class Cheval { +public class ChevalQuintePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; private int numero; - private boolean estNonPartant; + @Column(name = "non_partant") + private boolean nonPartant; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseQuintePlus course; } diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/CourseDto.java b/src/main/java/com/pmumali/ch11_quinteplus/model/CourseDtoQuintePlus.java similarity index 89% rename from src/main/java/com/pmumali/ch11_quinteplus/model/CourseDto.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/CourseDtoQuintePlus.java index 0397979..dc1a87f 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/CourseDto.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/CourseDtoQuintePlus.java @@ -6,7 +6,7 @@ import java.time.LocalDateTime; import java.util.List; @Data -public class CourseDto { +public class CourseDtoQuintePlus { private Long id; private String nom; private LocalDateTime date; diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Course.java b/src/main/java/com/pmumali/ch11_quinteplus/model/CourseQuintePlus.java similarity index 81% rename from src/main/java/com/pmumali/ch11_quinteplus/model/Course.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/CourseQuintePlus.java index 0e8e0f2..bc9a9d9 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/Course.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/CourseQuintePlus.java @@ -14,19 +14,20 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Table(name = "course") -public class Course { +public class CourseQuintePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; + @Column(name = "heure_course") private LocalDateTime date; private String lieu; private boolean estTerminee; @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List chevaux; + private List chevaux; @OneToOne(mappedBy = "course", cascade = CascadeType.ALL) - private Resultat resultat; + private ResultatQuintePlus resultat; } diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/GainsDto.java b/src/main/java/com/pmumali/ch11_quinteplus/model/GainsDtoQuintePlus.java similarity index 92% rename from src/main/java/com/pmumali/ch11_quinteplus/model/GainsDto.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/GainsDtoQuintePlus.java index ed4f31a..537d70b 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/GainsDto.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/GainsDtoQuintePlus.java @@ -5,7 +5,7 @@ import lombok.Data; import java.time.LocalDateTime; @Data -public class GainsDto { +public class GainsDtoQuintePlus { private Long id; private Long courseId; private double masseOrdreExact; diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Gains.java b/src/main/java/com/pmumali/ch11_quinteplus/model/GainsQuintePlus.java similarity index 90% rename from src/main/java/com/pmumali/ch11_quinteplus/model/Gains.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/GainsQuintePlus.java index 12d8866..ecf9ea4 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/Gains.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/GainsQuintePlus.java @@ -10,14 +10,14 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor @Table(name = "gains") -public class Gains { +public class GainsQuintePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseQuintePlus course; private double masseOrdreExact; private double masseOrdreInexact; diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/PariDto.java b/src/main/java/com/pmumali/ch11_quinteplus/model/PariDtoQuintePlus.java similarity index 92% rename from src/main/java/com/pmumali/ch11_quinteplus/model/PariDto.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/PariDtoQuintePlus.java index 1c40a57..c97c8ab 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/PariDto.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/PariDtoQuintePlus.java @@ -6,7 +6,7 @@ import java.time.LocalDateTime; import java.util.List; @Data -public class PariDto { +public class PariDtoQuintePlus { private Long id; private String nomParieur; private LocalDateTime datePari; diff --git a/src/main/java/com/pmumali/ch11_quinteplus/model/Pari.java b/src/main/java/com/pmumali/ch11_quinteplus/model/PariQuintePlus.java similarity index 86% rename from src/main/java/com/pmumali/ch11_quinteplus/model/Pari.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/PariQuintePlus.java index baf7181..6ac40be 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/Pari.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/PariQuintePlus.java @@ -11,7 +11,7 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Table(name = "pari") -public class Pari { +public class PariQuintePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -22,14 +22,14 @@ public class Pari { @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseQuintePlus course; @ElementCollection private List chevauxSelectionnes; @ElementCollection private List ordrePredit; - + @Column(name = "type_pari") 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/ResultatQuintePlus.java similarity index 82% rename from src/main/java/com/pmumali/ch11_quinteplus/model/Resultat.java rename to src/main/java/com/pmumali/ch11_quinteplus/model/ResultatQuintePlus.java index 27adaad..97e74b6 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/model/Resultat.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/model/ResultatQuintePlus.java @@ -9,15 +9,15 @@ import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor -@Table(name = "resultat") -public class Resultat { +@Table(name = "resultat_course") +public class ResultatQuintePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne @JoinColumn(name = "course_id") - private Course course; + private CourseQuintePlus course; @ElementCollection private List idsChevauxOrdreArrivee; diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteQuintePlusRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteQuintePlusRepository.java new file mode 100644 index 0000000..dee5a63 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteQuintePlusRepository.java @@ -0,0 +1,14 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.CagnotteQuintePlus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CagnotteQuintePlusRepository 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/CagnotteRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteRepository.java deleted file mode 100644 index 3914911..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/repository/CagnotteRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -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/ChevalQuintePlusRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalQuintePlusRepository.java new file mode 100644 index 0000000..0a85412 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalQuintePlusRepository.java @@ -0,0 +1,12 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.ChevalQuintePlus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ChevalQuintePlusRepository extends JpaRepository { + List findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalRepository.java deleted file mode 100644 index 514e9e8..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/repository/ChevalRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -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/CourseQuintePlusRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/CourseQuintePlusRepository.java new file mode 100644 index 0000000..052ac97 --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/CourseQuintePlusRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.CourseQuintePlus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseQuintePlusRepository extends JpaRepository { + List findByEstTerminee(boolean estTerminee); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/CourseRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/CourseRepository.java deleted file mode 100644 index 42882cf..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/repository/CourseRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -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/GainsQuintePlusRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/GainsQuintePlusRepository.java new file mode 100644 index 0000000..53bfabe --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/GainsQuintePlusRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.GainsQuintePlus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface GainsQuintePlusRepository extends JpaRepository { + GainsQuintePlus findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/GainsRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/GainsRepository.java deleted file mode 100644 index ab98abd..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/repository/GainsRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -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/PariQuintePlusRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/PariQuintePlusRepository.java new file mode 100644 index 0000000..52f1cee --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/PariQuintePlusRepository.java @@ -0,0 +1,13 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.PariQuintePlus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PariQuintePlusRepository extends JpaRepository { + List findByCourseId(Long courseId); + List findByNomParieur(String nomParieur); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/PariRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/PariRepository.java deleted file mode 100644 index 1e7ab49..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/repository/PariRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -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/ResultatQuintePlusRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatQuintePlusRepository.java new file mode 100644 index 0000000..4d4f0ab --- /dev/null +++ b/src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatQuintePlusRepository.java @@ -0,0 +1,9 @@ +package com.pmumali.ch11_quinteplus.repository; + +import com.pmumali.ch11_quinteplus.model.ResultatQuintePlus; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResultatQuintePlusRepository extends JpaRepository { + + ResultatQuintePlus findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatRepository.java b/src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatRepository.java deleted file mode 100644 index 4c3cf6a..0000000 --- a/src/main/java/com/pmumali/ch11_quinteplus/repository/ResultatRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -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/ServiceCagnotteQuintePlus.java similarity index 66% rename from src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCagnotte.java rename to src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCagnotteQuintePlus.java index f283f51..ab4c34c 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCagnotte.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCagnotteQuintePlus.java @@ -1,9 +1,9 @@ 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 com.pmumali.ch11_quinteplus.repository.CagnotteQuintePlusRepository; +import com.pmumali.ch11_quinteplus.repository.CourseQuintePlusRepository; +import com.pmumali.ch11_quinteplus.repository.GainsQuintePlusRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -15,24 +15,24 @@ import java.util.stream.Collectors; @Service @Transactional -public class ServiceCagnotte { +public class ServiceCagnotteQuintePlus { @Autowired - private CagnotteRepository cagnotteRepository; + private CagnotteQuintePlusRepository cagnotteRepository; @Autowired - private CourseRepository repositoryCourse; + private CourseQuintePlusRepository repositoryCourse; @Autowired - private GainsRepository repositoryGains; + private GainsQuintePlusRepository 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(); + public void gererCagnotte(GainsQuintePlus gains, List paris, ResultatQuintePlus resultat) { + CourseQuintePlus 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); + List gagnantsOrdreExact = determinerGagnantsOrdreExact(paris, resultat); + List gagnantsOrdreInexact = determinerGagnantsOrdreInexact(paris, resultat); double montantCagnotte = 0.0; boolean cagnotteOrdreExact = false; @@ -57,7 +57,7 @@ public class ServiceCagnotte { // Si une cagnotte doit être créée if (montantCagnotte > 0) { String typeCagnotte = determinerTypeCagnotte(cagnotteOrdreExact, cagnotteOrdreInexact); - Cagnotte cagnotte = new Cagnotte(montantCagnotte, course, typeCagnotte); + CagnotteQuintePlus cagnotte = new CagnotteQuintePlus(montantCagnotte, course, typeCagnotte); cagnotteRepository.save(cagnotte); // Mettre à jour le gain avec le montant de la cagnotte @@ -79,15 +79,15 @@ public class ServiceCagnotte { } // Méthode pour reporter les cagnottes vers la prochaine course - public void reporterCagnottesVersProchaineCourse(Course courseActuelle) { + public void reporterCagnottesVersProchaineCourse(CourseQuintePlus courseActuelle) { // Trouver toutes les cagnottes actives - List cagnottesActives = cagnotteRepository.findByStatut("ACTIVE"); + List cagnottesActives = cagnotteRepository.findByStatut("ACTIVE"); // Trouver la prochaine course - Course prochaineCourse = trouverProchaineCourse(courseActuelle); + CourseQuintePlus prochaineCourse = trouverProchaineCourse(courseActuelle); if (prochaineCourse != null) { - for (Cagnotte cagnotte : cagnottesActives) { + for (CagnotteQuintePlus cagnotte : cagnottesActives) { // Article 9b: Reporter la cagnotte vers la prochaine course cagnotte.setCourseDestination(prochaineCourse); cagnotte.setDateDerniereModification(LocalDateTime.now()); @@ -95,7 +95,7 @@ public class ServiceCagnotte { } } else { // Article 9d: Si pas de course la semaine suivante, reporter à la prochaine disponible - for (Cagnotte cagnotte : cagnottesActives) { + for (CagnotteQuintePlus cagnotte : cagnottesActives) { cagnotte.setStatut("REPORTEE"); cagnotte.setDateDerniereModification(LocalDateTime.now()); cagnotteRepository.save(cagnotte); @@ -104,13 +104,13 @@ public class ServiceCagnotte { } // Méthode pour appliquer les cagnottes reportées à une course - public void appliquerCagnottesReportees(Course course) { + public void appliquerCagnottesReportees(CourseQuintePlus course) { // Trouver toutes les cagnottes reportées pour cette course - List cagnottesReportees = cagnotteRepository.findByCourseDestinationId(course.getId()); + List cagnottesReportees = cagnotteRepository.findByCourseDestinationId(course.getId()); double montantTotalCagnotte = 0.0; - for (Cagnotte cagnotte : cagnottesReportees) { + for (CagnotteQuintePlus cagnotte : cagnottesReportees) { if ("REPORTEE".equals(cagnotte.getStatut())) { montantTotalCagnotte += cagnotte.getMontant(); @@ -123,10 +123,10 @@ public class ServiceCagnotte { // Appliquer la cagnotte à la masse à partager de la course if (montantTotalCagnotte > 0) { - Optional gainsOpt = Optional.ofNullable(repositoryGains.findByCourseId(course.getId())); + Optional gainsOpt = Optional.ofNullable(repositoryGains.findByCourseId(course.getId())); if (gainsOpt.isPresent()) { - Gains gains = gainsOpt.get(); + GainsQuintePlus gains = gainsOpt.get(); // Article 9b: Ajouter la cagnotte à la masse à partager de l'ordre exact gains.setMasseOrdreExact(gains.getMasseOrdreExact() + montantTotalCagnotte); @@ -138,11 +138,11 @@ public class ServiceCagnotte { } // 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; + private CourseQuintePlus trouverProchaineCourse(CourseQuintePlus courseActuelle) { + List toutesCourses = repositoryCourse.findAll(); + CourseQuintePlus prochaineCourse = null; - for (Course course : toutesCourses) { + for (CourseQuintePlus course : toutesCourses) { if (course.getDate().isAfter(courseActuelle.getDate()) && (prochaineCourse == null || course.getDate().isBefore(prochaineCourse.getDate()))) { prochaineCourse = course; @@ -157,16 +157,16 @@ public class ServiceCagnotte { // 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"); + List cagnottesActives = cagnotteRepository.findByStatut("ACTIVE"); if (cagnottesActives.size() > 1) { // Trouver la prochaine course - Course prochaineCourse = trouverProchaineCourseParDate(LocalDateTime.now()); + CourseQuintePlus prochaineCourse = trouverProchaineCourseParDate(LocalDateTime.now()); if (prochaineCourse != null) { double montantTotal = 0.0; - for (Cagnotte cagnotte : cagnottesActives) { + for (CagnotteQuintePlus cagnotte : cagnottesActives) { montantTotal += cagnotte.getMontant(); cagnotte.setCourseDestination(prochaineCourse); cagnotte.setStatut("UTILISEE"); @@ -180,11 +180,11 @@ public class ServiceCagnotte { } } - private Course trouverProchaineCourseParDate(LocalDateTime date) { - List toutesCourses = repositoryCourse.findAll(); - Course prochaineCourse = null; + private CourseQuintePlus trouverProchaineCourseParDate(LocalDateTime date) { + List toutesCourses = repositoryCourse.findAll(); + CourseQuintePlus prochaineCourse = null; - for (Course course : toutesCourses) { + for (CourseQuintePlus course : toutesCourses) { if (course.getDate().isAfter(date) && (prochaineCourse == null || course.getDate().isBefore(prochaineCourse.getDate()))) { prochaineCourse = course; @@ -194,17 +194,17 @@ public class ServiceCagnotte { return prochaineCourse; } - private void appliquerCagnotteACourse(Course course, double montant) { - Optional gainsOpt = Optional.ofNullable(repositoryGains.findByCourseId(course.getId())); + private void appliquerCagnotteACourse(CourseQuintePlus course, double montant) { + Optional gainsOpt = Optional.ofNullable(repositoryGains.findByCourseId(course.getId())); if (gainsOpt.isPresent()) { - Gains gains = gainsOpt.get(); + GainsQuintePlus 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(); + GainsQuintePlus gains = new GainsQuintePlus(); gains.setCourse(course); gains.setMasseOrdreExact(montant); gains.setMasseCagnotte(montant); @@ -215,33 +215,33 @@ public class ServiceCagnotte { // 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(); + List cagnottesActives = cagnotteRepository.findByStatut("ACTIVE"); + return cagnottesActives.stream().mapToDouble(CagnotteQuintePlus::getMontant).sum(); } // Méthode pour obtenir l'historique des cagnottes - public List getHistoriqueCagnottes() { + public List getHistoriqueCagnottes() { return cagnotteRepository.findAll(); } // Méthodes utilitaires pour déterminer les gagnants - private List determinerGagnantsOrdreExact(List paris, Resultat resultat) { + private List determinerGagnantsOrdreExact(List paris, ResultatQuintePlus resultat) { return paris.stream() .filter(pari -> estOrdreExact(pari, resultat)) .collect(Collectors.toList()); } - private List determinerGagnantsOrdreInexact(List paris, Resultat resultat) { + private List determinerGagnantsOrdreInexact(List paris, ResultatQuintePlus resultat) { return paris.stream() .filter(pari -> estOrdreInexact(pari, resultat)) .collect(Collectors.toList()); } - private boolean estOrdreExact(Pari pari, Resultat resultat) { + private boolean estOrdreExact(PariQuintePlus pari, ResultatQuintePlus resultat) { return pari.getOrdrePredit().equals(resultat.getIdsChevauxOrdreArrivee()); } - private boolean estOrdreInexact(Pari pari, Resultat resultat) { + private boolean estOrdreInexact(PariQuintePlus pari, ResultatQuintePlus resultat) { List chevauxArrivee = resultat.getIdsChevauxOrdreArrivee(); List chevauxPari = pari.getChevauxSelectionnes(); diff --git a/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourse.java b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourseQuintePlus.java similarity index 56% rename from src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourse.java rename to src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourseQuintePlus.java index 8d049b4..cd431c0 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourse.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceCourseQuintePlus.java @@ -1,8 +1,8 @@ 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 com.pmumali.ch11_quinteplus.model.CourseQuintePlus; +import com.pmumali.ch11_quinteplus.repository.ChevalQuintePlusRepository; +import com.pmumali.ch11_quinteplus.repository.CourseQuintePlusRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -10,36 +10,36 @@ import java.util.List; @Service -public class ServiceCourse { +public class ServiceCourseQuintePlus { @Autowired - private CourseRepository repositoryCourse; + private CourseQuintePlusRepository repositoryCourse; @Autowired - private ChevalRepository repositoryCheval; + private ChevalQuintePlusRepository repositoryCheval; - public Course creerCourse(Course course) { + public CourseQuintePlus creerCourse(CourseQuintePlus course) { return repositoryCourse.save(course); } - public List obtenirToutesCourses() { + public List obtenirToutesCourses() { return repositoryCourse.findAll(); } - public Course obtenirCourseParId(Long id) { + public CourseQuintePlus obtenirCourseParId(Long id) { return repositoryCourse.findById(id).orElse(null); } - public List obtenirCoursesTerminees() { + public List obtenirCoursesTerminees() { return repositoryCourse.findByEstTerminee(true); } - public List obtenirCoursesAVenir() { + public List obtenirCoursesAVenir() { return repositoryCourse.findByEstTerminee(false); } - public Course mettreAJourCourse(Long id, Course detailsCourse) { - Course course = repositoryCourse.findById(id).orElse(null); + public CourseQuintePlus mettreAJourCourse(Long id, CourseQuintePlus detailsCourse) { + CourseQuintePlus course = repositoryCourse.findById(id).orElse(null); if (course != null) { course.setNom(detailsCourse.getNom()); course.setDate(detailsCourse.getDate()); diff --git a/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGains.java b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGainsQuintePlus.java similarity index 79% rename from src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGains.java rename to src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGainsQuintePlus.java index 87e6799..828cafc 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGains.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/service/ServiceGainsQuintePlus.java @@ -1,9 +1,9 @@ package com.pmumali.ch11_quinteplus.service; -import com.pmumali.ch11_quinteplus.model.Course; +import com.pmumali.ch11_quinteplus.model.CourseQuintePlus; 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.model.ResultatQuintePlus; +import com.pmumali.ch11_quinteplus.repository.GainsQuintePlusRepository; import com.pmumali.ch11_quinteplus.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -15,40 +15,40 @@ import java.util.stream.Collectors; @Service @Transactional -public class ServiceGains { +public class ServiceGainsQuintePlus { @Autowired - private PariRepository repositoryPari; + private PariQuintePlusRepository repositoryPari; @Autowired - private GainsRepository repositoryGains; + private GainsQuintePlusRepository repositoryGains; @Autowired - private CourseRepository repositoryCourse; + private CourseQuintePlusRepository repositoryCourse; @Autowired - private ChevalRepository repositoryCheval; + private ChevalQuintePlusRepository repositoryCheval; @Autowired - private ResultatRepository repositoryResultat; + private ResultatQuintePlusRepository repositoryResultat; @Autowired - private ServiceCagnotte serviceCagnotte; + private ServiceCagnotteQuintePlus 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) + public GainsQuintePlus calculerGains(Long courseId, ResultatQuintePlus resultat) { + CourseQuintePlus 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); + List tousParis = repositoryPari.findByCourseId(courseId); // Calcul de la recette nette (Article 5) - double totalMises = tousParis.stream().mapToDouble(Pari::getMise).sum(); + double totalMises = tousParis.stream().mapToDouble(PariQuintePlus::getMise).sum(); double recetteNette = totalMises; // Calcul des remboursements (Article 4) @@ -66,7 +66,7 @@ public class ServiceGains { double masseBonus4 = masseAPartager * 0.25; // Calcul des rapports - Gains gains = new Gains(); + GainsQuintePlus gains = new GainsQuintePlus(); gains.setCourse(course); gains.setMasseOrdreExact(masseOrdreExact); gains.setMasseOrdreInexact(masseOrdreInexact); @@ -85,10 +85,10 @@ public class ServiceGains { return repositoryGains.save(gains); } - private double calculerRemboursements(List paris, Resultat resultat) { + private double calculerRemboursements(List paris, ResultatQuintePlus resultat) { double remboursements = 0.0; - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { int nombreNonPartants = compterNonPartants(pari); if (nombreNonPartants >= 2) { // Article 4a: Remboursement si 2 chevaux ou plus non partants @@ -107,18 +107,18 @@ public class ServiceGains { return remboursements; } - private int compterNonPartants(Pari pari) { + private int compterNonPartants(PariQuintePlus pari) { int compte = 0; - List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); - for (Cheval cheval : chevaux) { - if (cheval.isEstNonPartant()) { + List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); + for (ChevalQuintePlus cheval : chevaux) { + if (cheval.isNonPartant()) { compte++; } } return compte; } - private boolean sontQuatrePremiers(Pari pari, Resultat resultat) { + private boolean sontQuatrePremiers(PariQuintePlus pari, ResultatQuintePlus resultat) { // Vérifier si au moins 4 chevaux du pari sont dans les 4 premiers if (resultat.getIdsChevauxOrdreArrivee().size() < 4) { return false; @@ -134,24 +134,24 @@ public class ServiceGains { return compte >= 4; } - private void calculerDetailsGains(Gains gains, List paris, Resultat resultat) { + private void calculerDetailsGains(GainsQuintePlus gains, List paris, ResultatQuintePlus 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); + 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"); + 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(); + double totalMisesOrdreExact = parisOrdreExact.stream().mapToDouble(PariQuintePlus::getMise).sum(); + double totalMisesOrdreInexact = parisOrdreInexact.stream().mapToDouble(PariQuintePlus::getMise).sum(); + double totalMisesBonus4 = parisBonus4.stream().mapToDouble(PariQuintePlus::getMise).sum(); if (totalMisesOrdreExact > 0) { gains.setDividendeOrdreExact(gains.getMasseOrdreExact() / totalMisesOrdreExact); @@ -177,30 +177,30 @@ public class ServiceGains { marquerParisPayes(parisOrdreExact); } - private List determinerGagnantsOrdreExact(List paris, Resultat resultat) { + private List determinerGagnantsOrdreExact(List paris, ResultatQuintePlus resultat) { return paris.stream() .filter(pari -> estOrdreExact(pari, resultat)) .collect(Collectors.toList()); } - private List determinerGagnantsOrdreInexact(List paris, Resultat resultat) { + private List determinerGagnantsOrdreInexact(List paris, ResultatQuintePlus resultat) { return paris.stream() .filter(pari -> estOrdreInexact(pari, resultat)) .collect(Collectors.toList()); } - private List determinerGagnantsBonus4(List paris, Resultat resultat) { + private List determinerGagnantsBonus4(List paris, ResultatQuintePlus resultat) { return paris.stream() .filter(pari -> estBonus4(pari, resultat)) .collect(Collectors.toList()); } - private boolean estOrdreExact(Pari pari, Resultat resultat) { + private boolean estOrdreExact(PariQuintePlus pari, ResultatQuintePlus 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) { + private boolean estOrdreInexact(PariQuintePlus pari, ResultatQuintePlus resultat) { List chevauxArrivee = resultat.getIdsChevauxOrdreArrivee(); List chevauxPari = pari.getChevauxSelectionnes(); @@ -209,7 +209,7 @@ public class ServiceGains { !pari.getOrdrePredit().equals(chevauxArrivee); } - private boolean estBonus4(Pari pari, Resultat resultat) { + private boolean estBonus4(PariQuintePlus pari, ResultatQuintePlus resultat) { if (resultat.getIdsChevauxOrdreArrivee().size() < 4) { return false; } @@ -225,11 +225,11 @@ public class ServiceGains { return compte >= 4; } - private void marquerParisPayes(List paris) { - for (Pari pari : paris) { + private void marquerParisPayes(List paris) { + for (PariQuintePlus pari : paris) { if (!pari.isEstPaye()) { // Vérifier si le pari est gagnant - Resultat resultat = repositoryResultat.findByCourseId(pari.getCourse().getId()); + ResultatQuintePlus resultat = repositoryResultat.findByCourseId(pari.getCourse().getId()); if (estOrdreExact(pari, resultat) || estOrdreInexact(pari, resultat) || estBonus4(pari, resultat)) { pari.setEstPaye(true); repositoryPari.save(pari); @@ -238,32 +238,32 @@ public class ServiceGains { } } - private Map gererDeadHeat(Resultat resultat, List paris) { + private Map gererDeadHeat(ResultatQuintePlus 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<>(); + List parisOrdreExact = new ArrayList<>(); + List parisOrdreInexact = new ArrayList<>(); + List parisBonus4 = new ArrayList<>(); switch (typeDeadHeat) { case "CINQ_PREMIERS": - Map> resultats = traiterDeadHeatCinqPremiers(resultat, paris); + Map> resultats = traiterDeadHeatCinqPremiers(resultat, paris); parisOrdreExact = resultats.get("ordreExact"); parisOrdreInexact = resultats.get("ordreInexact"); break; case "QUATRE_PREMIERS_UN_CINQUIEME": - Map> resultats2 = traiterDeadHeatQuatrePremiersUnCinquieme(resultat, paris); + Map> resultats2 = traiterDeadHeatQuatrePremiersUnCinquieme(resultat, paris); parisOrdreExact = resultats2.get("ordreExact"); parisOrdreInexact = resultats2.get("ordreInexact"); break; case "TROIS_PREMIERS_DEUX_QUATRIEMES": - Map> resultats3 = traiterDeadHeatTroisPremiersDeuxQuatriemes(resultat, paris); + Map> resultats3 = traiterDeadHeatTroisPremiersDeuxQuatriemes(resultat, paris); parisOrdreExact = resultats3.get("ordreExact"); parisOrdreInexact = resultats3.get("ordreInexact"); break; @@ -284,7 +284,7 @@ public class ServiceGains { return resultatsDeadHeat; } - private String determinerTypeDeadHeat(Resultat resultat) { + private String determinerTypeDeadHeat(ResultatQuintePlus resultat) { // Implémentation de la logique pour déterminer le type de dead-heat // Basé sur les positions avec dead-heat @@ -312,16 +312,16 @@ public class ServiceGains { } // 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<>(); + private Map> traiterDeadHeatCinqPremiers(ResultatQuintePlus 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) { + for (PariQuintePlus pari : paris) { if (chevauxPremiers.containsAll(pari.getChevauxSelectionnes())) { if (estOrdreExact(pari, resultat)) { ordreExact.add(pari); @@ -336,16 +336,16 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatQuatrePremiersUnCinquieme(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); - List ordreExact = new ArrayList<>(); - List ordreInexact = new ArrayList<>(); + private Map> traiterDeadHeatQuatrePremiersUnCinquieme(ResultatQuintePlus 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) { + for (PariQuintePlus 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))) { @@ -363,16 +363,16 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatTroisPremiersDeuxQuatriemes(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); - List ordreExact = new ArrayList<>(); - List ordreInexact = new ArrayList<>(); + private Map> traiterDeadHeatTroisPremiersDeuxQuatriemes(ResultatQuintePlus 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) { + for (PariQuintePlus 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))) { @@ -389,8 +389,8 @@ public class ServiceGains { resultats.put("ordreInexact", ordreInexact); return resultats; } - private Map> traiterDeadHeatTroisPremiersUnQuatriemeUnCinquieme(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatTroisPremiersUnQuatriemeUnCinquieme(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -400,7 +400,7 @@ public class ServiceGains { List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient 3 premiers, 1 quatrième et 1 cinquième @@ -419,8 +419,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatDeuxPremiersTroisTroisiemes(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxPremiersTroisTroisiemes(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -429,7 +429,7 @@ public class ServiceGains { List chevauxPremiers = obtenirChevauxParPosition(resultat, 1); List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient 2 premiers et 3 troisièmes @@ -447,8 +447,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatDeuxPremiersDeuxTroisiemesUnCinquieme(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxPremiersDeuxTroisiemesUnCinquieme(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -458,7 +458,7 @@ public class ServiceGains { List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient 2 premiers, 2 troisièmes et 1 cinquième @@ -477,8 +477,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatDeuxPremiersUnTroisiemeDeuxQuatriemes(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxPremiersUnTroisiemeDeuxQuatriemes(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -488,7 +488,7 @@ public class ServiceGains { List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient 2 premiers, 1 troisième et 2 quatrièmes @@ -508,8 +508,8 @@ public class ServiceGains { } - private Map> traiterDeadHeatDeuxPremiersUnTroisiemeUnQuatriemeUnCinquieme(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxPremiersUnTroisiemeUnQuatriemeUnCinquieme(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -520,7 +520,7 @@ public class ServiceGains { List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient 2 premiers, 1 troisième, 1 quatrième et 1 cinquième @@ -540,8 +540,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatQuatreDeuxiemes(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatQuatreDeuxiemes(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -553,7 +553,7 @@ public class ServiceGains { // Toutes les combinaisons de 4 chevaux parmi les deuxièmes List> combinaisons = genererCombinaisons(chevauxDeuxiemes, 4); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { for (List combinaison : combinaisons) { List combinaisonComplete = new ArrayList<>(); combinaisonComplete.add(chevauxPremier.get(0)); // Le cheval premier @@ -573,8 +573,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatTroisDeuxiemesUnCinquieme(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatTroisDeuxiemesUnCinquieme(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -584,7 +584,7 @@ public class ServiceGains { List chevauxDeuxiemes = obtenirChevauxParPosition(resultat, 2); List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient le premier, 3 deuxièmes et 1 cinquième @@ -603,8 +603,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatDeuxDeuxiemesDeuxQuatriemes(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxDeuxiemesDeuxQuatriemes(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -614,7 +614,7 @@ public class ServiceGains { List chevauxDeuxiemes = obtenirChevauxParPosition(resultat, 2); List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient le premier, 2 deuxièmes et 2 quatrièmes @@ -633,8 +633,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatDeuxDeuxiemesUnQuatriemeUnCinquieme(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxDeuxiemesUnQuatriemeUnCinquieme(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -645,7 +645,7 @@ public class ServiceGains { List chevauxQuatriemes = obtenirChevauxParPosition(resultat, 4); List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient le premier, 2 deuxièmes, 1 quatrième et 1 cinquième @@ -665,8 +665,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatTroisTroisiemes(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatTroisTroisiemes(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -679,7 +679,7 @@ public class ServiceGains { // Toutes les combinaisons de 3 chevaux parmi les troisièmes List> combinaisons = genererCombinaisons(chevauxTroisiemes, 3); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { for (List combinaison : combinaisons) { List combinaisonComplete = new ArrayList<>(); combinaisonComplete.add(chevauxPremier.get(0)); // Le cheval premier @@ -700,8 +700,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatDeuxTroisiemesUnCinquieme(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxTroisiemesUnCinquieme(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -712,7 +712,7 @@ public class ServiceGains { List chevauxTroisiemes = obtenirChevauxParPosition(resultat, 3); List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient le premier, le deuxième, 2 troisièmes et 1 cinquième @@ -732,8 +732,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatDeuxQuatriemes(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxQuatriemes(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -747,7 +747,7 @@ public class ServiceGains { // Toutes les combinaisons de 2 chevaux parmi les quatrièmes List> combinaisons = genererCombinaisons(chevauxQuatriemes, 2); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { for (List combinaison : combinaisons) { List combinaisonComplete = new ArrayList<>(); combinaisonComplete.add(chevauxPremier.get(0)); // Le cheval premier @@ -769,8 +769,8 @@ public class ServiceGains { return resultats; } - private Map> traiterDeadHeatDeuxCinquiemes(Resultat resultat, List paris) { - Map> resultats = new HashMap<>(); + private Map> traiterDeadHeatDeuxCinquiemes(ResultatQuintePlus resultat, List paris) { + Map> resultats = new HashMap<>(); resultats.put("ordreExact", new ArrayList<>()); resultats.put("ordreInexact", new ArrayList<>()); resultats.put("bonus4", new ArrayList<>()); @@ -782,7 +782,7 @@ public class ServiceGains { List chevauxQuatrieme = obtenirChevauxParPosition(resultat, 4); List chevauxCinquiemes = obtenirChevauxParPosition(resultat, 5); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { List chevauxPari = pari.getChevauxSelectionnes(); // Vérifier si le pari contient les 4 premiers et 1 cinquième @@ -803,7 +803,7 @@ public class ServiceGains { return resultats; } - private List obtenirChevauxParPosition(Resultat resultat, int position) { + private List obtenirChevauxParPosition(ResultatQuintePlus 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 @@ -834,7 +834,7 @@ public class ServiceGains { } } - private void calculerDividendesDeadHeat(Gains gains, List parisOrdreExact, List parisOrdreInexact, List parisBonus4) { + private void calculerDividendesDeadHeat(GainsQuintePlus 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 @@ -855,11 +855,11 @@ public class ServiceGains { } } - private void calculerDividendesNormaux(Gains gains, List parisOrdreExact, List parisOrdreInexact, List parisBonus4) { + private void calculerDividendesNormaux(GainsQuintePlus 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(); + double totalMisesOrdreExact = parisOrdreExact.stream().mapToDouble(PariQuintePlus::getMise).sum(); + double totalMisesOrdreInexact = parisOrdreInexact.stream().mapToDouble(PariQuintePlus::getMise).sum(); + double totalMisesBonus4 = parisBonus4.stream().mapToDouble(PariQuintePlus::getMise).sum(); if (totalMisesOrdreExact > 0) { gains.setDividendeOrdreExact(gains.getMasseOrdreExact() / totalMisesOrdreExact); @@ -873,7 +873,7 @@ public class ServiceGains { gains.setDividendeBonus4(gains.getMasseBonus4() / totalMisesBonus4); } } - private void appliquerReglesProportionMinimum(Gains gains, List paris, Resultat resultat) { + private void appliquerReglesProportionMinimum(GainsQuintePlus gains, List paris, ResultatQuintePlus 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 @@ -961,29 +961,29 @@ public class ServiceGains { - private void gererCagnotte(Gains gains, List paris, Resultat resultat) { + private void gererCagnotte(GainsQuintePlus gains, List paris, ResultatQuintePlus 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) { + public void appliquerCagnottesAvantCalcul(CourseQuintePlus course) { serviceCagnotte.appliquerCagnottesReportees(course); } - public Gains obtenirGainsParCourse(Long courseId) { + public GainsQuintePlus obtenirGainsParCourse(Long courseId) { return repositoryGains.findByCourseId(courseId); } - public List obtenirTousGains() { + public List obtenirTousGains() { return repositoryGains.findAll(); } // Méthode pour calculer les gains d'un pari spécifique - public double calculerGainsParieur(Pari pari, Gains gains) { + public double calculerGainsParieur(PariQuintePlus pari, GainsQuintePlus gains) { double gainsParieur = 0.0; if (pari.isEstPaye()) { // Vérifier le type de gain - Resultat resultat = repositoryResultat.findByCourseId(pari.getCourse().getId()); + ResultatQuintePlus resultat = repositoryResultat.findByCourseId(pari.getCourse().getId()); if (estOrdreExact(pari, resultat)) { gainsParieur = pari.getMise() * gains.getDividendeOrdreExact(); @@ -1003,14 +1003,14 @@ public class ServiceGains { public Map genererRapportGains(Long courseId) { Map rapport = new HashMap<>(); - Gains gains = obtenirGainsParCourse(courseId); + GainsQuintePlus 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); + CourseQuintePlus course = gains.getCourse(); + List tousParis = repositoryPari.findByCourseId(courseId); rapport.put("course", course.getNom()); rapport.put("date", course.getDate()); @@ -1023,10 +1023,10 @@ public class ServiceGains { 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); + ResultatQuintePlus 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()); diff --git a/src/main/java/com/pmumali/ch11_quinteplus/service/ServicePari.java b/src/main/java/com/pmumali/ch11_quinteplus/service/ServicePariQuintePlus.java similarity index 84% rename from src/main/java/com/pmumali/ch11_quinteplus/service/ServicePari.java rename to src/main/java/com/pmumali/ch11_quinteplus/service/ServicePariQuintePlus.java index 58cb54f..331a96b 100644 --- a/src/main/java/com/pmumali/ch11_quinteplus/service/ServicePari.java +++ b/src/main/java/com/pmumali/ch11_quinteplus/service/ServicePariQuintePlus.java @@ -1,40 +1,39 @@ 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 com.pmumali.ch11_quinteplus.model.ChevalQuintePlus; +import com.pmumali.ch11_quinteplus.model.PariQuintePlus; +import com.pmumali.ch11_quinteplus.model.ResultatQuintePlus; +import com.pmumali.ch11_quinteplus.repository.ChevalQuintePlusRepository; +import com.pmumali.ch11_quinteplus.repository.CourseQuintePlusRepository; +import com.pmumali.ch11_quinteplus.repository.GainsQuintePlusRepository; +import com.pmumali.ch11_quinteplus.repository.PariQuintePlusRepository; 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 { +public class ServicePariQuintePlus { @Autowired - private PariRepository repositoryPari; + private PariQuintePlusRepository repositoryPari; @Autowired - private CourseRepository repositoryCourse; + private CourseQuintePlusRepository repositoryCourse; @Autowired - private ChevalRepository repositoryCheval; + private ChevalQuintePlusRepository repositoryCheval; @Autowired - private GainsRepository repositoryGains; + private GainsQuintePlusRepository 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) { + public PariQuintePlus placerPari(PariQuintePlus pari) { // Vérification de la limite d'enjeu (Article 2) if (pari.getMise() > MISE_MAXIMALE) { pari.setMise(MISE_MAXIMALE); @@ -49,7 +48,7 @@ public class ServicePari { return repositoryPari.save(pari); } - private boolean estPariValide(Pari pari) { + private boolean estPariValide(PariQuintePlus pari) { // Vérifier que le pari a exactement 5 chevaux sélectionnés if (pari.getChevauxSelectionnes() == null || pari.getChevauxSelectionnes().size() != 5) { return false; @@ -61,7 +60,7 @@ public class ServicePari { } // Vérifier que tous les chevaux sélectionnés existent - List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); + List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); if (chevaux.size() != 5) { return false; } @@ -74,20 +73,20 @@ public class ServicePari { return true; } - public List obtenirParisParCourse(Long courseId) { + public List obtenirParisParCourse(Long courseId) { return repositoryPari.findByCourseId(courseId); } - public List obtenirParisParParieur(String nomParieur) { + public List obtenirParisParParieur(String nomParieur) { return repositoryPari.findByNomParieur(nomParieur); } - public Pari obtenirPariParId(Long id) { + public PariQuintePlus obtenirPariParId(Long id) { return repositoryPari.findById(id).orElse(null); } - public Pari mettreAJourPari(Long id, Pari detailsPari) { - Pari pari = repositoryPari.findById(id).orElse(null); + public PariQuintePlus mettreAJourPari(Long id, PariQuintePlus detailsPari) { + PariQuintePlus pari = repositoryPari.findById(id).orElse(null); if (pari != null) { pari.setNomParieur(detailsPari.getNomParieur()); pari.setMise(detailsPari.getMise()); @@ -108,7 +107,7 @@ public class ServicePari { } // Méthodes pour gérer les dead-heats (Article 3) - public Map gererDeadHeat(Resultat resultat, List paris) { + public Map gererDeadHeat(ResultatQuintePlus resultat, List paris) { Map resultatsDeadHeat = new HashMap<>(); if (!resultat.isADeadHeat()) { @@ -176,7 +175,7 @@ public class ServicePari { return resultatsDeadHeat; } - private String determinerTypeDeadHeat(Resultat resultat) { + private String determinerTypeDeadHeat(ResultatQuintePlus resultat) { // Implémentation de la logique pour déterminer le type de dead-heat // Basé sur les positions avec dead-heat @@ -200,7 +199,7 @@ public class ServicePari { } // Implémentations des différents cas de dead-heat (Article 3) - private List> traiterDeadHeatCinqPremiers(Resultat resultat, List paris) { + private List> traiterDeadHeatCinqPremiers(ResultatQuintePlus resultat, List paris) { List> combinaisonsPayables = new ArrayList<>(); // Article 3a: Dead-heat de cinq chevaux ou plus classés à la première place @@ -223,7 +222,7 @@ public class ServicePari { return combinaisonsPayables; } - private List> traiterDeadHeatQuatrePremiersUnCinquieme(Resultat resultat, List paris) { + private List> traiterDeadHeatQuatrePremiersUnCinquieme(ResultatQuintePlus 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 @@ -247,7 +246,7 @@ public class ServicePari { return combinaisonsPayables; } - private List> traiterDeadHeatTroisPremiersDeuxQuatriemes(Resultat resultat, List paris) { + private List> traiterDeadHeatTroisPremiersDeuxQuatriemes(ResultatQuintePlus 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 @@ -274,73 +273,73 @@ public class ServicePari { } // Méthodes pour les autres cas de dead-heat (à implémenter selon l'article 3) - private List> traiterDeadHeatTroisPremiersUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + private List> traiterDeadHeatTroisPremiersUnQuatriemeUnCinquieme(ResultatQuintePlus resultat, List paris) { // Article 3d: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxPremiersTroisTroisiemes(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxPremiersTroisTroisiemes(ResultatQuintePlus resultat, List paris) { // Article 3e: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxPremiersDeuxTroisiemesUnCinquieme(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxPremiersDeuxTroisiemesUnCinquieme(ResultatQuintePlus resultat, List paris) { // Article 3f: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxPremiersUnTroisiemeDeuxQuatriemes(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxPremiersUnTroisiemeDeuxQuatriemes(ResultatQuintePlus resultat, List paris) { // Article 3g: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxPremiersUnTroisiemeUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxPremiersUnTroisiemeUnQuatriemeUnCinquieme(ResultatQuintePlus resultat, List paris) { // Article 3h: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatQuatreDeuxiemes(Resultat resultat, List paris) { + private List> traiterDeadHeatQuatreDeuxiemes(ResultatQuintePlus resultat, List paris) { // Article 3i: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatTroisDeuxiemesUnCinquieme(Resultat resultat, List paris) { + private List> traiterDeadHeatTroisDeuxiemesUnCinquieme(ResultatQuintePlus resultat, List paris) { // Article 3j: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxDeuxiemesDeuxQuatriemes(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxDeuxiemesDeuxQuatriemes(ResultatQuintePlus resultat, List paris) { // Article 3k: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxDeuxiemesUnQuatriemeUnCinquieme(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxDeuxiemesUnQuatriemeUnCinquieme(ResultatQuintePlus resultat, List paris) { // Article 3l: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatTroisTroisiemes(Resultat resultat, List paris) { + private List> traiterDeadHeatTroisTroisiemes(ResultatQuintePlus resultat, List paris) { // Article 3m: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxTroisiemesUnCinquieme(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxTroisiemesUnCinquieme(ResultatQuintePlus resultat, List paris) { // Article 3n: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxQuatriemes(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxQuatriemes(ResultatQuintePlus resultat, List paris) { // Article 3o: Implémentation à compléter return new ArrayList<>(); } - private List> traiterDeadHeatDeuxCinquiemes(Resultat resultat, List paris) { + private List> traiterDeadHeatDeuxCinquiemes(ResultatQuintePlus 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) { + private List obtenirChevauxParPosition(ResultatQuintePlus 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 @@ -508,12 +507,12 @@ public class ServicePari { } // Méthodes pour gérer les non-partants (Article 4) - public Map traiterNonPartants(List paris, Resultat resultat) { + public Map traiterNonPartants(List paris, ResultatQuintePlus resultat) { Map resultats = new HashMap<>(); - List parisARembourser = new ArrayList<>(); - List parisBonus4 = new ArrayList<>(); + List parisARembourser = new ArrayList<>(); + List parisBonus4 = new ArrayList<>(); - for (Pari pari : paris) { + for (PariQuintePlus pari : paris) { int nombreNonPartants = compterNonPartants(pari); if (nombreNonPartants >= 2) { @@ -536,18 +535,18 @@ public class ServicePari { return resultats; } - private int compterNonPartants(Pari pari) { + private int compterNonPartants(PariQuintePlus pari) { int compte = 0; - List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); - for (Cheval cheval : chevaux) { - if (cheval.isEstNonPartant()) { + List chevaux = repositoryCheval.findAllById(pari.getChevauxSelectionnes()); + for (ChevalQuintePlus cheval : chevaux) { + if (cheval.isNonPartant()) { compte++; } } return compte; } - private boolean sontQuatrePremiers(Pari pari, Resultat resultat) { + private boolean sontQuatrePremiers(PariQuintePlus pari, ResultatQuintePlus 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(); @@ -559,22 +558,22 @@ public class ServicePari { return compte >= 4; } - private double calculerMontantRemboursements(List paris) { + private double calculerMontantRemboursements(List paris) { return paris.stream() - .mapToDouble(Pari::getMise) + .mapToDouble(PariQuintePlus::getMise) .sum(); } // Méthode pour déterminer les gagnants d'une course - public Map determinerGagnants(Long courseId, Resultat resultat) { + public Map determinerGagnants(Long courseId, ResultatQuintePlus resultat) { Map resultats = new HashMap<>(); - List tousParis = repositoryPari.findByCourseId(courseId); + List tousParis = repositoryPari.findByCourseId(courseId); - List gagnantsOrdreExact = new ArrayList<>(); - List gagnantsOrdreInexact = new ArrayList<>(); - List gagnantsBonus4 = new ArrayList<>(); + List gagnantsOrdreExact = new ArrayList<>(); + List gagnantsOrdreInexact = new ArrayList<>(); + List gagnantsBonus4 = new ArrayList<>(); - for (Pari pari : tousParis) { + for (PariQuintePlus pari : tousParis) { if (estGagnantOrdreExact(pari, resultat)) { gagnantsOrdreExact.add(pari); } else if (estGagnantOrdreInexact(pari, resultat)) { @@ -591,12 +590,12 @@ public class ServicePari { return resultats; } - private boolean estGagnantOrdreExact(Pari pari, Resultat resultat) { + private boolean estGagnantOrdreExact(PariQuintePlus pari, ResultatQuintePlus 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) { + private boolean estGagnantOrdreInexact(PariQuintePlus pari, ResultatQuintePlus 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(); @@ -605,7 +604,7 @@ public class ServicePari { !pari.getOrdrePredit().equals(resultat.getIdsChevauxOrdreArrivee()); } - private boolean estGagnantBonus4(Pari pari, Resultat resultat) { + private boolean estGagnantBonus4(PariQuintePlus pari, ResultatQuintePlus 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(); diff --git a/src/main/java/com/pmumali/ch1_simple/controller/ChevalController.java b/src/main/java/com/pmumali/ch1_simple/controller/ChevalController.java deleted file mode 100644 index f7af9bd..0000000 --- a/src/main/java/com/pmumali/ch1_simple/controller/ChevalController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.pmumali.ch1_simple.controller; - -import com.pmumali.ch1_simple.model.Cheval; -import com.pmumali.ch1_simple.service.ChevalService; -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/chevaux") -public class ChevalController { - - @Autowired - private ChevalService chevalService; - - @PostMapping - public ResponseEntity ajouterCheval(@RequestBody Cheval cheval) { - return ResponseEntity.ok(chevalService.ajouterCheval(cheval)); - } - - @GetMapping("/course/{courseId}") - public ResponseEntity> obtenirChevauxParCourse(@PathVariable Long courseId) { - return ResponseEntity.ok(chevalService.obtenirChevauxParCourse(courseId)); - } - - @GetMapping("/ecurie/{nomEcurie}") - public ResponseEntity> obtenirChevauxParEcurie(@PathVariable String nomEcurie) { - return ResponseEntity.ok(chevalService.obtenirChevauxParEcurie(nomEcurie)); - } -} - diff --git a/src/main/java/com/pmumali/ch1_simple/controller/ChevalSimpleController.java b/src/main/java/com/pmumali/ch1_simple/controller/ChevalSimpleController.java new file mode 100644 index 0000000..a846a50 --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/controller/ChevalSimpleController.java @@ -0,0 +1,34 @@ +package com.pmumali.ch1_simple.controller; + +import com.pmumali.ch1_simple.model.ChevalSimple; +import com.pmumali.ch1_simple.service.ChevalSimpleService; +import com.pmumali.common.model.Cheval; +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/simple/cheval") +public class ChevalSimpleController { + + @Autowired + private ChevalSimpleService chevalService; + + // @PostMapping + public ResponseEntity ajouterCheval(@RequestBody ChevalSimple cheval) { + return ResponseEntity.ok(chevalService.ajouterCheval(cheval)); + } + + // @GetMapping("/course/{courseId}") + public ResponseEntity> obtenirChevauxParCourse(@PathVariable Long courseId) { + return ResponseEntity.ok(chevalService.obtenirChevauxParCourse(courseId)); + } + + // @GetMapping("/ecurie/{nomEcurie}") + public ResponseEntity> obtenirChevauxParEcurie(@PathVariable String nomEcurie) { + return ResponseEntity.ok(chevalService.obtenirChevauxParEcurie(nomEcurie)); + } +} + diff --git a/src/main/java/com/pmumali/ch1_simple/controller/CourseController.java b/src/main/java/com/pmumali/ch1_simple/controller/CourseController.java deleted file mode 100644 index df255e2..0000000 --- a/src/main/java/com/pmumali/ch1_simple/controller/CourseController.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pmumali.ch1_simple.controller; - -import com.pmumali.ch1_simple.model.Course; -import com.pmumali.ch1_simple.service.CourseService; -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 CourseController { - - @Autowired - private CourseService courseService; - - @PostMapping - public ResponseEntity creerCourse(@RequestBody Course course) { - return ResponseEntity.ok(courseService.creerCourse(course)); - } - - @GetMapping - public ResponseEntity> obtenirToutesCourses() { - return ResponseEntity.ok(courseService.obtenirToutesCourses()); - } - - @GetMapping("/{id}") - public ResponseEntity obtenirCourseParId(@PathVariable Long id) { - Course course = courseService.obtenirCourseParId(id); - return course != null ? ResponseEntity.ok(course) : ResponseEntity.notFound().build(); - } - - @GetMapping("/terminees") - public ResponseEntity> obtenirCoursesTerminees() { - return ResponseEntity.ok(courseService.obtenirCoursesTerminees()); - } - - @GetMapping("/avenir") - public ResponseEntity> obtenirCoursesAVenir() { - return ResponseEntity.ok(courseService.obtenirCoursesAVenir()); - } -} - diff --git a/src/main/java/com/pmumali/ch1_simple/controller/CourseSimpleController.java b/src/main/java/com/pmumali/ch1_simple/controller/CourseSimpleController.java new file mode 100644 index 0000000..18c8611 --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/controller/CourseSimpleController.java @@ -0,0 +1,44 @@ +package com.pmumali.ch1_simple.controller; + +import com.pmumali.ch1_simple.model.CourseSimple; + +import com.pmumali.ch1_simple.service.CourseSimpleService; +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/simple/courses") +public class CourseSimpleController { + + @Autowired + private CourseSimpleService courseService; + + // @PostMapping + public ResponseEntity creerCourse(@RequestBody CourseSimple course) { + return ResponseEntity.ok(courseService.creerCourse(course)); + } + + // @GetMapping + public ResponseEntity> obtenirToutesCourses() { + return ResponseEntity.ok(courseService.obtenirToutesCourses()); + } + + // @GetMapping("/{id}") + public ResponseEntity obtenirCourseParId(@PathVariable Long id) { + CourseSimple course = courseService.obtenirCourseParId(id); + return course != null ? ResponseEntity.ok(course) : ResponseEntity.notFound().build(); + } + + // @GetMapping("/terminees") + public ResponseEntity> obtenirCoursesTerminees() { + return ResponseEntity.ok(courseService.obtenirCoursesTerminees()); + } + + // @GetMapping("/avenir") + public ResponseEntity> obtenirCoursesAVenir() { + return ResponseEntity.ok(courseService.obtenirCoursesAVenir()); + } +} + diff --git a/src/main/java/com/pmumali/ch1_simple/controller/GainsController.java b/src/main/java/com/pmumali/ch1_simple/controller/GainsController.java deleted file mode 100644 index f6d81f3..0000000 --- a/src/main/java/com/pmumali/ch1_simple/controller/GainsController.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pmumali.ch1_simple.controller; - -import com.pmumali.ch1_simple.model.Gains; -import com.pmumali.ch1_simple.model.ResultatCourse; -import com.pmumali.ch1_simple.service.GainsService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/gains") -public class GainsController { - - @Autowired - private GainsService gainsService; - - @PostMapping("/calculer/{courseId}") - public ResponseEntity calculerGains(@PathVariable Long courseId, @RequestBody ResultatCourse resultat) { - return ResponseEntity.ok(gainsService.calculerGains(courseId, resultat)); - } - - @GetMapping("/course/{courseId}") - public ResponseEntity obtenirGainsParCourse(@PathVariable Long courseId) { - Gains gains = gainsService.obtenirGainsParCourse(courseId); - return gains != null ? ResponseEntity.ok(gains) : ResponseEntity.notFound().build(); - } -} - diff --git a/src/main/java/com/pmumali/ch1_simple/controller/GainsSimpleController.java b/src/main/java/com/pmumali/ch1_simple/controller/GainsSimpleController.java new file mode 100644 index 0000000..415f41e --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/controller/GainsSimpleController.java @@ -0,0 +1,28 @@ +package com.pmumali.ch1_simple.controller; + +import com.pmumali.ch1_simple.model.GainsSimple; +import com.pmumali.ch1_simple.model.ResultatCourseSimple; +import com.pmumali.ch1_simple.service.GainsSimpleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/simple/gains") +public class GainsSimpleController { + + @Autowired + private GainsSimpleService gainsService; + + // @PostMapping("/calculer/{courseId}") + public ResponseEntity calculerGains(@PathVariable Long courseId, @RequestBody ResultatCourseSimple resultat) { + return ResponseEntity.ok(gainsService.calculerGains(courseId, resultat)); + } + + // @GetMapping("/course/{courseId}") + public ResponseEntity obtenirGainsParCourse(@PathVariable Long courseId) { + GainsSimple gains = gainsService.obtenirGainsParCourse(courseId); + return gains != null ? ResponseEntity.ok(gains) : ResponseEntity.notFound().build(); + } +} + diff --git a/src/main/java/com/pmumali/ch1_simple/controller/PariController.java b/src/main/java/com/pmumali/ch1_simple/controller/PariSimpleController.java similarity index 83% rename from src/main/java/com/pmumali/ch1_simple/controller/PariController.java rename to src/main/java/com/pmumali/ch1_simple/controller/PariSimpleController.java index 00ffed0..09e00cb 100644 --- a/src/main/java/com/pmumali/ch1_simple/controller/PariController.java +++ b/src/main/java/com/pmumali/ch1_simple/controller/PariSimpleController.java @@ -9,29 +9,29 @@ import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api/paris") -public class PariController { +@RequestMapping("/api/simple") +public class PariSimpleController { @Autowired private PariSimpleService pariService; - @PostMapping + @PostMapping("/pari") public ResponseEntity placerPari(@RequestBody PariSimple pari) { return ResponseEntity.ok(pariService.placerPari(pari)); } - @GetMapping("/course/{courseId}") + // @GetMapping("/course/{courseId}") public ResponseEntity> obtenirParisParCourse(@PathVariable Long courseId) { return ResponseEntity.ok(pariService.obtenirParisParCourse(courseId)); } - @GetMapping("/course/{courseId}/type/{typePari}") + // @GetMapping("/course/{courseId}/type/{typePari}") public ResponseEntity> obtenirParisParCourseEtType( @PathVariable Long courseId, @PathVariable String typePari) { return ResponseEntity.ok(pariService.obtenirParisParCourseEtType(courseId, typePari)); } - @GetMapping("/cheval/{chevalId}") + // @GetMapping("/cheval/{chevalId}") public ResponseEntity> obtenirParisParCheval(@PathVariable Long chevalId) { return ResponseEntity.ok(pariService.obtenirParisParCheval(chevalId)); } diff --git a/src/main/java/com/pmumali/ch1_simple/model/Cheval.java b/src/main/java/com/pmumali/ch1_simple/model/ChevalSimple.java similarity index 55% rename from src/main/java/com/pmumali/ch1_simple/model/Cheval.java rename to src/main/java/com/pmumali/ch1_simple/model/ChevalSimple.java index 3d30d62..7eb575d 100644 --- a/src/main/java/com/pmumali/ch1_simple/model/Cheval.java +++ b/src/main/java/com/pmumali/ch1_simple/model/ChevalSimple.java @@ -1,25 +1,34 @@ package com.pmumali.ch1_simple.model; +import com.pmumali.common.model.Cheval; +import com.pmumali.common.model.Course; +import com.pmumali.common.util.CollectionTransformer; import jakarta.persistence.*; import lombok.*; +import java.util.List; + + @Entity @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "cheval") -public class Cheval { +public class ChevalSimple extends Cheval { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; private int numero; - private boolean estNonPartant; + @Column(name = "non_partant") + private boolean nonPartant; private String nomEcurie; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseSimple course; + + } diff --git a/src/main/java/com/pmumali/ch1_simple/model/Course.java b/src/main/java/com/pmumali/ch1_simple/model/CourseSimple.java similarity index 70% rename from src/main/java/com/pmumali/ch1_simple/model/Course.java rename to src/main/java/com/pmumali/ch1_simple/model/CourseSimple.java index fea0ba7..3a6339b 100644 --- a/src/main/java/com/pmumali/ch1_simple/model/Course.java +++ b/src/main/java/com/pmumali/ch1_simple/model/CourseSimple.java @@ -1,5 +1,6 @@ package com.pmumali.ch1_simple.model; +import com.pmumali.common.model.Course; import jakarta.persistence.*; import lombok.Data; import lombok.NoArgsConstructor; @@ -13,20 +14,18 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Table(name = "course") -public class Course { +public class CourseSimple extends Course { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String nom; - private LocalDateTime date; + @Column(name = "heure_course") + private LocalDateTime heureCourse; private String lieu; private int nombreChevauxInscrits; private boolean estTerminee; - - @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List chevaux; + private boolean estAnnulee; @OneToOne(mappedBy = "course", cascade = CascadeType.ALL) - private ResultatCourse resultat; + private ResultatCourseSimple resultat; } diff --git a/src/main/java/com/pmumali/ch1_simple/model/Gains.java b/src/main/java/com/pmumali/ch1_simple/model/GainsSimple.java similarity index 90% rename from src/main/java/com/pmumali/ch1_simple/model/Gains.java rename to src/main/java/com/pmumali/ch1_simple/model/GainsSimple.java index 4895c70..05d6d40 100644 --- a/src/main/java/com/pmumali/ch1_simple/model/Gains.java +++ b/src/main/java/com/pmumali/ch1_simple/model/GainsSimple.java @@ -10,14 +10,14 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor @Table(name = "gains") -public class Gains { +public class GainsSimple { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseSimple course; private double masseGagnant; private double massePlace; diff --git a/src/main/java/com/pmumali/ch1_simple/model/PariSimple.java b/src/main/java/com/pmumali/ch1_simple/model/PariSimple.java index 711de4a..f746eb5 100644 --- a/src/main/java/com/pmumali/ch1_simple/model/PariSimple.java +++ b/src/main/java/com/pmumali/ch1_simple/model/PariSimple.java @@ -1,31 +1,35 @@ package com.pmumali.ch1_simple.model; +import com.pmumali.ch2_jumelegagnant.model.CourseJumeleGagnant; +import com.pmumali.common.model.Pari; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; + @Entity @Data @NoArgsConstructor @AllArgsConstructor -@Table(name = "pari_simple") -public class PariSimple { +@Table(name = "pari") +public class PariSimple extends Pari { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - + @Column(name = "type_pari") private String typePari; // GAGNANT ou PLACE private double mise = 500.0; private LocalDateTime datePari; + private boolean estPaye; + private boolean estRembourse; + @ManyToOne @JoinColumn(name = "cheval_id") - private Cheval cheval; + private ChevalSimple cheval; @ManyToOne @JoinColumn(name = "course_id") - private Course course; - - private boolean estPaye; + private CourseSimple course; } diff --git a/src/main/java/com/pmumali/ch1_simple/model/ResultatCourse.java b/src/main/java/com/pmumali/ch1_simple/model/ResultatCourse.java deleted file mode 100644 index 8b8a7b6..0000000 --- a/src/main/java/com/pmumali/ch1_simple/model/ResultatCourse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pmumali.ch1_simple.model; - -import jakarta.persistence.*; -import lombok.*; - -import java.util.List; - -@Entity -@Data -@NoArgsConstructor -@AllArgsConstructor -@Table(name = "resultat_course") -public class ResultatCourse { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @OneToOne - @JoinColumn(name = "course_id") - private Course course; - - @ElementCollection - private List chevauxPremiers; // Pour gérer les dead-heats - - @ElementCollection - private List chevauxDeuxiemes; // Pour gérer les dead-heats - - @ElementCollection - private List chevauxTroisiemes; // Pour gérer les dead-heats - - private boolean aDeadHeat; -} diff --git a/src/main/java/com/pmumali/ch1_simple/model/ResultatCourseSimple.java b/src/main/java/com/pmumali/ch1_simple/model/ResultatCourseSimple.java new file mode 100644 index 0000000..ab7c612 --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/model/ResultatCourseSimple.java @@ -0,0 +1,24 @@ +package com.pmumali.ch1_simple.model; + +import com.pmumali.ch2_jumelegagnant.model.CourseJumeleGagnant; +import com.pmumali.common.model.Resultat; +import jakarta.persistence.*; +import lombok.*; + +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "resultat_course") +public class ResultatCourseSimple extends Resultat { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToOne + @JoinColumn(name = "course_id") + private CourseSimple course; + +} diff --git a/src/main/java/com/pmumali/ch1_simple/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch1_simple/repository/ChevalRepository.java deleted file mode 100644 index 58eb6c0..0000000 --- a/src/main/java/com/pmumali/ch1_simple/repository/ChevalRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pmumali.ch1_simple.repository; - -import com.pmumali.ch1_simple.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); - List findByNomEcurie(String nomEcurie); -} diff --git a/src/main/java/com/pmumali/ch1_simple/repository/ChevalSimpleRepository.java b/src/main/java/com/pmumali/ch1_simple/repository/ChevalSimpleRepository.java new file mode 100644 index 0000000..695ea3e --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/repository/ChevalSimpleRepository.java @@ -0,0 +1,14 @@ +package com.pmumali.ch1_simple.repository; + +import com.pmumali.ch1_simple.model.ChevalSimple; +import com.pmumali.common.model.Cheval; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ChevalSimpleRepository extends JpaRepository { + List findByCourseId(Long courseId); + List findByNomEcurie(String nomEcurie); +} diff --git a/src/main/java/com/pmumali/ch1_simple/repository/CourseRepository.java b/src/main/java/com/pmumali/ch1_simple/repository/CourseRepository.java deleted file mode 100644 index d7dac4d..0000000 --- a/src/main/java/com/pmumali/ch1_simple/repository/CourseRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pmumali.ch1_simple.repository; - -import com.pmumali.ch1_simple.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/ch1_simple/repository/CourseSimpleRepository.java b/src/main/java/com/pmumali/ch1_simple/repository/CourseSimpleRepository.java new file mode 100644 index 0000000..842fed0 --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/repository/CourseSimpleRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch1_simple.repository; + +import com.pmumali.ch1_simple.model.CourseSimple; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseSimpleRepository extends JpaRepository { + List findByEstTerminee(boolean estTerminee); +} diff --git a/src/main/java/com/pmumali/ch1_simple/repository/GainsRepository.java b/src/main/java/com/pmumali/ch1_simple/repository/GainsRepository.java deleted file mode 100644 index 86e84b0..0000000 --- a/src/main/java/com/pmumali/ch1_simple/repository/GainsRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch1_simple.repository; - -import com.pmumali.ch1_simple.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/ch1_simple/repository/GainsSimpleRepository.java b/src/main/java/com/pmumali/ch1_simple/repository/GainsSimpleRepository.java new file mode 100644 index 0000000..150dd39 --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/repository/GainsSimpleRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch1_simple.repository; + +import com.pmumali.ch1_simple.model.GainsSimple; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface GainsSimpleRepository extends JpaRepository { + GainsSimple findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch1_simple/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch1_simple/repository/ResultatCourseRepository.java deleted file mode 100644 index dedb936..0000000 --- a/src/main/java/com/pmumali/ch1_simple/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch1_simple.repository; - -import com.pmumali.ch1_simple.model.ResultatCourse; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ResultatCourseRepository extends JpaRepository { - ResultatCourse findByCourseId(Long courseId); -} diff --git a/src/main/java/com/pmumali/ch1_simple/repository/ResultatCourseSimpleRepository.java b/src/main/java/com/pmumali/ch1_simple/repository/ResultatCourseSimpleRepository.java new file mode 100644 index 0000000..7867c8b --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/repository/ResultatCourseSimpleRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch1_simple.repository; + +import com.pmumali.ch1_simple.model.ResultatCourseSimple; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ResultatCourseSimpleRepository extends JpaRepository { + ResultatCourseSimple findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch1_simple/service/ChevalService.java b/src/main/java/com/pmumali/ch1_simple/service/ChevalService.java deleted file mode 100644 index e657ebe..0000000 --- a/src/main/java/com/pmumali/ch1_simple/service/ChevalService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pmumali.ch1_simple.service; - -import com.pmumali.ch1_simple.model.Cheval; -import com.pmumali.ch1_simple.repository.ChevalRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class ChevalService { - - @Autowired - private ChevalRepository chevalRepository; - - public Cheval ajouterCheval(Cheval cheval) { - return chevalRepository.save(cheval); - } - - public List obtenirChevauxParCourse(Long courseId) { - return chevalRepository.findByCourseId(courseId); - } - - public List obtenirChevauxParEcurie(String nomEcurie) { - return chevalRepository.findByNomEcurie(nomEcurie); - } -} diff --git a/src/main/java/com/pmumali/ch1_simple/service/ChevalSimpleService.java b/src/main/java/com/pmumali/ch1_simple/service/ChevalSimpleService.java new file mode 100644 index 0000000..91dcc29 --- /dev/null +++ b/src/main/java/com/pmumali/ch1_simple/service/ChevalSimpleService.java @@ -0,0 +1,28 @@ +package com.pmumali.ch1_simple.service; + +import com.pmumali.ch1_simple.model.ChevalSimple; +import com.pmumali.ch1_simple.repository.ChevalSimpleRepository; +import com.pmumali.common.model.Cheval; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ChevalSimpleService { + + @Autowired + private ChevalSimpleRepository chevalRepository; + + public ChevalSimple ajouterCheval(ChevalSimple cheval) { + return chevalRepository.save(cheval); + } + + public List obtenirChevauxParCourse(Long courseId) { + return chevalRepository.findByCourseId(courseId); + } + + public List obtenirChevauxParEcurie(String nomEcurie) { + return chevalRepository.findByNomEcurie(nomEcurie); + } +} diff --git a/src/main/java/com/pmumali/ch1_simple/service/CourseService.java b/src/main/java/com/pmumali/ch1_simple/service/CourseSimpleService.java similarity index 50% rename from src/main/java/com/pmumali/ch1_simple/service/CourseService.java rename to src/main/java/com/pmumali/ch1_simple/service/CourseSimpleService.java index bff7bf6..dac3a60 100644 --- a/src/main/java/com/pmumali/ch1_simple/service/CourseService.java +++ b/src/main/java/com/pmumali/ch1_simple/service/CourseSimpleService.java @@ -1,8 +1,8 @@ package com.pmumali.ch1_simple.service; -import com.pmumali.ch1_simple.model.Course; -import com.pmumali.ch1_simple.repository.CourseRepository; +import com.pmumali.ch1_simple.model.CourseSimple; +import com.pmumali.ch1_simple.repository.CourseSimpleRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -10,28 +10,28 @@ import java.util.*; @Service -public class CourseService { +public class CourseSimpleService { @Autowired - private CourseRepository courseRepository; + private CourseSimpleRepository courseRepository; - public Course creerCourse(Course course) { + public CourseSimple creerCourse(CourseSimple course) { return courseRepository.save(course); } - public List obtenirToutesCourses() { + public List obtenirToutesCourses() { return courseRepository.findAll(); } - public Course obtenirCourseParId(Long id) { + public CourseSimple obtenirCourseParId(Long id) { return courseRepository.findById(id).orElse(null); } - public List obtenirCoursesTerminees() { + public List obtenirCoursesTerminees() { return courseRepository.findByEstTerminee(true); } - public List obtenirCoursesAVenir() { + public List obtenirCoursesAVenir() { return courseRepository.findByEstTerminee(false); } } diff --git a/src/main/java/com/pmumali/ch1_simple/service/GainsService.java b/src/main/java/com/pmumali/ch1_simple/service/GainsSimpleService.java similarity index 90% rename from src/main/java/com/pmumali/ch1_simple/service/GainsService.java rename to src/main/java/com/pmumali/ch1_simple/service/GainsSimpleService.java index f4c84db..d705b53 100644 --- a/src/main/java/com/pmumali/ch1_simple/service/GainsService.java +++ b/src/main/java/com/pmumali/ch1_simple/service/GainsSimpleService.java @@ -14,28 +14,28 @@ import java.util.stream.Collectors; @Service @Transactional -public class GainsService { +public class GainsSimpleService { @Autowired private PariSimpleRepository pariRepository; @Autowired - private GainsRepository gainsRepository; + private GainsSimpleRepository gainsRepository; @Autowired - private CourseRepository courseRepository; + private CourseSimpleRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalSimpleRepository chevalRepository; @Autowired - private ResultatCourseRepository resultatRepository; + private ResultatCourseSimpleRepository resultatRepository; private static final double RAPPORT_MINIMUM = 1.1; private static final double PRELEVEMENTS = 0.15; // 15% de prélèvements - public Gains calculerGains(Long courseId, ResultatCourse resultat) { - Course course = courseRepository.findById(courseId) + public GainsSimple calculerGains(Long courseId, ResultatCourseSimple resultat) { + CourseSimple course = courseRepository.findById(courseId) .orElseThrow(() -> new RuntimeException("Course non trouvée")); List tousParis = pariRepository.findByCourseId(courseId); @@ -64,7 +64,7 @@ public class GainsService { double massePlace = masseAPartager * (parisPlace.stream().mapToDouble(PariSimple::getMise).sum() / totalMises); // Calcul des rapports - Gains gains = new Gains(); + GainsSimple gains = new GainsSimple(); gains.setCourse(course); gains.setMasseGagnant(masseGagnant); gains.setMassePlace(massePlace); @@ -83,7 +83,7 @@ public class GainsService { double remboursements = 0.0; for (PariSimple pari : paris) { - if (pari.getCheval().isEstNonPartant()) { + if (pari.getCheval().isNonPartant()) { remboursements += pari.getMise(); pari.setEstPaye(true); // Marquer comme remboursé } @@ -92,7 +92,7 @@ public class GainsService { return remboursements; } - private void calculerDetailsGains(Gains gains, ResultatCourse resultat, + private void calculerDetailsGains(GainsSimple gains, ResultatCourseSimple resultat, List parisGagnant, List parisPlace) { // Calcul des rapports GAGNANT if (resultat.isADeadHeat()) { @@ -113,7 +113,7 @@ public class GainsService { gains.setRapportPlace(Math.max(gains.getRapportPlace(), RAPPORT_MINIMUM)); } - private void calculerRapportsGagnantNormal(Gains gains, ResultatCourse resultat, List parisGagnant) { + private void calculerRapportsGagnantNormal(GainsSimple gains, ResultatCourseSimple resultat, List parisGagnant) { // Article 5a: Cas d'arrivée normale - Calcul du rapport "gagnant" if (resultat.getChevauxPremiers().isEmpty()) { gains.setRapportGagnant(0.0); @@ -122,7 +122,7 @@ public class GainsService { // Gestion des écuries (Article 2) Long chevalGagnantId = resultat.getChevauxPremiers().get(0); - Cheval chevalGagnant = chevalRepository.findById(chevalGagnantId).orElse(null); + ChevalSimple chevalGagnant = chevalRepository.findById(chevalGagnantId).orElse(null); if (chevalGagnant == null) { gains.setRapportGagnant(0.0); @@ -130,14 +130,14 @@ public class GainsService { } // Trouver tous les chevaux de la même écurie - List chevauxEcurie = Collections.singletonList(chevalGagnant); + List chevauxEcurie = Collections.singletonList(chevalGagnant); if (chevalGagnant.getNomEcurie() != null) { chevauxEcurie = chevalRepository.findByNomEcurie(chevalGagnant.getNomEcurie()); } // Calculer le total des mises sur les chevaux de l'écurie double totalMisesEcurie = 0.0; - for (Cheval cheval : chevauxEcurie) { + for (ChevalSimple cheval : chevauxEcurie) { double misesCheval = parisGagnant.stream() .filter(p -> p.getCheval().getId().equals(cheval.getId())) .mapToDouble(PariSimple::getMise) @@ -152,7 +152,7 @@ public class GainsService { } } - private void calculerRapportsGagnantDeadHeat(Gains gains, ResultatCourse resultat, List parisGagnant) { + private void calculerRapportsGagnantDeadHeat(GainsSimple gains, ResultatCourseSimple resultat, List parisGagnant) { // Article 5a: Cas d'arrivée "dead-heat" - Calcul des rapports "gagnant" if (resultat.getChevauxPremiers().isEmpty()) { gains.setRapportGagnant(0.0); @@ -204,7 +204,7 @@ public class GainsService { } } - private void calculerRapportsPlaceNormal(Gains gains, ResultatCourse resultat, List parisPlace) { + private void calculerRapportsPlaceNormal(GainsSimple gains, ResultatCourseSimple resultat, List parisPlace) { // Article 5b: Cas d'arrivée normale - Calcul du rapport "placé" int nombreChevauxInscrits = gains.getCourse().getNombreChevauxInscrits(); List chevauxPayables = new ArrayList<>(); @@ -271,7 +271,7 @@ public class GainsService { } } - private void calculerRapportsPlaceDeadHeat(Gains gains, ResultatCourse resultat, List parisPlace) { + private void calculerRapportsPlaceDeadHeat(GainsSimple gains, ResultatCourseSimple resultat, List parisPlace) { // Article 5b et 5c: Cas d'arrivée "dead-heat" - Calcul des rapports "placé" int nombreChevauxInscrits = gains.getCourse().getNombreChevauxInscrits(); @@ -335,7 +335,7 @@ public class GainsService { } } - private List determinerChevauxPayablesPlace(ResultatCourse resultat, int nombreChevauxInscrits) { + private List determinerChevauxPayablesPlace(ResultatCourseSimple resultat, int nombreChevauxInscrits) { List chevauxPayables = new ArrayList<>(); // Article 3: Déterminer les chevaux payables selon le nombre de partants @@ -353,7 +353,7 @@ public class GainsService { return chevauxPayables; } - private double appliquerReglesPlaceMoinsHuit(ResultatCourse resultat, double beneficeARepartir) { + private double appliquerReglesPlaceMoinsHuit(ResultatCourseSimple resultat, double beneficeARepartir) { // Article 5c: Règles pour les courses de moins de 8 chevaux avec dead-heat int nbPremiers = resultat.getChevauxPremiers().size(); int nbDeuxiemes = resultat.getChevauxDeuxiemes().size(); @@ -371,7 +371,7 @@ public class GainsService { return beneficeARepartir; } - private double appliquerReglesPlaceHuitPlus(ResultatCourse resultat, double beneficeARepartir) { + private double appliquerReglesPlaceHuitPlus(ResultatCourseSimple resultat, double beneficeARepartir) { // Article 5c: Règles pour les courses de 8 chevaux et plus avec dead-heat int nbPremiers = resultat.getChevauxPremiers().size(); int nbDeuxiemes = resultat.getChevauxDeuxiemes().size(); @@ -401,7 +401,7 @@ public class GainsService { return beneficeARepartir; } - private void gererCagnotte(Gains gains, ResultatCourse resultat, + private void gererCagnotte(GainsSimple gains, ResultatCourseSimple resultat, List parisGagnant, List parisPlace) { // Article 6 et 7: Gestion de la cagnotte (tirelire) double montantCagnotte = 0.0; @@ -473,7 +473,7 @@ public class GainsService { // TODO: Implémenter la logique de report de la cagnotte selon l'article 7 } - public Gains obtenirGainsParCourse(Long courseId) { + public GainsSimple obtenirGainsParCourse(Long courseId) { return gainsRepository.findByCourseId(courseId); } } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch1_simple/service/PariSimpleService.java b/src/main/java/com/pmumali/ch1_simple/service/PariSimpleService.java index 8e63f54..a1f8c42 100644 --- a/src/main/java/com/pmumali/ch1_simple/service/PariSimpleService.java +++ b/src/main/java/com/pmumali/ch1_simple/service/PariSimpleService.java @@ -1,9 +1,9 @@ package com.pmumali.ch1_simple.service; -import com.pmumali.ch1_simple.model.Course; +import com.pmumali.ch1_simple.model.CourseSimple; import com.pmumali.ch1_simple.model.PariSimple; -import com.pmumali.ch1_simple.repository.ChevalRepository; -import com.pmumali.ch1_simple.repository.CourseRepository; +import com.pmumali.ch1_simple.repository.ChevalSimpleRepository; +import com.pmumali.ch1_simple.repository.CourseSimpleRepository; import com.pmumali.ch1_simple.repository.PariSimpleRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,16 +17,16 @@ public class PariSimpleService { private PariSimpleRepository pariRepository; @Autowired - private CourseRepository courseRepository; + private CourseSimpleRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalSimpleRepository chevalRepository; private static final double MISE_DE_BASE = 500.0; public PariSimple placerPari(PariSimple pari) { // Vérifier que le type de pari est valide pour la course - Course course = pari.getCourse(); + CourseSimple course = (CourseSimple) pari.getCourse(); if ("GAGNANT".equals(pari.getTypePari()) && course.getNombreChevauxInscrits() < 2) { throw new IllegalArgumentException("Pari GAGNANT impossible: moins de 2 chevaux"); } diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/ChevalController.java b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/ChevalController.java deleted file mode 100644 index abaa1a5..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/ChevalController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.controller; - -import com.pmumali.ch2_jumelegagnant.model.Cheval; -import com.pmumali.ch2_jumelegagnant.service.ChevalService; -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/chevaux") -public class ChevalController { - - @Autowired - private ChevalService chevalService; - - @PostMapping - public ResponseEntity ajouterCheval(@RequestBody Cheval cheval) { - return ResponseEntity.ok(chevalService.ajouterCheval(cheval)); - } - - @GetMapping("/course/{courseId}") - public ResponseEntity> obtenirChevauxParCourse(@PathVariable Long courseId) { - return ResponseEntity.ok(chevalService.obtenirChevauxParCourse(courseId)); - } - - @GetMapping("/non-partants") - public ResponseEntity> obtenirChevauxNonPartants() { - return ResponseEntity.ok(chevalService.obtenirChevauxNonPartants()); - } -} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/ChevalJumeleGagnantController.java b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/ChevalJumeleGagnantController.java new file mode 100644 index 0000000..ef664dd --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/ChevalJumeleGagnantController.java @@ -0,0 +1,32 @@ +package com.pmumali.ch2_jumelegagnant.controller; + +import com.pmumali.ch2_jumelegagnant.model.ChevalJumeleGagnant; +import com.pmumali.ch2_jumelegagnant.service.ChevalJumeleGagnantService; +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/jumelegagnant/chevaux") +public class ChevalJumeleGagnantController { + + @Autowired + private ChevalJumeleGagnantService chevalService; + + // @PostMapping + public ResponseEntity ajouterCheval(@RequestBody ChevalJumeleGagnant cheval) { + return ResponseEntity.ok(chevalService.ajouterCheval(cheval)); + } + + // @GetMapping("/course/{courseId}") + public ResponseEntity> obtenirChevauxParCourse(@PathVariable Long courseId) { + return ResponseEntity.ok(chevalService.obtenirChevauxParCourse(courseId)); + } + + // @GetMapping("/non-partants") + public ResponseEntity> obtenirChevauxNonPartants() { + return ResponseEntity.ok(chevalService.obtenirChevauxNonPartants()); + } +} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/CourseController.java b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/CourseController.java deleted file mode 100644 index cdc653b..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/CourseController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.controller; - -import com.pmumali.ch2_jumelegagnant.model.Course; -import com.pmumali.ch2_jumelegagnant.service.CourseService; -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 CourseController { - - @Autowired - private CourseService courseService; - - @PostMapping - public ResponseEntity creerCourse(@RequestBody Course course) { - return ResponseEntity.ok(courseService.creerCourse(course)); - } - - @GetMapping - public ResponseEntity> obtenirToutesCourses() { - return ResponseEntity.ok(courseService.obtenirToutesCourses()); - } - - @GetMapping("/{id}") - public ResponseEntity obtenirCourseParId(@PathVariable Long id) { - Course course = courseService.obtenirCourseParId(id); - return course != null ? ResponseEntity.ok(course) : ResponseEntity.notFound().build(); - } - - @GetMapping("/terminees") - public ResponseEntity> obtenirCoursesTerminees() { - return ResponseEntity.ok(courseService.obtenirCoursesTerminees()); - } - - @GetMapping("/avenir") - public ResponseEntity> obtenirCoursesAVenir() { - return ResponseEntity.ok(courseService.obtenirCoursesAVenir()); - } - - @GetMapping("/annulees") - public ResponseEntity> obtenirCoursesAnnulees() { - return ResponseEntity.ok(courseService.obtenirCoursesAnnulees()); - } -} - diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/CourseJumeleGagnantController.java b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/CourseJumeleGagnantController.java new file mode 100644 index 0000000..5e5ca02 --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/CourseJumeleGagnantController.java @@ -0,0 +1,49 @@ +package com.pmumali.ch2_jumelegagnant.controller; + +import com.pmumali.ch2_jumelegagnant.model.CourseJumeleGagnant; +import com.pmumali.ch2_jumelegagnant.service.CourseJumeleGagnantService; + +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/jumelegagnant/courses") +public class CourseJumeleGagnantController { + + @Autowired + private CourseJumeleGagnantService courseService; + + // @PostMapping + public ResponseEntity creerCourse(@RequestBody CourseJumeleGagnant course) { + return ResponseEntity.ok(courseService.creerCourse(course)); + } + + // @GetMapping + public ResponseEntity> obtenirToutesCourses() { + return ResponseEntity.ok(courseService.obtenirToutesCourses()); + } + + // @GetMapping("/{id}") + public ResponseEntity obtenirCourseParId(@PathVariable Long id) { + CourseJumeleGagnant course = courseService.obtenirCourseParId(id); + return course != null ? ResponseEntity.ok(course) : ResponseEntity.notFound().build(); + } + + // @GetMapping("/terminees") + public ResponseEntity> obtenirCoursesTerminees() { + return ResponseEntity.ok(courseService.obtenirCoursesTerminees()); + } + + // @GetMapping("/avenir") + public ResponseEntity> obtenirCoursesAVenir() { + return ResponseEntity.ok(courseService.obtenirCoursesAVenir()); + } + + // @GetMapping("/annulees") + public ResponseEntity> obtenirCoursesAnnulees() { + return ResponseEntity.ok(courseService.obtenirCoursesAnnulees()); + } +} + diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/GainsController.java b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/GainsController.java deleted file mode 100644 index 058b377..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/GainsController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.controller; - -import com.pmumali.ch2_jumelegagnant.model.Gains; -import com.pmumali.ch2_jumelegagnant.model.ResultatCourse; -import com.pmumali.ch2_jumelegagnant.service.GainsService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/gains") -public class GainsController { - - @Autowired - private GainsService gainsService; - - @PostMapping("/calculer/{courseId}") - public ResponseEntity calculerGains(@PathVariable Long courseId, @RequestBody ResultatCourse resultat) { - return ResponseEntity.ok(gainsService.calculerGains(courseId, resultat)); - } - - @GetMapping("/course/{courseId}") - public ResponseEntity obtenirGainsParCourse(@PathVariable Long courseId) { - Gains gains = gainsService.obtenirGainsParCourse(courseId); - return gains != null ? ResponseEntity.ok(gains) : ResponseEntity.notFound().build(); - } -} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/GainsJumeleGagnantController.java b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/GainsJumeleGagnantController.java new file mode 100644 index 0000000..c73fedd --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/GainsJumeleGagnantController.java @@ -0,0 +1,27 @@ +package com.pmumali.ch2_jumelegagnant.controller; + +import com.pmumali.ch2_jumelegagnant.model.GainsJumeleGagnant; +import com.pmumali.ch2_jumelegagnant.model.ResultatCourseJumeleGagnant; +import com.pmumali.ch2_jumelegagnant.service.GainsJumeleGagnantService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/jumelegagnant/gains") +public class GainsJumeleGagnantController { + + @Autowired + private GainsJumeleGagnantService gainsService; + + // @PostMapping("/calculer/{courseId}") + public ResponseEntity calculerGains(@PathVariable Long courseId, @RequestBody ResultatCourseJumeleGagnant resultat) { + return ResponseEntity.ok(gainsService.calculerGains(courseId, resultat)); + } + + // @GetMapping("/course/{courseId}") + public ResponseEntity obtenirGainsParCourse(@PathVariable Long courseId) { + GainsJumeleGagnant gains = gainsService.obtenirGainsParCourse(courseId); + return gains != null ? ResponseEntity.ok(gains) : ResponseEntity.notFound().build(); + } +} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/PariJumeleController.java b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/PariJumeleController.java index c05c8d5..a89163d 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/controller/PariJumeleController.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/controller/PariJumeleController.java @@ -9,33 +9,33 @@ import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api/paris-jumele") +@RequestMapping("/api/jumelegagnant") public class PariJumeleController { @Autowired private PariJumeleService pariService; - @PostMapping + @PostMapping("/pari") public ResponseEntity placerPari(@RequestBody PariJumeleGagnant pari) { return ResponseEntity.ok(pariService.placerPari(pari)); } - @GetMapping("/course/{courseId}") + // @GetMapping("/course/{courseId}") public ResponseEntity> obtenirParisParCourse(@PathVariable Long courseId) { return ResponseEntity.ok(pariService.obtenirParisParCourse(courseId)); } - @GetMapping("/cheval/{chevalId}") + // @GetMapping("/cheval/{chevalId}") public ResponseEntity> obtenirParisParCheval(@PathVariable Long chevalId) { return ResponseEntity.ok(pariService.obtenirParisParCheval(chevalId)); } - @GetMapping("/calculer-formule-combinee/{nombreChevaux}") + // @GetMapping("/calculer-formule-combinee/{nombreChevaux}") public ResponseEntity calculerCoutFormuleCombinee(@PathVariable int nombreChevaux) { return ResponseEntity.ok(pariService.calculerCoutFormuleCombinee(nombreChevaux)); } - @GetMapping("/calculer-formule-champ") + // @GetMapping("/calculer-formule-champ") public ResponseEntity calculerCoutFormuleChamp( @RequestParam int nombreChevauxPartants, @RequestParam int nombreChevauxSelectionnes, diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/model/Cheval.java b/src/main/java/com/pmumali/ch2_jumelegagnant/model/ChevalJumeleGagnant.java similarity index 61% rename from src/main/java/com/pmumali/ch2_jumelegagnant/model/Cheval.java rename to src/main/java/com/pmumali/ch2_jumelegagnant/model/ChevalJumeleGagnant.java index db6e3b6..8dd485c 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/model/Cheval.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/model/ChevalJumeleGagnant.java @@ -1,23 +1,28 @@ package com.pmumali.ch2_jumelegagnant.model; +import com.pmumali.common.model.Cheval; import jakarta.persistence.*; import lombok.*; + @Entity @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "cheval") -public class Cheval { +public class ChevalJumeleGagnant extends Cheval { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; private int numero; - private boolean estNonPartant; + @Column(name = "non_partant") + private boolean nonPartant; + private String nomEcurie; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseJumeleGagnant course; } diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/model/Course.java b/src/main/java/com/pmumali/ch2_jumelegagnant/model/CourseJumeleGagnant.java similarity index 68% rename from src/main/java/com/pmumali/ch2_jumelegagnant/model/Course.java rename to src/main/java/com/pmumali/ch2_jumelegagnant/model/CourseJumeleGagnant.java index 16f7f3b..d7b2954 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/model/Course.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/model/CourseJumeleGagnant.java @@ -1,5 +1,7 @@ package com.pmumali.ch2_jumelegagnant.model; +import com.pmumali.common.model.Cheval; +import com.pmumali.common.model.Course; import jakarta.persistence.*; import lombok.*; import lombok.NoArgsConstructor; @@ -8,26 +10,27 @@ import lombok.AllArgsConstructor; import java.time.LocalDateTime; import java.util.List; + @Entity @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "course") -public class Course { +public class CourseJumeleGagnant extends Course { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String nom; - private LocalDateTime date; + @Column(name = "heure_course") + private LocalDateTime heureCourse; private String lieu; private int nombreChevauxInscrits; private boolean estTerminee; private boolean estAnnulee; @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List chevaux; + private List chevaux; @OneToOne(mappedBy = "course", cascade = CascadeType.ALL) - private ResultatCourse resultat; + private ResultatCourseJumeleGagnant resultat; } diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/model/Gains.java b/src/main/java/com/pmumali/ch2_jumelegagnant/model/GainsJumeleGagnant.java similarity index 88% rename from src/main/java/com/pmumali/ch2_jumelegagnant/model/Gains.java rename to src/main/java/com/pmumali/ch2_jumelegagnant/model/GainsJumeleGagnant.java index f4b6c4f..864d756 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/model/Gains.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/model/GainsJumeleGagnant.java @@ -11,14 +11,14 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Table(name = "gains") -public class Gains { +public class GainsJumeleGagnant { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseJumeleGagnant course; private double masseAPartager; private double montantCagnotte; diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/model/PariJumeleGagnant.java b/src/main/java/com/pmumali/ch2_jumelegagnant/model/PariJumeleGagnant.java index e723c24..6dcf5b3 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/model/PariJumeleGagnant.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/model/PariJumeleGagnant.java @@ -1,36 +1,40 @@ package com.pmumali.ch2_jumelegagnant.model; +import com.pmumali.common.model.Pari; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; + @Entity @Data @NoArgsConstructor @AllArgsConstructor -@Table(name = "pari_jumele_gagnant") -public class PariJumeleGagnant { +@Table(name = "pari") +public class PariJumeleGagnant extends Pari { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - - private String typePari; // UNITAIRE, COMBINE, CHAMP_TOTAL, CHAMP_PARTIEL + @Column(name = "type_pari") + private String typePari; // GAGNANT ou PLACE private double mise = 500.0; private LocalDateTime datePari; + private boolean estPaye; + private boolean estRembourse; + @ManyToOne @JoinColumn(name = "cheval1_id") - private Cheval cheval1; + private ChevalJumeleGagnant cheval1; @ManyToOne @JoinColumn(name = "cheval2_id") - private Cheval cheval2; + private ChevalJumeleGagnant cheval2; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseJumeleGagnant course; - private boolean estPaye; - private boolean estRembourse; } diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/model/ResultatCourse.java b/src/main/java/com/pmumali/ch2_jumelegagnant/model/ResultatCourseJumeleGagnant.java similarity index 55% rename from src/main/java/com/pmumali/ch2_jumelegagnant/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch2_jumelegagnant/model/ResultatCourseJumeleGagnant.java index e4d182c..75265e5 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/model/ResultatCourseJumeleGagnant.java @@ -1,29 +1,25 @@ package com.pmumali.ch2_jumelegagnant.model; +import com.pmumali.common.model.Resultat; import jakarta.persistence.*; import lombok.*; import java.util.List; + @Entity @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "resultat_course") -public class ResultatCourse { +public class ResultatCourseJumeleGagnant extends Resultat { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne @JoinColumn(name = "course_id") - private Course course; + private CourseJumeleGagnant course; - @ElementCollection - private List chevauxPremiers; // Pour gérer les dead-heats - @ElementCollection - private List chevauxDeuxiemes; // Pour gérer les dead-heats - - private boolean aDeadHeat; } diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ChevalJumeleGagnantRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ChevalJumeleGagnantRepository.java new file mode 100644 index 0000000..c21b423 --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ChevalJumeleGagnantRepository.java @@ -0,0 +1,13 @@ +package com.pmumali.ch2_jumelegagnant.repository; + +import com.pmumali.ch2_jumelegagnant.model.ChevalJumeleGagnant; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ChevalJumeleGagnantRepository extends JpaRepository { + List findByCourseId(Long courseId); + List findByNonPartant(boolean nonPartant); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ChevalRepository.java deleted file mode 100644 index 5bba280..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ChevalRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.repository; - -import com.pmumali.ch2_jumelegagnant.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); - List findByEstNonPartant(boolean estNonPartant); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/CourseJumeleGagnantRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/CourseJumeleGagnantRepository.java new file mode 100644 index 0000000..b5eddc1 --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/CourseJumeleGagnantRepository.java @@ -0,0 +1,12 @@ +package com.pmumali.ch2_jumelegagnant.repository; + +import com.pmumali.ch2_jumelegagnant.model.CourseJumeleGagnant; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseJumeleGagnantRepository extends JpaRepository { + List findByEstTerminee(boolean estTerminee); + List findByEstAnnulee(boolean estAnnulee); +} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/CourseRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/CourseRepository.java deleted file mode 100644 index db7b47d..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/CourseRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.repository; - -import com.pmumali.ch2_jumelegagnant.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); - List findByEstAnnulee(boolean estAnnulee); -} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/GainsJumeleGagnantRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/GainsJumeleGagnantRepository.java new file mode 100644 index 0000000..091a4dd --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/GainsJumeleGagnantRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch2_jumelegagnant.repository; + +import com.pmumali.ch2_jumelegagnant.model.GainsJumeleGagnant; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface GainsJumeleGagnantRepository extends JpaRepository { + GainsJumeleGagnant findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/GainsRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/GainsRepository.java deleted file mode 100644 index a8d0065..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/GainsRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.repository; - -import com.pmumali.ch2_jumelegagnant.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/ch2_jumelegagnant/repository/PariJumeleRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/PariJumeleGagnantRepository.java similarity index 83% rename from src/main/java/com/pmumali/ch2_jumelegagnant/repository/PariJumeleRepository.java rename to src/main/java/com/pmumali/ch2_jumelegagnant/repository/PariJumeleGagnantRepository.java index 1698c9f..f08fdd4 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/PariJumeleRepository.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/PariJumeleGagnantRepository.java @@ -7,7 +7,7 @@ import org.springframework.stereotype.Repository; import java.util.List; @Repository -public interface PariJumeleRepository extends JpaRepository { +public interface PariJumeleGagnantRepository extends JpaRepository { List findByCourseId(Long courseId); List findByCheval1IdOrCheval2Id(Long cheval1Id, Long cheval2Id); List findByEstRembourse(boolean estRembourse); diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ResultatCourseJumeleGagnantRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ResultatCourseJumeleGagnantRepository.java new file mode 100644 index 0000000..7ffe174 --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ResultatCourseJumeleGagnantRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch2_jumelegagnant.repository; + +import com.pmumali.ch2_jumelegagnant.model.ResultatCourseJumeleGagnant; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ResultatCourseJumeleGagnantRepository extends JpaRepository { + ResultatCourseJumeleGagnant findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ResultatCourseRepository.java deleted file mode 100644 index 5f274b0..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.repository; - -import com.pmumali.ch2_jumelegagnant.model.ResultatCourse; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ResultatCourseRepository extends JpaRepository { - ResultatCourse findByCourseId(Long courseId); -} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/service/ChevalJumeleGagnantService.java b/src/main/java/com/pmumali/ch2_jumelegagnant/service/ChevalJumeleGagnantService.java new file mode 100644 index 0000000..58a22c1 --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/service/ChevalJumeleGagnantService.java @@ -0,0 +1,27 @@ +package com.pmumali.ch2_jumelegagnant.service; + +import com.pmumali.ch2_jumelegagnant.model.ChevalJumeleGagnant; +import com.pmumali.ch2_jumelegagnant.repository.ChevalJumeleGagnantRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ChevalJumeleGagnantService { + + @Autowired + private ChevalJumeleGagnantRepository chevalRepository; + + public ChevalJumeleGagnant ajouterCheval(ChevalJumeleGagnant cheval) { + return chevalRepository.save(cheval); + } + + public List obtenirChevauxParCourse(Long courseId) { + return chevalRepository.findByCourseId(courseId); + } + + public List obtenirChevauxNonPartants() { + return chevalRepository.findByNonPartant(true); + } +} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/service/ChevalService.java b/src/main/java/com/pmumali/ch2_jumelegagnant/service/ChevalService.java deleted file mode 100644 index 823a4f7..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/service/ChevalService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.service; - -import com.pmumali.ch2_jumelegagnant.model.Cheval; -import com.pmumali.ch2_jumelegagnant.repository.ChevalRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class ChevalService { - - @Autowired - private ChevalRepository chevalRepository; - - public Cheval ajouterCheval(Cheval cheval) { - return chevalRepository.save(cheval); - } - - public List obtenirChevauxParCourse(Long courseId) { - return chevalRepository.findByCourseId(courseId); - } - - public List obtenirChevauxNonPartants() { - return chevalRepository.findByEstNonPartant(true); - } -} diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/service/CourseJumeleGagnantService.java b/src/main/java/com/pmumali/ch2_jumelegagnant/service/CourseJumeleGagnantService.java new file mode 100644 index 0000000..13abffa --- /dev/null +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/service/CourseJumeleGagnantService.java @@ -0,0 +1,40 @@ +package com.pmumali.ch2_jumelegagnant.service; + +import com.pmumali.ch2_jumelegagnant.model.CourseJumeleGagnant; +import com.pmumali.ch2_jumelegagnant.repository.CourseJumeleGagnantRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service +public class CourseJumeleGagnantService { + + @Autowired + private CourseJumeleGagnantRepository courseRepository; + + public CourseJumeleGagnant creerCourse(CourseJumeleGagnant course) { + return courseRepository.save(course); + } + + public List obtenirToutesCourses() { + return courseRepository.findAll(); + } + + public CourseJumeleGagnant obtenirCourseParId(Long id) { + return courseRepository.findById(id).orElse(null); + } + + public List obtenirCoursesTerminees() { + return courseRepository.findByEstTerminee(true); + } + + public List obtenirCoursesAVenir() { + return courseRepository.findByEstTerminee(false); + } + + public List obtenirCoursesAnnulees() { + return courseRepository.findByEstAnnulee(true); + } +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/service/CourseService.java b/src/main/java/com/pmumali/ch2_jumelegagnant/service/CourseService.java deleted file mode 100644 index d25e20b..0000000 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/service/CourseService.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pmumali.ch2_jumelegagnant.service; - -import com.pmumali.ch2_jumelegagnant.model.Course; -import com.pmumali.ch2_jumelegagnant.repository.CourseRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - - -@Service -public class CourseService { - - @Autowired - private CourseRepository courseRepository; - - public Course creerCourse(Course course) { - return courseRepository.save(course); - } - - public List obtenirToutesCourses() { - return courseRepository.findAll(); - } - - public Course obtenirCourseParId(Long id) { - return courseRepository.findById(id).orElse(null); - } - - public List obtenirCoursesTerminees() { - return courseRepository.findByEstTerminee(true); - } - - public List obtenirCoursesAVenir() { - return courseRepository.findByEstTerminee(false); - } - - public List obtenirCoursesAnnulees() { - return courseRepository.findByEstAnnulee(true); - } -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/service/GainsService.java b/src/main/java/com/pmumali/ch2_jumelegagnant/service/GainsJumeleGagnantService.java similarity index 89% rename from src/main/java/com/pmumali/ch2_jumelegagnant/service/GainsService.java rename to src/main/java/com/pmumali/ch2_jumelegagnant/service/GainsJumeleGagnantService.java index 31e4541..3a3386d 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/service/GainsService.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/service/GainsJumeleGagnantService.java @@ -1,9 +1,9 @@ package com.pmumali.ch2_jumelegagnant.service; -import com.pmumali.ch2_jumelegagnant.model.Course; -import com.pmumali.ch2_jumelegagnant.model.Gains; +import com.pmumali.ch2_jumelegagnant.model.CourseJumeleGagnant; +import com.pmumali.ch2_jumelegagnant.model.GainsJumeleGagnant; import com.pmumali.ch2_jumelegagnant.model.PariJumeleGagnant; -import com.pmumali.ch2_jumelegagnant.model.ResultatCourse; +import com.pmumali.ch2_jumelegagnant.model.ResultatCourseJumeleGagnant; import com.pmumali.ch2_jumelegagnant.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -14,28 +14,28 @@ import java.util.*; @Service @Transactional -public class GainsService { +public class GainsJumeleGagnantService { @Autowired - private PariJumeleRepository pariRepository; + private PariJumeleGagnantRepository pariRepository; @Autowired - private GainsRepository gainsRepository; + private GainsJumeleGagnantRepository gainsRepository; @Autowired - private CourseRepository courseRepository; + private CourseJumeleGagnantRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalJumeleGagnantRepository chevalRepository; @Autowired - private ResultatCourseRepository resultatRepository; + private ResultatCourseJumeleGagnantRepository resultatRepository; private static final double RAPPORT_MINIMUM = 1.1; private static final double PRELEVEMENTS = 0.15; // 15% de prélèvements - public Gains calculerGains(Long courseId, ResultatCourse resultat) { - Course course = courseRepository.findById(courseId) + public GainsJumeleGagnant calculerGains(Long courseId, ResultatCourseJumeleGagnant resultat) { + CourseJumeleGagnant course = courseRepository.findById(courseId) .orElseThrow(() -> new RuntimeException("Course non trouvée")); List tousParis = pariRepository.findByCourseId(courseId); @@ -54,7 +54,7 @@ public class GainsService { List combinaisonsPayables = determinerCombinaisonsPayables(resultat); // Calcul des rapports - Gains gains = new Gains(); + GainsJumeleGagnant gains = new GainsJumeleGagnant(); gains.setCourse(course); gains.setMasseAPartager(masseAPartager); gains.setDateCalcul(LocalDateTime.now()); @@ -77,7 +77,7 @@ public class GainsService { for (PariJumeleGagnant pari : paris) { // Article 4: Remboursement si un ou deux chevaux non partants - if (pari.getCheval1().isEstNonPartant() || pari.getCheval2().isEstNonPartant()) { + if (pari.getCheval1().isNonPartant() || pari.getCheval2().isNonPartant()) { remboursements += pari.getMise(); pari.setEstRembourse(true); pariRepository.save(pari); @@ -87,7 +87,7 @@ public class GainsService { return remboursements; } - private List determinerCombinaisonsPayables(ResultatCourse resultat) { + private List determinerCombinaisonsPayables(ResultatCourseJumeleGagnant resultat) { List combinaisons = new ArrayList<>(); // Article 1: Le pari est payable si les deux chevaux occupent les deux premières places @@ -128,7 +128,7 @@ public class GainsService { return combinaisons; } - private void calculerRapportsNormaux(Gains gains, List combinaisonsPayables, + private void calculerRapportsNormaux(GainsJumeleGagnant gains, List combinaisonsPayables, List tousParis) { // Article 5a: Cas d'arrivée normale if (combinaisonsPayables.isEmpty()) { @@ -153,7 +153,7 @@ public class GainsService { } } - private void calculerRapportsDeadHeat(Gains gains, List combinaisonsPayables, + private void calculerRapportsDeadHeat(GainsJumeleGagnant gains, List combinaisonsPayables, List tousParis) { // Article 5b: Cas d'arrivée "dead heat" if (combinaisonsPayables.isEmpty()) { @@ -206,7 +206,7 @@ public class GainsService { gains.setRapports(rapports); } - private void gererCasParticuliersDeadHeat(Gains gains, List combinaisonsPayables, + private void gererCasParticuliersDeadHeat(GainsJumeleGagnant gains, List combinaisonsPayables, Map misesParCombinaison) { // Article 8b: Gestion des cas particuliers de dead-heat boolean aucuneMise = true; @@ -276,7 +276,7 @@ public class GainsService { return totalMises; } - private void gererCagnotte(Gains gains, List combinaisonsPayables) { + private void gererCagnotte(GainsJumeleGagnant gains, List combinaisonsPayables) { // Article 8 et 9: Gestion de la cagnotte if (combinaisonsPayables.isEmpty()) { gains.setMontantCagnotte(gains.getMasseAPartager()); @@ -323,7 +323,7 @@ public class GainsService { } } - public Gains obtenirGainsParCourse(Long courseId) { + public GainsJumeleGagnant obtenirGainsParCourse(Long courseId) { return gainsRepository.findByCourseId(courseId); } } diff --git a/src/main/java/com/pmumali/ch2_jumelegagnant/service/PariJumeleService.java b/src/main/java/com/pmumali/ch2_jumelegagnant/service/PariJumeleService.java index 5bf9414..7103344 100644 --- a/src/main/java/com/pmumali/ch2_jumelegagnant/service/PariJumeleService.java +++ b/src/main/java/com/pmumali/ch2_jumelegagnant/service/PariJumeleService.java @@ -1,9 +1,9 @@ package com.pmumali.ch2_jumelegagnant.service; import com.pmumali.ch2_jumelegagnant.model.PariJumeleGagnant; -import com.pmumali.ch2_jumelegagnant.repository.ChevalRepository; -import com.pmumali.ch2_jumelegagnant.repository.CourseRepository; -import com.pmumali.ch2_jumelegagnant.repository.PariJumeleRepository; +import com.pmumali.ch2_jumelegagnant.repository.ChevalJumeleGagnantRepository; +import com.pmumali.ch2_jumelegagnant.repository.CourseJumeleGagnantRepository; +import com.pmumali.ch2_jumelegagnant.repository.PariJumeleGagnantRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,13 +13,13 @@ import java.util.List; public class PariJumeleService { @Autowired - private PariJumeleRepository pariRepository; + private PariJumeleGagnantRepository pariRepository; @Autowired - private CourseRepository courseRepository; + private CourseJumeleGagnantRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalJumeleGagnantRepository chevalRepository; private static final double MISE_DE_BASE = 500.0; private static final double MISE_MAXIMALE = 20 * MISE_DE_BASE; diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/controller/ChevalController.java b/src/main/java/com/pmumali/ch3_jumeleplace/controller/ChevalController.java deleted file mode 100644 index 58c3acd..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/controller/ChevalController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pmumali.ch3_jumeleplace.controller; - -import com.pmumali.ch3_jumeleplace.model.Cheval; -import com.pmumali.ch3_jumeleplace.service.ChevalService; -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/chevaux") -public class ChevalController { - - @Autowired - private ChevalService chevalService; - - @PostMapping - public ResponseEntity ajouterCheval(@RequestBody Cheval cheval) { - return ResponseEntity.ok(chevalService.ajouterCheval(cheval)); - } - - @GetMapping("/course/{courseId}") - public ResponseEntity> obtenirChevauxParCourse(@PathVariable Long courseId) { - return ResponseEntity.ok(chevalService.obtenirChevauxParCourse(courseId)); - } - - @GetMapping("/non-partants") - public ResponseEntity> obtenirChevauxNonPartants() { - return ResponseEntity.ok(chevalService.obtenirChevauxNonPartants()); - } -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/controller/ChevalJumelePlaceController.java b/src/main/java/com/pmumali/ch3_jumeleplace/controller/ChevalJumelePlaceController.java new file mode 100644 index 0000000..be55f4e --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/controller/ChevalJumelePlaceController.java @@ -0,0 +1,33 @@ +package com.pmumali.ch3_jumeleplace.controller; + +import com.pmumali.ch3_jumeleplace.model.ChevalJumelePlace; +import com.pmumali.ch3_jumeleplace.service.ChevalJumelePlaceService; + +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/jumeleplace/chevaux") +public class ChevalJumelePlaceController { + + @Autowired + private ChevalJumelePlaceService chevalService; + + // @PostMapping + public ResponseEntity ajouterCheval(@RequestBody ChevalJumelePlace cheval) { + return ResponseEntity.ok(chevalService.ajouterCheval(cheval)); + } + + // @GetMapping("/course/{courseId}") + public ResponseEntity> obtenirChevauxParCourse(@PathVariable Long courseId) { + return ResponseEntity.ok(chevalService.obtenirChevauxParCourse(courseId)); + } + + // @GetMapping("/non-partants") + public ResponseEntity> obtenirChevauxNonPartants() { + return ResponseEntity.ok(chevalService.obtenirChevauxNonPartants()); + } +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/controller/CourseController.java b/src/main/java/com/pmumali/ch3_jumeleplace/controller/CourseController.java deleted file mode 100644 index d1125e3..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/controller/CourseController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.pmumali.ch3_jumeleplace.controller; - -import com.pmumali.ch3_jumeleplace.model.Course; -import com.pmumali.ch3_jumeleplace.service.CourseService; -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 CourseController { - - @Autowired - private CourseService courseService; - - @PostMapping - public ResponseEntity creerCourse(@RequestBody Course course) { - return ResponseEntity.ok(courseService.creerCourse(course)); - } - - @GetMapping - public ResponseEntity> obtenirToutesCourses() { - return ResponseEntity.ok(courseService.obtenirToutesCourses()); - } - - @GetMapping("/{id}") - public ResponseEntity obtenirCourseParId(@PathVariable Long id) { - Course course = courseService.obtenirCourseParId(id); - return course != null ? ResponseEntity.ok(course) : ResponseEntity.notFound().build(); - } - - @GetMapping("/terminees") - public ResponseEntity> obtenirCoursesTerminees() { - return ResponseEntity.ok(courseService.obtenirCoursesTerminees()); - } - - @GetMapping("/avenir") - public ResponseEntity> obtenirCoursesAVenir() { - return ResponseEntity.ok(courseService.obtenirCoursesAVenir()); - } - - @GetMapping("/annulees") - public ResponseEntity> obtenirCoursesAnnulees() { - return ResponseEntity.ok(courseService.obtenirCoursesAnnulees()); - } -} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/controller/CourseJumelePlaceController.java b/src/main/java/com/pmumali/ch3_jumeleplace/controller/CourseJumelePlaceController.java new file mode 100644 index 0000000..5e955ef --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/controller/CourseJumelePlaceController.java @@ -0,0 +1,48 @@ +package com.pmumali.ch3_jumeleplace.controller; + +import com.pmumali.ch3_jumeleplace.model.CourseJumelePlace; +import com.pmumali.ch3_jumeleplace.service.CourseJumelePlaceService; + +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/jumeleplace/courses") +public class CourseJumelePlaceController { + + @Autowired + private CourseJumelePlaceService courseService; + + // @PostMapping + public ResponseEntity creerCourse(@RequestBody CourseJumelePlace course) { + return ResponseEntity.ok(courseService.creerCourse(course)); + } + + // @GetMapping + public ResponseEntity> obtenirToutesCourses() { + return ResponseEntity.ok(courseService.obtenirToutesCourses()); + } + + // @GetMapping("/{id}") + public ResponseEntity obtenirCourseParId(@PathVariable Long id) { + CourseJumelePlace course = courseService.obtenirCourseParId(id); + return course != null ? ResponseEntity.ok(course) : ResponseEntity.notFound().build(); + } + + // @GetMapping("/terminees") + public ResponseEntity> obtenirCoursesTerminees() { + return ResponseEntity.ok(courseService.obtenirCoursesTerminees()); + } + + // @GetMapping("/avenir") + public ResponseEntity> obtenirCoursesAVenir() { + return ResponseEntity.ok(courseService.obtenirCoursesAVenir()); + } + + // @GetMapping("/annulees") + public ResponseEntity> obtenirCoursesAnnulees() { + return ResponseEntity.ok(courseService.obtenirCoursesAnnulees()); + } +} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/controller/GainsController.java b/src/main/java/com/pmumali/ch3_jumeleplace/controller/GainsController.java deleted file mode 100644 index 2abda45..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/controller/GainsController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pmumali.ch3_jumeleplace.controller; - -import com.pmumali.ch3_jumeleplace.model.Gains; -import com.pmumali.ch3_jumeleplace.model.ResultatCourse; -import com.pmumali.ch3_jumeleplace.service.GainsService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/gains") -public class GainsController { - - @Autowired - private GainsService gainsService; - - @PostMapping("/calculer/{courseId}") - public ResponseEntity calculerGains(@PathVariable Long courseId, @RequestBody ResultatCourse resultat) { - return ResponseEntity.ok(gainsService.calculerGains(courseId, resultat)); - } - - @GetMapping("/course/{courseId}") - public ResponseEntity obtenirGainsParCourse(@PathVariable Long courseId) { - Gains gains = gainsService.obtenirGainsParCourse(courseId); - return gains != null ? ResponseEntity.ok(gains) : ResponseEntity.notFound().build(); - } -} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/controller/GainsJumelePlaceController.java b/src/main/java/com/pmumali/ch3_jumeleplace/controller/GainsJumelePlaceController.java new file mode 100644 index 0000000..e4aed28 --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/controller/GainsJumelePlaceController.java @@ -0,0 +1,27 @@ +package com.pmumali.ch3_jumeleplace.controller; + +import com.pmumali.ch3_jumeleplace.model.GainsJumelePlace; +import com.pmumali.ch3_jumeleplace.model.ResultatCourseJumelePlace; +import com.pmumali.ch3_jumeleplace.service.GainsJumelePlaceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/jumeleplace/gains") +public class GainsJumelePlaceController { + + @Autowired + private GainsJumelePlaceService gainsService; + + // @PostMapping("/calculer/{courseId}") + public ResponseEntity calculerGains(@PathVariable Long courseId, @RequestBody ResultatCourseJumelePlace resultat) { + return ResponseEntity.ok(gainsService.calculerGains(courseId, resultat)); + } + + // @GetMapping("/course/{courseId}") + public ResponseEntity obtenirGainsParCourse(@PathVariable Long courseId) { + GainsJumelePlace gains = gainsService.obtenirGainsParCourse(courseId); + return gains != null ? ResponseEntity.ok(gains) : ResponseEntity.notFound().build(); + } +} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/controller/PariJumelePlaceController.java b/src/main/java/com/pmumali/ch3_jumeleplace/controller/PariJumelePlaceController.java index 4234c84..ff3c2ef 100644 --- a/src/main/java/com/pmumali/ch3_jumeleplace/controller/PariJumelePlaceController.java +++ b/src/main/java/com/pmumali/ch3_jumeleplace/controller/PariJumelePlaceController.java @@ -9,33 +9,33 @@ import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api/paris-jumele-place") +@RequestMapping("/api/jumeleplace") public class PariJumelePlaceController { @Autowired private PariJumelePlaceService pariService; - @PostMapping + @PostMapping("/pari") public ResponseEntity placerPari(@RequestBody PariJumelePlace pari) { return ResponseEntity.ok(pariService.placerPari(pari)); } - @GetMapping("/course/{courseId}") + // @GetMapping("/course/{courseId}") public ResponseEntity> obtenirParisParCourse(@PathVariable Long courseId) { return ResponseEntity.ok(pariService.obtenirParisParCourse(courseId)); } - @GetMapping("/cheval/{chevalId}") + // @GetMapping("/cheval/{chevalId}") public ResponseEntity> obtenirParisParCheval(@PathVariable Long chevalId) { return ResponseEntity.ok(pariService.obtenirParisParCheval(chevalId)); } - @GetMapping("/calculer-formule-combinee/{nombreChevaux}") + // @GetMapping("/calculer-formule-combinee/{nombreChevaux}") public ResponseEntity calculerCoutFormuleCombinee(@PathVariable int nombreChevaux) { return ResponseEntity.ok(pariService.calculerCoutFormuleCombinee(nombreChevaux)); } - @GetMapping("/calculer-formule-champ") + // @GetMapping("/calculer-formule-champ") public ResponseEntity calculerCoutFormuleChamp( @RequestParam int nombreChevauxPartants, @RequestParam int nombreChevauxSelectionnes, diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/model/Cheval.java b/src/main/java/com/pmumali/ch3_jumeleplace/model/ChevalJumelePlace.java similarity index 61% rename from src/main/java/com/pmumali/ch3_jumeleplace/model/Cheval.java rename to src/main/java/com/pmumali/ch3_jumeleplace/model/ChevalJumelePlace.java index 7f5eba8..fdbca44 100644 --- a/src/main/java/com/pmumali/ch3_jumeleplace/model/Cheval.java +++ b/src/main/java/com/pmumali/ch3_jumeleplace/model/ChevalJumelePlace.java @@ -1,23 +1,28 @@ package com.pmumali.ch3_jumeleplace.model; +import com.pmumali.common.model.Cheval; import jakarta.persistence.*; import lombok.*; + @Entity @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "cheval") -public class Cheval { +public class ChevalJumelePlace extends Cheval { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; private int numero; - private boolean estNonPartant; + @Column(name = "non_partant") + private boolean nonPartant; + private String nomEcurie; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseJumelePlace course; } diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/model/Course.java b/src/main/java/com/pmumali/ch3_jumeleplace/model/CourseJumelePlace.java similarity index 72% rename from src/main/java/com/pmumali/ch3_jumeleplace/model/Course.java rename to src/main/java/com/pmumali/ch3_jumeleplace/model/CourseJumelePlace.java index 35fb2f3..a91b865 100644 --- a/src/main/java/com/pmumali/ch3_jumeleplace/model/Course.java +++ b/src/main/java/com/pmumali/ch3_jumeleplace/model/CourseJumelePlace.java @@ -1,5 +1,6 @@ package com.pmumali.ch3_jumeleplace.model; +import com.pmumali.common.model.Course; import jakarta.persistence.*; import lombok.Data; import lombok.NoArgsConstructor; @@ -8,26 +9,28 @@ import lombok.AllArgsConstructor; import java.time.LocalDateTime; import java.util.List; + @Entity @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "course") -public class Course { +public class CourseJumelePlace extends Course { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String nom; - private LocalDateTime date; + @Column(name = "heure_course") + private LocalDateTime heureCourse; private String lieu; private int nombreChevauxInscrits; private boolean estTerminee; private boolean estAnnulee; @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List chevaux; + private List chevaux; @OneToOne(mappedBy = "course", cascade = CascadeType.ALL) - private ResultatCourse resultat; + private ResultatCourseJumelePlace resultat; } diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/model/Gains.java b/src/main/java/com/pmumali/ch3_jumeleplace/model/GainsJumelePlace.java similarity index 88% rename from src/main/java/com/pmumali/ch3_jumeleplace/model/Gains.java rename to src/main/java/com/pmumali/ch3_jumeleplace/model/GainsJumelePlace.java index 1e951e8..a7a5c80 100644 --- a/src/main/java/com/pmumali/ch3_jumeleplace/model/Gains.java +++ b/src/main/java/com/pmumali/ch3_jumeleplace/model/GainsJumelePlace.java @@ -11,14 +11,14 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Table(name = "gains") -public class Gains { +public class GainsJumelePlace { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseJumelePlace course; private double masseAPartager; private double montantCagnotte; diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/model/PariJumelePlace.java b/src/main/java/com/pmumali/ch3_jumeleplace/model/PariJumelePlace.java index 4ddba46..947950b 100644 --- a/src/main/java/com/pmumali/ch3_jumeleplace/model/PariJumelePlace.java +++ b/src/main/java/com/pmumali/ch3_jumeleplace/model/PariJumelePlace.java @@ -1,36 +1,40 @@ package com.pmumali.ch3_jumeleplace.model; +import com.pmumali.common.model.Pari; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; + @Entity @Data @NoArgsConstructor @AllArgsConstructor -@Table(name = "pari_jumele_place") -public class PariJumelePlace { +@Table(name = "pari") +public class PariJumelePlace extends Pari { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - - private String typePari; // UNITAIRE, COMBINE, CHAMP_TOTAL, CHAMP_PARTIEL + @Column(name = "type_pari") + private String typePari; // GAGNANT ou PLACE private double mise = 500.0; private LocalDateTime datePari; + private boolean estPaye; + private boolean estRembourse; + @ManyToOne @JoinColumn(name = "cheval1_id") - private Cheval cheval1; + private ChevalJumelePlace cheval1; @ManyToOne @JoinColumn(name = "cheval2_id") - private Cheval cheval2; + private ChevalJumelePlace cheval2; @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseJumelePlace course; - private boolean estPaye; - private boolean estRembourse; } diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/model/ResultatCourse.java b/src/main/java/com/pmumali/ch3_jumeleplace/model/ResultatCourseJumelePlace.java similarity index 55% rename from src/main/java/com/pmumali/ch3_jumeleplace/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch3_jumeleplace/model/ResultatCourseJumelePlace.java index 6240782..96cc626 100644 --- a/src/main/java/com/pmumali/ch3_jumeleplace/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch3_jumeleplace/model/ResultatCourseJumelePlace.java @@ -1,32 +1,26 @@ package com.pmumali.ch3_jumeleplace.model; +import com.pmumali.common.model.Resultat; import jakarta.persistence.*; import lombok.*; import java.util.List; + @Entity @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "resultat_course") -public class ResultatCourse { +public class ResultatCourseJumelePlace extends Resultat { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne @JoinColumn(name = "course_id") - private Course course; + private CourseJumelePlace course; - @ElementCollection - private List chevauxPremiers; - @ElementCollection - private List chevauxDeuxiemes; - - @ElementCollection - private List chevauxTroisiemes; - - private boolean aDeadHeat; } diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/repository/ChevalJumelePlaceRepository.java b/src/main/java/com/pmumali/ch3_jumeleplace/repository/ChevalJumelePlaceRepository.java new file mode 100644 index 0000000..f0c3997 --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/repository/ChevalJumelePlaceRepository.java @@ -0,0 +1,14 @@ +package com.pmumali.ch3_jumeleplace.repository; + + +import com.pmumali.ch3_jumeleplace.model.ChevalJumelePlace; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ChevalJumelePlaceRepository extends JpaRepository { + List findByCourseId(Long courseId); + List findByNonPartant(boolean nonPartant); +} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch3_jumeleplace/repository/ChevalRepository.java deleted file mode 100644 index 069eccf..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/repository/ChevalRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pmumali.ch3_jumeleplace.repository; - - -import com.pmumali.ch3_jumeleplace.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); - List findByEstNonPartant(boolean estNonPartant); -} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/repository/CourseJumelePlaceRepository.java b/src/main/java/com/pmumali/ch3_jumeleplace/repository/CourseJumelePlaceRepository.java new file mode 100644 index 0000000..cab7ecc --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/repository/CourseJumelePlaceRepository.java @@ -0,0 +1,12 @@ +package com.pmumali.ch3_jumeleplace.repository; + +import com.pmumali.ch3_jumeleplace.model.CourseJumelePlace; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CourseJumelePlaceRepository extends JpaRepository { + List findByEstTerminee(boolean estTerminee); + List findByEstAnnulee(boolean estAnnulee); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/repository/CourseRepository.java b/src/main/java/com/pmumali/ch3_jumeleplace/repository/CourseRepository.java deleted file mode 100644 index f5e663f..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/repository/CourseRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pmumali.ch3_jumeleplace.repository; - -import com.pmumali.ch3_jumeleplace.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); - List findByEstAnnulee(boolean estAnnulee); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/repository/GainsJumelePlaceRepository.java b/src/main/java/com/pmumali/ch3_jumeleplace/repository/GainsJumelePlaceRepository.java new file mode 100644 index 0000000..29cbec0 --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/repository/GainsJumelePlaceRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch3_jumeleplace.repository; + +import com.pmumali.ch3_jumeleplace.model.GainsJumelePlace; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface GainsJumelePlaceRepository extends JpaRepository { + GainsJumelePlace findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/repository/GainsRepository.java b/src/main/java/com/pmumali/ch3_jumeleplace/repository/GainsRepository.java deleted file mode 100644 index e357c6f..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/repository/GainsRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch3_jumeleplace.repository; - -import com.pmumali.ch3_jumeleplace.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/ch3_jumeleplace/repository/ResultatCourseJumelePlaceRepository.java b/src/main/java/com/pmumali/ch3_jumeleplace/repository/ResultatCourseJumelePlaceRepository.java new file mode 100644 index 0000000..1dab007 --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/repository/ResultatCourseJumelePlaceRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch3_jumeleplace.repository; + +import com.pmumali.ch3_jumeleplace.model.ResultatCourseJumelePlace; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ResultatCourseJumelePlaceRepository extends JpaRepository { + ResultatCourseJumelePlace findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch3_jumeleplace/repository/ResultatCourseRepository.java deleted file mode 100644 index 6546834..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch3_jumeleplace.repository; - -import com.pmumali.ch3_jumeleplace.model.ResultatCourse; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ResultatCourseRepository extends JpaRepository { - ResultatCourse findByCourseId(Long courseId); -} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/service/ChevalJumelePlaceService.java b/src/main/java/com/pmumali/ch3_jumeleplace/service/ChevalJumelePlaceService.java new file mode 100644 index 0000000..28194df --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/service/ChevalJumelePlaceService.java @@ -0,0 +1,27 @@ +package com.pmumali.ch3_jumeleplace.service; + +import com.pmumali.ch3_jumeleplace.model.ChevalJumelePlace; +import com.pmumali.ch3_jumeleplace.repository.ChevalJumelePlaceRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ChevalJumelePlaceService { + + @Autowired + private ChevalJumelePlaceRepository chevalRepository; + + public ChevalJumelePlace ajouterCheval(ChevalJumelePlace cheval) { + return chevalRepository.save(cheval); + } + + public List obtenirChevauxParCourse(Long courseId) { + return chevalRepository.findByCourseId(courseId); + } + + public List obtenirChevauxNonPartants() { + return chevalRepository.findByNonPartant(true); + } +} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/service/ChevalService.java b/src/main/java/com/pmumali/ch3_jumeleplace/service/ChevalService.java deleted file mode 100644 index a7223bf..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/service/ChevalService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pmumali.ch3_jumeleplace.service; - -import com.pmumali.ch3_jumeleplace.model.Cheval; -import com.pmumali.ch3_jumeleplace.repository.ChevalRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class ChevalService { - - @Autowired - private ChevalRepository chevalRepository; - - public Cheval ajouterCheval(Cheval cheval) { - return chevalRepository.save(cheval); - } - - public List obtenirChevauxParCourse(Long courseId) { - return chevalRepository.findByCourseId(courseId); - } - - public List obtenirChevauxNonPartants() { - return chevalRepository.findByEstNonPartant(true); - } -} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/service/CourseJumelePlaceService.java b/src/main/java/com/pmumali/ch3_jumeleplace/service/CourseJumelePlaceService.java new file mode 100644 index 0000000..b5ebc44 --- /dev/null +++ b/src/main/java/com/pmumali/ch3_jumeleplace/service/CourseJumelePlaceService.java @@ -0,0 +1,40 @@ +package com.pmumali.ch3_jumeleplace.service; + +import com.pmumali.ch3_jumeleplace.model.CourseJumelePlace; +import com.pmumali.ch3_jumeleplace.repository.CourseJumelePlaceRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service +public class CourseJumelePlaceService { + + @Autowired + private CourseJumelePlaceRepository courseRepository; + + public CourseJumelePlace creerCourse(CourseJumelePlace course) { + return courseRepository.save(course); + } + + public List obtenirToutesCourses() { + return courseRepository.findAll(); + } + + public CourseJumelePlace obtenirCourseParId(Long id) { + return courseRepository.findById(id).orElse(null); + } + + public List obtenirCoursesTerminees() { + return courseRepository.findByEstTerminee(true); + } + + public List obtenirCoursesAVenir() { + return courseRepository.findByEstTerminee(false); + } + + public List obtenirCoursesAnnulees() { + return courseRepository.findByEstAnnulee(true); + } +} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/service/CourseService.java b/src/main/java/com/pmumali/ch3_jumeleplace/service/CourseService.java deleted file mode 100644 index ab34f19..0000000 --- a/src/main/java/com/pmumali/ch3_jumeleplace/service/CourseService.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pmumali.ch3_jumeleplace.service; - -import com.pmumali.ch3_jumeleplace.model.Course; -import com.pmumali.ch3_jumeleplace.repository.CourseRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - - -@Service -public class CourseService { - - @Autowired - private CourseRepository courseRepository; - - public Course creerCourse(Course course) { - return courseRepository.save(course); - } - - public List obtenirToutesCourses() { - return courseRepository.findAll(); - } - - public Course obtenirCourseParId(Long id) { - return courseRepository.findById(id).orElse(null); - } - - public List obtenirCoursesTerminees() { - return courseRepository.findByEstTerminee(true); - } - - public List obtenirCoursesAVenir() { - return courseRepository.findByEstTerminee(false); - } - - public List obtenirCoursesAnnulees() { - return courseRepository.findByEstAnnulee(true); - } -} diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/service/GainsService.java b/src/main/java/com/pmumali/ch3_jumeleplace/service/GainsJumelePlaceService.java similarity index 93% rename from src/main/java/com/pmumali/ch3_jumeleplace/service/GainsService.java rename to src/main/java/com/pmumali/ch3_jumeleplace/service/GainsJumelePlaceService.java index 2bb3a10..02e658f 100644 --- a/src/main/java/com/pmumali/ch3_jumeleplace/service/GainsService.java +++ b/src/main/java/com/pmumali/ch3_jumeleplace/service/GainsJumelePlaceService.java @@ -1,9 +1,9 @@ package com.pmumali.ch3_jumeleplace.service; -import com.pmumali.ch3_jumeleplace.model.Course; -import com.pmumali.ch3_jumeleplace.model.Gains; +import com.pmumali.ch3_jumeleplace.model.CourseJumelePlace; +import com.pmumali.ch3_jumeleplace.model.GainsJumelePlace; import com.pmumali.ch3_jumeleplace.model.PariJumelePlace; -import com.pmumali.ch3_jumeleplace.model.ResultatCourse; +import com.pmumali.ch3_jumeleplace.model.ResultatCourseJumelePlace; import com.pmumali.ch3_jumeleplace.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -16,28 +16,28 @@ import java.util.Objects; @Service @Transactional -public class GainsService { +public class GainsJumelePlaceService { @Autowired private PariJumelePlaceRepository pariRepository; @Autowired - private GainsRepository gainsRepository; + private GainsJumelePlaceRepository gainsRepository; @Autowired - private CourseRepository courseRepository; + private CourseJumelePlaceRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalJumelePlaceRepository chevalRepository; @Autowired - private ResultatCourseRepository resultatRepository; + private ResultatCourseJumelePlaceRepository resultatRepository; private static final double RAPPORT_MINIMUM = 1.1; private static final double PRELEVEMENTS = 0.15; // 15% de prélèvements - public Gains calculerGains(Long courseId, ResultatCourse resultat) { - Course course = courseRepository.findById(courseId) + public GainsJumelePlace calculerGains(Long courseId, ResultatCourseJumelePlace resultat) { + CourseJumelePlace course = courseRepository.findById(courseId) .orElseThrow(() -> new RuntimeException("Course non trouvée")); List tousParis = pariRepository.findByCourseId(courseId); @@ -56,7 +56,7 @@ public class GainsService { List combinaisonsPayables = determinerCombinaisonsPayables(resultat); // Calcul des rapports - Gains gains = new Gains(); + GainsJumelePlace gains = new GainsJumelePlace(); gains.setCourse(course); gains.setMasseAPartager(masseAPartager); gains.setDateCalcul(LocalDateTime.now()); @@ -79,7 +79,7 @@ public class GainsService { for (PariJumelePlace pari : paris) { // Article 4: Remboursement si un ou deux chevaux non partants - if (pari.getCheval1().isEstNonPartant() || pari.getCheval2().isEstNonPartant()) { + if (pari.getCheval1().isNonPartant() || pari.getCheval2().isNonPartant()) { remboursements += pari.getMise(); pari.setEstRembourse(true); pariRepository.save(pari); @@ -89,7 +89,7 @@ public class GainsService { return remboursements; } - private List determinerCombinaisonsPayables(ResultatCourse resultat) { + private List determinerCombinaisonsPayables(ResultatCourseJumelePlace resultat) { List combinaisons = new ArrayList<>(); // Article 1: Le pari est payable si les deux chevaux occupent deux des trois premières places @@ -165,7 +165,7 @@ public class GainsService { return combinaisons; } - private void calculerRapportsNormaux(Gains gains, List combinaisonsPayables, + private void calculerRapportsNormaux(GainsJumelePlace gains, List combinaisonsPayables, List tousParis) { // Article 5a: Cas d'arrivée normale if (combinaisonsPayables.isEmpty()) { @@ -194,7 +194,7 @@ public class GainsService { gains.setRapports(rapports); } - private void calculerRapportsDeadHeat(Gains gains, List combinaisonsPayables, + private void calculerRapportsDeadHeat(GainsJumelePlace gains, List combinaisonsPayables, List tousParis) { // Article 5b: Cas d'arrivée "dead heat" if (combinaisonsPayables.isEmpty()) { @@ -207,7 +207,7 @@ public class GainsService { List rapports = new ArrayList<>(); // Déterminer le type de dead-heat pour appliquer les règles spécifiques - ResultatCourse resultat = gains.getCourse().getResultat(); + ResultatCourseJumelePlace resultat = gains.getCourse().getResultat(); if (resultat.getChevauxPremiers().size() >= 3) { // Article 5b1: Dead-heat de trois chevaux ou plus à la première place @@ -363,7 +363,7 @@ public class GainsService { return totalMises; } - private void gererCagnotte(Gains gains, List combinaisonsPayables) { + private void gererCagnotte(GainsJumelePlace gains, List combinaisonsPayables) { // Article 8 et 9: Gestion de la cagnotte if (combinaisonsPayables.isEmpty()) { gains.setMontantCagnotte(gains.getMasseAPartager()); @@ -409,7 +409,7 @@ public class GainsService { } } - public Gains obtenirGainsParCourse(Long courseId) { + public GainsJumelePlace obtenirGainsParCourse(Long courseId) { return gainsRepository.findByCourseId(courseId); } } diff --git a/src/main/java/com/pmumali/ch3_jumeleplace/service/PariJumelePlaceService.java b/src/main/java/com/pmumali/ch3_jumeleplace/service/PariJumelePlaceService.java index c055db0..35f118c 100644 --- a/src/main/java/com/pmumali/ch3_jumeleplace/service/PariJumelePlaceService.java +++ b/src/main/java/com/pmumali/ch3_jumeleplace/service/PariJumelePlaceService.java @@ -1,8 +1,8 @@ package com.pmumali.ch3_jumeleplace.service; import com.pmumali.ch3_jumeleplace.model.PariJumelePlace; -import com.pmumali.ch3_jumeleplace.repository.ChevalRepository; -import com.pmumali.ch3_jumeleplace.repository.CourseRepository; +import com.pmumali.ch3_jumeleplace.repository.ChevalJumelePlaceRepository; +import com.pmumali.ch3_jumeleplace.repository.CourseJumelePlaceRepository; import com.pmumali.ch3_jumeleplace.repository.PariJumelePlaceRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -16,10 +16,10 @@ public class PariJumelePlaceService { private PariJumelePlaceRepository pariRepository; @Autowired - private CourseRepository courseRepository; + private CourseJumelePlaceRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalJumelePlaceRepository chevalRepository; private static final double MISE_DE_BASE = 500.0; private static final double MISE_MAXIMALE = 20 * MISE_DE_BASE; diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseController.java b/src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseJumeleOrdreController.java similarity index 53% rename from src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseController.java rename to src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseJumeleOrdreController.java index 516decf..0667a7f 100644 --- a/src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseController.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/controller/CourseJumeleOrdreController.java @@ -3,9 +3,11 @@ package com.pmumali.ch4_jumeleordre.controller; 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 com.pmumali.ch4_jumeleordre.model.CourseJumeleOrdre; +import com.pmumali.ch4_jumeleordre.service.ResultatCourseJumeleOrdreService; + +import com.pmumali.ch4_jumeleordre.service.CourseJumeleOrdreService; +import com.pmumali.common.model.Resultat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -13,23 +15,23 @@ import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api/courses") -public class CourseController { +@RequestMapping("/api/jumeleordre/courses") +public class CourseJumeleOrdreController { @Autowired - private CourseService courseService; + private CourseJumeleOrdreService courseService; @Autowired - private ResultatCourseService resultatCourseService; + private ResultatCourseJumeleOrdreService resultatCourseService; - @GetMapping("/actives") - public ResponseEntity> getCoursesActives() { - List courses = courseService.getCoursesActives(); + // @GetMapping("/actives") + public ResponseEntity> getCoursesActives() { + List courses = courseService.getCoursesActives(); return ResponseEntity.ok(courses); } - @PostMapping("/resultat") - public ResponseEntity soumettreResultatCourse(@RequestBody ResultatCourseDto resultatDto) { + // @PostMapping("/resultat") + public ResponseEntity soumettreResultatCourse(@RequestBody Resultat resultatDto) { try { resultatCourseService.traiterResultatCourse(resultatDto); return ResponseEntity.ok().build(); diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisController.java b/src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisJumeleOrdreController.java similarity index 55% rename from src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisController.java rename to src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisJumeleOrdreController.java index b5f6fa8..af2d8e8 100644 --- a/src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisController.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/controller/ParisJumeleOrdreController.java @@ -4,8 +4,8 @@ package com.pmumali.ch4_jumeleordre.controller; 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 com.pmumali.ch4_jumeleordre.model.ParisJumeleOrdre; +import com.pmumali.ch4_jumeleordre.service.ParisJumeleOrdreService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -13,29 +13,29 @@ import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api/paris") -public class ParisController { +@RequestMapping("/api/jumeleordre") +public class ParisJumeleOrdreController { @Autowired - private ParisService parisService; + private ParisJumeleOrdreService parisService; - @PostMapping - public ResponseEntity enregistrerParis(@RequestBody ParisDto parisDto) { + @PostMapping("/pari") + public ResponseEntity enregistrerParis(@RequestBody ParisDto parisDto) { try { - Paris paris = parisService.enregistrerParis(parisDto); + ParisJumeleOrdre paris = parisService.enregistrerParis(parisDto); return ResponseEntity.ok(paris); } catch (ParisInvalideException e) { return ResponseEntity.badRequest().body(null); } } - @GetMapping("/parieur/{idParieur}") - public ResponseEntity> getParisParParieur(@PathVariable String idParieur) { - List paris = parisService.getParisParParieur(idParieur); + // @GetMapping("/parieur/{idParieur}") + public ResponseEntity> getParisParParieur(@PathVariable String idParieur) { + List paris = parisService.getParisParParieur(idParieur); return ResponseEntity.ok(paris); } - @GetMapping("/gains/{idParis}") + // @GetMapping("/gains/{idParis}") public ResponseEntity getGains(@PathVariable Long idParis) { // Implémentation pour obtenir les détails des gains d'un pari return ResponseEntity.ok(new GainsDto()); diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandler.java b/src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandlerCh4.java similarity index 96% rename from src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandler.java rename to src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandlerCh4.java index bb7e188..c524bf8 100644 --- a/src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/exception/GlobalExceptionHandlerCh4.java @@ -12,7 +12,7 @@ import java.util.LinkedHashMap; import java.util.Map; @ControllerAdvice -public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { +public class GlobalExceptionHandlerCh4 extends ResponseEntityExceptionHandler { @ExceptionHandler(JumeleOrdreException.class) public ResponseEntity handleJumeleOrdreException( diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/model/Cheval.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/Cheval.java deleted file mode 100644 index 720c4c0..0000000 --- a/src/main/java/com/pmumali/ch4_jumeleordre/model/Cheval.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pmumali.ch4_jumeleordre.model; - -import jakarta.persistence.*; -import lombok.Data; - -@Entity -@Data -public class Cheval { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String nom; - private boolean nonPartant; - - @ManyToOne - private Course course; -} diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/model/ChevalJumeleOrdre.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/ChevalJumeleOrdre.java new file mode 100644 index 0000000..8ef4bf7 --- /dev/null +++ b/src/main/java/com/pmumali/ch4_jumeleordre/model/ChevalJumeleOrdre.java @@ -0,0 +1,29 @@ +package com.pmumali.ch4_jumeleordre.model; + +import com.pmumali.common.model.Cheval; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "cheval") +public class ChevalJumeleOrdre extends Cheval { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nom; + private int numero; + @Column(name = "non_partant") + private boolean nonPartant; + private String nomEcurie; + + @ManyToOne + @JoinColumn(name = "course_id") + private CourseJumeleOrdre course; +} diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/model/Course.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/Course.java deleted file mode 100644 index 37cc713..0000000 --- a/src/main/java/com/pmumali/ch4_jumeleordre/model/Course.java +++ /dev/null @@ -1,23 +0,0 @@ -// Course.java -package com.pmumali.ch4_jumeleordre.model; - -import jakarta.persistence.*; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Entity -@Data -public class Course { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String nom; - private LocalDateTime heureDebut; - - @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List chevaux; - private boolean estTerminee; - private boolean aDeadHeat; -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/model/CourseJumeleOrdre.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/CourseJumeleOrdre.java new file mode 100644 index 0000000..8c5591a --- /dev/null +++ b/src/main/java/com/pmumali/ch4_jumeleordre/model/CourseJumeleOrdre.java @@ -0,0 +1,35 @@ +// Course.java +package com.pmumali.ch4_jumeleordre.model; + +import com.pmumali.common.model.Cheval; +import com.pmumali.common.model.Course; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "course") +public class CourseJumeleOrdre extends Course { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String nom; + @Column(name = "heure_course") + private LocalDateTime heureCourse; + private String lieu; + private int nombreChevauxInscrits; + private boolean estTerminee; + private boolean estAnnulee; + + @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) + private List chevaux; + private boolean aDeadHeat; +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/model/Paris.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/Paris.java deleted file mode 100644 index 7dc8727..0000000 --- a/src/main/java/com/pmumali/ch4_jumeleordre/model/Paris.java +++ /dev/null @@ -1,34 +0,0 @@ -// Paris.java -package com.pmumali.ch4_jumeleordre.model; - -import jakarta.persistence.*; -import lombok.Data; - -import java.time.LocalDateTime; - -@Entity -@Data -public class Paris { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - private Course course; - - @ManyToOne - private Cheval premier; - - @ManyToOne - private Cheval deuxieme; - - private double mise; - private LocalDateTime dateParis; - private String idParieur; - private StatutParis statut; - private Double gains; - - public enum StatutParis { - EN_ATTENTE, GAGNANT, PERDANT, REMBOURSE - } -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/model/ParisJumeleOrdre.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/ParisJumeleOrdre.java new file mode 100644 index 0000000..8723d1a --- /dev/null +++ b/src/main/java/com/pmumali/ch4_jumeleordre/model/ParisJumeleOrdre.java @@ -0,0 +1,48 @@ +// Paris.java +package com.pmumali.ch4_jumeleordre.model; + +import com.pmumali.common.model.Pari; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "pari") +public class ParisJumeleOrdre extends Pari { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(name = "type_pari") + private String typePari; // GAGNANT ou PLACE + private double mise = 500.0; + private LocalDateTime datePari; + + private boolean estPaye; + private boolean estRembourse; + + @ManyToOne + private CourseJumeleOrdre course; + + @ManyToOne + private ChevalJumeleOrdre premier; + + @ManyToOne + private ChevalJumeleOrdre deuxieme; + + private LocalDateTime dateParis; + private String idParieur; + private StatutParis statut; + private Double gains; + + public enum StatutParis { + EN_ATTENTE, GAGNANT, PERDANT, REMBOURSE + } +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourse.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourse.java deleted file mode 100644 index 21d1962..0000000 --- a/src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourse.java +++ /dev/null @@ -1,32 +0,0 @@ -// ResultatCourse.java -package com.pmumali.ch4_jumeleordre.model; - -import jakarta.persistence.*; -import lombok.Data; - -import java.util.List; - -@Entity -@Data -public class ResultatCourse { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @OneToOne - private Course course; - - @ManyToOne - private Cheval premier; - - @ManyToOne - private Cheval deuxieme; - - @ElementCollection - private List chevauxDeadHeat; - - private double totalMises; - private double masseAPartager; - private double prelevementsLegaux; - private double montantRembourse; -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourseJumeleOrdre.java b/src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourseJumeleOrdre.java new file mode 100644 index 0000000..67748ee --- /dev/null +++ b/src/main/java/com/pmumali/ch4_jumeleordre/model/ResultatCourseJumeleOrdre.java @@ -0,0 +1,37 @@ +// ResultatCourse.java +package com.pmumali.ch4_jumeleordre.model; + +import com.pmumali.common.model.Resultat; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.naming.spi.DirStateFactory; +import java.util.List; + + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "resultat_course") +public class ResultatCourseJumeleOrdre extends Resultat { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToOne + private CourseJumeleOrdre course; + + @ManyToOne + private ChevalJumeleOrdre premier; + + @ManyToOne + private ChevalJumeleOrdre deuxieme; + + @ElementCollection + private List chevauxDeadHeat; + +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalJumeleOrdreRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalJumeleOrdreRepository.java new file mode 100644 index 0000000..e2a9827 --- /dev/null +++ b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalJumeleOrdreRepository.java @@ -0,0 +1,8 @@ +// ChevalRepository.java +package com.pmumali.ch4_jumeleordre.repository; + +import com.pmumali.ch4_jumeleordre.model.ChevalJumeleOrdre; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChevalJumeleOrdreRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalRepository.java deleted file mode 100644 index d762725..0000000 --- a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ChevalRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -// ChevalRepository.java -package com.pmumali.ch4_jumeleordre.repository; - -import com.pmumali.ch4_jumeleordre.model.Cheval; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ChevalRepository extends JpaRepository { -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseJumeleOrdreRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseJumeleOrdreRepository.java new file mode 100644 index 0000000..8cdda79 --- /dev/null +++ b/src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseJumeleOrdreRepository.java @@ -0,0 +1,11 @@ +// CourseRepository.java +package com.pmumali.ch4_jumeleordre.repository; + +import com.pmumali.ch4_jumeleordre.model.CourseJumeleOrdre; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CourseJumeleOrdreRepository extends JpaRepository { + List findByEstTermineeFalse(); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseRepository.java deleted file mode 100644 index 6f91dc7..0000000 --- a/src/main/java/com/pmumali/ch4_jumeleordre/repository/CourseRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -// CourseRepository.java -package com.pmumali.ch4_jumeleordre.repository; - -import com.pmumali.ch4_jumeleordre.model.Course; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface CourseRepository extends JpaRepository { - List findByEstTermineeFalse(); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisJumeleOrdreRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisJumeleOrdreRepository.java new file mode 100644 index 0000000..604462e --- /dev/null +++ b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisJumeleOrdreRepository.java @@ -0,0 +1,14 @@ +// ParisRepository.java +package com.pmumali.ch4_jumeleordre.repository; + +import com.pmumali.ch4_jumeleordre.model.ParisJumeleOrdre; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ParisJumeleOrdreRepository extends JpaRepository { + List findByCourseIdAndStatut(Long idCourse, ParisJumeleOrdre.StatutParis statut); + List findByIdParieur(String idParieur); + + List findByCourseId(Long courseID); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisRepository.java deleted file mode 100644 index 621b062..0000000 --- a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ParisRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -// ParisRepository.java -package com.pmumali.ch4_jumeleordre.repository; - -import com.pmumali.ch4_jumeleordre.model.Paris; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface ParisRepository extends JpaRepository { - List findByCourseIdAndStatut(Long idCourse, Paris.StatutParis statut); - List findByIdParieur(String idParieur); - - List findByCourseId(Long courseID); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseJumeleOrdreRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseJumeleOrdreRepository.java new file mode 100644 index 0000000..bfad849 --- /dev/null +++ b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseJumeleOrdreRepository.java @@ -0,0 +1,9 @@ +// ResultatCourseRepository.java +package com.pmumali.ch4_jumeleordre.repository; + +import com.pmumali.ch4_jumeleordre.model.ResultatCourseJumeleOrdre; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResultatCourseJumeleOrdreRepository extends JpaRepository { + ResultatCourseJumeleOrdre findByCourseId(Long idCourse); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseRepository.java deleted file mode 100644 index f056ae7..0000000 --- a/src/main/java/com/pmumali/ch4_jumeleordre/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -// ResultatCourseRepository.java -package com.pmumali.ch4_jumeleordre.repository; - -import com.pmumali.ch4_jumeleordre.model.ResultatCourse; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ResultatCourseRepository extends JpaRepository { - ResultatCourse findByCourseId(Long idCourse); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/service/CourseService.java b/src/main/java/com/pmumali/ch4_jumeleordre/service/CourseJumeleOrdreService.java similarity index 60% rename from src/main/java/com/pmumali/ch4_jumeleordre/service/CourseService.java rename to src/main/java/com/pmumali/ch4_jumeleordre/service/CourseJumeleOrdreService.java index 64be099..2f68ca6 100644 --- a/src/main/java/com/pmumali/ch4_jumeleordre/service/CourseService.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/service/CourseJumeleOrdreService.java @@ -1,9 +1,9 @@ package com.pmumali.ch4_jumeleordre.service; -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.model.CourseJumeleOrdre; +import com.pmumali.ch4_jumeleordre.model.ChevalJumeleOrdre; +import com.pmumali.ch4_jumeleordre.repository.CourseJumeleOrdreRepository; +import com.pmumali.ch4_jumeleordre.repository.ChevalJumeleOrdreRepository; import com.pmumali.ch4_jumeleordre.exception.CourseInvalideException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,13 +12,13 @@ import java.time.LocalDateTime; import java.util.List; @Service -public class CourseService { +public class CourseJumeleOrdreService { - private final CourseRepository courseRepository; - private final ChevalRepository chevalRepository; + private final CourseJumeleOrdreRepository courseRepository; + private final ChevalJumeleOrdreRepository chevalRepository; @Autowired - public CourseService(CourseRepository courseRepository, ChevalRepository chevalRepository) { + public CourseJumeleOrdreService(CourseJumeleOrdreRepository courseRepository, ChevalJumeleOrdreRepository chevalRepository) { this.courseRepository = courseRepository; this.chevalRepository = chevalRepository; } @@ -26,29 +26,29 @@ public class CourseService { /** * Récupère toutes les courses actives (non terminées) */ - public List getCoursesActives() { + public List getCoursesActives() { return courseRepository.findByEstTermineeFalse(); } /** * Crée une nouvelle course */ - public Course creerCourse(String nomCourse, LocalDateTime heureDebut, List idsChevaux) throws CourseInvalideException { + public CourseJumeleOrdre creerCourse(String nomCourse, LocalDateTime heureDebut, List idsChevaux) throws CourseInvalideException { if (idsChevaux.size() > 7) { throw new CourseInvalideException("Une course ne peut pas avoir plus de 7 chevaux pour le pari Jumelé Ordre"); } - Course course = new Course(); + CourseJumeleOrdre course = new CourseJumeleOrdre(); course.setNom(nomCourse); - course.setHeureDebut(heureDebut); + course.setHeureCourse(heureDebut); course.setEstTerminee(false); course.setADeadHeat(false); - Course savedCourse = courseRepository.save(course); + CourseJumeleOrdre savedCourse = courseRepository.save(course); // Associer les chevaux à la course - List chevaux = chevalRepository.findAllById(idsChevaux); - for (Cheval cheval : chevaux) { + List chevaux = chevalRepository.findAllById(idsChevaux); + for (ChevalJumeleOrdre cheval : chevaux) { cheval.setCourse(savedCourse); chevalRepository.save(cheval); } @@ -60,7 +60,7 @@ public class CourseService { /** * Récupère une course par son ID */ - public Course getCourseById(Long id) throws CourseInvalideException { + public CourseJumeleOrdre getCourseById(Long id) throws CourseInvalideException { return courseRepository.findById(id) .orElseThrow(() -> new CourseInvalideException("Course non trouvée avec l'ID: " + id)); } @@ -68,15 +68,15 @@ public class CourseService { /** * Met à jour les informations d'une course */ - public Course mettreAJourCourse(Long id, String nom, LocalDateTime heureDebut) throws CourseInvalideException { - Course course = getCourseById(id); + public CourseJumeleOrdre mettreAJourCourse(Long id, String nom, LocalDateTime heureDebut) throws CourseInvalideException { + CourseJumeleOrdre course = getCourseById(id); if (nom != null) { course.setNom(nom); } if (heureDebut != null) { - course.setHeureDebut(heureDebut); + course.setHeureCourse(heureDebut); } return courseRepository.save(course); @@ -85,9 +85,9 @@ public class CourseService { /** * Ajoute un cheval à une course */ - public Course ajouterChevalACourse(Long idCourse, Long idCheval) throws CourseInvalideException { - Course course = getCourseById(idCourse); - Cheval cheval = chevalRepository.findById(idCheval) + public CourseJumeleOrdre ajouterChevalACourse(Long idCourse, Long idCheval) throws CourseInvalideException { + CourseJumeleOrdre course = getCourseById(idCourse); + ChevalJumeleOrdre cheval = chevalRepository.findById(idCheval) .orElseThrow(() -> new CourseInvalideException("Cheval non trouvé avec l'ID: " + idCheval)); if (course.getChevaux().size() >= 7) { @@ -104,8 +104,8 @@ public class CourseService { /** * Marque un cheval comme non partant */ - public Cheval declarerChevalNonPartant(Long idCheval) throws CourseInvalideException { - Cheval cheval = chevalRepository.findById(idCheval) + public ChevalJumeleOrdre declarerChevalNonPartant(Long idCheval) throws CourseInvalideException { + ChevalJumeleOrdre cheval = chevalRepository.findById(idCheval) .orElseThrow(() -> new CourseInvalideException("Cheval non trouvé avec l'ID: " + idCheval)); cheval.setNonPartant(true); @@ -116,9 +116,9 @@ public class CourseService { * Supprime une course (si elle n'a pas encore commencé) */ public void supprimerCourse(Long id) throws CourseInvalideException { - Course course = getCourseById(id); + CourseJumeleOrdre course = getCourseById(id); - if (course.getHeureDebut().isBefore(LocalDateTime.now())) { + if (course.getHeureCourse().isBefore(LocalDateTime.now())) { throw new CourseInvalideException("Impossible de supprimer une course qui a déjà commencé"); } @@ -128,7 +128,7 @@ public class CourseService { /** * Récupère toutes les courses */ - public List getAllCourses() { + public List getAllCourses() { return courseRepository.findAll(); } diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/service/ParisService.java b/src/main/java/com/pmumali/ch4_jumeleordre/service/ParisJumeleOrdreService.java similarity index 64% rename from src/main/java/com/pmumali/ch4_jumeleordre/service/ParisService.java rename to src/main/java/com/pmumali/ch4_jumeleordre/service/ParisJumeleOrdreService.java index f1636ed..a9aa678 100644 --- a/src/main/java/com/pmumali/ch4_jumeleordre/service/ParisService.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/service/ParisJumeleOrdreService.java @@ -3,12 +3,12 @@ package com.pmumali.ch4_jumeleordre.service; 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 com.pmumali.ch4_jumeleordre.model.ChevalJumeleOrdre; +import com.pmumali.ch4_jumeleordre.model.CourseJumeleOrdre; +import com.pmumali.ch4_jumeleordre.model.ParisJumeleOrdre; +import com.pmumali.ch4_jumeleordre.repository.ChevalJumeleOrdreRepository; +import com.pmumali.ch4_jumeleordre.repository.CourseJumeleOrdreRepository; +import com.pmumali.ch4_jumeleordre.repository.ParisJumeleOrdreRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,33 +17,33 @@ import java.time.LocalDateTime; import java.util.List; @Service -public class ParisService { +public class ParisJumeleOrdreService { private static final double MISE_MINIMUM = 500; private static final double MISE_MAXIMUM_PAR_PARIS = 20 * MISE_MINIMUM; @Autowired - private ParisRepository parisRepository; + private ParisJumeleOrdreRepository parisRepository; @Autowired - private CourseRepository courseRepository; + private CourseJumeleOrdreRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalJumeleOrdreRepository chevalRepository; @Transactional - public Paris enregistrerParis(ParisDto parisDto) throws ParisInvalideException { - Course course = courseRepository.findById(parisDto.getIdCourse()) + public ParisJumeleOrdre enregistrerParis(ParisDto parisDto) throws ParisInvalideException { + CourseJumeleOrdre course = courseRepository.findById(parisDto.getIdCourse()) .orElseThrow(() -> new ParisInvalideException("Course non trouvée")); if (course.isEstTerminee()) { throw new ParisInvalideException("Impossible de parier sur une course terminée"); } - Cheval premier = chevalRepository.findById(parisDto.getIdChevalPremier()) + ChevalJumeleOrdre premier = chevalRepository.findById(parisDto.getIdChevalPremier()) .orElseThrow(() -> new ParisInvalideException("Cheval premier non trouvé")); - Cheval deuxieme = chevalRepository.findById(parisDto.getIdChevalDeuxieme()) + ChevalJumeleOrdre deuxieme = chevalRepository.findById(parisDto.getIdChevalDeuxieme()) .orElseThrow(() -> new ParisInvalideException("Cheval deuxième non trouvé")); if (premier.equals(deuxieme)) { @@ -59,29 +59,29 @@ public class ParisService { } // Vérification du total des mises sur cette combinaison - double totalMisesCombinaison = parisRepository.findByCourseIdAndStatut(course.getId(), Paris.StatutParis.EN_ATTENTE) + double totalMisesCombinaison = parisRepository.findByCourseIdAndStatut(course.getId(), ParisJumeleOrdre.StatutParis.EN_ATTENTE) .stream() .filter(p -> p.getPremier().equals(premier) && p.getDeuxieme().equals(deuxieme)) - .mapToDouble(Paris::getMise) + .mapToDouble(ParisJumeleOrdre::getMise) .sum(); if (totalMisesCombinaison + parisDto.getMise() > MISE_MAXIMUM_PAR_PARIS) { throw new ParisInvalideException("Mise maximale pour cette combinaison dépassée"); } - Paris paris = new Paris(); + ParisJumeleOrdre paris = new ParisJumeleOrdre(); paris.setCourse(course); paris.setPremier(premier); paris.setDeuxieme(deuxieme); paris.setMise(parisDto.getMise()); paris.setDateParis(LocalDateTime.now()); paris.setIdParieur(parisDto.getIdParieur()); - paris.setStatut(Paris.StatutParis.EN_ATTENTE); + paris.setStatut(ParisJumeleOrdre.StatutParis.EN_ATTENTE); return parisRepository.save(paris); } - public List getParisParParieur(String idParieur) { + public List getParisParParieur(String idParieur) { return parisRepository.findByIdParieur(idParieur); } } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseService.java b/src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseJumeleOrdreService.java similarity index 73% rename from src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseService.java rename to src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseJumeleOrdreService.java index 77f4e79..4b521aa 100644 --- a/src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseService.java +++ b/src/main/java/com/pmumali/ch4_jumeleordre/service/ResultatCourseJumeleOrdreService.java @@ -5,6 +5,7 @@ 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 com.pmumali.common.model.Resultat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,33 +13,33 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service -public class ResultatCourseService { +public class ResultatCourseJumeleOrdreService { @Autowired - private CourseRepository courseRepository; + private CourseJumeleOrdreRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalJumeleOrdreRepository chevalRepository; @Autowired - private ParisRepository parisRepository; + private ParisJumeleOrdreRepository parisRepository; @Autowired - private ResultatCourseRepository resultatCourseRepository; + private ResultatCourseJumeleOrdreRepository resultatCourseRepository; @Transactional - public void traiterResultatCourse(ResultatCourseDto resultatDto) throws ResultatCourseInvalideException { - Course course = courseRepository.findById(resultatDto.getIdCourse()) + public void traiterResultatCourse(Resultat resultatDto) throws ResultatCourseInvalideException { + CourseJumeleOrdre course = courseRepository.findById(resultatDto.getCourse().getId()) .orElseThrow(() -> new ResultatCourseInvalideException("Course non trouvée")); if (course.isEstTerminee()) { throw new ResultatCourseInvalideException("Résultats déjà traités pour cette course"); } - Cheval premier = chevalRepository.findById(resultatDto.getIdChevalPremier()) + ChevalJumeleOrdre premier = chevalRepository.findById(resultatDto.getPremier().getId() ) .orElseThrow(() -> new ResultatCourseInvalideException("Cheval premier non trouvé")); - Cheval deuxieme = chevalRepository.findById(resultatDto.getIdChevalDeuxieme()) + ChevalJumeleOrdre deuxieme = chevalRepository.findById(resultatDto.getDeuxieme().getId()) .orElseThrow(() -> new ResultatCourseInvalideException("Cheval deuxième non trouvé")); // Validation des chevaux en dead heat @@ -50,16 +51,16 @@ public class ResultatCourseService { } // Enregistrement du résultat - ResultatCourse resultat = new ResultatCourse(); + ResultatCourseJumeleOrdre resultat = new ResultatCourseJumeleOrdre(); resultat.setCourse(course); resultat.setPremier(premier); resultat.setDeuxieme(deuxieme); resultat.setChevauxDeadHeat(resultatDto.getChevauxDeadHeat()); // Calcul des totaux et déductions - List tousParis = parisRepository.findByCourseId(course.getId()); + List tousParis = parisRepository.findByCourseId(course.getId()); - double totalMises = tousParis.stream().mapToDouble(Paris::getMise).sum(); + double totalMises = tousParis.stream().mapToDouble(ParisJumeleOrdre::getMise).sum(); double prelevementsLegaux = calculerPrelevementsLegaux(totalMises); double montantRembourse = calculerMontantRembourse(tousParis); @@ -86,20 +87,20 @@ public class ResultatCourseService { return totalMises * 0.10; // Exemple: 10% de prélèvement } - private double calculerMontantRembourse(List paris) { + private double calculerMontantRembourse(List paris) { return paris.stream() .filter(p -> p.getPremier().isNonPartant() || p.getDeuxieme().isNonPartant()) - .mapToDouble(Paris::getMise) + .mapToDouble(ParisJumeleOrdre::getMise) .sum(); } - private void traiterParis(List paris, ResultatCourse resultat) { + private void traiterParis(List paris, ResultatCourseJumeleOrdre resultat) { boolean aDeadHeat = resultat.getChevauxDeadHeat() != null && !resultat.getChevauxDeadHeat().isEmpty(); - for (Paris p : paris) { + for (ParisJumeleOrdre p : paris) { // Vérification des non-partants (Article 4) if (p.getPremier().isNonPartant() || p.getDeuxieme().isNonPartant()) { - p.setStatut(Paris.StatutParis.REMBOURSE); + p.setStatut(ParisJumeleOrdre.StatutParis.REMBOURSE); p.setGains(p.getMise()); parisRepository.save(p); continue; @@ -107,11 +108,11 @@ public class ResultatCourseService { // Vérification des paris gagnants if (estParisGagnant(p, resultat, aDeadHeat)) { - p.setStatut(Paris.StatutParis.GAGNANT); + p.setStatut(ParisJumeleOrdre.StatutParis.GAGNANT); double gains = calculerGains(p, resultat); p.setGains(gains); } else { - p.setStatut(Paris.StatutParis.PERDANT); + p.setStatut(ParisJumeleOrdre.StatutParis.PERDANT); p.setGains(0.0); } @@ -119,7 +120,7 @@ public class ResultatCourseService { } } - private boolean estParisGagnant(Paris paris, ResultatCourse resultat, boolean aDeadHeat) { + private boolean estParisGagnant(ParisJumeleOrdre paris, ResultatCourseJumeleOrdre resultat, boolean aDeadHeat) { if (aDeadHeat) { return estParisGagnantAvecDeadHeat(paris, resultat); } else { @@ -129,7 +130,7 @@ public class ResultatCourseService { } } - private boolean estParisGagnantAvecDeadHeat(Paris paris, ResultatCourse resultat) { + private boolean estParisGagnantAvecDeadHeat(ParisJumeleOrdre paris, ResultatCourseJumeleOrdre resultat) { // Implémentation pour les cas de dead heat (Article 3) List chevauxDeadHeat = resultat.getChevauxDeadHeat(); @@ -145,7 +146,7 @@ public class ResultatCourseService { return false; } - private double calculerGains(Paris paris, ResultatCourse resultat) { + private double calculerGains(ParisJumeleOrdre paris, ResultatCourseJumeleOrdre resultat) { // Calcul simplifié - implémenter la logique complète basée sur les Articles 5, 8, 9 double gainsBase = paris.getMise() * 5.0; // Exemple de ratio de gains return Math.max(gainsBase, paris.getMise() * 1.1); // Minimum 1.1 par unité (Article 5d) diff --git a/src/main/java/com/pmumali/ch5_trio/controller/ParisTrioController.java b/src/main/java/com/pmumali/ch5_trio/controller/ParisTrioController.java index 81b6ff9..618f795 100644 --- a/src/main/java/com/pmumali/ch5_trio/controller/ParisTrioController.java +++ b/src/main/java/com/pmumali/ch5_trio/controller/ParisTrioController.java @@ -8,12 +8,12 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/api/paris-trio") +@RequestMapping("/api/trio") public class ParisTrioController { @Autowired private ParisTrioService parisTrioService; - @PostMapping + @PostMapping("/pari") public ResponseEntity enregistrerParis(@RequestBody ParisTrioDto parisDto) { try { ParisTrio paris = parisTrioService.enregistrerParis(parisDto); diff --git a/src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseController.java b/src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseTrioController.java similarity index 73% rename from src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseController.java rename to src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseTrioController.java index e84b327..f1222ca 100644 --- a/src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseController.java +++ b/src/main/java/com/pmumali/ch5_trio/controller/ResultatCourseTrioController.java @@ -1,18 +1,18 @@ package com.pmumali.ch5_trio.controller; import com.pmumali.ch5_trio.dto.ResultatCourseDto; -import com.pmumali.ch5_trio.service.ResultatCourseService; +import com.pmumali.ch5_trio.service.ResultatCourseTrioService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/api/resultats") -public class ResultatCourseController { +@RequestMapping("/api/trio/resultats") +public class ResultatCourseTrioController { @Autowired - private ResultatCourseService resultatCourseService; + private ResultatCourseTrioService resultatCourseService; - @PostMapping + // @PostMapping public ResponseEntity enregistrerResultat(@RequestBody ResultatCourseDto resultatDto) { try { resultatCourseService.traiterResultatCourse(resultatDto); diff --git a/src/main/java/com/pmumali/ch5_trio/model/Cagnotte.java b/src/main/java/com/pmumali/ch5_trio/model/CagnotteTrio.java similarity index 87% rename from src/main/java/com/pmumali/ch5_trio/model/Cagnotte.java rename to src/main/java/com/pmumali/ch5_trio/model/CagnotteTrio.java index 7b35f7e..5e7dd99 100644 --- a/src/main/java/com/pmumali/ch5_trio/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch5_trio/model/CagnotteTrio.java @@ -8,7 +8,7 @@ import java.time.LocalDateTime; @Entity @Data @Table(name = "cagnottes") -public class Cagnotte { +public class CagnotteTrio { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -27,17 +27,17 @@ public class Cagnotte { @ManyToOne @JoinColumn(name = "course_source_id") - private Course courseSource; + private CourseTrio courseSource; @ManyToOne @JoinColumn(name = "course_destination_id") - private Course courseDestination; + private CourseTrio courseDestination; @Column(length = 500) private String description; // Méthodes utilitaires - public void marquerCommeUtilisee(Course courseDestination) { + public void marquerCommeUtilisee(CourseTrio courseDestination) { this.utilisee = true; this.courseDestination = courseDestination; this.dateUtilisation = LocalDateTime.now(); diff --git a/src/main/java/com/pmumali/ch5_trio/model/Cheval.java b/src/main/java/com/pmumali/ch5_trio/model/ChevalTrio.java similarity index 59% rename from src/main/java/com/pmumali/ch5_trio/model/Cheval.java rename to src/main/java/com/pmumali/ch5_trio/model/ChevalTrio.java index 8035aea..ee603fa 100644 --- a/src/main/java/com/pmumali/ch5_trio/model/Cheval.java +++ b/src/main/java/com/pmumali/ch5_trio/model/ChevalTrio.java @@ -5,13 +5,17 @@ import lombok.Data; @Entity @Data -public class Cheval { +@Table(name = "cheval") +public class ChevalTrio { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; + private int numero; + @Column(name = "non_partant") private boolean nonPartant; @ManyToOne - private Course course; + @JoinColumn(name = "course_id") + private CourseTrio course; } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/model/Course.java b/src/main/java/com/pmumali/ch5_trio/model/CourseTrio.java similarity index 70% rename from src/main/java/com/pmumali/ch5_trio/model/Course.java rename to src/main/java/com/pmumali/ch5_trio/model/CourseTrio.java index 56db2fe..4d08afc 100644 --- a/src/main/java/com/pmumali/ch5_trio/model/Course.java +++ b/src/main/java/com/pmumali/ch5_trio/model/CourseTrio.java @@ -8,15 +8,17 @@ import java.util.List; @Entity @Data -public class Course { +@Table(name = "course") +public class CourseTrio { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; - private LocalDateTime heureDebut; + @Column(name = "heure_course") + private LocalDateTime heureCourse; @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/ch5_trio/model/ParisTrio.java b/src/main/java/com/pmumali/ch5_trio/model/ParisTrio.java index 95a945c..874669f 100644 --- a/src/main/java/com/pmumali/ch5_trio/model/ParisTrio.java +++ b/src/main/java/com/pmumali/ch5_trio/model/ParisTrio.java @@ -13,16 +13,16 @@ public class ParisTrio { private Long id; @ManyToOne - private Course course; + private CourseTrio course; @ManyToOne - private Cheval cheval1; + private ChevalTrio cheval1; @ManyToOne - private Cheval cheval2; + private ChevalTrio cheval2; @ManyToOne - private Cheval cheval3; + private ChevalTrio cheval3; private double mise; private LocalDateTime dateParis; diff --git a/src/main/java/com/pmumali/ch5_trio/model/ResultatCourse.java b/src/main/java/com/pmumali/ch5_trio/model/ResultatCourseTrio.java similarity index 63% rename from src/main/java/com/pmumali/ch5_trio/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch5_trio/model/ResultatCourseTrio.java index 4be0474..ce368ec 100644 --- a/src/main/java/com/pmumali/ch5_trio/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch5_trio/model/ResultatCourseTrio.java @@ -7,22 +7,23 @@ import java.util.List; @Entity @Data -public class ResultatCourse { +@Table(name = "resultat_course") +public class ResultatCourseTrio { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne - private Course course; + private CourseTrio course; @ManyToOne - private Cheval premier; + private ChevalTrio premier; @ManyToOne - private Cheval deuxieme; + private ChevalTrio deuxieme; @ManyToOne - private Cheval troisieme; + private ChevalTrio troisieme; @ElementCollection private List chevauxDeadHeatPremierePlace; @@ -33,9 +34,14 @@ public class ResultatCourse { @ElementCollection private List chevauxDeadHeatTroisiemePlace; + @Column(name = "total_mises") private double totalMises; + @Column(name = "masse_apartager") private double masseAPartager; + @Column(name = "prelevements_legaux") private double prelevementsLegaux; + @Column(name = "montant_rembourse") private double montantRembourse; + @Column(name = "montant_cagnotte") private double montantCagnotte; } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/CagnotteRepository.java deleted file mode 100644 index 584ffbc..0000000 --- a/src/main/java/com/pmumali/ch5_trio/repository/CagnotteRepository.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pmumali.ch5_trio.repository; - -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; - -import java.time.LocalDateTime; -import java.util.List; - -@Repository -public interface CagnotteRepository extends JpaRepository { - - List findByUtiliseeFalse(); - - @Query("SELECT c FROM Cagnotte c WHERE c.utilisee = false AND " + - "c.dateCreation >= :dateDebut AND c.dateCreation <= :dateFin") - List findCagnottesDisponiblesEntreDates(LocalDateTime dateDebut, LocalDateTime dateFin); - - @Query("SELECT SUM(c.montant) FROM Cagnotte c WHERE c.utilisee = false") - Double getMontantTotalCagnotteDisponible(); - - @Query("SELECT c FROM Cagnotte c WHERE c.courseSource = :course") - Cagnotte findByCourseSource(Course course); - - @Query("UPDATE Cagnotte c SET c.utilisee = true WHERE c.id = :id") - void marquerCommeUtilisee(Long id); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/CagnotteTrioRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/CagnotteTrioRepository.java new file mode 100644 index 0000000..3d29c45 --- /dev/null +++ b/src/main/java/com/pmumali/ch5_trio/repository/CagnotteTrioRepository.java @@ -0,0 +1,29 @@ +package com.pmumali.ch5_trio.repository; + +import com.pmumali.ch5_trio.model.CagnotteTrio; +import com.pmumali.ch5_trio.model.CourseTrio; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; + +@Repository +public interface CagnotteTrioRepository extends JpaRepository { + + List findByUtiliseeFalse(); + + @Query("SELECT c FROM CagnotteTrio c WHERE c.utilisee = false AND " + + "c.dateCreation >= :dateDebut AND c.dateCreation <= :dateFin") + List findCagnottesDisponiblesEntreDates(LocalDateTime dateDebut, LocalDateTime dateFin); + + @Query("SELECT SUM(c.montant) FROM CagnotteTrio c WHERE c.utilisee = false") + Double getMontantTotalCagnotteDisponible(); + + @Query("SELECT c FROM CagnotteTrio c WHERE c.courseSource = :course") + CagnotteTrio findByCourseSource(CourseTrio course); + + @Query("UPDATE CagnotteTrio c SET c.utilisee = true WHERE c.id = :id") + void marquerCommeUtilisee(Long id); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/ChevalRepository.java deleted file mode 100644 index 27f993f..0000000 --- a/src/main/java/com/pmumali/ch5_trio/repository/ChevalRepository.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pmumali.ch5_trio.repository; - -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; - -import java.util.List; - -@Repository -public interface ChevalRepository extends JpaRepository { - - List findByCourse(Course course); - - List findByCourseAndNonPartantFalse(Course course); - - List findByNonPartantTrue(); - - @Query("SELECT c FROM Cheval c WHERE c.course = :course AND " + - "(c.nom LIKE %:nom% OR c.id = :id)") - List findByCourseAndNomOrId(Course course, String nom, Long id); - - long countByCourse(Course course); - - boolean existsByNomAndCourse(String nom, Course course); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/ChevalTrioRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/ChevalTrioRepository.java new file mode 100644 index 0000000..c018ebc --- /dev/null +++ b/src/main/java/com/pmumali/ch5_trio/repository/ChevalTrioRepository.java @@ -0,0 +1,27 @@ +package com.pmumali.ch5_trio.repository; + +import com.pmumali.ch5_trio.model.ChevalTrio; +import com.pmumali.ch5_trio.model.CourseTrio; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ChevalTrioRepository extends JpaRepository { + + List findByCourse(CourseTrio course); + + List findByCourseAndNonPartantFalse(CourseTrio course); + + List findByNonPartantTrue(); + + @Query("SELECT c FROM ChevalTrio c WHERE c.course = :course AND " + + "(c.nom LIKE %:nom% OR c.id = :id)") + List findByCourseAndNomOrId(CourseTrio course, String nom, Long id); + + long countByCourse(CourseTrio course); + + boolean existsByNomAndCourse(String nom, CourseTrio course); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/CourseRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/CourseRepository.java deleted file mode 100644 index 0db5f69..0000000 --- a/src/main/java/com/pmumali/ch5_trio/repository/CourseRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pmumali.ch5_trio.repository; - -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; - -import java.time.LocalDateTime; -import java.util.List; - -@Repository -public interface CourseRepository extends JpaRepository { - - List findByEstTermineeFalse(); - - List findByHeureDebutAfter(LocalDateTime date); - - List findByHeureDebutBetween(LocalDateTime start, LocalDateTime end); - - @Query("SELECT c FROM Course c WHERE c.isTerminee = false AND SIZE(c.chevaux) BETWEEN 3 AND 7") - List findCoursesEligiblesPourTrio(); - - boolean existsByNomAndHeureDebut(String nom, LocalDateTime heureDebut); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/CourseTrioRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/CourseTrioRepository.java new file mode 100644 index 0000000..9983477 --- /dev/null +++ b/src/main/java/com/pmumali/ch5_trio/repository/CourseTrioRepository.java @@ -0,0 +1,24 @@ +package com.pmumali.ch5_trio.repository; + +import com.pmumali.ch5_trio.model.CourseTrio; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; + +@Repository +public interface CourseTrioRepository extends JpaRepository { + + List findByEstTermineeFalse(); + + List findByHeureCourseAfter(LocalDateTime date); + + List findByHeureCourseBetween(LocalDateTime start, LocalDateTime end); + + @Query("SELECT c FROM CourseTrio c WHERE c.estTerminee = false AND SIZE(c.chevaux) BETWEEN 3 AND 7") + List findCoursesEligiblesPourTrio(); + + boolean existsByNomAndHeureCourse(String nom, LocalDateTime heureDebut); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/ParisTrioRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/ParisTrioRepository.java index 493cd81..ba13a02 100644 --- a/src/main/java/com/pmumali/ch5_trio/repository/ParisTrioRepository.java +++ b/src/main/java/com/pmumali/ch5_trio/repository/ParisTrioRepository.java @@ -1,7 +1,7 @@ package com.pmumali.ch5_trio.repository; -import com.pmumali.ch5_trio.model.Course; -import com.pmumali.ch5_trio.model.Cheval; +import com.pmumali.ch5_trio.model.CourseTrio; +import com.pmumali.ch5_trio.model.ChevalTrio; import com.pmumali.ch5_trio.model.ParisTrio; import com.pmumali.ch5_trio.model.ParisTrio.StatutParis; import org.springframework.data.jpa.repository.JpaRepository; @@ -13,9 +13,9 @@ import java.util.List; @Repository public interface ParisTrioRepository extends JpaRepository { - List findByCourse(Course course); + List findByCourse(CourseTrio course); - List findByCourseAndStatut(Course course, StatutParis statut); + List findByCourseAndStatut(CourseTrio course, StatutParis statut); List findByIdParieur(String idParieur); @@ -26,19 +26,19 @@ public interface ParisTrioRepository extends JpaRepository { "(p.cheval1 = :cheval2 AND p.cheval2 = :cheval3 AND p.cheval3 = :cheval1) OR " + "(p.cheval1 = :cheval3 AND p.cheval2 = :cheval1 AND p.cheval3 = :cheval2) OR " + "(p.cheval1 = :cheval3 AND p.cheval2 = :cheval2 AND p.cheval3 = :cheval1))") - List findByCourseAndChevalCombinaison(Course course, Cheval cheval1, Cheval cheval2, Cheval cheval3); + List findByCourseAndChevalCombinaison(CourseTrio course, ChevalTrio cheval1, ChevalTrio cheval2, ChevalTrio cheval3); @Query("SELECT p FROM ParisTrio p WHERE p.course = :course AND " + "p.statut = :statut AND (" + "(p.cheval1.nonPartant = true AND p.cheval2.nonPartant = true) OR " + "(p.cheval1.nonPartant = true AND p.cheval3.nonPartant = true) OR " + "(p.cheval2.nonPartant = true AND p.cheval3.nonPartant = true))") - List findByCourseAndStatutAndTwoNonPartants(Course course, StatutParis statut); + List findByCourseAndStatutAndTwoNonPartants(CourseTrio course, StatutParis statut); @Query("SELECT p FROM ParisTrio p WHERE p.course = :course AND " + "p.statut = :statut AND " + "(p.cheval1.nonPartant = true OR p.cheval2.nonPartant = true OR p.cheval3.nonPartant = true)") - List findByCourseAndStatutAndAnyNonPartant(Course course, StatutParis statut); + List findByCourseAndStatutAndAnyNonPartant(CourseTrio course, StatutParis statut); - long countByCourseAndStatut(Course course, StatutParis statut); + long countByCourseAndStatut(CourseTrio course, StatutParis statut); } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseRepository.java deleted file mode 100644 index 9d84ea4..0000000 --- a/src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pmumali.ch5_trio.repository; - -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; - -import java.util.List; - -@Repository -public interface ResultatCourseRepository extends JpaRepository { - - ResultatCourse findByCourse(Course course); - - @Query("SELECT r FROM ResultatCourse r WHERE r.course = :course AND " + - "(SIZE(r.chevauxDeadHeatPremierePlace) > 0 OR " + - "SIZE(r.chevauxDeadHeatDeuxiemePlace) > 0 OR " + - "SIZE(r.chevauxDeadHeatTroisiemePlace) > 0)") - List findCoursesAvecDeadHeat(Course course); - - @Query("SELECT SUM(r.montantCagnotte) FROM ResultatCourse r WHERE r.montantCagnotte > 0") - Double getTotalCagnotteDisponible(); - - boolean existsByCourse(Course course); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseTrioRepository.java b/src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseTrioRepository.java new file mode 100644 index 0000000..3137da6 --- /dev/null +++ b/src/main/java/com/pmumali/ch5_trio/repository/ResultatCourseTrioRepository.java @@ -0,0 +1,26 @@ +package com.pmumali.ch5_trio.repository; + +import com.pmumali.ch5_trio.model.CourseTrio; +import com.pmumali.ch5_trio.model.ResultatCourseTrio; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ResultatCourseTrioRepository extends JpaRepository { + + ResultatCourseTrio findByCourse(CourseTrio course); + + @Query("SELECT r FROM ResultatCourseTrio r WHERE r.course = :course AND " + + "(SIZE(r.chevauxDeadHeatPremierePlace) > 0 OR " + + "SIZE(r.chevauxDeadHeatDeuxiemePlace) > 0 OR " + + "SIZE(r.chevauxDeadHeatTroisiemePlace) > 0)") + List findCoursesAvecDeadHeat(CourseTrio course); + + @Query("SELECT SUM(r.montantCagnotte) FROM ResultatCourseTrio r WHERE r.montantCagnotte > 0") + Double getTotalCagnotteDisponible(); + + boolean existsByCourse(CourseTrio course); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch5_trio/service/ParisTrioService.java b/src/main/java/com/pmumali/ch5_trio/service/ParisTrioService.java index 1d34df3..b446a0f 100644 --- a/src/main/java/com/pmumali/ch5_trio/service/ParisTrioService.java +++ b/src/main/java/com/pmumali/ch5_trio/service/ParisTrioService.java @@ -19,14 +19,14 @@ public class ParisTrioService { @Autowired private ParisTrioRepository parisTrioRepository; @Autowired - private CourseRepository courseRepository; + private CourseTrioRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalTrioRepository chevalRepository; @Transactional public ParisTrio enregistrerParis(ParisTrioDto parisDto) throws ParisInvalideException { // Validation de la course - Course course = courseRepository.findById(parisDto.getIdCourse()) + CourseTrio course = courseRepository.findById(parisDto.getIdCourse()) .orElseThrow(() -> new CourseInvalideException("Course non trouvée")); if (course.isEstTerminee()) { @@ -34,11 +34,11 @@ public class ParisTrioService { } // Validation des chevaux - Cheval cheval1 = chevalRepository.findById(parisDto.getIdCheval1()) + ChevalTrio cheval1 = chevalRepository.findById(parisDto.getIdCheval1()) .orElseThrow(() -> new ChevalInvalideException("Cheval 1 non trouvé")); - Cheval cheval2 = chevalRepository.findById(parisDto.getIdCheval2()) + ChevalTrio cheval2 = chevalRepository.findById(parisDto.getIdCheval2()) .orElseThrow(() -> new ChevalInvalideException("Cheval 2 non trouvé")); - Cheval cheval3 = chevalRepository.findById(parisDto.getIdCheval3()) + ChevalTrio cheval3 = chevalRepository.findById(parisDto.getIdCheval3()) .orElseThrow(() -> new ChevalInvalideException("Cheval 3 non trouvé")); // Vérification des doublons diff --git a/src/main/java/com/pmumali/ch5_trio/service/ResultatCourseService.java b/src/main/java/com/pmumali/ch5_trio/service/ResultatCourseTrioService.java similarity index 84% rename from src/main/java/com/pmumali/ch5_trio/service/ResultatCourseService.java rename to src/main/java/com/pmumali/ch5_trio/service/ResultatCourseTrioService.java index fb22cb2..c69b0fd 100644 --- a/src/main/java/com/pmumali/ch5_trio/service/ResultatCourseService.java +++ b/src/main/java/com/pmumali/ch5_trio/service/ResultatCourseTrioService.java @@ -13,16 +13,16 @@ import java.util.List; import java.util.stream.Collectors; @Service -public class ResultatCourseService { - @Autowired private CourseRepository courseRepository; - @Autowired private ChevalRepository chevalRepository; +public class ResultatCourseTrioService { + @Autowired private CourseTrioRepository courseRepository; + @Autowired private ChevalTrioRepository chevalRepository; @Autowired private ParisTrioRepository parisTrioRepository; - @Autowired private ResultatCourseRepository resultatCourseRepository; - @Autowired private CagnotteRepository cagnotteRepository; + @Autowired private ResultatCourseTrioRepository resultatCourseRepository; + @Autowired private CagnotteTrioRepository cagnotteRepository; @Transactional public void traiterResultatCourse(ResultatCourseDto resultatDto) throws ResultatCourseInvalideException { - Course course = courseRepository.findById(resultatDto.getIdCourse()) + CourseTrio course = courseRepository.findById(resultatDto.getIdCourse()) .orElseThrow(() -> new ResultatCourseInvalideException("Course non trouvée")); if (course.isEstTerminee()) { @@ -30,12 +30,12 @@ public class ResultatCourseService { } // Validation des chevaux - Cheval premier = validerCheval(resultatDto.getIdChevalPremier(), "premier"); - Cheval deuxieme = validerCheval(resultatDto.getIdChevalDeuxieme(), "deuxième"); - Cheval troisieme = validerCheval(resultatDto.getIdChevalTroisieme(), "troisième"); + ChevalTrio premier = validerCheval(resultatDto.getIdChevalPremier(), "premier"); + ChevalTrio deuxieme = validerCheval(resultatDto.getIdChevalDeuxieme(), "deuxième"); + ChevalTrio troisieme = validerCheval(resultatDto.getIdChevalTroisieme(), "troisième"); // Enregistrement du résultat - ResultatCourse resultat = new ResultatCourse(); + ResultatCourseTrio resultat = new ResultatCourseTrio(); resultat.setCourse(course); resultat.setPremier(premier); resultat.setDeuxieme(deuxieme); @@ -61,7 +61,7 @@ public class ResultatCourseService { // Gestion de la cagnotte si nécessaire if (resultat.getMontantCagnotte() > 0) { - Cagnotte cagnotte = new Cagnotte(); + CagnotteTrio cagnotte = new CagnotteTrio(); cagnotte.setMontant(resultat.getMontantCagnotte()); cagnotte.setDateCreation(LocalDateTime.now()); cagnotte.setCourseSource(course); @@ -75,7 +75,7 @@ public class ResultatCourseService { resultatCourseRepository.save(resultat); } - private Cheval validerCheval(Long idCheval, String position) throws ResultatCourseInvalideException { + private ChevalTrio validerCheval(Long idCheval, String position) throws ResultatCourseInvalideException { if (idCheval == null) { throw new ResultatCourseInvalideException("Cheval " + position + " non spécifié"); } @@ -97,7 +97,7 @@ public class ResultatCourseService { .sum(); } - private void traiterParis(List paris, ResultatCourse resultat) { + private void traiterParis(List paris, ResultatCourseTrio resultat) { boolean deadHeatPremiere = !resultat.getChevauxDeadHeatPremierePlace().isEmpty(); boolean deadHeatDeuxieme = !resultat.getChevauxDeadHeatDeuxiemePlace().isEmpty(); boolean deadHeatTroisieme = !resultat.getChevauxDeadHeatTroisiemePlace().isEmpty(); @@ -120,7 +120,7 @@ public class ResultatCourseService { } } - private void traiterParisAvecNonPartants(ParisTrio paris, ResultatCourse resultat) { + private void traiterParisAvecNonPartants(ParisTrio paris, ResultatCourseTrio resultat) { int nbNonPartants = compterNonPartants(paris); if (nbNonPartants == 3) { @@ -145,19 +145,19 @@ public class ResultatCourseService { } } - private boolean estSpecialGagnant(ParisTrio paris, ResultatCourse resultat) { - Cheval chevalPartant = paris.getCheval1().isNonPartant() ? + private boolean estSpecialGagnant(ParisTrio paris, ResultatCourseTrio resultat) { + ChevalTrio chevalPartant = paris.getCheval1().isNonPartant() ? (paris.getCheval2().isNonPartant() ? paris.getCheval3() : paris.getCheval2()) : paris.getCheval1(); return chevalPartant.equals(resultat.getPremier()); } - private boolean estSpecialJumele(ParisTrio paris, ResultatCourse resultat) { - Cheval nonPartant = paris.getCheval1().isNonPartant() ? paris.getCheval1() : + private boolean estSpecialJumele(ParisTrio paris, ResultatCourseTrio resultat) { + ChevalTrio nonPartant = paris.getCheval1().isNonPartant() ? paris.getCheval1() : (paris.getCheval2().isNonPartant() ? paris.getCheval2() : paris.getCheval3()); - List chevauxPartants = List.of(paris.getCheval1(), paris.getCheval2(), paris.getCheval3()) + List chevauxPartants = List.of(paris.getCheval1(), paris.getCheval2(), paris.getCheval3()) .stream() .filter(c -> !c.equals(nonPartant)) .collect(Collectors.toList()); @@ -166,14 +166,14 @@ public class ResultatCourseService { chevauxPartants.contains(resultat.getDeuxieme())); } - private boolean estParisGagnant(ParisTrio paris, ResultatCourse resultat, + private boolean estParisGagnant(ParisTrio paris, ResultatCourseTrio resultat, boolean deadHeatPremiere, boolean deadHeatDeuxieme, boolean deadHeatTroisieme) { // Implémentation complexe des règles de dead heat selon l'article 3 // ... (logique similaire à celle vue précédemment mais adaptée pour 3 chevaux) return false; } - private double calculerGains(ParisTrio paris, ResultatCourse resultat) { + private double calculerGains(ParisTrio paris, ResultatCourseTrio resultat) { // Calcul des gains selon les règles spécifiques return Math.max(paris.getMise() * 1.1, paris.getMise() * 5.0); // Minimum 1.1 } diff --git a/src/main/java/com/pmumali/ch6_trioordre/controller/ParisTrioOrdreController.java b/src/main/java/com/pmumali/ch6_trioordre/controller/ParisTrioOrdreController.java index 5fbc73a..6b63023 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/controller/ParisTrioOrdreController.java +++ b/src/main/java/com/pmumali/ch6_trioordre/controller/ParisTrioOrdreController.java @@ -8,12 +8,12 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/api/paris-trio-ordre") +@RequestMapping("/api/trioordre") public class ParisTrioOrdreController { @Autowired private ParisTrioOrdreService parisService; - @PostMapping + @PostMapping("/pari") public ResponseEntity enregistrerParis(@RequestBody ParisTrioOrdreDto parisDto) { try { ParisTrioOrdre paris = parisService.enregistrerParis(parisDto); diff --git a/src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseController.java b/src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseTrioOrdreController.java similarity index 72% rename from src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseController.java rename to src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseTrioOrdreController.java index 64cf28f..8120f4c 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseController.java +++ b/src/main/java/com/pmumali/ch6_trioordre/controller/ResultatCourseTrioOrdreController.java @@ -1,18 +1,18 @@ package com.pmumali.ch6_trioordre.controller; import com.pmumali.ch6_trioordre.dto.ResultatCourseDto; -import com.pmumali.ch6_trioordre.service.ResultatCourseService; +import com.pmumali.ch6_trioordre.service.ResultatCourseTrioOrdreService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/api/resultats") -public class ResultatCourseController { +@RequestMapping("/api/trioordre") +public class ResultatCourseTrioOrdreController { @Autowired - private ResultatCourseService resultatService; + private ResultatCourseTrioOrdreService resultatService; - @PostMapping + @PostMapping("/resultat") public ResponseEntity enregistrerResultat(@RequestBody ResultatCourseDto resultatDto) { try { resultatService.traiterResultatCourse(resultatDto); diff --git a/src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandler.java b/src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandlerCh6.java similarity index 98% rename from src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandler.java rename to src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandlerCh6.java index 8ef8c33..2d599a7 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/pmumali/ch6_trioordre/exception/GlobalExceptionHandlerCh6.java @@ -11,7 +11,7 @@ import java.util.LinkedHashMap; import java.util.Map; @ControllerAdvice -public class GlobalExceptionHandler { +public class GlobalExceptionHandlerCh6 { private static final String TIMESTAMP = "timestamp"; private static final String MESSAGE = "message"; diff --git a/src/main/java/com/pmumali/ch6_trioordre/model/Cagnotte.java b/src/main/java/com/pmumali/ch6_trioordre/model/CagnotteTrioOrdre.java similarity index 74% rename from src/main/java/com/pmumali/ch6_trioordre/model/Cagnotte.java rename to src/main/java/com/pmumali/ch6_trioordre/model/CagnotteTrioOrdre.java index 28aa4fe..67c0413 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/CagnotteTrioOrdre.java @@ -7,7 +7,7 @@ import java.time.LocalDateTime; @Entity @Data -public class Cagnotte { +public class CagnotteTrioOrdre { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -18,12 +18,12 @@ public class Cagnotte { private boolean utilisee = false; @ManyToOne - private Course courseSource; + private CourseTrioOrdre courseSource; @ManyToOne - private Course courseDestination; + private CourseTrioOrdre courseDestination; - public void utiliserPourCourse(Course course) { + public void utiliserPourCourse(CourseTrioOrdre course) { this.utilisee = true; this.courseDestination = course; this.dateUtilisation = LocalDateTime.now(); diff --git a/src/main/java/com/pmumali/ch6_trioordre/model/Cheval.java b/src/main/java/com/pmumali/ch6_trioordre/model/ChevalTrioOrdre.java similarity index 58% rename from src/main/java/com/pmumali/ch6_trioordre/model/Cheval.java rename to src/main/java/com/pmumali/ch6_trioordre/model/ChevalTrioOrdre.java index 3056844..21b3c9d 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/model/Cheval.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/ChevalTrioOrdre.java @@ -5,13 +5,17 @@ import lombok.Data; @Entity @Data -public class Cheval { +@Table(name = "cheval") +public class ChevalTrioOrdre { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; + private int numero; + @Column(name = "non_partant") private boolean nonPartant; @ManyToOne - private Course course; + @JoinColumn(name = "course_id") + private CourseTrioOrdre course; } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch6_trioordre/model/Course.java b/src/main/java/com/pmumali/ch6_trioordre/model/CourseTrioOrdre.java similarity index 75% rename from src/main/java/com/pmumali/ch6_trioordre/model/Course.java rename to src/main/java/com/pmumali/ch6_trioordre/model/CourseTrioOrdre.java index 50a0417..97378a9 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/model/Course.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/CourseTrioOrdre.java @@ -8,15 +8,17 @@ import java.util.List; @Entity @Data -public class Course { +@Table(name = "course") +public class CourseTrioOrdre { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; - private LocalDateTime heureDebut; + @Column(name = "heure_course") + private LocalDateTime heureCourse; @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List chevaux; + private List chevaux; private boolean estTerminee; private boolean aDeadHeat; diff --git a/src/main/java/com/pmumali/ch6_trioordre/model/ParisTrioOrdre.java b/src/main/java/com/pmumali/ch6_trioordre/model/ParisTrioOrdre.java index f0a5731..082d42a 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/model/ParisTrioOrdre.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/ParisTrioOrdre.java @@ -13,16 +13,16 @@ public class ParisTrioOrdre { private Long id; @ManyToOne - private Course course; + private CourseTrioOrdre course; @ManyToOne - private Cheval premier; + private ChevalTrioOrdre premier; @ManyToOne - private Cheval deuxieme; + private ChevalTrioOrdre deuxieme; @ManyToOne - private Cheval troisieme; + private ChevalTrioOrdre troisieme; private double mise; private LocalDateTime dateParis; diff --git a/src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourse.java b/src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourseTrioOrdre.java similarity index 68% rename from src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourseTrioOrdre.java index cf8762c..6cf5e92 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch6_trioordre/model/ResultatCourseTrioOrdre.java @@ -7,22 +7,23 @@ import java.util.List; @Entity @Data -public class ResultatCourse { +@Table(name = "resultat_course") +public class ResultatCourseTrioOrdre { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne - private Course course; + private CourseTrioOrdre course; @ManyToOne - private Cheval premier; + private ChevalTrioOrdre premier; @ManyToOne - private Cheval deuxieme; + private ChevalTrioOrdre deuxieme; @ManyToOne - private Cheval troisieme; + private ChevalTrioOrdre troisieme; @ElementCollection private List chevauxDeadHeatPremierePlace; @@ -33,10 +34,15 @@ public class ResultatCourse { @ElementCollection private List chevauxDeadHeatTroisiemePlace; + @Column(name = "total_mises") private double totalMises; + @Column(name = "masse_apartager") private double masseAPartager; + @Column(name = "prelevements_legaux") private double prelevementsLegaux; + @Column(name = "montant_rembourse") private double montantRembourse; + @Column(name = "montant_cagnotte") private double montantCagnotte; public boolean hasDeadHeat() { diff --git a/src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteRepository.java deleted file mode 100644 index 13a5837..0000000 --- a/src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pmumali.ch6_trioordre.repository; - -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; - -import java.util.List; - -@Repository -public interface CagnotteRepository extends JpaRepository { - List findByUtiliseeFalse(); - List findByCourseSource(Course course); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteTrioOrdreRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteTrioOrdreRepository.java new file mode 100644 index 0000000..1151f3d --- /dev/null +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/CagnotteTrioOrdreRepository.java @@ -0,0 +1,14 @@ +package com.pmumali.ch6_trioordre.repository; + +import com.pmumali.ch6_trioordre.model.CagnotteTrioOrdre; +import com.pmumali.ch6_trioordre.model.CourseTrioOrdre; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CagnotteTrioOrdreRepository extends JpaRepository { + List findByUtiliseeFalse(); + List findByCourseSource(CourseTrioOrdre course); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch6_trioordre/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/ChevalRepository.java deleted file mode 100644 index ca88d7b..0000000 --- a/src/main/java/com/pmumali/ch6_trioordre/repository/ChevalRepository.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.pmumali.ch6_trioordre.repository; - -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; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface ChevalRepository extends JpaRepository { - - // Trouver tous les chevaux d'une course - List findByCourse(Course course); - - // Trouver les chevaux partants d'une course - List findByCourseAndNonPartantFalse(Course course); - - // Trouver les chevaux non-partants d'une course - List findByCourseAndNonPartantTrue(Course course); - - // Trouver un cheval par son nom dans une course - Optional findByNomAndCourse(String nom, Course course); - - // Vérifier si un cheval est utilisé dans des paris - @Query("SELECT CASE WHEN COUNT(p) > 0 THEN true ELSE false END " + - "FROM ParisTrioOrdre p WHERE " + - "p.premier = :cheval OR p.deuxieme = :cheval OR p.troisieme = :cheval") - boolean isChevalUtiliseDansParis(Cheval cheval); - - // Trouver les chevaux gagnants (première place) - @Query("SELECT r.premier FROM ResultatCourse r WHERE r.course = :course") - Optional findChevalPremierByCourse(Course course); - - // Trouver les chevaux deuxièmes - @Query("SELECT r.deuxieme FROM ResultatCourse r WHERE r.course = :course") - Optional findChevalDeuxiemeByCourse(Course course); - - // Trouver les chevaux troisièmes - @Query("SELECT r.troisieme FROM ResultatCourse r WHERE r.course = :course") - Optional findChevalTroisiemeByCourse(Course course); - - // Trouver les chevaux en dead-heat pour une course - @Query("SELECT c FROM Cheval c WHERE c.course = :course AND " + - "(c.id IN (SELECT rd.chevauxDeadHeatPremierePlace FROM ResultatCourse rd WHERE rd.course = :course) OR " + - "c.id IN (SELECT rd.chevauxDeadHeatDeuxiemePlace FROM ResultatCourse rd WHERE rd.course = :course) OR " + - "c.id IN (SELECT rd.chevauxDeadHeatTroisiemePlace FROM ResultatCourse rd WHERE rd.course = :course))") - List findChevauxDeadHeatByCourse(Course course); - - // Compter les chevaux partants par course - long countByCourseAndNonPartantFalse(Course course); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch6_trioordre/repository/ChevalTrioOrdreRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/ChevalTrioOrdreRepository.java new file mode 100644 index 0000000..b141b5f --- /dev/null +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/ChevalTrioOrdreRepository.java @@ -0,0 +1,54 @@ +package com.pmumali.ch6_trioordre.repository; + +import com.pmumali.ch6_trioordre.model.ChevalTrioOrdre; +import com.pmumali.ch6_trioordre.model.CourseTrioOrdre; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface ChevalTrioOrdreRepository extends JpaRepository { + + // Trouver tous les chevaux d'une course + List findByCourse(CourseTrioOrdre course); + + // Trouver les chevaux partants d'une course + List findByCourseAndNonPartantFalse(CourseTrioOrdre course); + + // Trouver les chevaux non-partants d'une course + List findByCourseAndNonPartantTrue(CourseTrioOrdre course); + + // Trouver un cheval par son nom dans une course + Optional findByNomAndCourse(String nom, CourseTrioOrdre course); + + // Vérifier si un cheval est utilisé dans des paris + @Query("SELECT CASE WHEN COUNT(p) > 0 THEN true ELSE false END " + + "FROM ParisTrioOrdre p WHERE " + + "p.premier = :cheval OR p.deuxieme = :cheval OR p.troisieme = :cheval") + boolean isChevalUtiliseDansParis(ChevalTrioOrdre cheval); + + // Trouver les chevaux gagnants (première place) + @Query("SELECT r.premier FROM ResultatCourseTrioOrdre r WHERE r.course = :course") + Optional findChevalPremierByCourse(CourseTrioOrdre course); + + // Trouver les chevaux deuxièmes + @Query("SELECT r.deuxieme FROM ResultatCourseTrioOrdre r WHERE r.course = :course") + Optional findChevalDeuxiemeByCourse(CourseTrioOrdre course); + + // Trouver les chevaux troisièmes + @Query("SELECT r.troisieme FROM ResultatCourseTrioOrdre r WHERE r.course = :course") + Optional findChevalTroisiemeByCourse(CourseTrioOrdre course); + + // Trouver les chevaux en dead-heat pour une course + @Query("SELECT c FROM ChevalTrioOrdre c WHERE c.course = :course AND " + + "(c.id IN (SELECT rd.chevauxDeadHeatPremierePlace FROM ResultatCourseTrioOrdre rd WHERE rd.course = :course) OR " + + "c.id IN (SELECT rd.chevauxDeadHeatDeuxiemePlace FROM ResultatCourseTrioOrdre rd WHERE rd.course = :course) OR " + + "c.id IN (SELECT rd.chevauxDeadHeatTroisiemePlace FROM ResultatCourseTrioOrdre rd WHERE rd.course = :course))") + List findChevauxDeadHeatByCourse(CourseTrioOrdre course); + + // Compter les chevaux partants par course + long countByCourseAndNonPartantFalse(CourseTrioOrdre course); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch6_trioordre/repository/CourseRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/CourseRepository.java deleted file mode 100644 index f431436..0000000 --- a/src/main/java/com/pmumali/ch6_trioordre/repository/CourseRepository.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.pmumali.ch6_trioordre.repository; - -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; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; - -@Repository -public interface CourseRepository extends JpaRepository { - - // Trouver les courses éligibles pour TRIO-ORDRE (3 à 7 chevaux non-partants) - @Query("SELECT c FROM Course c WHERE c.estTerminee = false AND " + - "SIZE(c.chevaux) BETWEEN 3 AND 7 AND " + - "(SELECT COUNT(ch) FROM Cheval ch WHERE ch.course = c AND ch.nonPartant = false) >= 3") - List findCoursesEligiblesPourTrioOrdre(); - - // Trouver les courses non terminées par date - List findByEstTermineeFalseAndHeureDebutAfter(LocalDateTime date); - - // Trouver une course par son nom et sa date - Optional findByNomAndHeureDebut(String nom, LocalDateTime heureDebut); - - // Vérifier si une course a des paris associés - @Query("SELECT CASE WHEN COUNT(p) > 0 THEN true ELSE false END " + - "FROM ParisTrioOrdre p WHERE p.course = :course") - boolean hasParisAssocies(Course course); - - // Compter les chevaux partants pour une course - @Query("SELECT COUNT(c) FROM Cheval c WHERE c.course = :course AND c.nonPartant = false") - long countChevauxPartantsByCourse(Course course); - - // Trouver les courses avec dead-heat - @Query("SELECT DISTINCT r.course FROM ResultatCourse r WHERE " + - "SIZE(r.chevauxDeadHeatPremierePlace) > 0 OR " + - "SIZE(r.chevauxDeadHeatDeuxiemePlace) > 0 OR " + - "SIZE(r.chevauxDeadHeatTroisiemePlace) > 0") - List findCoursesAvecDeadHeat(); - - // Trouver les courses terminées sans résultat enregistré - @Query("SELECT c FROM Course c WHERE c.estTerminee = true AND " + - "NOT EXISTS (SELECT r FROM ResultatCourse r WHERE r.course = c)") - List findCoursesTermineesSansResultat(); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch6_trioordre/repository/CourseTrioOrdreRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/CourseTrioOrdreRepository.java new file mode 100644 index 0000000..d030815 --- /dev/null +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/CourseTrioOrdreRepository.java @@ -0,0 +1,47 @@ +package com.pmumali.ch6_trioordre.repository; + +import com.pmumali.ch6_trioordre.model.CourseTrioOrdre; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +@Repository +public interface CourseTrioOrdreRepository extends JpaRepository { + + // Trouver les courses éligibles pour TRIO-ORDRE (3 à 7 chevaux non-partants) + @Query("SELECT c FROM CourseTrioOrdre c WHERE c.estTerminee = false AND " + + "SIZE(c.chevaux) BETWEEN 3 AND 7 AND " + + "(SELECT COUNT(ch) FROM ChevalTrioOrdre ch WHERE ch.course = c AND ch.nonPartant = false) >= 3") + List findCoursesEligiblesPourTrioOrdre(); + + // Trouver les courses non terminées par date + List findByEstTermineeFalseAndHeureCourseAfter(LocalDateTime date); + + // Trouver une course par son nom et sa date + Optional findByNomAndHeureCourse(String nom, LocalDateTime heureDebut); + + // Vérifier si une course a des paris associés + @Query("SELECT CASE WHEN COUNT(p) > 0 THEN true ELSE false END " + + "FROM ParisTrioOrdre p WHERE p.course = :course") + boolean hasParisAssocies(CourseTrioOrdre course); + + // Compter les chevaux partants pour une course + @Query("SELECT COUNT(c) FROM ChevalTrioOrdre c WHERE c.course = :course AND c.nonPartant = false") + long countChevauxPartantsByCourse(CourseTrioOrdre course); + + // Trouver les courses avec dead-heat + /* @Query("SELECT r FROM CourseTrioOrdre r WHERE " + + "SIZE(r.chevauxDeadHeatPremierePlace) > 0 OR " + + "SIZE(r.chevauxDeadHeatDeuxiemePlace) > 0 OR " + + "SIZE(r.chevauxDeadHeatTroisiemePlace) > 0") + List findCoursesAvecDeadHeat();*/ + + // Trouver les courses terminées sans résultat enregistré + @Query("SELECT c FROM CourseTrioOrdre c WHERE c.estTerminee = true AND " + + "NOT EXISTS (SELECT r FROM ResultatCourseTrioOrdre r WHERE r.course = c)") + List findCoursesTermineesSansResultat(); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch6_trioordre/repository/ParisTrioOrdreRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/ParisTrioOrdreRepository.java index d465ee9..95a4007 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/repository/ParisTrioOrdreRepository.java +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/ParisTrioOrdreRepository.java @@ -8,8 +8,8 @@ import java.util.List; @Repository public interface ParisTrioOrdreRepository extends JpaRepository { - List findByCourse(Course course); + List findByCourse(CourseTrioOrdre course); List findByCourseAndPremierAndDeuxiemeAndTroisieme( - Course course, Cheval premier, Cheval deuxieme, Cheval troisieme); + CourseTrioOrdre course, ChevalTrioOrdre premier, ChevalTrioOrdre deuxieme, ChevalTrioOrdre troisieme); List findByIdParieur(String idParieur); } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseRepository.java deleted file mode 100644 index 0763979..0000000 --- a/src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pmumali.ch6_trioordre.repository; - -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/ch6_trioordre/repository/ResultatCourseTrioOrdreRepository.java b/src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseTrioOrdreRepository.java new file mode 100644 index 0000000..e48ce58 --- /dev/null +++ b/src/main/java/com/pmumali/ch6_trioordre/repository/ResultatCourseTrioOrdreRepository.java @@ -0,0 +1,7 @@ +package com.pmumali.ch6_trioordre.repository; + +import com.pmumali.ch6_trioordre.model.ResultatCourseTrioOrdre; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResultatCourseTrioOrdreRepository extends JpaRepository { +} diff --git a/src/main/java/com/pmumali/ch6_trioordre/service/ParisTrioOrdreService.java b/src/main/java/com/pmumali/ch6_trioordre/service/ParisTrioOrdreService.java index 8a92ae6..6f3bcbd 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/service/ParisTrioOrdreService.java +++ b/src/main/java/com/pmumali/ch6_trioordre/service/ParisTrioOrdreService.java @@ -21,24 +21,24 @@ public class ParisTrioOrdreService { @Autowired private ParisTrioOrdreRepository parisRepository; @Autowired - private CourseRepository courseRepository; + private CourseTrioOrdreRepository courseRepository; @Autowired - private ChevalRepository chevalRepository; + private ChevalTrioOrdreRepository chevalRepository; @Transactional public ParisTrioOrdre enregistrerParis(ParisTrioOrdreDto parisDto) throws ParisInvalideException { - Course course = courseRepository.findById(parisDto.getIdCourse()) + CourseTrioOrdre course = courseRepository.findById(parisDto.getIdCourse()) .orElseThrow(() -> new CourseInvalideException("Course non trouvée")); if (!course.estEligiblePourTrioOrdre()) { throw new CourseInvalideException("La course doit avoir entre 3 et 7 chevaux pour le TRIO-ORDRE"); } - Cheval premier = chevalRepository.findById(parisDto.getIdPremier()) + ChevalTrioOrdre premier = chevalRepository.findById(parisDto.getIdPremier()) .orElseThrow(() -> new ChevalInvalideException("Cheval premier non trouvé")); - Cheval deuxieme = chevalRepository.findById(parisDto.getIdDeuxieme()) + ChevalTrioOrdre deuxieme = chevalRepository.findById(parisDto.getIdDeuxieme()) .orElseThrow(() -> new ChevalInvalideException("Cheval deuxième non trouvé")); - Cheval troisieme = chevalRepository.findById(parisDto.getIdTroisieme()) + ChevalTrioOrdre troisieme = chevalRepository.findById(parisDto.getIdTroisieme()) .orElseThrow(() -> new ChevalInvalideException("Cheval troisième non trouvé")); if (premier.equals(deuxieme) || premier.equals(troisieme) || deuxieme.equals(troisieme)) { diff --git a/src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseService.java b/src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseTrioOrdreService.java similarity index 87% rename from src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseService.java rename to src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseTrioOrdreService.java index 125f4b2..692e0c6 100644 --- a/src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseService.java +++ b/src/main/java/com/pmumali/ch6_trioordre/service/ResultatCourseTrioOrdreService.java @@ -12,23 +12,23 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service -public class ResultatCourseService { - @Autowired private CourseRepository courseRepository; - @Autowired private ChevalRepository chevalRepository; +public class ResultatCourseTrioOrdreService { + @Autowired private CourseTrioOrdreRepository courseRepository; + @Autowired private ChevalTrioOrdreRepository chevalRepository; @Autowired private ParisTrioOrdreRepository parisRepository; - @Autowired private ResultatCourseRepository resultatRepository; - @Autowired private CagnotteRepository cagnotteRepository; + @Autowired private ResultatCourseTrioOrdreRepository resultatRepository; + @Autowired private CagnotteTrioOrdreRepository cagnotteRepository; @Transactional public void traiterResultatCourse(ResultatCourseDto resultatDto) throws ResultatCourseInvalideException { - Course course = courseRepository.findById(resultatDto.getIdCourse()) + CourseTrioOrdre course = courseRepository.findById(resultatDto.getIdCourse()) .orElseThrow(() -> new ResultatCourseInvalideException("Course non trouvée")); - Cheval premier = validerCheval(resultatDto.getIdPremier(), "premier"); - Cheval deuxieme = validerCheval(resultatDto.getIdDeuxieme(), "deuxième"); - Cheval troisieme = validerCheval(resultatDto.getIdTroisieme(), "troisième"); + ChevalTrioOrdre premier = validerCheval(resultatDto.getIdPremier(), "premier"); + ChevalTrioOrdre deuxieme = validerCheval(resultatDto.getIdDeuxieme(), "deuxième"); + ChevalTrioOrdre troisieme = validerCheval(resultatDto.getIdTroisieme(), "troisième"); - ResultatCourse resultat = new ResultatCourse(); + ResultatCourseTrioOrdre resultat = new ResultatCourseTrioOrdre(); resultat.setCourse(course); resultat.setPremier(premier); resultat.setDeuxieme(deuxieme); @@ -51,7 +51,7 @@ public class ResultatCourseService { traiterParis(tousParis, resultat); if (resultat.getMontantCagnotte() > 0) { - Cagnotte cagnotte = new Cagnotte(); + CagnotteTrioOrdre cagnotte = new CagnotteTrioOrdre(); cagnotte.setMontant(resultat.getMontantCagnotte()); cagnotte.setCourseSource(course); cagnotteRepository.save(cagnotte); @@ -72,7 +72,7 @@ public class ResultatCourseService { .sum(); } - private void traiterParis(List paris, ResultatCourse resultat) { + private void traiterParis(List paris, ResultatCourseTrioOrdre resultat) { for (ParisTrioOrdre p : paris) { if (p.getPremier().isNonPartant() || p.getDeuxieme().isNonPartant() || p.getTroisieme().isNonPartant()) { traiterParisAvecNonPartants(p, resultat); @@ -87,18 +87,18 @@ public class ResultatCourseService { } } - private boolean estParisGagnant(ParisTrioOrdre paris, ResultatCourse resultat) { + private boolean estParisGagnant(ParisTrioOrdre paris, ResultatCourseTrioOrdre resultat) { // Implémentation complexe des règles de dead heat selon l'article 3 return paris.getPremier().equals(resultat.getPremier()) && paris.getDeuxieme().equals(resultat.getDeuxieme()) && paris.getTroisieme().equals(resultat.getTroisieme()); } - private double calculerGains(ParisTrioOrdre paris, ResultatCourse resultat) { + private double calculerGains(ParisTrioOrdre paris, ResultatCourseTrioOrdre resultat) { return Math.max(paris.getMise() * 1.1, paris.getMise() * 5.0); // Minimum 1.1 } - private void traiterParisAvecNonPartants(ParisTrioOrdre paris, ResultatCourse resultat) { + private void traiterParisAvecNonPartants(ParisTrioOrdre paris, ResultatCourseTrioOrdre resultat) { int nbNonPartants = compterNonPartants(paris); if (nbNonPartants >= 3) { @@ -123,8 +123,8 @@ public class ResultatCourseService { } } - private boolean estSpecialGagnant(ParisTrioOrdre paris, ResultatCourse resultat) { - Cheval chevalPartant = paris.getPremier().isNonPartant() ? + private boolean estSpecialGagnant(ParisTrioOrdre paris, ResultatCourseTrioOrdre resultat) { + ChevalTrioOrdre chevalPartant = paris.getPremier().isNonPartant() ? (paris.getDeuxieme().isNonPartant() ? paris.getTroisieme() : paris.getDeuxieme()) : paris.getPremier(); @@ -132,16 +132,16 @@ public class ResultatCourseService { paris.getPremier().equals(chevalPartant); // Doit être désigné à la première place } - private boolean estSpecialJumele(ParisTrioOrdre paris, ResultatCourse resultat) { + private boolean estSpecialJumele(ParisTrioOrdre paris, ResultatCourseTrioOrdre resultat) { // Vérifier qu'il y a exactement 1 cheval non-partant if (compterNonPartants(paris) != 1) { return false; } // Identifier le cheval non-partant et les deux chevaux partants - Cheval nonPartant = null; - Cheval partant1 = null; - Cheval partant2 = null; + ChevalTrioOrdre nonPartant = null; + ChevalTrioOrdre partant1 = null; + ChevalTrioOrdre partant2 = null; if (paris.getPremier().isNonPartant()) { nonPartant = paris.getPremier(); @@ -213,7 +213,7 @@ public class ResultatCourseService { return count; } - private Cheval validerCheval(Long idCheval, String position) throws ResultatCourseInvalideException { + private ChevalTrioOrdre validerCheval(Long idCheval, String position) throws ResultatCourseInvalideException { if (idCheval == null) { throw new ResultatCourseInvalideException("Cheval " + position + " non spécifié"); } diff --git a/src/main/java/com/pmumali/ch7_triplet/controller/CourseController.java b/src/main/java/com/pmumali/ch7_triplet/controller/CourseTripletController.java similarity index 53% rename from src/main/java/com/pmumali/ch7_triplet/controller/CourseController.java rename to src/main/java/com/pmumali/ch7_triplet/controller/CourseTripletController.java index f57de45..f954e54 100644 --- a/src/main/java/com/pmumali/ch7_triplet/controller/CourseController.java +++ b/src/main/java/com/pmumali/ch7_triplet/controller/CourseTripletController.java @@ -1,7 +1,7 @@ package com.pmumali.ch7_triplet.controller; -import com.pmumali.ch7_triplet.model.Course; -import com.pmumali.ch7_triplet.service.CourseService; +import com.pmumali.ch7_triplet.model.CourseTriplet; +import com.pmumali.ch7_triplet.service.CourseTripletService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -9,56 +9,56 @@ import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api/courses") +@RequestMapping("/api/triplet/courses") @RequiredArgsConstructor @CrossOrigin(origins = "*") -public class CourseController { +public class CourseTripletController { - private final CourseService courseService; + private final CourseTripletService courseService; - @GetMapping - public ResponseEntity> getAllCourses() { + //@GetMapping + public ResponseEntity> getAllCourses() { return ResponseEntity.ok(courseService.findAll()); } - @GetMapping("/{id}") - public ResponseEntity getCourseById(@PathVariable Long id) { + // @GetMapping("/{id}") + public ResponseEntity getCourseById(@PathVariable Long id) { return courseService.findById(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } - @PostMapping - public ResponseEntity createCourse(@RequestBody Course course) { + // @PostMapping + public ResponseEntity createCourse(@RequestBody CourseTriplet course) { return ResponseEntity.ok(courseService.save(course)); } - @PutMapping("/{id}") - public ResponseEntity updateCourse(@PathVariable Long id, @RequestBody Course course) { + //@PutMapping("/{id}") + public ResponseEntity updateCourse(@PathVariable Long id, @RequestBody CourseTriplet course) { return courseService.update(id, course) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } - @DeleteMapping("/{id}") + // @DeleteMapping("/{id}") public ResponseEntity deleteCourse(@PathVariable Long id) { courseService.deleteById(id); return ResponseEntity.ok().build(); } - @PostMapping("/{id}/terminer") + // @PostMapping("/{id}/terminer") public ResponseEntity terminerCourse(@PathVariable Long id) { courseService.terminerCourse(id); return ResponseEntity.ok().build(); } - @GetMapping("/statut/{statut}") - public ResponseEntity> getCoursesByStatut(@PathVariable Course.StatutCourse statut) { + // @GetMapping("/statut/{statut}") + public ResponseEntity> getCoursesByStatut(@PathVariable CourseTriplet.StatutCourse statut) { return ResponseEntity.ok(courseService.findByStatut(statut)); } - @GetMapping("/hippodrome/{hippodrome}") - public ResponseEntity> getCoursesByHippodrome(@PathVariable String hippodrome) { + // @GetMapping("/hippodrome/{hippodrome}") + public ResponseEntity> getCoursesByHippodrome(@PathVariable String hippodrome) { return ResponseEntity.ok(courseService.findByHippodrome(hippodrome)); } } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/controller/PariController.java b/src/main/java/com/pmumali/ch7_triplet/controller/PariTripletController.java similarity index 52% rename from src/main/java/com/pmumali/ch7_triplet/controller/PariController.java rename to src/main/java/com/pmumali/ch7_triplet/controller/PariTripletController.java index e43ff82..5715f7f 100644 --- a/src/main/java/com/pmumali/ch7_triplet/controller/PariController.java +++ b/src/main/java/com/pmumali/ch7_triplet/controller/PariTripletController.java @@ -1,7 +1,8 @@ -package com.pmu.mali.triplet.controller; +package com.pmumali.ch7_triplet.controller; -import com.pmumali.ch7_triplet.model.Pari; -import com.pmumali.ch7_triplet.service.PariService; +import com.pmumali.ch7_triplet.model.PariTriplet; +import com.pmumali.ch7_triplet.model.StatutPari; +import com.pmumali.ch7_triplet.service.PariTripletService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -9,27 +10,27 @@ import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api/paris") +@RequestMapping("/api/triplet") @RequiredArgsConstructor @CrossOrigin(origins = "*") -public class PariController { +public class PariTripletController { - private final PariService pariService; + private final PariTripletService pariService; - @GetMapping - public ResponseEntity> getAllParis() { + // @GetMapping + public ResponseEntity> getAllParis() { return ResponseEntity.ok(pariService.findAll()); } - @GetMapping("/{id}") - public ResponseEntity getPariById(@PathVariable Long id) { + // @GetMapping("/{id}") + public ResponseEntity getPariById(@PathVariable Long id) { return pariService.findById(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } - @PostMapping - public ResponseEntity createPari(@RequestBody Pari pari) { + @PostMapping("/pari") + public ResponseEntity createPari(@RequestBody PariTriplet pari) { try { return ResponseEntity.ok(pariService.creerPari(pari)); } catch (IllegalArgumentException e) { @@ -37,45 +38,45 @@ public class PariController { } } - @GetMapping("/course/{courseId}") - public ResponseEntity> getParisByCourse(@PathVariable Long courseId) { + // @GetMapping("/course/{courseId}") + public ResponseEntity> getParisByCourse(@PathVariable Long courseId) { return ResponseEntity.ok(pariService.findByCourseId(courseId)); } - @GetMapping("/utilisateur/{utilisateurId}") - public ResponseEntity> getParisByUtilisateur(@PathVariable String utilisateurId) { +/* @GetMapping("/utilisateur/{utilisateurId}") + public ResponseEntity> getParisByUtilisateur(@PathVariable String utilisateurId) { return ResponseEntity.ok(pariService.findByUtilisateurId(utilisateurId)); - } + }*/ - @GetMapping("/statut/{statut}") - public ResponseEntity> getParisByStatut(@PathVariable Pari.StatutPari statut) { + // @GetMapping("/statut/{statut}") + public ResponseEntity> getParisByStatut(@PathVariable StatutPari statut) { return ResponseEntity.ok(pariService.findByStatut(statut)); } - @GetMapping("/course/{courseId}/statut/{statut}") - public ResponseEntity> getParisByCourseAndStatut( + // @GetMapping("/course/{courseId}/statut/{statut}") + public ResponseEntity> getParisByCourseAndStatut( @PathVariable Long courseId, - @PathVariable Pari.StatutPari statut) { + @PathVariable StatutPari statut) { return ResponseEntity.ok(pariService.findByCourseIdAndStatut(courseId, statut)); } - @GetMapping("/course/{courseId}/total-mises") + // @GetMapping("/course/{courseId}/total-mises") public ResponseEntity getTotalMisesByCourse(@PathVariable Long courseId) { return ResponseEntity.ok(pariService.getTotalMisesByCourse(courseId)); } - @GetMapping("/course/{courseId}/nombre-paris") + // @GetMapping("/course/{courseId}/nombre-paris") public ResponseEntity getNombreParisByCourse(@PathVariable Long courseId) { return ResponseEntity.ok(pariService.countParisByCourse(courseId)); } - @PutMapping("/{id}") - public ResponseEntity updatePari(@PathVariable Long id, @RequestBody Pari pari) { + // @PutMapping("/{id}") + public ResponseEntity updatePari(@PathVariable Long id, @RequestBody PariTriplet pari) { // Implémentation de la mise à jour return ResponseEntity.ok(pariService.save(pari)); } - @DeleteMapping("/{id}") + // @DeleteMapping("/{id}") public ResponseEntity deletePari(@PathVariable Long id) { pariService.deleteById(id); return ResponseEntity.ok().build(); diff --git a/src/main/java/com/pmumali/ch7_triplet/controller/ResultatController.java b/src/main/java/com/pmumali/ch7_triplet/controller/ResultatTripletController.java similarity index 66% rename from src/main/java/com/pmumali/ch7_triplet/controller/ResultatController.java rename to src/main/java/com/pmumali/ch7_triplet/controller/ResultatTripletController.java index 2436752..7ba2219 100644 --- a/src/main/java/com/pmumali/ch7_triplet/controller/ResultatController.java +++ b/src/main/java/com/pmumali/ch7_triplet/controller/ResultatTripletController.java @@ -1,35 +1,35 @@ -package com.pmu.mali.triplet.controller; +package com.pmumali.ch7_triplet.controller; -import com.pmumali.ch7_triplet.model.ResultatCourse; -import com.pmumali.ch7_triplet.service.CalculGainsService; -import com.pmumali.ch7_triplet.service.ResultatCourseService; +import com.pmumali.ch7_triplet.model.ResultatCourseTriplet; +import com.pmumali.ch7_triplet.service.CalculGainsTripletService; +import com.pmumali.ch7_triplet.service.ResultatCourseTripletService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/api/resultats") +@RequestMapping("/api/triplet/resultats") @RequiredArgsConstructor @CrossOrigin(origins = "*") -public class ResultatController { +public class ResultatTripletController { - private final CalculGainsService calculGainsService; - private final ResultatCourseService resultatCourseService; + private final CalculGainsTripletService calculGainsService; + private final ResultatCourseTripletService resultatCourseService; - @PostMapping("/calculer/{courseId}") + // @PostMapping("/calculer/{courseId}") public ResponseEntity calculerResultats(@PathVariable Long courseId) { calculGainsService.calculerResultatsCourse(courseId); return ResponseEntity.ok().build(); } - @GetMapping("/course/{courseId}") - public ResponseEntity getResultatByCourse(@PathVariable Long courseId) { + // @GetMapping("/course/{courseId}") + public ResponseEntity getResultatByCourse(@PathVariable Long courseId) { return resultatCourseService.findByCourseId(courseId) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } - @GetMapping("/rapports/course/{courseId}") + // @GetMapping("/rapports/course/{courseId}") public ResponseEntity getRapportsCourse(@PathVariable Long courseId) { return resultatCourseService.findByCourseId(courseId) .map(resultat -> { diff --git a/src/main/java/com/pmumali/ch7_triplet/model/Cagnotte.java b/src/main/java/com/pmumali/ch7_triplet/model/CagnotteTriplet.java similarity index 93% rename from src/main/java/com/pmumali/ch7_triplet/model/Cagnotte.java rename to src/main/java/com/pmumali/ch7_triplet/model/CagnotteTriplet.java index a1ef144..8e09274 100644 --- a/src/main/java/com/pmumali/ch7_triplet/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/CagnotteTriplet.java @@ -11,7 +11,7 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor @Builder -public class Cagnotte { +public class CagnotteTriplet { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -19,7 +19,7 @@ public class Cagnotte { @ManyToOne @JoinColumn(name = "course_id") - private Course course; + private CourseTriplet course; @Column(nullable = false) private Double montant; diff --git a/src/main/java/com/pmumali/ch7_triplet/model/Cheval.java b/src/main/java/com/pmumali/ch7_triplet/model/ChevalTriplet.java similarity index 80% rename from src/main/java/com/pmumali/ch7_triplet/model/Cheval.java rename to src/main/java/com/pmumali/ch7_triplet/model/ChevalTriplet.java index edeefd3..5dc50d1 100644 --- a/src/main/java/com/pmumali/ch7_triplet/model/Cheval.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/ChevalTriplet.java @@ -4,13 +4,13 @@ import lombok.*; import jakarta.persistence.*; @Entity -@Table(name = "chevaux") @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder -public class Cheval { +@Table(name = "cheval") +public class ChevalTriplet { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -23,10 +23,10 @@ public class Cheval { @ManyToOne @JoinColumn(name = "course_id", nullable = false) - private Course course; + private CourseTriplet course; - @Column(nullable = false) - private Boolean estPartant; + @Column(name = "non_partant") + private Boolean nonPartant; private Integer positionArrivee; diff --git a/src/main/java/com/pmumali/ch7_triplet/model/Course.java b/src/main/java/com/pmumali/ch7_triplet/model/CourseTriplet.java similarity index 73% rename from src/main/java/com/pmumali/ch7_triplet/model/Course.java rename to src/main/java/com/pmumali/ch7_triplet/model/CourseTriplet.java index 29f4738..6f34ef0 100644 --- a/src/main/java/com/pmumali/ch7_triplet/model/Course.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/CourseTriplet.java @@ -6,13 +6,13 @@ import java.time.LocalDateTime; import java.util.List; @Entity -@Table(name = "courses") +@Table(name = "course") @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder -public class Course { +public class CourseTriplet { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -20,20 +20,20 @@ public class Course { @Column(nullable = false, unique = true) private String nom; - @Column(nullable = false) - private LocalDateTime dateHeure; + @Column(name = "heure_course") + private LocalDateTime heureCourse; - @Column(nullable = false) + @Column(nullable = true) private String hippodrome; - @Column(nullable = false) + @Column(nullable = true) private Integer nombrePartants; @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List chevaux; + private List chevaux; @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) - private List paris; + private List paris; @Enumerated(EnumType.STRING) private StatutCourse statut; diff --git a/src/main/java/com/pmumali/ch7_triplet/model/Pari.java b/src/main/java/com/pmumali/ch7_triplet/model/PariTriplet.java similarity index 89% rename from src/main/java/com/pmumali/ch7_triplet/model/Pari.java rename to src/main/java/com/pmumali/ch7_triplet/model/PariTriplet.java index 6c2e862..2cef5e2 100644 --- a/src/main/java/com/pmumali/ch7_triplet/model/Pari.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/PariTriplet.java @@ -12,7 +12,7 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Builder -public class Pari { +public class PariTriplet { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -22,7 +22,7 @@ public class Pari { @ManyToOne @JoinColumn(name = "course_id", nullable = false) - private Course course; + private CourseTriplet course; @Column(nullable = false) private Double mise; @@ -37,6 +37,7 @@ public class Pari { private List chevauxOrdre; @Enumerated(EnumType.STRING) + @Column(name = "type_pari") private TypePari typePari; private Double gain; @@ -59,7 +60,5 @@ public class Pari { CHAMP_PARTIEL_1_CHEVAL_SIMPLIFIE } - public enum StatutPari { - EN_ATTENTE, GAGNANT, PERDANT, REMBOURSE, SPECIAL_JUMELE, SPECIAL_GAGNANT - } + } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/model/ResultatCourse.java b/src/main/java/com/pmumali/ch7_triplet/model/ResultatCourseTriplet.java similarity index 91% rename from src/main/java/com/pmumali/ch7_triplet/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch7_triplet/model/ResultatCourseTriplet.java index 62e8b1a..f1b584d 100644 --- a/src/main/java/com/pmumali/ch7_triplet/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch7_triplet/model/ResultatCourseTriplet.java @@ -5,20 +5,20 @@ import jakarta.persistence.*; import java.util.Map; @Entity -@Table(name = "resultats_courses") +@Table(name = "resultat_course") @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder -public class ResultatCourse { +public class ResultatCourseTriplet { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne @JoinColumn(name = "course_id", nullable = false) - private Course course; + private CourseTriplet course; @ElementCollection @CollectionTable(name = "resultat_positions", joinColumns = @JoinColumn(name = "resultat_id")) diff --git a/src/main/java/com/pmumali/ch7_triplet/model/StatutPari.java b/src/main/java/com/pmumali/ch7_triplet/model/StatutPari.java new file mode 100644 index 0000000..50d1a78 --- /dev/null +++ b/src/main/java/com/pmumali/ch7_triplet/model/StatutPari.java @@ -0,0 +1,5 @@ +package com.pmumali.ch7_triplet.model; + +public enum StatutPari { + EN_ATTENTE, GAGNANT, PERDANT, REMBOURSE, SPECIAL_JUMELE, SPECIAL_GAGNANT +} diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/CagnotteRepository.java deleted file mode 100644 index 4fe987f..0000000 --- a/src/main/java/com/pmumali/ch7_triplet/repository/CagnotteRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pmumali.ch7_triplet.repository; - -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; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface CagnotteRepository extends JpaRepository { - - Optional findByCourseId(Long courseId); - - List findByEstUtilisee(Boolean estUtilisee); - - @Query("SELECT SUM(c.montant) FROM Cagnotte c WHERE c.estUtilisee = false") - Optional getMontantTotalCagnotte(); - - @Query("SELECT c FROM Cagnotte c WHERE c.estUtilisee = false ORDER BY c.dateCreation ASC") - List findCagnottesDisponibles(); - - @Query("SELECT c FROM Cagnotte c WHERE c.course.id = :courseId AND c.typeCagnotte = :typeCagnotte") - Optional findByCourseIdAndType(@Param("courseId") Long courseId, - @Param("typeCagnotte") Cagnotte.TypeCagnotte typeCagnotte); - - @Query("UPDATE Cagnotte c SET c.estUtilisee = true WHERE c.id = :id") - void marquerCommeUtilisee(@Param("id") Long id); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/CagnotteTripletRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/CagnotteTripletRepository.java new file mode 100644 index 0000000..338c1eb --- /dev/null +++ b/src/main/java/com/pmumali/ch7_triplet/repository/CagnotteTripletRepository.java @@ -0,0 +1,31 @@ +package com.pmumali.ch7_triplet.repository; + +import com.pmumali.ch7_triplet.model.CagnotteTriplet; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface CagnotteTripletRepository extends JpaRepository { + + Optional findByCourseId(Long courseId); + + List findByEstUtilisee(Boolean estUtilisee); + + @Query("SELECT SUM(c.montant) FROM CagnotteTriplet c WHERE c.estUtilisee = false") + Optional getMontantTotalCagnotte(); + + @Query("SELECT c FROM CagnotteTriplet c WHERE c.estUtilisee = false ORDER BY c.dateCreation ASC") + List findCagnottesDisponibles(); + + @Query("SELECT c FROM CagnotteTriplet c WHERE c.course.id = :courseId AND c.typeCagnotte = :typeCagnotte") + Optional findByCourseIdAndType(@Param("courseId") Long courseId, + @Param("typeCagnotte") CagnotteTriplet.TypeCagnotte typeCagnotte); + + @Query("UPDATE CagnotteTriplet c SET c.estUtilisee = true WHERE c.id = :id") + void marquerCommeUtilisee(@Param("id") Long id); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/ChevalRepository.java deleted file mode 100644 index a71e502..0000000 --- a/src/main/java/com/pmumali/ch7_triplet/repository/ChevalRepository.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.pmumali.ch7_triplet.repository; - -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; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface ChevalRepository extends JpaRepository { - List findByCourseId(Long courseId); - List findByNom(String nom); - List findByEstPartant(Boolean estPartant); - List findByCourseIdAndEstPartant(Long courseId, Boolean estPartant); - List findByCourseIdAndPositionArriveeIsNotNull(Long courseId); - Optional findByCourseIdAndNumero(Long courseId, Integer numero); - - @Query("SELECT c FROM Cheval c WHERE c.course.id = :courseId AND c.positionArrivee = :position") - List findByCourseIdAndPositionArrivee(@Param("courseId") Long courseId, - @Param("position") Integer position); - - @Query("SELECT c FROM Cheval c WHERE c.course.id = :courseId AND c.statut = 'DEAD_HEAT'") - List findDeadHeatByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT COUNT(c) FROM Cheval c WHERE c.course.id = :courseId AND c.estPartant = true") - long countPartantsByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT c FROM Cheval c WHERE c.course.id = :courseId ORDER BY c.positionArrivee ASC") - List findClassementByCourseId(@Param("courseId") Long courseId); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/ChevalTripletRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/ChevalTripletRepository.java new file mode 100644 index 0000000..de098c5 --- /dev/null +++ b/src/main/java/com/pmumali/ch7_triplet/repository/ChevalTripletRepository.java @@ -0,0 +1,33 @@ +package com.pmumali.ch7_triplet.repository; + +import com.pmumali.ch7_triplet.model.ChevalTriplet; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface ChevalTripletRepository extends JpaRepository { + List findByCourseId(Long courseId); + List findByNom(String nom); + List findByNonPartant(Boolean estPartant); + List findByCourseIdAndNonPartant(Long courseId, Boolean estPartant); + List findByCourseIdAndPositionArriveeIsNotNull(Long courseId); + Optional findByCourseIdAndNumero(Long courseId, Integer numero); + + @Query("SELECT c FROM ChevalTriplet c WHERE c.course.id = :courseId AND c.positionArrivee = :position") + List findByCourseIdAndPositionArrivee(@Param("courseId") Long courseId, + @Param("position") Integer position); + + @Query("SELECT c FROM ChevalTriplet c WHERE c.course.id = :courseId AND c.statut = 'DEAD_HEAT'") + List findDeadHeatByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT COUNT(c) FROM ChevalTriplet c WHERE c.course.id = :courseId AND c.nonPartant = true") + long countPartantsByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT c FROM ChevalTriplet c WHERE c.course.id = :courseId ORDER BY c.positionArrivee ASC") + List findClassementByCourseId(@Param("courseId") Long courseId); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/CourseRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/CourseRepository.java deleted file mode 100644 index 07b2216..0000000 --- a/src/main/java/com/pmumali/ch7_triplet/repository/CourseRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pmumali.ch7_triplet.repository; - -import com.pmumali.ch7_triplet.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 findByStatut(Course.StatutCourse statut); - List findByHippodrome(String hippodrome); - boolean existsByNom(String nom); - List findByOrderByDateHeureAsc(); - List findByDateHeureAfter(java.time.LocalDateTime dateHeure); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/CourseTripletRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/CourseTripletRepository.java new file mode 100644 index 0000000..7ace592 --- /dev/null +++ b/src/main/java/com/pmumali/ch7_triplet/repository/CourseTripletRepository.java @@ -0,0 +1,16 @@ +package com.pmumali.ch7_triplet.repository; + +import com.pmumali.ch7_triplet.model.CourseTriplet; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CourseTripletRepository extends JpaRepository { + List findByStatut(CourseTriplet.StatutCourse statut); + List findByHippodrome(String hippodrome); + boolean existsByNom(String nom); + List findByOrderByHeureCourseAsc(); + List findByHeureCourseAfter(java.time.LocalDateTime dateHeure); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/PariRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/PariRepository.java deleted file mode 100644 index 7b23e48..0000000 --- a/src/main/java/com/pmumali/ch7_triplet/repository/PariRepository.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pmumali.ch7_triplet.repository; - -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; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface PariRepository extends JpaRepository { - List findByCourseId(Long courseId); - List findByUtilisateurId(String utilisateurId); - List findByStatut(Pari.StatutPari statut); - List findByCourseIdAndStatut(Long courseId, Pari.StatutPari statut); - List findByTypePari(Pari.TypePari typePari); - List findByCourseIdAndTypePari(Long courseId, Pari.TypePari typePari); - - @Query("SELECT p FROM Pari p WHERE p.course.id = :courseId AND p.statut = 'GAGNANT'") - List findGagnantsByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT p FROM Pari p WHERE p.course.id = :courseId AND p.statut IN ('REMBOURSE', 'SPECIAL_JUMELE', 'SPECIAL_GAGNANT')") - List findSpeciauxByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT SUM(p.mise) FROM Pari p WHERE p.course.id = :courseId") - Double sumMisesByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT SUM(p.mise) FROM Pari p WHERE p.course.id = :courseId AND p.statut = 'REMBOURSE'") - Double sumMisesRembourseesByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT COUNT(p) FROM Pari p WHERE p.course.id = :courseId") - long countByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT COUNT(p) FROM Pari p WHERE p.course.id = :courseId AND p.typePari = :typePari") - long countByCourseIdAndTypePari(@Param("courseId") Long courseId, - @Param("typePari") Pari.TypePari typePari); - - @Query("SELECT SUM(p.mise) FROM Pari p WHERE p.course.id = :courseId AND p.typePari = :typePari") - Double sumMisesByCourseIdAndTypePari(@Param("courseId") Long courseId, - @Param("typePari") Pari.TypePari typePari); - - @Query("SELECT p FROM Pari p WHERE p.numeroTicket = :numeroTicket") - Optional findByNumeroTicket(@Param("numeroTicket") String numeroTicket); - - @Query("SELECT p FROM Pari p WHERE p.course.id = :courseId AND :chevalId MEMBER OF p.chevauxOrdre") - List findByCourseIdAndChevalInPari(@Param("courseId") Long courseId, - @Param("chevalId") Long chevalId); - - @Query("SELECT p FROM Pari p WHERE p.utilisateurId = :utilisateurId AND p.statut = 'GAGNANT' ORDER BY p.gain DESC") - List findGagnantsByUtilisateurId(@Param("utilisateurId") String utilisateurId); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/PariTripletRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/PariTripletRepository.java new file mode 100644 index 0000000..126bcdc --- /dev/null +++ b/src/main/java/com/pmumali/ch7_triplet/repository/PariTripletRepository.java @@ -0,0 +1,54 @@ +package com.pmumali.ch7_triplet.repository; + +import com.pmumali.ch7_triplet.model.PariTriplet; +import com.pmumali.ch7_triplet.model.StatutPari; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface PariTripletRepository extends JpaRepository { + List findByCourseId(Long courseId); +/* List findByUtilisateurId(String utilisateurId);*/ + List findByStatut(StatutPari statut); + List findByCourseIdAndStatut(Long courseId, StatutPari statut); + List findByTypePari(PariTriplet.TypePari typePari); + List findByCourseIdAndTypePari(Long courseId, PariTriplet.TypePari typePari); + + @Query("SELECT p FROM PariTriplet p WHERE p.course.id = :courseId AND p.statut = 'GAGNANT'") + List findGagnantsByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT p FROM PariTriplet p WHERE p.course.id = :courseId AND p.statut IN ( StatutPari.REMBOURSE, StatutPari.SPECIAL_JUMELE, StatutPari.SPECIAL_GAGNANT)") + List findSpeciauxByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT SUM(p.mise) FROM PariTriplet p WHERE p.course.id = :courseId") + Double sumMisesByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT SUM(p.mise) FROM PariTriplet p WHERE p.course.id = :courseId AND p.statut = 'REMBOURSE'") + Double sumMisesRembourseesByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT COUNT(p) FROM PariTriplet p WHERE p.course.id = :courseId") + long countByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT COUNT(p) FROM PariTriplet p WHERE p.course.id = :courseId AND p.typePari = :typePari") + long countByCourseIdAndTypePari(@Param("courseId") Long courseId, + @Param("typePari") PariTriplet.TypePari typePari); + + @Query("SELECT SUM(p.mise) FROM PariTriplet p WHERE p.course.id = :courseId AND p.typePari = :typePari") + Double sumMisesByCourseIdAndTypePari(@Param("courseId") Long courseId, + @Param("typePari") PariTriplet.TypePari typePari); + + @Query("SELECT p FROM PariTriplet p WHERE p.numeroTicket = :numeroTicket") + Optional findByNumeroTicket(@Param("numeroTicket") String numeroTicket); + + @Query("SELECT p FROM PariTriplet p WHERE p.course.id = :courseId AND :chevalId MEMBER OF p.chevauxOrdre") + List findByCourseIdAndChevalInPari(@Param("courseId") Long courseId, + @Param("chevalId") Long chevalId); +/* + @Query("SELECT p FROM PariTriplet p WHERE p.utilisateurId = :utilisateurId AND p.statut = 'GAGNANT' ORDER BY p.gain DESC") + List findGagnantsByUtilisateurId(@Param("utilisateurId") String utilisateurId);*/ +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseRepository.java deleted file mode 100644 index db11aee..0000000 --- a/src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.pmumali.ch7_triplet.repository; - -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; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface ResultatCourseRepository extends JpaRepository { - Optional findByCourseId(Long courseId); - - @Query("SELECT r FROM ResultatCourse r WHERE r.course.id = :courseId") - Optional findByCourse(@Param("courseId") Long courseId); - - @Query("SELECT CASE WHEN COUNT(r) > 0 THEN true ELSE false END FROM ResultatCourse r WHERE r.course.id = :courseId") - boolean existsByCourseId(@Param("courseId") Long courseId); - - @Query("DELETE FROM ResultatCourse r WHERE r.course.id = :courseId") - void deleteByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT r.rapportTripletOrdre FROM ResultatCourse r WHERE r.course.id = :courseId") - Optional findRapportOrdreByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT r.rapportTripletDesordre FROM ResultatCourse r WHERE r.course.id = :courseId") - Optional findRapportDesordreByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT r.rapportSpecialJumele FROM ResultatCourse r WHERE r.course.id = :courseId") - Optional findRapportSpecialJumeleByCourseId(@Param("courseId") Long courseId); - - @Query("SELECT r.rapportSpecialGagnant FROM ResultatCourse r WHERE r.course.id = :courseId") - Optional findRapportSpecialGagnantByCourseId(@Param("courseId") Long courseId); -} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseTripletRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseTripletRepository.java new file mode 100644 index 0000000..42dc811 --- /dev/null +++ b/src/main/java/com/pmumali/ch7_triplet/repository/ResultatCourseTripletRepository.java @@ -0,0 +1,35 @@ +package com.pmumali.ch7_triplet.repository; + +import com.pmumali.ch7_triplet.model.ResultatCourseTriplet; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface ResultatCourseTripletRepository extends JpaRepository { + Optional findByCourseId(Long courseId); + + @Query("SELECT r FROM ResultatCourseTriplet r WHERE r.course.id = :courseId") + Optional findByCourse(@Param("courseId") Long courseId); + + @Query("SELECT CASE WHEN COUNT(r) > 0 THEN true ELSE false END FROM ResultatCourseTriplet r WHERE r.course.id = :courseId") + boolean existsByCourseId(@Param("courseId") Long courseId); + + @Query("DELETE FROM ResultatCourseTriplet r WHERE r.course.id = :courseId") + void deleteByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT r.rapportTripletOrdre FROM ResultatCourseTriplet r WHERE r.course.id = :courseId") + Optional findRapportOrdreByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT r.rapportTripletDesordre FROM ResultatCourseTriplet r WHERE r.course.id = :courseId") + Optional findRapportDesordreByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT r.rapportSpecialJumele FROM ResultatCourseTriplet r WHERE r.course.id = :courseId") + Optional findRapportSpecialJumeleByCourseId(@Param("courseId") Long courseId); + + @Query("SELECT r.rapportSpecialGagnant FROM ResultatCourseTriplet r WHERE r.course.id = :courseId") + Optional findRapportSpecialGagnantByCourseId(@Param("courseId") Long courseId); +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueRepository.java b/src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueTripletRepository.java similarity index 94% rename from src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueRepository.java rename to src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueTripletRepository.java index eb77cdd..b190970 100644 --- a/src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueRepository.java +++ b/src/main/java/com/pmumali/ch7_triplet/repository/StatistiqueTripletRepository.java @@ -1,5 +1,6 @@ package com.pmumali.ch7_triplet.repository; +import com.pmumali.ch7_triplet.model.PariTriplet; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -9,14 +10,14 @@ import java.time.LocalDate; import java.util.List; @Repository -public interface StatistiqueRepository extends JpaRepository { +public interface StatistiqueTripletRepository extends JpaRepository { @Query(value = """ SELECT DATE(p.date_heure_pari) as date, COUNT(p.id) as nombre_paris, SUM(p.mise) as total_mises, SUM(p.gain) as total_gains - FROM paris p + FROM pari p WHERE p.date_heure_pari BETWEEN :startDate AND :endDate GROUP BY DATE(p.date_heure_pari) ORDER BY date @@ -29,7 +30,7 @@ public interface StatistiqueRepository extends JpaRepository { COUNT(p.id) as nombre_paris, SUM(p.mise) as total_mises, SUM(p.gain) as total_gains - FROM paris p + FROM pari p JOIN courses c ON p.course_id = c.id WHERE c.date_heure BETWEEN :startDate AND :endDate GROUP BY c.hippodrome @@ -43,7 +44,7 @@ public interface StatistiqueRepository extends JpaRepository { COUNT(p.id) as nombre_paris, SUM(p.mise) as total_mises, AVG(p.mise) as mise_moyenne - FROM paris p + FROM pari p WHERE p.date_heure_pari BETWEEN :startDate AND :endDate GROUP BY p.type_pari ORDER BY total_mises DESC diff --git a/src/main/java/com/pmumali/ch7_triplet/service/CagnotteService.java b/src/main/java/com/pmumali/ch7_triplet/service/CagnotteTripletService.java similarity index 69% rename from src/main/java/com/pmumali/ch7_triplet/service/CagnotteService.java rename to src/main/java/com/pmumali/ch7_triplet/service/CagnotteTripletService.java index acf820b..2d01afb 100644 --- a/src/main/java/com/pmumali/ch7_triplet/service/CagnotteService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/CagnotteTripletService.java @@ -1,8 +1,8 @@ package com.pmumali.ch7_triplet.service; -import com.pmumali.ch7_triplet.model.Cagnotte; -import com.pmumali.ch7_triplet.model.Course; -import com.pmumali.ch7_triplet.repository.CagnotteRepository; +import com.pmumali.ch7_triplet.model.CagnotteTriplet; +import com.pmumali.ch7_triplet.model.CourseTriplet; +import com.pmumali.ch7_triplet.repository.CagnotteTripletRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,12 +12,12 @@ import java.util.Optional; @Service @RequiredArgsConstructor -public class CagnotteService { +public class CagnotteTripletService { - private final CagnotteRepository cagnotteRepository; + private final CagnotteTripletRepository cagnotteRepository; - public Cagnotte creerCagnotte(Course course, Double montant, Cagnotte.TypeCagnotte type, String description) { - Cagnotte cagnotte = Cagnotte.builder() + public CagnotteTriplet creerCagnotte(CourseTriplet course, Double montant, CagnotteTriplet.TypeCagnotte type, String description) { + CagnotteTriplet cagnotte = CagnotteTriplet.builder() .course(course) .montant(montant) .dateCreation(LocalDateTime.now()) @@ -29,11 +29,11 @@ public class CagnotteService { return cagnotteRepository.save(cagnotte); } - public Optional getCagnotteByCourse(Long courseId) { + public Optional getCagnotteByCourse(Long courseId) { return cagnotteRepository.findByCourseId(courseId); } - public List getCagnottesDisponibles() { + public List getCagnottesDisponibles() { return cagnotteRepository.findCagnottesDisponibles(); } @@ -50,9 +50,9 @@ public class CagnotteService { } public void transfererCagnotteVersCourse(Long courseId) { - List cagnottesDisponibles = getCagnottesDisponibles(); + List cagnottesDisponibles = getCagnottesDisponibles(); double montantTotal = cagnottesDisponibles.stream() - .mapToDouble(Cagnotte::getMontant) + .mapToDouble(CagnotteTriplet::getMontant) .sum(); // Marquer toutes les cagnottes comme utilisées @@ -65,11 +65,11 @@ public class CagnotteService { // Créer une nouvelle cagnotte pour la course avec le montant total if (montantTotal > 0) { // Implémentation simplifiée - en réalité, il faudrait récupérer la course - Cagnotte nouvelleCagnotte = Cagnotte.builder() + CagnotteTriplet nouvelleCagnotte = CagnotteTriplet.builder() .montant(montantTotal) .dateCreation(LocalDateTime.now()) .estUtilisee(false) - .typeCagnotte(Cagnotte.TypeCagnotte.GENERALE) + .typeCagnotte(CagnotteTriplet.TypeCagnotte.GENERALE) .description("Cagnotte reportée des courses précédentes") .build(); diff --git a/src/main/java/com/pmumali/ch7_triplet/service/CalculGainsService.java b/src/main/java/com/pmumali/ch7_triplet/service/CalculGainsTripletService.java similarity index 77% rename from src/main/java/com/pmumali/ch7_triplet/service/CalculGainsService.java rename to src/main/java/com/pmumali/ch7_triplet/service/CalculGainsTripletService.java index a8bf3aa..55a3e58 100644 --- a/src/main/java/com/pmumali/ch7_triplet/service/CalculGainsService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/CalculGainsTripletService.java @@ -1,9 +1,9 @@ package com.pmumali.ch7_triplet.service; 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 com.pmumali.ch7_triplet.repository.ChevalTripletRepository; +import com.pmumali.ch7_triplet.repository.PariTripletRepository; +import com.pmumali.ch7_triplet.repository.ResultatCourseTripletRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,21 +12,21 @@ import java.util.stream.Collectors; @Service @RequiredArgsConstructor -public class CalculGainsService { +public class CalculGainsTripletService { - private final PariRepository pariRepository; - private final ResultatCourseRepository resultatCourseRepository; - private final ChevalRepository chevalRepository; - private final CourseService courseService; + private final PariTripletRepository pariRepository; + private final ResultatCourseTripletRepository resultatCourseRepository; + private final ChevalTripletRepository chevalRepository; + private final CourseTripletService courseService; private static final double MISE_UNITAIRE = 500.0; private static final double PRELEVEMENTS_POURCENTAGE = 0.15; public void calculerResultatsCourse(Long courseId) { - Course course = courseService.findById(courseId) + CourseTriplet course = courseService.findById(courseId) .orElseThrow(() -> new RuntimeException("Course non trouvée avec l'id: " + courseId)); - ResultatCourse resultat = resultatCourseRepository.findByCourse(course.getId()) + ResultatCourseTriplet resultat = resultatCourseRepository.findByCourse(course.getId()) .orElseGet(() -> creerResultatCourse(course)); // Calcul de la masse à partager selon l'article 5 @@ -50,8 +50,8 @@ public class CalculGainsService { calculerGainsParis(course, resultat); } - private ResultatCourse creerResultatCourse(Course course) { - ResultatCourse resultat = new ResultatCourse(); + private ResultatCourseTriplet creerResultatCourse(CourseTriplet course) { + ResultatCourseTriplet resultat = new ResultatCourseTriplet(); resultat.setCourse(course); resultat.setHasDeadHeat(determinerDeadHeat(course)); resultat.setDeadHeatPositions(analyserDeadHeatPositions(course)); @@ -59,7 +59,7 @@ public class CalculGainsService { return resultatCourseRepository.save(resultat); } - private double calculerMassePartager(Course course) { + private double calculerMassePartager(CourseTriplet course) { double recetteNette = calculerRecetteNette(course); double montantRembourses = calculerMontantRembourses(course); double prelevementsLegaux = calculerPrelevementsLegaux(recetteNette); @@ -67,19 +67,19 @@ public class CalculGainsService { return recetteNette - montantRembourses - prelevementsLegaux; } - private double calculerRecetteNette(Course course) { - List paris = pariRepository.findByCourseId(course.getId()); + private double calculerRecetteNette(CourseTriplet course) { + List paris = pariRepository.findByCourseId(course.getId()); return paris.stream() - .filter(p -> p.getStatut() != Pari.StatutPari.REMBOURSE) - .mapToDouble(Pari::getMise) + .filter(p -> p.getStatut() != StatutPari.REMBOURSE) + .mapToDouble(PariTriplet::getMise) .sum(); } - private double calculerMontantRembourses(Course course) { - List paris = pariRepository.findByCourseId(course.getId()); + private double calculerMontantRembourses(CourseTriplet course) { + List paris = pariRepository.findByCourseId(course.getId()); return paris.stream() - .filter(p -> p.getStatut() == Pari.StatutPari.REMBOURSE) - .mapToDouble(Pari::getMise) + .filter(p -> p.getStatut() == StatutPari.REMBOURSE) + .mapToDouble(PariTriplet::getMise) .sum(); } @@ -87,8 +87,8 @@ public class CalculGainsService { return recetteNette * PRELEVEMENTS_POURCENTAGE; } - private void calculerRapportsArriveeNormale(ResultatCourse resultat, double massePartager) { - Course course = resultat.getCourse(); + private void calculerRapportsArriveeNormale(ResultatCourseTriplet resultat, double massePartager) { + CourseTriplet course = resultat.getCourse(); // 60% pour l'ordre exact, 40% pour l'ordre inexact selon l'article 5 double masseOrdreExact = massePartager * 0.6; @@ -120,7 +120,7 @@ public class CalculGainsService { resultat.setRapportSpecialGagnant(rapportOrdreInexact / 4); } - private void calculerRapportsAvecDeadHeat(ResultatCourse resultat, + private void calculerRapportsAvecDeadHeat(ResultatCourseTriplet resultat, Map deadHeatInfo, double massePartager) { @@ -135,7 +135,7 @@ public class CalculGainsService { } } - private void calculerDeadHeatPremierePlace(ResultatCourse resultat, + private void calculerDeadHeatPremierePlace(ResultatCourseTriplet resultat, Map deadHeatInfo, double massePartager) { int nombreCombinaisonsPayables = calculerNombreCombinaisonsPremierePlace(deadHeatInfo); @@ -150,7 +150,7 @@ public class CalculGainsService { resultat.setRapportSpecialGagnant(rapportParCombinaison / 4); } - private void calculerDeadHeatPremiereEtTroisieme(ResultatCourse resultat, + private void calculerDeadHeatPremiereEtTroisieme(ResultatCourseTriplet resultat, Map deadHeatInfo, double massePartager) { int nombreCombinaisons = deadHeatInfo.get(1) * deadHeatInfo.get(3); @@ -183,7 +183,7 @@ public class CalculGainsService { resultat.setRapportSpecialGagnant(rapportOrdreInexact / 4); } - private void calculerDeadHeatDeuxiemePlace(ResultatCourse resultat, + private void calculerDeadHeatDeuxiemePlace(ResultatCourseTriplet resultat, Map deadHeatInfo, double massePartager) { int nombreCombinaisons = deadHeatInfo.get(2); @@ -216,7 +216,7 @@ public class CalculGainsService { resultat.setRapportSpecialGagnant(rapportOrdreInexact / 4); } - private void calculerDeadHeatTroisiemePlace(ResultatCourse resultat, + private void calculerDeadHeatTroisiemePlace(ResultatCourseTriplet resultat, Map deadHeatInfo, double massePartager) { int nombreCombinaisons = deadHeatInfo.get(3); @@ -249,11 +249,11 @@ public class CalculGainsService { resultat.setRapportSpecialGagnant(rapportOrdreInexact / 4); } - private void calculerGainsParis(Course course, ResultatCourse resultat) { - List paris = pariRepository.findByCourseId(course.getId()); + private void calculerGainsParis(CourseTriplet course, ResultatCourseTriplet resultat) { + List paris = pariRepository.findByCourseId(course.getId()); - for (Pari pari : paris) { - Pari.StatutPari statut = determinerStatutPari(pari, resultat); + for (PariTriplet pari : paris) { + StatutPari statut = determinerStatutPari(pari, resultat); pari.setStatut(statut); double gain = 0.0; @@ -279,18 +279,18 @@ public class CalculGainsService { } } - private Pari.StatutPari determinerStatutPari(Pari pari, ResultatCourse resultat) { + private StatutPari determinerStatutPari(PariTriplet pari, ResultatCourseTriplet resultat) { int nombreNonPartants = compterNonPartants(pari); if (nombreNonPartants == 3) { - return Pari.StatutPari.REMBOURSE; + return StatutPari.REMBOURSE; } List troisPremiers = getTroisPremiersChevaux(resultat); List chevauxPari = pari.getChevauxOrdre(); if (!troisPremiers.containsAll(chevauxPari)) { - return Pari.StatutPari.PERDANT; + return StatutPari.PERDANT; } if (nombreNonPartants == 1) { @@ -299,14 +299,14 @@ public class CalculGainsService { return verifierSpecialGagnant(pari, resultat); } - if (pari.getTypePari() == Pari.TypePari.TRIPLET_ORDRE_EXACT) { - return estOrdreExact(pari, resultat) ? Pari.StatutPari.GAGNANT : Pari.StatutPari.PERDANT; + if (pari.getTypePari() == PariTriplet.TypePari.TRIPLET_ORDRE_EXACT) { + return estOrdreExact(pari, resultat) ? StatutPari.GAGNANT : StatutPari.PERDANT; } - return Pari.StatutPari.GAGNANT; + return StatutPari.GAGNANT; } - private Pari.StatutPari verifierSpecialJumele(Pari pari, ResultatCourse resultat) { + private StatutPari verifierSpecialJumele(PariTriplet pari, ResultatCourseTriplet resultat) { List chevauxPartants = getChevauxPartants(pari); List deuxPremiers = getDeuxPremiersChevaux(resultat); @@ -319,13 +319,13 @@ public class CalculGainsService { if (ordreArrivee.get(0).equals(ordrePari.get(0)) && ordreArrivee.get(1).equals(ordrePari.get(1))) { - return Pari.StatutPari.SPECIAL_JUMELE; + return StatutPari.SPECIAL_JUMELE; } } - return Pari.StatutPari.PERDANT; + return StatutPari.PERDANT; } - private Pari.StatutPari verifierSpecialGagnant(Pari pari, ResultatCourse resultat) { + private StatutPari verifierSpecialGagnant(PariTriplet pari, ResultatCourseTriplet resultat) { List chevauxPartants = getChevauxPartants(pari); if (chevauxPartants.size() == 1) { @@ -335,44 +335,44 @@ public class CalculGainsService { if (premierCheval.equals(chevalPari)) { // Vérifier que le cheval est bien désigné à la première place if (pari.getChevauxOrdre().get(0).equals(chevalPari)) { - return Pari.StatutPari.SPECIAL_GAGNANT; + return StatutPari.SPECIAL_GAGNANT; } } } - return Pari.StatutPari.PERDANT; + return StatutPari.PERDANT; } // Méthodes auxiliaires - private long compterMisesOrdreExact(Course course) { - return (long) pariRepository.findByCourseIdAndTypePari(course.getId(), Pari.TypePari.TRIPLET_ORDRE_EXACT) + private long compterMisesOrdreExact(CourseTriplet course) { + return (long) pariRepository.findByCourseIdAndTypePari(course.getId(), PariTriplet.TypePari.TRIPLET_ORDRE_EXACT) .stream() .mapToDouble(p -> p.getMise() / MISE_UNITAIRE) .sum(); } - private long compterMisesOrdreInexact(Course course) { - return (long) pariRepository.findByCourseIdAndTypePari(course.getId(), Pari.TypePari.TRIPLET_ORDRE_INEXACT) + private long compterMisesOrdreInexact(CourseTriplet course) { + return (long) pariRepository.findByCourseIdAndTypePari(course.getId(), PariTriplet.TypePari.TRIPLET_ORDRE_INEXACT) .stream() .mapToDouble(p -> p.getMise() / MISE_UNITAIRE) .sum(); } - private int compterNonPartants(Pari pari) { + private int compterNonPartants(PariTriplet pari) { return (int) pari.getChevauxOrdre().stream() .map(chevalId -> chevalRepository.findById(chevalId).orElse(null)) - .filter(cheval -> cheval != null && !cheval.getEstPartant()) + .filter(cheval -> cheval != null && !cheval.getNonPartant()) .count(); } - private List getChevauxPartants(Pari pari) { + private List getChevauxPartants(PariTriplet pari) { return pari.getChevauxOrdre().stream() .map(chevalId -> chevalRepository.findById(chevalId).orElse(null)) - .filter(cheval -> cheval != null && cheval.getEstPartant()) - .map(Cheval::getId) + .filter(cheval -> cheval != null && cheval.getNonPartant()) + .map(ChevalTriplet::getId) .collect(Collectors.toList()); } - private List getTroisPremiersChevaux(ResultatCourse resultat) { + private List getTroisPremiersChevaux(ResultatCourseTriplet resultat) { return Arrays.asList( resultat.getPositionsArrivee().get(1), resultat.getPositionsArrivee().get(2), @@ -380,31 +380,31 @@ public class CalculGainsService { ); } - private List getDeuxPremiersChevaux(ResultatCourse resultat) { + private List getDeuxPremiersChevaux(ResultatCourseTriplet resultat) { return Arrays.asList( resultat.getPositionsArrivee().get(1), resultat.getPositionsArrivee().get(2) ); } - private Long getPremierCheval(ResultatCourse resultat) { + private Long getPremierCheval(ResultatCourseTriplet resultat) { return resultat.getPositionsArrivee().get(1); } - private List getOrdreArrivee(ResultatCourse resultat) { + private List getOrdreArrivee(ResultatCourseTriplet resultat) { return resultat.getPositionsArrivee().entrySet().stream() .sorted(Map.Entry.comparingByKey()) .map(Map.Entry::getValue) .collect(Collectors.toList()); } - private boolean estOrdreExact(Pari pari, ResultatCourse resultat) { + private boolean estOrdreExact(PariTriplet pari, ResultatCourseTriplet resultat) { List ordreArrivee = getOrdreArrivee(resultat); return pari.getChevauxOrdre().equals(ordreArrivee.subList(0, 3)); } - private double calculerGainPariGagnant(Pari pari, ResultatCourse resultat) { - double rapport = (pari.getTypePari() == Pari.TypePari.TRIPLET_ORDRE_EXACT) ? + private double calculerGainPariGagnant(PariTriplet pari, ResultatCourseTriplet resultat) { + double rapport = (pari.getTypePari() == PariTriplet.TypePari.TRIPLET_ORDRE_EXACT) ? resultat.getRapportTripletOrdre() : resultat.getRapportTripletDesordre(); return rapport * (pari.getMise() / MISE_UNITAIRE); @@ -416,18 +416,18 @@ public class CalculGainsService { return (n * (n - 1) * (n - 2)) / 6; } - private boolean determinerDeadHeat(Course course) { - List chevaux = chevalRepository.findByCourseId(course.getId()); + private boolean determinerDeadHeat(CourseTriplet course) { + List chevaux = chevalRepository.findByCourseId(course.getId()); return chevaux.stream() - .anyMatch(cheval -> cheval.getStatut() == Cheval.StatutCheval.DEAD_HEAT); + .anyMatch(cheval -> cheval.getStatut() == ChevalTriplet.StatutCheval.DEAD_HEAT); } - private Map analyserDeadHeatPositions(Course course) { + private Map analyserDeadHeatPositions(CourseTriplet course) { Map deadHeatPositions = new HashMap<>(); - List chevaux = chevalRepository.findByCourseId(course.getId()); + List chevaux = chevalRepository.findByCourseId(course.getId()); - for (Cheval cheval : chevaux) { - if (cheval.getStatut() == Cheval.StatutCheval.DEAD_HEAT && cheval.getPositionArrivee() != null) { + for (ChevalTriplet cheval : chevaux) { + if (cheval.getStatut() == ChevalTriplet.StatutCheval.DEAD_HEAT && cheval.getPositionArrivee() != null) { deadHeatPositions.merge(cheval.getPositionArrivee(), 1, Integer::sum); } } @@ -435,11 +435,11 @@ public class CalculGainsService { return deadHeatPositions; } - private Map determinerPositionsArrivee(Course course) { + private Map determinerPositionsArrivee(CourseTriplet course) { Map positions = new HashMap<>(); - List chevaux = chevalRepository.findByCourseId(course.getId()); + List chevaux = chevalRepository.findByCourseId(course.getId()); - for (Cheval cheval : chevaux) { + for (ChevalTriplet cheval : chevaux) { if (cheval.getPositionArrivee() != null) { positions.put(cheval.getPositionArrivee(), cheval.getId()); } diff --git a/src/main/java/com/pmumali/ch7_triplet/service/CourseService.java b/src/main/java/com/pmumali/ch7_triplet/service/CourseTripletService.java similarity index 60% rename from src/main/java/com/pmumali/ch7_triplet/service/CourseService.java rename to src/main/java/com/pmumali/ch7_triplet/service/CourseTripletService.java index 3bba32f..c3e0bf8 100644 --- a/src/main/java/com/pmumali/ch7_triplet/service/CourseService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/CourseTripletService.java @@ -1,7 +1,7 @@ package com.pmumali.ch7_triplet.service; -import com.pmumali.ch7_triplet.model.Course; -import com.pmumali.ch7_triplet.repository.CourseRepository; +import com.pmumali.ch7_triplet.model.CourseTriplet; +import com.pmumali.ch7_triplet.repository.CourseTripletRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -10,26 +10,26 @@ import java.util.Optional; @Service @RequiredArgsConstructor -public class CourseService { +public class CourseTripletService { - private final CourseRepository courseRepository; + private final CourseTripletRepository courseRepository; - public List findAll() { + public List findAll() { return courseRepository.findAll(); } - public Optional findById(Long id) { + public Optional findById(Long id) { return courseRepository.findById(id); } - public Course save(Course course) { + public CourseTriplet save(CourseTriplet course) { return courseRepository.save(course); } - public Optional update(Long id, Course courseDetails) { + public Optional update(Long id, CourseTriplet courseDetails) { return courseRepository.findById(id).map(course -> { course.setNom(courseDetails.getNom()); - course.setDateHeure(courseDetails.getDateHeure()); + course.setHeureCourse(courseDetails.getHeureCourse()); course.setHippodrome(courseDetails.getHippodrome()); course.setNombrePartants(courseDetails.getNombrePartants()); course.setStatut(courseDetails.getStatut()); @@ -43,16 +43,16 @@ public class CourseService { public void terminerCourse(Long id) { courseRepository.findById(id).ifPresent(course -> { - course.setStatut(Course.StatutCourse.TERMINEE); + course.setStatut(CourseTriplet.StatutCourse.TERMINEE); courseRepository.save(course); }); } - public List findByStatut(Course.StatutCourse statut) { + public List findByStatut(CourseTriplet.StatutCourse statut) { return courseRepository.findByStatut(statut); } - public List findByHippodrome(String hippodrome) { + public List findByHippodrome(String hippodrome) { return courseRepository.findByHippodrome(hippodrome); } } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch7_triplet/service/PariService.java b/src/main/java/com/pmumali/ch7_triplet/service/PariTripletService.java similarity index 63% rename from src/main/java/com/pmumali/ch7_triplet/service/PariService.java rename to src/main/java/com/pmumali/ch7_triplet/service/PariTripletService.java index 92bf3ba..af0ac47 100644 --- a/src/main/java/com/pmumali/ch7_triplet/service/PariService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/PariTripletService.java @@ -1,7 +1,8 @@ package com.pmumali.ch7_triplet.service; -import com.pmumali.ch7_triplet.model.Pari; -import com.pmumali.ch7_triplet.repository.PariRepository; +import com.pmumali.ch7_triplet.model.PariTriplet; +import com.pmumali.ch7_triplet.model.StatutPari; +import com.pmumali.ch7_triplet.repository.PariTripletRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -10,28 +11,28 @@ import java.util.Optional; @Service @RequiredArgsConstructor -public class PariService { +public class PariTripletService { - private final PariRepository pariRepository; - private final ValidationPariService validationPariService; + private final PariTripletRepository pariRepository; + private final ValidationPariTripletService validationPariService; - public List findAll() { + public List findAll() { return pariRepository.findAll(); } - public Optional findById(Long id) { + public Optional findById(Long id) { return pariRepository.findById(id); } - public List findByCourseId(Long courseId) { + public List findByCourseId(Long courseId) { return pariRepository.findByCourseId(courseId); } - public List findByUtilisateurId(String utilisateurId) { +/* public List findByUtilisateurId(String utilisateurId) { return pariRepository.findByUtilisateurId(utilisateurId); - } + }*/ - public Pari creerPari(Pari pari) { + public PariTriplet creerPari(PariTriplet pari) { // Valider le pari avant sauvegarde validationPariService.validerPari(pari); @@ -42,7 +43,7 @@ public class PariService { return pariRepository.save(pari); } - public Pari save(Pari pari) { + public PariTriplet save(PariTriplet pari) { return pariRepository.save(pari); } @@ -50,17 +51,17 @@ public class PariService { pariRepository.deleteById(id); } - public List findByStatut(Pari.StatutPari statut) { + public List findByStatut(StatutPari statut) { return pariRepository.findByStatut(statut); } - public List findByCourseIdAndStatut(Long courseId, Pari.StatutPari statut) { + public List findByCourseIdAndStatut(Long courseId, StatutPari statut) { return pariRepository.findByCourseIdAndStatut(courseId, statut); } public double getTotalMisesByCourse(Long courseId) { return pariRepository.findByCourseId(courseId).stream() - .mapToDouble(Pari::getMise) + .mapToDouble(PariTriplet::getMise) .sum(); } diff --git a/src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseService.java b/src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseTripletService.java similarity index 52% rename from src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseService.java rename to src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseTripletService.java index 3f2adcd..28d0896 100644 --- a/src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/ResultatCourseTripletService.java @@ -1,7 +1,7 @@ package com.pmumali.ch7_triplet.service; -import com.pmumali.ch7_triplet.model.ResultatCourse; -import com.pmumali.ch7_triplet.repository.ResultatCourseRepository; +import com.pmumali.ch7_triplet.model.ResultatCourseTriplet; +import com.pmumali.ch7_triplet.repository.ResultatCourseTripletRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -9,15 +9,15 @@ import java.util.Optional; @Service @RequiredArgsConstructor -public class ResultatCourseService { +public class ResultatCourseTripletService { - private final ResultatCourseRepository resultatCourseRepository; + private final ResultatCourseTripletRepository resultatCourseRepository; - public Optional findByCourseId(Long courseId) { + public Optional findByCourseId(Long courseId) { return resultatCourseRepository.findByCourseId(courseId); } - public ResultatCourse save(ResultatCourse resultatCourse) { + public ResultatCourseTriplet save(ResultatCourseTriplet resultatCourse) { return resultatCourseRepository.save(resultatCourse); } diff --git a/src/main/java/com/pmumali/ch7_triplet/service/ValidationPariService.java b/src/main/java/com/pmumali/ch7_triplet/service/ValidationPariTripletService.java similarity index 75% rename from src/main/java/com/pmumali/ch7_triplet/service/ValidationPariService.java rename to src/main/java/com/pmumali/ch7_triplet/service/ValidationPariTripletService.java index 33a1839..77bd846 100644 --- a/src/main/java/com/pmumali/ch7_triplet/service/ValidationPariService.java +++ b/src/main/java/com/pmumali/ch7_triplet/service/ValidationPariTripletService.java @@ -1,20 +1,20 @@ package com.pmumali.ch7_triplet.service; -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 com.pmumali.ch7_triplet.model.CourseTriplet; +import com.pmumali.ch7_triplet.model.PariTriplet; +import com.pmumali.ch7_triplet.repository.ChevalTripletRepository; +import com.pmumali.ch7_triplet.repository.CourseTripletRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor -public class ValidationPariService { +public class ValidationPariTripletService { - private final CourseRepository courseRepository; - private final ChevalRepository chevalRepository; + private final CourseTripletRepository courseRepository; + private final ChevalTripletRepository chevalRepository; - public void validerPari(Pari pari) { + public void validerPari(PariTriplet pari) { // Vérifier que la course existe et est ouverte aux paris validerCourse(pari.getCourse().getId()); @@ -30,7 +30,7 @@ public class ValidationPariService { private void validerCourse(Long courseId) { courseRepository.findById(courseId).ifPresentOrElse(course -> { - if (course.getStatut() != Course.StatutCourse.PROGRAMMEE) { + if (course.getStatut() != CourseTriplet.StatutCourse.PROGRAMMEE) { throw new IllegalArgumentException("La course n'est plus ouverte aux paris"); } }, () -> { @@ -38,10 +38,10 @@ public class ValidationPariService { }); } - private void validerChevaux(Pari pari) { + private void validerChevaux(PariTriplet pari) { for (Long chevalId : pari.getChevauxOrdre()) { chevalRepository.findById(chevalId).ifPresentOrElse(cheval -> { - if (!cheval.getEstPartant()) { + if (!cheval.getNonPartant()) { throw new IllegalArgumentException("Le cheval " + cheval.getNom() + " est non-partant"); } if (!cheval.getCourse().getId().equals(pari.getCourse().getId())) { @@ -54,7 +54,7 @@ public class ValidationPariService { } } - private void validerMise(Pari pari) { + private void validerMise(PariTriplet pari) { double miseUnitaire = 500; // Mise de base selon l'article 1 if (pari.getMise() < miseUnitaire) { @@ -72,7 +72,7 @@ public class ValidationPariService { } } - private void validerTypePari(Pari pari) { + private void validerTypePari(PariTriplet pari) { // Validation selon le type de pari et les formules (article 7) // Implémentation simplifiée } diff --git a/src/main/java/com/pmumali/ch8_quatro/controller/ControllerQuatro.java b/src/main/java/com/pmumali/ch8_quatro/controller/ControllerQuatro.java index a242b0a..bbc959a 100644 --- a/src/main/java/com/pmumali/ch8_quatro/controller/ControllerQuatro.java +++ b/src/main/java/com/pmumali/ch8_quatro/controller/ControllerQuatro.java @@ -15,20 +15,20 @@ import java.util.List; public class ControllerQuatro { private final ServiceQuatro serviceQuatro; - private final PariRepository pariRepository; - private final PaiementRepository paiementRepository; + private final PariQuatroRepository pariRepository; + private final PaiementQuatroRepository paiementRepository; - @PostMapping("/pari") - public ResponseEntity placerPari(@RequestBody RequetePari requetePari) { + // @PostMapping("/pari") + public ResponseEntity placerPari(@RequestBody RequetePari requetePari) { try { - Pari pari = serviceQuatro.placerPari(requetePari); + PariQuatro pari = serviceQuatro.placerPari(requetePari); return ResponseEntity.ok(pari); } catch (Exception e) { return ResponseEntity.badRequest().body(null); } } - @PostMapping("/calculer-paiements") + // @PostMapping("/calculer-paiements") public ResponseEntity> calculerPaiements(@RequestBody RequeteResultatCourse requeteResultat) { try { List paiements = serviceQuatro.calculerPaiements(requeteResultat); @@ -38,7 +38,7 @@ public class ControllerQuatro { } } - @PostMapping("/gerer-dead-heat") + // @PostMapping("/gerer-dead-heat") public ResponseEntity> gererDeadHeat(@RequestBody RequeteResultatCourse requeteResultat) { try { List paiements = serviceQuatro.gererDeadHeat(requeteResultat); @@ -48,17 +48,17 @@ public class ControllerQuatro { } } - @GetMapping("/paris/course/{courseId}") - public ResponseEntity> getParisParCourse(@PathVariable Long courseId) { + // @GetMapping("/paris/course/{courseId}") + public ResponseEntity> getParisParCourse(@PathVariable Long courseId) { return ResponseEntity.ok(pariRepository.findByCourseId(courseId)); } - @GetMapping("/paiements/pari/{pariId}") - public ResponseEntity> getPaiementsParPari(@PathVariable Long pariId) { + // @GetMapping("/paiements/pari/{pariId}") + public ResponseEntity> getPaiementsParPari(@PathVariable Long pariId) { return ResponseEntity.ok(paiementRepository.findByPariId(pariId)); } - @GetMapping("/calcul-combinaisons") + // @GetMapping("/calcul-combinaisons") public ResponseEntity calculerCombinaisons( @RequestParam TypePari typePari, @RequestParam int nombreChevaux) { @@ -66,7 +66,7 @@ public class ControllerQuatro { return ResponseEntity.ok(nombreCombinaisons); } - @GetMapping("/calcul-valeur-mise") + // @GetMapping("/calcul-valeur-mise") public ResponseEntity calculerValeurMise( @RequestParam TypePari typePari, @RequestParam int nombreChevaux) { diff --git a/src/main/java/com/pmumali/ch8_quatro/model/Cheval.java b/src/main/java/com/pmumali/ch8_quatro/model/ChevalQuatro.java similarity index 79% rename from src/main/java/com/pmumali/ch8_quatro/model/Cheval.java rename to src/main/java/com/pmumali/ch8_quatro/model/ChevalQuatro.java index 5199cfd..a5994bf 100644 --- a/src/main/java/com/pmumali/ch8_quatro/model/Cheval.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/ChevalQuatro.java @@ -10,7 +10,7 @@ import lombok.*; @AllArgsConstructor @Builder @Table(name = "cheval") -public class Cheval { +public class ChevalQuatro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -23,4 +23,8 @@ public class Cheval { @Column(name = "non_partant") private boolean nonPartant; + + @ManyToOne + @JoinColumn(name = "course_id") + private CourseQuatro course; } diff --git a/src/main/java/com/pmumali/ch8_quatro/model/Course.java b/src/main/java/com/pmumali/ch8_quatro/model/CourseQuatro.java similarity index 91% rename from src/main/java/com/pmumali/ch8_quatro/model/Course.java rename to src/main/java/com/pmumali/ch8_quatro/model/CourseQuatro.java index c56b0a1..02e3e0f 100644 --- a/src/main/java/com/pmumali/ch8_quatro/model/Course.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/CourseQuatro.java @@ -12,7 +12,7 @@ import java.util.List; @AllArgsConstructor @Builder @Table(name = "course") -public class Course { +public class CourseQuatro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -27,7 +27,7 @@ public class Course { @JoinTable(name = "course_chevaux", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "cheval_id")) - private List chevaux; + private List chevaux; @Enumerated(EnumType.STRING) @Column(name = "statut") diff --git a/src/main/java/com/pmumali/ch8_quatro/model/Paiement.java b/src/main/java/com/pmumali/ch8_quatro/model/PaiementQuatro.java similarity index 91% rename from src/main/java/com/pmumali/ch8_quatro/model/Paiement.java rename to src/main/java/com/pmumali/ch8_quatro/model/PaiementQuatro.java index efcf5c5..ea45034 100644 --- a/src/main/java/com/pmumali/ch8_quatro/model/Paiement.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/PaiementQuatro.java @@ -11,14 +11,14 @@ import java.time.LocalDateTime; @AllArgsConstructor @Builder @Table(name = "paiement") -public class Paiement { +public class PaiementQuatro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "pari_id") - private Pari pari; + private PariQuatro pari; @Column(name = "montant") private Double montant; diff --git a/src/main/java/com/pmumali/ch8_quatro/model/Pari.java b/src/main/java/com/pmumali/ch8_quatro/model/PariQuatro.java similarity index 89% rename from src/main/java/com/pmumali/ch8_quatro/model/Pari.java rename to src/main/java/com/pmumali/ch8_quatro/model/PariQuatro.java index 2ed8f12..af23aa1 100644 --- a/src/main/java/com/pmumali/ch8_quatro/model/Pari.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/PariQuatro.java @@ -12,20 +12,20 @@ import java.util.List; @AllArgsConstructor @Builder @Table(name = "pari") -public class Pari { +public class PariQuatro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "course_id") - private Course course; + private CourseQuatro course; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "pari_chevaux", joinColumns = @JoinColumn(name = "pari_id"), inverseJoinColumns = @JoinColumn(name = "cheval_id")) - private List chevauxSelectionnes; + private List chevauxSelectionnes; @Column(name = "mise") private Double mise; diff --git a/src/main/java/com/pmumali/ch8_quatro/model/ResultatCourse.java b/src/main/java/com/pmumali/ch8_quatro/model/ResultatCourseQuatro.java similarity index 84% rename from src/main/java/com/pmumali/ch8_quatro/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch8_quatro/model/ResultatCourseQuatro.java index 6b7da1b..50dae43 100644 --- a/src/main/java/com/pmumali/ch8_quatro/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch8_quatro/model/ResultatCourseQuatro.java @@ -11,41 +11,41 @@ import java.util.List; @AllArgsConstructor @Builder @Table(name = "resultat_course") -public class ResultatCourse { +public class ResultatCourseQuatro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "course_id") - private Course course; + private CourseQuatro course; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "resultat_premiers", joinColumns = @JoinColumn(name = "resultat_id"), inverseJoinColumns = @JoinColumn(name = "cheval_id")) @OrderColumn(name = "ordre_position") - private List premiers; + private List premiers; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "resultat_seconds", joinColumns = @JoinColumn(name = "resultat_id"), inverseJoinColumns = @JoinColumn(name = "cheval_id")) - private List seconds; + private List seconds; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "resultat_troisiemes", joinColumns = @JoinColumn(name = "resultat_id"), inverseJoinColumns = @JoinColumn(name = "cheval_id")) - private List troisiemes; + private List troisiemes; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "resultat_quatriemes", joinColumns = @JoinColumn(name = "resultat_id"), inverseJoinColumns = @JoinColumn(name = "cheval_id")) - private List quatriemes; + private List quatriemes; - @Column(name = "masse_partager") + @Column(name = "masse_apartager") private Double massePartager; @Column(name = "recette_nette") diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/ChevalQuatroRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/ChevalQuatroRepository.java new file mode 100644 index 0000000..ba8e2fc --- /dev/null +++ b/src/main/java/com/pmumali/ch8_quatro/repository/ChevalQuatroRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch8_quatro.repository; + +import com.pmumali.ch8_quatro.model.ChevalQuatro; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ChevalQuatroRepository extends JpaRepository { + List findByNonPartant(boolean nonPartant); + List findByIdIn(List ids); +} diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/ChevalRepository.java deleted file mode 100644 index d6fce5b..0000000 --- a/src/main/java/com/pmumali/ch8_quatro/repository/ChevalRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pmumali.ch8_quatro.repository; - -import com.pmumali.ch8_quatro.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/ch8_quatro/repository/CourseQuatroRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/CourseQuatroRepository.java new file mode 100644 index 0000000..14c1f5a --- /dev/null +++ b/src/main/java/com/pmumali/ch8_quatro/repository/CourseQuatroRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch8_quatro.repository; + +import com.pmumali.ch8_quatro.model.CourseQuatro; +import com.pmumali.ch8_quatro.model.StatutCourse; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CourseQuatroRepository extends JpaRepository { + List findByStatut(StatutCourse statut); +} diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/CourseRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/CourseRepository.java deleted file mode 100644 index 092793a..0000000 --- a/src/main/java/com/pmumali/ch8_quatro/repository/CourseRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pmumali.ch8_quatro.repository; - -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; - -public interface CourseRepository extends JpaRepository { - List findByStatut(StatutCourse statut); -} diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/PaiementQuatroRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/PaiementQuatroRepository.java new file mode 100644 index 0000000..408cd94 --- /dev/null +++ b/src/main/java/com/pmumali/ch8_quatro/repository/PaiementQuatroRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch8_quatro.repository; + +import com.pmumali.ch8_quatro.model.PaiementQuatro; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface PaiementQuatroRepository extends JpaRepository { + List findByPariId(Long pariId); + List findByPariCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/PaiementRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/PaiementRepository.java deleted file mode 100644 index 930ea9f..0000000 --- a/src/main/java/com/pmumali/ch8_quatro/repository/PaiementRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pmumali.ch8_quatro.repository; - -import com.pmumali.ch8_quatro.model.Paiement; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface PaiementRepository extends JpaRepository { - List findByPariId(Long pariId); - List findByPariCourseId(Long courseId); -} diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/PariQuatroRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/PariQuatroRepository.java new file mode 100644 index 0000000..3f35f82 --- /dev/null +++ b/src/main/java/com/pmumali/ch8_quatro/repository/PariQuatroRepository.java @@ -0,0 +1,12 @@ +package com.pmumali.ch8_quatro.repository; + +import com.pmumali.ch8_quatro.model.PariQuatro; +import com.pmumali.ch8_quatro.model.TypePari; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface PariQuatroRepository extends JpaRepository { + List findByCourseId(Long courseId); + List findByParieurId(Long parieurId); + List findByCourseIdAndTypePari(Long courseId, TypePari typePari); +} diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/PariRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/PariRepository.java deleted file mode 100644 index 8408760..0000000 --- a/src/main/java/com/pmumali/ch8_quatro/repository/PariRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pmumali.ch8_quatro.repository; - -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; - -public interface PariRepository extends JpaRepository { - List findByCourseId(Long courseId); - List findByParieurId(Long parieurId); - List findByCourseIdAndTypePari(Long courseId, TypePari typePari); -} diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/ParieurRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/ParieurQuatroRepository.java similarity index 74% rename from src/main/java/com/pmumali/ch8_quatro/repository/ParieurRepository.java rename to src/main/java/com/pmumali/ch8_quatro/repository/ParieurQuatroRepository.java index 5cf1004..275d12c 100644 --- a/src/main/java/com/pmumali/ch8_quatro/repository/ParieurRepository.java +++ b/src/main/java/com/pmumali/ch8_quatro/repository/ParieurQuatroRepository.java @@ -5,6 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; -public interface ParieurRepository extends JpaRepository { +public interface ParieurQuatroRepository extends JpaRepository { List findByNomContaining(String nom); } diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseQuatroRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseQuatroRepository.java new file mode 100644 index 0000000..7fd0e98 --- /dev/null +++ b/src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseQuatroRepository.java @@ -0,0 +1,8 @@ +package com.pmumali.ch8_quatro.repository; + +import com.pmumali.ch8_quatro.model.ResultatCourseQuatro; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResultatCourseQuatroRepository extends JpaRepository { + ResultatCourseQuatro findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseRepository.java deleted file mode 100644 index 513e16c..0000000 --- a/src/main/java/com/pmumali/ch8_quatro/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pmumali.ch8_quatro.repository; - -import com.pmumali.ch8_quatro.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/ch8_quatro/service/ServiceQuatro.java b/src/main/java/com/pmumali/ch8_quatro/service/ServiceQuatro.java index 1505e48..a240656 100644 --- a/src/main/java/com/pmumali/ch8_quatro/service/ServiceQuatro.java +++ b/src/main/java/com/pmumali/ch8_quatro/service/ServiceQuatro.java @@ -14,34 +14,34 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class ServiceQuatro { - private final PariRepository pariRepository; - private final CourseRepository courseRepository; - private final ChevalRepository chevalRepository; - private final PaiementRepository paiementRepository; - private final ParieurRepository parieurRepository; - private final ResultatCourseRepository resultatCourseRepository; + private final PariQuatroRepository pariRepository; + private final CourseQuatroRepository courseRepository; + private final ChevalQuatroRepository chevalRepository; + private final PaiementQuatroRepository paiementRepository; + private final ParieurQuatroRepository parieurRepository; + private final ResultatCourseQuatroRepository resultatCourseRepository; private static final double MISE_BASE = 500.0; private static final double MISE_UNITAIRE_MAX = 20 * MISE_BASE; @Transactional - public Pari placerPari(RequetePari requete) { + public PariQuatro placerPari(RequetePari 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()) + CourseQuatro course = courseRepository.findById(requete.getCourseId()) .orElseThrow(() -> new RuntimeException("Course non trouvée")); - List chevaux = chevalRepository.findAllById(requete.getChevalIds()); + List chevaux = chevalRepository.findAllById(requete.getChevalIds()); if (chevaux.size() != 4) { throw new IllegalArgumentException("Exactement 4 chevaux doivent être sélectionnés"); } // Vérification des chevaux non-partants - long nombreNonPartants = chevaux.stream().filter(Cheval::isNonPartant).count(); + long nombreNonPartants = chevaux.stream().filter(ChevalQuatro::isNonPartant).count(); if (nombreNonPartants > 0) { throw new IllegalArgumentException("Impossible de parier sur des chevaux non-partants"); } @@ -52,7 +52,7 @@ public class ServiceQuatro { Parieur parieur = parieurRepository.findById(requete.getParieurId()) .orElseThrow(() -> new RuntimeException("Parieur non trouvé")); - Pari pari = Pari.builder() + PariQuatro pari = PariQuatro.builder() .course(course) .chevauxSelectionnes(chevaux) .mise(miseEffective) @@ -66,11 +66,11 @@ public class ServiceQuatro { @Transactional public List calculerPaiements(RequeteResultatCourse requeteResultat) { - ResultatCourse resultat = creerResultatCourse(requeteResultat); - List tousLesParis = pariRepository.findByCourseId(requeteResultat.getCourseId()); + ResultatCourseQuatro resultat = creerResultatCourse(requeteResultat); + List tousLesParis = pariRepository.findByCourseId(requeteResultat.getCourseId()); List paiements = new ArrayList<>(); - for (Pari pari : tousLesParis) { + for (PariQuatro pari : tousLesParis) { ReponsePaiement paiement = calculerPaiementPourPari(pari, resultat); if (paiement != null) { paiements.add(paiement); @@ -81,9 +81,9 @@ public class ServiceQuatro { return paiements; } - private ReponsePaiement calculerPaiementPourPari(Pari pari, ResultatCourse resultat) { - List chevauxSelectionnes = pari.getChevauxSelectionnes(); - long nombreNonPartants = chevauxSelectionnes.stream().filter(Cheval::isNonPartant).count(); + private ReponsePaiement calculerPaiementPourPari(PariQuatro pari, ResultatCourseQuatro resultat) { + List chevauxSelectionnes = pari.getChevauxSelectionnes(); + long nombreNonPartants = chevauxSelectionnes.stream().filter(ChevalQuatro::isNonPartant).count(); // Article 4: Cas des non-partants if (nombreNonPartants >= 1) { @@ -105,8 +105,8 @@ public class ServiceQuatro { return null; } - private ReponsePaiement gererCasNonPartants(Pari pari, ResultatCourse resultat, long nombreNonPartants) { - List chevauxParticipants = pari.getChevauxSelectionnes().stream() + private ReponsePaiement gererCasNonPartants(PariQuatro pari, ResultatCourseQuatro resultat, long nombreNonPartants) { + List chevauxParticipants = pari.getChevauxSelectionnes().stream() .filter(cheval -> !cheval.isNonPartant()) .toList(); @@ -149,25 +149,25 @@ public class ServiceQuatro { return null; } - private boolean sontChevauxEnPositionsTop(List chevaux, ResultatCourse resultat, int positionTop) { + private boolean sontChevauxEnPositionsTop(List chevaux, ResultatCourseQuatro resultat, int positionTop) { return chevaux.stream().allMatch(cheval -> estChevalEnPosition(cheval, resultat.getPremiers()) || (positionTop >= 2 && estChevalEnPosition(cheval, resultat.getSeconds())) || (positionTop >= 3 && estChevalEnPosition(cheval, resultat.getTroisiemes()))); } - private boolean estChevalEnPosition(Cheval cheval, List chevauxPosition) { + private boolean estChevalEnPosition(ChevalQuatro cheval, List chevauxPosition) { return chevauxPosition != null && chevauxPosition.contains(cheval); } - private double calculerPartQuatro(ResultatCourse resultat) { + private double calculerPartQuatro(ResultatCourseQuatro resultat) { double masseAPartager = resultat.getRecetteNette() - resultat.getMontantRembourse() - resultat.getPrelevementsLegaux(); // Calcul simplifié - l'implémentation réelle considérerait le nombre de paris gagnants return masseAPartager; // Devrait être distribué entre les paris gagnants } - private void creerEnregistrementPaiement(Pari pari, ReponsePaiement paiement) { - Paiement enregistrementPaiement = Paiement.builder() + private void creerEnregistrementPaiement(PariQuatro pari, ReponsePaiement paiement) { + PaiementQuatro enregistrementPaiement = PaiementQuatro.builder() .pari(pari) .montant(paiement.getMontant()) .heurePaiement(LocalDateTime.now()) @@ -176,11 +176,11 @@ public class ServiceQuatro { paiementRepository.save(enregistrementPaiement); } - private ResultatCourse creerResultatCourse(RequeteResultatCourse requete) { - Course course = courseRepository.findById(requete.getCourseId()) + private ResultatCourseQuatro creerResultatCourse(RequeteResultatCourse requete) { + CourseQuatro course = courseRepository.findById(requete.getCourseId()) .orElseThrow(() -> new RuntimeException("Course non trouvée")); - ResultatCourse resultat = ResultatCourse.builder() + ResultatCourseQuatro resultat = ResultatCourseQuatro.builder() .course(course) .premiers(chevalRepository.findAllById(requete.getChevauxPremiers())) .seconds(chevalRepository.findAllById(requete.getChevauxSeconds())) @@ -197,16 +197,16 @@ public class ServiceQuatro { // Méthodes pour gérer les dead-heat (Article 3) @Transactional public List gererDeadHeat(RequeteResultatCourse requeteResultat) { - ResultatCourse resultat = creerResultatCourse(requeteResultat); - List tousLesParis = pariRepository.findByCourseId(requeteResultat.getCourseId()); + ResultatCourseQuatro resultat = creerResultatCourse(requeteResultat); + List tousLesParis = pariRepository.findByCourseId(requeteResultat.getCourseId()); List paiements = new ArrayList<>(); // Implémentation des règles complexes de dead-heat - Map> combinaisonsPayables = identifierCombinaisonsPayablesDeadHeat(resultat, tousLesParis); + Map> combinaisonsPayables = identifierCombinaisonsPayablesDeadHeat(resultat, tousLesParis); - for (Map.Entry> entry : combinaisonsPayables.entrySet()) { + for (Map.Entry> entry : combinaisonsPayables.entrySet()) { double part = calculerPartDeadHeat(resultat, entry.getValue()); - for (Pari pari : entry.getValue()) { + for (PariQuatro pari : entry.getValue()) { ReponsePaiement paiement = new ReponsePaiement(pari.getId(), part, TypePaiement.QUATRO, "Paiement Dead-Heat"); paiements.add(paiement); creerEnregistrementPaiement(pari, paiement); @@ -216,10 +216,10 @@ public class ServiceQuatro { return paiements; } - private Map> identifierCombinaisonsPayablesDeadHeat(ResultatCourse resultat, List paris) { - Map> combinaisons = new HashMap<>(); + private Map> identifierCombinaisonsPayablesDeadHeat(ResultatCourseQuatro resultat, List paris) { + Map> combinaisons = new HashMap<>(); - for (Pari pari : paris) { + for (PariQuatro pari : paris) { String combinaison = genererCleCombinaison(pari.getChevauxSelectionnes()); if (estCombinaisonPayableDeadHeat(pari.getChevauxSelectionnes(), resultat)) { combinaisons.computeIfAbsent(combinaison, k -> new ArrayList<>()).add(pari); @@ -229,7 +229,7 @@ public class ServiceQuatro { return combinaisons; } - private boolean estCombinaisonPayableDeadHeat(List chevaux, ResultatCourse resultat) { + private boolean estCombinaisonPayableDeadHeat(List chevaux, ResultatCourseQuatro resultat) { // Implémentation des règles spécifiques de dead-heat selon l'article 3 // Cette méthode devrait implémenter toutes les sous-règles a) à h) return chevaux.stream().allMatch(cheval -> @@ -239,16 +239,16 @@ public class ServiceQuatro { estChevalEnPosition(cheval, resultat.getQuatriemes())); } - private String genererCleCombinaison(List chevaux) { + private String genererCleCombinaison(List chevaux) { return chevaux.stream() .map(cheval -> String.valueOf(cheval.getId())) .sorted() .collect(Collectors.joining("-")); } - private double calculerPartDeadHeat(ResultatCourse resultat, List parisCombinaison) { + private double calculerPartDeadHeat(ResultatCourseQuatro resultat, List parisCombinaison) { double masseAPartager = resultat.getMassePartager(); - double totalMisesCombinaison = parisCombinaison.stream().mapToDouble(Pari::getMise).sum(); + double totalMisesCombinaison = parisCombinaison.stream().mapToDouble(PariQuatro::getMise).sum(); return (masseAPartager / parisCombinaison.size()) * (totalMisesCombinaison / masseAPartager); } diff --git a/src/main/java/com/pmumali/ch9_quarteplus/controller/ControleurQuartePlus.java b/src/main/java/com/pmumali/ch9_quarteplus/controller/ControleurQuartePlus.java index 6d99715..36c2eb3 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/controller/ControleurQuartePlus.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/controller/ControleurQuartePlus.java @@ -1,7 +1,7 @@ package com.pmumali.ch9_quarteplus.controller; import com.pmumali.ch9_quarteplus.model.*; -import com.pmumali.ch9_quarteplus.repository.PaiementRepository; +import com.pmumali.ch9_quarteplus.repository.PaiementQuartePlusRepository; import com.pmumali.ch9_quarteplus.repository.PariQuartePlusRepository; import com.pmumali.ch9_quarteplus.service.ServiceQuartePlus; import lombok.RequiredArgsConstructor; @@ -11,13 +11,13 @@ import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api/quarte-plus") +@RequestMapping("/api/quarteplus") @RequiredArgsConstructor public class ControleurQuartePlus { private final ServiceQuartePlus service; private final PariQuartePlusRepository pariRepository; - private final PaiementRepository paiementRepository; + private final PaiementQuartePlusRepository paiementRepository; @PostMapping("/pari") public ResponseEntity placerPari(@RequestBody RequetePari requete) { @@ -29,7 +29,7 @@ public class ControleurQuartePlus { } } - @PostMapping("/calculer-paiements") + // @PostMapping("/calculer-paiements") public ResponseEntity> calculerPaiements(@RequestBody RequeteResultat requete) { try { List paiements = service.calculerPaiements(requete); @@ -39,7 +39,7 @@ public class ControleurQuartePlus { } } - @PostMapping("/dead-heat/{type}") + // @PostMapping("/dead-heat/{type}") public ResponseEntity> gererDeadHeat( @RequestBody RequeteResultat requete, @PathVariable TypeDeadHeat type) { @@ -51,7 +51,7 @@ public class ControleurQuartePlus { } } - @GetMapping("/calcul-combinaison") + // @GetMapping("/calcul-combinaison") public ResponseEntity calculerCombinaison( @RequestParam TypePari typePari, @RequestParam Integer nombreChevaux) { @@ -63,17 +63,17 @@ public class ControleurQuartePlus { } } - @PostMapping("/cagnotte") - public ResponseEntity creerCagnotte(@RequestParam Double montant) { + // @PostMapping("/cagnotte") + public ResponseEntity creerCagnotte(@RequestParam Double montant) { try { - Cagnotte cagnotte = service.creerCagnotte(montant); + CagnotteQuartePlus cagnotte = service.creerCagnotte(montant); return ResponseEntity.ok(cagnotte); } catch (Exception e) { return ResponseEntity.badRequest().build(); } } - @PostMapping("/cagnotte/{cagnotteId}/utiliser") + // @PostMapping("/cagnotte/{cagnotteId}/utiliser") public ResponseEntity utiliserCagnotte( @PathVariable Long cagnotteId, @RequestParam Long courseId) { @@ -85,13 +85,13 @@ public class ControleurQuartePlus { } } - @GetMapping("/paris/course/{courseId}") + // @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) { + // @GetMapping("/paiements/pari/{pariId}") + public ResponseEntity> getPaiementsPari(@PathVariable Long pariId) { return ResponseEntity.ok(paiementRepository.findByPariId(pariId)); } } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/Cagnotte.java b/src/main/java/com/pmumali/ch9_quarteplus/model/CagnotteQuartePlus.java similarity index 92% rename from src/main/java/com/pmumali/ch9_quarteplus/model/Cagnotte.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/CagnotteQuartePlus.java index 38278d9..ecbeb47 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/model/Cagnotte.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/CagnotteQuartePlus.java @@ -11,7 +11,7 @@ import java.time.LocalDateTime; @AllArgsConstructor @Builder @Table(name = "cagnotte") -public class Cagnotte { +public class CagnotteQuartePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/Cheval.java b/src/main/java/com/pmumali/ch9_quarteplus/model/ChevalQuartePlus.java similarity index 63% rename from src/main/java/com/pmumali/ch9_quarteplus/model/Cheval.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/ChevalQuartePlus.java index 031a2b1..149a69e 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/model/Cheval.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/ChevalQuartePlus.java @@ -1,5 +1,6 @@ package com.pmumali.ch9_quarteplus.model; +import com.pmumali.ch5_trio.model.CourseTrio; import jakarta.persistence.*; import lombok.*; @@ -9,12 +10,16 @@ import lombok.*; @AllArgsConstructor @Builder @Table(name = "cheval") -public class Cheval { +public class ChevalQuartePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; private Integer numero; + @Column(name = "non_partant") private Boolean nonPartant; + @ManyToOne + @JoinColumn(name = "course_id") + private CourseQuartePlus course; } \ No newline at end of file diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/Course.java b/src/main/java/com/pmumali/ch9_quarteplus/model/CourseQuartePlus.java similarity index 80% rename from src/main/java/com/pmumali/ch9_quarteplus/model/Course.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/CourseQuartePlus.java index 404836c..ccc6fab 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/model/Course.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/CourseQuartePlus.java @@ -12,16 +12,17 @@ import java.util.List; @AllArgsConstructor @Builder @Table(name = "course") -public class Course { +public class CourseQuartePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; + @Column(name = "heure_course") private LocalDateTime heureCourse; @OneToMany - private List chevaux; + private List chevaux; @Enumerated(EnumType.STRING) private StatutCourse statut; diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/Paiement.java b/src/main/java/com/pmumali/ch9_quarteplus/model/PaiementQuartePlus.java similarity index 82% rename from src/main/java/com/pmumali/ch9_quarteplus/model/Paiement.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/PaiementQuartePlus.java index 35f56e4..c9de34f 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/model/Paiement.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/PaiementQuartePlus.java @@ -11,7 +11,7 @@ import java.time.LocalDateTime; @AllArgsConstructor @Builder @Table(name = "paiement") -public class Paiement { +public class PaiementQuartePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -20,8 +20,10 @@ public class Paiement { private PariQuartePlus pari; private Double montant; + @Column(name = "heure_paiement") private LocalDateTime heurePaiement; @Enumerated(EnumType.STRING) + @Column(name = "type_paiement") private TypePaiement typePaiement; } diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/PariQuartePlus.java b/src/main/java/com/pmumali/ch9_quarteplus/model/PariQuartePlus.java index 5e1a930..3771412 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/model/PariQuartePlus.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/PariQuartePlus.java @@ -18,20 +18,21 @@ public class PariQuartePlus { private Long id; @ManyToOne - private Course course; + private CourseQuartePlus course; @OrderColumn(name = "ordre_cheval") @ManyToMany - private List chevauxSelectionnes; + private List chevauxSelectionnes; private Double mise; private LocalDateTime heurePari; @Enumerated(EnumType.STRING) + @Column(name = "type_pari") private TypePari typePari; @ManyToOne - private Parieur parieur; + private ParieurQuartePlus parieur; private Boolean validationOrdreExact; } diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/Parieur.java b/src/main/java/com/pmumali/ch9_quarteplus/model/ParieurQuartePlus.java similarity index 84% rename from src/main/java/com/pmumali/ch9_quarteplus/model/Parieur.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/ParieurQuartePlus.java index eef0f93..25829d9 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/model/Parieur.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/ParieurQuartePlus.java @@ -9,12 +9,13 @@ import lombok.*; @AllArgsConstructor @Builder @Table(name = "parieur") -public class Parieur { +public class ParieurQuartePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nom; private String identification; + @Column(name = "mise_totale") private Double miseTotale; } diff --git a/src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourse.java b/src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourseQuartePlus.java similarity index 55% rename from src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourse.java rename to src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourseQuartePlus.java index 8432e36..2cfda7e 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourse.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/model/ResultatCourseQuartePlus.java @@ -11,32 +11,36 @@ import java.util.List; @AllArgsConstructor @Builder @Table(name = "resultat_course") -public class ResultatCourse { +public class ResultatCourseQuartePlus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne - private Course course; + private CourseQuartePlus course; @OrderColumn(name = "ordre_arrivee") @ManyToMany - private List ordreArrivee; + private List ordreArrivee; @ManyToMany - private List premiers; + private List premiers; @ManyToMany - private List seconds; + private List seconds; @ManyToMany - private List troisiemes; + private List troisiemes; @ManyToMany - private List quatriemes; + private List quatriemes; + @Column(name = "recette_nette") private Double recetteNette; + @Column(name = "montant_rembourse") private Double montantRembourse; + @Column(name = "prelevements_legaux") private Double prelevementsLegaux; + @Column(name = "masse_apartager") private Double masseAPartager; } diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteQuartePlusRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteQuartePlusRepository.java new file mode 100644 index 0000000..7befca4 --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteQuartePlusRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch9_quarteplus.repository; + +import com.pmumali.ch9_quarteplus.model.CagnotteQuartePlus; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CagnotteQuartePlusRepository extends JpaRepository { + List findByUtilisee(Boolean utilisee); +} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteRepository.java deleted file mode 100644 index 56b9fac..0000000 --- a/src/main/java/com/pmumali/ch9_quarteplus/repository/CagnotteRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch9_quarteplus.repository; - -import com.pmumali.ch9_quarteplus.model.Cagnotte; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface CagnotteRepository extends JpaRepository { - List findByUtilisee(Boolean utilisee); -} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalQuartePlusRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalQuartePlusRepository.java new file mode 100644 index 0000000..c3cffe5 --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalQuartePlusRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch9_quarteplus.repository; + +import com.pmumali.ch9_quarteplus.model.ChevalQuartePlus; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ChevalQuartePlusRepository extends JpaRepository { + List findByNonPartant(Boolean nonPartant); +} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalRepository.java deleted file mode 100644 index 8c2ddee..0000000 --- a/src/main/java/com/pmumali/ch9_quarteplus/repository/ChevalRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch9_quarteplus.repository; - -import com.pmumali.ch9_quarteplus.model.Cheval; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface ChevalRepository extends JpaRepository { - List findByNonPartant(Boolean nonPartant); -} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/CourseQuartePlusRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/CourseQuartePlusRepository.java new file mode 100644 index 0000000..ab5c3c0 --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/CourseQuartePlusRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch9_quarteplus.repository; + +import com.pmumali.ch9_quarteplus.model.CourseQuartePlus; +import com.pmumali.ch9_quarteplus.model.StatutCourse; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CourseQuartePlusRepository extends JpaRepository { + List findByStatut(StatutCourse statut); +} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/CourseRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/CourseRepository.java deleted file mode 100644 index 48a82cf..0000000 --- a/src/main/java/com/pmumali/ch9_quarteplus/repository/CourseRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pmumali.ch9_quarteplus.repository; - -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; - -public interface CourseRepository extends JpaRepository { - List findByStatut(StatutCourse statut); -} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementQuartePlusRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementQuartePlusRepository.java new file mode 100644 index 0000000..4a4842b --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementQuartePlusRepository.java @@ -0,0 +1,10 @@ +package com.pmumali.ch9_quarteplus.repository; + +import com.pmumali.ch9_quarteplus.model.PaiementQuartePlus; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface PaiementQuartePlusRepository extends JpaRepository { + List findByPariId(Long pariId); +} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementRepository.java deleted file mode 100644 index ba03c8f..0000000 --- a/src/main/java/com/pmumali/ch9_quarteplus/repository/PaiementRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pmumali.ch9_quarteplus.repository; - -import com.pmumali.ch9_quarteplus.model.Paiement; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface PaiementRepository extends JpaRepository { - List findByPariId(Long pariId); -} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurQuartePlusRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurQuartePlusRepository.java new file mode 100644 index 0000000..98eab18 --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurQuartePlusRepository.java @@ -0,0 +1,11 @@ +package com.pmumali.ch9_quarteplus.repository; + + +import com.pmumali.ch9_quarteplus.model.ParieurQuartePlus; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ParieurQuartePlusRepository extends JpaRepository { + List findByNomContaining(String nom); +} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurRepository.java deleted file mode 100644 index cee68cc..0000000 --- a/src/main/java/com/pmumali/ch9_quarteplus/repository/ParieurRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -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/ResultatCourseQuartePlusRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseQuartePlusRepository.java new file mode 100644 index 0000000..cc2698e --- /dev/null +++ b/src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseQuartePlusRepository.java @@ -0,0 +1,8 @@ +package com.pmumali.ch9_quarteplus.repository; + +import com.pmumali.ch9_quarteplus.model.ResultatCourseQuartePlus; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResultatCourseQuartePlusRepository extends JpaRepository { + ResultatCourseQuartePlus findByCourseId(Long courseId); +} diff --git a/src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseRepository.java b/src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseRepository.java deleted file mode 100644 index fb26428..0000000 --- a/src/main/java/com/pmumali/ch9_quarteplus/repository/ResultatCourseRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -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/ch9_quarteplus/service/ServiceQuartePlus.java b/src/main/java/com/pmumali/ch9_quarteplus/service/ServiceQuartePlus.java index db79922..4aa6e9d 100644 --- a/src/main/java/com/pmumali/ch9_quarteplus/service/ServiceQuartePlus.java +++ b/src/main/java/com/pmumali/ch9_quarteplus/service/ServiceQuartePlus.java @@ -16,12 +16,12 @@ import java.util.stream.Collectors; public class ServiceQuartePlus { private final PariQuartePlusRepository pariRepository; - private final CourseRepository courseRepository; - private final ChevalRepository chevalRepository; - private final PaiementRepository paiementRepository; - private final ResultatCourseRepository resultatRepository; - private final CagnotteRepository cagnotteRepository; - private final ParieurRepository parieurRepository; + private final CourseQuartePlusRepository courseRepository; + private final ChevalQuartePlusRepository chevalRepository; + private final PaiementQuartePlusRepository paiementRepository; + private final ResultatCourseQuartePlusRepository resultatRepository; + private final CagnotteQuartePlusRepository cagnotteRepository; + private final ParieurQuartePlusRepository parieurRepository; private static final Double MISE_BASE = 500.0; private static final Double MISE_MAX = 20 * MISE_BASE; @@ -33,17 +33,17 @@ public class ServiceQuartePlus { throw new IllegalArgumentException("La mise doit être au moins " + MISE_BASE + " FCFA"); } - Course course = courseRepository.findById(requete.getCourseId()) + CourseQuartePlus course = courseRepository.findById(requete.getCourseId()) .orElseThrow(() -> new RuntimeException("Course non trouvée")); - List chevaux = chevalRepository.findAllById(requete.getChevalIds()); + List chevaux = chevalRepository.findAllById(requete.getChevalIds()); if (chevaux.size() != 4) { throw new IllegalArgumentException("Exactement 4 chevaux doivent être sélectionnés"); } // Vérification des non-partants - long nonPartants = chevaux.stream().filter(Cheval::getNonPartant).count(); + long nonPartants = chevaux.stream().filter(ChevalQuartePlus::getNonPartant).count(); if (nonPartants >= 2) { throw new IllegalArgumentException("Maximum 1 cheval non-partant autorisé"); } @@ -51,7 +51,7 @@ public class ServiceQuartePlus { // 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é")); + ParieurQuartePlus parieur = parieurRepository.findById(requete.getParieurId()).orElseThrow(() -> new RuntimeException("Parieur non trouvé")); PariQuartePlus pari = PariQuartePlus.builder() .course(course) @@ -68,7 +68,7 @@ public class ServiceQuartePlus { @Transactional public List calculerPaiements(RequeteResultat requete) { - ResultatCourse resultat = creerResultat(requete); + ResultatCourseQuartePlus resultat = creerResultat(requete); List paris = pariRepository.findByCourseId(requete.getCourseId()); List paiements = new ArrayList<>(); @@ -99,9 +99,9 @@ public class ServiceQuartePlus { return paiements; } - private ReponsePaiement calculerPaiementPari(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { - List chevauxPari = pari.getChevauxSelectionnes(); - long nonPartants = chevauxPari.stream().filter(Cheval::getNonPartant).count(); + private ReponsePaiement calculerPaiementPari(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { + List chevauxPari = pari.getChevauxSelectionnes(); + long nonPartants = chevauxPari.stream().filter(ChevalQuartePlus::getNonPartant).count(); // Article 4: Gestion des non-partants if (nonPartants >= 2) { @@ -148,7 +148,7 @@ public class ServiceQuartePlus { return null; } - private boolean estOrdreExact(List chevauxPari, List ordreArrivee) { + private boolean estOrdreExact(List chevauxPari, List ordreArrivee) { if (chevauxPari.size() != 4 || ordreArrivee.size() < 4) return false; return chevauxPari.get(0).equals(ordreArrivee.get(0)) && @@ -157,27 +157,27 @@ public class ServiceQuartePlus { chevauxPari.get(3).equals(ordreArrivee.get(3)); } - private boolean estDansListe(Cheval cheval, List liste) { + private boolean estDansListe(ChevalQuartePlus cheval, List liste) { return liste != null && liste.contains(cheval); } - private boolean estEligibleBonus3(PariQuartePlus pari, ResultatCourse resultat) { - List chevauxPari = pari.getChevauxSelectionnes(); + private boolean estEligibleBonus3(PariQuartePlus pari, ResultatCourseQuartePlus resultat) { + List chevauxPari = pari.getChevauxSelectionnes(); if (chevauxPari.size() < 3 || resultat.getOrdreArrivee().size() < 3) { return false; } // Vérifier si les 3 premiers du pari correspondent aux 3 premiers à l'arrivée - List troisPremiersArrivee = resultat.getOrdreArrivee().subList(0, 3); - List troisPremiersPari = chevauxPari.subList(0, 3); + List troisPremiersArrivee = resultat.getOrdreArrivee().subList(0, 3); + List troisPremiersPari = chevauxPari.subList(0, 3); if (!troisPremiersPari.equals(troisPremiersArrivee)) { return false; } // Vérifier que le 4ème cheval n'est pas dans les 4 premiers (pour Bonus 3 normal) - Cheval quatriemePari = chevauxPari.get(3); + ChevalQuartePlus quatriemePari = chevauxPari.get(3); boolean estDansTop4 = estDansListe(quatriemePari, resultat.getPremiers()) || estDansListe(quatriemePari, resultat.getSeconds()) || estDansListe(quatriemePari, resultat.getTroisiemes()) || @@ -188,7 +188,7 @@ public class ServiceQuartePlus { return !estDansTop4; } - private Double calculerMasseAPartager(ResultatCourse resultat) { + private Double calculerMasseAPartager(ResultatCourseQuartePlus resultat) { // Article 5: MAP = RNET - MREMB - PRELEV return resultat.getRecetteNette() - resultat.getMontantRembourse() - @@ -211,7 +211,7 @@ public class ServiceQuartePlus { } private void enregistrerPaiement(PariQuartePlus pari, ReponsePaiement reponse) { - Paiement paiement = Paiement.builder() + PaiementQuartePlus paiement = PaiementQuartePlus.builder() .pari(pari) .montant(reponse.getMontant()) .heurePaiement(LocalDateTime.now()) @@ -220,11 +220,11 @@ public class ServiceQuartePlus { paiementRepository.save(paiement); } - private ResultatCourse creerResultat(RequeteResultat requete) { - Course course = courseRepository.findById(requete.getCourseId()) + private ResultatCourseQuartePlus creerResultat(RequeteResultat requete) { + CourseQuartePlus course = courseRepository.findById(requete.getCourseId()) .orElseThrow(() -> new RuntimeException("Course non trouvée")); - return ResultatCourse.builder() + return ResultatCourseQuartePlus.builder() .course(course) .ordreArrivee(chevalRepository.findAllById(requete.getOrdreArriveeIds())) .premiers(chevalRepository.findAllById(requete.getPremiersIds())) @@ -358,7 +358,7 @@ public class ServiceQuartePlus { // Méthodes pour gérer les dead-heat (Article 3) @Transactional public List gererDeadHeat(RequeteResultat requete, TypeDeadHeat typeDeadHeat) { - ResultatCourse resultat = creerResultat(requete); + ResultatCourseQuartePlus resultat = creerResultat(requete); List paris = pariRepository.findByCourseId(requete.getCourseId()); List paiements = new ArrayList<>(); @@ -375,7 +375,7 @@ public class ServiceQuartePlus { return paiements; } - private ReponsePaiement calculerPaiementDeadHeat(PariQuartePlus pari, ResultatCourse resultat, + private ReponsePaiement calculerPaiementDeadHeat(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager, TypeDeadHeat typeDeadHeat) { switch (typeDeadHeat) { case QUATRE_PREMIERS_OU_PLUS: @@ -399,9 +399,9 @@ public class ServiceQuartePlus { } } - private ReponsePaiement gererDeadHeatQuatrePremiers(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiement gererDeadHeatQuatrePremiers(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { // Article 3a: Dead-heat de 4+ chevaux premiers - List chevauxPari = pari.getChevauxSelectionnes(); + List chevauxPari = pari.getChevauxSelectionnes(); if (chevauxPari.stream().allMatch(cheval -> estDansListe(cheval, resultat.getPremiers()))) { int nombreCombinaisons = compterCombinaisonsDeadHeat(resultat.getPremiers().size(), 4); @@ -412,9 +412,9 @@ public class ServiceQuartePlus { return null; } - private ReponsePaiement gererDeadHeatTroisPremiersUnQuatrieme(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiement gererDeadHeatTroisPremiersUnQuatrieme(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { // Article 3b: Dead-heat de 3 premiers + 1+ quatrième - List chevauxPari = pari.getChevauxSelectionnes(); + List chevauxPari = pari.getChevauxSelectionnes(); boolean troisPremiersOk = chevauxPari.subList(0, 3).stream() .allMatch(cheval -> estDansListe(cheval, resultat.getPremiers())); @@ -430,40 +430,40 @@ public class ServiceQuartePlus { } // Implémentations similaires pour les autres types de dead-heat... - private ReponsePaiement gererDeadHeatDeuxPremiersDeuxTroisiemes(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiement gererDeadHeatDeuxPremiersDeuxTroisiemes(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { // Article 3c: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 2.0); } - private ReponsePaiement gererDeadHeatDeuxPremiersUnTroisiemeUnQuatrieme(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiement gererDeadHeatDeuxPremiersUnTroisiemeUnQuatrieme(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { // Article 3d: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); } - private ReponsePaiement gererDeadHeatTroisSeconds(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiement gererDeadHeatTroisSeconds(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { // Article 3e: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 2.0); } - private ReponsePaiement gererDeadHeatDeuxSecondsUnQuatrieme(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiement gererDeadHeatDeuxSecondsUnQuatrieme(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { // Article 3f: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); } - private ReponsePaiement gererDeadHeatDeuxTroisiemes(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiement gererDeadHeatDeuxTroisiemes(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { // Article 3g: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); } - private ReponsePaiement gererDeadHeatDeuxQuatriemes(PariQuartePlus pari, ResultatCourse resultat, Double masseAPartager) { + private ReponsePaiement gererDeadHeatDeuxQuatriemes(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager) { // Article 3h: Implémentation spécifique return calculerPaiementGeneriqueDeadHeat(pari, resultat, masseAPartager, 4.0); } - private ReponsePaiement calculerPaiementGeneriqueDeadHeat(PariQuartePlus pari, ResultatCourse resultat, + private ReponsePaiement calculerPaiementGeneriqueDeadHeat(PariQuartePlus pari, ResultatCourseQuartePlus resultat, Double masseAPartager, Double coefficient) { // Méthode générique pour les dead-heat avec coefficient spécifique - List chevauxPari = pari.getChevauxSelectionnes(); + List chevauxPari = pari.getChevauxSelectionnes(); if (chevauxPari.stream().allMatch(cheval -> estDansListe(cheval, resultat.getPremiers()) || @@ -491,7 +491,7 @@ public class ServiceQuartePlus { return resultat; } - private int compterCombinaisonsGagnantesDeadHeat(ResultatCourse resultat) { + private int compterCombinaisonsGagnantesDeadHeat(ResultatCourseQuartePlus resultat) { // Comptage simplifié des combinaisons gagnantes // Implémentation réelle dépendrait de la structure exacte du dead-heat return 1; @@ -506,8 +506,8 @@ public class ServiceQuartePlus { // Gestion de la cagnotte (Article 10) @Transactional - public Cagnotte creerCagnotte(Double montant) { - Cagnotte cagnotte = Cagnotte.builder() + public CagnotteQuartePlus creerCagnotte(Double montant) { + CagnotteQuartePlus cagnotte = CagnotteQuartePlus.builder() .montant(montant) .dateCreation(LocalDateTime.now()) .utilisee(false) @@ -517,7 +517,7 @@ public class ServiceQuartePlus { @Transactional public void utiliserCagnotte(Long cagnotteId, Long courseId) { - Cagnotte cagnotte = cagnotteRepository.findById(cagnotteId) + CagnotteQuartePlus cagnotte = cagnotteRepository.findById(cagnotteId) .orElseThrow(() -> new RuntimeException("Cagnotte non trouvée")); if (cagnotte.getUtilisee()) { @@ -529,7 +529,7 @@ public class ServiceQuartePlus { cagnotteRepository.save(cagnotte); // Ajouter le montant à la masse à partager de la course - ResultatCourse resultat = resultatRepository.findByCourseId(courseId); + ResultatCourseQuartePlus resultat = resultatRepository.findByCourseId(courseId); if (resultat != null) { resultat.setMasseAPartager(resultat.getMasseAPartager() + cagnotte.getMontant()); resultatRepository.save(resultat); @@ -537,7 +537,7 @@ public class ServiceQuartePlus { } @Transactional - public List getCagnottesDisponibles() { + public List getCagnottesDisponibles() { return cagnotteRepository.findByUtilisee(false); } @@ -550,11 +550,11 @@ public class ServiceQuartePlus { } public Double getMasseTotaleCourse(Long courseId) { - ResultatCourse resultat = resultatRepository.findByCourseId(courseId); + ResultatCourseQuartePlus resultat = resultatRepository.findByCourseId(courseId); return resultat != null ? resultat.getMasseAPartager() : 0.0; } - public List getHistoriquePaiementsParieur(Long parieurId) { + public List getHistoriquePaiementsParieur(Long parieurId) { List paris = pariRepository.findByParieurId(parieurId); return paris.stream() .flatMap(pari -> paiementRepository.findByPariId(pari.getId()).stream()) diff --git a/src/main/java/com/pmumali/common/controller/ChevalController.java b/src/main/java/com/pmumali/common/controller/ChevalController.java new file mode 100644 index 0000000..57eb01e --- /dev/null +++ b/src/main/java/com/pmumali/common/controller/ChevalController.java @@ -0,0 +1,49 @@ +package com.pmumali.common.controller; + +import com.pmumali.ch1_simple.model.ChevalSimple; +import com.pmumali.ch1_simple.service.ChevalSimpleService; +import com.pmumali.common.model.Cheval; +import com.pmumali.common.model.Option; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/api/cheval") +public class ChevalController { + + @Autowired + private ChevalSimpleService chevalService; + + @PostMapping("{option}") + public ResponseEntity ajouterCheval(@RequestBody Cheval cheval, @PathVariable Option option) { + + switch (option.name()) { + + case "SIMPLE" -> { return ResponseEntity.ok(chevalService.ajouterCheval((ChevalSimple)cheval)); } + + default -> { return ResponseEntity.ok((Cheval)(chevalService.ajouterCheval((ChevalSimple)cheval))); } + } + + } + + @GetMapping("/course/{courseId}") + public ResponseEntity> obtenirChevauxParCourse(@PathVariable Long courseId) { + + return ResponseEntity.ok( convertToChevalList(chevalService.obtenirChevauxParCourse(courseId))); + } + + //@GetMapping("/ecurie/{nomEcurie}") + public ResponseEntity> obtenirChevauxParEcurie(@PathVariable String nomEcurie) { + + return ResponseEntity.ok(convertToChevalList(chevalService.obtenirChevauxParEcurie(nomEcurie))); + } + + public List convertToChevalList(List chevalSimples) { + return new ArrayList<>(chevalSimples); + } +} + diff --git a/src/main/java/com/pmumali/common/controller/CourseController.java b/src/main/java/com/pmumali/common/controller/CourseController.java new file mode 100644 index 0000000..944b359 --- /dev/null +++ b/src/main/java/com/pmumali/common/controller/CourseController.java @@ -0,0 +1,58 @@ +package com.pmumali.common.controller; + +import com.pmumali.ch1_simple.model.ChevalSimple; +import com.pmumali.ch1_simple.model.CourseSimple; +import com.pmumali.ch1_simple.service.CourseSimpleService; +import com.pmumali.common.model.Course; +import com.pmumali.common.model.Option; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Description; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/api/course") +public class CourseController { + + @Autowired + private CourseSimpleService courseService; + + @PostMapping("{option}") + public ResponseEntity creerCourse(@RequestBody Course course,@PathVariable Option option) { + + switch (option.name()) { + + case "SIMPLE" -> { return ResponseEntity.ok(courseService.creerCourse((CourseSimple)course)); } + + default -> {return ResponseEntity.ok(courseService.creerCourse((CourseSimple)course)); } + } + + } + + // @GetMapping + public ResponseEntity> obtenirToutesCourses() { + return ResponseEntity.ok(new ArrayList<>(courseService.obtenirToutesCourses())); + } + + // @GetMapping("/{id}") + public ResponseEntity obtenirCourseParId(@PathVariable Long id) { + CourseSimple course = courseService.obtenirCourseParId(id); + return course != null ? ResponseEntity.ok(course) : ResponseEntity.notFound().build(); + } + + // @GetMapping("/terminees") + @Description("Afficher les courses Terminées") + public ResponseEntity> obtenirCoursesTerminees() { + return ResponseEntity.ok(new ArrayList<>(courseService.obtenirCoursesTerminees())); + } + + // @GetMapping("/avenir") + @Description("Afficher les courses à venir") + public ResponseEntity> obtenirCoursesAVenir() { + return ResponseEntity.ok(new ArrayList<>(courseService.obtenirCoursesAVenir())); + } +} + diff --git a/src/main/java/com/pmumali/common/controller/PariController.java b/src/main/java/com/pmumali/common/controller/PariController.java new file mode 100644 index 0000000..6e21ff2 --- /dev/null +++ b/src/main/java/com/pmumali/common/controller/PariController.java @@ -0,0 +1,55 @@ +package com.pmumali.common.controller; + +import com.pmumali.ch1_simple.model.CourseSimple; +import com.pmumali.ch1_simple.model.PariSimple; +import com.pmumali.ch1_simple.service.PariSimpleService; +import com.pmumali.common.model.Option; +import com.pmumali.common.model.Pari; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Description; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/api/pari") +public class PariController { + + @Autowired + private PariSimpleService pariService; + + // @PostMapping("{option}") + public ResponseEntity placerPari(@RequestBody Pari pari, @PathVariable Option option) { + + switch (option.name()) { + + case "SIMPLE" -> { return ResponseEntity.ok(pariService.placerPari((PariSimple) pari));} + + default -> { return ResponseEntity.ok(pariService.placerPari((PariSimple)pari)); } + } + + + } + + //@GetMapping("/course/{courseId}") + @Description("Afficher les paris par Course") + public ResponseEntity> obtenirParisParCourse(@PathVariable Long courseId) { + return ResponseEntity.ok(new ArrayList<>(pariService.obtenirParisParCourse(courseId))); + } + + //@GetMapping("/course/{courseId}/type/{typePari}") + @Description("Afficher les paris par type de pari") + public ResponseEntity> obtenirParisParCourseEtType( + @PathVariable Long courseId, @PathVariable String typePari) { + return ResponseEntity.ok(new ArrayList<>(pariService.obtenirParisParCourseEtType(courseId, typePari))); + } + + // @GetMapping("/cheval/{chevalId}") + @Description("Afficher les paris par Cheval ") + public ResponseEntity> obtenirParisParCheval(@PathVariable Long chevalId) { + return ResponseEntity.ok(new ArrayList<>(pariService.obtenirParisParCheval(chevalId))); + } +} + diff --git a/src/main/java/com/pmumali/common/controller/ResultatController.java b/src/main/java/com/pmumali/common/controller/ResultatController.java new file mode 100644 index 0000000..2698ebd --- /dev/null +++ b/src/main/java/com/pmumali/common/controller/ResultatController.java @@ -0,0 +1,52 @@ +// CourseController.java +package com.pmumali.common.controller; + +import com.pmumali.ch1_simple.model.PariSimple; +import com.pmumali.ch4_jumeleordre.dto.ResultatCourseDto; +import com.pmumali.ch4_jumeleordre.exception.ResultatCourseInvalideException; +import com.pmumali.ch4_jumeleordre.model.CourseJumeleOrdre; +import com.pmumali.ch4_jumeleordre.service.CourseJumeleOrdreService; +import com.pmumali.ch4_jumeleordre.service.ResultatCourseJumeleOrdreService; +import com.pmumali.common.model.Option; +import com.pmumali.common.model.Resultat; +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/resultat") +public class ResultatController { + + @Autowired + private CourseJumeleOrdreService courseService; + + @Autowired + private ResultatCourseJumeleOrdreService resultatCourseService; + + // @GetMapping("/actives") + public ResponseEntity> getCoursesActives() { + List courses = courseService.getCoursesActives(); + return ResponseEntity.ok(courses); + } + + // @PostMapping("{option}") + public ResponseEntity soumettreResultatCourse(@RequestBody Resultat resultatDto, @PathVariable Option option) { + try { + + switch (option.name()) { + + case "JUMELE_ORDRE" -> { resultatCourseService.traiterResultatCourse(resultatDto); } + + default -> { resultatCourseService.traiterResultatCourse(resultatDto); } + } + + + return ResponseEntity.ok().build(); + + } catch (ResultatCourseInvalideException e) { + return ResponseEntity.badRequest().build(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/pmumali/common/model/Cheval.java b/src/main/java/com/pmumali/common/model/Cheval.java new file mode 100644 index 0000000..f21da4d --- /dev/null +++ b/src/main/java/com/pmumali/common/model/Cheval.java @@ -0,0 +1,24 @@ +package com.pmumali.common.model; + +import com.pmumali.ch1_simple.model.CourseSimple; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +public abstract class Cheval { + private Long id; + + private String nom; + private int numero; + @Column(name = "non_partant") + private boolean nonPartant; + private String nomEcurie; + + @ManyToOne + @JoinColumn(name = "course_id") + private Course course; +} + diff --git a/src/main/java/com/pmumali/common/model/Course.java b/src/main/java/com/pmumali/common/model/Course.java new file mode 100644 index 0000000..c43a38c --- /dev/null +++ b/src/main/java/com/pmumali/common/model/Course.java @@ -0,0 +1,32 @@ +package com.pmumali.common.model; + +import com.pmumali.ch1_simple.model.ChevalSimple; +import com.pmumali.ch1_simple.model.ResultatCourseSimple; +import com.pmumali.ch2_jumelegagnant.model.ChevalJumeleGagnant; +import com.pmumali.ch3_jumeleplace.model.ChevalJumelePlace; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + + +@Data +public abstract class Course { + private Long id; + private String nom; + @Column(name = "heure_course") + private LocalDateTime heureCourse; + private String lieu; + private int nombreChevauxInscrits; + private boolean estTerminee; + private boolean estAnnulee; + + @OneToOne(mappedBy = "course", cascade = CascadeType.ALL) + private Resultat resultat; + + + +} diff --git a/src/main/java/com/pmumali/common/model/Option.java b/src/main/java/com/pmumali/common/model/Option.java new file mode 100644 index 0000000..335b2ac --- /dev/null +++ b/src/main/java/com/pmumali/common/model/Option.java @@ -0,0 +1,5 @@ +package com.pmumali.common.model; + +public enum Option { + SIMPLE, JUMELE_GAGNANT, JUMELE_PLACE, JUMELE_ORDRE, TRIO,TRIO_ORDRE,TRIPLET,QUATRO,QUARTE_PLUS,MULTI,QUINTE_PLUS +} diff --git a/src/main/java/com/pmumali/common/model/Pari.java b/src/main/java/com/pmumali/common/model/Pari.java new file mode 100644 index 0000000..0a13139 --- /dev/null +++ b/src/main/java/com/pmumali/common/model/Pari.java @@ -0,0 +1,46 @@ +package com.pmumali.common.model; + +import com.pmumali.ch1_simple.model.ChevalSimple; +import com.pmumali.ch1_simple.model.CourseSimple; +import com.pmumali.ch2_jumelegagnant.model.ChevalJumeleGagnant; +import com.pmumali.ch4_jumeleordre.model.ChevalJumeleOrdre; +import com.pmumali.ch4_jumeleordre.model.CourseJumeleOrdre; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + + +@Data +public abstract class Pari { + + private Long id; + @Column(name = "type_pari") + private String typePari; // GAGNANT ou PLACE + private double mise = 500.0; + private LocalDateTime datePari; + + private boolean estPaye; + private boolean estRembourse; + + @ManyToOne + @JoinColumn(name = "cheval_id") + private Cheval cheval; + + @ManyToOne + @JoinColumn(name = "cheval1_id") + private Cheval cheval1; + + @ManyToOne + @JoinColumn(name = "cheval2_id") + private Cheval cheval2; + + + @ManyToOne + private Cheval premier; + + @ManyToOne + private Cheval deuxieme; +} diff --git a/src/main/java/com/pmumali/common/model/Resultat.java b/src/main/java/com/pmumali/common/model/Resultat.java new file mode 100644 index 0000000..2bd7939 --- /dev/null +++ b/src/main/java/com/pmumali/common/model/Resultat.java @@ -0,0 +1,54 @@ +package com.pmumali.common.model; + +import com.pmumali.ch1_simple.model.CourseSimple; +import com.pmumali.ch4_jumeleordre.model.ChevalJumeleOrdre; +import com.pmumali.ch7_triplet.model.CourseTriplet; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + + +@Data +public abstract class Resultat { + + private Long id; + + @ElementCollection + private List chevauxPremiers; // Pour gérer les dead-heats + + @ElementCollection + private List chevauxDeuxiemes; // Pour gérer les dead-heats + + @ElementCollection + private List chevauxTroisiemes; // Pour gérer les dead-heats + + private boolean aDeadHeat; + + @Column(name = "total_mises") + private double totalMises; + @Column(name = "masse_apartager") + private double masseAPartager; + @Column(name = "prelevements_legaux") + private double prelevementsLegaux; + @Column(name = "montant_rembourse") + private double montantRembourse; + @Column(name = "montant_cagnotte") + private double montantCagnotte; + + @ManyToOne + private Cheval premier; + + @ManyToOne + private Cheval deuxieme; + + @ElementCollection + private List chevauxDeadHeat; + + @OneToOne + @JoinColumn(name = "course_id", nullable = false) + private Course course; + +} diff --git a/src/main/java/com/pmumali/common/util/CollectionTransformer.java b/src/main/java/com/pmumali/common/util/CollectionTransformer.java new file mode 100644 index 0000000..86e3d27 --- /dev/null +++ b/src/main/java/com/pmumali/common/util/CollectionTransformer.java @@ -0,0 +1,17 @@ +package com.pmumali.common.util; + +import java.util.ArrayList; +import java.util.List; + +public abstract class CollectionTransformer { + + protected abstract F transform(E e); + + public List transform(List list) { + List newList = new ArrayList(); + for (E e : list) { + newList.add(transform(e)); + } + return newList; + } +} diff --git a/src/main/java/com/pmumali/config/CorsConfig.java b/src/main/java/com/pmumali/config/CorsConfig.java new file mode 100644 index 0000000..48a33d8 --- /dev/null +++ b/src/main/java/com/pmumali/config/CorsConfig.java @@ -0,0 +1,29 @@ +package com.pmumali.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig { + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") // Tous les endpoints + .allowedOrigins("*" + // "http://localhost:3000", + // "http://frontend-domain.com", + // "https://frontend-domain.com" + ) + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + // .allowCredentials(true) + .maxAge(3600); // Cache la réponse preflight pendant 1 heure + } + }; + } +} diff --git a/src/main/java/com/pmumali/config/SecurityConfig.java b/src/main/java/com/pmumali/config/SecurityConfig.java new file mode 100644 index 0000000..f8f2ce2 --- /dev/null +++ b/src/main/java/com/pmumali/config/SecurityConfig.java @@ -0,0 +1,32 @@ +package com.pmumali.config; + +import com.pmumali.api.ApiKeyFilter; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class SecurityConfig { + + private final ApiKeyFilter apiKeyFilter; + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + return http + .csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(auth -> auth + .requestMatchers("/admin/**").permitAll() // tu peux protéger plus tard + .requestMatchers("/**").permitAll() // tu peux protéger plus tard + .anyRequest().authenticated() + ) + .addFilterBefore(apiKeyFilter, UsernamePasswordAuthenticationFilter.class) + .build(); + } +} + diff --git a/src/main/java/com/pmumali/config/SwaggerConfig.java b/src/main/java/com/pmumali/config/SwaggerConfig.java new file mode 100644 index 0000000..eefdfb1 --- /dev/null +++ b/src/main/java/com/pmumali/config/SwaggerConfig.java @@ -0,0 +1,26 @@ +package com.pmumali.config; + +import io.swagger.v3.oas.models.ExternalDocumentation; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI gymManagementOpenAPI() { + return new OpenAPI() + .info(new Info().title("PMU PLR Management API") + .description("API pour la Gestion des Paris PLR") + .version("v1.0") + .contact(new Contact() + .name("PMU") + .email("sidibe.abdoulkarim@pmumali.ml"))) + .externalDocs(new ExternalDocumentation() + .description("Documentation Wiki") + .url("https://www.pmumali.ml")); + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 97e0406..8582999 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,27 @@ -spring.application.name=API-PLR +spring.application.name=PMU API PLR +springdoc.api-docs.path=/api-docs +springdoc.swagger-ui.path=/swagger-ui-custom.html + +#spring.datasource.url=jdbc:postgresql://localhost:5432/dmp +# Configuration de la source de donn�es (DataSource) +spring.datasource.url=jdbc:postgresql://api_db:5432/plr +spring.datasource.username=postgres +spring.datasource.password=password +spring.datasource.driver-class-name=org.postgresql.Driver + +# Configuration de JPA (Hibernate) +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.show-sql=false +spring.jpa.properties.hibernate.format_sql= true + +spring.mail.host: smtp.gmail.com +spring.mail.port: 587 +spring.mail.username: ton.email@gmail.com +spring.mail.password: ton_mot_de_passe +spring.mail.properties.mail.smtp.auth: true +spring.mail.properties.mail.smtp.starttls: +spring.mail.properties.mail.smtp.enable: true + + +logging.level.org.hibernate=ERROR \ No newline at end of file diff --git a/src/test/java/com/pmu/mali/apiplr/ApiPlrApplicationTests.java b/src/test/java/com/pmu/mali/apiplr/ApiPlrApplicationTests.java deleted file mode 100644 index fbf6310..0000000 --- a/src/test/java/com/pmu/mali/apiplr/ApiPlrApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pmu.mali.apiplr; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ApiPlrApplicationTests { - - @Test - void contextLoads() { - } - -}