-- ============================================================================ -- 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 $$;