Two bugs from the Slice B1 Berufung rollout, one fix surface:
Bug A — duplicate side selectors collapse into ONE proactive-side
picker with per-proceeding role labels. The Verfahrensablauf used to
show both ?side= (Klägerseite/Beklagtenseite) AND ?appellant= (same
labels in case-form) on the Berufung tile. Now: one side picker, with
labels that swap to Berufungskläger/Berufungsbeklagter on the unified
upc.apl.unified tile (and Antragsteller/Antragsgegner Nichtigkeit on
upc.rev.cfi, Einsprechende(r)/Patentinhaber(in) on epa.opp.*).
Bug B — 'Auslösendes Ereignis' label derives from appeal_target on
the unified Berufung tile (5 target-specific strings) instead of the
proceeding's own trigger_event_label. Endentscheidung (R.118) /
Kostenentscheidung / Anordnung / Entscheidung im
Schadensbemessungsverfahren / Anordnung der Bucheinsicht.
Migration 137 (additive, no triggers on proceeding_types — verified
via mcp__supabase__execute_sql before drafting; no updated_at on the
table — lesson from mig 134 HOTFIX 3; no audit_reason setup needed):
- ADD COLUMN role_proactive_label_de (text NULL)
- ADD COLUMN role_proactive_label_en (text NULL)
- ADD COLUMN role_reactive_label_de (text NULL)
- ADD COLUMN role_reactive_label_en (text NULL)
- Audit-first DO block lists the rows the UPDATE will touch.
- Backfill 4 proceedings (upc.apl.unified + upc.rev.cfi +
epa.opp.opd + epa.opp.boa); every other proceeding stays NULL
and the renderer falls back to default labels.
- Down drops the 4 columns.
Package additions (pkg/litigationplanner):
- ProceedingType gains 4 *string fields (RoleProactive/Reactive
LabelDE/EN) — db tags match the new columns; existing scans pick
them up via the proceedingTypeColumns extension.
- TriggerEventLabelForAppealTarget(target, lang) — Go-side map of
the 5 appeal-target slugs to their DE/EN trigger-event labels.
Empty result on unknown target signals "fall back to proceeding's
own trigger_event_label".
- Engine override: when CalcOptions.AppealTarget is set, the
resulting Timeline.TriggerEventLabel/EN are replaced from the
per-target map.
Frontend:
- Removed #appellant-row div (was a separate 3-radio selector
duplicating side).
- Dropped ?appellant= URL state + the change handler + the init
readback. The engine still consumes "appellant" — sourced from
currentSide for role-swap proceedings; null otherwise.
- applyRoleLabels(proceedingType) swaps the side-row radio labels
from a hardcoded ROLE_LABELS map mirroring mig 137's backfill.
Falls back to deadlines.side.claimant/defendant i18n keys for
proceedings without overrides.
- syncTriggerEventLabel reads data.triggerEventLabel from the calc
response — which the engine override now sets per appeal_target,
so no client-side mapping needed.
- i18n cleanup: removed orphan deadlines.appellant.* keys (label /
claimant / defendant / none) in both DE + EN.
Tests:
- pkg/litigationplanner/appeal_target_label_test.go pins the 5×2
label matrix + a coverage test that fails if a new entry in
AppealTargets is added without populating the label switch.
Acceptance:
- go build + go test all green (incl. new lp test).
- bun run build clean (i18n codegen drops 4 keys, regenerates).
- Live-DB audit before drafting confirmed: 4 target columns don't
exist on proceeding_types, zero triggers on the table, exact
column inventory matches the design.
138 lines
5.5 KiB
SQL
138 lines
5.5 KiB
SQL
-- 137_proceeding_role_labels — t-paliad-301, m/paliad#132
|
|
--
|
|
-- Bug A fix: per-proceeding role labels so the Verfahrensablauf side
|
|
-- selector can render "Berufungskläger / Berufungsbeklagter" for the
|
|
-- unified UPC Berufung tile instead of the generic "Klägerseite /
|
|
-- Beklagtenseite".
|
|
--
|
|
-- Four new optional columns on paliad.proceeding_types. NULL on a
|
|
-- column falls back to the language-default ("Klägerseite" / "Claimant
|
|
-- side" / "Beklagtenseite" / "Defendant side") in the frontend renderer.
|
|
-- Only the proceedings whose role-naming actually differs get a backfill.
|
|
--
|
|
-- Live-DB audit (mcp__supabase__execute_sql) before drafting:
|
|
-- - paliad.proceeding_types has 14 columns; the 4 target columns do
|
|
-- NOT exist (zero name collisions).
|
|
-- - Zero triggers on paliad.proceeding_types. No audit_reason
|
|
-- setup needed.
|
|
-- - No updated_at / created_at on the table — DO NOT include
|
|
-- timestamp UPDATEs (lesson from mig 134 HOTFIX 3).
|
|
--
|
|
-- ADDITIVE ONLY. ALTER + UPDATE statements; no CHECK constraints
|
|
-- (the columns are free-text labels, validated at the application layer).
|
|
-- Down migration drops the 4 columns.
|
|
--
|
|
-- See m/paliad#132 for the full design rationale + the role-label
|
|
-- matrix per proceeding code.
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- 1. Schema additions
|
|
-- ---------------------------------------------------------------
|
|
|
|
ALTER TABLE paliad.proceeding_types
|
|
ADD COLUMN role_proactive_label_de text NULL;
|
|
|
|
ALTER TABLE paliad.proceeding_types
|
|
ADD COLUMN role_proactive_label_en text NULL;
|
|
|
|
ALTER TABLE paliad.proceeding_types
|
|
ADD COLUMN role_reactive_label_de text NULL;
|
|
|
|
ALTER TABLE paliad.proceeding_types
|
|
ADD COLUMN role_reactive_label_en text NULL;
|
|
|
|
COMMENT ON COLUMN paliad.proceeding_types.role_proactive_label_de IS
|
|
'DE label for the proactive (claimant-equivalent) side of this '
|
|
'proceeding. NULL = renderer falls back to "Klägerseite". '
|
|
't-paliad-301 / m/paliad#132 Bug A.';
|
|
COMMENT ON COLUMN paliad.proceeding_types.role_proactive_label_en IS
|
|
'EN label for the proactive side. NULL = "Claimant side".';
|
|
COMMENT ON COLUMN paliad.proceeding_types.role_reactive_label_de IS
|
|
'DE label for the reactive (defendant-equivalent) side. NULL = '
|
|
'"Beklagtenseite".';
|
|
COMMENT ON COLUMN paliad.proceeding_types.role_reactive_label_en IS
|
|
'EN label for the reactive side. NULL = "Defendant side".';
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- 2. Audit-first NOTICE pass.
|
|
--
|
|
-- Lists which proceeding_types are about to receive a backfill so
|
|
-- the operator sees the scope before the UPDATE fires. NULL columns
|
|
-- on every other row stay NULL (the frontend falls back to defaults).
|
|
-- ---------------------------------------------------------------
|
|
|
|
DO $$
|
|
DECLARE
|
|
rec record;
|
|
backfill_count int := 0;
|
|
BEGIN
|
|
RAISE NOTICE '[mig 137] Proceedings that will receive role-label backfill:';
|
|
FOR rec IN
|
|
SELECT code, name
|
|
FROM paliad.proceeding_types
|
|
WHERE code IN ('upc.apl.unified', 'upc.rev.cfi', 'epa.opp.opd', 'epa.opp.boa')
|
|
ORDER BY code
|
|
LOOP
|
|
RAISE NOTICE '[mig 137] % %', rec.code, rec.name;
|
|
backfill_count := backfill_count + 1;
|
|
END LOOP;
|
|
RAISE NOTICE '[mig 137] Total: % proceedings (others stay NULL → renderer default)', backfill_count;
|
|
END $$;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- 3. Backfill.
|
|
--
|
|
-- Per the design matrix in m/paliad#132:
|
|
-- - upc.apl.unified → Berufungskläger / Berufungsbeklagter / Appellant / Appellee
|
|
-- - upc.rev.cfi → Antragsteller (Nichtigkeit) / Antragsgegner (Nichtigkeit) /
|
|
-- Revocation claimant / Revocation defendant
|
|
-- - epa.opp.opd → Einsprechende(r) / Patentinhaber(in) /
|
|
-- Opponent / Patentee
|
|
-- - epa.opp.boa → Einsprechende(r) / Patentinhaber(in) /
|
|
-- Opponent / Patentee
|
|
-- - (others) → stay NULL → frontend defaults
|
|
-- ---------------------------------------------------------------
|
|
|
|
UPDATE paliad.proceeding_types
|
|
SET role_proactive_label_de = 'Berufungskläger',
|
|
role_reactive_label_de = 'Berufungsbeklagter',
|
|
role_proactive_label_en = 'Appellant',
|
|
role_reactive_label_en = 'Appellee'
|
|
WHERE code = 'upc.apl.unified';
|
|
|
|
UPDATE paliad.proceeding_types
|
|
SET role_proactive_label_de = 'Antragsteller (Nichtigkeit)',
|
|
role_reactive_label_de = 'Antragsgegner (Nichtigkeit)',
|
|
role_proactive_label_en = 'Revocation claimant',
|
|
role_reactive_label_en = 'Revocation defendant'
|
|
WHERE code = 'upc.rev.cfi';
|
|
|
|
UPDATE paliad.proceeding_types
|
|
SET role_proactive_label_de = 'Einsprechende(r)',
|
|
role_reactive_label_de = 'Patentinhaber(in)',
|
|
role_proactive_label_en = 'Opponent',
|
|
role_reactive_label_en = 'Patentee'
|
|
WHERE code IN ('epa.opp.opd', 'epa.opp.boa');
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- 4. Post-migration NOTICE — informational only.
|
|
-- ---------------------------------------------------------------
|
|
|
|
DO $$
|
|
DECLARE
|
|
rec record;
|
|
BEGIN
|
|
RAISE NOTICE '[mig 137] post: backfilled role-label distribution:';
|
|
FOR rec IN
|
|
SELECT code,
|
|
role_proactive_label_de,
|
|
role_reactive_label_de
|
|
FROM paliad.proceeding_types
|
|
WHERE role_proactive_label_de IS NOT NULL
|
|
ORDER BY code
|
|
LOOP
|
|
RAISE NOTICE '[mig 137] % proactive=% reactive=%',
|
|
rec.code, rec.role_proactive_label_de, rec.role_reactive_label_de;
|
|
END LOOP;
|
|
END $$;
|