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

11 KiB

🏗️ CONCEPT: CHANTIER

📌 Vue d'ensemble

Le concept CHANTIER est le cœur métier de l'application BTPXpress. Il représente un projet de construction BTP avec toutes ses caractéristiques : localisation, dates, budget, statut, phases, et relations avec les clients, devis, factures, etc.

Importance: (Concept central)


🗂️ Fichiers concernés

Entités JPA (domain/core/entity/)

Fichier Description Lignes
Chantier.java Entité principale représentant un chantier BTP 224
StatutChantier.java Enum des statuts possibles d'un chantier 24
TypeChantier.java Entité type de chantier (configurable) ~150
TypeChantierBTP.java Enum types BTP prédéfinis ~50
Phase.java Phase générique de chantier ~100
PhaseChantier.java Phase spécifique à un chantier ~180
PhaseTemplate.java Template de phase réutilisable ~120
SousPhaseTemplate.java Sous-phase de template ~80
TacheTemplate.java Template de tâche ~100
StatutPhaseChantier.java Enum statuts de phase ~40
TypePhaseChantier.java Enum types de phase ~30
PrioritePhase.java Enum priorités de phase ~25

DTOs (domain/shared/dto/)

Fichier Description
ChantierCreateDTO.java DTO pour créer/modifier un chantier
PhaseChantierDTO.java DTO pour les phases de chantier

Services (application/service/)

Fichier Description
ChantierService.java Service métier principal pour les chantiers
PhaseChantierService.java Service pour la gestion des phases
PhaseTemplateService.java Service pour les templates de phases
TacheTemplateService.java Service pour les templates de tâches

Resources (API REST) (adapter/http/)

Fichier Description
ChantierResource.java Endpoints REST pour les chantiers
PhaseChantierResource.java Endpoints REST pour les phases

📊 Modèle de données

Entité Chantier

<augment_code_snippet path="btpxpress-server/src/main/java/dev/lions/btpxpress/domain/core/entity/Chantier.java" mode="EXCERPT">

@Entity
@Table(name = "chantiers")
@Data
@Builder
public class Chantier extends PanacheEntityBase {
  
  @Id
  @GeneratedValue(strategy = GenerationType.UUID)
  private UUID id;
  
  @NotBlank(message = "Le nom du chantier est obligatoire")
  @Column(name = "nom", nullable = false, length = 200)
  private String nom;
  
  @Column(name = "code", unique = true, length = 50)
  private String code;
  
  @NotBlank(message = "L'adresse du chantier est obligatoire")
  @Column(name = "adresse", nullable = false, length = 500)
  private String adresse;
  
  @Enumerated(EnumType.STRING)
  @Column(name = "statut", nullable = false)
  private StatutChantier statut = StatutChantier.PLANIFIE;
  
  @Column(name = "montant_prevu", precision = 10, scale = 2)
  private BigDecimal montantPrevu;
  
  // Relations
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "client_id", nullable = false)
  private Client client;
  
  @OneToMany(mappedBy = "chantier", cascade = CascadeType.ALL)
  private List<Devis> devis;
  
  @OneToMany(mappedBy = "chantier", cascade = CascadeType.ALL)
  private List<Facture> factures;
  // ...
}

</augment_code_snippet>

Enum StatutChantier

<augment_code_snippet path="btpxpress-server/src/main/java/dev/lions/btpxpress/domain/core/entity/StatutChantier.java" mode="EXCERPT">

public enum StatutChantier {
  PLANIFIE("Planifié"),
  EN_COURS("En cours"),
  TERMINE("Terminé"),
  ANNULE("Annulé"),
  SUSPENDU("Suspendu");

  private final String label;
  
  StatutChantier(String label) {
    this.label = label;
  }
  
  public String getLabel() {
    return label;
  }
}

</augment_code_snippet>

Champs principaux

Champ Type Obligatoire Description
id UUID Oui Identifiant unique
nom String(200) Oui Nom du chantier
code String(50) Non Code unique du chantier
description TEXT Non Description détaillée
adresse String(500) Oui Adresse du chantier
codePostal String(10) Non Code postal
ville String(100) Non Ville
dateDebut LocalDate Oui Date de début
dateDebutPrevue LocalDate Non Date de début prévue
dateDebutReelle LocalDate Non Date de début réelle
dateFinPrevue LocalDate Non Date de fin prévue
dateFinReelle LocalDate Non Date de fin réelle
statut StatutChantier Oui Statut actuel (défaut: PLANIFIE)
montantPrevu BigDecimal Non Montant prévu
montantReel BigDecimal Non Montant réel
typeChantier TypeChantierBTP Non Type de chantier
actif Boolean Oui Chantier actif (défaut: true)
dateCreation LocalDateTime Auto Date de création
dateModification LocalDateTime Auto Date de modification

Relations

Relation Type Entité cible Description
client ManyToOne Client Client propriétaire (obligatoire)
chefChantier ManyToOne User Chef de chantier responsable
devis OneToMany Devis Liste des devis associés
factures OneToMany Facture Liste des factures

🔌 API REST

Base URL: /api/v1/chantiers

Endpoints disponibles

Méthode Endpoint Description Authentification
GET /api/v1/chantiers Liste tous les chantiers Optionnelle
GET /api/v1/chantiers/actifs Liste chantiers actifs Optionnelle
GET /api/v1/chantiers/{id} Détails d'un chantier Optionnelle
POST /api/v1/chantiers Créer un chantier Optionnelle
PUT /api/v1/chantiers/{id} Modifier un chantier Optionnelle
DELETE /api/v1/chantiers/{id} Supprimer un chantier Optionnelle
GET /api/v1/chantiers/statut/{statut} Chantiers par statut Optionnelle
GET /api/v1/chantiers/client/{clientId} Chantiers d'un client Optionnelle
GET /api/v1/chantiers/search Recherche de chantiers Optionnelle
GET /api/v1/chantiers/stats Statistiques chantiers Optionnelle

Paramètres de requête (Query Params)

Paramètre Type Description Exemple
search String Terme de recherche ?search=villa
statut String Filtrer par statut ?statut=EN_COURS
clientId UUID Filtrer par client ?clientId=uuid

💻 Exemples d'utilisation

1. Récupérer tous les chantiers

curl -X GET http://localhost:8080/api/v1/chantiers \
  -H "Accept: application/json"

Réponse (200 OK):

[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "nom": "Construction Villa Moderne",
    "code": "CHANT-2025-001",
    "adresse": "123 Avenue des Champs",
    "codePostal": "75008",
    "ville": "Paris",
    "statut": "EN_COURS",
    "montantPrevu": 250000.00,
    "dateDebut": "2025-01-15",
    "dateFinPrevue": "2025-12-31",
    "actif": true
  }
]

2. Créer un nouveau chantier

curl -X POST http://localhost:8080/api/v1/chantiers \
  -H "Content-Type: application/json" \
  -d '{
    "nom": "Rénovation Appartement",
    "adresse": "45 Rue de la Paix",
    "codePostal": "75002",
    "ville": "Paris",
    "dateDebut": "2025-10-01",
    "dateFinPrevue": "2025-12-15",
    "montantPrevu": 75000.00,
    "clientId": "client-uuid-here",
    "statut": "PLANIFIE"
  }'

Réponse (201 Created):

{
  "id": "generated-uuid",
  "nom": "Rénovation Appartement",
  "statut": "PLANIFIE",
  "dateCreation": "2025-09-30T10:30:00"
}

3. Rechercher des chantiers

# Par nom
curl -X GET "http://localhost:8080/api/v1/chantiers?search=villa"

# Par statut
curl -X GET "http://localhost:8080/api/v1/chantiers?statut=EN_COURS"

# Par client
curl -X GET "http://localhost:8080/api/v1/chantiers?clientId=uuid-client"

4. Obtenir les statistiques

curl -X GET http://localhost:8080/api/v1/chantiers/stats

Réponse:

{
  "totalChantiers": 45,
  "chantiersActifs": 38,
  "enCours": 12,
  "planifies": 8,
  "termines": 15,
  "suspendus": 2,
  "annules": 1,
  "montantTotalPrevu": 5250000.00,
  "montantTotalReel": 4890000.00
}

🔧 Services métier

ChantierService

Méthodes principales:

Méthode Description Retour
findAll() Récupère tous les chantiers List<Chantier>
findActifs() Récupère chantiers actifs List<Chantier>
findById(UUID id) Récupère par ID Optional<Chantier>
create(ChantierCreateDTO dto) Crée un chantier Chantier
update(UUID id, ChantierCreateDTO dto) Met à jour Chantier
delete(UUID id) Supprime (soft delete) void
findByStatut(StatutChantier statut) Filtre par statut List<Chantier>
findByClient(UUID clientId) Chantiers d'un client List<Chantier>
search(String term) Recherche textuelle List<Chantier>
getStatistics() Statistiques globales Object

🔐 Permissions requises

Permission Description Rôles autorisés
CHANTIERS_READ Lecture des chantiers ADMIN, MANAGER, CHEF_CHANTIER, COMPTABLE, OUVRIER
CHANTIERS_CREATE Création de chantiers ADMIN, MANAGER
CHANTIERS_UPDATE Modification de chantiers ADMIN, MANAGER, CHEF_CHANTIER
CHANTIERS_DELETE Suppression de chantiers ADMIN, MANAGER
CHANTIERS_PHASES Gestion des phases ADMIN, MANAGER, CHEF_CHANTIER
CHANTIERS_BUDGET Gestion du budget ADMIN, MANAGER, COMPTABLE

📈 Relations avec autres concepts

Dépendances directes:

  • CLIENT ⬅️ Un chantier appartient à un client (obligatoire)
  • USER ⬅️ Un chantier peut avoir un chef de chantier
  • DEVIS ➡️ Un chantier peut avoir plusieurs devis
  • FACTURE ➡️ Un chantier peut avoir plusieurs factures
  • PHASE ➡️ Un chantier est divisé en phases
  • BUDGET ➡️ Un chantier a un budget associé
  • PLANNING ➡️ Un chantier a un planning
  • DOCUMENT ➡️ Un chantier peut avoir des documents (plans, photos, etc.)

🧪 Tests

Tests unitaires

  • Fichier: ChantierServiceTest.java
  • Couverture: Logique métier, validations, calculs

Tests d'intégration

  • Fichier: ChantierResourceTest.java
  • Couverture: Endpoints REST, sérialisation JSON

Commande pour exécuter les tests:

cd btpxpress-server
./mvnw test -Dtest=ChantierServiceTest
./mvnw test -Dtest=ChantierResourceTest

📚 Références


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