| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- -- 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);
|