Files
paliad/internal/db/migrations/051_proceeding_display_order.down.sql
m 63eb5bde6f feat(t-paliad-134): pill ordering + name standardisation + chip dedup
Five m's-bookmark fixes on top of the B1 surface change:

1. Sort proceeding pills inside concept cards by real-world frequency.
   New paliad.proceeding_types.display_order column (m's spec values:
   UPC_INF=10, DE_INF=20, UPC_REV=30, ..., UPC_PI=920, ...). Default
   999 for unmapped legacy codes. Search service surfaces it through
   the deadline_search matview (rebuilt to add the column) and uses
   it as primary key in pillSortKey, replacing the jurisdiction-rank.

2. Name standardisation: -klage → -verfahren on the proceeding-types
   that describe a multi-step process. Specifically:
     UPC_REV  Nichtigkeitsklage              → Nichtigkeitsverfahren
     UPC_APP  Berufung                       → Berufungsverfahren
     DE_INF   Verletzungsklage (LG)          → Verletzungsverfahren (LG)
     DE_INF_OLG, DE_NULL_BGH, DPMA_OPP, DPMA_BPATG_BESCHWERDE,
     UPC_COST_APPEAL, UPC_APP_ORDERS, DPMA_BGH_RB, DE_INF_BGH —
     same -verfahren standardisation.

3. legal_source for rev.defence × UPC_REV: was NULL, leaking the
   internal local_code 'rev.defence' to the UI. Set to UPC.RoP.49.1
   (Defence to Application for Revocation, R.49.1).

4. Frontend renderPill no longer falls back to rule_local_code when
   legal_source is missing — the source span just collapses, so no
   internal slug ever shows up as a "citation".

5. Quick-pick chips refactored to a slug-based array (QUICK_CHIPS) in
   fristenrechner.tsx, single source of truth for both fork-shortcut
   and B2-search-bar rows. Each chip carries data-chip-name-de /
   data-chip-name-en; relabelChips() rewrites visible text per active
   language. Dropped the duplicate "Statement of Defence" chip (same
   concept as "Klageerwiderung"). Each chip now maps to one concept
   slug — Klageerwiderung→statement-of-defence, Berufung→notice-of-
   appeal, Einspruch→opposition, Replik→reply-to-defence,
   Beschwerde→nichtzulassungsbeschwerde, Schadensbemessung→
   application-for-determination-of-damages, Wiedereinsetzung→
   wiedereinsetzung.

Migration 051 uses RAISE WARNING (not EXCEPTION) on coverage gates
per the 049 outage lesson — partial-migration recovery beats whole-
transaction failure. Matview rebuild stays inside the transaction;
RefreshSearchView() on next boot is a cheap no-op.
2026-05-05 11:53:13 +02:00

84 lines
4.9 KiB
PL/PgSQL

-- Down: restore prior names + drop display_order column.
BEGIN;
UPDATE paliad.proceeding_types SET name = 'Nichtigkeitsklage' WHERE code = 'UPC_REV';
UPDATE paliad.proceeding_types SET name = 'Berufung' WHERE code = 'UPC_APP';
UPDATE paliad.proceeding_types SET name = 'Verletzungsklage (LG)' WHERE code = 'DE_INF';
UPDATE paliad.proceeding_types SET name = 'Berufung OLG (Verletzung)' WHERE code = 'DE_INF_OLG';
UPDATE paliad.proceeding_types SET name = 'Berufung BGH (Nichtigkeit)' WHERE code = 'DE_NULL_BGH';
UPDATE paliad.proceeding_types SET name = 'Beschwerde BPatG (DPMA)' WHERE code = 'DPMA_BPATG_BESCHWERDE';
UPDATE paliad.proceeding_types SET name = 'Einspruch DPMA' WHERE code = 'DPMA_OPP';
UPDATE paliad.proceeding_types SET name = 'Berufung Kostenentscheidung' WHERE code = 'UPC_COST_APPEAL';
UPDATE paliad.proceeding_types SET name = 'Berufung Anordnungen' WHERE code = 'UPC_APP_ORDERS';
UPDATE paliad.proceeding_types SET name = 'Rechtsbeschwerde BGH' WHERE code = 'DPMA_BGH_RB';
UPDATE paliad.proceeding_types SET name = 'Revision/NZB BGH (Verletzung)' WHERE code = 'DE_INF_BGH';
UPDATE paliad.deadline_rules dr
SET legal_source = NULL,
rule_code = NULL
FROM paliad.proceeding_types p
WHERE dr.proceeding_type_id = p.id
AND p.code = 'UPC_REV'
AND dr.code = 'rev.defence'
AND dr.legal_source = 'UPC.RoP.49.1';
-- Recreate matview without proceeding_display_order, then drop column.
DROP MATERIALIZED VIEW IF EXISTS paliad.deadline_search;
CREATE MATERIALIZED VIEW paliad.deadline_search AS
SELECT
'rule'::text AS kind,
'r:' || dr.id::text AS row_key,
dc.id AS concept_id,
dc.slug AS concept_slug,
dc.name_de AS concept_name_de,
dc.name_en AS concept_name_en,
dc.description AS concept_description,
dc.aliases AS concept_aliases,
dc.party AS concept_party,
dc.category AS concept_category,
dc.sort_order AS concept_sort_order,
dr.id AS rule_id,
NULL::bigint AS trigger_event_id,
pt.code AS proceeding_code,
pt.name AS proceeding_name_de,
pt.name_en AS proceeding_name_en,
pt.jurisdiction AS jurisdiction,
dr.code AS rule_local_code,
dr.name AS rule_name_de,
dr.name_en AS rule_name_en,
dr.legal_source AS legal_source,
dr.rule_code AS rule_code,
dr.duration_value,
dr.duration_unit,
dr.timing,
COALESCE(dr.primary_party, dc.party) AS effective_party
FROM paliad.deadline_rules dr
JOIN paliad.proceeding_types pt ON pt.id = dr.proceeding_type_id
JOIN paliad.deadline_concepts dc ON dc.id = dr.concept_id
WHERE dr.is_active AND pt.is_active AND pt.category = 'fristenrechner'
UNION ALL
SELECT
'trigger'::text, 't:' || te.id::text, dc.id, dc.slug, dc.name_de,
dc.name_en, dc.description, dc.aliases, dc.party, dc.category,
dc.sort_order, NULL::uuid, te.id, NULL::text, NULL::text, NULL::text,
'cross-cutting'::text, te.code, te.name_de, te.name, NULL::text,
NULL::text, NULL::int, NULL::text, NULL::text, dc.party
FROM paliad.trigger_events te
JOIN paliad.deadline_concepts dc ON dc.slug = te.concept_id
WHERE te.is_active;
CREATE UNIQUE INDEX deadline_search_row_key ON paliad.deadline_search (row_key);
CREATE INDEX deadline_search_concept_id ON paliad.deadline_search (concept_id);
CREATE INDEX deadline_search_proc_code ON paliad.deadline_search (proceeding_code);
CREATE INDEX deadline_search_legal_source ON paliad.deadline_search (legal_source);
CREATE INDEX deadline_search_effective_party ON paliad.deadline_search (effective_party);
CREATE INDEX deadline_search_legal_source_trgm ON paliad.deadline_search USING gin (legal_source gin_trgm_ops);
CREATE INDEX deadline_search_concept_de_trgm ON paliad.deadline_search USING gin (concept_name_de gin_trgm_ops);
CREATE INDEX deadline_search_concept_en_trgm ON paliad.deadline_search USING gin (concept_name_en gin_trgm_ops);
CREATE INDEX deadline_search_rule_de_trgm ON paliad.deadline_search USING gin (rule_name_de gin_trgm_ops);
CREATE INDEX deadline_search_rule_en_trgm ON paliad.deadline_search USING gin (rule_name_en gin_trgm_ops);
CREATE INDEX deadline_search_rule_code_trgm ON paliad.deadline_search USING gin (rule_code gin_trgm_ops);
ALTER TABLE paliad.proceeding_types DROP COLUMN IF EXISTS display_order;
COMMIT;