Files
tilbudgivern/archive/docs/MATERIAL_QUANTITY_CALCULATION_FIX.md
alexpolo1 4a372d2e28 clean up
2025-10-30 18:28:58 +00:00

6.8 KiB
Raw Permalink Blame History

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)

  1. Eternit B7 tagplader: 111.77 m²
  2. Tagpap/undertag: 106.68 m² (101.61 × 1.05)
  3. Mineraluld 200mm: 101.61 m² (101.61 × 1.0)
  4. Dampspærre: 109.74 m² (101.61 × 1.08)

Længde-baseret (11m)

  1. Ryggesten og tagrygge: 11.55 løbende m (11 × 1.05)
  2. Tagrende Ø150mm: 22.44 løbende m (11 × 2 × 1.02)

Omkreds-baseret (38m omkreds)

  1. Vindskeder: 39.9 løbende m (38 × 1.05)
  2. Tætningslister: 39.9 løbende m (38 × 1.05)

Styk-baseret

  1. Nedløb Ø100mm: 2 stk (11m / 8m = 1.375 → min 2)
  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

  1. /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 

Solution: Robust Matching & Clear Logging

  1. Match multiple unit formats (m², m2, varianter)
  2. Identify calculation type (area, length, omkreds)
  3. Log every step for transparency
  4. 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