Campings : registre + géoloc de remplacement FIXE sur tous les lots (1405 corrigés)

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) <noreply@anthropic.com>
This commit is contained in:
louispaulb 2026-06-07 17:04:03 -04:00
parent 50d877b49f
commit d6453757d1

View File

@ -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;