7.2 KiB
7.2 KiB
🏪 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
@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
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 | 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
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é
curl -X GET "http://localhost:8080/api/v1/fournisseurs/specialite/MATERIAUX_GROS_OEUVRE"
3. Comparer des fournisseurs
curl -X GET "http://localhost:8080/api/v1/fournisseurs/comparer?materielId=uuid&fournisseurIds=id1,id2,id3"
Réponse:
{
"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 fournisseursfindBySpecialite(SpecialiteFournisseur)- Par spécialitéfindActifs()- Fournisseurs actifscreate(FournisseurDTO)- Créerupdate(Long id, FournisseurDTO)- Modifier
ComparaisonFournisseurService
Méthodes principales:
comparerPrix(UUID materielId, List<Long> fournisseurIds)- Comparer prixgetMeilleurFournisseur(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
Dernière mise à jour: 2025-09-30
Version: 1.0
Auteur: Documentation BTPXpress