ProspectIQ / schema.sql
praneelchettys's picture
Clean deployment history without secrets
dc1eba5
Raw
History Blame Contribute Delete
5.54 kB
-- 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 users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tenant_id INTEGER NOT NULL,
email TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
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)
);
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);