Spaces:
Sleeping
Sleeping
File size: 6,561 Bytes
5c25c25 2f9626c 5c25c25 2f9626c 5c25c25 2f9626c 5c25c25 | 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 | -- ProspectIQ SQLite Database Schema for Cycle 1
CREATE TABLE IF NOT EXISTS tenants (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
brand_color TEXT,
logo_url TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS permissions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
code TEXT UNIQUE NOT NULL,
description TEXT
);
CREATE TABLE IF NOT EXISTS roles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tenant_id INTEGER NOT NULL,
name TEXT NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
UNIQUE(tenant_id, name)
);
CREATE TABLE IF NOT EXISTS role_permissions (
role_id INTEGER NOT NULL,
permission_id INTEGER NOT NULL,
PRIMARY KEY(role_id, permission_id),
FOREIGN KEY(role_id) REFERENCES roles(id) ON DELETE CASCADE,
FOREIGN KEY(permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tenant_id INTEGER NOT NULL,
email TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
password_hash TEXT,
role_id INTEGER,
role TEXT NOT NULL CHECK(role IN ('Super Admin', 'Admin', 'BD Rep', 'Viewer')),
is_active INTEGER DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(tenant_id) REFERENCES tenants(id),
FOREIGN KEY(role_id) REFERENCES roles(id)
);
CREATE TABLE IF NOT EXISTS stages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
order_index INTEGER NOT NULL UNIQUE,
color_bg TEXT,
color_text TEXT,
is_active INTEGER DEFAULT 1
);
CREATE TABLE IF NOT EXISTS companies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tenant_id INTEGER NOT NULL,
name TEXT NOT NULL,
legal_name TEXT,
website TEXT,
phone TEXT,
nic_code TEXT,
industry TEXT,
street TEXT,
city TEXT,
province TEXT,
postal_code TEXT,
country TEXT,
size_staff INTEGER,
revenue_band TEXT,
business_type TEXT CHECK(business_type IN ('OEM', 'distributor', 'other', 'OEM / distributor', 'OEM / Distributor')),
products_made TEXT,
parts_sourced TEXT,
current_supplier_notes TEXT,
maplempss_fit_score REAL DEFAULT 0.0,
stage_id INTEGER NOT NULL,
assigned_rep_id INTEGER,
created_by INTEGER,
updated_by INTEGER,
import_batch_id INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(tenant_id) REFERENCES tenants(id),
FOREIGN KEY(stage_id) REFERENCES stages(id),
FOREIGN KEY(assigned_rep_id) REFERENCES users(id),
FOREIGN KEY(created_by) REFERENCES users(id),
FOREIGN KEY(updated_by) REFERENCES users(id)
);
CREATE TABLE IF NOT EXISTS contacts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
company_id INTEGER NOT NULL,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
title TEXT,
email TEXT,
phone TEXT,
linkedin TEXT,
is_primary INTEGER DEFAULT 0 CHECK(is_primary IN (0, 1)),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(company_id) REFERENCES companies(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS activities (
id INTEGER PRIMARY KEY AUTOINCREMENT,
company_id INTEGER NOT NULL,
contact_id INTEGER,
user_id INTEGER NOT NULL,
type TEXT NOT NULL CHECK(type IN ('Cold Call', 'Email', 'LinkedIn Message', 'Meeting', 'Follow-Up', 'Note')),
outcome TEXT,
notes TEXT,
next_action TEXT,
next_action_date TEXT,
occurred_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(company_id) REFERENCES companies(id) ON DELETE CASCADE,
FOREIGN KEY(contact_id) REFERENCES contacts(id) ON DELETE SET NULL,
FOREIGN KEY(user_id) REFERENCES users(id)
);
CREATE TABLE IF NOT EXISTS notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
company_id INTEGER NOT NULL,
contact_id INTEGER,
user_id INTEGER NOT NULL,
body TEXT NOT NULL,
is_pinned INTEGER DEFAULT 0 CHECK(is_pinned IN (0, 1)),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(company_id) REFERENCES companies(id) ON DELETE CASCADE,
FOREIGN KEY(contact_id) REFERENCES contacts(id) ON DELETE SET NULL,
FOREIGN KEY(user_id) REFERENCES users(id)
);
CREATE TABLE IF NOT EXISTS stage_changes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
company_id INTEGER NOT NULL,
from_stage_id INTEGER,
to_stage_id INTEGER NOT NULL,
changed_by_user_id INTEGER NOT NULL,
source TEXT NOT NULL CHECK(source IN ('manual', 'ai_suggested', 'ai_confirmed')),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(company_id) REFERENCES companies(id) ON DELETE CASCADE,
FOREIGN KEY(from_stage_id) REFERENCES stages(id),
FOREIGN KEY(to_stage_id) REFERENCES stages(id),
FOREIGN KEY(changed_by_user_id) REFERENCES users(id)
);
CREATE TABLE IF NOT EXISTS ai_field_values (
id INTEGER PRIMARY KEY AUTOINCREMENT,
company_id INTEGER NOT NULL,
field_name TEXT NOT NULL,
value TEXT,
source_url TEXT,
confidence_score REAL,
enriched_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
confirmed_by_user_id INTEGER,
confirmed_at TIMESTAMP,
FOREIGN KEY(company_id) REFERENCES companies(id) ON DELETE CASCADE,
FOREIGN KEY(confirmed_by_user_id) REFERENCES users(id)
);
CREATE TABLE IF NOT EXISTS import_batches (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
filename TEXT,
status TEXT,
total_rows INTEGER,
added INTEGER,
updated INTEGER,
skipped INTEGER,
errored INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed_at TIMESTAMP,
FOREIGN KEY(user_id) REFERENCES users(id)
);
-- Indices for fast searching and filtering
CREATE INDEX IF NOT EXISTS idx_companies_stage ON companies(stage_id);
CREATE INDEX IF NOT EXISTS idx_companies_tenant ON companies(tenant_id);
CREATE INDEX IF NOT EXISTS idx_companies_rep ON companies(assigned_rep_id);
CREATE INDEX IF NOT EXISTS idx_contacts_company ON contacts(company_id);
CREATE INDEX IF NOT EXISTS idx_activities_company ON activities(company_id);
CREATE INDEX IF NOT EXISTS idx_notes_company ON notes(company_id);
|