Files
btpxpress-backend/DATABASE.md
2025-10-01 01:37:34 +00:00

11 KiB

🗄️ BASE DE DONNÉES - BTPXPRESS

📋 Table des matières


🎯 Vue d'ensemble

Technologie

  • SGBD : PostgreSQL 15
  • ORM : Hibernate ORM Panache
  • Migrations : Flyway (optionnel)
  • Pool de connexions : Agroal

Bases de données

Environnement Nom de la base Utilisateur Port
Développement btpxpress_dev btpxpress 5432
Test btpxpress_test btpxpress_test 5432
Production btpxpress_prod btpxpress_prod 5432

⚙️ Configuration

application.properties

# Datasource
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=btpxpress
quarkus.datasource.password=btpxpress123
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/btpxpress_dev

# Hibernate
quarkus.hibernate-orm.database.generation=update
quarkus.hibernate-orm.log.sql=true
quarkus.hibernate-orm.sql-load-script=import.sql

# Pool de connexions
quarkus.datasource.jdbc.min-size=5
quarkus.datasource.jdbc.max-size=20

Docker Compose

services:
  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: btpxpress_dev
      POSTGRES_USER: btpxpress
      POSTGRES_PASSWORD: btpxpress123
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

📊 Schéma de base de données

Diagramme ERD simplifié

┌─────────────┐       ┌─────────────┐       ┌─────────────┐
│   CLIENT    │──────<│  CHANTIER   │>──────│    DEVIS    │
└─────────────┘       └─────────────┘       └─────────────┘
                            │
                            │
                      ┌─────▼─────┐
                      │  MATERIEL  │
                      └─────┬─────┘
                            │
                      ┌─────▼─────────┐
                      │ RESERVATION   │
                      └───────────────┘

📋 Tables principales

1. Table clients

CREATE TABLE clients (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  nom VARCHAR(100) NOT NULL,
  prenom VARCHAR(100),
  entreprise VARCHAR(200),
  email VARCHAR(100) UNIQUE NOT NULL,
  telephone VARCHAR(20),
  adresse VARCHAR(200),
  code_postal VARCHAR(10),
  ville VARCHAR(100),
  type VARCHAR(20) NOT NULL, -- PARTICULIER, PROFESSIONNEL
  siret VARCHAR(14),
  numero_tva VARCHAR(15),
  actif BOOLEAN DEFAULT TRUE,
  date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  date_modification TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_clients_email ON clients(email);
CREATE INDEX idx_clients_type ON clients(type);

2. Table chantiers

CREATE TABLE chantiers (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  nom VARCHAR(200) NOT NULL,
  code VARCHAR(50) UNIQUE NOT NULL,
  description TEXT,
  adresse VARCHAR(200),
  code_postal VARCHAR(10),
  ville VARCHAR(100),
  client_id UUID NOT NULL REFERENCES clients(id),
  statut VARCHAR(20) NOT NULL, -- PLANIFIE, EN_COURS, TERMINE, ANNULE, SUSPENDU
  date_debut DATE,
  date_fin_prevue DATE,
  date_fin_reelle DATE,
  montant_prevu DECIMAL(12,2),
  montant_reel DECIMAL(12,2),
  surface_m2 DECIMAL(10,2),
  actif BOOLEAN DEFAULT TRUE,
  date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  date_modification TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_chantiers_client ON chantiers(client_id);
CREATE INDEX idx_chantiers_statut ON chantiers(statut);
CREATE INDEX idx_chantiers_code ON chantiers(code);

3. Table materiels

CREATE TABLE materiels (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  nom VARCHAR(100) NOT NULL,
  marque VARCHAR(100),
  modele VARCHAR(100),
  numero_serie VARCHAR(100) UNIQUE,
  type VARCHAR(50) NOT NULL, -- VEHICULE, OUTIL_ELECTRIQUE, etc.
  description TEXT,
  date_achat DATE,
  valeur_achat DECIMAL(10,2),
  valeur_actuelle DECIMAL(10,2),
  statut VARCHAR(20) NOT NULL DEFAULT 'DISPONIBLE',
  localisation VARCHAR(200),
  proprietaire VARCHAR(200),
  cout_utilisation DECIMAL(10,2),
  quantite_stock DECIMAL(10,3) DEFAULT 0,
  seuil_minimum DECIMAL(10,3) DEFAULT 0,
  unite VARCHAR(20),
  actif BOOLEAN DEFAULT TRUE,
  date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  date_modification TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_materiels_type ON materiels(type);
CREATE INDEX idx_materiels_statut ON materiels(statut);
CREATE INDEX idx_materiels_numero_serie ON materiels(numero_serie);

4. Table reservations_materiel

CREATE TABLE reservations_materiel (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  materiel_id UUID NOT NULL REFERENCES materiels(id),
  chantier_id UUID NOT NULL REFERENCES chantiers(id),
  date_debut DATE NOT NULL,
  date_fin DATE NOT NULL,
  statut VARCHAR(20) NOT NULL DEFAULT 'PLANIFIEE',
  quantite DECIMAL(10,3),
  priorite VARCHAR(20),
  commentaire TEXT,
  date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  date_modification TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_reservations_materiel ON reservations_materiel(materiel_id);
CREATE INDEX idx_reservations_chantier ON reservations_materiel(chantier_id);
CREATE INDEX idx_reservations_dates ON reservations_materiel(date_debut, date_fin);

5. Table employes

CREATE TABLE employes (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  nom VARCHAR(100) NOT NULL,
  prenom VARCHAR(100) NOT NULL,
  email VARCHAR(100) UNIQUE,
  telephone VARCHAR(20),
  fonction VARCHAR(50), -- CHEF_CHANTIER, MACON, ELECTRICIEN, etc.
  statut VARCHAR(20) DEFAULT 'ACTIF',
  date_embauche DATE,
  taux_horaire DECIMAL(10,2),
  equipe_id UUID REFERENCES equipes(id),
  actif BOOLEAN DEFAULT TRUE,
  date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  date_modification TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_employes_fonction ON employes(fonction);
CREATE INDEX idx_employes_statut ON employes(statut);
CREATE INDEX idx_employes_equipe ON employes(equipe_id);

6. Table devis

CREATE TABLE devis (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  numero VARCHAR(50) UNIQUE NOT NULL,
  client_id UUID NOT NULL REFERENCES clients(id),
  chantier_id UUID REFERENCES chantiers(id),
  date_emission DATE NOT NULL,
  date_validite DATE,
  statut VARCHAR(20) NOT NULL DEFAULT 'BROUILLON',
  montant_ht DECIMAL(10,2) DEFAULT 0,
  montant_tva DECIMAL(10,2) DEFAULT 0,
  montant_ttc DECIMAL(10,2) DEFAULT 0,
  taux_tva DECIMAL(5,2) DEFAULT 20.00,
  commentaire TEXT,
  date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  date_modification TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_devis_client ON devis(client_id);
CREATE INDEX idx_devis_chantier ON devis(chantier_id);
CREATE INDEX idx_devis_numero ON devis(numero);
CREATE INDEX idx_devis_statut ON devis(statut);

7. Table users

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  keycloak_id VARCHAR(100) UNIQUE,
  username VARCHAR(100) UNIQUE NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL,
  nom VARCHAR(100),
  prenom VARCHAR(100),
  role VARCHAR(50), -- ADMIN, MANAGER, CHEF_CHANTIER, etc.
  status VARCHAR(20) DEFAULT 'ACTIVE',
  employe_id UUID REFERENCES employes(id),
  date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  date_modification TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_users_keycloak ON users(keycloak_id);
CREATE INDEX idx_users_username ON users(username);
CREATE INDEX idx_users_email ON users(email);

🔄 Migrations

Flyway (optionnel)

Structure des migrations :

src/main/resources/db/migration/
├── V1__create_clients_table.sql
├── V2__create_chantiers_table.sql
├── V3__create_materiels_table.sql
├── V4__create_reservations_table.sql
└── V5__create_indexes.sql

Commandes

# Appliquer les migrations
./mvnw flyway:migrate

# Voir l'état des migrations
./mvnw flyway:info

# Nettoyer la base (ATTENTION : supprime toutes les données)
./mvnw flyway:clean

🚀 Indexation

Index recommandés

-- Recherche par email
CREATE INDEX idx_clients_email ON clients(email);

-- Recherche par statut
CREATE INDEX idx_chantiers_statut ON chantiers(statut);
CREATE INDEX idx_materiels_statut ON materiels(statut);

-- Recherche par dates
CREATE INDEX idx_reservations_dates ON reservations_materiel(date_debut, date_fin);

-- Recherche full-text (PostgreSQL)
CREATE INDEX idx_chantiers_search ON chantiers USING gin(to_tsvector('french', nom || ' ' || COALESCE(description, '')));

💾 Sauvegarde et restauration

Sauvegarde

# Sauvegarde complète
pg_dump -U btpxpress -h localhost btpxpress_dev > backup_$(date +%Y%m%d).sql

# Sauvegarde avec compression
pg_dump -U btpxpress -h localhost btpxpress_dev | gzip > backup_$(date +%Y%m%d).sql.gz

Restauration

# Restauration
psql -U btpxpress -h localhost btpxpress_dev < backup_20250930.sql

# Restauration depuis fichier compressé
gunzip -c backup_20250930.sql.gz | psql -U btpxpress -h localhost btpxpress_dev

📊 Statistiques

Nombre de tables par concept

Concept Tables Importance
CHANTIER 3
MATERIEL 12
CLIENT 1
EMPLOYE 6
DEVIS 2
PLANNING 7
TOTAL 95+ -

🔍 Requêtes utiles

Statistiques chantiers

SELECT 
  statut,
  COUNT(*) as nombre,
  SUM(montant_prevu) as montant_total
FROM chantiers
WHERE actif = TRUE
GROUP BY statut;

Matériel en stock faible

SELECT 
  nom,
  quantite_stock,
  seuil_minimum,
  (quantite_stock - seuil_minimum) as ecart
FROM materiels
WHERE quantite_stock < seuil_minimum
  AND actif = TRUE
ORDER BY ecart ASC;

Réservations en conflit

SELECT 
  r1.id as reservation1,
  r2.id as reservation2,
  m.nom as materiel,
  r1.date_debut,
  r1.date_fin
FROM reservations_materiel r1
JOIN reservations_materiel r2 ON r1.materiel_id = r2.materiel_id
JOIN materiels m ON r1.materiel_id = m.id
WHERE r1.id < r2.id
  AND r1.date_debut <= r2.date_fin
  AND r1.date_fin >= r2.date_debut;

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