- 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.
571 lines
25 KiB
JavaScript
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();
|
|
})();
|