/** * BASE DE DONNÉES ULTRA-DÉTAILLÉE DES MATÉRIAUX BTP * Système le plus ambitieux d'Afrique - Tous les détails techniques * Spécifications pour climat tropical, normes africaines, calculs précis */ // ================== TYPES DE BASE ================== export interface DimensionsTechniques { longueur: number; // mm largeur: number; // mm hauteur: number; // mm epaisseur?: number; // mm diametre?: number; // mm pour tubes, fers ronds rayonCourbure?: number; // mm pour éléments courbes tolerance: number; // mm - tolérance de fabrication } export interface ProprietesPhysiques { densite: number; // kg/m³ resistanceCompression: number; // MPa resistanceTraction: number; // MPa resistanceFlexion: number; // MPa moduleElasticite: number; // GPa coefficientDilatation: number; // /°C absorptionEau: number; // % porosite: number; // % conductiviteThermique: number; // W/m.K resistanceGel: boolean; resistanceIntemperies: 'EXCELLENT' | 'BON' | 'MOYEN' | 'FAIBLE'; } export interface SpecificationsClimatiques { temperatureMin: number; // °C temperatureMax: number; // °C humiditeMax: number; // % resistanceUV: 'EXCELLENT' | 'BON' | 'MOYEN' | 'FAIBLE'; resistancePluie: 'EXCELLENT' | 'BON' | 'MOYEN' | 'FAIBLE'; resistanceVentFort: boolean; adaptationSaison: { saison: 'SECHE' | 'PLUIES' | 'HARMATTAN'; recommandations: string[]; }[]; } export interface NormesAfricaines { norme: string; // ex: "NF EN 197-1", "ASTM C150", "BS 12" classification: string; certificationRequise: boolean; organismeControle: string[]; testsObligatoires: string[]; marquageCE: boolean; conformiteEAC?: boolean; // East African Community conformiteECOWAS?: boolean; // Economic Community of West African States conformiteSADC?: boolean; // Southern African Development Community } export interface CalculsQuantification { uniteBase: string; // m², m³, kg, pièce, ml facteurPerte: number; // % de perte normale facteurSurapprovisionnement: number; // % de marge sécurité modeFourniture: 'VRAC' | 'PALETTE' | 'SACS' | 'PIECES'; conditionnement: { quantiteParUnite: number; poidsUnitaire: number; // kg dimensionsEmballage: DimensionsTechniques; }; calculAutomatique: { formule: string; // formule de calcul automatique parametres: string[]; // paramètres nécessaires }; } export interface MaterielBTP { id: string; nom: string; categorie: 'GROS_OEUVRE' | 'SECOND_OEUVRE' | 'FINITIONS' | 'ISOLATION' | 'ETANCHEITE' | 'EQUIPEMENTS'; sousCategorie: string; // Spécifications techniques détaillées dimensions: DimensionsTechniques; proprietes: ProprietesPhysiques; climatique: SpecificationsClimatiques; normes: NormesAfricaines; quantification: CalculsQuantification; // Informations commerciales marques: { nom: string; origine: string; certifie: boolean; prix: { devise: 'XOF' | 'XAF' | 'USD' | 'EUR'; montant: number; unite: string; }[]; }[]; fournisseurs: { nom: string; pays: string; ville: string; delaiLivraison: number; // jours quantiteMinimale: number; conditions: string[]; }[]; // Mise en œuvre miseEnOeuvre: { outillageNecessaire: string[]; competencesRequises: string[]; tempsUnitaire: number; // minutes par unité conditionsMeteo: string[]; temperatureOptimale: { min: number; max: number }; precautions: string[]; }; // Qualité et contrôle controleQualite: { testReception: string[]; frequenceControle: string; critereAcceptation: string[]; defautsFrequents: string[]; }; // Durabilité et maintenance durabilite: { dureeVieEstimee: number; // années maintenanceRequise: boolean; frequenceMaintenance?: string; signesdUsure: string[]; remplacement: string[]; }; } // ================== BASE DE DONNÉES MATÉRIAUX ================== export const MATERIAUX_BTP_DATABASE: MaterielBTP[] = [ // =================== MAÇONNERIE =================== { id: 'brique-rouge-15x10x5', nom: 'Brique Rouge Pleine 15x10x5cm', categorie: 'GROS_OEUVRE', sousCategorie: 'Maçonnerie - Briques', dimensions: { longueur: 150, largeur: 100, hauteur: 50, tolerance: 2 }, proprietes: { densite: 1800, resistanceCompression: 15, resistanceTraction: 2.5, resistanceFlexion: 4.2, moduleElasticite: 12000, coefficientDilatation: 0.000006, absorptionEau: 12, porosite: 18, conductiviteThermique: 0.85, resistanceGel: true, resistanceIntemperies: 'EXCELLENT' }, climatique: { temperatureMin: -10, temperatureMax: 60, humiditeMax: 95, resistanceUV: 'EXCELLENT', resistancePluie: 'EXCELLENT', resistanceVentFort: true, adaptationSaison: [ { saison: 'PLUIES', recommandations: [ 'Protection contre l\'eau pendant stockage', 'Séchage avant pose si humide', 'Éviter pose sous pluie battante' ] }, { saison: 'SECHE', recommandations: [ 'Humidification avant pose', 'Protection solaire du mortier', 'Arrosage après pose' ] } ] }, normes: { norme: 'NF EN 771-1', classification: 'M10 - FB 15', certificationRequise: true, organismeControle: ['CSTB', 'CERIB'], testsObligatoires: [ 'Résistance compression', 'Absorption d\'eau', 'Dimensions et tolérances', 'Gel/dégel' ], marquageCE: true, conformiteECOWAS: true }, quantification: { uniteBase: 'pièce', facteurPerte: 5, facteurSurapprovisionnement: 10, modeFourniture: 'PALETTE', conditionnement: { quantiteParUnite: 500, poidsUnitaire: 1.35, // kg par brique dimensionsEmballage: { longueur: 1200, largeur: 800, hauteur: 1000, tolerance: 0 } }, calculAutomatique: { formule: '(surface_mur * 1000000) / (longueur * hauteur) / epaisseur_mur_en_briques', parametres: ['surface_mur_m2', 'epaisseur_mur_cm'] } }, marques: [ { nom: 'Briqueterie du Sahel', origine: 'Burkina Faso', certifie: true, prix: [ { devise: 'XOF', montant: 45, unite: 'pièce' }, { devise: 'XOF', montant: 22500, unite: 'palette_500' } ] }, { nom: 'CIMAF Briques', origine: 'Côte d\'Ivoire', certifie: true, prix: [ { devise: 'XOF', montant: 50, unite: 'pièce' }, { devise: 'XOF', montant: 24000, unite: 'palette_500' } ] } ], fournisseurs: [ { nom: 'Matériaux Modernes Abidjan', pays: 'Côte d\'Ivoire', ville: 'Abidjan', delaiLivraison: 3, quantiteMinimale: 1000, conditions: ['Paiement comptant -3%', 'Livraison gratuite >5000 pièces'] } ], miseEnOeuvre: { outillageNecessaire: [ 'Truelle', 'Niveau à bulle', 'Cordeau', 'Seau mortier', 'Taloche', 'Martelet caoutchouc' ], competencesRequises: ['Maçon qualifié', 'Lecture de plan'], tempsUnitaire: 3, // 3min par brique posée conditionsMeteo: ['Pas de pluie', 'Température > 5°C'], temperatureOptimale: { min: 15, max: 35 }, precautions: [ 'Humidifier les briques avant pose', 'Mortier dosé à 350kg/m³', 'Joints de 10-12mm', 'Appareillage en quinconce' ] }, controleQualite: { testReception: [ 'Vérification dimensions', 'Test sonore (percussion)', 'Contrôle visuel fissures', 'Vérification planéité' ], frequenceControle: '1% des briques par lot', critereAcceptation: [ 'Dimensions ±2mm', 'Pas de fissures > 1mm', 'Couleur homogène', 'Son clair à la percussion' ], defautsFrequents: [ 'Fissures de séchage', 'Variations dimensionnelles', 'Éclats d\'angles', 'Couleur hétérogène' ] }, durabilite: { dureeVieEstimee: 100, maintenanceRequise: false, signesdUsure: [ 'Efflorescence', 'Fissuration', 'Érosion des joints' ], remplacement: [ 'Reprise de maçonnerie localisée', 'Rejointoiement si nécessaire' ] } }, // =================== BÉTON ARMÉ - FER À BÉTON =================== { id: 'fer-beton-ha-12mm', nom: 'Fer à Béton HA 12mm - Haute Adhérence', categorie: 'GROS_OEUVRE', sousCategorie: 'Béton Armé - Armatures', dimensions: { longueur: 12000, // barre de 12m standard largeur: 0, hauteur: 0, diametre: 12, tolerance: 0.5 }, proprietes: { densite: 7850, // kg/m³ acier resistanceCompression: 500, // MPa (limite élastique) resistanceTraction: 550, // MPa resistanceFlexion: 550, moduleElasticite: 200000, // GPa coefficientDilatation: 0.000012, absorptionEau: 0, porosite: 0, conductiviteThermique: 50, resistanceGel: true, resistanceIntemperies: 'MOYEN' // nécessite protection }, climatique: { temperatureMin: -40, temperatureMax: 80, humiditeMax: 100, resistanceUV: 'BON', resistancePluie: 'MOYEN', // corrosion possible resistanceVentFort: true, adaptationSaison: [ { saison: 'PLUIES', recommandations: [ 'Stockage sur chevrons, hors sol', 'Bâchage étanche obligatoire', 'Contrôle rouille avant mise en œuvre', 'Nettoyage si corrosion superficielle' ] }, { saison: 'SECHE', recommandations: [ 'Protection UV des barres stockées', 'Éviter surchauffe >60°C', 'Humidification du béton de coulage' ] } ] }, normes: { norme: 'NF A 35-080-1', classification: 'FeE500 - HA', certificationRequise: true, organismeControle: ['AFNOR', 'CSTB'], testsObligatoires: [ 'Traction - limite élastique', 'Traction - résistance rupture', 'Allongement rupture', 'Pliage-dépliage', 'Géométrie des verrous' ], marquageCE: true, conformiteECOWAS: true, conformiteSADC: true }, quantification: { uniteBase: 'kg', facteurPerte: 8, // chutes + façonnage facteurSurapprovisionnement: 15, modeFourniture: 'VRAC', conditionnement: { quantiteParUnite: 2000, // kg par lot poidsUnitaire: 0.888, // kg/ml pour Ø12 dimensionsEmballage: { longueur: 12000, largeur: 200, hauteur: 200, tolerance: 0 } }, calculAutomatique: { formule: 'surface_dalle * epaisseur_dalle * densite_armature_kg_m3', parametres: ['surface_m2', 'epaisseur_cm', 'ratio_armature_kg_m3'] } }, marques: [ { nom: 'ACIERIES du Bénin', origine: 'Bénin', certifie: true, prix: [ { devise: 'XOF', montant: 850, unite: 'kg' }, { devise: 'XOF', montant: 1700000, unite: 'tonne' } ] }, { nom: 'SIDEX Mali', origine: 'Mali', certifie: true, prix: [ { devise: 'XOF', montant: 820, unite: 'kg' }, { devise: 'XOF', montant: 1640000, unite: 'tonne' } ] } ], fournisseurs: [ { nom: 'Négoce Sidérurgie Ouest-Afrique', pays: 'Sénégal', ville: 'Dakar', delaiLivraison: 7, quantiteMinimale: 500, conditions: ['Transport inclus >1T', 'Façonnage sur demande'] } ], miseEnOeuvre: { outillageNecessaire: [ 'Coupe-boulons Ø12', 'Cintreuse manuelle', 'Ployeur d\'acier', 'Ligatures fil de fer', 'Mètre ruban', 'Équerre de maçon' ], competencesRequises: ['Ferrailleur qualifié', 'Lecture plans ferraillage'], tempsUnitaire: 120, // 2h par 100kg façonnage + pose conditionsMeteo: ['Pas de pluie pendant bétonnage'], temperatureOptimale: { min: 5, max: 35 }, precautions: [ 'Enrobage minimum 2,5cm', 'Recouvrement 40Ø minimum', 'Calage armatures avec cales béton', 'Vérification espacement barres', 'Nettoyage rouille si nécessaire' ] }, controleQualite: { testReception: [ 'Vérification marquage acier', 'Contrôle diamètre pied à coulisse', 'Essai pliage manuel', 'Contrôle rectitude', 'État de surface (rouille)' ], frequenceControle: '10% des barres par livraison', critereAcceptation: [ 'Marquage conforme norme', 'Diamètre ±0,5mm', 'Pas de rouille adhérente', 'Rectitude <5mm/m', 'Nervures conformes' ], defautsFrequents: [ 'Corrosion superficielle', 'Défauts de nervurage', 'Variations de diamètre', 'Courbure excessive' ] }, durabilite: { dureeVieEstimee: 50, maintenanceRequise: false, signesdUsure: [ 'Corrosion si enrobage insuffisant', 'Fissuration béton par gonflement rouille' ], remplacement: [ 'Reprise béton si corrosion avancée', 'Renforcement structure si nécessaire' ] } }, // =================== BÉTON - CIMENT =================== { id: 'ciment-portland-cem1-525', nom: 'Ciment Portland CEM I 52.5 N', categorie: 'GROS_OEUVRE', sousCategorie: 'Béton - Liants', dimensions: { longueur: 0, largeur: 0, hauteur: 0, tolerance: 0 }, proprietes: { densite: 3150, // kg/m³ ciment pur resistanceCompression: 52.5, // MPa à 28j resistanceTraction: 0, resistanceFlexion: 0, moduleElasticite: 0, coefficientDilatation: 0.00001, absorptionEau: 0, porosite: 0, conductiviteThermique: 1.4, resistanceGel: true, resistanceIntemperies: 'EXCELLENT' }, climatique: { temperatureMin: 5, temperatureMax: 50, humiditeMax: 85, resistanceUV: 'EXCELLENT', resistancePluie: 'EXCELLENT', resistanceVentFort: true, adaptationSaison: [ { saison: 'PLUIES', recommandations: [ 'Stockage impérativement au sec', 'Palettes surélevées obligatoires', 'Bâchage étanche renforcé', 'Rotation stock (premier entré = premier sorti)', 'Contrôle prise avant usage si humidité' ] }, { saison: 'SECHE', recommandations: [ 'Protection chaleur excessive >40°C', 'Humidification granulats et eau', 'Coulage tôt le matin ou tard le soir', 'Cure humide prolongée 7 jours minimum' ] } ] }, normes: { norme: 'NF EN 197-1', classification: 'CEM I 52.5 N', certificationRequise: true, organismeControle: ['AFNOR', 'CERIB'], testsObligatoires: [ 'Résistance compression 2j, 7j, 28j', 'Temps de prise début/fin', 'Expansion Le Chatelier', 'Finesse Blaine', 'Composition chimique' ], marquageCE: true, conformiteECOWAS: true }, quantification: { uniteBase: 'kg', facteurPerte: 3, facteurSurapprovisionnement: 10, modeFourniture: 'SACS', conditionnement: { quantiteParUnite: 50, // sac de 50kg poidsUnitaire: 50, dimensionsEmballage: { longueur: 600, largeur: 400, hauteur: 120, tolerance: 0 } }, calculAutomatique: { formule: 'volume_beton_m3 * dosage_ciment_kg_m3', parametres: ['volume_beton_m3', 'classe_resistance', 'type_ouvrage'] } }, marques: [ { nom: 'CIMTOGO', origine: 'Togo', certifie: true, prix: [ { devise: 'XOF', montant: 4200, unite: 'sac_50kg' }, { devise: 'XOF', montant: 84, unite: 'kg' } ] }, { nom: 'CIMENTS du Sahel', origine: 'Burkina Faso', certifie: true, prix: [ { devise: 'XOF', montant: 4000, unite: 'sac_50kg' }, { devise: 'XOF', montant: 80, unite: 'kg' } ] } ], fournisseurs: [ { nom: 'Distribution BTP Sahel', pays: 'Mali', ville: 'Bamako', delaiLivraison: 2, quantiteMinimale: 1000, conditions: ['Livraison camion souffleur', 'Stockage silo si >5T'] } ], miseEnOeuvre: { outillageNecessaire: [ 'Bétonnière ou centrale béton', 'Pelle, seau doseur', 'Vibreur béton', 'Taloche, règle', 'Pulvérisateur cure', 'Bâches protection' ], competencesRequises: ['Maçon béton armé', 'Dosage béton'], tempsUnitaire: 30, // 30min par m³ fabrication + coulage conditionsMeteo: ['Température 5-35°C', 'Pas de gel', 'Pas pluie battante'], temperatureOptimale: { min: 15, max: 25 }, precautions: [ 'Dosage précis selon classe résistance', 'Malaxage minimum 2 minutes', 'Coulage dans les 1h30', 'Vibration complète sans ségrégation', 'Cure humide 7j minimum climat tropical' ] }, controleQualite: { testReception: [ 'Vérification date fabrication <3 mois', 'Contrôle emballage (pas de trous)', 'Test prise main (pas de grumeaux durs)', 'Couleur gris homogène', 'Marquage conforme sac' ], frequenceControle: '1 sac par palette', critereAcceptation: [ 'Date <90j', 'Pas de prise en sac', 'Pas de contamination', 'Marquage CE visible', 'Finesse tactile correcte' ], defautsFrequents: [ 'Prise prématurée (humidité)', 'Grumeaux durs', 'Contamination plâtre', 'Sacs percés' ] }, durabilite: { dureeVieEstimee: 100, maintenanceRequise: false, signesdUsure: [ 'Carbonatation surface', 'Microfissuration retrait', 'Décoloration' ], remplacement: [ 'Réparation béton si dégradation', 'Protection surface si nécessaire' ] } } // [La base sera étendue avec TOUS les matériaux : sables, graviers, carrelages, // peintures, isolants, menuiseries, plomberie, électricité, etc.] ]; // ================== CALCULS AUTOMATIQUES AVANCÉS ================== export class CalculateurBTPAfrique { /** * Calcul ultra-précis quantité briques pour mur */ static calculerBriquesMur(params: { longueur: number; // m hauteur: number; // m epaisseur: number; // cm (10, 15, 20) ouvertures?: { largeur: number; hauteur: number }[]; // portes/fenêtres typeAppareillage: 'DROIT' | 'QUINCONCE' | 'FLAMAND'; jointHorizontal: number; // mm (généralement 10-12) jointVertical: number; // mm (généralement 10-12) }) { const { longueur, hauteur, epaisseur, ouvertures = [], typeAppareillage, jointHorizontal, jointVertical } = params; // Dimensions brique standard (peut être paramétrable) const brique = MATERIAUX_BTP_DATABASE.find(m => m.id === 'brique-rouge-15x10x5')!; const largeurBrique = brique.dimensions.longueur; // 150mm const hauteurBrique = brique.dimensions.hauteur; // 50mm // Surface nette mur let surfaceMur = longueur * hauteur; // Déduction ouvertures for (const ouverture of ouvertures) { surfaceMur -= ouverture.largeur * ouverture.hauteur; } // Nombre de briques par m² const largeurAvecJoint = largeurBrique + jointVertical; const hauteurAvecJoint = hauteurBrique + jointHorizontal; const briquesParM2 = (1000 / largeurAvecJoint) * (1000 / hauteurAvecJoint); // Nombre briques selon appareillage let coefficientAppareillage = 1; switch (typeAppareillage) { case 'QUINCONCE': coefficientAppareillage = 1.02; // légère surconsommation break; case 'FLAMAND': coefficientAppareillage = 1.15; // appareillage décoratif break; } // Épaisseur mur (nombre de briques en épaisseur) const nombreCouchesEpaisseur = Math.ceil(epaisseur * 10 / brique.dimensions.largeur); const nombreBriques = Math.ceil( surfaceMur * briquesParM2 * coefficientAppareillage * nombreCouchesEpaisseur ); // Calcul mortier const volumeMortier = this.calculerMortierMaconnerie({ nombreBriques, jointHorizontal, jointVertical, surfaceMur, epaisseurMur: epaisseur }); return { nombreBriques, briquesParM2: Math.round(briquesParM2), surfaceNette: surfaceMur, coefficientAppareillage, mortier: volumeMortier, details: { largeurAvecJoint, hauteurAvecJoint, nombreCouchesEpaisseur } }; } /** * Calcul volume mortier pour maçonnerie */ static calculerMortierMaconnerie(params: { nombreBriques: number; jointHorizontal: number; // mm jointVertical: number; // mm surfaceMur: number; // m² epaisseurMur: number; // cm }) { const { nombreBriques, jointHorizontal, jointVertical, surfaceMur, epaisseurMur } = params; // Volume joints approximatif = 15% du volume briques const volumeBriques = nombreBriques * 0.15 * 0.10 * 0.05; // m³ const volumeMortier = volumeBriques * 0.25; // 25% du volume briques // Dosage mortier standard maçonnerie : 350kg ciment/m³ const cimentKg = volumeMortier * 350; const sableM3 = volumeMortier * 0.8; // 800L sable par m³ mortier const eauLitres = volumeMortier * 175; // 175L eau par m³ return { volumeTotal: volumeMortier, dosage: { ciment: Math.ceil(cimentKg), sable: Math.ceil(sableM3 * 1000), // en litres eau: Math.ceil(eauLitres) }, nombreSacsCiment50kg: Math.ceil(cimentKg / 50) }; } /** * Calcul béton armé dalle - ULTRA DÉTAILLÉ */ static calculerBetonArme(params: { longueur: number; // m largeur: number; // m epaisseur: number; // cm typeOuvrage: 'DALLE' | 'POUTRE' | 'POTEAU' | 'VOILE'; classeBeton: 'C20/25' | 'C25/30' | 'C30/37' | 'C35/45'; classeExposition: 'XC1' | 'XC3' | 'XC4' | 'XS1' | 'XS3'; // selon EN 206 acierType: 'FeE400' | 'FeE500'; enrobageRequis?: number; // cm }) { const { longueur, largeur, epaisseur, typeOuvrage, classeBeton, classeExposition, acierType, enrobageRequis } = params; // Volume béton const volumeBeton = longueur * largeur * (epaisseur / 100); // Dosage béton selon classe const dosagesBeton = { 'C20/25': { ciment: 300, eau: 165, graviers: 1100, sable: 650 }, 'C25/30': { ciment: 350, eau: 175, graviers: 1050, sable: 600 }, 'C30/37': { ciment: 385, eau: 180, graviers: 1000, sable: 580 }, 'C35/45': { ciment: 420, eau: 185, graviers: 950, sable: 550 } }; const dosage = dosagesBeton[classeBeton]; // Enrobage selon classe exposition (climat tropical africain) const enrobages = { 'XC1': 2.0, // intérieur sec 'XC3': 2.5, // intérieur humide 'XC4': 3.0, // extérieur avec gel 'XS1': 3.5, // air marin 'XS3': 4.5 // marnage }; const enrobage = enrobageRequis || enrobages[classeExposition]; // Calcul armatures selon type ouvrage let ratioArmature = 80; // kg/m³ par défaut switch (typeOuvrage) { case 'DALLE': ratioArmature = epaisseur < 15 ? 60 : 80; break; case 'POUTRE': ratioArmature = 120; break; case 'POTEAU': ratioArmature = 150; break; case 'VOILE': ratioArmature = 100; break; } const poidsAcierTotal = volumeBeton * ratioArmature; // Répartition par diamètres (approximation standard) const repartitionAcier = { 6: poidsAcierTotal * 0.1, // 10% en Ø6 8: poidsAcierTotal * 0.15, // 15% en Ø8 10: poidsAcierTotal * 0.25, // 25% en Ø10 12: poidsAcierTotal * 0.30, // 30% en Ø12 14: poidsAcierTotal * 0.15, // 15% en Ø14 16: poidsAcierTotal * 0.05 // 5% en Ø16 }; return { volumeBeton, materiaux: { ciment: { quantite: Math.ceil(volumeBeton * dosage.ciment), sacs50kg: Math.ceil(volumeBeton * dosage.ciment / 50) }, sable: { quantite: Math.ceil(volumeBeton * dosage.sable), // kg volumeM3: Math.ceil(volumeBeton * dosage.sable / 1600) // densité sable }, graviers: { quantite: Math.ceil(volumeBeton * dosage.graviers), // kg volumeM3: Math.ceil(volumeBeton * dosage.graviers / 1500) // densité graviers }, eau: Math.ceil(volumeBeton * dosage.eau), // litres acier: { total: Math.ceil(poidsAcierTotal), repartition: repartitionAcier } }, specifications: { classeBeton, classeExposition, enrobage, ratioArmature }, controles: { slumpTest: '8-12cm', resistanceRequise: classeBeton, ageDecoffrage: epaisseur < 20 ? '7j' : '14j' } }; } } // [SUITE AVEC TOUS LES AUTRES MATÉRIAUX ET CALCULS...]