Files
btpxpress-frontend/services/typeChantierService.ts
2025-10-13 05:29:32 +02:00

666 lines
27 KiB
TypeScript

/**
* Service pour la gestion des types de chantiers et templates de phases
* Interface avec l'API backend pour les templates métier BTP
*/
import { TypeChantierTemplate } from '../components/phases/PhaseGenerationWizard';
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8080/api/v1';
class TypeChantierService {
/**
* Récupérer tous les templates de types de chantiers disponibles
*/
async getAllTemplates(): Promise<TypeChantierTemplate[]> {
try {
// Essayer d'abord l'API backend
const response = await fetch(`${API_BASE_URL}/type-chantiers/templates`);
if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`);
}
return await response.json();
} catch (error) {
console.warn('Endpoint backend non disponible, utilisation des données mockées:', error);
// Fallback sur les données mockées
return this.getMockTemplates();
}
}
/**
* Récupérer un template spécifique par son ID
*/
async getTemplateById(id: string): Promise<TypeChantierTemplate | null> {
try {
const templates = await this.getAllTemplates();
return templates.find(t => t.id === id) || null;
} catch (error) {
console.error('Erreur lors du chargement du template:', error);
return null;
}
}
/**
* Récupérer les templates par catégorie
*/
async getTemplatesByCategorie(categorie: string): Promise<TypeChantierTemplate[]> {
try {
const templates = await this.getAllTemplates();
return templates.filter(t => t.categorie === categorie);
} catch (error) {
console.error('Erreur lors du filtrage par catégorie:', error);
return [];
}
}
/**
* Compte le nombre total de phases (principales + sous-phases) dans un template
*/
private countTotalPhases(phases: any[]): number {
return phases.reduce((total, phase) => {
return total + 1 + (phase.sousPhases ? phase.sousPhases.length : 0);
}, 0);
}
/**
* Données mockées pour les templates de chantiers BTP
* REMARQUE : Les durées et budgets sont à null - ils doivent être saisis par l'utilisateur
*/
private getMockTemplates(): TypeChantierTemplate[] {
// Définir les phases de Villa Moderne (structure complète réaliste)
const villaModernePhases = [
{
id: 'vm-01',
nom: 'Préparation et Terrassement',
description: 'Préparation du terrain et travaux de terrassement',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Terrassement', 'VRD', 'Géomètre'],
prerequis: [],
categorieMetier: 'GROS_OEUVRE' as const,
obligatoire: true,
personnalisable: false,
sousPhases: [
{
id: 'vm-01-01',
nom: 'Implantation et piquetage',
description: 'Implantation précise de la construction',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Géomètre'],
obligatoire: true
},
{
id: 'vm-01-02',
nom: 'Décapage et excavation',
description: 'Décapage terre végétale et excavation',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Terrassement'],
obligatoire: true
},
{
id: 'vm-01-03',
nom: 'Évacuation terres et remblaiement',
description: 'Évacuation des terres excédentaires et remblaiement',
ordre: 3,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Transport', 'Terrassement'],
obligatoire: true
}
]
},
{
id: 'vm-02',
nom: 'Fondations',
description: 'Réalisation des fondations béton armé',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Béton armé', 'Coffreur', 'Ferrailleur'],
prerequis: ['vm-01'],
categorieMetier: 'GROS_OEUVRE' as const,
obligatoire: true,
personnalisable: false,
sousPhases: [
{
id: 'vm-02-01',
nom: 'Ferraillage semelles',
description: 'Ferraillage des semelles de fondation',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Ferrailleur'],
obligatoire: true
},
{
id: 'vm-02-02',
nom: 'Coulage semelles',
description: 'Coulage béton des semelles',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Béton'],
obligatoire: true
},
{
id: 'vm-02-03',
nom: 'Vide sanitaire',
description: 'Réalisation du vide sanitaire',
ordre: 3,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Maçonnerie'],
obligatoire: true
},
{
id: 'vm-02-04',
nom: 'Étanchéité fondations',
description: 'Application de l\'étanchéité des fondations',
ordre: 4,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Étancheur'],
obligatoire: true
}
]
},
{
id: 'vm-03',
nom: 'Élévation des murs',
description: 'Construction des murs porteurs et cloisons',
ordre: 3,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Maçonnerie', 'Béton armé'],
prerequis: ['vm-02'],
categorieMetier: 'GROS_OEUVRE' as const,
obligatoire: true,
personnalisable: true,
sousPhases: [
{
id: 'vm-03-01',
nom: 'Murs porteurs RDC',
description: 'Élévation murs porteurs rez-de-chaussée',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Maçonnerie'],
obligatoire: true
},
{
id: 'vm-03-02',
nom: 'Plancher intermédiaire',
description: 'Réalisation plancher entre RDC et étage',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Béton armé'],
obligatoire: true
},
{
id: 'vm-03-03',
nom: 'Murs porteurs étage',
description: 'Élévation murs porteurs étage',
ordre: 3,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Maçonnerie'],
obligatoire: true
}
]
},
{
id: 'vm-04',
nom: 'Charpente et Couverture',
description: 'Pose de la charpente et réalisation de la couverture',
ordre: 4,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Charpentier', 'Couvreur'],
prerequis: ['vm-03'],
categorieMetier: 'GROS_OEUVRE' as const,
obligatoire: true,
personnalisable: false,
sousPhases: [
{
id: 'vm-04-01',
nom: 'Pose charpente',
description: 'Montage de la charpente',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Charpentier'],
obligatoire: true
},
{
id: 'vm-04-02',
nom: 'Pose couverture',
description: 'Pose des tuiles et finitions de toiture',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Couvreur'],
obligatoire: true
}
]
},
{
id: 'vm-05',
nom: 'Menuiseries Extérieures',
description: 'Pose des fenêtres, portes et volets',
ordre: 5,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Menuisier'],
prerequis: ['vm-03'],
categorieMetier: 'SECOND_OEUVRE' as const,
obligatoire: true,
personnalisable: true,
sousPhases: [
{
id: 'vm-05-01',
nom: 'Pose fenêtres',
description: 'Installation des fenêtres',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Menuisier'],
obligatoire: true
},
{
id: 'vm-05-02',
nom: 'Pose porte d\'entrée',
description: 'Installation de la porte d\'entrée',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Menuisier'],
obligatoire: true
}
]
},
{
id: 'vm-06',
nom: 'Isolation et Cloisons',
description: 'Isolation thermique et montage des cloisons',
ordre: 6,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Plaquiste', 'Isolateur'],
prerequis: ['vm-05'],
categorieMetier: 'SECOND_OEUVRE' as const,
obligatoire: true,
personnalisable: true,
sousPhases: [
{
id: 'vm-06-01',
nom: 'Isolation thermique',
description: 'Pose de l\'isolation thermique',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Isolateur'],
obligatoire: true
},
{
id: 'vm-06-02',
nom: 'Cloisons placo',
description: 'Montage des cloisons en placo',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Plaquiste'],
obligatoire: true
}
]
},
{
id: 'vm-07',
nom: 'Électricité',
description: 'Installation électrique complète',
ordre: 7,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Électricien'],
prerequis: ['vm-06'],
categorieMetier: 'EQUIPEMENTS' as const,
obligatoire: true,
personnalisable: false,
sousPhases: [
{
id: 'vm-07-01',
nom: 'Saignées et gaines',
description: 'Réalisation des saignées et pose des gaines',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Électricien'],
obligatoire: true
},
{
id: 'vm-07-02',
nom: 'Câblage et tableau',
description: 'Câblage et installation du tableau électrique',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Électricien'],
obligatoire: true
}
]
},
{
id: 'vm-08',
nom: 'Plomberie et Sanitaires',
description: 'Installation plomberie et équipements sanitaires',
ordre: 8,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Plombier'],
prerequis: ['vm-06'],
categorieMetier: 'EQUIPEMENTS' as const,
obligatoire: true,
personnalisable: false,
sousPhases: [
{
id: 'vm-08-01',
nom: 'Réseaux eau',
description: 'Installation des réseaux d\'eau',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Plombier'],
obligatoire: true
},
{
id: 'vm-08-02',
nom: 'Sanitaires',
description: 'Pose des équipements sanitaires',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Plombier'],
obligatoire: true
}
]
},
{
id: 'vm-09',
nom: 'Chauffage',
description: 'Installation du système de chauffage',
ordre: 9,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Chauffagiste'],
prerequis: ['vm-08'],
categorieMetier: 'EQUIPEMENTS' as const,
obligatoire: true,
personnalisable: true,
sousPhases: [
{
id: 'vm-09-01',
nom: 'Chaudière et réseau',
description: 'Installation chaudière et réseau de chauffage',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Chauffagiste'],
obligatoire: true
},
{
id: 'vm-09-02',
nom: 'Radiateurs',
description: 'Pose des radiateurs',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Chauffagiste'],
obligatoire: true
}
]
},
{
id: 'vm-10',
nom: 'Revêtements Sols et Murs',
description: 'Pose des revêtements de sols et murs',
ordre: 10,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Carreleur', 'Parqueteur'],
prerequis: ['vm-07', 'vm-08'],
categorieMetier: 'FINITIONS' as const,
obligatoire: true,
personnalisable: true,
sousPhases: [
{
id: 'vm-10-01',
nom: 'Carrelage',
description: 'Pose du carrelage',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Carreleur'],
obligatoire: true
},
{
id: 'vm-10-02',
nom: 'Parquet',
description: 'Pose du parquet',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Parqueteur'],
obligatoire: true
}
]
},
{
id: 'vm-11',
nom: 'Peinture',
description: 'Peinture intérieure et extérieure',
ordre: 11,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Peintre'],
prerequis: ['vm-10'],
categorieMetier: 'FINITIONS' as const,
obligatoire: true,
personnalisable: true,
sousPhases: [
{
id: 'vm-11-01',
nom: 'Peinture intérieure',
description: 'Peinture de tous les murs intérieurs',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Peintre'],
obligatoire: true
},
{
id: 'vm-11-02',
nom: 'Peinture extérieure',
description: 'Peinture des façades extérieures',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Peintre'],
obligatoire: true
}
]
},
{
id: 'vm-12',
nom: 'Finitions et Nettoyage',
description: 'Finitions diverses et nettoyage final',
ordre: 12,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Finisseur'],
prerequis: ['vm-11'],
categorieMetier: 'FINITIONS' as const,
obligatoire: true,
personnalisable: false,
sousPhases: [
{
id: 'vm-12-01',
nom: 'Finitions diverses',
description: 'Petites finitions et retouches',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Finisseur'],
obligatoire: true
},
{
id: 'vm-12-02',
nom: 'Nettoyage final',
description: 'Nettoyage complet du chantier',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Nettoyage'],
obligatoire: true
}
]
}
];
// Créer les templates finaux
return [
{
id: 'villa-moderne',
nom: 'Villa Moderne',
description: 'Construction d\'une villa moderne avec prestations haut de gamme',
categorie: 'RESIDENTIEL',
complexiteMetier: 'MOYENNE',
dureeGlobaleEstimee: null, // À saisir par l'utilisateur
budgetGlobalEstime: null, // À saisir par l'utilisateur
nombreTotalPhases: this.countTotalPhases(villaModernePhases),
tags: ['Villa', 'Moderne', 'Haut de gamme', 'BBC'],
phases: villaModernePhases
},
{
id: 'extension-maison',
nom: 'Extension Maison',
description: 'Extension latérale d\'une maison existante',
categorie: 'RESIDENTIEL',
complexiteMetier: 'SIMPLE',
dureeGlobaleEstimee: null,
budgetGlobalEstime: null,
nombreTotalPhases: 8, // 4 phases + 4 sous-phases
tags: ['Extension', 'Raccordement', 'Rénovation'],
phases: [
{
id: 'em-01',
nom: 'Démolition et Préparation',
description: 'Démolitions partielles et préparation du raccordement',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Démolition', 'Maçonnerie'],
prerequis: [],
categorieMetier: 'GROS_OEUVRE' as const,
obligatoire: true,
personnalisable: false,
sousPhases: [
{
id: 'em-01-01',
nom: 'Ouverture mur existant',
description: 'Ouverture dans le mur existant pour raccordement',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Démolition'],
obligatoire: true
}
]
},
{
id: 'em-02',
nom: 'Fondations Extension',
description: 'Fondations spécifiques pour l\'extension',
ordre: 2,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Béton armé', 'Maçonnerie'],
prerequis: ['em-01'],
categorieMetier: 'GROS_OEUVRE' as const,
obligatoire: true,
personnalisable: false,
sousPhases: [
{
id: 'em-02-01',
nom: 'Fondations raccordement',
description: 'Fondations avec raccordement à l\'existant',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Béton armé'],
obligatoire: true
}
]
},
{
id: 'em-03',
nom: 'Élévation Extension',
description: 'Construction de l\'extension',
ordre: 3,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Maçonnerie'],
prerequis: ['em-02'],
categorieMetier: 'GROS_OEUVRE' as const,
obligatoire: true,
personnalisable: true,
sousPhases: [
{
id: 'em-03-01',
nom: 'Murs extension',
description: 'Élévation des murs de l\'extension',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Maçonnerie'],
obligatoire: true
}
]
},
{
id: 'em-04',
nom: 'Finitions Extension',
description: 'Finitions et raccordements',
ordre: 4,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Finisseur', 'Électricien', 'Plombier'],
prerequis: ['em-03'],
categorieMetier: 'FINITIONS' as const,
obligatoire: true,
personnalisable: true,
sousPhases: [
{
id: 'em-04-01',
nom: 'Raccordements techniques',
description: 'Raccordements électriques et plomberie',
ordre: 1,
dureeEstimee: null,
budgetEstime: null,
competencesRequises: ['Électricien', 'Plombier'],
obligatoire: true
}
]
}
]
}
];
}
}
export const typeChantierService = new TypeChantierService();
export default typeChantierService;