-- Complete Database Migration Script -- This script combines all migration files for a complete database setup USE inventory_db; -- Items table with serial numbers and pictures CREATE TABLE IF NOT EXISTS items ( id INT(11) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT NULL, quantity INT(11) NOT NULL DEFAULT 0, price DECIMAL(10,2) NOT NULL DEFAULT 0.00, serial_number VARCHAR(100) NULL, picture VARCHAR(255) NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_name (name) ); -- Clients table with y-tunnus and hourly rates CREATE TABLE IF NOT EXISTS clients ( id INT(11) AUTO_INCREMENT PRIMARY KEY, y_tunnus VARCHAR(255) NULL, company_name VARCHAR(255) NULL, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, phone VARCHAR(20) NULL, address VARCHAR(255) NULL, city VARCHAR(100) NULL, state VARCHAR(100) NULL, postal_code VARCHAR(20) NULL, country VARCHAR(100) NULL, notes TEXT NULL, hour_price DECIMAL(10,2) DEFAULT 0.00, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_email (email), INDEX idx_name (last_name, first_name) ); -- Contact persons table for individual contacts CREATE TABLE IF NOT EXISTS contact_persons ( id INT(11) AUTO_INCREMENT PRIMARY KEY, client_id INT(11) NOT NULL, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, email VARCHAR(255) NULL, phone VARCHAR(20) NULL, position VARCHAR(100) NULL, is_primary BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE, INDEX idx_client_primary (client_id, is_primary), INDEX idx_name (last_name, first_name) ); -- Rental prices table for item pricing CREATE TABLE IF NOT EXISTS rental_prices ( id INT(11) AUTO_INCREMENT PRIMARY KEY, item_id INT(11) NOT NULL, client_id INT(11) NULL, start_date DATE NOT NULL, end_date DATE NOT NULL, daily_price DECIMAL(10,2) NOT NULL DEFAULT 0.00, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE CASCADE, FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE SET NULL, INDEX idx_item_dates (item_id, start_date, end_date) ); -- Attachments table for document management CREATE TABLE IF NOT EXISTS attachments ( id INT(11) AUTO_INCREMENT PRIMARY KEY, item_id INT(11) NOT NULL, filename VARCHAR(255) NOT NULL, original_name VARCHAR(255) NOT NULL, file_type ENUM('receipt', 'warranty', 'other') NOT NULL DEFAULT 'other', file_path VARCHAR(255) NOT NULL, file_size INT(11) NOT NULL, mime_type VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE CASCADE, INDEX idx_item_type (item_id, file_type) ); -- Users table for authentication CREATE TABLE IF NOT EXISTS users ( id INT(11) AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, role ENUM('admin', 'manager', 'user') DEFAULT 'user', is_active BOOLEAN DEFAULT TRUE, last_login TIMESTAMP NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_username (username), INDEX idx_email (email), INDEX idx_role (role), INDEX idx_active (is_active) ); -- Projects table for customer project management CREATE TABLE IF NOT EXISTS projects ( id INT(11) AUTO_INCREMENT PRIMARY KEY, customer_id INT(11) NOT NULL, project_name VARCHAR(255) NOT NULL, description TEXT NULL, status ENUM('planning', 'in_progress', 'completed', 'on_hold', 'cancelled') DEFAULT 'planning', start_date DATE NULL, end_date DATE NULL, budget DECIMAL(10,2) NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (customer_id) REFERENCES clients(id) ON DELETE CASCADE, INDEX idx_customer (customer_id), INDEX idx_status (status), INDEX idx_dates (start_date, end_date) ); -- Subprojects table for detailed project tracking CREATE TABLE IF NOT EXISTS subprojects ( id INT(11) AUTO_INCREMENT PRIMARY KEY, project_id INT(11) NOT NULL, subproject_name VARCHAR(255) NOT NULL, description TEXT NULL, status ENUM('planning', 'in_progress', 'completed', 'on_hold', 'cancelled') DEFAULT 'planning', start_date DATE NULL, end_date DATE NULL, budget DECIMAL(10,2) NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, INDEX idx_project (project_id), INDEX idx_status (status), INDEX idx_dates (start_date, end_date) ); -- Invoices table for billing management CREATE TABLE IF NOT EXISTS invoices ( id INT(11) AUTO_INCREMENT PRIMARY KEY, client_id INT(11) NOT NULL, invoice_number VARCHAR(50) NOT NULL UNIQUE, issue_date DATE NOT NULL, due_date DATE NOT NULL, status ENUM('draft', 'sent', 'paid', 'overdue', 'cancelled') DEFAULT 'draft', subtotal DECIMAL(10,2) NOT NULL DEFAULT 0.00, tax_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, total_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, notes TEXT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE RESTRICT, INDEX idx_client_status (client_id, status), INDEX idx_invoice_number (invoice_number), INDEX idx_due_date (due_date) ); -- Invoice items table for line item management CREATE TABLE IF NOT EXISTS invoice_items ( id INT(11) AUTO_INCREMENT PRIMARY KEY, invoice_id INT(11) NOT NULL, item_id INT(11) NOT NULL, description VARCHAR(255) NOT NULL, quantity DECIMAL(10,2) NOT NULL DEFAULT 1.00, unit_price DECIMAL(10,2) NOT NULL DEFAULT 0.00, line_total DECIMAL(10,2) NOT NULL DEFAULT 0.00, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (invoice_id) REFERENCES invoices(id) ON DELETE CASCADE, FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE RESTRICT, INDEX idx_invoice (invoice_id), INDEX idx_item (item_id) ); -- Payments table for transaction tracking CREATE TABLE IF NOT EXISTS payments ( id INT(11) AUTO_INCREMENT PRIMARY KEY, invoice_id INT(11) NULL, client_id INT(11) NOT NULL, payment_date DATE NOT NULL, amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, payment_method ENUM('cash', 'check', 'credit_card', 'bank_transfer', 'other') DEFAULT 'cash', reference_number VARCHAR(50) NULL, notes TEXT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (invoice_id) REFERENCES invoices(id) ON DELETE SET NULL, FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE RESTRICT, INDEX idx_invoice (invoice_id), INDEX idx_client (client_id), INDEX idx_payment_date (payment_date) ); -- Chart of accounts for bookkeeping CREATE TABLE IF NOT EXISTS chart_of_accounts ( id INT(11) AUTO_INCREMENT PRIMARY KEY, account_number VARCHAR(20) NOT NULL UNIQUE, account_name VARCHAR(255) NOT NULL, account_type ENUM('asset', 'liability', 'equity', 'revenue', 'expense') NOT NULL, parent_id INT(11) NULL, description TEXT NULL, opening_balance DECIMAL(10,2) DEFAULT 0.00, current_balance DECIMAL(10,2) DEFAULT 0.00, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (parent_id) REFERENCES chart_of_accounts(id) ON DELETE SET NULL, INDEX idx_account_type (account_type), INDEX idx_parent (parent_id), INDEX idx_account_number (account_number) ); -- Journal entries table for double-entry bookkeeping CREATE TABLE IF NOT EXISTS journal_entries ( id INT(11) AUTO_INCREMENT PRIMARY KEY, entry_number VARCHAR(50) NOT NULL UNIQUE, entry_date DATE NOT NULL, description TEXT NULL, reference_number VARCHAR(50) NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_entry_date (entry_date), INDEX idx_entry_number (entry_number) ); -- Account transactions table for detailed bookkeeping CREATE TABLE IF NOT EXISTS account_transactions ( id INT(11) AUTO_INCREMENT PRIMARY KEY, journal_entry_id INT(11) NOT NULL, account_id INT(11) NOT NULL, debit_amount DECIMAL(10,2) DEFAULT 0.00, credit_amount DECIMAL(10,2) DEFAULT 0.00, description TEXT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (journal_entry_id) REFERENCES journal_entries(id) ON DELETE CASCADE, FOREIGN KEY (account_id) REFERENCES chart_of_accounts(id) ON DELETE RESTRICT, INDEX idx_journal_entry (journal_entry_id), INDEX idx_account (account_id), INDEX idx_debit_credit (debit_amount, credit_amount) ); -- Insert sample data INSERT INTO items (name, description, quantity, price) VALUES ('Laptop', 'Dell XPS 15 laptop', 5, 1299.99), ('Mouse', 'Wireless optical mouse', 20, 25.50), ('Keyboard', 'Mechanical keyboard', 15, 89.99);