Spaces:
Running
Running
File size: 6,443 Bytes
21bbe59 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
```sql
-- Organizations (multi-tenancy foundation)
CREATE TABLE organizations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
is_active BOOLEAN DEFAULT TRUE,
subscription_tier TEXT DEFAULT 'basic',
modules_enabled JSONB DEFAULT '{
"crm": true,
"hr": true,
"finance": false,
"inventory": false
}'
);
-- Users (Supabase Auth handles auth.users, we extend)
CREATE TABLE user_profiles (
id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
email TEXT NOT NULL UNIQUE,
full_name TEXT,
phone TEXT,
avatar_url TEXT,
role TEXT NOT NULL CHECK (role IN (
'superadmin',
'org_admin',
'hr_manager',
'finance_manager',
'inventory_manager',
'crm_lead_manager',
'support_staff',
'normal_employee',
'viewer'
)),
organization_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
department_id UUID,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
is_active BOOLEAN DEFAULT TRUE
);
-- Departments
CREATE TABLE departments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
parent_id UUID REFERENCES departments(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Now add the foreign key constraint to user_profiles
ALTER TABLE user_profiles
ADD CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(id);
-- CRM Module Tables
CREATE TABLE crm_leads (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
first_name TEXT NOT NULL,
last_name TEXT,
email TEXT,
phone TEXT,
company TEXT,
title TEXT,
lead_source TEXT,
lead_score INTEGER DEFAULT 0,
stage TEXT NOT NULL DEFAULT 'new',
value DECIMAL(12,2),
owner_id UUID REFERENCES user_profiles(id),
notes TEXT,
loss_reason TEXT,
next_followup_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- HR Module Tables
CREATE TABLE hr_employees (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES user_profiles(id) ON DELETE CASCADE,
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
employee_id TEXT NOT NULL,
joining_date DATE NOT NULL,
designation TEXT NOT NULL,
salary DECIMAL(12,2) NOT NULL,
bank_details JSONB,
documents JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE(organization_id, employee_id)
);
CREATE TABLE hr_attendance (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
employee_id UUID NOT NULL REFERENCES hr_employees(id) ON DELETE CASCADE,
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
date DATE NOT NULL,
clock_in TIMESTAMPTZ,
clock_out TIMESTAMPTZ,
status TEXT DEFAULT 'present',
notes TEXT,
UNIQUE(employee_id, date)
);
CREATE TABLE hr_leaves (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
employee_id UUID NOT NULL REFERENCES hr_employees(id) ON DELETE CASCADE,
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
type TEXT NOT NULL,
reason TEXT,
status TEXT DEFAULT 'pending',
approved_by UUID REFERENCES user_profiles(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Finance Module Tables
CREATE TABLE finance_invoices (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
invoice_number TEXT NOT NULL,
customer_id UUID,
customer_name TEXT NOT NULL,
date DATE NOT NULL,
due_date DATE NOT NULL,
status TEXT DEFAULT 'draft',
subtotal DECIMAL(12,2) NOT NULL,
tax_amount DECIMAL(12,2) NOT NULL,
discount_amount DECIMAL(12,2) DEFAULT 0,
total DECIMAL(12,2) NOT NULL,
items JSONB NOT NULL,
notes TEXT,
created_by UUID REFERENCES user_profiles(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE(organization_id, invoice_number)
);
-- Inventory Module Tables
CREATE TABLE inventory_products (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
sku TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
category TEXT,
hsn_code TEXT,
gst_slab DECIMAL(5,2),
cost_price DECIMAL(12,2) NOT NULL,
selling_price DECIMAL(12,2) NOT NULL,
current_stock INTEGER DEFAULT 0,
min_stock_level INTEGER DEFAULT 10,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE(organization_id, sku)
);
CREATE TABLE inventory_stock_movements (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
product_id UUID NOT NULL REFERENCES inventory_products(id) ON DELETE CASCADE,
type TEXT NOT NULL CHECK (type IN ('in', 'out')),
quantity INTEGER NOT NULL,
reference_id TEXT,
reference_type TEXT,
notes TEXT,
created_by UUID REFERENCES user_profiles(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Workflows
CREATE TABLE workflows (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
name TEXT NOT NULL,
description TEXT,
trigger_type TEXT NOT NULL,
trigger_condition JSONB NOT NULL,
actions JSONB NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Audit Logs
CREATE TABLE audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
user_id UUID REFERENCES user_profiles(id) ON DELETE SET NULL,
action TEXT NOT NULL,
entity_type TEXT,
entity_id UUID,
old_value JSONB,
new_value JSONB,
ip_address TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Add indexes for performance
CREATE INDEX idx_user_profiles_org ON user_profiles(organization_id);
CREATE INDEX idx_crm_leads_org ON crm_leads(organization_id);
CREATE INDEX idx_crm_leads_stage ON crm_leads(stage);
CREATE INDEX idx_hr_employees_org ON hr_employees(organization_id);
CREATE INDEX idx_finance_invoices_org ON finance_invoices(organization_id);
CREATE INDEX idx_inventory_products_org ON inventory_products(organization_id);
``` |