From d6453757d1ac5c90c3cc49c1133ee169e02044ad Mon Sep 17 00:00:00 2001 From: louispaulb Date: Sun, 7 Jun 2026 17:04:03 -0400 Subject: [PATCH] =?UTF-8?q?Campings=20:=20registre=20+=20g=C3=A9oloc=20de?= =?UTF-8?q?=20remplacement=20FIXE=20sur=20tous=20les=20lots=20(1405=20corr?= =?UTF-8?q?ig=C3=A9s)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problème : pour un lot de camping, l'adresse du Service Location = souvent la RÉSIDENCE du client, et la rue interne (ex. « 2 rue Canard, Lac des Pins ») n'est pas dans le RQA → géoloc fausse. Solution data-driven : table `camping_registry` (mot-clé ville → nom + adresse principale + GPS fixe), coords relevées dans le legacy delivery. Application : force lat/long du camping sur tous les lots (match ville normalisée), garde address_line (n° de terrain visible), linked_address = le camping, statut validated. Appliqué : Lac des Pins 1242 · Dauphinais 134 · SandySun 28 · Frontière 1 (+ Ensoleillé en registre). Idempotent + ré-applicable. scripts/migration/camping_registry.sql. Co-Authored-By: Claude Opus 4.8 (1M context) --- scripts/migration/camping_registry.sql | 54 ++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 scripts/migration/camping_registry.sql diff --git a/scripts/migration/camping_registry.sql b/scripts/migration/camping_registry.sql new file mode 100644 index 0000000..7304c39 --- /dev/null +++ b/scripts/migration/camping_registry.sql @@ -0,0 +1,54 @@ +-- 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;