/** * 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 { 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 { 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 { 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;