/** * 📅 IHK NETZPLAN-TRAINER (DIN 69900) 📅 * ===================================== * Interaktiver Trainer zur Berechnung von: * - Vorwärtsrechnung: FAZ (Frühester Anfangszeitpunkt) & FEZ (Frühester Endzeitpunkt) * - Rückwärtsrechnung: SAZ (Spätester Anfangszeitpunkt) & SEZ (Spätester Endzeitpunkt) * - Pufferzeiten: GP (Gesamtpuffer = SAZ - FAZ) & FP (Freier Puffer = min(FAZ_Nachfolger) - FEZ) * - Kritischer Pfad (Vorgänge mit GP = 0) */ class NetzplanTrainer { constructor(containerId) { this.container = document.getElementById(containerId); this.scenarioIndex = 0; this.scenarios = [ { title: "Szenario 1: Rollout eines neuen Firmennetzwerks (PrintTop GmbH)", nodes: [ { id: "A", name: "Anforderungsanalyse", d: 3, preds: [], faz: 0, fez: 3, saz: 0, sez: 3, gp: 0, fp: 0 }, { id: "B", name: "Hardware-Beschaffung", d: 5, preds: ["A"], faz: 3, fez: 8, saz: 3, sez: 8, gp: 0, fp: 0 }, { id: "C", name: "Kabelverlegung (Cat 7)", d: 4, preds: ["A"], faz: 3, fez: 7, saz: 4, sez: 8, gp: 1, fp: 1 }, { id: "D", name: "Switch-/Router-Konfiguration", d: 4, preds: ["B"], faz: 8, fez: 12, saz: 8, sez: 12, gp: 0, fp: 0 }, { id: "E", name: "Patchfeld & Dosen auflegen", d: 3, preds: ["C"], faz: 7, fez: 10, saz: 9, sez: 12, gp: 2, fp: 2 }, { id: "F", name: "End-to-End Funktionstest", d: 2, preds: ["D", "E"], faz: 12, fez: 14, saz: 12, sez: 14, gp: 0, fp: 0 }, { id: "G", name: "Übergabe & Abnahme", d: 1, preds: ["F"], faz: 14, fez: 15, saz: 14, sez: 15, gp: 0, fp: 0 } ], criticalPath: ["A", "B", "D", "F", "G"] }, { title: "Szenario 2: Migration auf Microsoft Active Directory", nodes: [ { id: "A", name: "Ist-Aufnahme AD DS", d: 2, preds: [], faz: 0, fez: 2, saz: 0, sez: 2, gp: 0, fp: 0 }, { id: "B", name: "OU-Struktur & GPO-Design", d: 4, preds: ["A"], faz: 2, fez: 6, saz: 2, sez: 6, gp: 0, fp: 0 }, { id: "C", name: "Bereitstellung DC-Hardware", d: 3, preds: ["A"], faz: 2, fez: 5, saz: 3, sez: 6, gp: 1, fp: 1 }, { id: "D", name: "Benutzerdaten CSV-Export", d: 2, preds: ["A"], faz: 2, fez: 4, saz: 6, sez: 8, gp: 4, fp: 4 }, { id: "E", name: "Installation Domain Controller", d: 2, preds: ["B", "C"], faz: 6, fez: 8, saz: 6, sez: 8, gp: 0, fp: 0 }, { id: "F", name: "PowerShell Massenimport", d: 3, preds: ["D", "E"], faz: 8, fez: 11, saz: 8, sez: 11, gp: 0, fp: 0 }, { id: "G", name: "Client-Domain-Join & Tests", d: 2, preds: ["F"], faz: 11, fez: 13, saz: 11, sez: 13, gp: 0, fp: 0 } ], criticalPath: ["A", "B", "E", "F", "G"] } ]; this.init(); } init() { if (!this.container) return; this.render(); } render() { const sc = this.scenarios[this.scenarioIndex]; this.container.innerHTML = `
${sc.title}
Aufgabe: Berechnen Sie für jeden Vorgang die Zeitpunkte der Vorwärtsrechnung (FAZ, FEZ), der Rückwärtsrechnung (SAZ, SEZ) sowie den Gesamtpuffer (GP) und Freien Puffer (FP). Identifizieren Sie anschließend alle Vorgänge auf dem Kritischen Pfad.
FEZ = FAZ + D
ℹ️ FAZ = max(FEZ aller Vorgänger)
ℹ️ SAZ = SEZ - D
ℹ️ SEZ = min(SAZ aller Nachfolger)
ℹ️ GP = SAZ - FAZ = SEZ - FEZ
ℹ️ FP = min(FAZ Nachfolger) - FEZ
| ID | Vorgang | Dauer (D) | Vorgänger | FAZ | FEZ | SAZ | SEZ | GP | FP | Kritisch? |
|---|---|---|---|---|---|---|---|---|---|---|
| ${n.id} | ${n.name} | ${n.d} | ${n.preds.length > 0 ? n.preds.join(", ") : "-"} |
Gesamtdauer des Projekts: ${sc.nodes[sc.nodes.length - 1].fez} Zeiteinheiten.
Der kritische Pfad verläuft über: ${sc.criticalPath.join(" → ")}. Alle Vorgänge hier haben Gesamtpuffer GP = 0.