Files
api-plr/README.md
2025-09-25 13:22:35 +00:00

317 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Documentation API — PMU PLR
> **API de gestion des paris hippiques (PMU)**
> Ce projet implémente la logique complète de gestion de **chevaux**, **courses**, **paris**, **résultats** et **gains**.
---
## Table des matières
1. [Présentation générale](#présentation-générale)
2. [Installation & tests](#installation--tests)
- [Prérequis](#prérequis)
- [Clonage du projet](#clonage-du-projet)
- [Compilation & lancement](#compilation--lancement)
- [Tests avec Postman](#tests-avec-postman)
3. [Conventions API](#conventions-api)
4. [Flux typique (Happy Path)](#flux-typique-happy-path)
5. [Entités & Endpoints](#entités--endpoints)
- [Chevaux](#1-chevaux)
- [Courses & Inscriptions](#2-courses--inscriptions)
- [Paris](#3-paris)
- [Résultats](#4-résultats)
- [Gains](#5-gains)
6. [Règles métier & validations](#règles-métier--validations)
7. [Recettes de test](#recettes-de-test)
- [A) Flux complet](#a-flux-complet-end-to-end)
- [B) Validation & contraintes](#b-validation--contraintes)
- [C) Cas dex æquo (Dead-Heat)](#c-cas-dex-æquo-dead-heat)
- [D) Gestion NP/DQ](#d-gestion-npdq)
- [E) Idempotence du règlement](#e-idempotence-du-règlement)
8. [Exemples de payloads](#exemples-de-payloads)
---
## Présentation générale
Cette API gère le cycle complet du **Pari Mutuel Urbain (PMU)** :
- Gestion des **courses** (création, planification, mise à jour, clôture).
- Inscription et gestion des **chevaux** (insertion, participation, non-partant, disqualification).
- Création et mise à jour des **paris** (tous types : simple, couple, trio, quarté, quinté, multi, etc.).
- Déclaration des **résultats officiels**, avec gestion des ex æquo (Dead-Heat).
- Calcul et attribution des **gains** selon les règles PMU.
---
## Installation & tests
### Prérequis
- **Java 17+**
- **Maven**
- **PostgreSQL** (base `pmu`)
- **Postman** (pour importer la collection fournie)
### Clonage du projet
```bash
git clone https://github.com/<ton-org>/<ton-repo>.git
cd <ton-repo>
```
### Compilation & lancement
```bash
./mvnw clean install
./mvnw spring-boot:run
```
Le serveur démarre sur :
👉 http://localhost:8080
### Tests avec Postman
Importer la collection :
1. PMU PLR API - Full Test Collection.postman_collection.json
2. Définir la variable denvironnement baseUrl = http://localhost:8080
2. Exécuter les requêtes dans lordre :
- Création course → Ajout chevaux → Paris → Résultat → Règlement → Vérification gains.
## Conventions API
- Base URL : {{baseUrl}}
- Format JSON
- Enums :
- CourseStatue = **PLANIFIEE | EN_COURS | CLOTUREE | ANNULEE**
- PariType = **SIMPLE_GAGNANT | SIMPLE_PLACE | COUPLE_GAGNANT | COUPLE_ORDRE | TRIO | TRIO_ORDRE | TIERCE | QUARTE | QUINTE | QUINTE_PLUS | MULTI**
- Dead-Heat : plusieurs chevaux peuvent partager le même rang.
## Flux typique (Happy Path)
1. Créer une course (statut = PLANIFIEE).
2. Inscrire les chevaux (simple ou bulk).
3. Créer des paris (tant que la course est PLANIFIEE).
4. Déclarer les résultats officiels (Dead-Heat permis).
5. Fixer le Numéro+ pour Quinté+.
6. Régler la course (calcul des gains).
7. Vérifier les rapports et gains.
## Entités & Endpoints
### 1. Chevaux
Endpoints pour la gestion des données des chevaux, indépendamment de leur inscription à une course.
| Méthode | Endpoint | Description |
| :--- | :--- | :--- |
| `GET` | `/api/chevaux` | Lister tous les chevaux. |
| `GET` | `/api/chevaux/{id}` | Obtenir les détails d'un cheval. |
| `POST` | `/api/chevaux` | Créer un nouveau cheval. |
| `PUT` | `/api/chevaux/{id}` | Modifier les informations d'un cheval existant. |
| `DELETE` | `/api/chevaux/{id}` | Supprimer un cheval de la base de données. |
---
### 2. Courses & Inscriptions
Gérer la création et la modification des courses et des inscriptions de chevaux.
| Méthode | Endpoint | Description |
| :--- | :--- | :--- |
| `GET` | `/api/courses` | Lister toutes les courses. |
| `GET` | `/api/courses/{id}` | Obtenir les détails d'une course spécifique. |
| `GET` | `/api/courses/{STATUS: CourseStatue}` | Obtenir les courses spécifique par status (CourseStatue). |
| `POST` | `/api/courses` | Créer une nouvelle course. |
| `PUT` | `/api/courses/{id}` | Modifier une course existante. |
| `DELETE` | `/api/courses/{id}` | Supprimer une course. |
| `POST` | `/api/courses/chevaux` | Ajouter un seul cheval à une course. |
| `POST` | `/api/courses/chevaux` | Ajouter un cheval à une course en une seule requête. |
| `POST` | `/api/courses/chevaux/bulk` | Ajouter plusieurs chevaux à une course en une seule requête. |
| `GET` | `/api/courses/{id}/chevaux` | Lister les chevaux inscrites à une course. |
| `PUT` | `/api/courses/cheval-course/{id}/scratch?value={true\|false}` | (Dé)marquer un cheval comme non-partant (NP). |
| `PUT` | `/api/courses/cheval-course/{id}/disqualify?value={true\|false}` | (Dé)qualifier un cheval d'une course. |
| `DELETE` | `/api/courses/cheval-course/{id}` | Supprimer un cheval d'une course quelqu'en soit la course. |
| `DELETE` | `/api/courses/cheval-course/{id}` | Supprimer un cheval d'une course quelqu'en soit la course. |
---
### 3. Paris
Points d'accès pour la création, la modification et la gestion des paris.
| Méthode | Endpoint | Description |
| :--- | :--- | :--- |
| `POST` | `/api/paris` | Créer un nouveau pari. |
| `GET` | `/api/paris/{id}` | Obtenir le détail dun pari spécifique. |
| `PUT` | `/api/paris/{id}` | Modifier un pari existant. |
| `DELETE` | `/api/paris/{id}` | Supprimer un pari. |
| `GET` | `/api/paris` | Lister tous les paris (avec filtres possibles). |
| `GET` | `/api/paris/course/{courseId}` | Obtenir la liste de tous les paris pour une course spécifique. |
| `POST` | `/api/paris/course/settle/{courseId}` | Régler tous les paris d'une course après officialisation des résultats. |
| `GET` | `/api/paris/course/report/{courseId}` | Générer un rapport détaillé des paris d'une course. |
| `GET` | `/api/gains/pari/{pariId}` | Vérifier le gain associé à un pari donné. |
| `GET` | `/api/gains/course/{courseId}` | Lister tous les gains générés pour une course après règlement. |
---
### 4. Résultats
Gérer les résultats officiels et le classement d'une course.
| Méthode | Endpoint | Description |
| :--- | :--- | :--- |
| `POST` | `/api/resultats` | Créer un résultat pour une course. |
| `GET` | `/api/resultats` | Lister tous les résultats. |
| `GET` | `/api/resultats/course/{courseId}` | Récupérer le résultat dune course. |
| `PUT` | `/api/resultats/course/{courseId}` | Mettre à jour le résultat dune course. |
| `DELETE` | `/api/resultats/course/{courseId}` | Supprimer le résultat dune course. |
| `GET` | `/api/resultats/course/{courseId}/chevaux` | Lister les chevaux avec leurs rangs. |
| `POST` | `/api/resultats/course/{courseId}/chevaux` | Ajouter un cheval dans le résultat. |
| `PUT` | `/api/resultats/course/{courseId}/chevaux/{chevalId}` | Mettre à jour ou insérer le rang dun cheval. |
| `DELETE` | `/api/resultats/course/{courseId}/chevaux/{chevalId}` | Supprimer un cheval du résultat. |
| `PATCH` | `/api/resultats/course/{courseId}/numero-plus` | Fixer le **Numéro+ gagnant** (Quinté+). |
| `PUT` | `/api/resultats/course/{courseId}/numero-plus/draw` | Tirer au sort automatiquement le Numéro+. |
---
### 5. Gains
Points d'accès pour la vérification des gains et la génération de rapports.
| Méthode | Endpoint | Description |
| :--- | :--- | :--- |
| `GET` | `/api/gains/course/{courseId}` | Obtenir les gains de tous les paris dune course. |
| `GET` | `/api/gains/pari/{pariId}` | Obtenir les détails des gains pour un pari donné. |
| `POST` | `/api/paris/course/settle/{courseId}` | Régler et distribuer les gains dune course. |
## Règles métier & validations
Les règles métier et les validations appliquées aux différentes étapes du cycle de vie d'une course, des paris aux résultats.
---
### 1. Gestion des courses
* **Course PLANIFIÉE :** Il s'agit de la seule phase pendant laquelle il est possible d'enregistrer des paris. Toute tentative de créer un pari en dehors de ce statut sera rejetée.
* **Résultats créés :** Une fois que les résultats officiels sont enregistrés, le statut de la course est automatiquement mis à jour à **CLÔTURÉE**.
---
### 2. Validations des paris
Les règles suivantes sont appliquées pour garantir la validité des paris :
* **Positions obligatoires :** Pour les paris ordonnés, toutes les positions doivent être renseignées.
* **Doublons interdits :** Un ticket de pari ne peut pas contenir de doublons de cheval ou de position.
* **Dead-Heat :** Le système autorise les ex æquo (chevaux arrivant à égalité) dans les résultats.
* **Quinté+ :** Chaque ticket de Quinté+ se voit attribuer un **Numéro+** aléatoire au moment de la création du pari.
---
## Recettes de test
Ce document détaille les différentes recettes de test pour valider le bon fonctionnement de l'API.
---
### A) Flux complet (end-to-end)
1. Créer une course.
2. Inscrire des chevaux à la course.
3. Placer des paris sur la course.
4. Déclarer les résultats officiels.
5. Régler la course (calcul des gains).
6. Vérifier les gains générés pour les paris gagnants.
---
### B) Validation & contraintes
* **Pari avec cheval en double :** Tenter de placer un pari contenant deux fois le même cheval. Le système doit retourner une erreur **400 (Bad Request)**.
* **Pari avec cheval NP :** Tenter de placer un pari incluant un cheval marqué comme non-partant (NP). Le système doit rejeter le pari.
---
### C) Cas dex æquo (Dead-Heat)
* Déclarer deux chevaux ayant le même rang (par exemple, `rang=1`).
* Vérifier que le calcul du pari de type **SIMPLE_GAGNANT** fonctionne correctement pour l'un ou l'autre des chevaux à égalité.
---
### D) Gestion NP/DQ
* **Réintégration (NP) :** Envoyer une requête `PUT` avec `scratch?value=false` pour réintégrer un cheval précédemment non-partant.
* **Requalification (DQ) :** Envoyer une requête `PUT` avec `disqualify?value=false` pour requalifier un cheval précédemment disqualifié.
---
### E) Idempotence du règlement
* Tenter de régler une même course à deux reprises (`POST /api/paris/course/settle/{courseId}`). Les résultats du calcul des gains doivent être **identiques** à chaque exécution.
---
## Exemples de payloads
### 1. Données du pari
* **Endpoint :** `POST /api/paris`
* **Description :** Création d'un pari TRIO.
* **Corps de la requête :**
```json
{
"courseId": 4,
"pariType": "TRIO",
"mise": 3000.00,
"bettorRef": "punter-C",
"selections": [
{ "chevalId": 7, "position": 1 },
{ "chevalId": 9, "position": 2 },
{ "chevalId": 10, "position": 3 }
]
}
```
---
### 2. Données des résultats
* **Endpoint :** `POST /api/resultats`
* **Description :** Enregistrement des résultats officiels de la course.
* **Corps de la requête :**
```json
[
{ "chevalId": 9, "rang": 1 },
{ "chevalId": 7, "rang": 2 },
{ "chevalId": 10, "rang": 3 }
]
```
---
### 3. Numéro+ (non pertinent pour ce pari)
* **Endpoint :** `PATCH /api/resultats/course/{courseId}/numero-plus`
* **Description :** Enregistrement du Numéro+ pour la course.
* **Corps de la requête :**
```json
{ "numeroPlusGagnant": "654321" }
```
* **Note :** Le Numéro+ n'a pas d'impact sur le pari de type TRIO, mais est inclus pour documenter le flux complet de règlement d'une course.
---
### 4. Résultat attendu
Le pari est **gagnant** si les trois chevaux sélectionnés figurent parmi les trois premiers de l'arrivée, quel que soit l'ordre. Dans ce cas, les chevaux `7`, `9` et `10` sont bien dans les trois premières positions du classement officiel. Le pari doit être réglé comme un gain.
------
Bon testing ): !!!