6.8 KiB
Material Quantity Calculation Fix
🐛 Problem Rapporteret af Bruger
Bruger så i UI:
- Tagareal: 101.61 m²
- Eternit B7 tagplader: 1.1 m² ❌
Dette passer ikke! Skulle være:
- Eternit B7 tagplader: 111.77 m² (101.61 × 1.1)
🔍 Root Cause Analysis
Problem 1: Unit Format Mismatch
Kode (linje 153):
if (material.unit === 'm2' || material.unit.includes('m2')) {
quantity = roofArea * material.quantity;
}
Predefined materials (linje 69):
{ name: 'Eternit B7 tagplader', quantity: 1.1, unit: 'm²', ... }
Issue: Unit er 'm²' (med superscript ²) men koden tjekker kun for 'm2' (uden superscript).
Resultat: Betingelsen fejler → quantity forbliver hardcoded værdi 1.1 ❌
Problem 2: Omkreds Beregning Fejl
Kode (linje 333):
quantity: (length + width) * 1.05, // Omkreds + 5% spild
Issue: Dette er IKKE omkredsen! Omkreds = (længde + bredde) × 2
Eksempel med 8m × 11m:
- Forkert: (8 + 11) × 1.05 = 19.95m ❌
- Korrekt: (8 + 11) × 2 × 1.05 = 39.9m ✅
Påvirkede materialer:
- Vindskeder
- Tætningslister
Problem 3: For Lavt Spild på Dampspærre
Kode:
{ name: 'Dampspærre PE-folie', quantity: 1.05, ... } // 5% spild
Standard: Dampspærre kræver 8-10% spild pga overlap ved sammenføjninger.
BR18 & Montagevejledninger: Min. 8% overlap anbefales
✅ Løsning Implementeret
Fix 1: Robust Unit Matching
// Tjek for m² (både m2, m², og varianter)
if (material.unit === 'm²' || material.unit === 'm2' ||
material.unit.includes('m²') || material.unit.includes('m2')) {
quantity = roofArea * material.quantity;
console.log(` → m² materiale: ${roofArea.toFixed(1)} × ${material.quantity} = ${quantity.toFixed(1)}`);
}
Nu understøttes:
- ✅
'm²'(superscript) - ✅
'm2'(normal) - ✅
'm² tagflade'(med tekst) - ✅
'm2 area'(med tekst)
Fix 2: Korrekt Omkreds Beregning
else if (material.calculation?.includes('Omkreds')) {
// Omkreds materialer (vindskeder, tætningslister)
const omkreds = (length + width) * 2;
quantity = omkreds * material.quantity;
console.log(` → Omkreds materiale: ${omkreds.toFixed(1)} × ${material.quantity} = ${quantity.toFixed(1)}`);
}
Opdaterede materialer:
Vindskeder:
quantity: (length + width) * 2 * 1.05,
calculation: `Omkreds (${length}+${width})×2 × 1.05 = ${((length + width) * 2 * 1.05).toFixed(1)}m`
Tætningslister:
quantity: (length + width) * 2 * 1.05,
calculation: `Omkreds (${length}+${width})×2 × 1.05 = ${((length + width) * 2 * 1.05).toFixed(1)}m`
Fix 3: Realistisk Spild på Dampspærre
// Før: quantity: 1.05 (5% spild)
// Nu: quantity: 1.08 (8% spild)
{ name: 'Dampspærre PE-folie', quantity: 1.08, unit: 'm²', unitPrice: 45.00,
category: 'Isolering', calculation: 'Tagareal × 1.08' }
Fix 4: Omfattende Debug Logging
Tilføjet logging for hver materiale beregning:
console.log(`🧮 Beregner materiale: ${material.name}`, {
unit: material.unit,
originalQty: material.quantity,
roofArea,
length
});
console.log(` → m² materiale: ${roofArea.toFixed(1)} × ${material.quantity} = ${quantity.toFixed(1)}`);
📊 Før og Efter (8m × 11m tag, 101.61 m²)
Eternit B7 Tagplader
- ❌ Før: 1.1 m²
- ✅ Efter: 111.77 m² (101.61 × 1.1)
Vindskeder
- ❌ Før: 19.95 løbende m
- ✅ Efter: 39.9 løbende m ((8+11)×2×1.05)
Dampspærre
- ❌ Før: 106.68 m² (×1.05)
- ✅ Efter: 109.74 m² (×1.08)
Tætningslister
- ❌ Før: 20.9 løbende m
- ✅ Efter: 39.9 løbende m ((8+11)×2×1.05)
🎯 Forventet Resultat Nu
Med 8m × 11m, 30° hældning (101.61 m²):
Tagmaterialer (m²-baseret)
- Eternit B7 tagplader: 111.77 m² ✅
- Tagpap/undertag: 106.68 m² (101.61 × 1.05) ✅
- Mineraluld 200mm: 101.61 m² (101.61 × 1.0) ✅
- Dampspærre: 109.74 m² (101.61 × 1.08) ✅
Længde-baseret (11m)
- Ryggesten og tagrygge: 11.55 løbende m (11 × 1.05) ✅
- Tagrende Ø150mm: 22.44 løbende m (11 × 2 × 1.02) ✅
Omkreds-baseret (38m omkreds)
- Vindskeder: 39.9 løbende m (38 × 1.05) ✅
- Tætningslister: 39.9 løbende m (38 × 1.05) ✅
Styk-baseret
- Nedløb Ø100mm: 2 stk (11m / 8m = 1.375 → min 2) ✅
- Tagventilation: 3 stk (101.61 / 50 = 2.03 → 3) ✅
🧪 Verifikation
Browser Console Output (forventet):
🧮 Beregner materiale: Eternit B7 tagplader { unit: 'm²', originalQty: 1.1, roofArea: 101.61, length: 11 }
→ m² materiale: 101.6 × 1.1 = 111.8
🧮 Beregner materiale: Vindskeder 25x200mm { unit: 'løbende m', originalQty: 1.05, roofArea: 101.61, length: 11 }
→ Omkreds materiale: 38.0 × 1.05 = 39.9
🧮 Beregner materiale: Dampspærre PE-folie { unit: 'm²', originalQty: 1.08, roofArea: 101.61, length: 11 }
→ m² materiale: 101.6 × 1.08 = 109.7
UI Display (forventet):
📦 Materialer (Automatisk beregnet) - 23 materialer
1. Eternit B7 tagplader
Beregning: Tagareal × 1.1 (10% spild)
Antal: 111.8 m²
Pris pr. m²: 245 kr
Total: 27.391,00 kr ✅
2. Ryggesten og tagrygge
Beregning: Bygningens længde
Antal: 11.6 løbende m
Pris pr. løbende m: 145 kr
Total: 1.682,00 kr ✅
3. Vindskeder 25x200mm
Beregning: Omkreds (11+8)×2 × 1.05 = 39.9m
Antal: 39.9 løbende m
Pris pr. løbende m: 95 kr
Total: 3.790,50 kr ✅
📝 Files Changed
/frontend/src/components/InlineSmartPackage.js- Fixed unit matching (m² vs m2)
- Fixed omkreds calculation (×2)
- Updated dampspærre spild (5% → 8%)
- Added comprehensive debug logging
- Updated predefined package factors
🎓 Læring
Problem: Hardcoded Multiplikatorer
Når materialer defineres som:
{ name: 'Materiale', quantity: 1.1, unit: 'm²' }
Betyder quantity faktoren (10% spild), IKKE det faktiske antal!
Systemet skal multiplicere med geometrien:
actualQuantity = roofArea × factor
actualQuantity = 101.61 × 1.1 = 111.77 m²
Solution: Robust Matching & Clear Logging
- Match multiple unit formats (m², m2, varianter)
- Identify calculation type (area, length, omkreds)
- Log every step for transparency
- Use industry standards (8% dampspærre spild, korrekt omkreds)
✅ Status
Build & Test: ✅ All tests passed
Deployment: ✅ Live
Verification: Åbn browser console og se debug logs
Date: 2025-10-27
Issue: Material quantities showing multiplication factors instead of actual calculated values
Impact: Critical - Affected all m²-based materials
Fix: Complete unit matching system + omkreds corrections + spild adjustments