Files
btpxpress-backend/docs/concepts/06-FOURNISSEUR.md
2025-10-01 01:37:34 +00:00

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 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


Dernière mise à jour: 2025-09-30
Version: 1.0
Auteur: Documentation BTPXpress