Files
paliad/internal/db/migrations/044_dpma_proceedings.up.sql
m 25076142f4 feat(t-paliad-131): Phase B4 — DPMA proceeding chain
PR-5 of the Unified Fristenrechner. Three new proceeding types
covering the DPMA → BPatG → BGH opposition / appeal chain. Closes the
DPMA gap m named — paliad has had zero DPMA-specific timelines until
now (DPMA-granted patents in Nichtigkeit went to DE_NULL but the DPMA
opposition + Beschwerde + Rechtsbeschwerde chain had no home).

Migration 044 adds:

  - DPMA_OPP (Einspruch DPMA, sort=310): 4 rules. Anchor "Veröffentlichung
    der Erteilung" + Einspruchsfrist (PatG §59.1, 9mo) + Erwiderung
    Patentinhaber (PatG §59.3, court-set ~4mo, party=defendant) +
    DPMA-Entscheidung (court).
  - DPMA_BPATG_BESCHWERDE (Beschwerde BPatG, sort=320): 5 rules. Anchor
    "Zustellung DPMA-Entscheidung" + Beschwerde (PatG §73.2, 1mo) +
    Beschwerdebegründung (PatG §75.1, 1mo from filing, extension on
    request) + mündliche Verhandlung + BPatG-Entscheidung.
  - DPMA_BGH_RB (Rechtsbeschwerde BGH, sort=330): 4 rules. Anchor
    "Zustellung BPatG-Entscheidung" + Rechtsbeschwerde (PatG §100.1, 1mo)
    + Begründung (PatG §102 i.V.m. ZPO §551, 1mo from filing) +
    BGH-Entscheidung.

Naming note: head's PR brief listed the third type as
"DPMA_BPATG_NICHTIGKEIT" but Nichtigkeitsklage is filed directly at
BPatG (already covered by DE_NULL — never chained off DPMA). The
natural BGH endpoint of the DPMA chain is the Rechtsbeschwerde per
§§ 100/102 PatG. Using DPMA_BGH_RB; trivially renamable if head
intended a different shape.

Two new DE-only concepts: rechtsbeschwerde (BGH legal appeal — DE-
specific procedure, no UPC/EPC equivalent), rechtsbeschwerde-
begruendung. Other rules reuse shared concepts (publication,
opposition, statement-of-defence, notice-of-appeal, statement-of-
grounds-of-appeal, oral-hearing, decision).

Frontend: new DPMA tile group in /tools/fristenrechner with 3 tiles,
positioned after the EPA group. 5 new i18n keys (DE+EN: deadlines.dpma
group label + 3 tile names + tile labels for 3 procs).

Live-verified all 3 trees on paliad.de (tester@hlc.de):
  DPMA_OPP trigger 2026-05-04 → Einspruch 2027-02-04 (9mo) /
    Erwiderung 2027-06-04 (4mo from Einspruch).
  DPMA_BPATG_BESCHWERDE trigger 2026-05-04 → Beschwerde 2026-06-04
    (1mo) / Begründung 2026-07-06 (1mo from Beschwerde, weekend-shift).
  DPMA_BGH_RB trigger 2026-05-04 → Rechtsbeschwerde 2026-06-04 /
    Begründung 2026-07-06.
2026-05-05 02:48:31 +02:00

281 lines
16 KiB
SQL

-- t-paliad-131 Phase B4: DPMA proceeding types.
--
-- Three new types covering the DPMA → BPatG → BGH chain:
--
-- DPMA_OPP Einspruchsverfahren beim DPMA (PatG §59 ff.)
-- DPMA_BPATG_BESCHWERDE Beschwerde gegen DPMA-Entscheidungen (PatG §73 ff.)
-- DPMA_BGH_RB Rechtsbeschwerde beim BGH (PatG §100 ff.)
--
-- Naming note: head's PR brief named the third type
-- "DPMA_BPATG_NICHTIGKEIT" but Nichtigkeitsklage lives at BPatG already
-- via DE_NULL (a Nichtigkeitsklage is filed *directly* at BPatG, not
-- chained off DPMA). The natural BGH endpoint of the DPMA chain is the
-- Rechtsbeschwerde per §100/§102 PatG. Using DPMA_BGH_RB; if head meant
-- something else, can rename without data churn.
--
-- Rule sources:
-- PatG §59(1) — Einspruchsfrist DPMA: 9 Monate ab Veröffentlichung der Erteilung
-- PatG §59(3) — Erwiderung Patentinhaber: vom DPMA gesetzte Frist (typ. 4 Monate)
-- PatG §73(2) — Beschwerde BPatG: 1 Monat ab Zustellung der DPMA-Entscheidung
-- PatG §75(1) — Begründung der Beschwerde: 1 Monat ab Einreichung
-- der Beschwerde (verlängerbar auf Antrag)
-- PatG §100(1) — Rechtsbeschwerde BGH: 1 Monat ab Zustellung der BPatG-Entscheidung
-- PatG §102(2)/(3) — Begründung der Rechtsbeschwerde: 1 Monat ab Einlegung
-- ============================================================================
-- 1. New proceeding types
-- ============================================================================
INSERT INTO paliad.proceeding_types (code, name, name_en, description, jurisdiction, category, default_color, sort_order, is_active)
VALUES
('DPMA_OPP', 'Einspruch DPMA', 'Opposition DPMA',
'Einspruchsverfahren vor dem Deutschen Patent- und Markenamt (§ 59 ff. PatG). Trigger ist die Veröffentlichung der Patenterteilung im DPMA-Patentblatt.',
'DPMA', 'fristenrechner', '#1d4ed8', 310, true),
('DPMA_BPATG_BESCHWERDE', 'Beschwerde BPatG (DPMA)', 'Appeal BPatG (against DPMA Decision)',
'Beschwerdeverfahren beim BPatG gegen Entscheidungen des DPMA (§ 73 ff. PatG) — typisch nach abgeschlossenem Einspruch oder Patentprüfung.',
'DPMA', 'fristenrechner', '#1d4ed8', 320, true),
('DPMA_BGH_RB', 'Rechtsbeschwerde BGH', 'Legal Appeal BGH',
'Rechtsbeschwerde beim BGH gegen Entscheidungen des BPatG, beschränkt auf Rechtsfragen (§ 100 ff. PatG).',
'DPMA', 'fristenrechner', '#1d4ed8', 330, true)
ON CONFLICT (code) DO UPDATE SET
name = EXCLUDED.name,
name_en = EXCLUDED.name_en,
description = EXCLUDED.description,
jurisdiction = EXCLUDED.jurisdiction,
category = EXCLUDED.category,
default_color = EXCLUDED.default_color,
sort_order = EXCLUDED.sort_order,
is_active = EXCLUDED.is_active;
-- ============================================================================
-- 2. New DE-only concepts (Rechtsbeschwerde + Begründung)
-- ============================================================================
--
-- Other rules reuse existing shared concepts:
-- - publication → dpma_opp.publish (anchor)
-- - opposition → dpma_opp.einspruch
-- - statement-of-defence → dpma_opp.erwiderung
-- - decision → DPMA / BPatG / BGH terminal entscheidungen
-- - notice-of-appeal → dpma_bpatg.beschwerde (Beschwerde IS legally an appeal)
-- - statement-of-grounds-of-appeal → dpma_bpatg.begruendung
-- - oral-hearing → dpma_bpatg.termin
INSERT INTO paliad.deadline_concepts (slug, name_de, name_en, description, aliases, party, category, sort_order) VALUES
('rechtsbeschwerde', 'Rechtsbeschwerde', 'Legal Appeal (BGH)',
'Rechtsbeschwerde gegen Entscheidungen des BPatG zum BGH — beschränkt auf Rechtsfragen (§ 100 ff. PatG). 1-Monats-Frist ab Zustellung der BPatG-Entscheidung.',
ARRAY['Rechtsbeschwerde', 'legal appeal', 'BGH legal appeal', 'Rechtsbeschwerde BGH'],
'both', 'submission', 41),
('rechtsbeschwerde-begruendung', 'Rechtsbeschwerdebegründung', 'Statement of Grounds for Legal Appeal',
'Begründung der Rechtsbeschwerde (§ 102(2)/(3) PatG i.V.m. ZPO §551) — 1 Monat ab Einlegung der Rechtsbeschwerde.',
ARRAY['Rechtsbeschwerdebegründung', 'Begründung Rechtsbeschwerde'],
'both', 'submission', 42)
ON CONFLICT (slug) DO UPDATE SET
name_de = EXCLUDED.name_de,
name_en = EXCLUDED.name_en,
description = EXCLUDED.description,
aliases = EXCLUDED.aliases,
party = EXCLUDED.party,
sort_order = EXCLUDED.sort_order,
updated_at = now();
-- ============================================================================
-- 3. DPMA_OPP rules (anchor = Veröffentlichung der Erteilung)
-- ============================================================================
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, NULL,
'dpma_opp.publish', 'Veröffentlichung der Erteilung', 'Publication of Grant',
'both', 'filing', true, 0, 'months', 'after', NULL,
'Veröffentlichung der Patenterteilung im DPMA-Patentblatt — Trigger für die Einspruchsfrist.',
'Publication of the patent grant in the DPMA gazette — trigger for the opposition period.',
0, NULL,
(SELECT id FROM paliad.deadline_concepts WHERE slug = 'publication'),
NULL, false, true
FROM paliad.proceeding_types pt
WHERE pt.code = 'DPMA_OPP';
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, parent_rule.id, new.code, new.name, new.name_en, new.primary_party, new.event_type,
true, new.duration_value, new.duration_unit, 'after', new.rule_code, new.deadline_notes, new.deadline_notes_en,
new.sequence_order, NULL,
(SELECT id FROM paliad.deadline_concepts WHERE slug = new.concept_slug),
new.legal_source, false, true
FROM (VALUES
('dpma_opp.publish', 'dpma_opp.einspruch', 'Einspruchsfrist', 'Opposition Period',
'both', 'filing', 9, 'months', '§ 59 PatG',
'Einspruch gegen ein erteiltes Patent muss binnen 9 Monaten nach Veröffentlichung der Erteilung beim DPMA eingelegt werden (§ 59(1) PatG).',
'Opposition against a granted patent must be filed at the DPMA within 9 months of publication of grant (PatG §59(1)).',
10, 'opposition', 'DE.PatG.59.1'),
('dpma_opp.einspruch','dpma_opp.erwiderung', 'Erwiderung des Patentinhabers', 'Proprietor''s Response to Opposition',
'defendant', 'filing', 4, 'months', '§ 59 PatG',
'Erwiderung des Patentinhabers auf den Einspruch — vom DPMA gesetzte Frist (§ 59(3) PatG), typischerweise ~4 Monate.',
'Patent proprietor''s response to the opposition — DPMA-set deadline (PatG §59(3)), typically ~4 months.',
20, 'statement-of-defence','DE.PatG.59.3'),
('dpma_opp.publish', 'dpma_opp.entscheidung', 'DPMA-Entscheidung', 'DPMA Decision',
'court', 'decision', 0, 'months', NULL, NULL, NULL, 50, 'decision', NULL)
) AS new(parent_code, code, name, name_en, primary_party, event_type, duration_value, duration_unit, rule_code, deadline_notes, deadline_notes_en, sequence_order, concept_slug, legal_source)
JOIN paliad.proceeding_types pt ON pt.code = 'DPMA_OPP'
JOIN paliad.deadline_rules parent_rule ON parent_rule.proceeding_type_id = pt.id AND parent_rule.code = new.parent_code;
-- ============================================================================
-- 4. DPMA_BPATG_BESCHWERDE rules (anchor = DPMA-Entscheidung-Zustellung)
-- ============================================================================
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, NULL,
'dpma_bpatg.entscheidung', 'Zustellung DPMA-Entscheidung', 'Service of DPMA Decision',
'both', 'filing', true, 0, 'months', 'after', NULL,
'Zustellung der DPMA-Entscheidung (Trigger für die Beschwerdefrist).',
'Service of the DPMA decision (trigger for the appeal period).',
0, NULL, NULL, NULL, false, true
FROM paliad.proceeding_types pt
WHERE pt.code = 'DPMA_BPATG_BESCHWERDE';
-- Wave 1: Beschwerde anchored on DPMA-Entscheidung
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, parent_rule.id,
'dpma_bpatg.beschwerde', 'Beschwerde', 'Notice of Appeal',
'both', 'filing', true, 1, 'months', 'after', '§ 73 PatG',
'Beschwerde beim BPatG binnen 1 Monat nach Zustellung der DPMA-Entscheidung schriftlich einzulegen (§ 73(2) PatG).',
'Notice of appeal must be filed at the BPatG in writing within 1 month of service of the DPMA decision (PatG §73(2)).',
10, NULL,
(SELECT id FROM paliad.deadline_concepts WHERE slug = 'notice-of-appeal'),
'DE.PatG.73.2', false, true
FROM paliad.proceeding_types pt
JOIN paliad.deadline_rules parent_rule ON parent_rule.proceeding_type_id = pt.id AND parent_rule.code = 'dpma_bpatg.entscheidung'
WHERE pt.code = 'DPMA_BPATG_BESCHWERDE';
-- Wave 2: Begründung anchored on Beschwerde
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, parent_rule.id,
'dpma_bpatg.begruendung', 'Beschwerdebegründung', 'Statement of Grounds of Appeal',
'both', 'filing', true, 1, 'months', 'after', '§ 75 PatG',
'Begründung der Beschwerde binnen 1 Monat ab Einreichung der Beschwerde (§ 75(1) PatG). Verlängerung auf Antrag möglich.',
'Statement of grounds of appeal within 1 month of filing the notice of appeal (PatG §75(1)). Extension possible on request.',
20, NULL,
(SELECT id FROM paliad.deadline_concepts WHERE slug = 'statement-of-grounds-of-appeal'),
'DE.PatG.75.1', false, true
FROM paliad.proceeding_types pt
JOIN paliad.deadline_rules parent_rule ON parent_rule.proceeding_type_id = pt.id AND parent_rule.code = 'dpma_bpatg.beschwerde'
WHERE pt.code = 'DPMA_BPATG_BESCHWERDE';
-- Terminal: mündl. + BPatG-Entscheidung anchored on entscheidung (anchor)
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, parent_rule.id, new.code, new.name, new.name_en, new.primary_party, new.event_type,
true, new.duration_value, new.duration_unit, 'after', new.rule_code, new.deadline_notes, new.deadline_notes_en,
new.sequence_order, NULL,
(SELECT id FROM paliad.deadline_concepts WHERE slug = new.concept_slug),
new.legal_source, false, true
FROM (VALUES
('dpma_bpatg.entscheidung', 'dpma_bpatg.termin', 'Mündliche Verhandlung BPatG', 'BPatG Oral Hearing',
'court', 'hearing', 0, 'months', NULL, NULL, NULL, 50, 'oral-hearing', NULL),
('dpma_bpatg.entscheidung', 'dpma_bpatg.entsch_bpatg', 'BPatG-Entscheidung', 'BPatG Decision',
'court', 'decision', 0, 'months', NULL, NULL, NULL, 60, 'decision', NULL)
) AS new(parent_code, code, name, name_en, primary_party, event_type, duration_value, duration_unit, rule_code, deadline_notes, deadline_notes_en, sequence_order, concept_slug, legal_source)
JOIN paliad.proceeding_types pt ON pt.code = 'DPMA_BPATG_BESCHWERDE'
JOIN paliad.deadline_rules parent_rule ON parent_rule.proceeding_type_id = pt.id AND parent_rule.code = new.parent_code;
-- ============================================================================
-- 5. DPMA_BGH_RB rules (anchor = BPatG-Entscheidung-Zustellung)
-- ============================================================================
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, NULL,
'dpma_bgh.entsch_bpatg', 'Zustellung BPatG-Entscheidung', 'Service of BPatG Decision',
'both', 'filing', true, 0, 'months', 'after', NULL,
'Zustellung der BPatG-Entscheidung (Trigger für die Rechtsbeschwerdefristen).',
'Service of the BPatG decision (trigger for the legal-appeal deadlines).',
0, NULL, NULL, NULL, false, true
FROM paliad.proceeding_types pt
WHERE pt.code = 'DPMA_BGH_RB';
-- Rechtsbeschwerde anchored on entsch_bpatg
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, parent_rule.id,
'dpma_bgh.rechtsbeschwerde', 'Rechtsbeschwerde', 'Legal Appeal',
'both', 'filing', true, 1, 'months', 'after', '§ 100 PatG',
'Rechtsbeschwerde gegen die BPatG-Entscheidung beim BGH binnen 1 Monat nach Zustellung der Entscheidung einlegen (§ 100(1) PatG). Beschränkt auf Rechtsfragen.',
'Legal appeal against the BPatG decision must be filed at the BGH within 1 month of service (PatG §100(1)). Limited to legal questions.',
10, NULL,
(SELECT id FROM paliad.deadline_concepts WHERE slug = 'rechtsbeschwerde'),
'DE.PatG.100.1', false, true
FROM paliad.proceeding_types pt
JOIN paliad.deadline_rules parent_rule ON parent_rule.proceeding_type_id = pt.id AND parent_rule.code = 'dpma_bgh.entsch_bpatg'
WHERE pt.code = 'DPMA_BGH_RB';
-- Begründung anchored on Rechtsbeschwerde
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, parent_rule.id,
'dpma_bgh.begruendung', 'Rechtsbeschwerdebegründung', 'Statement of Grounds for Legal Appeal',
'both', 'filing', true, 1, 'months', 'after', '§ 102 PatG',
'Begründung der Rechtsbeschwerde binnen 1 Monat ab Einlegung (§ 102(2)/(3) PatG i.V.m. § 551 ZPO).',
'Statement of grounds for the legal appeal within 1 month of filing the appeal (PatG §102(2)/(3) read with ZPO §551).',
20, NULL,
(SELECT id FROM paliad.deadline_concepts WHERE slug = 'rechtsbeschwerde-begruendung'),
'DE.PatG.102', false, true
FROM paliad.proceeding_types pt
JOIN paliad.deadline_rules parent_rule ON parent_rule.proceeding_type_id = pt.id AND parent_rule.code = 'dpma_bgh.rechtsbeschwerde'
WHERE pt.code = 'DPMA_BGH_RB';
-- BGH-Entscheidung
INSERT INTO paliad.deadline_rules (
proceeding_type_id, parent_id, code, name, name_en, primary_party, event_type,
is_mandatory, duration_value, duration_unit, timing, rule_code, deadline_notes, deadline_notes_en,
sequence_order, condition_flag, concept_id, legal_source, is_spawn, is_active
)
SELECT
pt.id, parent_rule.id,
'dpma_bgh.entsch_bgh', 'BGH-Entscheidung', 'BGH Decision',
'court', 'decision', true, 0, 'months', 'after', NULL, NULL, NULL,
50, NULL,
(SELECT id FROM paliad.deadline_concepts WHERE slug = 'decision'),
NULL, false, true
FROM paliad.proceeding_types pt
JOIN paliad.deadline_rules parent_rule ON parent_rule.proceeding_type_id = pt.id AND parent_rule.code = 'dpma_bgh.entsch_bpatg'
WHERE pt.code = 'DPMA_BGH_RB';