-- camping_registry.sql — registre des CAMPINGS + géoloc de remplacement FIXE sur tous leurs lots. -- -- Problème : pour un lot de camping, l'adresse du Service Location est souvent l'adresse de RÉSIDENCE du -- client (ex. « 428 Rue … ») et la rue interne du camping (ex. « 2 rue Canard, Lac des Pins ») n'existe pas -- dans le RQA → géoloc fausse. Solution : une coordonnée FIXE = l'adresse principale du camping (le tech -- navigue jusqu'au camping, puis trouve le terrain sur place). Data-driven (table) → réutilisable + éditable. -- -- Idempotent : CREATE IF NOT EXISTS + seed WHERE NOT EXISTS + apply re-jouable. Match par VILLE normalisée. \timing on BEGIN; CREATE TABLE IF NOT EXISTS camping_registry ( id serial PRIMARY KEY, keyword text NOT NULL UNIQUE, -- motif (minuscule, sans accent) cherché dans la ville du Service Location name text NOT NULL, -- nom du camping address text, -- adresse principale (référence affichée) latitude double precision NOT NULL, longitude double precision NOT NULL, active boolean DEFAULT true, created_at timestamp DEFAULT now() ); -- Seed (coords = adresse principale, relevées dans le legacy delivery). Plusieurs motifs → même camping/coords. INSERT INTO camping_registry (keyword, name, address, latitude, longitude) SELECT * FROM (VALUES ('lac des pins', 'Camping Lac des Pins', '3625 Route 201, Saint-Antoine-Abbé J0S 1N0', 45.062428, -73.911331), ('lac de pins', 'Camping Lac des Pins', '3625 Route 201, Saint-Antoine-Abbé J0S 1N0', 45.062428, -73.911331), ('dauphinais', 'Camping Le Domaine Dauphinais', '199 Route 219 Sud, Hemmingford J0L 1H0', 45.023808, -73.608696), ('sandysun', 'Camping du Lac SandySun', '1935A Chemin Grimshaw, Franklin J0S 1E0', 45.048569, -73.916870), ('sandy sun', 'Camping du Lac SandySun', '1935A Chemin Grimshaw, Franklin J0S 1E0', 45.048569, -73.916870), ('frontiere', 'Camping Frontière', '474 Chemin Covey Hill, Havelock J0S 2C0', 45.018734, -73.761551), ('ensoleill', 'Camping Domaine Ensoleillé', '524 Rang St-Paul, Saint-Rémi J0L 2L0', 45.267612, -73.600517) ) v(keyword,name,address,latitude,longitude) WHERE NOT EXISTS (SELECT 1 FROM camping_registry c WHERE c.keyword = v.keyword); -- Application : force la géoloc du camping sur tous les lots (match ville normalisée). Conserve address_line -- (le n° de terrain/rue interne reste visible) ; linked_address = le camping ; statut = validated (coord de service OK). WITH applied AS ( UPDATE "tabService Location" sl SET latitude = c.latitude, longitude = c.longitude, linked_address = c.name || ' — ' || COALESCE(c.address, ''), aq_address_id = NULL, address_validation_status = 'validated', address_validated_at = NOW(), modified = NOW() FROM camping_registry c WHERE c.active AND lower(unaccent(coalesce(sl.city, ''))) LIKE '%' || c.keyword || '%' RETURNING c.name AS camping ) SELECT camping, count(*) AS lots_corriges FROM applied GROUP BY camping ORDER BY 2 DESC; COMMIT;