Files

303 lines
17 KiB
SQL

-- Foodlinkk 036: Export Intel Global (schema + fase A seeds)
CREATE TABLE IF NOT EXISTS export_regions (
code VARCHAR(32) PRIMARY KEY,
name_nl VARCHAR(128) NOT NULL,
name_en VARCHAR(128) NOT NULL,
sort_order INT DEFAULT 0
);
CREATE TABLE IF NOT EXISTS export_territories (
code VARCHAR(64) PRIMARY KEY,
country_iso2 CHAR(2) NOT NULL,
region_code VARCHAR(32) REFERENCES export_regions(code),
name_nl VARCHAR(128) NOT NULL,
name_en VARCHAR(128) NOT NULL,
lat DOUBLE PRECISION,
lon DOUBLE PRECISION,
map_zoom INT DEFAULT 6,
bbox JSONB,
sync_priority INT DEFAULT 3,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS export_caterer_brands (
code VARCHAR(64) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_brand_code VARCHAR(64) REFERENCES export_caterer_brands(code),
hq_country_iso2 CHAR(2),
website VARCHAR(512),
tier INT DEFAULT 2,
notes TEXT,
annual_report_url VARCHAR(512),
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS export_caterer_presence (
id SERIAL PRIMARY KEY,
brand_code VARCHAR(64) NOT NULL REFERENCES export_caterer_brands(code),
country_iso2 CHAR(2) NOT NULL,
local_legal_name VARCHAR(255),
service_lines JSONB DEFAULT '[]'::jsonb,
regions JSONB DEFAULT '[]'::jsonb,
site_count_estimate INT,
procurement_model VARCHAR(32),
product_categories_served JSONB DEFAULT '[]'::jsonb,
supplier_entry_point VARCHAR(32),
is_active BOOLEAN DEFAULT TRUE,
last_verified_at TIMESTAMPTZ,
sources JSONB DEFAULT '[]'::jsonb,
entity_id INT,
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE (brand_code, country_iso2)
);
CREATE TABLE IF NOT EXISTS export_market_entities (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
entity_type VARCHAR(64) NOT NULL,
country_iso2 CHAR(2) NOT NULL,
territory_code VARCHAR(64) REFERENCES export_territories(code),
lat DOUBLE PRECISION,
lon DOUBLE PRECISION,
address_line VARCHAR(512),
city VARCHAR(128),
postal_code VARCHAR(32),
phone VARCHAR(64),
email VARCHAR(255),
website VARCHAR(512),
product_interest JSONB DEFAULT '[]'::jsonb,
volume_band VARCHAR(32),
cold_chain BOOLEAN DEFAULT FALSE,
halal_cert_notes TEXT,
google_place_id VARCHAR(128),
brand_code VARCHAR(64) REFERENCES export_caterer_brands(code),
source VARCHAR(64) DEFAULT 'manual',
sources JSONB DEFAULT '[]'::jsonb,
confidence INT DEFAULT 50,
geo_status VARCHAR(32) DEFAULT 'ok',
canonical_id INT REFERENCES export_market_entities(id),
pipeline_stage VARCHAR(32) DEFAULT 'identified',
client_id INT REFERENCES clients(id) ON DELETE SET NULL,
deal_id INT REFERENCES deals(id) ON DELETE SET NULL,
metadata JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS export_entity_contacts (
id SERIAL PRIMARY KEY,
entity_id INT NOT NULL REFERENCES export_market_entities(id) ON DELETE CASCADE,
presence_id INT REFERENCES export_caterer_presence(id) ON DELETE SET NULL,
contact_type VARCHAR(32) DEFAULT 'person',
role VARCHAR(64) DEFAULT 'general',
name VARCHAR(255),
title VARCHAR(255),
department VARCHAR(128),
email VARCHAR(255),
email_alt VARCHAR(255),
phone VARCHAR(64),
mobile VARCHAR(64),
whatsapp VARCHAR(64),
fax VARCHAR(64),
linkedin_url VARCHAR(512),
website_contact_url VARCHAR(512),
address_line VARCHAR(512),
city VARCHAR(128),
postal_code VARCHAR(32),
language VARCHAR(8) DEFAULT 'en',
is_primary BOOLEAN DEFAULT FALSE,
opt_out BOOLEAN DEFAULT FALSE,
source VARCHAR(64) DEFAULT 'manual',
source_url VARCHAR(512),
confidence INT DEFAULT 50,
verified_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS export_gov_data_sources (
id SERIAL PRIMARY KEY,
country_iso2 CHAR(2) NOT NULL,
name VARCHAR(255) NOT NULL,
category VARCHAR(64) NOT NULL,
url VARCHAR(512),
api_url VARCHAR(512),
notes TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS export_outreach_log (
id SERIAL PRIMARY KEY,
entity_id INT REFERENCES export_market_entities(id) ON DELETE SET NULL,
presence_id INT REFERENCES export_caterer_presence(id) ON DELETE SET NULL,
campaign_type VARCHAR(64) NOT NULL,
email_message_id INT,
deal_id INT REFERENCES deals(id) ON DELETE SET NULL,
status VARCHAR(32) DEFAULT 'draft',
template_id VARCHAR(64),
sent_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_export_entities_country ON export_market_entities(country_iso2);
CREATE INDEX IF NOT EXISTS idx_export_entities_type ON export_market_entities(entity_type);
CREATE INDEX IF NOT EXISTS idx_export_contacts_entity ON export_entity_contacts(entity_id);
CREATE INDEX IF NOT EXISTS idx_export_contacts_email ON export_entity_contacts(email);
CREATE INDEX IF NOT EXISTS idx_export_presence_country ON export_caterer_presence(country_iso2);
-- Regions
INSERT INTO export_regions (code, name_nl, name_en, sort_order) VALUES
('caribbean', 'Caribisch', 'Caribbean', 1),
('gcc', 'GCC', 'GCC', 2),
('europe', 'Europa', 'Europe', 3),
('africa', 'Afrika', 'Africa', 4),
('asia', 'Asia', 'Asia', 5),
('americas', 'Amerika', 'Americas', 6),
('oceania', 'Oceanië', 'Oceania', 7)
ON CONFLICT (code) DO NOTHING;
-- Territories (fase A: key markets + Caribbean + GCC)
INSERT INTO export_territories (code, country_iso2, region_code, name_nl, name_en, lat, lon, map_zoom, bbox, sync_priority) VALUES
('nl', 'NL', 'europe', 'Nederland', 'Netherlands', 52.37, 4.90, 7, '[50.75,3.2,53.7,7.3]'::jsonb, 1),
('aw', 'AW', 'caribbean', 'Aruba', 'Aruba', 12.52, -70.03, 11, '[12.4,-70.1,12.65,-69.8]'::jsonb, 1),
('cw', 'CW', 'caribbean', 'Curaçao', 'Curaçao', 12.17, -68.99, 11, '[11.9,-69.2,12.4,-68.6]'::jsonb, 1),
('bq', 'BQ', 'caribbean', 'Bonaire', 'Bonaire', 12.15, -68.27, 12, '[12.0,-68.4,12.3,-68.2]'::jsonb, 1),
('sx', 'SX', 'caribbean', 'Sint Maarten', 'Sint Maarten', 18.04, -63.05, 11, '[17.9,-63.2,18.1,-62.9]'::jsonb, 1),
('bq-se', 'BQ', 'caribbean', 'Saba', 'Saba', 17.63, -63.23, 12, '[17.6,-63.3,17.7,-63.2]'::jsonb, 1),
('bq-bo', 'BQ', 'caribbean', 'Sint Eustatius', 'Sint Eustatius', 17.48, -62.98, 12, '[17.4,-63.1,17.5,-62.9]'::jsonb, 1),
('ae', 'AE', 'gcc', 'Verenigde Arabische Emiraten', 'United Arab Emirates', 24.45, 54.37, 7, '[22.5,51.5,26.1,56.5]'::jsonb, 1),
('de', 'DE', 'europe', 'Duitsland', 'Germany', 51.16, 10.45, 6, '[47.3,5.9,55.1,15.0]'::jsonb, 2),
('gb', 'GB', 'europe', 'Verenigd Koninkrijk', 'United Kingdom', 54.0, -2.0, 6, '[49.9,-8.6,60.9,1.8]'::jsonb, 2),
('fr', 'FR', 'europe', 'Frankrijk', 'France', 46.6, 2.35, 6, '[41.3,-5.1,51.1,9.6]'::jsonb, 2),
('be', 'BE', 'europe', 'België', 'Belgium', 50.64, 4.67, 7, '[49.5,2.5,51.5,6.4]'::jsonb, 2),
('us', 'US', 'americas', 'Verenigde Staten', 'United States', 39.8, -98.5, 4, '[24.5,-125,49.5,-66]'::jsonb, 2),
('sa', 'SA', 'gcc', 'Saudi-Arabië', 'Saudi Arabia', 24.0, 45.0, 5, '[16.0,34.5,32.2,55.7]'::jsonb, 2),
('qa', 'QA', 'gcc', 'Qatar', 'Qatar', 25.35, 51.18, 8, '[24.4,50.7,26.2,51.7]'::jsonb, 2),
('ma', 'MA', 'africa', 'Marokko', 'Morocco', 31.79, -7.09, 6, '[21.0,-17.0,36.0,-1.0]'::jsonb, 3),
('tr', 'TR', 'europe', 'Turkije', 'Turkey', 39.0, 35.0, 6, '[36.0,26.0,42.1,45.0]'::jsonb, 3),
('my', 'MY', 'asia', 'Maleisië', 'Malaysia', 4.21, 101.98, 6, '[0.8,99.6,7.4,119.3]'::jsonb, 3),
('id', 'ID', 'asia', 'Indonesia', 'Indonesia', -2.5, 118.0, 5, '[-11.0,95.0,6.0,141.0]'::jsonb, 3),
('au', 'AU', 'oceania', 'Australië', 'Australia', -25.27, 133.78, 4, '[-44.0,112.9,-10.0,154.0]'::jsonb, 3)
ON CONFLICT (code) DO NOTHING;
-- Global caterer brands (tier 1 + NL)
INSERT INTO export_caterer_brands (code, name, parent_brand_code, hq_country_iso2, website, tier) VALUES
('compass', 'Compass Group', NULL, 'GB', 'https://www.compass-group.com', 1),
('eurest', 'Eurest', 'compass', 'GB', 'https://www.eurest.nl', 1),
('sodexo', 'Sodexo', NULL, 'FR', 'https://www.sodexo.com', 1),
('aramark', 'Aramark', NULL, 'US', 'https://www.aramark.com', 1),
('elior', 'Elior Group', NULL, 'FR', 'https://www.eliorgroup.com', 1),
('iss', 'ISS A/S', NULL, 'DK', 'https://www.issworld.com', 1),
('albron', 'Albron', NULL, 'NL', 'https://www.albron.nl', 2),
('hutten', 'Hutten Catering', NULL, 'NL', 'https://www.hutten.nl', 2),
('appel', 'Appèl Catering', NULL, 'NL', 'https://www.appel.nl', 2),
('vermaat', 'Vermaat', NULL, 'NL', 'https://www.vermaat.nl', 2),
('restoplan', 'Restoplan', NULL, 'NL', 'https://www.restoplan.nl', 2),
('vitam', 'Vitam', NULL, 'NL', 'https://www.vitam.nl', 2)
ON CONFLICT (code) DO NOTHING;
-- Caterer presence (NL + sample international)
INSERT INTO export_caterer_presence (brand_code, country_iso2, local_legal_name, service_lines, procurement_model, supplier_entry_point) VALUES
('albron', 'NL', 'Albron Nederland BV', '["workplace","education","healthcare","travel_hospitality"]'::jsonb, 'central_national', 'national_procurement'),
('hutten', 'NL', 'Hutten Business Catering BV', '["workplace","events_banqueting"]'::jsonb, 'regional', 'category_manager'),
('appel', 'NL', 'Appèl B.V.', '["education","workplace"]'::jsonb, 'regional', 'category_manager'),
('vermaat', 'NL', 'Vermaat Bedrijfshoreca B.V.', '["workplace","events_banqueting"]'::jsonb, 'central_national', 'national_procurement'),
('eurest', 'NL', 'Eurest Nederland BV', '["workplace","integrated_fm"]'::jsonb, 'central_national', 'national_procurement'),
('sodexo', 'NL', 'Sodexo BV', '["workplace","education","healthcare"]'::jsonb, 'central_national', 'tender_portal'),
('iss', 'NL', 'ISS Facility Services', '["integrated_fm","workplace"]'::jsonb, 'central_national', 'national_procurement'),
('sodexo', 'AE', 'Sodexo Middle East', '["workplace","healthcare","travel_hospitality"]'::jsonb, 'central_national', 'national_procurement'),
('compass', 'GB', 'Compass Group UK', '["workplace","sports_leisure"]'::jsonb, 'central_national', 'national_procurement'),
('sodexo', 'FR', 'Sodexo France', '["workplace","education","healthcare"]'::jsonb, 'central_national', 'tender_portal'),
('aramark', 'US', 'Aramark', '["workplace","sports_leisure","education"]'::jsonb, 'central_national', 'national_procurement')
ON CONFLICT (brand_code, country_iso2) DO NOTHING;
-- Distributors (Caribbean fase 1 seeds)
INSERT INTO export_market_entities (name, entity_type, country_iso2, territory_code, city, website, source, confidence, product_interest, volume_band)
SELECT v.name, v.entity_type, v.country_iso2, v.territory_code, v.city, v.website, v.source, v.confidence, v.product_interest, v.volume_band
FROM (VALUES
('EWT / Anur Curaçao', 'distributor', 'CW', 'cw', 'Willemstad', 'https://ewtcuracao.com', 'manual', 80, '["chicken","shoarma","beef"]'::jsonb, 'container'),
('Caribbean Overseas', 'distributor', 'AW', 'aw', 'Oranjestad', 'https://caribbeanoverseas.com', 'manual', 75, '["chicken","shoarma"]'::jsonb, 'pallet'),
('Compra Aruba', 'distributor', 'AW', 'aw', 'Oranjestad', 'https://compra-aruba.com', 'manual', 75, '["chicken","beef"]'::jsonb, 'pallet'),
('Fresh Supplier Bonaire', 'distributor', 'BQ', 'bq', 'Kralendijk', 'https://freshsupplierbonaire.com', 'manual', 70, '["chicken","shoarma"]'::jsonb, 'pallet'),
('Ferrara Food Group', 'distributor', 'CW', 'cw', 'Willemstad', NULL, 'manual', 65, '["chicken","beef"]'::jsonb, 'pallet'),
('Pietersz Foodservice', 'wholesaler', 'NL', 'nl', 'Rotterdam', NULL, 'manual', 70, '["chicken","shoarma"]'::jsonb, 'pallet')
) AS v(name, entity_type, country_iso2, territory_code, city, website, source, confidence, product_interest, volume_band)
WHERE NOT EXISTS (
SELECT 1 FROM export_market_entities e WHERE e.name = v.name AND e.country_iso2 = v.country_iso2
);
-- NL contract caterers as entities
INSERT INTO export_market_entities (name, entity_type, country_iso2, territory_code, city, website, brand_code, source, confidence, product_interest)
SELECT v.name, v.entity_type, v.country_iso2, v.territory_code, v.city, v.website, v.brand_code, v.source, v.confidence, v.product_interest
FROM (VALUES
('Albron Nederland', 'contract_caterer', 'NL', 'nl', 'Utrecht', 'https://www.albron.nl', 'albron', 'caterer_registry', 85, '["chicken","shoarma"]'::jsonb),
('Hutten Business Catering', 'contract_caterer', 'NL', 'nl', 'Eindhoven', 'https://www.hutten.nl', 'hutten', 'caterer_registry', 85, '["chicken","shoarma"]'::jsonb),
('Appèl Catering', 'contract_caterer', 'NL', 'nl', 'Veghel', 'https://www.appel.nl', 'appel', 'caterer_registry', 85, '["chicken","shoarma"]'::jsonb),
('Vermaat Bedrijfshoreca', 'contract_caterer', 'NL', 'nl', 'Hoofddorp', 'https://www.vermaat.nl', 'vermaat', 'caterer_registry', 85, '["chicken","shoarma"]'::jsonb),
('Sodexo Nederland', 'contract_caterer', 'NL', 'nl', 'Amsterdam', 'https://www.sodexo.nl', 'sodexo', 'caterer_registry', 80, '["chicken","shoarma","beef"]'::jsonb),
('Eurest Nederland', 'contract_caterer', 'NL', 'nl', 'Amsterdam', 'https://www.eurest.nl', 'eurest', 'caterer_registry', 80, '["chicken","shoarma"]'::jsonb)
) AS v(name, entity_type, country_iso2, territory_code, city, website, brand_code, source, confidence, product_interest)
WHERE NOT EXISTS (
SELECT 1 FROM export_market_entities e WHERE e.name = v.name AND e.country_iso2 = v.country_iso2
);
-- Sample contacts (fase A — meer volgt in fase B enrichment)
INSERT INTO export_entity_contacts (entity_id, role, name, email, phone, source, confidence, is_primary)
SELECT e.id, 'sales', 'Sales', 'info@ewtcuracao.com', '+59997371234', 'manual', 70, TRUE
FROM export_market_entities e
WHERE e.name = 'EWT / Anur Curaçao'
AND NOT EXISTS (SELECT 1 FROM export_entity_contacts c WHERE c.entity_id = e.id AND c.email = 'info@ewtcuracao.com')
LIMIT 1;
INSERT INTO export_entity_contacts (entity_id, role, name, email, source, confidence, is_primary)
SELECT e.id, 'procurement', 'Inkoop', 'inkoop@albron.nl', 'manual', 60, TRUE
FROM export_market_entities e
WHERE e.name = 'Albron Nederland'
AND NOT EXISTS (SELECT 1 FROM export_entity_contacts c WHERE c.entity_id = e.id AND c.email = 'inkoop@albron.nl')
LIMIT 1;
INSERT INTO export_entity_contacts (entity_id, role, name, email, source, confidence, is_primary)
SELECT e.id, 'procurement', 'Inkoop', 'info@hutten.nl', 'manual', 55, TRUE
FROM export_market_entities e
WHERE e.name = 'Hutten Business Catering'
AND NOT EXISTS (SELECT 1 FROM export_entity_contacts c WHERE c.entity_id = e.id AND c.email = 'info@hutten.nl')
LIMIT 1;
INSERT INTO export_entity_contacts (entity_id, role, name, email, source, confidence, is_primary)
SELECT e.id, 'procurement', 'Inkoop', 'info@appel.nl', 'manual', 55, TRUE
FROM export_market_entities e
WHERE e.name = 'Appèl Catering'
AND NOT EXISTS (SELECT 1 FROM export_entity_contacts c WHERE c.entity_id = e.id AND c.email = 'info@appel.nl')
LIMIT 1;
-- Gov sources sample
INSERT INTO export_gov_data_sources (country_iso2, name, category, url)
SELECT v.country_iso2, v.name, v.category, v.url
FROM (VALUES
('NL', 'CBS Open Data BES', 'stats', 'https://opendata.cbs.nl'),
('AW', 'CBS Aruba', 'stats', 'https://www.cbs.aw'),
('CW', 'CBS Curaçao', 'stats', 'https://www.cbs.cw'),
('AE', 'Dubai Pulse', 'stats', 'https://www.dubaipulse.gov.ae'),
('NL', 'TenderNed', 'tenders', 'https://www.tenderned.nl'),
('EU', 'TED Europa', 'tenders', 'https://ted.europa.eu')
) AS v(country_iso2, name, category, url)
WHERE NOT EXISTS (
SELECT 1 FROM export_gov_data_sources g WHERE g.name = v.name AND g.country_iso2 = v.country_iso2
);
-- Geo coordinates for map (fase A)
UPDATE export_market_entities SET lat = 12.108, lon = -68.933 WHERE name = 'EWT / Anur Curaçao';
UPDATE export_market_entities SET lat = 12.524, lon = -70.027 WHERE name = 'Caribbean Overseas';
UPDATE export_market_entities SET lat = 12.524, lon = -70.027 WHERE name = 'Compra Aruba';
UPDATE export_market_entities SET lat = 12.144, lon = -68.265 WHERE name = 'Fresh Supplier Bonaire';
UPDATE export_market_entities SET lat = 12.108, lon = -68.933 WHERE name = 'Ferrara Food Group';
UPDATE export_market_entities SET lat = 51.92, lon = 4.48 WHERE name = 'Pietersz Foodservice';
UPDATE export_market_entities SET lat = 52.09, lon = 5.12 WHERE name = 'Albron Nederland';
UPDATE export_market_entities SET lat = 51.44, lon = 5.48 WHERE name = 'Hutten Business Catering';
UPDATE export_market_entities SET lat = 51.61, lon = 5.55 WHERE name = 'Appèl Catering';
UPDATE export_market_entities SET lat = 52.30, lon = 4.69 WHERE name = 'Vermaat Bedrijfshoreca';
UPDATE export_market_entities SET lat = 52.37, lon = 4.90 WHERE name = 'Sodexo Nederland';
UPDATE export_market_entities SET lat = 52.37, lon = 4.90 WHERE name = 'Eurest Nederland';