svalavuo пре 5 часа
родитељ
комит
8368a45366
3 измењених фајлова са 492 додато и 122 уклоњено
  1. 492 108
      database/init.sql
  2. 0 6
      docker-compose-with-services.yml
  3. 0 8
      docker-compose.yml

+ 492 - 108
database/init.sql

@@ -1,159 +1,543 @@
--- Database initialization script for Docker container
--- This script will be executed when the MySQL container starts for the first time
+CREATE DATABASE IF NOT EXISTS inventory_db;
 
--- 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',
+CREATE TABLE IF NOT EXISTS items (
+    id INT(11) AUTO_INCREMENT PRIMARY KEY,
+    name VARCHAR(255) NOT NULL,
+    description TEXT,
+    serial_number VARCHAR(100) NULL,
+    picture VARCHAR(255) NULL,
+    quantity INT(11) NOT NULL DEFAULT 0,
+    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
 );
 
--- Create clients table
+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)
+);
+
+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,
+    FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE CASCADE,
+    INDEX idx_item_type (item_id, file_type)
+);
+
 CREATE TABLE IF NOT EXISTS clients (
-    id INT AUTO_INCREMENT PRIMARY KEY,
-    y_tunnus VARCHAR(255),
-    company_name VARCHAR(255),
+    id INT(11) AUTO_INCREMENT PRIMARY KEY,
+    company_name VARCHAR(255) NULL,
+    y_tunnus VARCHAR(255) NULL,
     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,
+    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,
     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-    INDEX idx_last_name (last_name)
+    INDEX idx_email (email),
+    INDEX idx_name (last_name, first_name),
+    INDEX idx_y_tunnus (y_tunnus)
 );
 
--- Create contact_persons table
 CREATE TABLE IF NOT EXISTS contact_persons (
-    id INT AUTO_INCREMENT PRIMARY KEY,
-    client_id INT NOT NULL,
+    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),
-    phone VARCHAR(20),
-    position VARCHAR(100),
-    department VARCHAR(100),
+    email VARCHAR(255) NULL,
+    phone VARCHAR(20) NULL,
+    position VARCHAR(100) NULL,
     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
+    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)
+);
+
+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)
+);
+
+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)
+);
+
+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)
+);
+
+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)
+);
+
+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)
+);
+
+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)
+);
+
+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)
 );
 
--- 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),
+    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 SET NULL
+    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)
 );
 
--- 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,
+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,
-    FOREIGN KEY (assigned_to) REFERENCES users(id) ON DELETE SET NULL
+    INDEX idx_project (project_id),
+    INDEX idx_status (status),
+    INDEX idx_dates (start_date, end_date)
 );
 
--- Create work_hours table
-CREATE TABLE IF NOT EXISTS work_hours (
+-- Accounting tables
+CREATE TABLE IF NOT EXISTS accounting_entries (
     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),
+    entry_date DATE NOT NULL,
+    description TEXT NOT NULL,
+    entry_type ENUM('Tulo', 'Kulu') NOT NULL,
+    category VARCHAR(100),
+    tax_free_amount DECIMAL(12,2) DEFAULT 0.00,
+    vat_percentage DECIMAL(5,2) DEFAULT 0.00,
+    vat_25_5 DECIMAL(12,2) DEFAULT 0.00,
+    vat_14 DECIMAL(12,2) DEFAULT 0.00,
+    vat_10 DECIMAL(12,2) DEFAULT 0.00,
+    total_amount DECIMAL(12,2) DEFAULT 0.00,
+    net_amount DECIMAL(12,2) DEFAULT 0.00,
+    vat_amount DECIMAL(12,2) DEFAULT 0.00,
+    reference_number VARCHAR(50),
     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)
+    INDEX idx_entry_date (entry_date),
+    INDEX idx_entry_type (entry_type),
+    INDEX idx_category (category)
 );
 
--- Create items table
-CREATE TABLE IF NOT EXISTS items (
+CREATE TABLE IF NOT EXISTS accounting_categories (
     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),
+    category_code VARCHAR(20) NOT NULL,
+    category_name VARCHAR(200) NOT NULL,
+    category_type ENUM('Tulo', 'Kulu') NOT NULL,
+    vat_percentage DECIMAL(5,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
+    UNIQUE KEY unique_category_code (category_code)
 );
 
--- Create accounting_entries table
-CREATE TABLE IF NOT EXISTS accounting_entries (
+CREATE TABLE IF NOT EXISTS accounting_category_group_names (
     id INT AUTO_INCREMENT PRIMARY KEY,
+    category_group_code VARCHAR(3) NOT NULL,
+    category_group_name VARCHAR(200) NOT NULL,
+    description TEXT NULL,
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    UNIQUE KEY unique_category_group_code (category_group_code)
+);
+
+CREATE TABLE IF NOT EXISTS monthly_summaries (
+    id INT AUTO_INCREMENT PRIMARY KEY,
+    year INT NOT NULL,
+    month INT NOT NULL,
+    total_income DECIMAL(12,2) DEFAULT 0.00,
+    total_expenses DECIMAL(12,2) DEFAULT 0.00,
+    net_result DECIMAL(12,2) DEFAULT 0.00,
+    vat_payable DECIMAL(12,2) DEFAULT 0.00,
+    vat_deductible DECIMAL(12,2) DEFAULT 0.00,
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    UNIQUE KEY unique_year_month (year, month)
+);
+
+-- Additional tables for project management
+CREATE TABLE IF NOT EXISTS costs (
+    id INT(11) AUTO_INCREMENT PRIMARY KEY,
+    description VARCHAR(255) NOT NULL,
+    amount DECIMAL(10,2) NOT NULL,
+    cost_date DATE NOT NULL,
+    category VARCHAR(100) NOT NULL DEFAULT 'other',
+    supplier VARCHAR(255) NULL,
+    invoice_number VARCHAR(100) NULL,
+    account_id INT(11) NULL,
+    payment_method VARCHAR(50) NULL,
+    receipt_number VARCHAR(100) NULL,
+    notes TEXT NULL,
+    created_by INT(11) NULL,
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_cost_date (cost_date),
+    INDEX idx_category (category),
+    INDEX idx_supplier (supplier),
+    INDEX idx_account_id (account_id),
+    INDEX idx_created_by (created_by)
+);
+
+CREATE TABLE IF NOT EXISTS timers (
+    id INT(11) AUTO_INCREMENT PRIMARY KEY,
+    task_id INT(11) NULL,
+    user_id INT(11) NOT NULL,
+    start_time TIMESTAMP NULL,
+    end_time TIMESTAMP NULL,
+    duration VARCHAR(8) NULL,
+    description TEXT NULL,
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_task_id (task_id),
+    INDEX idx_user_id (user_id),
+    INDEX idx_start_time (start_time)
+);
+
+CREATE TABLE IF NOT EXISTS expense_categories (
+    id INT(11) AUTO_INCREMENT PRIMARY KEY,
+    category_code VARCHAR(50) NOT NULL UNIQUE,
+    category_name VARCHAR(200) NOT NULL,
+    parent_id INT(11) NULL,
+    description TEXT NULL,
+    is_active TINYINT(1) DEFAULT 1,
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_parent_id (parent_id)
+);
+
+CREATE TABLE IF NOT EXISTS income_categories (
+    id INT(11) AUTO_INCREMENT PRIMARY KEY,
+    category_code VARCHAR(50) NOT NULL UNIQUE,
+    category_name VARCHAR(200) NOT NULL,
+    parent_id INT(11) NULL,
+    description TEXT NULL,
+    is_active TINYINT(1) DEFAULT 1,
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_parent_id (parent_id)
+);
+
+CREATE TABLE IF NOT EXISTS incomes (
+    id INT(11) AUTO_INCREMENT PRIMARY KEY,
+    description VARCHAR(255) NOT NULL,
+    amount DECIMAL(10,2) NOT NULL,
+    income_date DATE NOT NULL,
+    category VARCHAR(100) NOT NULL DEFAULT 'other',
+    client_id INT(11) NULL,
+    invoice_id INT(11) NULL,
+    account_id INT(11) NULL,
+    payment_method VARCHAR(50) NULL,
+    reference_number VARCHAR(100) NULL,
+    notes TEXT NULL,
+    created_by INT(11) NULL,
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_income_date (income_date),
+    INDEX idx_category (category),
+    INDEX idx_client_id (client_id),
+    INDEX idx_invoice_id (invoice_id),
+    INDEX idx_account_id (account_id),
+    INDEX idx_created_by (created_by)
+);
+
+CREATE TABLE IF NOT EXISTS work_hours (
+    id INT(11) AUTO_INCREMENT PRIMARY KEY,
+    task_id INT(11) NOT NULL,
+    user_id INT(11) NOT NULL,
     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),
+    hours DECIMAL(5,2) NOT NULL,
+    description TEXT NULL,
+    rate DECIMAL(10,2) NULL,
+    total_amount DECIMAL(10,2) NULL,
     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)
+    INDEX idx_task_id (task_id),
+    INDEX idx_user_id (user_id),
+    INDEX idx_date (date)
 );
 
--- 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 wavium admin user
+INSERT INTO users (username, email, password_hash, first_name, last_name, role, is_active) VALUES 
+('admin', 'admin@inventory.com', '$2y$10$lIA8wG6lU0l93lacHNBS0uSGSfwqaceQpGEupzSatNcN7oG/yowC2', 'Admin', 'User', 'admin', TRUE);
+
+-- Insert expense categories data
+INSERT IGNORE INTO expense_categories (category_code, category_name, parent_id, description, is_active) VALUES
+('333', 'Ostot ja ulkopuoliset palvelut', NULL, 'Purchases and external services', 1),
+('334', 'Henkilöstökulut', NULL, 'Personnel costs', 1),
+('335', 'Poistot, edustuskulut ja vuokrat', NULL, 'Depreciation, representation and rental costs', 1),
+('336', 'Muut vähennyskelpoiset kulut', NULL, 'Other deductible expenses', 1),
+('337', 'Rahoituskulut', NULL, 'Financing costs', 1),
+('341', 'Varausten muutokset', NULL, 'Asset changes', 1),
+('343', 'Varausten myynnit', NULL, 'Asset sales', 1),
+('344', 'Matkakulut', NULL, 'Travel expenses', 1),
+('344 Ajoneuvo', 'Matkakulut - Kulkuneuvo', NULL, 'Vehicle travel expenses', 1),
+('344 Kokous', 'Matkakulut - Kokous', NULL, 'Meeting travel expenses', 0),
+('344 Matka-auto', 'Matkakulut - Auto', NULL, 'Car travel expenses', 1),
+('344 Muu', 'Matkakulut - Muu', NULL, 'Other travel expenses', 1),
+('346', 'Muut kulut', NULL, 'Other expenses', 1),
+('349', 'Poistot', NULL, 'Depreciation', 1),
+('353', 'Varainsiirrot', NULL, 'Asset transfers', 1),
+('354', 'Vähennyskelvottomat kulut', NULL, 'Non-deductible expenses', 1),
+('365', 'Vakuutukset', NULL, 'Insurance', 1),
+('366', 'Verot ja maksut', NULL, 'Taxes and fees', 1),
+('367', 'Yhtiölainat ja muut rahoituskulut', NULL, 'Company loans and other financing costs', 1);
+
+-- Insert income categories data
+INSERT IGNORE INTO income_categories (category_code, category_name, parent_id, description, is_active) VALUES
+('300', 'Myynti - EU', NULL, 'Sales - EU', 1),
+('300 - 255', 'Myynti - EU 25,5%', NULL, 'Sales - EU 25,5%', 1),
+('301', 'Myynti - Muut maat', NULL, 'Sales - Other countries', 1),
+('302', 'Myynti - Käänteinen vero', NULL, 'Sales - Reverse VAT', 1),
+('303', 'Myynti - Suomi 0%', NULL, 'Sales - Finland 0%', 1),
+('303 - 255', 'Myynti - Suomi 25,5%', NULL, 'Sales - Finland 25,5%', 1),
+('308', 'Myyntitavarat', NULL, 'Sales of fixed assets', 1),
+('309', 'Osuuskorvaukset', NULL, 'Share compensation', 1),
+('310', 'Korkotulot ja muut rahoitustuotot', NULL, 'Interest income and other financial income', 1),
+('311', 'Voitonjako', NULL, 'Profit distribution', 1),
+('312', 'Sijoitustoiminnan tuotot', NULL, 'Investment income', 1),
+('313', 'Apurahat ja muut avustukset', NULL, 'Grants and other subsidies', 1),
+('314', 'Muu tuotto', NULL, 'Other income', 1);
 
--- 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 default accounting categories
+INSERT IGNORE INTO accounting_categories (category_code, category_name, category_type, vat_percentage) VALUES
+('300 - E0', 'Myynti - EU 0%', 'Tulo', 0.00),
+('300 - E255', 'Myynti - EU 25,5%', 'Tulo', 25.50),
+('300 - K', 'Myynti - Käänteinen vero', 'Tulo', 0.00),
+('300 - M0', 'Myynti - Muut maat', 'Tulo', 0.00),
+('300 - S0', 'Myynti - Suomi 0%', 'Tulo', 0.00),
+('300 - S255', 'Myynti - Suomi 25,5%', 'Tulo', 25.50),
+('301', 'Muut tuotot', 'Tulo', 0.00),
+('312', 'Varausten vähennys', 'Tulo', 0.00),
+('313', 'Auton yksityiskäyttö', 'Tulo', 0.00),
+('314', 'Tavaroiden yksityiskäyttö', 'Tulo', 0.00),
+('315', 'Muu yksityiskäyttö', 'Tulo', 0.00),
+('317', 'Tuloslaskelman verovapaat tuotot', 'Tulo', 0.00),
+('318', 'Saadut avustukset ja tuet', 'Tulo', 0.00),
+('319', 'Saadut osingot', 'Tulo', 0.00),
+('320', 'Osinkojen veronalainen osuus', 'Tulo', 0.00),
+('323', 'Korkotuotot ja muut rahoitustuotot', 'Tulo', 0.00),
+('324', 'Muut veronalaiset tuotot', 'Tulo', 0.00),
+('333', 'Ostot ja varastojen muutokset', 'Kulu', 25.50),
+('334', 'Ulkopuoliset palvelut', 'Kulu', 25.50),
+('335', 'Palkat ja palkkiot', 'Kulu', 0.00),
+('336', 'Eläke- ja henkilösivukulut', 'Kulu', 0.00),
+('337', 'Poistot', 'Kulu', 0.00),
+('341', 'Edustuskulut', 'Kulu', 0.00),
+('343', 'Vuokrat', 'Kulu', 25.50),
+('344 - A', 'Ajoneuvokulut', 'Kulu', 25.50),
+('344 - K', 'Kokous- ja neuvottelukulut', 'Kulu', 25.50),
+('344 - M', 'Matkakulut', 'Kulu', 25.50),
+('344 - O', 'Muut vähennyskelpoiset kulut', 'Kulu', 25.50),
+('346', 'Korkokulut', 'Kulu', 0.00),
+('349', 'Muut rahoituskulut', 'Kulu', 0.00),
+('353', 'Varausten lisäykset', 'Kulu', 0.00),
+('354', 'Kirjanpidon ulkopuoliset vähennyskelpoiset kulut', 'Kulu', 0.00),
+('365', 'Välittömät verot', 'Kulu', 0.00),
+('366', 'Sakot ja muut rangaistusmaksut', 'Kulu', 0.00),
+('367', 'Muut vähennyskelvottomat kulut', 'Kulu', 0.00),
+('368', 'Julkinen liikenne', 'Kulu', 10.00);
 
-INSERT IGNORE INTO projects (name, description, status, customer_id) 
-VALUES ('Inventory', 'Inventory Management System', 'active', 1);
+-- Insert default category groups
+INSERT IGNORE INTO accounting_category_group_names (category_group_code, category_group_name, description) VALUES
+('300', 'Tuotot ammatista', NULL),
+('301', 'Muut tuotot', NULL),
+('312', 'Varausten vähennys', NULL),
+('313', 'Auton yksityiskäyttö', NULL),
+('314', 'Tavaroiden yksityiskäyttö', NULL),
+('315', 'Muu yksityiskäyttö', NULL),
+('317', 'Tuloslaskelman verovapaat tuotot', NULL),
+('318', 'Saadut avustukset ja tuet', NULL),
+('319', 'Saadut osingot', NULL),
+('323', 'Korkotuotot ja muut rahoitustuotot', NULL),
+('324', 'Muut veronalaiset tuotot', NULL),
+('333', 'Ostot ja varastojen muutokset', NULL),
+('334', 'Ulkopuoliset palvelut', NULL),
+('335', 'Palkat ja palkkiot', NULL),
+('336', 'Eläke- ja henkilösivukulut', NULL),
+('337', 'Poistot', NULL),
+('341', 'Edustuskulut', NULL),
+('343', 'Vuokrat', NULL),
+('344', 'Matkakulut', NULL),
+('346', 'Korkokulut', NULL),
+('349', 'Muut rahoituskulut', NULL),
+('353', 'Varausten lisäykset', NULL),
+('354', 'Kirjanpidon ulkopuoliset vähennyskelpoiset kulut', NULL),
+('358', 'Elinkeinotoiminnan tulos', NULL),
+('359', 'Elinkeinotoiminnan tappio', NULL),
+('365', 'Välittömät verot', NULL),
+('366', 'Sakot ja muut rangaistusmaksut', NULL),
+('367', 'Muut vähennyskelvottomat kulut', NULL),
+('368', 'Julkinen liikenne', NULL);
 
-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');
+-- Insert chart of accounts
+INSERT IGNORE INTO chart_of_accounts (account_number, account_name, account_type, parent_id, description, opening_balance, current_balance, is_active) VALUES
+('1000', 'Käyttöpääoma', 'asset', NULL, 'Pääomaisuus', 0.00, 0.00, TRUE),
+('1100', 'Saamiset ja vaatimukset', 'asset', NULL, 'Tase-erät ja poistot', 0.00, 0.00, TRUE),
+('1200', 'Aineelliset vaihto-omaisuudet', 'asset', NULL, 'Varasto ja raaka-aineet', 0.00, 0.00, TRUE),
+('1300', 'Pitkän aikaiset sijoitukset', 'asset', NULL, 'Pitkän aikaiset sijoitukset', 0.00, 0.00, TRUE),
+('1400', 'Kiinteistöt', 'asset', NULL, 'Kiinteistöt ja rakennukset', 0.00, 0.00, TRUE),
+('1500', 'Koneet ja kalusto', 'asset', NULL, 'Koneet, kalusto ja laitteet', 0.00, 0.00, TRUE),
+('1600', 'Aineettomat varat', 'asset', NULL, 'Aineettomat varat', 0.00, 0.00, TRUE),
+('1700', 'Sijoitukset rahoituslaitoksissa', 'asset', NULL, 'Rahoituslaitokset', 0.00, 0.00, TRUE),
+('1800', 'Erityiset vaihto-omaisuudet', 'asset', NULL, 'Erityiset vaihto-omaisuudet', 0.00, 0.00, TRUE),
+('1900', 'Vaihto-omaisuudet luovutukseen', 'asset', NULL, 'Myyntikohteiset varat', 0.00, 0.00, TRUE),
+('2000', 'Oma pääoma', 'liability', NULL, 'Oma pääoma', 0.00, 0.00, TRUE),
+('2100', 'Pitkän aikaiset velat', 'liability', NULL, 'Pitkän aikaiset velat', 0.00, 0.00, TRUE),
+('2200', 'Verovelat', 'liability', NULL, 'Verovelat ja vakuudet', 0.00, 0.00, TRUE),
+('2300', 'Ostovelat ja saamiset', 'liability', NULL, 'Ostovelat ja saamiset', 0.00, 0.00, TRUE),
+('2400', 'Maksuvelat ja ennakot', 'liability', NULL, 'Maksuvelat ja saadut ennakot', 0.00, 0.00, TRUE),
+('2500', 'Verovelat konserneille', 'liability', NULL, 'Verovelat konserneille', 0.00, 0.00, TRUE),
+('2600', 'Muut velat', 'liability', NULL, 'Muut velat', 0.00, 0.00, TRUE),
+('2700', 'Siirrot konserninointiin', 'liability', NULL, 'Siirrot konserninointiin', 0.00, 0.00, TRUE),
+('2800', 'Tilikauden tuloverot', 'liability', NULL, 'Tilikauden tuloverot', 0.00, 0.00, TRUE),
+('3000', 'Osakepääoma', 'equity', NULL, 'Osakepääoma', 0.00, 0.00, TRUE),
+('3100', 'Sijoitetun pääoman rahastot', 'equity', NULL, 'Sijoitetun pääoman rahastot', 0.00, 0.00, TRUE),
+('3200', 'Muut pääomat rahastot', 'equity', NULL, 'Muut pääomat rahastot', 0.00, 0.00, TRUE),
+('3300', 'Tilikauden voitto', 'equity', NULL, 'Tilikauden voitto/tappio', 0.00, 0.00, TRUE),
+('4000', 'Myyntituotot', 'revenue', NULL, 'Myyntituotot', 0.00, 0.00, TRUE),
+('4100', 'Palvelutuotot', 'revenue', NULL, 'Palvelutuotot', 0.00, 0.00, TRUE),
+('4200', 'Vuokratuotot', 'revenue', NULL, 'Vuokratuotot', 0.00, 0.00, TRUE),
+('4300', 'Korko- ja valuuttatuotot', 'revenue', NULL, 'Korko- ja valuuttatuotot', 0.00, 0.00, TRUE),
+('4400', 'Muu tuotto', 'revenue', NULL, 'Muu tuotto', 0.00, 0.00, TRUE),
+('4500', 'Siirrot konserninointiin', 'revenue', NULL, 'Siirrot konserninointiin', 0.00, 0.00, TRUE),
+('5000', 'Aineelliset kulut', 'expense', NULL, 'Aineelliset kulut ja palvelut', 0.00, 0.00, TRUE),
+('5100', 'Henkilöstökulut', 'expense', NULL, 'Henkilöstökulut', 0.00, 0.00, TRUE),
+('5200', 'Poistot ja alennukset', 'expense', NULL, 'Poistot ja alennukset', 0.00, 0.00, TRUE),
+('5300', 'Vuokrat ja vuokrakulut', 'expense', NULL, 'Vuokrat ja vuokrakulut', 0.00, 0.00, TRUE),
+('5400', 'Korko- ja rahoituskulut', 'expense', NULL, 'Korko- ja rahoituskulut', 0.00, 0.00, TRUE),
+('5500', 'Tase-erät ja poistot', 'expense', NULL, 'Tase-erät ja poistot', 0.00, 0.00, TRUE),
+('5600', 'Arvonmäärityksen alennukset', 'expense', NULL, 'Arvonmäärityksen alennukset', 0.00, 0.00, TRUE),
+('5700', 'Verotukset ja maksut', 'expense', NULL, 'Verotukset ja maksut', 0.00, 0.00, TRUE),
+('5800', 'Muut kulut', 'expense', NULL, 'Muut kulut', 0.00, 0.00, TRUE),
+('5900', 'Siirrot konserninointiin', 'expense', NULL, 'Siirrot konserninointiin', 0.00, 0.00, TRUE);

+ 0 - 6
docker-compose-with-services.yml

@@ -83,12 +83,6 @@ volumes:
     driver: local
   redis_data:
     driver: local
-  uploads_data:
-    driver: local
-    driver_opts:
-      type: none
-      o: bind
-      device: ${UPLOADS_PATH:-./uploads}
 
 networks:
   default:

+ 0 - 8
docker-compose.yml

@@ -34,11 +34,3 @@ services:
       timeout: 10s
       retries: 3
       start_period: 40s
-
-volumes:
-  uploads_data:
-    driver: local
-    driver_opts:
-      type: none
-      o: bind
-      device: ${UPLOADS_PATH:-./uploads}