import type { Metadata } from 'next'; import Link from 'next/link'; import { notFound } from 'next/navigation'; import { erfordereBenutzer, erfordereSichtAufAzubi } from '@/lib/auth/rechte'; import { benutzerNachId } from '@/lib/repos/benutzer'; import { inhalte } from '@/lib/inhalte'; import { verlinkeGlossar } from '@/lib/inhalte/glossarverweise'; import { anhaengeVon } from '@/lib/repos/anhaenge'; import { erfuellteKriterien, standVon } from '@/lib/repos/aufgaben'; import { istBild, megabyte } from '@/lib/anhaenge/dateien'; import { alsZeitpunktText } from '@/lib/zeit'; import { StatusMarke } from '../StatusMarke'; import { AnhangFormular, BewertungsFormular, NotizFormular, StatusWaehlen } from './Formulare'; import { anhangEntfernen, aufgabeAbnehmen, aufgabeZurueckgeben } from '../aktionen'; import { erfordereModul } from '@/lib/module/pruefen'; export const dynamic = 'force-dynamic'; export async function generateMetadata({ params }: { params: Promise<{ id: string }> }): Promise { const { id } = await params; const aufgabe = inhalte().aufgabeNach.get(decodeURIComponent(id)); return { title: aufgabe ? `${aufgabe.id} – ${aufgabe.titel}` : 'Praxisaufgabe' }; } export default async function AufgabenSeite({ params, searchParams, }: { params: Promise<{ id: string }>; searchParams: Promise<{ azubi?: string }>; }) { const benutzer = await erfordereBenutzer(); erfordereModul('aufgaben'); const { id } = await params; const { azubi: azubiParameter } = await searchParams; const alle = inhalte(); const aufgabe = alle.aufgabeNach.get(decodeURIComponent(id)); if (!aufgabe) notFound(); const azubiId = benutzer.rolle === 'azubi' ? benutzer.id : (azubiParameter ?? ''); if (!azubiId) notFound(); // Serverseitige Rechteprüfung – die Kennung aus der Adresszeile wird nie geglaubt. erfordereSichtAufAzubi(benutzer, azubiId); const istAzubi = benutzer.rolle === 'azubi'; const azubi = istAzubi ? benutzer : benutzerNachId(azubiId); if (!azubi) notFound(); const stand = standVon(azubiId, aufgabe.id); const status = stand?.status ?? 'offen'; const gesperrt = status === 'abgenommen'; const erfuellt = erfuellteKriterien(stand); const anhaenge = anhaengeVon('aufgabe', `${aufgabe.id}::${azubiId}`); const lernfeld = alle.lernfeldNach.get(aufgabe.lernfeld); const positionen = aufgabe.rahmenplan.map((p) => alle.positionNach.get(p)).filter((p) => p !== undefined); const abnehmer = stand?.abgenommenVon ? benutzerNachId(stand.abgenommenVon) : null; return (
{aufgabe.id} Woche {aufgabe.woche} · {aufgabe.zeitrahmen}

{aufgabe.titel}

{aufgabe.ziel}

Ausbildungsrahmenplan
{positionen.map((p) => ( {p.id} {p.kurz} ))}
Lernfeld
{lernfeld ? ( {lernfeld.id} {lernfeld.titel} ) : ( '–' )}
{aufgabe.material.length > 0 ? (

Benötigtes Material

    {aufgabe.material.map((posten, stelle) => (
  • {posten}
  • ))}
) : null} {aufgabe.abschnitte.map((abschnitt, stelle) => abschnitt.titel ? (

{abschnitt.titel}

) : null, )}

Bewertungskriterien

{erfuellt.length} von {aufgabe.kriterien.length} erfüllt · abgehakt wird vom Ausbilder

    {aufgabe.kriterien.map((text, stelle) => (
  • {text} {erfuellt.includes(stelle) ? ' – erfüllt' : ' – noch offen'}
  • ))}
{/* --- Bearbeitung durch den Azubi --- */} {istAzubi ? (

Deine Bearbeitung

Stand setzen

{status === 'zur_abnahme' ? (

Abgegeben am {alsZeitpunktText(stand?.abgegebenAm)} – wartet auf die Abnahme.

) : null} {gesperrt ? (

✓ Abgenommen am {alsZeitpunktText(stand?.abgenommenAm)} {abnehmer ? ` von ${abnehmer.name}` : ''}.

) : null}
) : (

Bearbeitung von {azubi.name}

{stand?.begonnenAm ? `Begonnen ${alsZeitpunktText(stand.begonnenAm)}` : 'Noch nicht begonnen'} {stand?.abgegebenAm ? ` · abgegeben ${alsZeitpunktText(stand.abgegebenAm)}` : ''} {stand?.abgenommenAm ? ` · abgenommen ${alsZeitpunktText(stand.abgenommenAm)}` : ''}

Notizen

{stand?.notiz ? (

{stand.notiz}

) : (

Noch keine Notizen.

)}
)} {/* --- Anhänge --- */}

Anhänge{anhaenge.length > 0 ? ` (${anhaenge.length})` : ''}

{anhaenge.length === 0 ? (

Noch nichts angehängt.

) : ( )}
{/* --- Bewertung und Abnahme --- */} {!istAzubi ? (

Bewerten und abnehmen


Abnehmen sperrt die Aufgabe für den Azubi. Zurückgeben setzt sie auf „in Arbeit“ – schreib in dem Fall vorher eine Rückmeldung, sonst weiß er nicht, was fehlt.

) : null} {/* --- Ergebnis, für beide sichtbar --- */} {stand?.bewertung || stand?.rueckmeldung ? (

Rückmeldung des Ausbilders

{stand.bewertung ? (

Bewertung: {stand.bewertung}

) : null} {stand.rueckmeldung ?

{stand.rueckmeldung}

: null}
) : null}

Quelle: {aufgabe.datei}

); }