94 lines
4.0 KiB
SQL
94 lines
4.0 KiB
SQL
-- 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);
|