Files
foodlinkk-command-center/snapshots/2026-06-09/migrations/010_retail_crm_intel.sql
T
2026-06-09 01:38:01 +00:00

84 lines
3.6 KiB
SQL

-- Retail CRM intelligence layer
CREATE TABLE IF NOT EXISTS supermarket_contacts (
id SERIAL PRIMARY KEY,
supermarket_id INTEGER NOT NULL REFERENCES supermarkets(id) ON DELETE CASCADE,
role VARCHAR(64) NOT NULL DEFAULT 'manager',
full_name VARCHAR(255),
phone VARCHAR(32),
email VARCHAR(255),
linkedin_url VARCHAR(512),
source VARCHAR(100),
confidence NUMERIC(3,2) DEFAULT 0.50,
verified_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_supermarket_contacts_store ON supermarket_contacts(supermarket_id);
CREATE INDEX IF NOT EXISTS idx_supermarket_contacts_role ON supermarket_contacts(role);
CREATE TABLE IF NOT EXISTS supermarket_profiles (
supermarket_id INTEGER PRIMARY KEY REFERENCES supermarkets(id) ON DELETE CASCADE,
staff_count_estimate INTEGER,
manager_name VARCHAR(255),
manager_phone VARCHAR(32),
manager_email VARCHAR(255),
services JSONB DEFAULT '{}'::jsonb,
facilities JSONB DEFAULT '{}'::jsonb,
web_data JSONB DEFAULT '{}'::jsonb,
scrape_url VARCHAR(512),
last_scraped_at TIMESTAMPTZ,
data_completeness NUMERIC(3,2) DEFAULT 0,
notes TEXT
);
CREATE TABLE IF NOT EXISTS client_supermarket_links (
id SERIAL PRIMARY KEY,
client_id INTEGER NOT NULL REFERENCES clients(id) ON DELETE CASCADE,
supermarket_id INTEGER NOT NULL REFERENCES supermarkets(id) ON DELETE CASCADE,
deal_id INTEGER REFERENCES deals(id) ON DELETE SET NULL,
relationship_type VARCHAR(64) DEFAULT 'prospect',
notes TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(client_id, supermarket_id)
);
CREATE INDEX IF NOT EXISTS idx_csl_client ON client_supermarket_links(client_id);
CREATE INDEX IF NOT EXISTS idx_csl_store ON client_supermarket_links(supermarket_id);
CREATE TABLE IF NOT EXISTS halal_certifications (
id SERIAL PRIMARY KEY,
supermarket_id INTEGER REFERENCES supermarkets(id) ON DELETE SET NULL,
certifier VARCHAR(100) NOT NULL,
certificate_number VARCHAR(100),
business_name VARCHAR(255),
address TEXT,
city VARCHAR(100),
expiry_date DATE,
status VARCHAR(32) DEFAULT 'active',
registry_source VARCHAR(100),
matched_confidence NUMERIC(3,2),
raw_data JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_halal_cert_store ON halal_certifications(supermarket_id);
CREATE INDEX IF NOT EXISTS idx_halal_cert_status ON halal_certifications(status);
CREATE TABLE IF NOT EXISTS retail_opportunity_scores (
supermarket_id INTEGER PRIMARY KEY REFERENCES supermarkets(id) ON DELETE CASCADE,
halal_opportunity_score NUMERIC(5,2),
market_potential_score NUMERIC(5,2),
factors JSONB DEFAULT '{}'::jsonb,
computed_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_retail_opp_halal ON retail_opportunity_scores(halal_opportunity_score DESC);
ALTER TABLE supermarkets ADD COLUMN IF NOT EXISTS employee_count INTEGER;
ALTER TABLE supermarkets ADD COLUMN IF NOT EXISTS manager_name VARCHAR(255);
ALTER TABLE supermarkets ADD COLUMN IF NOT EXISTS enrichment_score NUMERIC(3,2) DEFAULT 0;
ALTER TABLE supermarkets ADD COLUMN IF NOT EXISTS halal_opportunity_score NUMERIC(5,2);
INSERT INTO data_providers (name, provider_type, config, is_active) VALUES
('halal_registry', 'scrape', '{"sources": ["osm", "hqc", "manual"]}', true),
('branch_scraper', 'scrape', '{"chains": ["ah", "jumbo", "plus", "lidl", "aldi", "dirk"]}', true),
('market_trends', 'api', '{"categories": ["kant-en-klaar", "halal", "ready-meals"]}', true)
ON CONFLICT (name) DO UPDATE SET config = EXCLUDED.config, is_active = true;