-- Migration: 025_create_erp_tables.sql -- Description: Create tables for Finance, Inventory, and Order management -- Financial Categories CREATE TABLE IF NOT EXISTS erp_financial_categories ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, name VARCHAR(255) NOT NULL, type VARCHAR(20) NOT NULL CHECK (type IN ('income', 'expense')), color VARCHAR(20), is_active BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Bank Accounts CREATE TABLE IF NOT EXISTS erp_bank_accounts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, name VARCHAR(255) NOT NULL, bank_name VARCHAR(255), initial_balance DECIMAL(15,2) DEFAULT 0.00, current_balance DECIMAL(15,2) DEFAULT 0.00, is_active BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Financial Transactions CREATE TABLE IF NOT EXISTS erp_financial_transactions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, account_id UUID REFERENCES erp_bank_accounts(id), category_id UUID REFERENCES erp_financial_categories(id), description TEXT, amount DECIMAL(15,2) NOT NULL, type VARCHAR(20) NOT NULL CHECK (type IN ('income', 'expense')), status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'paid', 'cancelled')), due_date DATE, payment_date TIMESTAMP WITH TIME ZONE, attachments TEXT[], -- URLs for proofs created_by UUID REFERENCES users(id), created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Products & Services CREATE TABLE IF NOT EXISTS erp_products ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, name VARCHAR(255) NOT NULL, sku VARCHAR(100), description TEXT, price DECIMAL(15,2) NOT NULL, cost_price DECIMAL(15,2), type VARCHAR(20) DEFAULT 'product' CHECK (type IN ('product', 'service')), stock_quantity INT DEFAULT 0, is_active BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Orders CREATE TABLE IF NOT EXISTS erp_orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, customer_id UUID REFERENCES companies(id), -- Linked to CRM (companies) status VARCHAR(20) NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'confirmed', 'completed', 'cancelled')), total_amount DECIMAL(15,2) DEFAULT 0.00, notes TEXT, created_by UUID REFERENCES users(id), created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Order Items CREATE TABLE IF NOT EXISTS erp_order_items ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), order_id UUID NOT NULL REFERENCES erp_orders(id) ON DELETE CASCADE, product_id UUID NOT NULL REFERENCES erp_products(id), quantity INT NOT NULL DEFAULT 1, unit_price DECIMAL(15,2) NOT NULL, total_price DECIMAL(15,2) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Indexes for performance and multi-tenancy CREATE INDEX idx_erp_fin_cat_tenant ON erp_financial_categories(tenant_id); CREATE INDEX idx_erp_bank_acc_tenant ON erp_bank_accounts(tenant_id); CREATE INDEX idx_erp_fin_trans_tenant ON erp_financial_transactions(tenant_id); CREATE INDEX idx_erp_products_tenant ON erp_products(tenant_id); CREATE INDEX idx_erp_orders_tenant ON erp_orders(tenant_id); CREATE INDEX idx_erp_order_items_order ON erp_order_items(order_id);