Files
lernbar/scripts/inhalte-pruefen.ts
Florian WildeandClaude Opus 5 be2a674c7a Baustein 9: Auswertung, Rahmenplanabdeckung, Feedbackgespraech
Die Abdeckung des Ausbildungsrahmenplans ist die Ansicht, die gegenueber
der IHK zaehlt. Sie unterscheidet vier Lagen statt "erledigt/offen":

  vermittelt   eine abgenommene Aufgabe oder ein abgeschlossener
               Checklisten-Durchlauf, oder zwei gelesene Handouts
  angefangen   etwas erledigt, aber noch nicht genug
  geplant      Inhalt vorhanden, nichts davon bearbeitet
  ohne Inhalt  zu dieser Position gibt es im Lehrgang gar nichts

Die vierte Lage ist die wichtigste: Sie ist keine Luecke beim Azubi,
sondern eine im Lehrgang, und wird getrennt ausgewiesen. Die Regel steht
als reine Funktion in src/lib/auswertung/abdeckung.ts, mit 17 Tests.

Das Feedbackgespraech laesst beide Seiten getrennt bewerten. Wo sie um
zwei Stufen oder mehr auseinanderliegen, wird das hervorgehoben - in der
Ansicht, in der Uebersicht und im PDF, alle drei ueber dieselbe Funktion
liegtWeitAuseinander(). Nach beidseitiger Bestaetigung ist das Gespraech
unveraenderlich und wird nur noch gelesen.

Durchstich in scripts/pruefungen/baustein-9.mjs: alle fuenf Luecken
erkannt, getrennte Spalten, Sperre serverseitig, PDF nur mit Anmeldung,
ein fremder Azubi bekommt 404 - auch auf das PDF.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 14:08:49 +02:00

59 lines
2.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Prüft alle Dateien unter content/, ohne die Anwendung zu starten.
*
* npm run inhalte:pruefen
*
* Endet mit 0, wenn alles in Ordnung ist, sonst mit 1 – so lässt sich das
* Skript in einen Prüflauf oder einen Git-Haken einhängen.
*/
import { ladeInhalte } from '../src/lib/inhalte/laden';
import { InhaltsFehler } from '../src/lib/inhalte/fehler';
import { inhaltWurzel } from '../src/lib/pfade';
function main() {
try {
const alle = ladeInhalte(inhaltWurzel);
const kartenJeBlock = alle.bloecke.map((b) => {
const anzahl = alle.karten.filter((k) => k.block === b.id).length;
return `${b.titel}: ${anzahl}`;
});
console.log('Inhalte in Ordnung.');
console.log('');
console.log(` Wochen ${alle.wochen.length}`);
console.log(` Handouts ${alle.handouts.length}`);
console.log(` Merkkarten ${alle.karten.length} (${kartenJeBlock.join(', ')})`);
console.log(` Praxisaufgaben ${alle.aufgaben.length}`);
console.log(` Checklisten ${alle.checklisten.length}`);
console.log(` Lernzielkontrollen ${alle.kontrollen.length}`);
console.log(` Glossareinträge ${alle.glossar.length}`);
console.log(` Berufsbildpositionen ${alle.positionen.length}`);
console.log(` Lernfelder ${alle.lernfelder.length}`);
console.log(` Feedbackkriterien ${alle.feedback.kriterien.length}`);
console.log('');
const ohneAbdeckung = alle.positionen.filter(
(p) =>
!alle.handouts.some((h) => h.rahmenplan.includes(p.id)) &&
!alle.aufgaben.some((a) => a.rahmenplan.includes(p.id)),
);
if (ohneAbdeckung.length > 0) {
console.log(` Hinweis: ${ohneAbdeckung.length} Berufsbildpositionen sind von keinem Inhalt berührt:`);
console.log(` ${ohneAbdeckung.map((p) => p.id).join(', ')}`);
console.log(' Das ist kein Fehler – nur etwas, das im Laufe der Ausbildung geschlossen werden sollte.');
console.log('');
}
process.exit(0);
} catch (fehler) {
if (fehler instanceof InhaltsFehler) {
console.error(fehler.message);
process.exit(1);
}
throw fehler;
}
}
main();