- Created a comprehensive SQL migration script for TØMRER SMART PACKAGES, including detailed material packages, tasks, and calculations for various roofing tasks. - Implemented a cleanup process to remove existing test packages related to 'Tagrende' and 'Nedløb' before inserting new data. - Structured the material packages to include specific materials, quantities, and pricing, ensuring accurate calculations for installation tasks. - Added detailed task descriptions and estimated hours for each package to enhance clarity and usability for users. - Included completion checks to verify the successful creation of packages, tasks, and materials.
716 lines
34 KiB
SQL
716 lines
34 KiB
SQL
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- TØMRER SMART PACKAGES - Komplet System
|
|
-- Oprettet: 2025-10-30
|
|
-- Formål: Professionelle smart packages med auto-beregning af materialer
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
USE tilbudgivern;
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 1: Tagrende med Konsoljern i stål (Lindab materialer)
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
area_based,
|
|
time_per_sqm,
|
|
auto_calculated,
|
|
created_by
|
|
) VALUES (
|
|
'Tagrende med Konsoljern - Lindab',
|
|
'Komplet tagrende system med konsoljern i stål. Auto-beregner materialer baseret på facadelængde.',
|
|
'Tagarbejde',
|
|
'mellem',
|
|
0.5, -- 5 timer per 10 meter (base rate)
|
|
580,
|
|
'BEREGNING: Facadelængde i meter bruges til auto-beregning. Tagrende: (facadelængde / 3) stk, Konsoljern: (facadelængde / 0.6) stk maks 60cm mellem, Samlestykker: Antal tagrende - 1, Tid: (facadelængde / 10) * 5 timer',
|
|
1,
|
|
0,
|
|
0,
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @tagrende_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til tagrende pakke
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@tagrende_pkg, '077424', 'LINDAB RAINLINE TAGRENDE 125MM R STÅLMETALLIC 3M', 'Tagrende', 1, 'stk', 245.00, 245.00, 'CEILING(facadelængde / 3)'),
|
|
(@tagrende_pkg, '107744', 'LINDAB RAINLINE ENDE BUND', 'Tagrende tilbehør', 4, 'stk', 45.00, 180.00, '4'),
|
|
(@tagrende_pkg, '077419', 'LINDAB RAINLINE SAMLESTYKKE', 'Tagrende tilbehør', 1, 'stk', 35.00, 35.00, 'CEILING(facadelængde / 3) - 1'),
|
|
(@tagrende_pkg, '077407', 'LINDAB RAINLINE KONSOLJERN', 'Tagrende tilbehør', 1, 'stk', 28.00, 28.00, 'CEILING(facadelængde / 0.6)'),
|
|
(@tagrende_pkg, '077426', 'LINDAB RAINLINE HJØRNE INDENVENDIG', 'Tagrende tilbehør', 1, 'stk', 125.00, 125.00, '1'),
|
|
(@tagrende_pkg, '077431', 'LINDAB RAINLINE HJØRNE UDEVENDIG', 'Tagrende tilbehør', 1, 'stk', 125.00, 125.00, '1');
|
|
|
|
-- Tasks for tagrende montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@tagrende_pkg, 'Opmåling og markering', 'Præcis opmåling af facadelængde og markering af konsoljerrns placering med maks 60cm afstand', 1, 0.5, 'per_project', 0.5, 0, '["opmåling", "præcision"]', '["målebånd", "vaterpas", "snor", "blyant"]'),
|
|
(@tagrende_pkg, 'Montering af konsoljern', 'Montering af konsoljern med korrekt fald (1-2mm per meter) mod nedløb', 2, 2.0, 'per_meter', 0.15, 0, '["tømrerarbejde", "højdearbejde"]', '["boremaskine", "skruemaskine", "vaterpas", "stige"]'),
|
|
(@tagrende_pkg, 'Samling og montering af tagrende', 'Montering af tagrende-sektioner med samlestykker og tætning', 3, 2.0, 'per_meter', 0.2, 0, '["tagarbejde", "præcision"]', '["gummihammer", "tætningskit", "saks"]'),
|
|
(@tagrende_pkg, 'Montering af ende og hjørner', 'Montering af endeender, hjørner og tilslutning til nedløb', 4, 0.5, 'per_project', 0.5, 0, '["tagarbejde"]', '["skruemaskine", "tætningskit"]');
|
|
|
|
-- Steps for hovedopgave: Montering af konsoljern
|
|
SET @task_konsol = (SELECT id FROM smart_package_tasks WHERE package_id = @tagrende_pkg AND task_order = 2);
|
|
|
|
INSERT INTO smart_package_steps (task_id, step_order, step_title, step_description, estimated_minutes, safety_notes, quality_check) VALUES
|
|
(@task_konsol, 1, 'Markér placering', 'Markér præcist hvor hvert konsoljern skal monteres - maks 60cm afstand', 15, 'Brug sikker stige eller stillads', 'Tjek at afstanden er ensartet'),
|
|
(@task_konsol, 2, 'Fastgør første konsol ved højeste punkt', 'Montér første konsol ved det højeste punkt (væk fra nedløb)', 10, 'Sørg for god fæste i underlag', 'Vaterpas tjek'),
|
|
(@task_konsol, 3, 'Spænd snor med fald', 'Spænd snor fra første konsol til sidste med 1-2mm fald per meter mod nedløb', 10, NULL, 'Tjek fald med vaterpas og snor'),
|
|
(@task_konsol, 4, 'Montér resterende konsoller', 'Montér alle konsoller langs snoren med præcis højde', 45, 'Brug sikkerhedsudstyr ved højdearbejde', 'Alle konsoller skal være i linje'),
|
|
(@task_konsol, 5, 'Kontrol af fald', 'Tjek at faldet er korrekt ved at hælde vand i højeste ende', 10, NULL, 'Vandet skal løbe jævnt mod nedløb');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 2: Nedløb
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Nedløb - Komplet system',
|
|
'Komplet nedløb inkl. alle tilbehør. Auto-beregner baseret på antal nedløb.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'mellem',
|
|
1.0, -- 1 time per nedløb
|
|
580,
|
|
'BEREGNING: Per nedløb beregnes automatisk:
|
|
- Nedløbsrør 3m: Antal nedløb
|
|
- Rørholder: Antal nedløb * 2
|
|
- Tudstykke: Antal nedløb * 1
|
|
- Silikone: Antal nedløb * 1
|
|
- Brøndkrave: Antal nedløb * 1
|
|
- Bøjninger: Antal nedløb * 2
|
|
- Tid: Antal nedløb * 1 time',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @nedloeb_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til nedløb pakke
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@nedloeb_pkg, '077438', 'LINDAB NEDLØB 3M', 'Nedløb', 1, 'stk', 185.00, 185.00, 'antal_nedløb'),
|
|
(@nedloeb_pkg, '184937', 'LINDAB RØRHOLDER', 'Nedløb tilbehør', 2, 'stk', 22.00, 44.00, 'antal_nedløb * 2'),
|
|
(@nedloeb_pkg, '122214', 'LINDAB TUDSTYKKE', 'Nedløb tilbehør', 1, 'stk', 45.00, 45.00, 'antal_nedløb'),
|
|
(@nedloeb_pkg, '050043', 'SILIKONE TIL NEDLØB', 'Forsegling', 1, 'stk', 55.00, 55.00, 'antal_nedløb'),
|
|
(@nedloeb_pkg, '061637', 'BRØNDKRAVE', 'Nedløb tilbehør', 1, 'stk', 125.00, 125.00, 'antal_nedløb'),
|
|
(@nedloeb_pkg, '076623', 'LINDAB BØJNING 87°', 'Nedløb tilbehør', 2, 'stk', 48.00, 96.00, 'antal_nedløb * 2');
|
|
|
|
-- Tasks for nedløb montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@nedloeb_pkg, 'Opmåling og markering', 'Opmål lodret fra tagrende til brønd og markér rørholder-placering', 1, 0.25, 'per_piece', 0.25, 0, '["opmåling"]', '["målebånd", "vaterpas", "blyant"]'),
|
|
(@nedloeb_pkg, 'Montering af rørholde', 'Fastgør rørholde til facade med korrekt afstand (maks 1.5m)', 2, 0.25, 'per_piece', 0.25, 0, '["tømrerarbejde"]', '["boremaskine", "plugs", "skruer", "vaterpas"]'),
|
|
(@nedloeb_pkg, 'Montering af tudstykke', 'Montér tudstykke fra tagrende til nedløb med tætning', 3, 0.15, 'per_piece', 0.15, 0, '["tagarbejde"]', '["skruer", "silikone", "stige"]'),
|
|
(@nedloeb_pkg, 'Samling af nedløbsrør', 'Saml nedløbsrør med bøjninger og fastgør i rørholde', 4, 0.25, 'per_piece', 0.25, 0, '["tagarbejde"]', '["gummihammer", "sav"]'),
|
|
(@nedloeb_pkg, 'Tilslutning til brønd', 'Montér brøndkrave og tilslut nedløb til afløbssystem', 5, 0.10, 'per_piece', 0.10, 0, '["vvs-arbejde"]', '["silikone", "brøndkrave"]');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 3: Opretning af spær
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Opretning af spær',
|
|
'Opretning og forstærkning af tagspær med nyt træ.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'svær',
|
|
0.1, -- 0.5 time per 5 meter
|
|
580,
|
|
'BEREGNING fra geometri:
|
|
- LBM spær: (huslængde + 1) * husbredde
|
|
- Spår: LBM spær / længde_per_spær
|
|
- Skruer: LBM spær * 5
|
|
- Tid: (LBM spær / 5) * 0.5 timer',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @spaer_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til spær pakke
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@spaer_pkg, '146304720010450', 'SPÆR TRÆ 45x200MM TRYKIMPRÆGNERET', 'Tømmer', 1, 'lbm', 42.00, 42.00, '(huslængde + 1) * husbredde'),
|
|
(@spaer_pkg, '310615', 'SPÅNSKRUER 5,0X100MM 200 STK', 'Beslag', 1, 'pakke', 125.00, 125.00, 'CEILING((huslængde + 1) * husbredde * 5 / 200)'),
|
|
(@spaer_pkg, '195408', 'MURESNOR 100M', 'Værktøj', 1, 'stk', 45.00, 45.00, '1'),
|
|
(@spaer_pkg, '224770', 'BITS TX20 2-PACK', 'Værktøj', 1, 'stk', 35.00, 35.00, '1'),
|
|
(@spaer_pkg, '064736', 'SNORVAT TERPAS 2-PACK', 'Værktøj', 2, 'stk', 125.00, 250.00, '2'),
|
|
(@spaer_pkg, '182788', 'RUNDSAVSKLINGE 190MM', 'Værktøj', 1, 'stk', 145.00, 145.00, '1'),
|
|
(@spaer_pkg, '147761', 'STIKSAVSKLINGER T-SKAFT 5-PACK', 'Værktøj', 1, 'stk', 85.00, 85.00, '1');
|
|
|
|
-- Tasks for spær opretning
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@spaer_pkg, 'Inspektion af eksisterende spær', 'Grundig inspektion for rød, svamp og skader på eksisterende spærkonstruktion', 1, 1.0, 'per_project', 1.0, 0, '["konstruktionsvurdering", "skadesvurdering"]', '["lygter", "målebånd", "vaterpas"]'),
|
|
(@spaer_pkg, 'Markering og opmåling', 'Spænd muresnor og marke eksakt placering af nye/forstærkende spær', 2, 0.5, 'per_project', 0.5, 0, '["præcision", "opmåling"]', '["muresnor", "snorvatterpas", "blyant"]'),
|
|
(@spaer_pkg, 'Tilskæring af spær', 'Tilskær spær til præcis længde med korrekte vinkler', 3, 1.0, 'per_meter', 0.05, 0, '["tømrerarbejde", "præcision"]', '["rundsav", "stiksav", "vinkelmåler"]'),
|
|
(@spaer_pkg, 'Montering og fastgørelse', 'Montér spær på plads og fastgør med spånskruer', 4, 2.0, 'per_meter', 0.15, 0, '["tømrerarbejde", "styrke"]', '["skruemaskine", "bits TX20", "vaterpas"]'),
|
|
(@spaer_pkg, 'Kontrol og justering', 'Endelig kontrol af alle spær med snor og vaterpas, juster efter behov', 5, 0.5, 'per_project', 0.5, 0, '["præcision", "kvalitetskontrol"]', '["snorvatterpas", "muresnor"]');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 4: Montering af B7 inkl. lægter
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Montering af B7 inkl. lægter',
|
|
'Komplet B7 tagdækning med lægter, skruer og tætning.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'svær',
|
|
0.5, -- 0.5 time per m²
|
|
580,
|
|
'BEREGNING baseret på tagareal:
|
|
- B7 plader: tagareal * 2.13
|
|
- Lægter: tagareal * 2.17 (lægteafstand 46cm)
|
|
- Tagskruer: tagareal * 4.25
|
|
- Ringsøm: tagareal * 15
|
|
- EPDM bånd: tagareal * 2.17
|
|
- Tid: tagareal * 0.5 timer',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @b7_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til B7 pakke
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@b7_pkg, '147072', 'ETERNIT B7 TAGPLADE 920X1320MM', 'Tagmateriale', 2.13, 'stk', 245.00, 521.85, 'tagareal * 2.13'),
|
|
(@b7_pkg, '1632038073', 'LÆGTE 30X50MM TRYKIMP. 420CM', 'Tømmer', 2.17, 'lbm', 18.50, 40.15, 'tagareal * 2.17'),
|
|
(@b7_pkg, '119229', 'ETERNIT TAGSKRUER 400 STK', 'Beslag', 0.011, 'pakke', 385.00, 4.24, 'CEILING(tagareal * 4.25 / 400)'),
|
|
(@b7_pkg, '101933', 'RINGSØM 2.8X65MM 2880 STK', 'Beslag', 0.005, 'pakke', 145.00, 0.73, 'CEILING(tagareal * 15 / 2880)'),
|
|
(@b7_pkg, '029218', 'EPDM TÆTNINGSBÅND 30M', 'Tætning', 0.072, 'rulle', 285.00, 20.52, 'CEILING(tagareal * 2.17 / 30)');
|
|
|
|
-- Tasks for B7 montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@b7_pkg, 'Forberedelse og sikring', 'Etablér tagsikring, kontrollér undertag og forbered arbejdsområde', 1, 2.0, 'per_project', 2.0, 0, '["højdearbejde", "sikkerhed"]', '["sikkerhedssele", "tagstiger", "stillads"]'),
|
|
(@b7_pkg, 'Montering af lægter', 'Montér lægter med præcis 46cm afstand, fastgør med ringsøm', 2, 0.2, 'per_sqm', 0.2, 0, '["tømrerarbejde", "præcision"]', '["hammer", "målebånd", "snor", "vaterpas"]'),
|
|
(@b7_pkg, 'Udlægning af EPDM tætningsbånd', 'Anbring EPDM tætningsbånd på lægter før plademontering', 3, 0.05, 'per_sqm', 0.05, 0, '["tagdækning"]', '["saks", "målebånd"]'),
|
|
(@b7_pkg, 'Montering af B7 tagplader', 'Montér B7 plader fra bund og op, sørg for korrekt overlap', 4, 0.2, 'per_sqm', 0.2, 0, '["tagdækning", "præcision"]', '["skruemaskine", "bits", "målebånd", "vinkelsliber"]'),
|
|
(@b7_pkg, 'Kontrol og efterjustering', 'Kontrollér alle skruer er spændt, tjek tæthed og justér efter behov', 5, 0.05, 'per_sqm', 0.05, 0, '["kvalitetskontrol"]', '["skruemaskine", "vaterpas"]');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 5: Montering af rygning B7
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Montering af rygning B7',
|
|
'Rygning til B7 tag inkl. rygningselementer og tætning.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'svær',
|
|
0.3, -- 0.3 time per løbende meter
|
|
580,
|
|
'BEREGNING baseret på rygningslængde:
|
|
- Rygning: løbende_meter * 1
|
|
- Rygningselement: løbende_meter * 1
|
|
- Tagskruer: løbende_meter * 4
|
|
- EPDM bånd: løbende_meter * 0.4',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @rygning_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til rygning pakke
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@rygning_pkg, '057437', 'ETERNIT RYGNING B7', 'Tagmateriale', 1, 'lbm', 125.00, 125.00, 'rygningslængde'),
|
|
(@rygning_pkg, '038218', 'ETERNIT RYGNINGSELEMENT', 'Tagmateriale', 1, 'stk', 45.00, 45.00, 'rygningslængde'),
|
|
(@rygning_pkg, '144855', 'ETERNIT TAGSKRUER 100 STK', 'Beslag', 0.04, 'pakke', 115.00, 4.60, 'CEILING(rygningslængde * 4 / 100)'),
|
|
(@rygning_pkg, '029218', 'EPDM TÆTNINGSBÅND 30M', 'Tætning', 0.013, 'rulle', 285.00, 3.71, 'CEILING(rygningslængde * 0.4 / 30)');
|
|
|
|
-- Tasks for rygning montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@rygning_pkg, 'Forberedelse af rygningslinje', 'Kontrollér at begge tagflader mødes korrekt ved rygningen', 1, 0.5, 'per_project', 0.5, 0, '["tagdækning"]', '["vaterpas", "snor"]'),
|
|
(@rygning_pkg, 'Montering af rygningselementer', 'Fastgør rygningselementer som underlag for rygning', 2, 0.1, 'per_meter', 0.1, 0, '["tagdækning"]', '["skruemaskine", "bits"]'),
|
|
(@rygning_pkg, 'Udlægning af EPDM tætningsbånd', 'Anbring EPDM bånd langs rygningslinjen før rygning monteres', 3, 0.05, 'per_meter', 0.05, 0, '["tagdækning"]', '["saks"]'),
|
|
(@rygning_pkg, 'Montering af rygning', 'Montér rygningsstykker med korrekt overlap og fastgør med tagskruer', 4, 0.15, 'per_meter', 0.15, 0, '["tagdækning", "højdearbejde"]', '["skruemaskine", "vinkelsliber"]');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 6: Montering af taghætte - B7
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Montering af taghætte - B7',
|
|
'Taghætte til ventilation gennem B7 tag.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'mellem',
|
|
1.5,
|
|
580,
|
|
'Standard montering af 1 taghætte. Inkluderer udskæring i tagplade og tætning.',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @taghaette_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til taghætte pakke
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@taghaette_pkg, '126813', 'TAGHÆTTE TIL ETERNIT', 'Ventilation', 1, 'stk', 285.00, 285.00, '1'),
|
|
(@taghaette_pkg, '050043', 'SILIKONE TIL TÆTNING', 'Tætning', 1, 'stk', 55.00, 55.00, '1');
|
|
|
|
-- Tasks for taghætte montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@taghaette_pkg, 'Markering af placering', 'Markér optimal placering af taghætte på tagfladen', 1, 0.25, 'per_piece', 0.25, 0, '["tagdækning"]', '["målebånd", "blyant"]'),
|
|
(@taghaette_pkg, 'Udskæring i tagplade', 'Lav præcis udskæring i B7 tagplade til taghætte', 2, 0.5, 'per_piece', 0.5, 0, '["tagdækning"]', '["vinkelsliber", "jern-skæreklinge", "sikkerhedsudstyr"]'),
|
|
(@taghaette_pkg, 'Montering og tætning', 'Montér taghætte og tæt omhyggeligt med silikone', 3, 0.5, 'per_piece', 0.5, 0, '["tagdækning"]', '["skruer', 'silikone', 'fugepistol"]'),
|
|
(@taghaette_pkg, 'Funktionstest', 'Tjek at taghætten er tæt og fungerer korrekt', 4, 0.25, 'per_piece', 0.25, 0, '["kvalitetskontrol"]', '["vandslange"]');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 7: Nedrivning af Betontegl
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Nedrivning af betontegl',
|
|
'Nedrivning og bortskaffelse af eksisterende betontegl inkl. lægter.',
|
|
'Nedrivning',
|
|
'tag',
|
|
'mellem',
|
|
0.3, -- 0.3 time per m²
|
|
580,
|
|
'BEREGNING baseret på tagareal:
|
|
- Container: Automatisk beregnet baseret på volumen
|
|
- Tid: tagareal * 0.3 timer
|
|
|
|
VIGTIGT: Farligt affald skal håndteres særskilt hvis tagsten indeholder asbest (testes først).',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @nedrivning_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til nedrivning (primært container)
|
|
INSERT INTO package_materials (package_id, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@nedrivning_pkg, 'CONTAINER 10M³ - TAGAFFALD', 'Affaldshåndtering', 1, 'stk', 2500.00, 2500.00, 'CEILING(tagareal * 0.08)'),
|
|
(@nedrivning_pkg, 'Big BAG TIL SMÅAFFALD', 'Affaldshåndtering', 3, 'stk', 85.00, 255.00, '3');
|
|
|
|
-- Tasks for nedrivning
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@nedrivning_pkg, 'Sikring af arbejdsområde', 'Etablér sikkerhedsforanstaltninger, stillads og afdækning af omgivelser', 1, 2.0, 'per_project', 2.0, 0, '["højdearbejde", "sikkerhed"]', '["stillads", 'presenninger', 'afspærring']'),
|
|
(@nedrivning_pkg, 'Fjernelse af rygning', 'Forsigtigt nedtagning af rygningssten', 2, 0.5, 'per_project', 0.5, 0, '["nedrivning", 'tagarbejde"]', '["hammer', 'brechstang', 'stige"]'),
|
|
(@nedrivning_pkg, 'Nedtagning af tagsten', 'Systematisk nedtagning af betontagsten fra top til bund', 3, 0.2, 'per_sqm', 0.2, 0, '["nedrivning", 'højdearbejde"]', '["hammer', 'brechstang']'),
|
|
(@nedrivning_pkg, 'Fjernelse af lægter', 'Nedtagning af lægter og søm', 4, 0.08, 'per_sqm', 0.08, 0, '["nedrivning', 'tømrerarbejde"]', '["klo-hammer', 'brechstang', 'sav"]'),
|
|
(@nedrivning_pkg, 'Bortskaffelse og oprydning', 'Fyldning af container, sortering af affald og oprydning', 5, 0.02, 'per_sqm', 0.02, 0, '["oprydning"]', '["skovl', 'fejemaskine']');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 8: Montering af fast undertag
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Montering af fast undertag',
|
|
'Diffusionsåben undertagspap som undertag til tagdækning.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'mellem',
|
|
0.15, -- 0.15 time per m²
|
|
580,
|
|
'BEREGNING baseret på tagareal:
|
|
- Undertagspap: tagareal * 1.1 (10% spild)
|
|
- Hæfteklammer: tagareal * 25
|
|
- Tid: tagareal * 0.15 timer',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @undertag_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til undertag
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@undertag_pkg, 'UTP001', 'UNDERTAGSPAP DIFFUSIONSÅBEN 75M²', 'Tagmateriale', 0.015, 'rulle', 1250.00, 18.75, 'CEILING(tagareal * 1.1 / 75)'),
|
|
(@undertag_pkg, 'HKL001', 'HÆFTEKLAMMER 10MM 5000 STK', 'Beslag', 0.005, 'pakke', 45.00, 0.23, 'CEILING(tagareal * 25 / 5000)');
|
|
|
|
-- Tasks for undertag montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@undertag_pkg, 'Kontrol af spærkonstruktion', 'Kontrollér at spær er rene og klar til undertagspap', 1, 0.5, 'per_project', 0.5, 0, '["tagarbejde"]', '["børste", 'kost']'),
|
|
(@undertag_pkg, 'Udlægning af undertag', 'Udrul undertagspap vandret fra bund med 10cm overlap', 2, 0.10, 'per_sqm', 0.10, 0, '["tagarbejde"]', '["saks", 'målebånd']'),
|
|
(@undertag_pkg, 'Fastgørelse', 'Fastgør undertagspap med hæfteklammer til spær', 3, 0.05, 'per_sqm', 0.05, 0, '["tagarbejde"]', '["hæftepistol", 'stige']');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 9: Montering af vindskeder
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Montering af vindskeder',
|
|
'Vindskeder monteres langs gavlene for at beskytte tagkanten.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'mellem',
|
|
0.25, -- 0.25 time per løbende meter
|
|
580,
|
|
'BEREGNING baseret på gavllængde:
|
|
- Vindskeder: gavllængde
|
|
- Beslag: gavllængde * 2
|
|
- Skruer: gavllængde * 5',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @vindskeder_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til vindskeder
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@vindskeder_pkg, 'VIN001', 'VINDSKED 150X25MM 4.8M', 'Tømmer', 0.21, 'stk', 145.00, 30.42, 'CEILING(gavllængde / 4.8)'),
|
|
(@vindskeder_pkg, 'BES001', 'VINDSKEDERBESLAG ZINK', 'Beslag', 2, 'stk', 28.00, 56.00, 'gavllængde * 2'),
|
|
(@vindskeder_pkg, '310615', 'SPÅNSKRUER 5,0X100MM', 'Beslag', 0.025, 'pakke', 125.00, 3.13, 'CEILING(gavllængde * 5 / 200)');
|
|
|
|
-- Tasks for vindskeder montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@vindskeder_pkg, 'Opmåling og tilskæring', 'Opmål præcis længde og tilskær vindskeder med korrekte vinkler', 1, 0.10, 'per_meter', 0.10, 0, '["tømrerarbejde"]', '["målebånd", 'geringssav', 'vinkelmåler']'),
|
|
(@vindskeder_pkg, 'Montering af beslag', 'Fastgør vindskederbeslag til gavlspær med korrekt afstand', 2, 0.08, 'per_meter', 0.08, 0, '["tømrerarbejde"]', '["skruemaskine", 'vaterpas']'),
|
|
(@vindskeder_pkg, 'Montering af vindskeder', 'Montér vindskeder i beslag og fastgør sikkert', 3, 0.07, 'per_meter', 0.07, 0, '["tømrerarbejde"]', '["hammer", 'skruer']');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 10: Montering af udhængsbrædder
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Montering af udhængsbrædder',
|
|
'Udhængsbrædder monteres under tagkanten langs facade.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'mellem',
|
|
0.20, -- 0.20 time per løbende meter
|
|
580,
|
|
'BEREGNING baseret på facadelængde:
|
|
- Udhængsbrædder: facadelængde
|
|
- Beslag: facadelængde * 1.5
|
|
- Skruer: facadelængde * 4',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @udhaeng_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til udhængsbrædder
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@udhaeng_pkg, 'UDH001', 'UDHÆNGSBRÆT 200X25MM 4.8M', 'Tømmer', 0.21, 'stk', 165.00, 34.65, 'CEILING(facadelængde / 4.8)'),
|
|
(@udhaeng_pkg, 'BES002', 'UDHÆNGSBESLAG', 'Beslag', 1.5, 'stk', 32.00, 48.00, 'facadelængde * 1.5'),
|
|
(@udhaeng_pkg, '310615', 'SPÅNSKRUER 5,0X80MM', 'Beslag', 0.02, 'pakke', 115.00, 2.30, 'CEILING(facadelængde * 4 / 200)');
|
|
|
|
-- Tasks for udhængsbrædder montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@udhaeng_pkg, 'Montering af beslag', 'Fastgør udhængsbeslag til tagkonstruktion', 1, 0.08, 'per_meter', 0.08, 0, '["tømrerarbejde"]', '["skruemaskine", 'vaterpas']'),
|
|
(@udhaeng_pkg, 'Tilskæring og montering', 'Tilskær udhængsbrædder og montér i beslag', 2, 0.10, 'per_meter', 0.10, 0, '["tømrerarbejde"]', '["geringssav", 'skruemaskine']'),
|
|
(@udhaeng_pkg, 'Finish og maling', 'Spartling, slibning og grundmaling af udhængsbrædder', 3, 0.02, 'per_meter', 0.02, 0, '["malerarbejde"]', '["spartelmasse", 'pensel', 'grundmaling']');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- PAKKE 11: Montering af sternbrædder
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
INSERT INTO material_packages (
|
|
name,
|
|
description,
|
|
category,
|
|
package_type,
|
|
difficulty_level,
|
|
estimated_hours,
|
|
hourly_rate,
|
|
installation_notes,
|
|
is_template,
|
|
created_by
|
|
) VALUES (
|
|
'Montering af sternbrædder',
|
|
'Sternbrædder monteres lodret på gavlene.',
|
|
'Tagarbejde',
|
|
'tag',
|
|
'mellem',
|
|
0.30, -- 0.30 time per løbende meter
|
|
580,
|
|
'BEREGNING baseret på gavlhøjde:
|
|
- Sternbrædder: gavlhøjde * antal_gavle
|
|
- Beslag: gavlhøjde * antal_gavle * 2
|
|
- Skruer: gavlhøjde * antal_gavle * 6',
|
|
1,
|
|
'system'
|
|
);
|
|
|
|
SET @stern_pkg = LAST_INSERT_ID();
|
|
|
|
-- Materialer til sternbrædder
|
|
INSERT INTO package_materials (package_id, bygma_varenr, material_name, material_category, quantity, unit, unit_price, total_price, calculation_formula) VALUES
|
|
(@stern_pkg, 'STR001', 'STERNBRÆT 200X25MM 4.8M', 'Tømmer', 0.21, 'stk', 175.00, 36.75, 'CEILING(gavlhøjde * antal_gavle / 4.8)'),
|
|
(@stern_pkg, 'BES003', 'STERNBESLAG', 'Beslag', 2, 'stk', 35.00, 70.00, 'gavlhøjde * antal_gavle * 2'),
|
|
(@stern_pkg, '310615', 'SPÅNSKRUER 5,0X100MM', 'Beslag', 0.03, 'pakke', 125.00, 3.75, 'CEILING(gavlhøjde * antal_gavle * 6 / 200)');
|
|
|
|
-- Tasks for sternbrædder montering
|
|
INSERT INTO smart_package_tasks (
|
|
package_id,
|
|
task_name,
|
|
task_description,
|
|
task_order,
|
|
estimated_hours,
|
|
time_unit,
|
|
time_per_unit,
|
|
is_custom,
|
|
required_skills,
|
|
required_tools
|
|
) VALUES
|
|
(@stern_pkg, 'Opmåling og markering', 'Opmål præcis gavlhøjde og markér placering', 1, 0.10, 'per_meter', 0.10, 0, '["tømrerarbejde"]', '["målebånd", 'vaterpas', 'snor']'),
|
|
(@stern_pkg, 'Montering af beslag', 'Fastgør sternbeslag til gavlkonstruktion', 2, 0.10, 'per_meter', 0.10, 0, '["tømrerarbejde"]', '["boremaskine", 'skruemaskine']'),
|
|
(@stern_pkg, 'Tilskæring og montering', 'Tilskær sternbrædder med korrekte vinkler og montér', 3, 0.10, 'per_meter', 0.10, 0, '["tømrerarbejde"]', '["geringssav", 'vinkelmåler', 'skruemaskine']');
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- VIEWS OG HJÆLPEFUNKTIONER
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
-- View til nem adgang til pakker med materialeberegninger
|
|
CREATE OR REPLACE VIEW v_smart_packages_with_calculations AS
|
|
SELECT
|
|
mp.id as package_id,
|
|
mp.name as package_name,
|
|
mp.description,
|
|
mp.category,
|
|
mp.package_type,
|
|
mp.difficulty_level,
|
|
mp.estimated_hours as base_hours,
|
|
mp.hourly_rate,
|
|
mp.installation_notes,
|
|
COUNT(DISTINCT spt.id) as task_count,
|
|
COUNT(DISTINCT pm.id) as material_count,
|
|
SUM(pm.total_price) as total_material_cost,
|
|
mp.created_at,
|
|
mp.updated_at
|
|
FROM material_packages mp
|
|
LEFT JOIN smart_package_tasks spt ON mp.id = spt.package_id
|
|
LEFT JOIN package_materials pm ON mp.id = pm.package_id
|
|
WHERE mp.is_template = 1
|
|
GROUP BY mp.id;
|
|
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
-- COMPLETION MESSAGE
|
|
-- ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
SELECT '✅ SMART PACKAGES OPRETTET' as status,
|
|
COUNT(*) as antal_pakker
|
|
FROM material_packages
|
|
WHERE is_template = 1
|
|
AND created_by = 'system'
|
|
AND DATE(created_at) = CURDATE();
|
|
|
|
SELECT '📦 PAKKE OVERSIGT' as info;
|
|
SELECT
|
|
name as pakke_navn,
|
|
category,
|
|
difficulty_level as sværhedsgrad,
|
|
estimated_hours as timer_base,
|
|
(SELECT COUNT(*) FROM smart_package_tasks spt WHERE spt.package_id = mp.id) as antal_opgaver,
|
|
(SELECT COUNT(*) FROM package_materials pm WHERE pm.package_id = mp.id) as antal_materialer
|
|
FROM material_packages mp
|
|
WHERE is_template = 1
|
|
AND created_by = 'system'
|
|
AND DATE(created_at) = CURDATE()
|
|
ORDER BY mp.id;
|
|
|