5d60d33db1
Volledige Foodlinkk Command Center uitbreiding met social automatisering, reclamefolder filters, Proxmox monitoring en documentatie.
84 lines
3.6 KiB
SQL
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;
|