CREATE TABLE accounts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE, outlet_id UUID REFERENCES outlets(id) ON DELETE CASCADE, chart_of_account_id UUID NOT NULL REFERENCES chart_of_accounts(id) ON DELETE RESTRICT, name VARCHAR(255) NOT NULL, number VARCHAR(50) NOT NULL, account_type VARCHAR(20) NOT NULL CHECK (account_type IN ('cash', 'wallet', 'bank', 'credit', 'debit', 'asset', 'liability', 'equity', 'revenue', 'expense')), opening_balance DECIMAL(15,2) DEFAULT 0.00, current_balance DECIMAL(15,2) DEFAULT 0.00, description TEXT, is_active BOOLEAN DEFAULT true, is_system BOOLEAN DEFAULT false, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), UNIQUE(organization_id, outlet_id, number), UNIQUE(organization_id, number) -- For organization-level accounts ); CREATE INDEX idx_accounts_organization_id ON accounts(organization_id); CREATE INDEX idx_accounts_outlet_id ON accounts(outlet_id); CREATE INDEX idx_accounts_chart_of_account_id ON accounts(chart_of_account_id); CREATE INDEX idx_accounts_number ON accounts(number); CREATE INDEX idx_accounts_account_type ON accounts(account_type); CREATE INDEX idx_accounts_is_active ON accounts(is_active); CREATE INDEX idx_accounts_is_system ON accounts(is_system);