Full event-driven deadline determination system ported from youpc.org:
Backend:
- DetermineService: walks proceeding event tree, calculates cascading
dates with holiday adjustment and conditional logic
- GET /api/proceeding-types/{code}/timeline — full event tree structure
- POST /api/deadlines/determine — calculate timeline with conditions
- POST /api/cases/{caseID}/deadlines/batch — batch-create deadlines
- DeadlineRule model: added is_spawn, spawn_label fields
- GetFullTimeline: recursive CTE following cross-type spawn branches
- Conditional deadlines: condition_rule_id toggles alt_duration/rule_code
(e.g. Reply changes from RoP.029b to RoP.029a when CCR is filed)
- Seed SQL with full UPC event trees (INF, REV, CCR, APM, APP, AMD)
Frontend:
- DeadlineWizard: interactive proceeding timeline with step-by-step flow
1. Select proceeding type (visual cards)
2. Enter trigger event date
3. Toggle conditional branches (CCR, Appeal, Amend)
4. See full calculated timeline with color-coded urgency
5. Batch-create all deadlines on a selected case
- Visual timeline tree with party icons, rule codes, duration badges
- Kept existing DeadlineCalculator as "Schnell" quick mode
Also resolved merge conflicts across 6 files (auth, router, handlers)
merging role-based permissions + audit trail features.
62 lines
2.1 KiB
TypeScript
62 lines
2.1 KiB
TypeScript
"use client";
|
|
|
|
import { DeadlineCalculator } from "@/components/deadlines/DeadlineCalculator";
|
|
import { DeadlineWizard } from "@/components/deadlines/DeadlineWizard";
|
|
import { ArrowLeft } from "lucide-react";
|
|
import Link from "next/link";
|
|
import { useState } from "react";
|
|
|
|
export default function FristenrechnerPage() {
|
|
const [mode, setMode] = useState<"wizard" | "quick">("wizard");
|
|
|
|
return (
|
|
<div className="animate-fade-in space-y-4">
|
|
<div className="flex items-start justify-between">
|
|
<div>
|
|
<Link
|
|
href="/fristen"
|
|
className="mb-2 inline-flex items-center gap-1 text-sm text-neutral-500 transition-colors hover:text-neutral-700"
|
|
>
|
|
<ArrowLeft className="h-3.5 w-3.5" />
|
|
Zurueck zu Fristen
|
|
</Link>
|
|
<h1 className="text-lg font-semibold text-neutral-900">
|
|
Fristenbestimmung
|
|
</h1>
|
|
<p className="mt-0.5 text-sm text-neutral-500">
|
|
{mode === "wizard"
|
|
? "Vollstaendige Verfahrens-Timeline mit automatischer Fristenberechnung"
|
|
: "Schnellberechnung einzelner Fristen nach Verfahrensart"}
|
|
</p>
|
|
</div>
|
|
|
|
{/* Mode toggle */}
|
|
<div className="flex rounded-md border border-neutral-200 bg-neutral-50 p-0.5">
|
|
<button
|
|
onClick={() => setMode("wizard")}
|
|
className={`rounded px-3 py-1 text-xs font-medium transition-colors ${
|
|
mode === "wizard"
|
|
? "bg-white text-neutral-900 shadow-sm"
|
|
: "text-neutral-500 hover:text-neutral-700"
|
|
}`}
|
|
>
|
|
Verfahren
|
|
</button>
|
|
<button
|
|
onClick={() => setMode("quick")}
|
|
className={`rounded px-3 py-1 text-xs font-medium transition-colors ${
|
|
mode === "quick"
|
|
? "bg-white text-neutral-900 shadow-sm"
|
|
: "text-neutral-500 hover:text-neutral-700"
|
|
}`}
|
|
>
|
|
Schnell
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
{mode === "wizard" ? <DeadlineWizard /> : <DeadlineCalculator />}
|
|
</div>
|
|
);
|
|
}
|