import Link from "next/link"; import { notFound, redirect } from "next/navigation"; import { ArrowLeft, Package } from "lucide-react"; import { aktuelleSitzung } from "@/lib/auth"; import { fuerOrganisation } from "@/lib/db"; import { alsDatum } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { FristAnzeige, StatusAbzeichen } from "@/components/stammdaten/anzeige"; export const metadata = { title: "Fahrzeug" }; /** * Fahrzeugdetail mit der Beladung, nach Geräteräumen geordnet. * * Genau so sucht der Gerätewart: nicht "wo ist die Motorsäge", sondern "was * ist in G3". Deshalb steht die Beladeordnung im Mittelpunkt und nicht eine * alphabetische Geräteliste. */ export default async function FahrzeugSeite({ params }: { params: Promise<{ id: string }> }) { const sitzung = await aktuelleSitzung(); if (!sitzung) redirect("/anmelden"); const { id } = await params; const fahrzeug = await fuerOrganisation(sitzung.organisationId, (db) => db.fahrzeug.findUnique({ where: { id }, include: { standort: { select: { id: true, name: true } }, geraeteraeume: { where: { geloeschtAm: null }, orderBy: [{ sortierung: "asc" }, { bezeichnung: "asc" }], include: { geraete: { where: { geloeschtAm: null }, orderBy: { bezeichnung: "asc" }, select: { id: true, inventarnummer: true, bezeichnung: true, status: true, naechstePruefung: true, }, }, }, }, geraete: { where: { geloeschtAm: null, geraeteraumId: null }, orderBy: { bezeichnung: "asc" }, select: { id: true, inventarnummer: true, bezeichnung: true, status: true, naechstePruefung: true, }, }, }, }), ); if (!fahrzeug) notFound(); /* * eslint-disable-next-line react/jsx-key -- Fehlalarm: Diese JSX-Elemente * sind nicht die Kinder einer Liste, sondern die zweiten Glieder von * Wertepaaren. Gerendert werden sie unten in einer map, deren Wrapper den * key traegt (`
`). Ein key an dieser Stelle waere * wirkungslos und wuerde nur verschleiern, wo er wirklich sitzt. */ /* eslint-disable react/jsx-key */ const angaben: Array<[string, React.ReactNode]> = [ ["Typ nach DIN", fahrzeug.dinTyp ?? "—"], ["Kennzeichen", {fahrzeug.kennzeichen ?? "—"}], ["Hersteller", fahrzeug.hersteller ?? "—"], ["Aufbauhersteller", fahrzeug.aufbauhersteller ?? "—"], [ "Fahrgestellnummer", {fahrzeug.fahrgestellnummer ?? "—"}, ], ["Baujahr", {fahrzeug.baujahr ?? "—"}], ["Erstzulassung", alsDatum(fahrzeug.erstzulassung)], ["Indienststellung", alsDatum(fahrzeug.indienststellung)], ["Nächster TÜV", ], ["Sicherheitsprüfung (UVV)", ], ["Sitzplätze", {fahrzeug.sitzplaetze ?? "—"}], [ "Löschwasser", fahrzeug.tankinhalt ? ( {fahrzeug.tankinhalt.toLocaleString("de-DE")} l ) : ( "—" ), ], ["Standort", fahrzeug.standort?.name ?? "—"], ]; /* eslint-enable react/jsx-key */ const alleRaeume = [ ...fahrzeug.geraeteraeume, // Was keinem Raum zugeordnet ist, bekommt einen eigenen Abschnitt statt // stillschweigend zu verschwinden. ...(fahrzeug.geraete.length > 0 ? [ { id: "__ohne__", bezeichnung: "Ohne Raumangabe", beschreibung: "Verlastet, aber keinem Geräteraum zugeordnet", geraete: fahrzeug.geraete, }, ] : []), ]; return (

{fahrzeug.funkrufname}

{fahrzeug.dinTyp ? `${fahrzeug.dinTyp} — ` : ""} {fahrzeug.bezeichnung}

Angaben
{angaben.map(([bezeichnung, wert]) => (
{bezeichnung}
{wert}
))}
Beladung Nach Geräteräumen geordnet, in der Reihenfolge der Beladeordnung. {alleRaeume.length === 0 && (

Für dieses Fahrzeug sind noch keine Geräteräume angelegt.

)} {alleRaeume.map((raum) => (
{raum.bezeichnung} {raum.beschreibung} {raum.geraete.length}{" "} {raum.geraete.length === 1 ? "Gerät" : "Geräte"}
{raum.geraete.length === 0 ? (

leer

) : (
    {raum.geraete.map((geraet) => (
  • {geraet.bezeichnung} {geraet.inventarnummer}
  • ))}
)}
))}
); }