""" Offline-kompatible E-Mail-Benachrichtigung für MYP-System ======================================================== Da das System im Produktionsbetrieb offline läuft, werden alle E-Mail-Benachrichtigungen nur geloggt aber nicht tatsächlich versendet. """ import logging from datetime import datetime from typing import Optional, Dict, Any from utils.logging_config import get_logger logger = get_logger("email_notification") class OfflineEmailNotification: """ Offline-E-Mail-Benachrichtigung die nur Logs erstellt. Simuliert E-Mail-Versand für Offline-Betrieb. """ def __init__(self): self.enabled = False # Immer deaktiviert im Offline-Modus logger.info("📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)") def send_email(self, to: str, subject: str, body: str, **kwargs) -> bool: """ Simuliert E-Mail-Versand durch Logging. Args: to: E-Mail-Empfänger subject: E-Mail-Betreff body: E-Mail-Inhalt **kwargs: Zusätzliche Parameter Returns: bool: Immer True (Simulation erfolgreich) """ logger.info(f"📧 [OFFLINE-SIMULATION] E-Mail würde versendet werden:") logger.info(f" 📮 An: {to}") logger.info(f" 📋 Betreff: {subject}") logger.info(f" 📝 Inhalt: {body[:100]}{'...' if len(body) > 100 else ''}") logger.info(f" 🕒 Zeitpunkt: {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}") if kwargs: logger.info(f" ⚙️ Zusätzliche Parameter: {kwargs}") return True def send_notification_email(self, recipient: str, notification_type: str, data: Dict[str, Any]) -> bool: """ Sendet Benachrichtigungs-E-Mail (Offline-Simulation). Args: recipient: E-Mail-Empfänger notification_type: Art der Benachrichtigung data: Daten für die Benachrichtigung Returns: bool: Immer True (Simulation erfolgreich) """ subject = f"MYP-Benachrichtigung: {notification_type}" body = f"Benachrichtigung vom MYP-System:\n\n{data}" return self.send_email(recipient, subject, body, notification_type=notification_type) def send_maintenance_notification(self, recipient: str, task_title: str, task_description: str) -> bool: """ Sendet Wartungs-Benachrichtigung (Offline-Simulation). Args: recipient: E-Mail-Empfänger task_title: Titel der Wartungsaufgabe task_description: Beschreibung der Wartungsaufgabe Returns: bool: Immer True (Simulation erfolgreich) """ subject = f"MYP-Wartungsaufgabe: {task_title}" body = f""" Neue Wartungsaufgabe im MYP-System: Titel: {task_title} Beschreibung: {task_description} Erstellt: {datetime.now().strftime('%d.%m.%Y %H:%M:%S')} Bitte loggen Sie sich in das MYP-System ein, um weitere Details zu sehen. """ return self.send_email(recipient, subject, body, task_type="maintenance") # Globale Instanz für einfache Verwendung email_notifier = OfflineEmailNotification() def send_email_notification(recipient: str, subject: str, body: str, **kwargs) -> bool: """ Haupt-Funktion für E-Mail-Versand (Offline-kompatibel). Args: recipient: E-Mail-Empfänger subject: E-Mail-Betreff body: E-Mail-Inhalt **kwargs: Zusätzliche Parameter Returns: bool: True wenn "erfolgreich" (geloggt) """ return email_notifier.send_email(recipient, subject, body, **kwargs) def send_maintenance_email(recipient: str, task_title: str, task_description: str) -> bool: """ Sendet Wartungs-E-Mail (Offline-kompatibel). Args: recipient: E-Mail-Empfänger task_title: Titel der Wartungsaufgabe task_description: Beschreibung der Wartungsaufgabe Returns: bool: True wenn "erfolgreich" (geloggt) """ return email_notifier.send_maintenance_notification(recipient, task_title, task_description) def send_guest_approval_email(recipient: str, otp_code: str, expires_at: str) -> bool: """ Sendet Gastauftrags-Genehmigung-E-Mail (Offline-kompatibel). Args: recipient: E-Mail-Empfänger otp_code: OTP-Code für den Gastauftrag expires_at: Ablaufzeit des OTP-Codes Returns: bool: True wenn "erfolgreich" (geloggt) """ subject = "MYP-Gastauftrag genehmigt" body = f""" Ihr Gastauftrag wurde genehmigt! OTP-Code: {otp_code} Gültig bis: {expires_at} Bitte verwenden Sie diesen Code am MYP-Terminal, um Ihren Druckauftrag zu starten. """ return email_notifier.send_email(recipient, subject, body, otp_code=otp_code, expires_at=expires_at) def send_guest_rejection_email(recipient: str, reason: str) -> bool: """ Sendet Gastauftrags-Ablehnungs-E-Mail (Offline-kompatibel). Args: recipient: E-Mail-Empfänger reason: Grund für die Ablehnung Returns: bool: True wenn "erfolgreich" (geloggt) """ subject = "MYP-Gastauftrag abgelehnt" body = f""" Ihr Gastauftrag wurde leider abgelehnt. Grund: {reason} Bei Fragen wenden Sie sich bitte an das MYP-Team. """ return email_notifier.send_email(recipient, subject, body, rejection_reason=reason) # Für Backward-Kompatibilität send_notification = send_email_notification