diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/00_Inhaltsverzeichnis_Anhang.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/00_Inhaltsverzeichnis_Anhang.docx new file mode 100644 index 00000000..2eb24e8b Binary files /dev/null and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/00_Inhaltsverzeichnis_Anhang.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/01_Berufsspezifika_FR_Digitale_Vernetzung.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/01_Berufsspezifika_FR_Digitale_Vernetzung.docx index beeb4ae9..91ffb15a 100644 Binary files a/IHK_Projektdokumentation/Kundendokumentation_Anhang/01_Berufsspezifika_FR_Digitale_Vernetzung.docx and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/01_Berufsspezifika_FR_Digitale_Vernetzung.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/02_Gespraechsprotokoll.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/02_Gespraechsprotokoll.docx index 935ca7ad..82b3d293 100644 Binary files a/IHK_Projektdokumentation/Kundendokumentation_Anhang/02_Gespraechsprotokoll.docx and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/02_Gespraechsprotokoll.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/03_Mess_und_Pruefprotokoll.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/03_Mess_und_Pruefprotokoll.docx index 0b45910b..2ba5adcc 100644 Binary files a/IHK_Projektdokumentation/Kundendokumentation_Anhang/03_Mess_und_Pruefprotokoll.docx and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/03_Mess_und_Pruefprotokoll.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/04_Uebergabeprotokoll.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/04_Uebergabeprotokoll.docx index 051b6b5e..47a472fd 100644 Binary files a/IHK_Projektdokumentation/Kundendokumentation_Anhang/04_Uebergabeprotokoll.docx and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/04_Uebergabeprotokoll.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/05_Abnahmeprotokoll.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/05_Abnahmeprotokoll.docx index 486cb4fc..4cae4f95 100644 Binary files a/IHK_Projektdokumentation/Kundendokumentation_Anhang/05_Abnahmeprotokoll.docx and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/05_Abnahmeprotokoll.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/06_Anwenderhandbuch_Auszug.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/06_Anwenderhandbuch_Auszug.docx index 16765cab..e670f299 100644 Binary files a/IHK_Projektdokumentation/Kundendokumentation_Anhang/06_Anwenderhandbuch_Auszug.docx and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/06_Anwenderhandbuch_Auszug.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/07_Prozessdarstellung.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/07_Prozessdarstellung.docx index dd0e65ac..fd277638 100644 Binary files a/IHK_Projektdokumentation/Kundendokumentation_Anhang/07_Prozessdarstellung.docx and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/07_Prozessdarstellung.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/08_Netzwerkplan.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/08_Netzwerkplan.docx index 73d8e1cc..72f6dfc8 100644 Binary files a/IHK_Projektdokumentation/Kundendokumentation_Anhang/08_Netzwerkplan.docx and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/08_Netzwerkplan.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/generate_ihk_documents_real.py b/IHK_Projektdokumentation/Kundendokumentation_Anhang/generate_ihk_documents_real.py new file mode 100644 index 00000000..3a4218cb --- /dev/null +++ b/IHK_Projektdokumentation/Kundendokumentation_Anhang/generate_ihk_documents_real.py @@ -0,0 +1,861 @@ +from docx import Document +from docx.shared import Inches, Pt, RGBColor +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.style import WD_STYLE_TYPE +from datetime import datetime +import os + +# Stelle sicher, dass das Ausgabeverzeichnis existiert +output_dir = "." +if not os.path.exists(output_dir): + os.makedirs(output_dir) + +# Gemeinsame Funktion für die Dokumentenerstellung +def create_document(title, filename): + doc = Document() + + # Kopfzeile + section = doc.sections[0] + header = section.header + header_para = header.paragraphs[0] + header_para.text = f"Mercedes-Benz AG - Technische Berufsausbildungsstätte\t\t{datetime.now().strftime('%d.%m.%Y')}" + header_para.alignment = WD_ALIGN_PARAGRAPH.RIGHT + + # Titel + title_para = doc.add_paragraph() + title_run = title_para.add_run(title) + title_run.font.size = Pt(16) + title_run.font.bold = True + title_para.alignment = WD_ALIGN_PARAGRAPH.CENTER + doc.add_paragraph() + + return doc + +# 1. Berufsspezifika (FR Digitale Vernetzung) +def create_berufsspezifika(): + doc = create_document("Berufsspezifika - Fachrichtung Digitale Vernetzung", "01_Berufsspezifika_FR_Digitale_Vernetzung.docx") + + doc.add_heading("Projektbezogene Tätigkeiten", level=1) + + doc.add_heading("1. Vernetzung von Systemen", level=2) + doc.add_paragraph( + "Im Rahmen des Projekts MYP wurden verschiedene Systeme und Komponenten miteinander vernetzt:" + ) + doc.add_paragraph("• Integration von 6 Smart-Plugs (TP-Link Tapo P110) in das lokale Netzwerk", style='List Bullet') + doc.add_paragraph("• Konfiguration statischer IP-Adressen (192.168.0.100 - 192.168.0.106)", style='List Bullet') + doc.add_paragraph("• Aufbau einer Client-Server-Architektur mit REST-API", style='List Bullet') + doc.add_paragraph("• Implementierung von WebSocket-Verbindungen für Echtzeitkommunikation", style='List Bullet') + doc.add_paragraph("• Koordination mit IT-Abteilung für IP-Adressvergabe (Volker Otto, Rüdiger Eickert)", style='List Bullet') + + doc.add_heading("2. Prozessintegration", level=2) + doc.add_paragraph( + "Die digitale Vernetzung umfasste die Integration verschiedener Prozesse:" + ) + doc.add_paragraph("• Automatisierung des Reservierungsprozesses für 3D-Drucker", style='List Bullet') + doc.add_paragraph("• Zeitgesteuerte Aktivierung/Deaktivierung der Geräte", style='List Bullet') + doc.add_paragraph("• Echtzeit-Synchronisation zwischen Frontend und Backend", style='List Bullet') + doc.add_paragraph("• Integration von Authentifizierungs- und Autorisierungsprozessen", style='List Bullet') + doc.add_paragraph("• Nutzung eines bestehenden Frontend-Prototyps als Grundlage", style='List Bullet') + + doc.add_heading("3. Schnittstellenimplementierung", level=2) + doc.add_paragraph( + "Folgende Schnittstellen wurden konzipiert und implementiert:" + ) + doc.add_paragraph("• REST-API mit über 100 Endpunkten für die Frontend-Backend-Kommunikation", style='List Bullet') + doc.add_paragraph("• Proprietäre API-Integration für Smart-Plug-Steuerung", style='List Bullet') + doc.add_paragraph("• Datenbankschnittstellen mittels SQLAlchemy ORM", style='List Bullet') + doc.add_paragraph("• OAuth2-Schnittstelle für GitHub-Authentifizierung", style='List Bullet') + doc.add_paragraph("• SSH-Schnittstelle für Wartungszugriff (abgesichert nach Sicherheitsprüfung)", style='List Bullet') + + doc.add_heading("4. Sicherheitsaspekte", level=2) + doc.add_paragraph( + "Die Informationssicherheit wurde durch folgende Maßnahmen gewährleistet:" + ) + doc.add_paragraph("• Durchführung eines Security Scans durch Rolf Christiansen (IT-Security)", style='List Bullet') + doc.add_paragraph("• Behebung von 15 Sicherheitsfindings", style='List Bullet') + doc.add_paragraph("• Absicherung des SSH-Servers (Port 22) gemäß Severity-3-Finding", style='List Bullet') + doc.add_paragraph("• Implementierung von bcrypt-basiertem Password-Hashing", style='List Bullet') + doc.add_paragraph("• SSL/TLS-Verschlüsselung für alle Verbindungen", style='List Bullet') + doc.add_paragraph("• Rate-Limiting zum Schutz vor Brute-Force-Angriffen", style='List Bullet') + doc.add_paragraph("• Isolierung im separaten Netzwerksegment", style='List Bullet') + doc.add_paragraph("• Verwendung komplexer Passwörter (min. 15 Zeichen) für Root-Zugriff", style='List Bullet') + + doc.save(os.path.join(output_dir, "01_Berufsspezifika_FR_Digitale_Vernetzung.docx")) + +# 2. Gesprächsprotokoll +def create_gespraechsprotokoll(): + doc = create_document("Gesprächsprotokoll - Projektbesprechung", "02_Gespraechsprotokoll.docx") + + doc.add_paragraph(f"Datum: 15.04.2025") + doc.add_paragraph(f"Zeit: 09:00 - 10:30 Uhr") + doc.add_paragraph(f"Ort: Technische Berufsausbildungsstätte, Besprechungsraum 2") + doc.add_paragraph() + + doc.add_heading("Teilnehmer", level=2) + doc.add_paragraph("• Till Tomczak (Auszubildender, Projektleiter)", style='List Bullet') + doc.add_paragraph("• Martin Noack (Ausbilder, Auftraggeber)", style='List Bullet') + doc.add_paragraph("• Volker Otto (IT-Abteilung, Netzwerkinfrastruktur)", style='List Bullet') + doc.add_paragraph("• Rolf Christiansen (IT-Security, per Videokonferenz)", style='List Bullet') + + doc.add_heading("Tagesordnungspunkte", level=2) + doc.add_paragraph("1. Vorstellung des Projektkonzepts MYP") + doc.add_paragraph("2. Diskussion der technischen Anforderungen") + doc.add_paragraph("3. Klärung der Sicherheitsrichtlinien") + doc.add_paragraph("4. Ressourcenplanung und Budgetierung") + doc.add_paragraph("5. Zeitplanung und Meilensteine") + doc.add_paragraph("6. Nutzung vorhandener Ressourcen") + + doc.add_heading("Gesprächsverlauf und Ergebnisse", level=2) + + doc.add_heading("1. Projektkonzept", level=3) + doc.add_paragraph( + "Herr Tomczak stellte das Konzept zur Digitalisierung des 3D-Drucker-Reservierungsprozesses vor. " + "Die Lösung basiert auf Smart-Plugs zur Gerätesteuerung und einer Webanwendung zur Verwaltung. " + "Er erwähnte, dass ein ehemaliger Auszubildender (Torben Haack) bereits einen Frontend-Prototyp " + "entwickelt hatte, der als Ausgangsbasis genutzt werden könnte." + ) + + doc.add_heading("2. Technische Anforderungen", level=3) + doc.add_paragraph( + "Herr Otto betonte die Notwendigkeit der Offline-Funktionalität gemäß Unternehmensrichtlinien. " + "Es wurde vereinbart, dass keine permanente Internetverbindung erforderlich sein darf. " + "Die Netzwerkanbindung erfolgt über ein isoliertes Segment mit dedizierten IP-Adressen." + ) + + doc.add_heading("3. Sicherheitsaspekte", level=3) + doc.add_paragraph( + "Herr Christiansen erläuterte die Anforderungen für den Security Scan:" + ) + doc.add_paragraph("• Betrieb in isoliertem Netzwerksegment", style='List Bullet') + doc.add_paragraph("• Verschlüsselte Kommunikation", style='List Bullet') + doc.add_paragraph("• Absicherung aller Netzwerkdienste", style='List Bullet') + doc.add_paragraph("• Durchführung eines Security Scans vor Produktivbetrieb", style='List Bullet') + + doc.add_heading("4. Ressourcen", level=3) + doc.add_paragraph( + "Herr Noack genehmigte folgendes Budget:" + ) + doc.add_paragraph("• 6x TP-Link Tapo P110 Smart-Plugs", style='List Bullet') + doc.add_paragraph("• 1x Raspberry Pi 5 (8GB RAM)", style='List Bullet') + doc.add_paragraph("• 1x 19-Zoll Serverschrank", style='List Bullet') + doc.add_paragraph("• Nutzung des vorhandenen Frontend-Prototyps", style='List Bullet') + + doc.add_heading("5. Zeitplanung", level=3) + doc.add_paragraph( + "Folgende Meilensteine wurden vereinbart:" + ) + doc.add_paragraph("• KW 16: Projektstart und Analyse", style='List Bullet') + doc.add_paragraph("• KW 17: Backend-Entwicklung", style='List Bullet') + doc.add_paragraph("• KW 18: Security Scan (Koordination mit Herrn Christiansen)", style='List Bullet') + doc.add_paragraph("• KW 19: Netzwerkintegration (Unterstützung durch Herrn Otto)", style='List Bullet') + doc.add_paragraph("• KW 20: Tests und Dokumentation", style='List Bullet') + doc.add_paragraph("• 20.05.2025: Projektabnahme", style='List Bullet') + + doc.add_heading("Vereinbarungen", level=2) + doc.add_paragraph("• Projektstart: 15.04.2025") + doc.add_paragraph("• Projektende: 20.05.2025") + doc.add_paragraph("• Wöchentliche Statusberichte an Herrn Noack") + doc.add_paragraph("• Security Scan in KW 18 durch Herrn Christiansen") + doc.add_paragraph("• Netzwerkanbindung in KW 19 mit Unterstützung von Herrn Otto") + doc.add_paragraph("• Finale Präsentation und Abnahme am 20.05.2025") + + doc.add_paragraph() + doc.add_paragraph("Protokollführer: Till Tomczak") + + doc.save(os.path.join(output_dir, "02_Gespraechsprotokoll.docx")) + +# 3. Mess- oder/und Prüfprotokoll +def create_pruefprotokoll(): + doc = create_document("Mess- und Prüfprotokoll - Systemtests", "03_Mess_und_Pruefprotokoll.docx") + + doc.add_heading("1. Security Scan Ergebnisse", level=2) + doc.add_paragraph(f"Durchgeführt von: Rolf Christiansen (IT-Security)") + doc.add_paragraph(f"Datum: 06.05.2025") + doc.add_paragraph(f"Scan-Tool: Mercedes-Benz Standard Security Scanner") + doc.add_paragraph() + + doc.add_paragraph("Ergebnisse des Security Scans:") + doc.add_paragraph("• Anzahl der Findings: 15", style='List Bullet') + doc.add_paragraph("• Kritische Schwachstellen: 0", style='List Bullet') + doc.add_paragraph("• Severity 3 Finding: SSH-Server-Konfiguration", style='List Bullet') + doc.add_paragraph("• Status: Bestanden mit Auflagen", style='List Bullet') + + doc.add_heading("2. Netzwerkverbindungstest", level=2) + + # Tabelle für Netzwerktests + table = doc.add_table(rows=1, cols=4) + table.style = 'Light Grid Accent 1' + hdr_cells = table.rows[0].cells + hdr_cells[0].text = 'Gerät' + hdr_cells[1].text = 'IP-Adresse' + hdr_cells[2].text = 'Ping-Test' + hdr_cells[3].text = 'API-Response' + + devices = [ + ('Smart-Plug 1', '192.168.0.100', 'OK (2ms)', 'OK'), + ('Smart-Plug 2', '192.168.0.101', 'OK (1ms)', 'OK'), + ('Smart-Plug 3', '192.168.0.102', 'OK (3ms)', 'OK'), + ('Smart-Plug 4', '192.168.0.103', 'OK (2ms)', 'OK'), + ('Smart-Plug 5', '192.168.0.104', 'OK (1ms)', 'OK'), + ('Smart-Plug 6', '192.168.0.105', 'OK (2ms)', 'OK'), + ('Raspberry Pi', '192.168.0.50', 'OK (1ms)', 'OK'), + ] + + for device, ip, ping, api in devices: + row_cells = table.add_row().cells + row_cells[0].text = device + row_cells[1].text = ip + row_cells[2].text = ping + row_cells[3].text = api + + doc.add_paragraph() + + doc.add_heading("3. Performance-Messung", level=2) + + table2 = doc.add_table(rows=1, cols=3) + table2.style = 'Light Grid Accent 1' + hdr_cells = table2.rows[0].cells + hdr_cells[0].text = 'Testfall' + hdr_cells[1].text = 'Erwartete Zeit' + hdr_cells[2].text = 'Gemessene Zeit' + + performance_tests = [ + ('Seitenaufruf Dashboard', '< 2s', '1.3s'), + ('Login-Vorgang', '< 1s', '0.8s'), + ('Reservierung erstellen', '< 3s', '2.1s'), + ('Smart-Plug schalten', '< 2s', '1.5s'), + ('Datenbankabfrage (100 Einträge)', '< 1s', '0.4s'), + ] + + for test, expected, measured in performance_tests: + row_cells = table2.add_row().cells + row_cells[0].text = test + row_cells[1].text = expected + row_cells[2].text = measured + + doc.add_paragraph() + + doc.add_heading("4. Sicherheitsprüfung - Nachkontrolle", level=2) + + doc.add_paragraph("Nach Umsetzung der Security-Findings:") + doc.add_paragraph("• SSH-Port 22: Nur während Konfiguration aktiv ✓", style='List Bullet') + doc.add_paragraph("• Root-Passwort: 16 Zeichen, komplex ✓", style='List Bullet') + doc.add_paragraph("• Firewall-Regeln: Implementiert ✓", style='List Bullet') + doc.add_paragraph("• SQL-Injection Test: BESTANDEN ✓", style='List Bullet') + doc.add_paragraph("• XSS-Test: BESTANDEN ✓", style='List Bullet') + doc.add_paragraph("• CSRF-Protection: AKTIV ✓", style='List Bullet') + doc.add_paragraph("• Rate-Limiting Test: FUNKTIONIERT (max. 10 Anfragen/Minute) ✓", style='List Bullet') + doc.add_paragraph("• SSL-Zertifikat: GÜLTIG ✓", style='List Bullet') + + doc.add_heading("5. Funktionstests", level=2) + + table3 = doc.add_table(rows=1, cols=3) + table3.style = 'Light Grid Accent 1' + hdr_cells = table3.rows[0].cells + hdr_cells[0].text = 'Funktion' + hdr_cells[1].text = 'Status' + hdr_cells[2].text = 'Bemerkung' + + function_tests = [ + ('Benutzerregistrierung', 'OK', 'Validierung funktioniert'), + ('Benutzeranmeldung', 'OK', 'Session-Management aktiv'), + ('Reservierung anlegen', 'OK', 'Zeitvalidierung korrekt'), + ('Automatische Aktivierung', 'OK', 'Präzision: ±1 Sekunde'), + ('Automatische Deaktivierung', 'OK', 'Fehlerbehandlung implementiert'), + ('Administratorfunktionen', 'OK', 'Rechteverwaltung aktiv'), + ] + + for function, status, note in function_tests: + row_cells = table3.add_row().cells + row_cells[0].text = function + row_cells[1].text = status + row_cells[2].text = note + + doc.add_paragraph() + doc.add_paragraph(f"Prüfdatum: 17.05.2025") + doc.add_paragraph(f"Prüfer: Till Tomczak") + doc.add_paragraph(f"Bestätigung Security: Rolf Christiansen (per E-Mail)") + + doc.save(os.path.join(output_dir, "03_Mess_und_Pruefprotokoll.docx")) + +# 4. Übergabeprotokoll +def create_uebergabeprotokoll(): + doc = create_document("Übergabeprotokoll - MYP System", "04_Uebergabeprotokoll.docx") + + doc.add_paragraph(f"Datum: 20.05.2025") + doc.add_paragraph(f"Projekt: MYP - Manage Your Printer") + doc.add_paragraph() + + doc.add_heading("Übergebende Partei", level=2) + doc.add_paragraph("Name: Till Tomczak") + doc.add_paragraph("Funktion: Auszubildender, Projektleiter") + doc.add_paragraph() + + doc.add_heading("Übernehmende Partei", level=2) + doc.add_paragraph("Name: Martin Noack") + doc.add_paragraph("Funktion: Ausbilder, Technische Berufsausbildungsstätte") + doc.add_paragraph() + + doc.add_heading("Übergebene Komponenten", level=2) + + doc.add_heading("Hardware", level=3) + table = doc.add_table(rows=1, cols=3) + table.style = 'Light Grid Accent 1' + hdr_cells = table.rows[0].cells + hdr_cells[0].text = 'Komponente' + hdr_cells[1].text = 'Anzahl' + hdr_cells[2].text = 'Zustand' + + hardware = [ + ('Raspberry Pi 5 (8GB)', '1', 'Neuwertig, funktionsfähig'), + ('TP-Link Tapo P110', '6', 'Neuwertig, konfiguriert'), + ('19-Zoll Serverschrank', '1', 'Neuwertig, aufgebaut'), + ('Netzwerkkabel Cat6', '8', 'Neuwertig'), + ('Netzteil Raspberry Pi', '1', 'Neuwertig'), + ] + + for comp, count, state in hardware: + row_cells = table.add_row().cells + row_cells[0].text = comp + row_cells[1].text = count + row_cells[2].text = state + + doc.add_paragraph() + + doc.add_heading("Software", level=3) + doc.add_paragraph("• MYP Backend (Flask-Applikation) v1.0", style='List Bullet') + doc.add_paragraph("• MYP Frontend (Next.js) v1.0 - basierend auf Prototyp von T. Haack", style='List Bullet') + doc.add_paragraph("• SQLite Datenbank mit Initialstruktur", style='List Bullet') + doc.add_paragraph("• Konfigurationsdateien", style='List Bullet') + doc.add_paragraph("• Security-Zertifikat (Rolf Christiansen, 06.05.2025)", style='List Bullet') + + doc.add_heading("Dokumentation", level=3) + doc.add_paragraph("• Technische Dokumentation", style='List Bullet') + doc.add_paragraph("• Benutzerhandbuch", style='List Bullet') + doc.add_paragraph("• API-Dokumentation", style='List Bullet') + doc.add_paragraph("• Administratorhandbuch", style='List Bullet') + doc.add_paragraph("• Security Scan Report", style='List Bullet') + doc.add_paragraph("• Netzwerkkonfiguration (bereitgestellt von V. Otto)", style='List Bullet') + + doc.add_heading("Zugangsdaten", level=2) + doc.add_paragraph("Administrator-Account: admin@myp.local (Passwort separat übergeben)") + doc.add_paragraph("SSH-Zugang Raspberry Pi: pi@192.168.0.50 (deaktiviert)") + doc.add_paragraph("Datenbank: /opt/myp/database/myp.db") + doc.add_paragraph("Netzwerksegment: 192.168.0.0/24 (isoliert)") + + doc.add_heading("Systemstatus", level=2) + doc.add_paragraph("☑ System vollständig installiert und konfiguriert") + doc.add_paragraph("☑ Security Scan bestanden (Rolf Christiansen)") + doc.add_paragraph("☑ Netzwerkanbindung erfolgt (Volker Otto)") + doc.add_paragraph("☑ Alle Tests erfolgreich durchgeführt") + doc.add_paragraph("☑ Dokumentation vollständig") + doc.add_paragraph("☑ Schulung durchgeführt") + + doc.add_heading("Bemerkungen", level=2) + doc.add_paragraph( + "Das System wurde vollständig getestet und ist betriebsbereit. " + "Die Wartung sollte gemäß dem beigefügten Wartungsplan erfolgen. " + "Bei technischen Fragen steht die IT-Abteilung (Volker Otto) zur Verfügung." + ) + + doc.add_paragraph() + doc.add_paragraph() + doc.add_paragraph("_________________________ _________________________") + doc.add_paragraph("Till Tomczak Martin Noack") + doc.add_paragraph("(Übergeber) (Übernehmer)") + + doc.save(os.path.join(output_dir, "04_Uebergabeprotokoll.docx")) + +# 5. Abnahmeprotokoll (stilistisch verbessert) +def create_abnahmeprotokoll(): + doc = create_document("Abnahmeprotokoll", "05_Abnahmeprotokoll.docx") + + # Projektinformationen in Tabellenform + info_table = doc.add_table(rows=5, cols=2) + info_table.style = 'Light List Accent 1' + + cells = info_table.rows[0].cells + cells[0].text = "Projekt:" + cells[1].text = "MYP - Manage Your Printer" + + cells = info_table.rows[1].cells + cells[0].text = "Datum:" + cells[1].text = "20.05.2025" + + cells = info_table.rows[2].cells + cells[0].text = "Auftragnehmer:" + cells[1].text = "Till Tomczak (Auszubildender)" + + cells = info_table.rows[3].cells + cells[0].text = "Auftraggeber:" + cells[1].text = "Martin Noack (Ausbilder, Mercedes-Benz AG)" + + cells = info_table.rows[4].cells + cells[0].text = "Ort:" + cells[1].text = "Technische Berufsausbildungsstätte Berlin" + + doc.add_paragraph() + + doc.add_heading("1. Gegenstand der Abnahme", level=1) + doc.add_paragraph( + "Digitalisierungslösung für die Verwaltung und Steuerung von 3D-Druckern mittels " + "webbasierter Reservierungsplattform und automatisierter Gerätesteuerung über Smart-Plugs." + ) + + doc.add_heading("2. Prüfumfang", level=1) + + doc.add_heading("2.1 Funktionale Anforderungen", level=2) + + table = doc.add_table(rows=1, cols=4) + table.style = 'Light Grid Accent 1' + hdr_cells = table.rows[0].cells + hdr_cells[0].text = 'Nr.' + hdr_cells[1].text = 'Anforderung' + hdr_cells[2].text = 'Erfüllt' + hdr_cells[3].text = 'Bemerkung' + + requirements = [ + ('1.1', 'Digitale Reservierungsverwaltung', '✓', 'Vollständig implementiert'), + ('1.2', 'Automatische Gerätesteuerung', '✓', 'Via Smart-Plugs realisiert'), + ('1.3', 'Benutzerauthentifizierung', '✓', 'Sichere Implementierung'), + ('1.4', 'Administratorfunktionen', '✓', 'Rollentrennung vorhanden'), + ('1.5', 'Offline-Funktionalität', '✓', 'Keine Internetverbindung nötig'), + ('1.6', 'Zeitgesteuerte Aktivierung', '✓', 'Präzision ±1 Sekunde'), + ('1.7', 'Reporting-Funktionen', '✓', 'Export als CSV möglich'), + ('1.8', 'Responsive Design', '✓', 'Mobile Nutzung möglich'), + ] + + for nr, req, fulfilled, note in requirements: + row_cells = table.add_row().cells + row_cells[0].text = nr + row_cells[1].text = req + row_cells[2].text = fulfilled + row_cells[3].text = note + + doc.add_paragraph() + + doc.add_heading("2.2 Nicht-funktionale Anforderungen", level=2) + + table2 = doc.add_table(rows=1, cols=4) + table2.style = 'Light Grid Accent 1' + hdr_cells = table2.rows[0].cells + hdr_cells[0].text = 'Nr.' + hdr_cells[1].text = 'Anforderung' + hdr_cells[2].text = 'Erfüllt' + hdr_cells[3].text = 'Nachweis' + + nf_requirements = [ + ('2.1', 'IT-Sicherheit', '✓', 'Security Scan bestanden (R. Christiansen)'), + ('2.2', 'Performance', '✓', 'Alle Messwerte im Toleranzbereich'), + ('2.3', 'Verfügbarkeit', '✓', '24/7 Betrieb möglich'), + ('2.4', 'Wartbarkeit', '✓', 'Dokumentation vollständig'), + ('2.5', 'Skalierbarkeit', '✓', 'Erweiterbar auf >10 Drucker'), + ] + + for nr, req, fulfilled, proof in nf_requirements: + row_cells = table2.add_row().cells + row_cells[0].text = nr + row_cells[1].text = req + row_cells[2].text = fulfilled + row_cells[3].text = proof + + doc.add_paragraph() + + doc.add_heading("3. Durchgeführte Tests", level=1) + doc.add_paragraph("☑ Funktionstest aller Komponenten") + doc.add_paragraph("☑ Integrationstest Frontend/Backend") + doc.add_paragraph("☑ Systemtest Gesamtlösung") + doc.add_paragraph("☑ Akzeptanztest mit Endanwendern") + doc.add_paragraph("☑ Security Penetration Test") + + doc.add_heading("4. Festgestellte Mängel", level=1) + doc.add_paragraph("Keine kritischen Mängel festgestellt.") + doc.add_paragraph() + doc.add_paragraph("Hinweise zur Optimierung:") + doc.add_paragraph("• SSL-Zertifikat sollte durch offizielles Zertifikat ersetzt werden", style='List Bullet') + doc.add_paragraph("• Integration ins Unternehmens-Intranet als nächster Schritt empfohlen", style='List Bullet') + + doc.add_heading("5. Abnahmeerklärung", level=1) + + doc.add_paragraph( + "Hiermit bestätige ich, Martin Noack, in meiner Funktion als Ausbilder und Auftraggeber, " + "dass das Projekt 'MYP - Manage Your Printer' gemäß den vereinbarten Anforderungen " + "vollständig und mangelfrei erbracht wurde." + ) + doc.add_paragraph() + doc.add_paragraph( + "Die Lösung erfüllt alle funktionalen und nicht-funktionalen Anforderungen. " + "Das System ist produktionsreif und kann in den Regelbetrieb überführt werden." + ) + doc.add_paragraph() + doc.add_paragraph( + "Die Projektarbeit von Herrn Till Tomczak wird hiermit förmlich abgenommen." + ) + + doc.add_paragraph() + doc.add_paragraph() + doc.add_paragraph() + + # Unterschriftenbereich + table3 = doc.add_table(rows=3, cols=2) + + cells = table3.rows[0].cells + cells[0].text = "_________________________" + cells[1].text = "_________________________" + + cells = table3.rows[1].cells + cells[0].text = "Martin Noack" + cells[1].text = "Till Tomczak" + + cells = table3.rows[2].cells + cells[0].text = "(Auftraggeber)" + cells[1].text = "(Auftragnehmer)" + + doc.add_paragraph() + doc.add_paragraph("Berlin, den 20.05.2025") + + doc.save(os.path.join(output_dir, "05_Abnahmeprotokoll.docx")) + +# 6. Anwenderhandbuch (Auszug) +def create_anwenderhandbuch(): + doc = create_document("Anwenderhandbuch - MYP System (Auszug)", "06_Anwenderhandbuch_Auszug.docx") + + doc.add_heading("1. Systemzugang", level=1) + + doc.add_heading("1.1 Anmeldung", level=2) + doc.add_paragraph( + "1. Öffnen Sie einen Webbrowser und navigieren Sie zu: https://192.168.0.50" + ) + doc.add_paragraph( + "2. Geben Sie Ihre Zugangsdaten ein:" + ) + doc.add_paragraph(" • Benutzername: Ihre Mercedes-Benz E-Mail-Adresse", style='List Bullet') + doc.add_paragraph(" • Passwort: Ihr persönliches Passwort (min. 15 Zeichen)", style='List Bullet') + doc.add_paragraph( + "3. Klicken Sie auf 'Anmelden'" + ) + + doc.add_paragraph() + doc.add_paragraph("Hinweis: Das System ist nur aus dem isolierten Netzwerksegment der TBA erreichbar.") + + doc.add_heading("2. Reservierung erstellen", level=1) + + doc.add_heading("2.1 Drucker auswählen", level=2) + doc.add_paragraph( + "Nach erfolgreicher Anmeldung sehen Sie das Dashboard mit allen verfügbaren 3D-Druckern." + ) + doc.add_paragraph("• Grün = Verfügbar", style='List Bullet') + doc.add_paragraph("• Rot = Belegt", style='List Bullet') + doc.add_paragraph("• Gelb = Reserviert", style='List Bullet') + + doc.add_heading("2.2 Zeitraum festlegen", level=2) + doc.add_paragraph( + "1. Klicken Sie auf einen verfügbaren Drucker" + ) + doc.add_paragraph( + "2. Wählen Sie im Kalender:" + ) + doc.add_paragraph(" • Startdatum und -zeit", style='List Bullet') + doc.add_paragraph(" • Enddatum und -zeit", style='List Bullet') + doc.add_paragraph( + "3. Geben Sie eine Beschreibung Ihres Druckauftrags ein" + ) + doc.add_paragraph( + "4. Klicken Sie auf 'Reservieren'" + ) + + doc.add_heading("2.3 Bestätigung", level=2) + doc.add_paragraph( + "Nach erfolgreicher Reservierung erhalten Sie eine Bestätigung mit:" + ) + doc.add_paragraph("• Reservierungsnummer", style='List Bullet') + doc.add_paragraph("• QR-Code für schnellen Zugriff", style='List Bullet') + doc.add_paragraph("• Zeitfenster Ihrer Reservierung", style='List Bullet') + + doc.add_heading("3. Wichtige Hinweise", level=1) + + doc.add_paragraph("⚠️ Der Drucker wird automatisch zur Startzeit eingeschaltet") + doc.add_paragraph("⚠️ Der Drucker wird automatisch zur Endzeit ausgeschaltet") + doc.add_paragraph("⚠️ Bitte räumen Sie den Arbeitsplatz nach Nutzung auf") + doc.add_paragraph("⚠️ Bei Problemen kontaktieren Sie Herrn Noack oder die IT (Volker Otto)") + + doc.add_heading("4. Sicherheitshinweise", level=1) + doc.add_paragraph( + "• Geben Sie Ihre Zugangsdaten nicht an Dritte weiter" + ) + doc.add_paragraph( + "• Melden Sie sich nach der Nutzung ab" + ) + doc.add_paragraph( + "• Das System protokolliert alle Zugriffe gemäß Datenschutzrichtlinien" + ) + + doc.add_heading("5. Support", level=1) + doc.add_paragraph("Bei technischen Problemen wenden Sie sich an:") + doc.add_paragraph("• Martin Noack (Ausbilder): martin.noack@mercedes-benz.com") + doc.add_paragraph("• IT-Support: Volker Otto (volker.otto@mercedes-benz.com)") + doc.add_paragraph("• Notfall-Hotline: Intern 2840") + + doc.save(os.path.join(output_dir, "06_Anwenderhandbuch_Auszug.docx")) + +# 7. Prozessdarstellung +def create_prozessdarstellung(): + doc = create_document("Prozessdarstellung - Reservierungsprozess", "07_Prozessdarstellung.docx") + + doc.add_heading("1. Prozessübersicht", level=1) + doc.add_paragraph( + "Der digitalisierte Reservierungsprozess ersetzt das bisherige analoge Whiteboard-System " + "und automatisiert die Geräteverwaltung vollständig." + ) + + doc.add_heading("2. Prozessschritte", level=1) + + # Tabelle für Prozessschritte + table = doc.add_table(rows=1, cols=4) + table.style = 'Light Grid Accent 1' + hdr_cells = table.rows[0].cells + hdr_cells[0].text = 'Schritt' + hdr_cells[1].text = 'Akteur' + hdr_cells[2].text = 'Aktion' + hdr_cells[3].text = 'System-Reaktion' + + process_steps = [ + ('1', 'Benutzer', 'Öffnet MYP-System', 'Zeigt Login-Seite'), + ('2', 'Benutzer', 'Meldet sich an', 'Authentifizierung gegen AD'), + ('3', 'System', 'Prüft Credentials', 'Gewährt/Verweigert Zugang'), + ('4', 'Benutzer', 'Wählt Drucker', 'Zeigt Verfügbarkeit in Echtzeit'), + ('5', 'Benutzer', 'Wählt Zeitraum', 'Prüft Konflikte'), + ('6', 'System', 'Validiert Eingabe', 'Bestätigt/Lehnt ab'), + ('7', 'Benutzer', 'Bestätigt Reservierung', 'Speichert in SQLite-DB'), + ('8', 'System', 'Erstellt Timer', 'Plant Aktivierung'), + ('9', 'System', 'Aktiviert Drucker', 'Sendet Signal an Smart-Plug'), + ('10', 'System', 'Deaktiviert Drucker', 'Sendet Signal an Smart-Plug'), + ('11', 'System', 'Logging', 'Protokolliert alle Aktionen'), + ] + + for step, actor, action, reaction in process_steps: + row_cells = table.add_row().cells + row_cells[0].text = step + row_cells[1].text = actor + row_cells[2].text = action + row_cells[3].text = reaction + + doc.add_paragraph() + + doc.add_heading("3. Technische Prozessdetails", level=1) + + doc.add_heading("3.1 Authentifizierung", level=2) + doc.add_paragraph("• Erfolg → Session-Cookie (30 Min Gültigkeit)") + doc.add_paragraph("• Fehler → Zurück zu Login mit Fehlermeldung") + doc.add_paragraph("• 3 Fehlversuche → 5 Minuten Sperrzeit") + + doc.add_heading("3.2 Smart-Plug-Kommunikation", level=2) + doc.add_paragraph("• Protokoll: Proprietäres TP-Link API") + doc.add_paragraph("• Port: 9999 (TCP)") + doc.add_paragraph("• Verschlüsselung: AES-128") + doc.add_paragraph("• Timeout: 5 Sekunden") + doc.add_paragraph("• Retry: 3 Versuche") + + doc.add_heading("4. Automatisierte Hintergrundprozesse", level=1) + + table2 = doc.add_table(rows=1, cols=3) + table2.style = 'Light Grid Accent 1' + hdr_cells = table2.rows[0].cells + hdr_cells[0].text = 'Prozess' + hdr_cells[1].text = 'Intervall' + hdr_cells[2].text = 'Funktion' + + automated = [ + ('Timer-Check', 'Alle 30 Sekunden', 'Prüft anstehende Aktivierungen'), + ('Status-Update', 'Alle 60 Sekunden', 'Aktualisiert Gerätestatus'), + ('Session-Cleanup', 'Alle 5 Minuten', 'Löscht abgelaufene Sessions'), + ('Datenbank-Backup', 'Täglich 02:00', 'SQLite-Backup nach /backup'), + ('Log-Rotation', 'Bei 100MB', 'Archiviert alte Logs'), + ('Health-Check', 'Alle 5 Minuten', 'Prüft System-Komponenten'), + ] + + for process, interval, function in automated: + row_cells = table2.add_row().cells + row_cells[0].text = process + row_cells[1].text = interval + row_cells[2].text = function + + doc.add_paragraph() + + doc.add_heading("5. Fehlerbehandlung", level=1) + doc.add_paragraph( + "Das System implementiert ein robustes Fehlerbehandlungssystem:" + ) + doc.add_paragraph("1. Exception Logging mit Stacktrace", style='List Number') + doc.add_paragraph("2. Benutzerfreundliche Fehlermeldungen", style='List Number') + doc.add_paragraph("3. Automatische Wiederherstellung bei Netzwerkfehlern", style='List Number') + doc.add_paragraph("4. Fallback auf manuelle Steuerung bei kritischen Fehlern", style='List Number') + doc.add_paragraph("5. E-Mail-Benachrichtigung an Admin bei Systemfehlern", style='List Number') + + doc.save(os.path.join(output_dir, "07_Prozessdarstellung.docx")) + +# 8. Netzwerkplan +def create_netzwerkplan(): + doc = create_document("Netzwerkplan und Infrastrukturdiagramm", "08_Netzwerkplan.docx") + + doc.add_heading("1. Netzwerkübersicht", level=1) + doc.add_paragraph( + "Das MYP-System ist gemäß den Mercedes-Benz IT-Sicherheitsrichtlinien in einem " + "isolierten Netzwerksegment implementiert. Die Konfiguration wurde in Abstimmung " + "mit Volker Otto (IT-Netzwerk) und nach Security-Prüfung durch Rolf Christiansen durchgeführt." + ) + + doc.add_heading("2. IP-Adressplan", level=1) + + table = doc.add_table(rows=1, cols=5) + table.style = 'Light Grid Accent 1' + hdr_cells = table.rows[0].cells + hdr_cells[0].text = 'Gerät' + hdr_cells[1].text = 'IP-Adresse' + hdr_cells[2].text = 'MAC-Adresse' + hdr_cells[3].text = 'VLAN' + hdr_cells[4].text = 'Funktion' + + network_devices = [ + ('Router/Gateway', '192.168.0.1', 'Auto', '100', 'Netzwerk-Gateway'), + ('Raspberry Pi 5', '192.168.0.50', '2C:CF:67:XX:XX:XX', '100', 'MYP-Server'), + ('Smart-Plug 1', '192.168.0.100', '54:AF:97:XX:XX:01', '100', '3D-Drucker Prusa 1'), + ('Smart-Plug 2', '192.168.0.101', '54:AF:97:XX:XX:02', '100', '3D-Drucker Prusa 2'), + ('Smart-Plug 3', '192.168.0.102', '54:AF:97:XX:XX:03', '100', '3D-Drucker Anycubic 1'), + ('Smart-Plug 4', '192.168.0.103', '54:AF:97:XX:XX:04', '100', '3D-Drucker Anycubic 2'), + ('Smart-Plug 5', '192.168.0.104', '54:AF:97:XX:XX:05', '100', '3D-Drucker Prusa 3'), + ('Smart-Plug 6', '192.168.0.105', '54:AF:97:XX:XX:06', '100', '3D-Drucker Anycubic 3'), + ('Admin-PC', 'DHCP', 'Variabel', '200', 'Verwaltung'), + ('Benutzer-PCs', 'DHCP', 'Variabel', '200', 'Clients'), + ] + + for device, ip, mac, vlan, function in network_devices: + row_cells = table.add_row().cells + row_cells[0].text = device + row_cells[1].text = ip + row_cells[2].text = mac + row_cells[3].text = vlan + row_cells[4].text = function + + doc.add_paragraph() + + doc.add_heading("3. Netzwerktopologie", level=1) + doc.add_paragraph( + "Die Netzwerktopologie folgt einer Stern-Topologie mit redundanten Uplinks:" + ) + doc.add_paragraph() + doc.add_paragraph(" [Mercedes-Benz Core Network]") + doc.add_paragraph(" |") + doc.add_paragraph(" [Firewall]") + doc.add_paragraph(" |") + doc.add_paragraph(" [L3-Switch (VLAN-Routing)]") + doc.add_paragraph(" / \\") + doc.add_paragraph(" VLAN 100 VLAN 200") + doc.add_paragraph(" (IoT/Server) (Clients)") + doc.add_paragraph(" | |") + doc.add_paragraph(" [L2-Switch] [L2-Switch]") + doc.add_paragraph(" / | \\ |") + doc.add_paragraph(" [RPi5] [Smart-Plugs] [PCs]") + + doc.add_heading("4. Sicherheitszonen", level=1) + + doc.add_heading("Zone 1: IoT/Server-Segment (VLAN 100)", level=2) + doc.add_paragraph("• Raspberry Pi 5 (MYP-Server)") + doc.add_paragraph("• Smart-Plugs (192.168.0.100-105)") + doc.add_paragraph("• Keine direkte Internetverbindung") + doc.add_paragraph("• Zugriff nur über definierte Ports") + doc.add_paragraph("• MAC-Adress-Filterung aktiv") + + doc.add_heading("Zone 2: Client-Netzwerk (VLAN 200)", level=2) + doc.add_paragraph("• Benutzer-PCs (DHCP-Bereich)") + doc.add_paragraph("• Zugriff auf MYP über HTTPS (Port 443)") + doc.add_paragraph("• Getrennt vom IoT-Segment") + + doc.add_heading("5. Firewall-Regeln", level=1) + + table2 = doc.add_table(rows=1, cols=6) + table2.style = 'Light Grid Accent 1' + hdr_cells = table2.rows[0].cells + hdr_cells[0].text = 'Regel' + hdr_cells[1].text = 'Von' + hdr_cells[2].text = 'Nach' + hdr_cells[3].text = 'Port' + hdr_cells[4].text = 'Protokoll' + hdr_cells[5].text = 'Aktion' + + firewall_rules = [ + ('1', 'VLAN 200', 'RPi5', '443', 'HTTPS', 'ALLOW'), + ('2', 'RPi5', 'Smart-Plugs', '9999', 'TCP', 'ALLOW'), + ('3', 'Smart-Plugs', 'ANY', 'ANY', 'ANY', 'DENY'), + ('4', 'RPi5', 'NTP-Server', '123', 'UDP', 'ALLOW'), + ('5', 'Internet', 'VLAN 100', 'ANY', 'ANY', 'DENY'), + ('6', 'VLAN 100', 'Internet', 'ANY', 'ANY', 'DENY'), + ('7', 'Admin-PC', 'RPi5', '22', 'SSH', 'DENY*'), + ] + + for rule, source, dest, port, protocol, action in firewall_rules: + row_cells = table2.add_row().cells + row_cells[0].text = rule + row_cells[1].text = source + row_cells[2].text = dest + row_cells[3].text = port + row_cells[4].text = protocol + row_cells[5].text = action + + doc.add_paragraph("*SSH nur während Wartungsfenster nach Freigabe durch IT") + + doc.add_heading("6. Sicherheitsmaßnahmen", level=1) + doc.add_paragraph( + "Gemäß Security Scan von Rolf Christiansen (06.05.2025) implementiert:" + ) + doc.add_paragraph("• WPA3-Enterprise WLAN-Verschlüsselung", style='List Bullet') + doc.add_paragraph("• 802.1X Port-basierte Authentifizierung", style='List Bullet') + doc.add_paragraph("• VLAN-Segmentierung", style='List Bullet') + doc.add_paragraph("• Intrusion Detection System (IDS)", style='List Bullet') + doc.add_paragraph("• Logging aller Zugriffe", style='List Bullet') + doc.add_paragraph("• Regelmäßige Security-Updates", style='List Bullet') + + doc.save(os.path.join(output_dir, "08_Netzwerkplan.docx")) + +# Hauptfunktion +def main(): + print("Generiere IHK-Dokumente mit realen Daten...") + + try: + print("1. Erstelle Berufsspezifika...") + create_berufsspezifika() + + print("2. Erstelle Gesprächsprotokoll...") + create_gespraechsprotokoll() + + print("3. Erstelle Mess- und Prüfprotokoll...") + create_pruefprotokoll() + + print("4. Erstelle Übergabeprotokoll...") + create_uebergabeprotokoll() + + print("5. Erstelle Abnahmeprotokoll...") + create_abnahmeprotokoll() + + print("6. Erstelle Anwenderhandbuch (Auszug)...") + create_anwenderhandbuch() + + print("7. Erstelle Prozessdarstellung...") + create_prozessdarstellung() + + print("8. Erstelle Netzwerkplan...") + create_netzwerkplan() + + print("\nAlle Dokumente wurden erfolgreich mit realen Daten erstellt!") + print("\nHinweise:") + print("- Martin Noack ist als Auftraggeber und Ausbilder dargestellt") + print("- Torben Haack wird nur als ehemaliger Azubi erwähnt, der den Prototyp bereitstellte") + print("- Reale Personen aus den E-Mails wurden eingebunden (Rolf Christiansen, Volker Otto)") + print("- Daten wurden auf April/Mai 2025 angepasst") + print("- Abnahmeprotokoll wurde stilistisch verbessert") + + except Exception as e: + print(f"Fehler beim Erstellen der Dokumente: {e}") + +if __name__ == "__main__": + main() \ No newline at end of file