- Added Playwright tests for the Stark import system covering navigation, modal interactions, CSV uploads, and database verification. - Developed Selenium tests to validate the complete workflow of Stark material imports, including API checks and project creation. - Created a JavaScript test suite for Stark imports using Selenium WebDriver. - Introduced integration tests to verify database connections, table existence, and API endpoint availability. - Enhanced test scripts with detailed logging and error handling for better traceability. - Ensured cleanup of temporary files and resources after tests execution.
197 lines
6.5 KiB
SQL
197 lines
6.5 KiB
SQL
-- Customer Project System Database Schema
|
|
-- Opretter tabeller for det nye strukturerede tilbuds-flow
|
|
|
|
-- Kunde projekter
|
|
CREATE TABLE IF NOT EXISTS customer_projects (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
project_name VARCHAR(255) NOT NULL,
|
|
customer_name VARCHAR(255) NOT NULL,
|
|
customer_email VARCHAR(255),
|
|
customer_phone VARCHAR(50),
|
|
customer_address TEXT,
|
|
project_description TEXT,
|
|
project_status ENUM('draft', 'geometry_pending', 'labor_pending', 'materials_pending', 'calculation_ready', 'quote_generated', 'sent', 'accepted', 'rejected') DEFAULT 'draft',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
INDEX idx_status (project_status),
|
|
INDEX idx_customer (customer_name),
|
|
INDEX idx_created (created_at)
|
|
);
|
|
|
|
-- Tag geometri specifikt for tag arbejde
|
|
CREATE TABLE IF NOT EXISTS roof_geometry (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
project_id INT NOT NULL,
|
|
roof_type ENUM('fladt_tag', 'skraat_tag', 'mansard', 'komplekst') NOT NULL,
|
|
total_area DECIMAL(10,2) NOT NULL COMMENT 'Samlet areal i m²',
|
|
roof_pitch DECIMAL(5,2) COMMENT 'Taghældning i grader',
|
|
roof_height DECIMAL(8,2) COMMENT 'Taghøjde i meter',
|
|
complexity_factor DECIMAL(3,2) DEFAULT 1.0 COMMENT 'Kompleksitetsfaktor 1.0-2.0',
|
|
|
|
-- Detaljerede målinger
|
|
length_main DECIMAL(8,2) COMMENT 'Hovedlængde i meter',
|
|
width_main DECIMAL(8,2) COMMENT 'Hovedbredde i meter',
|
|
|
|
-- Specielle forhold
|
|
has_dormers BOOLEAN DEFAULT FALSE COMMENT 'Har kviste',
|
|
has_chimneys BOOLEAN DEFAULT FALSE COMMENT 'Har skorstene',
|
|
has_skylights BOOLEAN DEFAULT FALSE COMMENT 'Har ovenlys',
|
|
access_difficulty ENUM('let', 'medium', 'svær') DEFAULT 'medium',
|
|
|
|
-- Beregnet data
|
|
estimated_work_hours DECIMAL(8,2) COMMENT 'Estimerede arbejdstimer',
|
|
estimated_carpenters INT COMMENT 'Anbefalede antal tømrere',
|
|
|
|
notes TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
FOREIGN KEY (project_id) REFERENCES customer_projects(id) ON DELETE CASCADE,
|
|
INDEX idx_project (project_id),
|
|
INDEX idx_roof_type (roof_type)
|
|
);
|
|
|
|
-- Arbejdstimer og tømrere
|
|
CREATE TABLE IF NOT EXISTS project_labor (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
project_id INT NOT NULL,
|
|
carpenter_count INT NOT NULL DEFAULT 1,
|
|
estimated_hours_per_carpenter DECIMAL(8,2) NOT NULL,
|
|
total_work_hours DECIMAL(8,2) NOT NULL,
|
|
hourly_rate DECIMAL(8,2) NOT NULL DEFAULT 580.00 COMMENT 'Fast pris 580 kr/time',
|
|
total_labor_cost DECIMAL(12,2) NOT NULL,
|
|
|
|
-- Detaljer om arbejdsopgaver
|
|
work_breakdown JSON COMMENT 'Detaljeret opdeling af arbejdsopgaver',
|
|
|
|
notes TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
FOREIGN KEY (project_id) REFERENCES customer_projects(id) ON DELETE CASCADE,
|
|
INDEX idx_project (project_id)
|
|
);
|
|
|
|
-- Projekt materialer
|
|
CREATE TABLE IF NOT EXISTS project_materials (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
project_id INT NOT NULL,
|
|
material_name VARCHAR(255) NOT NULL,
|
|
material_category VARCHAR(100),
|
|
quantity DECIMAL(10,3) NOT NULL,
|
|
unit VARCHAR(50) NOT NULL,
|
|
unit_price DECIMAL(10,2) NOT NULL,
|
|
total_price DECIMAL(12,2) NOT NULL,
|
|
supplier VARCHAR(255),
|
|
material_source ENUM('manual', 'database', 'bygma_api') DEFAULT 'manual',
|
|
|
|
notes TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
FOREIGN KEY (project_id) REFERENCES customer_projects(id) ON DELETE CASCADE,
|
|
INDEX idx_project (project_id),
|
|
INDEX idx_category (material_category)
|
|
);
|
|
|
|
-- Projekt beregninger (råtilbud)
|
|
CREATE TABLE IF NOT EXISTS project_calculations (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
project_id INT NOT NULL,
|
|
|
|
-- Geometri opsummering
|
|
total_area DECIMAL(10,2),
|
|
complexity_factor DECIMAL(3,2),
|
|
|
|
-- Arbejdstimer opsummering
|
|
total_work_hours DECIMAL(8,2),
|
|
carpenter_count INT,
|
|
total_labor_cost DECIMAL(12,2),
|
|
|
|
-- Materialer opsummering
|
|
total_material_cost DECIMAL(12,2),
|
|
material_count INT,
|
|
|
|
-- Totaler
|
|
subtotal DECIMAL(12,2),
|
|
overhead_percentage DECIMAL(5,2) DEFAULT 15.00,
|
|
overhead_amount DECIMAL(12,2),
|
|
profit_percentage DECIMAL(5,2) DEFAULT 20.00,
|
|
profit_amount DECIMAL(12,2),
|
|
total_excl_vat DECIMAL(12,2),
|
|
vat_percentage DECIMAL(5,2) DEFAULT 25.00,
|
|
vat_amount DECIMAL(12,2),
|
|
total_incl_vat DECIMAL(12,2),
|
|
|
|
-- Metadata
|
|
calculation_data JSON COMMENT 'Detaljerede beregningsdata',
|
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
FOREIGN KEY (project_id) REFERENCES customer_projects(id) ON DELETE CASCADE,
|
|
INDEX idx_project (project_id)
|
|
);
|
|
|
|
-- Genererede tilbud
|
|
CREATE TABLE IF NOT EXISTS generated_quotes (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
project_id INT NOT NULL,
|
|
calculation_id INT NOT NULL,
|
|
|
|
quote_text TEXT NOT NULL COMMENT 'AI-genereret tilbudstekst',
|
|
quote_format ENUM('text', 'html', 'pdf') DEFAULT 'html',
|
|
|
|
-- AI usage tracking
|
|
ai_tokens_used INT,
|
|
ai_cost DECIMAL(8,4),
|
|
ai_model VARCHAR(50),
|
|
|
|
quote_status ENUM('draft', 'approved', 'sent', 'accepted', 'rejected') DEFAULT 'draft',
|
|
sent_at TIMESTAMP NULL,
|
|
valid_until DATE,
|
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
FOREIGN KEY (project_id) REFERENCES customer_projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (calculation_id) REFERENCES project_calculations(id) ON DELETE CASCADE,
|
|
INDEX idx_project (project_id),
|
|
INDEX idx_status (quote_status)
|
|
);
|
|
|
|
-- Bygma API cache (for version 2)
|
|
CREATE TABLE IF NOT EXISTS bygma_materials_cache (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
product_id VARCHAR(100) UNIQUE,
|
|
product_name VARCHAR(255),
|
|
category VARCHAR(100),
|
|
subcategory VARCHAR(100),
|
|
unit VARCHAR(50),
|
|
price DECIMAL(10,2),
|
|
stock_status VARCHAR(50),
|
|
supplier_info JSON,
|
|
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
INDEX idx_category (category),
|
|
INDEX idx_name (product_name),
|
|
INDEX idx_updated (last_updated)
|
|
);
|
|
|
|
-- Stark API cache (samme struktur som Bygma)
|
|
CREATE TABLE IF NOT EXISTS stark_materials_cache (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
product_id VARCHAR(100) UNIQUE,
|
|
product_name VARCHAR(255),
|
|
category VARCHAR(100),
|
|
subcategory VARCHAR(100),
|
|
unit VARCHAR(50),
|
|
price DECIMAL(10,2),
|
|
stock_status VARCHAR(50),
|
|
supplier_info JSON,
|
|
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
INDEX idx_category (category),
|
|
INDEX idx_name (product_name),
|
|
INDEX idx_updated (last_updated)
|
|
);
|