135 lines
4.5 KiB
PL/PgSQL
135 lines
4.5 KiB
PL/PgSQL
-- ============================================================================
|
|
-- 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 em.tmodule_id FROM economic_matches em)
|
|
),
|
|
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 $$;
|