-- CF-3127: seed per-tenant glossary terms derived from memory/*.md feedback rules. -- Idempotent via ON CONFLICT on the uq_glossary_term_tenant partial unique index. BEGIN; INSERT INTO glossary_terms (id, customer_id, tenant, source_term, target_term, source_lang, target_lang, is_dnt, notes, created_at) VALUES -- clicksports.de: "Support" is forbidden; always translate/map to "Service" -- (uq index doesn't include source_lang, so only one (tenant, term, target_lang) row) (gen_random_uuid(), NULL, 'clicksports.de', 'Support', 'Service', 'de', 'de', false, 'House style: never "Support" (applies to any source lang targeting DE)', now()), (gen_random_uuid(), NULL, 'clicksports.de', 'Support-Ticket', 'Service-Ticket', 'de', 'de', false, 'House style', now()), -- vpn-marketing: rewrite-targets for forbidden_terms (gen_random_uuid(), NULL, 'vpn-marketing', 'Hetzner', 'Cloud-Server in Deutschland', 'de', 'de', false, 'Never name the hoster', now()), (gen_random_uuid(), NULL, 'vpn-marketing', 'Hetzner', 'Cloud server in Germany', 'de', 'en', false, 'Never name the hoster', now()), (gen_random_uuid(), NULL, 'vpn-marketing', 'AdGuardHome', 'curated blocklists (HaGeZi, OISD, Cloudflare top-10k allowlist)', 'de', 'de', false, 'Do not name AdGuardHome', now()), (gen_random_uuid(), NULL, 'vpn-marketing', 'AdGuardHome', 'curated blocklists (HaGeZi, OISD, Cloudflare top-10k allowlist)', 'en', 'en', false, 'Do not name AdGuardHome', now()), -- ifk: brand name as DNT (gen_random_uuid(), NULL, 'ifk', 'Internet for Kids', 'Internet for Kids', 'en', 'de', true, 'Brand name; never translate', now()), (gen_random_uuid(), NULL, 'ifk', 'Internet for Kids', 'Internet for Kids', 'en', 'fr', true, 'Brand name; never translate', now()), -- matrixhost: brand DNT (gen_random_uuid(), NULL, 'matrixhost', 'MatrixHost', 'MatrixHost', 'en', 'de', true, 'Brand', now()), (gen_random_uuid(), NULL, 'matrixhost', 'Matrix', 'Matrix', 'en', 'de', true, 'Protocol name', now()), -- agiliton: brand DNT (gen_random_uuid(), NULL, 'agiliton', 'Agiliton', 'Agiliton', 'de', 'en', true, 'Brand', now()), -- etoro: platform/brand DNT (gen_random_uuid(), NULL, 'etoro', 'eToro', 'eToro', 'en', 'de', true, 'Brand', now()), (gen_random_uuid(), NULL, 'etoro', 'eToro', 'eToro', 'en', 'fr', true, 'Brand', now()), (gen_random_uuid(), NULL, 'etoro', 'CopyTrading', 'CopyTrading', 'en', 'de', true, 'Product name', now()) ON CONFLICT (tenant, LOWER(source_term), target_lang, COALESCE(context_hint, '')) WHERE tenant IS NOT NULL DO UPDATE SET target_term = EXCLUDED.target_term, is_dnt = EXCLUDED.is_dnt, notes = EXCLUDED.notes, updated_at = now(); COMMIT;