Files
tilbudgivern/backend/create-roof-shapes.js
alexpolo1 bdb9e524db Implement manual and automated tests for auto-save countdown feature
- Added a comprehensive manual testing guide for the countdown functionality in `test_countdown_manual.md`.
- Developed a detailed Selenium test suite in `test_countdown_selenium.py` to verify countdown behavior, including server accessibility, login, countdown progression, and UI elements.
- Created a minimal Selenium test version in `test_countdown_selenium_minimal.py` for quick checks without complex setup.
- Introduced a verification script in `test_countdown_verification.py` to analyze code correctness, including server checks, build file existence, and countdown logic.
2025-11-14 11:28:58 +00:00

571 lines
25 KiB
JavaScript

require('dotenv').config();
const mysql = require('mysql2/promise');
const axios = require('axios');
async function getMaterialByName(allMaterials, searchTerms) {
for (const term of searchTerms) {
const found = allMaterials.find(m =>
m.name && m.name.toLowerCase().includes(term.toLowerCase()) &&
m.price && parseFloat(m.price) > 0
);
if (found) return found;
}
return null;
}
async function createRoofShapePackage(conn, allMaterials, packageData) {
const [existing] = await conn.execute(
'SELECT id FROM material_packages WHERE name = ? AND is_active = 1',
[packageData.name]
);
if (existing.length > 0) {
console.log(` ⏭️ ${packageData.name} findes allerede`);
return;
}
const [result] = await conn.execute(
`INSERT INTO material_packages
(name, description, category, estimated_hours, hourly_rate,
installation_notes, created_by, total_estimated_price, is_active, is_template,
area_based, time_per_sqm, auto_calculated)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
packageData.name,
packageData.description,
'Tag',
packageData.hours,
packageData.hourlyRate || 580,
packageData.notes,
'System',
0,
1, 1, 1,
packageData.timePerSqm,
1
]
);
const packageId = result.insertId;
console.log(`${packageData.name} (ID ${packageId})`);
// Tilføj materialer
for (const matDef of packageData.materials) {
const material = await getMaterialByName(allMaterials, matDef.searchTerms);
if (material) {
await conn.execute(
`INSERT INTO package_materials
(package_id, material_name, material_category, quantity, unit, unit_price,
total_price, supplier, notes, base_quantity)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
packageId,
material.name,
material.category || 'Tag',
matDef.quantity,
material.enhed || 'stk',
parseFloat(material.price),
matDef.quantity * parseFloat(material.price),
material.leverandoer || 'Bygma',
matDef.notes || '',
matDef.baseQty || matDef.quantity
]
);
}
}
// Tilføj opgaver
for (const task of packageData.tasks) {
await conn.execute(
`INSERT INTO package_tasks
(package_id, task_name, task_description, estimated_hours, task_order, task_phase)
VALUES (?, ?, ?, ?, ?, ?)`,
[packageId, task.name, task.desc, task.hours, task.order, task.phase]
);
}
}
(async () => {
const conn = await mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
const response = await axios.get('http://localhost:4031/api/materials');
const allMaterials = response.data.materials || [];
console.log('🏗️ OPRETTER PAKKER FOR ALLE 10 TAGFORMER\n');
// 1. SADELTAG
await createRoofShapePackage(conn, allMaterials, {
name: 'Sadeltag - Komplet renovering',
description: `Komplet renovering af sadeltag - den mest almindelige tagform i Danmark.
🏠 SADELTAG KARAKTERISTIKA:
• To tagflader der mødes i en rygning
• Klassisk og tidløs tagform
• Enkel konstruktion
• God afvanding
📋 INKLUDERER:
• Nedrivning af gammelt tag
• Kontrol og evt. reparation af spær
• Nye lægter og undertag
• Tagbeklædning efter valg
• Rygning og vindskeder
• Tagrende og nedløb
⏱ TID: 6 timer per 10m²
💰 TIMEPRIS: 580 kr/time
✨ Perfekt til: Almindelige enfamiliehuse og sommerhuse`,
hours: 6.0,
timePerSqm: 0.6,
hourlyRate: 580,
notes: 'Sadeltag er simpelt og omkostningseffektivt. Standard konstruktion.',
materials: [
{ searchTerms: ['B7 tagplader', 'bølgeplade'], quantity: 11, baseQty: 11, notes: 'Tagbeklædning' },
{ searchTerms: ['Skruer til tagplader', 'tagskrue'], quantity: 160, baseQty: 16, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag', 'undertag'], quantity: 11, baseQty: 11, notes: 'Undertag' },
{ searchTerms: ['Lægter 38x63'], quantity: 22, baseQty: 2.2, notes: 'Lægter' },
{ searchTerms: ['Eternit rygningsten', 'rygning'], quantity: 8, baseQty: 0.8, notes: 'Rygning pr lbm' }
],
tasks: [
{ name: 'Forberedelse', desc: 'Opsætte stillads og sikkerhedsudstyr', hours: 0.5, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage gammelt tagmateriale', hours: 1.5, phase: 'hovedarbejde', order: 1 },
{ name: 'Spærkontrol', desc: 'Kontrollere tagkonstruktion', hours: 0.5, phase: 'hovedarbejde', order: 2 },
{ name: 'Lægter og undertag', desc: 'Montere lægter og undertag', hours: 1.5, phase: 'hovedarbejde', order: 3 },
{ name: 'Tagbeklædning', desc: 'Montere tagplader', hours: 2.0, phase: 'hovedarbejde', order: 4 },
{ name: 'Rygning', desc: 'Montere rygning', hours: 0.8, phase: 'afslutning', order: 1 },
{ name: 'Slutkontrol', desc: 'Kvalitetskontrol', hours: 0.3, phase: 'inspektion', order: 1 }
]
});
// 2. VALMTAG
await createRoofShapePackage(conn, allMaterials, {
name: 'Valmtag - Komplet renovering',
description: `Komplet renovering af valmtag - elegant tagform med fire tagflader.
🏠 VALMTAG KARAKTERISTIKA:
• Fire tagflader (to gavle er også taget)
• Ingen gavle - mere vindfast
• Ekstra kompleks konstruktion
• Mere materialer end sadeltag
📋 INKLUDERER:
• Nedrivning af eksisterende tag
• Spærkontrol (mere komplekst)
• Lægter og undertag (større areal)
• Tagbeklædning (ca. 20% mere end sadeltag)
• Rygning og 4 valmhjørner
• Vindskeder rundt om
⏱ TID: 8 timer per 10m²
💰 TIMEPRIS: 580 kr/time
✨ Perfekt til: Villaer og bygninger hvor vindpåvirkning er vigtig`,
hours: 8.0,
timePerSqm: 0.8,
hourlyRate: 580,
notes: 'Valmtag er mere komplekst end sadeltag. Kræver ekstra tid til hjørner.',
materials: [
{ searchTerms: ['B7 tagplader'], quantity: 13, baseQty: 13, notes: 'Tagbeklædning (20% mere)' },
{ searchTerms: ['Skruer til tagplader'], quantity: 190, baseQty: 19, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag'], quantity: 13, baseQty: 13, notes: 'Undertag' },
{ searchTerms: ['Lægter 38x63'], quantity: 26, baseQty: 2.6, notes: 'Ekstra lægter' },
{ searchTerms: ['Eternit rygningsten'], quantity: 10, baseQty: 1.0, notes: 'Rygning + valme' }
],
tasks: [
{ name: 'Forberedelse og stillads', desc: 'Omfattende stillads rundt om bygning', hours: 0.8, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage fire tagflader', hours: 2.0, phase: 'hovedarbejde', order: 1 },
{ name: 'Spærkontrol', desc: 'Kontrollere kompleks valmkonstruktion', hours: 0.8, phase: 'hovedarbejde', order: 2 },
{ name: 'Lægter og undertag', desc: 'Montere på alle fire flader', hours: 2.0, phase: 'hovedarbejde', order: 3 },
{ name: 'Tagbeklædning', desc: 'Lægge plader på fire flader', hours: 2.5, phase: 'hovedarbejde', order: 4 },
{ name: 'Rygning og valme', desc: 'Montere rygning og valmhjørner', hours: 1.2, phase: 'afslutning', order: 1 },
{ name: 'Vindskeder', desc: 'Montere vindskeder rundt om', hours: 0.8, phase: 'afslutning', order: 2 },
{ name: 'Kvalitetskontrol', desc: 'Kontrollere alle hjørner og samlinger', hours: 0.4, phase: 'inspektion', order: 1 }
]
});
// 3. GAVLTAG
await createRoofShapePackage(conn, allMaterials, {
name: 'Gavltag - Komplet renovering',
description: `Komplet renovering af gavltag - traditionel tagform med åbne gavle.
🏠 GAVLTAG KARAKTERISTIKA:
• To tagflader med fritstående gavle
• Gavle i murværk eller træ
• God ventilation under taget
• Klassisk dansk byggeskik
📋 INKLUDERER:
• Nedrivning af tag
• Spær og lægter
• Undertag og tagbeklædning
• Rygning
• Gavlafslutninger
• Vindskeder på gavle
⏱ TID: 6.5 timer per 10m²
💰 TIMEPRIS: 580 kr/time
✨ Perfekt til: Traditionelle danske boliger`,
hours: 6.5,
timePerSqm: 0.65,
hourlyRate: 580,
notes: 'Gavltag kræver omhyggelig afslutning mod gavlene.',
materials: [
{ searchTerms: ['B7 tagplader'], quantity: 11, baseQty: 11, notes: 'Tagbeklædning' },
{ searchTerms: ['Skruer til tagplader'], quantity: 160, baseQty: 16, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag'], quantity: 11, baseQty: 11, notes: 'Undertag' },
{ searchTerms: ['Lægter 38x63'], quantity: 22, baseQty: 2.2, notes: 'Lægter' },
{ searchTerms: ['Eternit vindskeder', 'vindskede'], quantity: 12, baseQty: 1.2, notes: 'Gavlafslutning' }
],
tasks: [
{ name: 'Forberedelse', desc: 'Stillads og sikkerhed', hours: 0.5, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage tagmateriale', hours: 1.5, phase: 'hovedarbejde', order: 1 },
{ name: 'Lægter og undertag', desc: 'Montere lægter', hours: 1.5, phase: 'hovedarbejde', order: 2 },
{ name: 'Tagbeklædning', desc: 'Lægge tagplader', hours: 2.0, phase: 'hovedarbejde', order: 3 },
{ name: 'Rygning', desc: 'Montere rygning', hours: 0.8, phase: 'afslutning', order: 1 },
{ name: 'Gavlafslutninger', desc: 'Montere vindskeder på gavle', hours: 1.0, phase: 'afslutning', order: 2 },
{ name: 'Kvalitetskontrol', desc: 'Slutkontrol', hours: 0.3, phase: 'inspektion', order: 1 }
]
});
// 4. KØBENHAVNERTAG
await createRoofShapePackage(conn, allMaterials, {
name: 'Københavnertag - Komplet renovering',
description: `Komplet renovering af københavnertag - klassisk bytag med bølget/brudt form.
🏠 KØBENHAVNERTAG KARAKTERISTIKA:
• Knækket tagform (mansard-lignende)
• Typisk i indre by København
• Stejl nederste del, fladere øverste del
• Historisk bygningsmiljø
📋 INKLUDERER:
• Nedrivning af eksisterende tag
• Spærkonstruktion (to vinkler)
• Undertag på begge vinkler
• Tagbeklædning tilpasset form
• Rygning og afslutninger
• Zink-inddækninger ved knæk
⏱ TID: 10 timer per 10m²
💰 TIMEPRIS: 620 kr/time (specialiseret arbejde)
✨ Perfekt til: Ejendomme i historiske bymiljøer`,
hours: 10.0,
timePerSqm: 1.0,
hourlyRate: 620,
notes: 'Københavnertag er komplekst og kræver specialiseret håndværk. Højere timepris.',
materials: [
{ searchTerms: ['B7 tagplader'], quantity: 12, baseQty: 12, notes: 'Tagbeklædning' },
{ searchTerms: ['Skruer til tagplader'], quantity: 180, baseQty: 18, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag'], quantity: 12, baseQty: 12, notes: 'Undertag' },
{ searchTerms: ['Lægter 38x63'], quantity: 28, baseQty: 2.8, notes: 'Ekstra lægter til knæk' },
{ searchTerms: ['Eternit rygningsten'], quantity: 8, baseQty: 0.8, notes: 'Rygning' }
],
tasks: [
{ name: 'Forberedelse', desc: 'Stillads til kompleks tagform', hours: 1.0, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage gammelt tag', hours: 2.0, phase: 'hovedarbejde', order: 1 },
{ name: 'Spærkontrol', desc: 'Kontrollere knækket konstruktion', hours: 1.0, phase: 'hovedarbejde', order: 2 },
{ name: 'Lægter nederste del', desc: 'Montere lægter på stejl del', hours: 1.5, phase: 'hovedarbejde', order: 3 },
{ name: 'Lægter øverste del', desc: 'Montere lægter på fladere del', hours: 1.0, phase: 'hovedarbejde', order: 4 },
{ name: 'Tagbeklædning', desc: 'Lægge plader på begge vinkler', hours: 2.5, phase: 'hovedarbejde', order: 5 },
{ name: 'Knæk-inddækning', desc: 'Tætne ved knækket', hours: 1.0, phase: 'afslutning', order: 1 },
{ name: 'Rygning og finish', desc: 'Montere rygning', hours: 0.8, phase: 'afslutning', order: 2 },
{ name: 'Kvalitetskontrol', desc: 'Grundig kontrol af alle samlinger', hours: 0.5, phase: 'inspektion', order: 1 }
]
});
// 5. FLADT TAG
await createRoofShapePackage(conn, allMaterials, {
name: 'Fladt tag - Komplet renovering',
description: `Komplet renovering af fladt tag med tagpap eller membran.
🏠 FLADT TAG KARAKTERISTIKA:
• Minimal hældning (1-5 grader)
• Kræver vandtæt membran
• Moderne arkitektur
• Mulighed for tagterrasse
📋 INKLUDERER:
• Nedrivning af gammelt tagpap
• Kontrol af underlag
• Ny isolering
• Tagpap i flere lag ELLER membran
• Afvanding og render
• Tætning ved gennemføringer
⏱ TID: 7 timer per 10m²
💰 TIMEPRIS: 580 kr/time
✨ Perfekt til: Moderne bygninger, tilbygninger, garager`,
hours: 7.0,
timePerSqm: 0.7,
hourlyRate: 580,
notes: 'Fladt tag kræver korrekt fald og vandtætning. Kritisk detaljering.',
materials: [
{ searchTerms: ['Tagpap underlag'], quantity: 33, baseQty: 33, notes: 'Tagpap 3 lag' },
{ searchTerms: ['Tagisolering 200mm'], quantity: 10, baseQty: 10, notes: 'Isolering' },
{ searchTerms: ['Lægter 38x63'], quantity: 15, baseQty: 1.5, notes: 'Underlagskonstruktion' }
],
tasks: [
{ name: 'Nedrivning', desc: 'Fjerne gammelt tagpap', hours: 1.0, phase: 'forberedelse', order: 1 },
{ name: 'Underlagskontrol', desc: 'Kontrollere og reparere underlag', hours: 0.8, phase: 'hovedarbejde', order: 1 },
{ name: 'Isolering', desc: 'Lægge ny isolering', hours: 1.2, phase: 'hovedarbejde', order: 2 },
{ name: '1. lag tagpap', desc: 'Lægge første lag', hours: 1.2, phase: 'hovedarbejde', order: 3 },
{ name: '2. lag tagpap', desc: 'Lægge andet lag', hours: 1.2, phase: 'hovedarbejde', order: 4 },
{ name: '3. lag tagpap', desc: 'Lægge toplag', hours: 1.5, phase: 'hovedarbejde', order: 5 },
{ name: 'Afvanding og render', desc: 'Sikre korrekt afvanding', hours: 0.8, phase: 'afslutning', order: 1 },
{ name: 'Tætning', desc: 'Tætne gennemføringer', hours: 0.5, phase: 'afslutning', order: 2 },
{ name: 'Vandtest', desc: 'Teste vandtæthed', hours: 0.3, phase: 'inspektion', order: 1 }
]
});
// 6. PULTTAG
await createRoofShapePackage(conn, allMaterials, {
name: 'Pulttag - Komplet renovering',
description: `Komplet renovering af pulttag - moderne enkelt tagflade med hældning.
🏠 PULTTAG KARAKTERISTIKA:
• Én tagflade med hældning
• Moderne arkitektonisk udtryk
• Enkel konstruktion
• God til solceller
📋 INKLUDERER:
• Nedrivning af gammelt tag
• Spær og lægter
• Undertag
• Tagbeklædning
• Vindskeder top og bund
• Tagrende
⏱ TID: 5.5 timer per 10m²
💰 TIMEPRIS: 580 kr/time
✨ Perfekt til: Moderne boliger, carporte, tilbygninger`,
hours: 5.5,
timePerSqm: 0.55,
hourlyRate: 580,
notes: 'Pulttag er simpelt og hurtigt at montere. Moderne look.',
materials: [
{ searchTerms: ['B7 tagplader'], quantity: 11, baseQty: 11, notes: 'Tagbeklædning' },
{ searchTerms: ['Skruer til tagplader'], quantity: 160, baseQty: 16, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag'], quantity: 11, baseQty: 11, notes: 'Undertag' },
{ searchTerms: ['Lægter 38x63'], quantity: 20, baseQty: 2.0, notes: 'Lægter' },
{ searchTerms: ['Eternit vindskeder'], quantity: 10, baseQty: 1.0, notes: 'Vindskeder' }
],
tasks: [
{ name: 'Forberedelse', desc: 'Stillads og sikkerhed', hours: 0.4, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage gammelt tag', hours: 1.3, phase: 'hovedarbejde', order: 1 },
{ name: 'Lægter og undertag', desc: 'Montere lægter', hours: 1.3, phase: 'hovedarbejde', order: 2 },
{ name: 'Tagbeklædning', desc: 'Lægge tagplader', hours: 1.8, phase: 'hovedarbejde', order: 3 },
{ name: 'Vindskeder', desc: 'Montere vindskeder top/bund', hours: 0.8, phase: 'afslutning', order: 1 },
{ name: 'Kvalitetskontrol', desc: 'Slutkontrol', hours: 0.3, phase: 'inspektion', order: 1 }
]
});
// 7. MODFALDSTAG
await createRoofShapePackage(conn, allMaterials, {
name: 'Modfaldstag - Komplet renovering',
description: `Komplet renovering af modfaldstag - to tagflader med modsatrettede hældninger.
🏠 MODFALDSTAG KARAKTERISTIKA:
• To tagflader med modsat fald
• Dal i midten (kræver god afvanding)
• Moderne arkitektur
• Kompleks detaljering i dal
📋 INKLUDERER:
• Nedrivning af gammelt tag
• Spær til begge tagflader
• Lægter og undertag
• Tagbeklædning
• Dalinddækning (zink/bly)
• Vindskeder
⏱ TID: 8.5 timer per 10m²
💰 TIMEPRIS: 600 kr/time
✨ Perfekt til: Moderne arkitektur, spændende tagformer`,
hours: 8.5,
timePerSqm: 0.85,
hourlyRate: 600,
notes: 'Modfaldstag kræver nøje detaljering af dal. Kritisk vandafledning.',
materials: [
{ searchTerms: ['B7 tagplader'], quantity: 12, baseQty: 12, notes: 'Tagbeklædning' },
{ searchTerms: ['Skruer til tagplader'], quantity: 180, baseQty: 18, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag'], quantity: 13, baseQty: 13, notes: 'Ekstra til dal' },
{ searchTerms: ['Lægter 38x63'], quantity: 26, baseQty: 2.6, notes: 'Lægter' }
],
tasks: [
{ name: 'Forberedelse', desc: 'Stillads og planlægning', hours: 0.6, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage gammelt tag', hours: 1.8, phase: 'hovedarbejde', order: 1 },
{ name: 'Spær og lægter', desc: 'Montere til begge tagflader', hours: 2.0, phase: 'hovedarbejde', order: 2 },
{ name: 'Dalinddækning', desc: 'Montere tætning i dal (kritisk!)', hours: 1.5, phase: 'hovedarbejde', order: 3 },
{ name: 'Tagbeklædning', desc: 'Lægge plader på begge sider', hours: 2.2, phase: 'hovedarbejde', order: 4 },
{ name: 'Vindskeder', desc: 'Montere afslutninger', hours: 0.8, phase: 'afslutning', order: 1 },
{ name: 'Vandtest af dal', desc: 'Teste afvanding i dal', hours: 0.4, phase: 'inspektion', order: 1 }
]
});
// 8. MANSARDTAG
await createRoofShapePackage(conn, allMaterials, {
name: 'Mansardtag - Komplet renovering',
description: `Komplet renovering af mansardtag - klassisk tagform med knæk i tagfladen.
🏠 MANSARDTAG KARAKTERISTIKA:
• Stejl nederste del, fladere øverste del
• Giver ekstra tagetage
• Barok/historisk stil
• Kompleks konstruktion
📋 INKLUDERER:
• Nedrivning af gammelt tag
• Spærkonstruktion (to vinkler)
• Lægter på begge vinkler
• Undertag og tagbeklædning
• Knækafslutning
• Rygning og vindskeder
⏱ TID: 9.5 timer per 10m²
💰 TIMEPRIS: 600 kr/time
✨ Perfekt til: Historiske bygninger, villaer med tagetage`,
hours: 9.5,
timePerSqm: 0.95,
hourlyRate: 600,
notes: 'Mansardtag kræver specialiseret håndværk ved knækket. Tidskrævende.',
materials: [
{ searchTerms: ['B7 tagplader'], quantity: 13, baseQty: 13, notes: 'Tagbeklædning ekstra' },
{ searchTerms: ['Skruer til tagplader'], quantity: 190, baseQty: 19, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag'], quantity: 13, baseQty: 13, notes: 'Undertag' },
{ searchTerms: ['Lægter 38x63'], quantity: 28, baseQty: 2.8, notes: 'Ekstra lægter' },
{ searchTerms: ['Eternit rygningsten'], quantity: 8, baseQty: 0.8, notes: 'Rygning' }
],
tasks: [
{ name: 'Forberedelse', desc: 'Stillads til kompleks tagform', hours: 0.8, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage gammelt tag', hours: 2.0, phase: 'hovedarbejde', order: 1 },
{ name: 'Spærkontrol', desc: 'Kontrollere mansardkonstruktion', hours: 1.0, phase: 'hovedarbejde', order: 2 },
{ name: 'Lægter stejl del', desc: 'Montere lægter på stejl del', hours: 1.5, phase: 'hovedarbejde', order: 3 },
{ name: 'Lægter flad del', desc: 'Montere lægter på fladere del', hours: 1.0, phase: 'hovedarbejde', order: 4 },
{ name: 'Tagbeklædning', desc: 'Lægge plader på begge dele', hours: 2.5, phase: 'hovedarbejde', order: 5 },
{ name: 'Knækafslutning', desc: 'Tætne ved knækket', hours: 1.0, phase: 'afslutning', order: 1 },
{ name: 'Rygning', desc: 'Montere rygning', hours: 0.8, phase: 'afslutning', order: 2 },
{ name: 'Kvalitetskontrol', desc: 'Grundig kontrol', hours: 0.4, phase: 'inspektion', order: 1 }
]
});
// 9. TAG MED KVISTVINDUE
await createRoofShapePackage(conn, allMaterials, {
name: 'Tag med kvistvindue - Renovering',
description: `Renovering af tag med kvistvindue - kompleks tagform med udstikkende kvist.
🏠 TAG MED KVISTVINDUE:
• Hovedtag med integreret kvist
• Ekstra lys og plads på loft
• Kræver præcis inddækning
• Kompleks detaljering
📋 INKLUDERER:
• Nedrivning af tag og kvist
• Spær til hovedtag og kvist
• Lægter og undertag
• Tagbeklædning (hovedtag + kvist)
• Kvistinddækning (kritisk!)
• Kvistgavl og vinduer
⏱ TID: 9 timer per 10m²
💰 TIMEPRIS: 600 kr/time
✨ Perfekt til: Villaer med tagetage, lys på loftet`,
hours: 9.0,
timePerSqm: 0.9,
hourlyRate: 600,
notes: 'Kvistvindue er komplekst. Kritisk inddækning ved kvist-tilslutning.',
materials: [
{ searchTerms: ['B7 tagplader'], quantity: 12, baseQty: 12, notes: 'Hovedtag + kvist' },
{ searchTerms: ['Skruer til tagplader'], quantity: 180, baseQty: 18, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag'], quantity: 13, baseQty: 13, notes: 'Ekstra ved kvist' },
{ searchTerms: ['Lægter 38x63'], quantity: 26, baseQty: 2.6, notes: 'Hovedtag + kvist' },
{ searchTerms: ['Eternit vindskeder'], quantity: 8, baseQty: 0.8, notes: 'Kvistgavl' }
],
tasks: [
{ name: 'Forberedelse', desc: 'Stillads omkring kvist', hours: 0.7, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage hovedtag og kvist', hours: 2.0, phase: 'hovedarbejde', order: 1 },
{ name: 'Spær', desc: 'Kontrollere hovedspær og kvistkonstruktion', hours: 1.0, phase: 'hovedarbejde', order: 2 },
{ name: 'Lægter hovedtag', desc: 'Montere lægter på hovedtag', hours: 1.5, phase: 'hovedarbejde', order: 3 },
{ name: 'Lægter kvist', desc: 'Montere lægter på kvist', hours: 0.8, phase: 'hovedarbejde', order: 4 },
{ name: 'Kvistinddækning', desc: 'Kritisk tætning ved kvisttilslutning', hours: 1.5, phase: 'hovedarbejde', order: 5 },
{ name: 'Tagbeklædning', desc: 'Lægge plader på hovedtag og kvist', hours: 2.0, phase: 'hovedarbejde', order: 6 },
{ name: 'Kvistgavl', desc: 'Færdiggøre kvistgavl', hours: 0.8, phase: 'afslutning', order: 1 },
{ name: 'Kvalitetskontrol', desc: 'Fokus på kvisttætning', hours: 0.4, phase: 'inspektion', order: 1 }
]
});
// 10. M-FORMET TAG
await createRoofShapePackage(conn, allMaterials, {
name: 'M-formet tag - Komplet renovering',
description: `Komplet renovering af M-formet tag - moderne tagform med flere retninger.
🏠 M-FORMET TAG:
• Kompleks tagform med flere retninger
• To dale og tre toppunkter
• Moderne arkitektur
• Meget kompleks detaljering
📋 INKLUDERER:
• Nedrivning af kompleks tagform
• Spærkonstruktion (flere retninger)
• Lægter og undertag (mange hjørner)
• Tagbeklædning på alle flader
• Dalinddækninger (to dale!)
• Rygninger og afslutninger
⏱ TID: 11 timer per 10m²
💰 TIMEPRIS: 620 kr/time (højt specialiseret)
✨ Perfekt til: Moderne arkitektoniske projekter`,
hours: 11.0,
timePerSqm: 1.1,
hourlyRate: 620,
notes: 'M-formet tag er meget komplekst. Kræver erfaren tømrer. Mange kritiske detaljer.',
materials: [
{ searchTerms: ['B7 tagplader'], quantity: 14, baseQty: 14, notes: 'Flere tagflader' },
{ searchTerms: ['Skruer til tagplader'], quantity: 210, baseQty: 21, notes: 'Fastgørelse' },
{ searchTerms: ['Tagpap underlag'], quantity: 15, baseQty: 15, notes: 'Ekstra til dale' },
{ searchTerms: ['Lægter 38x63'], quantity: 32, baseQty: 3.2, notes: 'Mange hjørner' }
],
tasks: [
{ name: 'Forberedelse', desc: 'Omfattende stillads og planlægning', hours: 1.0, phase: 'forberedelse', order: 1 },
{ name: 'Nedrivning', desc: 'Nedtage kompleks tagform', hours: 2.5, phase: 'hovedarbejde', order: 1 },
{ name: 'Spær', desc: 'Kontrollere kompleks spærkonstruktion', hours: 1.2, phase: 'hovedarbejde', order: 2 },
{ name: 'Lægter', desc: 'Montere lægter på alle flader', hours: 2.5, phase: 'hovedarbejde', order: 3 },
{ name: 'Dalinddækninger', desc: 'Montere to dale (kritisk!)', hours: 1.8, phase: 'hovedarbejde', order: 4 },
{ name: 'Tagbeklædning', desc: 'Lægge plader på alle flader', hours: 2.8, phase: 'hovedarbejde', order: 5 },
{ name: 'Rygninger', desc: 'Montere rygninger', hours: 1.0, phase: 'afslutning', order: 1 },
{ name: 'Afslutninger', desc: 'Alle hjørner og samlinger', hours: 1.0, phase: 'afslutning', order: 2 },
{ name: 'Vandtest', desc: 'Grundig test af alle dale og samlinger', hours: 0.5, phase: 'inspektion', order: 1 }
]
});
console.log('\n✅ FÆRDIG! Alle 10 tagformer er oprettet\n');
// Vis oversigt
const [allRoofShapes] = await conn.execute(
'SELECT id, name, estimated_hours FROM material_packages WHERE name LIKE "%renovering%" AND is_active = 1 ORDER BY id DESC LIMIT 10'
);
console.log('📊 ALLE 10 TAGFORMER:\n');
allRoofShapes.reverse().forEach((p, i) => {
console.log(`${i + 1}. ${p.name} (ID ${p.id}, ${p.estimated_hours} timer/10m²)`);
});
await conn.end();
})();