Initial commit
This commit is contained in:
254
docs/concepts/06-FOURNISSEUR.md
Normal file
254
docs/concepts/06-FOURNISSEUR.md
Normal file
@@ -0,0 +1,254 @@
|
||||
# 🏪 CONCEPT: FOURNISSEUR
|
||||
|
||||
## 📌 Vue d'ensemble
|
||||
|
||||
Le concept **FOURNISSEUR** gère les fournisseurs de matériel et services BTP. Il inclut le catalogue produits, les comparaisons de prix, et les conditions commerciales.
|
||||
|
||||
**Importance**: ⭐⭐⭐⭐ (Concept stratégique)
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ Fichiers concernés
|
||||
|
||||
### **Entités JPA** (`domain/core/entity/`)
|
||||
| Fichier | Description | Lignes |
|
||||
|---------|-------------|--------|
|
||||
| `Fournisseur.java` | Entité principale fournisseur | ~150 |
|
||||
| `FournisseurMateriel.java` | Relation fournisseur-matériel | ~80 |
|
||||
| `CatalogueFournisseur.java` | Catalogue produits fournisseur | ~120 |
|
||||
| `ComparaisonFournisseur.java` | Comparaison entre fournisseurs | ~100 |
|
||||
| `StatutFournisseur.java` | Enum statuts (ACTIF, INACTIF, SUSPENDU, BLOQUE) | ~20 |
|
||||
| `SpecialiteFournisseur.java` | Enum spécialités (MATERIAUX_GROS_OEUVRE, etc.) | ~70 |
|
||||
| `ConditionsPaiement.java` | Enum conditions de paiement | ~40 |
|
||||
| `CritereComparaison.java` | Enum critères de comparaison | ~25 |
|
||||
|
||||
### **DTOs** (`domain/shared/dto/`)
|
||||
| Fichier | Description |
|
||||
|---------|-------------|
|
||||
| `FournisseurDTO.java` | DTO fournisseur avec enum TypeFournisseur |
|
||||
|
||||
### **Services** (`application/service/`)
|
||||
| Fichier | Description |
|
||||
|---------|-------------|
|
||||
| `FournisseurService.java` | Service métier fournisseurs |
|
||||
| `ComparaisonFournisseurService.java` | Service de comparaison |
|
||||
|
||||
---
|
||||
|
||||
## 📊 Modèle de données
|
||||
|
||||
### **Entité Fournisseur**
|
||||
|
||||
```java
|
||||
@Entity
|
||||
@Table(name = "fournisseurs")
|
||||
public class Fournisseur extends PanacheEntityBase {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@NotBlank
|
||||
@Column(name = "nom", nullable = false, length = 100)
|
||||
private String nom;
|
||||
|
||||
@Column(name = "siret", length = 20)
|
||||
private String siret;
|
||||
|
||||
@Column(name = "numero_tva", length = 15)
|
||||
private String numeroTva;
|
||||
|
||||
@Email
|
||||
@Column(name = "email", length = 100)
|
||||
private String email;
|
||||
|
||||
@Column(name = "telephone", length = 20)
|
||||
private String telephone;
|
||||
|
||||
@Column(name = "adresse", length = 200)
|
||||
private String adresse;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "statut")
|
||||
private StatutFournisseur statut = StatutFournisseur.ACTIF;
|
||||
|
||||
@ElementCollection
|
||||
@CollectionTable(name = "fournisseur_specialites")
|
||||
@Enumerated(EnumType.STRING)
|
||||
private List<SpecialiteFournisseur> specialites;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "conditions_paiement")
|
||||
private ConditionsPaiement conditionsPaiement;
|
||||
|
||||
@Column(name = "delai_paiement_jours")
|
||||
private Integer delaiPaiementJours;
|
||||
}
|
||||
```
|
||||
|
||||
### **Enum SpecialiteFournisseur**
|
||||
|
||||
```java
|
||||
public enum SpecialiteFournisseur {
|
||||
// Matériaux de construction
|
||||
MATERIAUX_GROS_OEUVRE("Matériaux gros œuvre", "Béton, ciment, parpaings"),
|
||||
MATERIAUX_CHARPENTE("Matériaux charpente", "Bois de charpente"),
|
||||
MATERIAUX_COUVERTURE("Matériaux couverture", "Tuiles, ardoises"),
|
||||
MATERIAUX_ISOLATION("Matériaux isolation", "Isolants thermiques"),
|
||||
|
||||
// Équipements techniques
|
||||
PLOMBERIE("Plomberie", "Tuyauterie, robinetterie"),
|
||||
ELECTRICITE("Électricité", "Câbles, tableaux électriques"),
|
||||
CHAUFFAGE("Chauffage", "Chaudières, radiateurs"),
|
||||
|
||||
// Équipements et outils
|
||||
LOCATION_MATERIEL("Location matériel", "Location engins et outils"),
|
||||
OUTILLAGE("Outillage", "Outils électriques et manuels"),
|
||||
|
||||
// Services
|
||||
TRANSPORT("Transport", "Transport de matériaux"),
|
||||
MULTI_SPECIALITES("Multi-spécialités", "Fournisseur généraliste"),
|
||||
AUTRE("Autre", "Autre spécialité")
|
||||
}
|
||||
```
|
||||
|
||||
### **Champs principaux**
|
||||
|
||||
| Champ | Type | Obligatoire | Description |
|
||||
|-------|------|-------------|-------------|
|
||||
| `id` | Long | Oui | Identifiant unique |
|
||||
| `nom` | String(100) | Oui | Nom du fournisseur |
|
||||
| `siret` | String(20) | Non | Numéro SIRET |
|
||||
| `numeroTva` | String(15) | Non | Numéro TVA |
|
||||
| `email` | String(100) | Non | Email de contact |
|
||||
| `telephone` | String(20) | Non | Téléphone |
|
||||
| `adresse` | String(200) | Non | Adresse |
|
||||
| `statut` | StatutFournisseur | Oui | Statut (défaut: ACTIF) |
|
||||
| `specialites` | List<SpecialiteFournisseur> | Non | Spécialités |
|
||||
| `conditionsPaiement` | ConditionsPaiement | Non | Conditions de paiement |
|
||||
| `delaiPaiementJours` | Integer | Non | Délai de paiement en jours |
|
||||
|
||||
---
|
||||
|
||||
## 🔌 API REST
|
||||
|
||||
### **Base URL**: `/api/v1/fournisseurs`
|
||||
|
||||
### **Endpoints disponibles**
|
||||
|
||||
| Méthode | Endpoint | Description |
|
||||
|---------|----------|-------------|
|
||||
| GET | `/api/v1/fournisseurs` | Liste tous les fournisseurs |
|
||||
| GET | `/api/v1/fournisseurs/{id}` | Détails d'un fournisseur |
|
||||
| POST | `/api/v1/fournisseurs` | Créer un fournisseur |
|
||||
| PUT | `/api/v1/fournisseurs/{id}` | Modifier un fournisseur |
|
||||
| DELETE | `/api/v1/fournisseurs/{id}` | Supprimer un fournisseur |
|
||||
| GET | `/api/v1/fournisseurs/specialite/{specialite}` | Par spécialité |
|
||||
| GET | `/api/v1/fournisseurs/comparer` | Comparer des fournisseurs |
|
||||
| GET | `/api/v1/fournisseurs/stats` | Statistiques |
|
||||
|
||||
---
|
||||
|
||||
## 💻 Exemples d'utilisation
|
||||
|
||||
### **1. Créer un fournisseur**
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/v1/fournisseurs \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"nom": "Matériaux Pro",
|
||||
"siret": "12345678901234",
|
||||
"email": "contact@materiauxpro.fr",
|
||||
"telephone": "+33 1 23 45 67 89",
|
||||
"adresse": "10 Rue de l Industrie, 75001 Paris",
|
||||
"specialites": ["MATERIAUX_GROS_OEUVRE", "MATERIAUX_ISOLATION"],
|
||||
"conditionsPaiement": "NET_30",
|
||||
"delaiPaiementJours": 30
|
||||
}'
|
||||
```
|
||||
|
||||
### **2. Rechercher par spécialité**
|
||||
|
||||
```bash
|
||||
curl -X GET "http://localhost:8080/api/v1/fournisseurs/specialite/MATERIAUX_GROS_OEUVRE"
|
||||
```
|
||||
|
||||
### **3. Comparer des fournisseurs**
|
||||
|
||||
```bash
|
||||
curl -X GET "http://localhost:8080/api/v1/fournisseurs/comparer?materielId=uuid&fournisseurIds=id1,id2,id3"
|
||||
```
|
||||
|
||||
**Réponse**:
|
||||
```json
|
||||
{
|
||||
"materiel": "Ciment Portland 25kg",
|
||||
"comparaisons": [
|
||||
{
|
||||
"fournisseur": "Matériaux Pro",
|
||||
"prix": 8.50,
|
||||
"delaiLivraison": 2,
|
||||
"conditionsPaiement": "NET_30",
|
||||
"note": 4.5
|
||||
},
|
||||
{
|
||||
"fournisseur": "BTP Discount",
|
||||
"prix": 7.90,
|
||||
"delaiLivraison": 5,
|
||||
"conditionsPaiement": "NET_45",
|
||||
"note": 4.2
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Services métier
|
||||
|
||||
### **FournisseurService**
|
||||
|
||||
**Méthodes principales**:
|
||||
- `findAll()` - Tous les fournisseurs
|
||||
- `findBySpecialite(SpecialiteFournisseur)` - Par spécialité
|
||||
- `findActifs()` - Fournisseurs actifs
|
||||
- `create(FournisseurDTO)` - Créer
|
||||
- `update(Long id, FournisseurDTO)` - Modifier
|
||||
|
||||
### **ComparaisonFournisseurService**
|
||||
|
||||
**Méthodes principales**:
|
||||
- `comparerPrix(UUID materielId, List<Long> fournisseurIds)` - Comparer prix
|
||||
- `getMeilleurFournisseur(UUID materielId, CritereComparaison)` - Meilleur fournisseur
|
||||
|
||||
---
|
||||
|
||||
## 📈 Relations avec autres concepts
|
||||
|
||||
- **MATERIEL** ➡️ Un fournisseur propose du matériel (catalogue)
|
||||
- **BON_COMMANDE** ➡️ Un fournisseur reçoit des bons de commande
|
||||
- **FACTURE** ➡️ Un fournisseur émet des factures
|
||||
|
||||
---
|
||||
|
||||
## ✅ Validations
|
||||
|
||||
- ✅ Nom obligatoire
|
||||
- ✅ Email au format valide
|
||||
- ✅ SIRET 14 caractères si renseigné
|
||||
- ✅ Au moins une spécialité
|
||||
|
||||
---
|
||||
|
||||
## 📚 Références
|
||||
|
||||
- [Concept MATERIEL](./03-MATERIEL.md)
|
||||
- [Concept BON_COMMANDE](./08-BON_COMMANDE.md)
|
||||
|
||||
---
|
||||
|
||||
**Dernière mise à jour**: 2025-09-30
|
||||
**Version**: 1.0
|
||||
**Auteur**: Documentation BTPXpress
|
||||
|
||||
Reference in New Issue
Block a user