Files
tilbudgivern/migrations/create_tomrer_smart_packages_CORRECTED.sql
alexpolo1 4dbaf3e950 Add final version of TØMRER SMART PACKAGES and cleanup for v2
- 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.
2025-10-30 19:23:15 +00:00

145 lines
18 KiB
SQL

-- ═══════════════════════════════════════════════════════════════════════════
-- TØMRER SMART PACKAGES - FINAL VERSION
-- Oprettet: 2025-10-30
-- Matcher eksisterende database struktur 100%
-- ═══════════════════════════════════════════════════════════════════════════
USE tilbudgivern;
-- ═══════════════════════════════════════════════════════════════════════════
-- PAKKE 1: Tagrende med Konsoljern - Lindab
-- ═══════════════════════════════════════════════════════════════════════════
INSERT INTO material_packages (name, description, category, difficulty_level, hours, hourly_rate, installation_notes, is_template, area_based, auto_calculated, created_by)
VALUES ('Tagrende Lindab - Komplet', 'Komplet tagrende system med konsoljern. Auto-beregner materialer baseret på facadelængde: Tagrende (facadelængde/3 stk), Konsoljern (facadelængde/0.6 stk maks 60cm mellem), Samlestykker (antal tagrende-1).', 'Tagarbejde', 'mellem', 0.5, 580, 'BEREGNING: 5 timer per 10 meter facadelængde. Konsoljern maks 60cm afstand for optimal støtte.', 1, 0, 1, 'system');
SET @tagrende_pkg = LAST_INSERT_ID();
INSERT INTO package_materials (package_id, material_name, material_category, quantity, unit, unit_price, total_price, supplier, notes, geometry_multiplier, base_quantity, waste_factor) VALUES
(@tagrende_pkg, 'LINDAB RAINLINE TAGRENDE 125MM 3M [077424]', 'Tagrende', 1, 'stk', 245.00, 245.00, 'Lindab', 'Beregn: facadelængde / 3', 'facadelængde / 3', 1, 1.05),
(@tagrende_pkg, 'LINDAB RAINLINE ENDE BUND [107744]', 'Tagrende tilbehør', 4, 'stk', 45.00, 180.00, 'Lindab', 'Standard 4 stk (2 ender per side)', NULL, 4, 1.00),
(@tagrende_pkg, 'LINDAB RAINLINE SAMLESTYKKE [077419]', 'Tagrende tilbehør', 1, 'stk', 35.00, 35.00, 'Lindab', 'Beregn: antal tagrende - 1', '(facadelængde / 3) - 1', 1, 1.00),
(@tagrende_pkg, 'LINDAB RAINLINE KONSOLJERN [077407]', 'Tagrende tilbehør', 1, 'stk', 28.00, 28.00, 'Lindab', 'Beregn: facadelængde / 0.6', 'facadelængde / 0.6', 1, 1.00),
(@tagrende_pkg, 'LINDAB RAINLINE HJØRNE INDENVENDIG [077426]', 'Tagrende tilbehør', 1, 'stk', 125.00, 125.00, 'Lindab', 'Huskeliste - tilpas efter projekt', NULL, 1, 1.00),
(@tagrende_pkg, 'LINDAB RAINLINE HJØRNE UDEVENDIG [077431]', 'Tagrende tilbehør', 1, 'stk', 125.00, 125.00, 'Lindab', 'Huskeliste - tilpas efter projekt', NULL, 1, 1.00);
INSERT INTO smart_package_tasks (package_id, name, description, task_order, hours, time_unit, time_per_unit, is_custom) VALUES
(@tagrende_pkg, 'Opmåling og markering', 'Opmåling af facadelængde og markering. Præcis opmåling af facadelængde udføres - Konsoljerrns placering markeres med maks 60cm afstand - Fald mod nedløb planlægges (1-2mm per meter)', 1, 0.5, 'per_project', 0.5, 0),
(@tagrende_pkg, 'Montering af konsoljern', 'Montering af konsoljern med korrekt fald. Konsoljern monteres med korrekt fald (1-2mm per meter) mod nedløb - Første konsol ved højeste punkt - Snor spændes med fald - Alle konsoller monteres langs snor', 2, 2.0, 'per_meter', 0.15, 0),
(@tagrende_pkg, 'Samling og montering af tagrende', 'Montering af tagrende-sektioner med samlestykker. Tagrende-sektioner monteres med samlestykker - Tætning udføres ved alle samlinger - Tilslutning til nedløb sikres - Kontrol af fald med vand', 3, 2.0, 'per_meter', 0.2, 0),
(@tagrende_pkg, 'Montering af ende og hjørner', 'Afslutning med ender og hjørner. Endeender monteres i begge ender - Hjørner monteres efter behov - Tilslutning til nedløb færdiggøres - Alt affald bortkøres', 4, 0.5, 'per_project', 0.5, 0);
-- ═══════════════════════════════════════════════════════════════════════════
-- PAKKE 2: Nedløb - Komplet system
-- ═══════════════════════════════════════════════════════════════════════════
INSERT INTO material_packages (name, description, category, difficulty_level, hours, hourly_rate, installation_notes, is_template, area_based, auto_calculated, created_by)
VALUES ('Nedløb - Komplet system', 'Komplet nedløb med alle tilbehør. Auto-beregner per nedløb: Nedløbsrør 3m (antal), Rørholder (antal*2), Tudstykke (antal), Silikone (antal), Brøndkrave (antal), Bøjninger (antal*2).', 'Tagarbejde', 'mellem', 1.0, 580, 'BEREGNING: 1 time per nedløb. Bøjninger kan justeres efter specifikt behov på projektet.', 1, 0, 1, 'system');
SET @nedloeb_pkg = LAST_INSERT_ID();
INSERT INTO package_materials (package_id, material_name, material_category, quantity, unit, unit_price, total_price, supplier, notes, geometry_multiplier, base_quantity) VALUES
(@nedloeb_pkg, 'LINDAB NEDLØB 3M [077438]', 'Nedløb', 1, 'stk', 185.00, 185.00, 'Lindab', 'Per nedløb', 'antal_nedløb', 1),
(@nedloeb_pkg, 'LINDAB RØRHOLDER [184937]', 'Nedløb tilbehør', 2, 'stk', 22.00, 44.00, 'Lindab', '2 per nedløb', 'antal_nedløb * 2', 1),
(@nedloeb_pkg, 'LINDAB TUDSTYKKE [122214]', 'Nedløb tilbehør', 1, 'stk', 45.00, 45.00, 'Lindab', '1 per nedløb', 'antal_nedløb', 1),
(@nedloeb_pkg, 'SILIKONE TIL NEDLØB [050043]', 'Forsegling', 1, 'stk', 55.00, 55.00, 'Diverse', '1 per nedløb', 'antal_nedløb', 1),
(@nedloeb_pkg, 'BRØNDKRAVE [061637]', 'Nedløb tilbehør', 1, 'stk', 125.00, 125.00, 'Diverse', '1 per nedløb', 'antal_nedløb', 1),
(@nedloeb_pkg, 'LINDAB BØJNING 87 GRADER [076623]', 'Nedløb tilbehør', 2, 'stk', 48.00, 96.00, 'Lindab', '2 per nedløb (justérbar)', 'antal_nedløb * 2', 1);
INSERT INTO smart_package_tasks (package_id, name, description, task_order, hours, time_unit, time_per_unit, is_custom) VALUES
(@nedloeb_pkg, 'Opmåling og markering', 'Opmåling af nedløb fra tagrende til brønd. Nedløbsrør opmåles lodret fra tagrende til jordniveau - Rørholder placering markeres med maks 1.5m afstand - Tilslutning til brønd planlægges', 1, 0.25, 'per_piece', 0.25, 0),
(@nedloeb_pkg, 'Montering af rørholde', 'Fastgørelse af rørholde til facade. Rørholde fastgøres til facade med plugs og skruer - Afstand kontrolleres med vaterpas (maks 1.5m mellem holde) - Lodret linje sikres', 2, 0.25, 'per_piece', 0.25, 0),
(@nedloeb_pkg, 'Montering af tudstykke', 'Tilslutning fra tagrende til nedløb. Tudstykke monteres fra tagrende til nedløbsrør - Fastgøres med skruer - Tættes med silikone', 3, 0.15, 'per_piece', 0.15, 0),
(@nedloeb_pkg, 'Samling af nedløbsrør', 'Samling af nedløbsrør og bøjninger. Nedløbsrør samles i sektioner - Bøjninger monteres hvor nødvendigt - Fastgøres i alle rørholde - Sikres mod vind', 4, 0.25, 'per_piece', 0.25, 0),
(@nedloeb_pkg, 'Tilslutning til brønd', 'Afslutning ved jordniveau. Brøndkrave monteres - Nedløb tilsluttes til afløbssystem - Tættes korrekt - Alt affald bortkøres', 5, 0.10, 'per_piece', 0.10, 0);
-- ═══════════════════════════════════════════════════════════════════════════
-- PAKKE 3: Opretning af spær
-- ═══════════════════════════════════════════════════════════════════════════
INSERT INTO material_packages (name, description, category, difficulty_level, hours, hourly_rate, installation_notes, is_template, area_based, auto_calculated, created_by)
VALUES ('Opretning af spær', 'Opretning og forstærkning af tagspær. Auto-beregner: LBM spær ((huslængde+1) * husbredde), Skruer (LBM * 5 per løbende meter spær). Inkluderer alt nødvendigt værktøj.', 'Tagarbejde', 'svær', 0.1, 580, 'BEREGNING: 0.5 time per 5 meter spær. Værktøj inkluderet som standard i pakke.', 1, 0, 1, 'system');
SET @spaer_pkg = LAST_INSERT_ID();
INSERT INTO package_materials (package_id, material_name, material_category, quantity, unit, unit_price, total_price, supplier, notes, geometry_multiplier, base_quantity) VALUES
(@spaer_pkg, 'SPÆR TRÆ 45x200MM TRYKIMPRÆGNERET [146304720010450]', 'Tømmer', 1, 'lbm', 42.00, 42.00, 'Trælast', 'Beregn: (huslængde + 1) * husbredde', '(huslængde + 1) * husbredde', 1),
(@spaer_pkg, 'SPÅNSKRUER 5,0X100MM 200 STK [310615]', 'Beslag', 1, 'pakke', 125.00, 125.00, 'Bygma', 'Beregn: LBM * 5 / 200', 'LBM_spaer * 5 / 200', 1),
(@spaer_pkg, 'MURESNOR 100M [195408]', 'Værktøj', 1, 'stk', 45.00, 45.00, 'Bygma', 'Standard værktøj', NULL, 1),
(@spaer_pkg, 'BITS TX20 2-PACK [224770]', 'Værktøj', 1, 'stk', 35.00, 35.00, 'Bygma', 'Standard værktøj', NULL, 1),
(@spaer_pkg, 'SNORVATTERPAS 2-PACK [064736]', 'Værktøj', 2, 'stk', 125.00, 250.00, 'Bygma', 'Standard værktøj', NULL, 2),
(@spaer_pkg, 'RUNDSAVSKLINGE 190MM [182788]', 'Værktøj', 1, 'stk', 145.00, 145.00, 'Bygma', 'Standard værktøj', NULL, 1),
(@spaer_pkg, 'STIKSAVSKLINGER T-SKAFT 5-PACK [147761]', 'Værktøj', 1, 'stk', 85.00, 85.00, 'Bygma', 'Standard værktøj', NULL, 1);
INSERT INTO smart_package_tasks (package_id, name, description, task_order, hours, time_unit, time_per_unit, is_custom) VALUES
(@spaer_pkg, 'Inspektion af eksisterende spær', 'Grundig inspektion af spærkonstruktion. Spær inspiceres for rød, svamp og skader - Vurdering af konstruktionens tilstand - Dokumentation af fund - Planlægning af forstærkninger', 1, 1.0, 'per_project', 1.0, 0),
(@spaer_pkg, 'Markering og opmåling', 'Præcis markering af spærplacering. Muresnor spændes fra gavl til gavl - Snorvatterpas bruges til præcision - Placering af nye/forstærkende spær markeres - Afstande måles og dokumenteres', 2, 0.5, 'per_project', 0.5, 0),
(@spaer_pkg, 'Tilskæring af spær', 'Tilskæring til præcis længde og vinkel. Spær tilskæres med rundsav til præcis længde - Vinkelsnit udføres med stiksav - Præcision sikres med vinkelmåler - Alle snit kontrolleres', 3, 1.0, 'per_meter', 0.05, 0),
(@spaer_pkg, 'Montering og fastgørelse', 'Montering af spær med spånskruer. Spær løftes på plads og tilpasses - Fastgøres med spånskruer 5.0x100mm - Minimum 5 skruer per løbende meter - Vaterpas kontrol løbende under montering', 4, 2.0, 'per_meter', 0.15, 0),
(@spaer_pkg, 'Kontrol og justering', 'Endelig kvalitetskontrol. Alle spær kontrolleres med snorvatterpas - Justeringer foretages hvor nødvendigt - Dokumentation af udført arbejde - Område ryddes og efterlades rent', 5, 0.5, 'per_project', 0.5, 0);
-- ═══════════════════════════════════════════════════════════════════════════
-- PAKKE 4: Montering af B7 inkl. lægter
-- ═══════════════════════════════════════════════════════════════════════════
INSERT INTO material_packages (name, description, category, difficulty_level, hours, hourly_rate, installation_notes, is_template, area_based, time_per_sqm, auto_calculated, created_by)
VALUES ('Montering af B7 inkl. lægter', 'Komplet B7 tagdækning med lægter. Auto-beregner per m²: B7 plader (2.13 stk), Lægter (2.17 lbm - afstand 46cm), Tagskruer (4.25 stk), Ringsøm (15 stk), EPDM bånd (2.17 lbm).', 'Tagarbejde', 'svær', 0.5, 580, 'BEREGNING: 0.5 time per m². Lægteafstand præcis 46cm for optimal tætning. Kvalitetskontrol ved færdiggørelse.', 1, 1, 0.5, 1, 'system');
SET @b7_pkg = LAST_INSERT_ID();
INSERT INTO package_materials (package_id, material_name, material_category, quantity, unit, unit_price, total_price, supplier, notes, geometry_multiplier, base_quantity, waste_factor) VALUES
(@b7_pkg, 'ETERNIT B7 TAGPLADE 920X1320MM [147072]', 'Tagmateriale', 2.13, 'stk', 245.00, 521.85, 'Eternit', 'Per m² tagareal', 'tagareal * 2.13', 2.13, 1.05),
(@b7_pkg, 'LÆGTE 30X50MM TRYKIMP. 420CM [1632038073]', 'Tømmer', 2.17, 'lbm', 18.50, 40.15, 'Trælast', 'Lægteafstand 46cm - per m²', 'tagareal * 2.17', 2.17, 1.10),
(@b7_pkg, 'ETERNIT TAGSKRUER 400 STK [119229]', 'Beslag', 0.011, 'pakke', 385.00, 4.24, 'Eternit', '4.25 skruer per m²', 'tagareal * 4.25 / 400', 0.011, 1.00),
(@b7_pkg, 'RINGSØM 2.8X65MM 2880 STK [101933]', 'Beslag', 0.005, 'pakke', 145.00, 0.73, 'Bygma', '15 søm per m²', 'tagareal * 15 / 2880', 0.005, 1.00),
(@b7_pkg, 'EPDM TÆTNINGSBÅND 30M [029218]', 'Tætning', 0.072, 'rulle', 285.00, 20.52, 'Diverse', '2.17 meter per m²', 'tagareal * 2.17 / 30', 0.072, 1.00);
INSERT INTO smart_package_tasks (package_id, name, description, task_order, hours, time_unit, time_per_unit, is_custom) VALUES
(@b7_pkg, 'Forberedelse og sikring', 'Etablering af sikkerhed og forberedelse. Sikkerhedssele og tagstiger opsættes - Stillads etableres ved behov - Undertag kontrolleres for skader - Arbejdsområde forberedes og afgrænses', 1, 2.0, 'per_project', 2.0, 0),
(@b7_pkg, 'Montering af lægter', 'Montering af lægter med 46cm afstand. Lægter monteres med præcis 46cm afstand - Fastgøres med ringsøm (ca. 15 søm per m²) - Vaterpas kontrol løbende - Linjeret med snor', 2, 0.2, 'per_sqm', 0.2, 0),
(@b7_pkg, 'Udlægning af EPDM tætningsbånd', 'Anbringelse af tætningsbånd på lægter. EPDM tætningsbånd udlægges (2.17 meter per m²) - Anbringes på lægter før tagplader - Overlap sikres ved samlinger', 3, 0.05, 'per_sqm', 0.05, 0),
(@b7_pkg, 'Montering af B7 tagplader', 'Montering af eternit tagplader. B7 plader monteres fra tagfod og op mod ryg - 2.13 plader per m² - Fastgøres med tagskruer (4.25 per m²) - Korrekt overlap sikres (minimum 10cm)', 4, 0.2, 'per_sqm', 0.2, 0),
(@b7_pkg, 'Kontrol og efterjustering', 'Kvalitetskontrol af færdigt tag. Alle tagskruer kontrolleres og efterspændes - Tæthed ved overlaps tjekkes - Fald og vandafløb kontrolleres - Alt affald bortkøres', 5, 0.05, 'per_sqm', 0.05, 0);
-- ═══════════════════════════════════════════════════════════════════════════
-- PAKKE 5: Montering af rygning B7
-- ═══════════════════════════════════════════════════════════════════════════
INSERT INTO material_packages (name, description, category, difficulty_level, hours, hourly_rate, installation_notes, is_template, area_based, auto_calculated, created_by)
VALUES ('Montering af rygning B7', 'Rygning til B7 eternit tag. Auto-beregner per løbende meter: Rygning (1 lbm), Rygningselement (1 stk), Tagskruer (4 stk), EPDM bånd (0.4 lbm).', 'Tagarbejde', 'svær', 0.3, 580, 'BEREGNING: 0.3 time per løbende meter rygning. Vigtig tætning ved overlaps - minimum 10cm overlap mellem rygningsstykker.', 1, 0, 1, 'system');
SET @rygning_pkg = LAST_INSERT_ID();
INSERT INTO package_materials (package_id, material_name, material_category, quantity, unit, unit_price, total_price, supplier, notes, geometry_multiplier, base_quantity) VALUES
(@rygning_pkg, 'ETERNIT RYGNING B7 [057437]', 'Tagmateriale', 1, 'lbm', 125.00, 125.00, 'Eternit', 'Per løbende meter', 'rygningslængde', 1),
(@rygning_pkg, 'ETERNIT RYGNINGSELEMENT [038218]', 'Tagmateriale', 1, 'stk', 45.00, 45.00, 'Eternit', 'Per løbende meter', 'rygningslængde', 1),
(@rygning_pkg, 'ETERNIT TAGSKRUER 100 STK [144855]', 'Beslag', 0.04, 'pakke', 115.00, 4.60, 'Eternit', '4 skruer per meter', 'rygningslængde * 4 / 100', 0.04),
(@rygning_pkg, 'EPDM TÆTNINGSBÅND 30M [029218]', 'Tætning', 0.013, 'rulle', 285.00, 3.71, 'Diverse', '0.4 meter per løbende meter', 'rygningslængde * 0.4 / 30', 0.013);
INSERT INTO smart_package_tasks (package_id, name, description, task_order, hours, time_unit, time_per_unit, is_custom) VALUES
(@rygning_pkg, 'Forberedelse af rygningslinje', 'Kontrol af tagfladernes møde ved rygningen. Begge tagflader kontrolleres for korrekt møde - Høje punkter justeres - Snorvatterpas kontrol langs hele rygningen', 1, 0.5, 'per_project', 0.5, 0),
(@rygning_pkg, 'Montering af rygningselementer', 'Fastgørelse af rygningselementer. Rygningselementer monteres som underlag - Fastgøres med skruer til lægter - 1 element per løbende meter - Sikrer støtte for rygning', 2, 0.1, 'per_meter', 0.1, 0),
(@rygning_pkg, 'Udlægning af EPDM tætningsbånd', 'Anbringelse af tætningsbånd. EPDM tætningsbånd udlægges (0.4 meter per løbende meter) - Sikrer tæthed under rygning - Anbringes centreret på rygningslinje', 3, 0.05, 'per_meter', 0.05, 0),
(@rygning_pkg, 'Montering af rygning', 'Montering af rygningsstykker. Rygning monteres med minimum 10cm overlap - Fastgøres med 4 tagskruer per meter - Tæthed kontrolleres løbende - Afslutning ved gavle sikres', 4, 0.15, 'per_meter', 0.15, 0);
-- ═══════════════════════════════════════════════════════════════════════════
-- COMPLETION STATUS
-- ═══════════════════════════════════════════════════════════════════════════
SELECT '✅ SMART PACKAGES OPRETTET!' as STATUS;
SELECT name as 'PAKKE NAVN', category as KATEGORI, difficulty_level as SVÆRHEDSGRAD, hours as 'BASE TIMER'
FROM material_packages
WHERE created_by = 'system' AND DATE(created_at) = CURDATE()
ORDER BY id;
SELECT '📦 DETALJER' as INFO;
SELECT
mp.name as 'PAKKE',
COUNT(DISTINCT spt.id) as 'ANTAL OPGAVER',
COUNT(DISTINCT pm.id) as 'ANTAL MATERIALER'
FROM material_packages mp
LEFT JOIN smart_package_tasks spt ON mp.id = spt.package_id
LEFT JOIN package_materials pm ON pm.package_id = mp.id
WHERE mp.created_by = 'system' AND DATE(mp.created_at) = CURDATE()
GROUP BY mp.id;