Wartungsvorlagen mit Checklisten, Prueftermine aus einem naechtlichen Lauf, Prueffristen-Dashboard, Pruefwizard mit Foto und Unterschrift, unveraenderliche Protokolle als PDF, Maengel-Workflow, Rueckrufe und Lebensdauerueberwachung. Elf neue Tabellen, alle mit organisationId und Row Level Security. Die Unveraenderbarkeit abgeschlossener Protokolle setzt ein Datenbanktrigger durch, nicht der Anwendungscode: eine Korrektur erzeugt eine neue Pruefung mit Verweis auf die alte, beide bleiben lesbar. 79 neue Tests (47 Unit, 10 gegen eine echte Datenbank, 22 E2E). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import { redirect } from "next/navigation";
|
|
import Link from "next/link";
|
|
import { ArrowLeft } from "lucide-react";
|
|
import { aktuelleSitzung } from "@/lib/auth";
|
|
import { hatRecht } from "@/lib/authz";
|
|
import { Button } from "@/components/ui/button";
|
|
import { VorlagenVerwaltung } from "@/app/(app)/pruefungen/vorlagen/vorlagen-verwaltung";
|
|
|
|
export const metadata = { title: "Wartungsvorlagen" };
|
|
|
|
/**
|
|
* Wartungsvorlagen.
|
|
*
|
|
* Hier steht, was in welchem Takt geprüft wird. Ohne Vorlage entstehen keine
|
|
* Termine — deshalb ist das die erste Seite, die eine Wehr in Phase 2 ausfüllt.
|
|
*/
|
|
export default async function VorlagenSeite() {
|
|
const sitzung = await aktuelleSitzung();
|
|
if (!sitzung) redirect("/anmelden");
|
|
|
|
return (
|
|
<div className="space-y-6">
|
|
<div>
|
|
<Button variant="ghost" size="sm" asChild className="-ml-2 mb-1">
|
|
<Link href="/pruefungen">
|
|
<ArrowLeft aria-hidden />
|
|
Zurück zu den Fristen
|
|
</Link>
|
|
</Button>
|
|
<h1 className="text-2xl font-semibold tracking-tight">Wartungsvorlagen</h1>
|
|
<p className="text-sm text-[var(--muted-foreground)]">
|
|
Was an einem Gerätetyp regelmäßig zu prüfen ist — Intervall, Vorschrift und Checkliste.
|
|
</p>
|
|
</div>
|
|
|
|
<VorlagenVerwaltung darfBearbeiten={hatRecht(sitzung, "pruefung.planen")} />
|
|
</div>
|
|
);
|
|
}
|