-- 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);