USE inventory_db; 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) );