-- Database initialization script for Docker container -- This script will be executed when the MySQL container starts for the first time -- Create database if it doesn't exist CREATE DATABASE IF NOT EXISTS inventory_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- Use the database USE inventory_db; -- Create users table CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, phone VARCHAR(20), password VARCHAR(255) NOT NULL, role ENUM('admin', 'user') DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Create clients table CREATE TABLE IF NOT EXISTS clients ( id INT AUTO_INCREMENT PRIMARY KEY, y_tunnus VARCHAR(255), company_name VARCHAR(255), first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, phone VARCHAR(20), address VARCHAR(255), city VARCHAR(100), state VARCHAR(100), postal_code VARCHAR(20), country VARCHAR(100), notes TEXT, 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_last_name (last_name) ); -- Create contact_persons table CREATE TABLE IF NOT EXISTS contact_persons ( id INT AUTO_INCREMENT PRIMARY KEY, client_id INT NOT NULL, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, email VARCHAR(255), phone VARCHAR(20), position VARCHAR(100), department VARCHAR(100), is_primary BOOLEAN DEFAULT FALSE, notes TEXT, 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 ); -- Create projects table CREATE TABLE IF NOT EXISTS projects ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, status ENUM('planning', 'active', 'completed', 'on_hold', 'cancelled') DEFAULT 'planning', customer_id INT, start_date DATE, end_date DATE, budget DECIMAL(12,2), 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 SET NULL ); -- Create tasks table CREATE TABLE IF NOT EXISTS tasks ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, description TEXT, status ENUM('pending', 'in_progress', 'completed', 'on_hold', 'cancelled') DEFAULT 'pending', priority ENUM('low', 'medium', 'high', 'urgent') DEFAULT 'medium', project_id INT, assigned_to INT, due_date DATE, 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, FOREIGN KEY (assigned_to) REFERENCES users(id) ON DELETE SET NULL ); -- Create work_hours table CREATE TABLE IF NOT EXISTS work_hours ( id INT AUTO_INCREMENT PRIMARY KEY, task_id INT NOT NULL, user_id INT NOT NULL, date DATE NOT NULL, hours DECIMAL(5,2) NOT NULL, description TEXT, rate DECIMAL(10,2), total_amount DECIMAL(10,2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_task_date (task_id, date), INDEX idx_user_date (user_id, date) ); -- Create items table CREATE TABLE IF NOT EXISTS items ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, sku VARCHAR(100) UNIQUE, category VARCHAR(100), unit_price DECIMAL(10,2), quantity INT DEFAULT 0, min_quantity INT DEFAULT 0, location VARCHAR(100), supplier VARCHAR(255), purchase_price DECIMAL(10,2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Create accounting_entries table CREATE TABLE IF NOT EXISTS accounting_entries ( id INT AUTO_INCREMENT PRIMARY KEY, date DATE NOT NULL, description TEXT NOT NULL, account_number VARCHAR(20) NOT NULL, account_name VARCHAR(255) NOT NULL, category VARCHAR(100), debit DECIMAL(12,2) DEFAULT 0.00, credit DECIMAL(12,2) DEFAULT 0.00, balance DECIMAL(12,2) DEFAULT 0.00, entry_type ENUM('income', 'expense', 'opening_balance') DEFAULT 'expense', reference_number VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_date (date), INDEX idx_account (account_number), INDEX idx_category (category) ); -- Insert default admin user (password: admin123) INSERT IGNORE INTO users (first_name, last_name, email, password, role) VALUES ('Admin', 'User', 'admin@inventory.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin'); -- Insert sample data for testing INSERT IGNORE INTO clients (first_name, last_name, email, company_name, y_tunnus, hour_price) VALUES ('Weikka', 'Valavuo', 'weikka@wavium.fi', 'Wavium', '3464619-2', 10.00); INSERT IGNORE INTO projects (name, description, status, customer_id) VALUES ('Inventory', 'Inventory Management System', 'active', 1); INSERT IGNORE INTO tasks (title, description, status, priority, project_id, assigned_to, due_date) VALUES ('Working hours', 'Tuntien kirjaamismahdollisuus', 'in_progress', 'medium', 1, 1, '2026-04-26');