Migration 054: Forbedret kunde-linking med economic_customer_number
This commit is contained in:
parent
91426a6c07
commit
ca42f0bc47
134
migrations/054_improve_tmodule_customer_linking.sql
Normal file
134
migrations/054_improve_tmodule_customer_linking.sql
Normal file
@ -0,0 +1,134 @@
|
||||
-- ============================================================================
|
||||
-- Migration 054: Forbedret kunde-linking med economic_customer_number
|
||||
-- ============================================================================
|
||||
-- Opdaterer linking logik til at prioritere economic_customer_number match
|
||||
-- over navn match for mere robust kunde-identifikation
|
||||
-- ============================================================================
|
||||
|
||||
-- Drop og genopret linking funktion med economic nummer prioritering
|
||||
DROP FUNCTION IF EXISTS link_tmodule_customers_to_hub();
|
||||
|
||||
CREATE OR REPLACE FUNCTION link_tmodule_customers_to_hub()
|
||||
RETURNS TABLE (
|
||||
tmodule_id INTEGER,
|
||||
tmodule_name TEXT,
|
||||
hub_id INTEGER,
|
||||
hub_name TEXT,
|
||||
action TEXT
|
||||
) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
WITH economic_matches AS (
|
||||
-- Prioriter economic_customer_number match (mest præcis)
|
||||
SELECT
|
||||
tc.id as tmodule_id,
|
||||
tc.name::TEXT as tmodule_name,
|
||||
c.id as hub_id,
|
||||
c.name::TEXT as hub_name,
|
||||
'economic_number_match'::TEXT as action
|
||||
FROM tmodule_customers tc
|
||||
JOIN customers c ON tc.economic_customer_number = c.economic_customer_number
|
||||
WHERE tc.hub_customer_id IS NULL
|
||||
AND tc.economic_customer_number IS NOT NULL
|
||||
AND c.economic_customer_number IS NOT NULL
|
||||
),
|
||||
name_matches AS (
|
||||
-- Fallback til navn match for kunder uden economic nummer
|
||||
SELECT
|
||||
tc.id as tmodule_id,
|
||||
tc.name::TEXT as tmodule_name,
|
||||
c.id as hub_id,
|
||||
c.name::TEXT as hub_name,
|
||||
'name_match'::TEXT as action
|
||||
FROM tmodule_customers tc
|
||||
JOIN customers c ON LOWER(TRIM(tc.name)) = LOWER(TRIM(c.name))
|
||||
WHERE tc.hub_customer_id IS NULL
|
||||
AND tc.id NOT IN (SELECT tmodule_id FROM economic_matches)
|
||||
),
|
||||
all_matches AS (
|
||||
SELECT * FROM economic_matches
|
||||
UNION ALL
|
||||
SELECT * FROM name_matches
|
||||
),
|
||||
updates AS (
|
||||
-- Opdater tmodule_customers med hub_customer_id
|
||||
UPDATE tmodule_customers tc
|
||||
SET hub_customer_id = m.hub_id,
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
FROM all_matches m
|
||||
WHERE tc.id = m.tmodule_id
|
||||
RETURNING tc.id, tc.name::TEXT, m.hub_id, m.hub_name, m.action
|
||||
)
|
||||
SELECT * FROM updates;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Opdater trigger til at tjekke både economic nummer og navn
|
||||
DROP TRIGGER IF EXISTS auto_link_tmodule_customer ON tmodule_customers;
|
||||
|
||||
CREATE OR REPLACE FUNCTION auto_link_tmodule_customer()
|
||||
RETURNS TRIGGER AS $$
|
||||
DECLARE
|
||||
matched_hub_id INTEGER;
|
||||
BEGIN
|
||||
-- Hvis hub_customer_id allerede er sat, skip
|
||||
IF NEW.hub_customer_id IS NOT NULL THEN
|
||||
RETURN NEW;
|
||||
END IF;
|
||||
|
||||
-- Først: prøv at matche på economic_customer_number (mest præcis)
|
||||
IF NEW.economic_customer_number IS NOT NULL THEN
|
||||
SELECT id INTO matched_hub_id
|
||||
FROM customers
|
||||
WHERE economic_customer_number = NEW.economic_customer_number
|
||||
LIMIT 1;
|
||||
|
||||
IF matched_hub_id IS NOT NULL THEN
|
||||
NEW.hub_customer_id := matched_hub_id;
|
||||
RAISE NOTICE 'Auto-linked tmodule_customer % to hub customer % via economic number %',
|
||||
NEW.name, matched_hub_id, NEW.economic_customer_number;
|
||||
RETURN NEW;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
-- Fallback: prøv navn match
|
||||
SELECT id INTO matched_hub_id
|
||||
FROM customers
|
||||
WHERE LOWER(TRIM(name)) = LOWER(TRIM(NEW.name))
|
||||
LIMIT 1;
|
||||
|
||||
IF matched_hub_id IS NOT NULL THEN
|
||||
NEW.hub_customer_id := matched_hub_id;
|
||||
RAISE NOTICE 'Auto-linked tmodule_customer % to hub customer % via name match',
|
||||
NEW.name, matched_hub_id;
|
||||
END IF;
|
||||
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER auto_link_tmodule_customer
|
||||
BEFORE INSERT OR UPDATE ON tmodule_customers
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION auto_link_tmodule_customer();
|
||||
|
||||
-- Kør linking for eksisterende kunder (re-link alle)
|
||||
DO $$
|
||||
DECLARE
|
||||
link_result RECORD;
|
||||
total_linked INTEGER := 0;
|
||||
BEGIN
|
||||
RAISE NOTICE 'Starting customer linking...';
|
||||
|
||||
FOR link_result IN SELECT * FROM link_tmodule_customers_to_hub() LOOP
|
||||
RAISE NOTICE 'Linked: % (tmodule_id=%) -> % (hub_id=%) via %',
|
||||
link_result.tmodule_name,
|
||||
link_result.tmodule_id,
|
||||
link_result.hub_name,
|
||||
link_result.hub_id,
|
||||
link_result.action;
|
||||
total_linked := total_linked + 1;
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE 'Customer linking complete. Total linked: %', total_linked;
|
||||
END $$;
|
||||
Loading…
Reference in New Issue
Block a user