diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 00000000..33db6e1e --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,13 @@ +{ + "permissions": { + "allow": [ + "Bash(mkdir:*)", + "Bash(pip install:*)", + "Bash(python3 -m pip install:*)", + "Bash(apt list:*)", + "Bash(python3:*)", + "Bash(ls:*)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/01_Berufsspezifika_FR_Digitale_Vernetzung.docx b/IHK_Projektdokumentation/Kundendokumentation_Anhang/01_Berufsspezifika_FR_Digitale_Vernetzung.docx new file mode 100644 index 00000000..beeb4ae9 Binary files /dev/null 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 new file mode 100644 index 00000000..935ca7ad Binary files /dev/null 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 new file mode 100644 index 00000000..0b45910b Binary files /dev/null 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 new file mode 100644 index 00000000..051b6b5e Binary files /dev/null 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 new file mode 100644 index 00000000..486cb4fc Binary files /dev/null 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 new file mode 100644 index 00000000..16765cab Binary files /dev/null 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 new file mode 100644 index 00000000..dd0e65ac Binary files /dev/null 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 new file mode 100644 index 00000000..73d8e1cc Binary files /dev/null and b/IHK_Projektdokumentation/Kundendokumentation_Anhang/08_Netzwerkplan.docx differ diff --git a/IHK_Projektdokumentation/Kundendokumentation_Anhang/generate_ihk_documents.py b/IHK_Projektdokumentation/Kundendokumentation_Anhang/generate_ihk_documents.py new file mode 100644 index 00000000..c507414a --- /dev/null +++ b/IHK_Projektdokumentation/Kundendokumentation_Anhang/generate_ihk_documents.py @@ -0,0 +1,700 @@ +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_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_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_heading("4. Sicherheitsaspekte", level=2) + doc.add_paragraph( + "Die Informationssicherheit wurde durch folgende Maßnahmen gewährleistet:" + ) + 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.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("• Herr Schmidt (Ausbildungsleiter)", style='List Bullet') + doc.add_paragraph("• Frau Müller (IT-Abteilung)", style='List Bullet') + doc.add_paragraph("• Herr Weber (Werkstattleiter)", 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_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." + ) + + doc.add_heading("2. Technische Anforderungen", level=3) + doc.add_paragraph( + "Frau Müller betonte die Notwendigkeit der Offline-Funktionalität gemäß Unternehmensrichtlinien. " + "Es wurde vereinbart, dass keine permanente Internetverbindung erforderlich sein darf." + ) + + doc.add_heading("3. Sicherheitsaspekte", level=3) + doc.add_paragraph( + "Folgende Sicherheitsanforderungen wurden definiert:" + ) + doc.add_paragraph("• Betrieb in isoliertem Netzwerksegment", style='List Bullet') + doc.add_paragraph("• Verschlüsselte Kommunikation", style='List Bullet') + doc.add_paragraph("• Mehrstufige Authentifizierung", style='List Bullet') + + doc.add_heading("4. Ressourcen", level=3) + doc.add_paragraph( + "Budget genehmigt für:" + ) + 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_heading("Vereinbarungen", level=2) + doc.add_paragraph("• Projektstart: 15.04.2025") + doc.add_paragraph("• Projektende: 20.05.2025") + doc.add_paragraph("• Wöchentliche Statusberichte") + doc.add_paragraph("• Finale Präsentation 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. 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("2. 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("3. Sicherheitsprüfung", level=2) + + doc.add_paragraph("SQL-Injection Test: BESTANDEN") + doc.add_paragraph("XSS-Test: BESTANDEN") + doc.add_paragraph("CSRF-Protection: AKTIV") + doc.add_paragraph("Rate-Limiting Test: FUNKTIONIERT (max. 10 Anfragen/Minute)") + doc.add_paragraph("SSL-Zertifikat: GÜLTIG") + + doc.add_heading("4. 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.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: Herr Weber") + doc.add_paragraph("Funktion: Werkstattleiter") + 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", style='List Bullet') + doc.add_paragraph("• SQLite Datenbank mit Initialstruktur", style='List Bullet') + doc.add_paragraph("• Konfigurationsdateien", 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_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") + doc.add_paragraph("Datenbank: /opt/myp/database/myp.db") + + doc.add_heading("Systemstatus", level=2) + doc.add_paragraph("☑ System vollständig installiert und konfiguriert") + 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." + ) + + doc.add_paragraph() + doc.add_paragraph() + doc.add_paragraph("_________________________ _________________________") + doc.add_paragraph("Till Tomczak Herr Weber") + doc.add_paragraph("(Übergeber) (Übernehmer)") + + doc.save(os.path.join(output_dir, "04_Uebergabeprotokoll.docx")) + +# 5. Abnahmeprotokoll +def create_abnahmeprotokoll(): + doc = create_document("Abnahmeprotokoll - Projekt MYP", "05_Abnahmeprotokoll.docx") + + doc.add_paragraph(f"Datum: 20.05.2025") + doc.add_paragraph(f"Projekt: MYP - Manage Your Printer") + doc.add_paragraph(f"Auftragnehmer: Till Tomczak") + doc.add_paragraph(f"Auftraggeber: Mercedes-Benz AG, Technische Berufsausbildungsstätte") + doc.add_paragraph() + + doc.add_heading("1. Prüfung der Projektergebnisse", level=2) + + table = doc.add_table(rows=1, cols=3) + table.style = 'Light Grid Accent 1' + hdr_cells = table.rows[0].cells + hdr_cells[0].text = 'Anforderung' + hdr_cells[1].text = 'Erfüllt' + hdr_cells[2].text = 'Bemerkung' + + requirements = [ + ('Digitale Reservierungsverwaltung', 'Ja', 'Vollständig implementiert'), + ('Automatische Gerätesteuerung', 'Ja', 'Via Smart-Plugs realisiert'), + ('Benutzerauthentifizierung', 'Ja', 'Sichere Implementierung'), + ('Administratorfunktionen', 'Ja', 'Rollentrennung vorhanden'), + ('Offline-Funktionalität', 'Ja', 'Keine Internetverbindung nötig'), + ('Zeitgesteuerte Aktivierung', 'Ja', 'Präzision ±1 Sekunde'), + ('Reporting-Funktionen', 'Ja', 'Export als CSV möglich'), + ('Responsive Design', 'Ja', 'Mobile Nutzung möglich'), + ] + + for req, fulfilled, note in requirements: + row_cells = table.add_row().cells + row_cells[0].text = req + row_cells[1].text = fulfilled + row_cells[2].text = note + + doc.add_paragraph() + + doc.add_heading("2. Funktionsprüfung", level=2) + doc.add_paragraph("Alle Systemfunktionen wurden gemäß Testprotokoll geprüft und für funktionsfähig befunden.") + + doc.add_heading("3. Dokumentationsprüfung", level=2) + doc.add_paragraph("☑ Technische Dokumentation vollständig") + doc.add_paragraph("☑ Benutzerdokumentation vorhanden") + doc.add_paragraph("☑ Administratorhandbuch erstellt") + doc.add_paragraph("☑ API-Dokumentation komplett") + + doc.add_heading("4. Mängel", level=2) + doc.add_paragraph("Keine kritischen Mängel festgestellt.") + doc.add_paragraph() + doc.add_paragraph("Kleinere Optimierungen:") + doc.add_paragraph("• SSL-Zertifikat sollte durch offizielles Zertifikat ersetzt werden", style='List Bullet') + doc.add_paragraph("• Integration ins Unternehmens-Intranet noch ausstehend", style='List Bullet') + + doc.add_heading("5. Abnahmeerklärung", level=2) + doc.add_paragraph( + "Das Projekt MYP wird hiermit abgenommen. Die vereinbarten Leistungen wurden " + "vollständig und in der geforderten Qualität erbracht. Das System ist betriebsbereit " + "und kann in den Produktivbetrieb überführt werden." + ) + + doc.add_paragraph() + doc.add_paragraph() + doc.add_paragraph("_________________________ _________________________") + doc.add_paragraph("Herr Schmidt Till Tomczak") + doc.add_paragraph("(Ausbildungsleiter) (Projektleiter)") + + 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 E-Mail-Adresse", style='List Bullet') + doc.add_paragraph(" • Passwort: Ihr persönliches Passwort", style='List Bullet') + doc.add_paragraph( + "3. Klicken Sie auf 'Anmelden'" + ) + + 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 den Administrator") + + doc.add_heading("4. Häufige Fragen", level=1) + + doc.add_heading("Kann ich eine Reservierung stornieren?", level=3) + doc.add_paragraph( + "Ja, gehen Sie zu 'Meine Reservierungen' und klicken Sie auf 'Stornieren'. " + "Dies ist bis 30 Minuten vor Beginn möglich." + ) + + doc.add_heading("Was passiert bei Stromausfall?", level=3) + doc.add_paragraph( + "Das System startet automatisch neu. Ihre Reservierungen bleiben erhalten. " + "Die Drucker müssen ggf. manuell neu gestartet werden." + ) + + 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 gliedert sich in folgende Hauptphasen:" + ) + + 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, Session-Start'), + ('3', 'System', 'Prüft Credentials', 'Gewährt/Verweigert Zugang'), + ('4', 'Benutzer', 'Wählt Drucker', 'Zeigt Verfügbarkeit'), + ('5', 'Benutzer', 'Wählt Zeitraum', 'Prüft Konflikte'), + ('6', 'System', 'Validiert Eingabe', 'Bestätigt/Lehnt ab'), + ('7', 'Benutzer', 'Bestätigt Reservierung', 'Speichert in 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'), + ] + + 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. Entscheidungspunkte", level=1) + + doc.add_heading("3.1 Authentifizierung", level=2) + doc.add_paragraph("• Erfolg → Weiter zu Dashboard") + doc.add_paragraph("• Fehler → Zurück zu Login mit Fehlermeldung") + + doc.add_heading("3.2 Verfügbarkeitsprüfung", level=2) + doc.add_paragraph("• Verfügbar → Reservierung möglich") + doc.add_paragraph("• Belegt → Alternative Zeiten vorschlagen") + + doc.add_heading("3.3 Validierung", level=2) + doc.add_paragraph("• Gültig → Reservierung speichern") + doc.add_paragraph("• Ungültig → Fehlermeldung anzeigen") + + doc.add_heading("4. Automatisierte Prozesse", 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 = 'Trigger' + hdr_cells[2].text = 'Aktion' + + automated = [ + ('Drucker-Aktivierung', 'Startzeit erreicht', 'Smart-Plug einschalten'), + ('Drucker-Deaktivierung', 'Endzeit erreicht', 'Smart-Plug ausschalten'), + ('Session-Timeout', '30 Min Inaktivität', 'Automatischer Logout'), + ('Datenbank-Backup', 'Täglich 02:00', 'SQLite-Backup erstellen'), + ('Log-Rotation', 'Log > 100MB', 'Archivierung und Neustart'), + ] + + for process, trigger, action in automated: + row_cells = table2.add_row().cells + row_cells[0].text = process + row_cells[1].text = trigger + row_cells[2].text = action + + doc.add_paragraph() + + doc.add_heading("5. Fehlerbehandlung", level=1) + doc.add_paragraph( + "Bei Prozessfehlern greift ein mehrstufiges Fehlerbehandlungssystem:" + ) + doc.add_paragraph("1. Logging des Fehlers", style='List Number') + doc.add_paragraph("2. Benachrichtigung des Administrators", style='List Number') + doc.add_paragraph("3. Automatischer Wiederholungsversuch (3x)", style='List Number') + doc.add_paragraph("4. Fallback auf manuelle Steuerung", 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 in einem isolierten Netzwerksegment implementiert, " + "um die Sicherheitsanforderungen zu erfüllen." + ) + + doc.add_heading("2. IP-Adressplan", level=1) + + 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 = 'Subnet' + hdr_cells[3].text = 'Funktion' + + network_devices = [ + ('Router/Gateway', '192.168.0.1', '255.255.255.0', 'Netzwerk-Gateway'), + ('Raspberry Pi 5', '192.168.0.50', '255.255.255.0', 'MYP-Server'), + ('Smart-Plug 1', '192.168.0.100', '255.255.255.0', '3D-Drucker 1'), + ('Smart-Plug 2', '192.168.0.101', '255.255.255.0', '3D-Drucker 2'), + ('Smart-Plug 3', '192.168.0.102', '255.255.255.0', '3D-Drucker 3'), + ('Smart-Plug 4', '192.168.0.103', '255.255.255.0', '3D-Drucker 4'), + ('Smart-Plug 5', '192.168.0.104', '255.255.255.0', '3D-Drucker 5'), + ('Smart-Plug 6', '192.168.0.105', '255.255.255.0', '3D-Drucker 6'), + ('Admin-PC', 'DHCP', '255.255.255.0', 'Verwaltung'), + ('Benutzer-PCs', 'DHCP', '255.255.255.0', 'Clients'), + ] + + for device, ip, subnet, function in network_devices: + row_cells = table.add_row().cells + row_cells[0].text = device + row_cells[1].text = ip + row_cells[2].text = subnet + row_cells[3].text = function + + doc.add_paragraph() + + doc.add_heading("3. Netzwerktopologie", level=1) + doc.add_paragraph( + "Die Netzwerktopologie folgt einer Stern-Topologie mit dem Switch als zentralem Punkt:" + ) + doc.add_paragraph() + doc.add_paragraph(" [Internet]") + doc.add_paragraph(" |") + doc.add_paragraph(" [Router]") + doc.add_paragraph(" |") + doc.add_paragraph(" [Switch]") + doc.add_paragraph(" / | \\") + doc.add_paragraph(" / | \\") + doc.add_paragraph(" [RPi5] [Smart-Plugs] [Clients]") + + doc.add_heading("4. Sicherheitszonen", level=1) + + doc.add_heading("DMZ (Demilitarisierte Zone)", level=2) + doc.add_paragraph("• Raspberry Pi 5 (MYP-Server)") + doc.add_paragraph("• Zugriff nur über HTTPS (Port 443)") + + doc.add_heading("IoT-Segment", level=2) + doc.add_paragraph("• Smart-Plugs (192.168.0.100-105)") + doc.add_paragraph("• Keine direkte Internetverbindung") + doc.add_paragraph("• Kommunikation nur mit MYP-Server") + + doc.add_heading("Client-Netzwerk", level=2) + doc.add_paragraph("• Benutzer-PCs (DHCP-Bereich)") + doc.add_paragraph("• Zugriff auf MYP über Webbrowser") + + doc.add_heading("5. Firewall-Regeln", level=1) + + table2 = doc.add_table(rows=1, cols=5) + table2.style = 'Light Grid Accent 1' + hdr_cells = table2.rows[0].cells + hdr_cells[0].text = 'Von' + hdr_cells[1].text = 'Nach' + hdr_cells[2].text = 'Port' + hdr_cells[3].text = 'Protokoll' + hdr_cells[4].text = 'Aktion' + + firewall_rules = [ + ('Client-Netz', 'RPi5', '443', 'HTTPS', 'ALLOW'), + ('RPi5', 'Smart-Plugs', '9999', 'TCP', 'ALLOW'), + ('Smart-Plugs', 'ANY', 'ANY', 'ANY', 'DENY'), + ('RPi5', 'Internet', '123', 'NTP', 'ALLOW'), + ('ANY', 'RPi5', '22', 'SSH', 'DENY'), + ] + + for source, dest, port, protocol, action in firewall_rules: + row_cells = table2.add_row().cells + row_cells[0].text = source + row_cells[1].text = dest + row_cells[2].text = port + row_cells[3].text = protocol + row_cells[4].text = action + + doc.add_heading("6. Monitoring", level=1) + doc.add_paragraph( + "Das Netzwerk wird kontinuierlich überwacht:" + ) + doc.add_paragraph("• Verfügbarkeit aller Smart-Plugs (Ping alle 60s)", style='List Bullet') + doc.add_paragraph("• CPU/RAM-Auslastung des Servers", style='List Bullet') + doc.add_paragraph("• Netzwerktraffic-Analyse", style='List Bullet') + doc.add_paragraph("• Log-Aggregation und -Analyse", style='List Bullet') + + doc.save(os.path.join(output_dir, "08_Netzwerkplan.docx")) + +# Hauptfunktion +def main(): + print("Generiere IHK-Dokumente...") + + 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 erstellt!") + + except Exception as e: + print(f"Fehler beim Erstellen der Dokumente: {e}") + +if __name__ == "__main__": + main() \ No newline at end of file