Spaces:
Running
Running
| -- 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); | |