/** * Das Fehlerprotokoll – die Fragen, die zuletzt falsch beantwortet wurden. * * Das Dokument, mit dem jemand ohne Rechner weiterarbeitet. Es enthält genau * die Menge, die auf dem Startbildschirm hinter „Nur Fehler“ steht: Was dort * als Fehler gilt, steht hier auf dem Papier. Eine zweite Zählweise daneben * wäre die Art Widerspruch, die diese Anwendung schon zweimal abgeschafft hat. * * **Die Antwortmöglichkeiten stehen vollständig da.** Nachgemessen nennen * 302 der 471 Erklärungen zu Auswahlfragen eine *falsche* Option beim * Buchstaben; ein Dokument mit nur der richtigen Antwort machte seine eigenen * Begründungen unlesbar. * * **Der Umfang ist erheblich und wird vorher gesagt.** Die Oberfläche nennt * die geschätzte Zahl, bevor der Speicherdialog aufgeht. Gerechnet wird sie * in `umfang.ts`; dort stehen auch die gemessenen Stützstellen. Hier standen * bis 0.27.2 eigene „gemessene“ Zahlen, und sie widersprachen jenen — für 150 * Fragen mit Kurzerklärung 51 gegen 70. */ import { absatz, dokumentBauen, type Quellenangabe } from './dokument'; import { frageblock, type Papierfrage } from './frageblock'; import type { Schriftgroesse } from './stil'; /** Wie ausführlich die Begründungen ausfallen. */ export type Erklaerungstiefe = 'kurz' | 'voll'; export interface Fehlerprotokolldaten { readonly fragen: readonly Papierfrage[]; readonly profilName: string; readonly erstelltAm: string; readonly tiefe: Erklaerungstiefe; readonly quelle: Quellenangabe; readonly schriftgroesse: Schriftgroesse; } /** Deutsches Datum – dieselbe Formatierung wie im Lernbericht. */ function datum(iso: string): string { const wert = new Date(iso); return Number.isNaN(wert.getTime()) ? 'ohne Datum' : wert.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' }); } /** * Der Vorspann. * * Er sagt, worauf die Auswahl beruht, und er sagt es im Singular, wenn es * eine einzige Frage ist – der Fall ist erreichbar und kommt nach einer * guten Sitzung sogar häufig vor. */ function vorspann(anzahl: number, tiefe: Erklaerungstiefe): string { if (anzahl === 0) { return absatz( 'In diesem Lernprofil ist derzeit keine Frage als zuletzt falsch beantwortet vermerkt. ' + 'Das Dokument bleibt deshalb leer.', ); } const menge = anzahl === 1 ? 'Hier steht die eine Frage, die Sie zuletzt falsch beantwortet haben.' : `Hier stehen die ${String(anzahl)} Fragen, die Sie zuletzt falsch beantwortet haben.`; const nachtrag = tiefe === 'voll' ? 'Zu jeder Frage stehen die vollständige Begründung und die Fundstellen im Gesetz.' : 'Zu jeder Frage steht die Kurzerklärung. Die ausführliche Begründung lässt sich beim Erzeugen zuschalten.'; return absatz( `${menge} Sobald Sie eine davon wieder richtig beantworten, verschwindet sie aus dieser Liste. ${nachtrag}`, ); } export function fehlerprotokollBauen(daten: Fehlerprotokolldaten): string { const form = { loesungZeigen: true, erklaerung: daten.tiefe } as const; const bloecke = daten.fragen.map((papier) => frageblock(papier, form, 3)); return dokumentBauen({ titel: 'Fehlerprotokoll Waffensachkunde', augenbraue: `${daten.profilName} · erstellt am ${datum(daten.erstelltAm)}`, quelle: daten.quelle, schriftgroesse: daten.schriftgroesse, abschnitte: [ `