Files
aminovfariz 14da36e83a feat(helpdesk): add customer engagement analytics page [skip ci]
New "Customer analytics" page under Monitoring: surfaces who is actively in
contact vs. who has gone quiet, so the team can reach out before a customer
slips away.

- KPI tiles: total / active / no-contact / never-in-contact
- "Customers without recent contact" — longest silence first
- "Top customers by communication" — most ticket activity in the period
- Configurable no-contact threshold (helpdesk settings, default 60 days)

CustomerEngagementService aggregates the global ticket snapshot per customer
(same single-pull model as RiskRadarService — no N+1 to BC). Last contact is
the most recent ticket activity; silence beyond the threshold flags the
customer. Revenue ranking deferred (BC OData exposes no per-customer ledger).

All within modules/helpdesk/. Tests + PHPStan green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 10:30:05 +02:00

607 lines
31 KiB
JSON
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.
{
"Helpdesk": "Helpdesk",
"Helpdesk settings": "Helpdesk-Einstellungen",
"Customers": "Kunden",
"Debtor search": "Kundensuche",
"Search debtors": "Kunden suchen",
"Search by name or debtor number...": "Suche nach Name oder Kundennummer...",
"Search": "Suchen",
"Please provide a customer number": "Bitte geben Sie eine Kundennummer an",
"Minimum 2 characters": "Mindestens 2 Zeichen",
"Please enter at least 2 characters.": "Bitte mindestens 2 Zeichen eingeben.",
"No debtors found": "Keine Kunden gefunden",
"Try a different search term.": "Versuchen Sie einen anderen Suchbegriff.",
"Could not connect to Business Central.": "Verbindung zu Business Central fehlgeschlagen.",
"BC connection is not configured.": "BC-Verbindung ist nicht konfiguriert.",
"BC connection is not configured. Please configure the connection in the settings.": "BC-Verbindung ist nicht konfiguriert. Bitte konfigurieren Sie die Verbindung in den Einstellungen.",
"BC connection is not configured": "BC-Verbindung ist nicht konfiguriert",
"Open settings": "Einstellungen öffnen",
"Debtor No.": "Kunden-Nr.",
"Name": "Name",
"City": "Ort",
"Phone": "Telefon",
"E-Mail": "E-Mail",
"Master data": "Stammdaten",
"Contacts": "Ansprechpartner",
"Tickets": "Tickets",
"Debtor details": "Kunden-Details",
"Search name": "Suchname",
"Address": "Adresse",
"Postal code": "PLZ",
"Salesperson": "Verkäufer",
"No contacts found": "Keine Ansprechpartner gefunden",
"No contacts are linked to this debtor in Business Central.": "Diesem Kunden sind in Business Central keine Ansprechpartner zugeordnet.",
"No.": "Nr.",
"Type": "Typ",
"Job title": "Position",
"No tickets found": "Keine Tickets gefunden",
"No tickets are linked to this debtor in Business Central.": "Diesem Kunden sind in Business Central keine Tickets zugeordnet.",
"Ticket No.": "Ticket-Nr.",
"Dashboard": "Dashboard",
"Description": "Beschreibung",
"Status": "Status",
"Category": "Kategorie",
"Contact": "Kontakt",
"Support": "Support",
"Sales": "Vertrieb",
"Controlling": "Controlling",
"Ticket": "Ticket",
"Debtor": "Kunde",
"Debtor not found": "Kunde nicht gefunden",
"Ticket not found": "Ticket nicht gefunden",
"Back to search": "Zurück zur Suche",
"Back": "Zurück",
"Settings": "Einstellungen",
"Connection": "Verbindung",
"Save": "Speichern",
"Settings saved": "Einstellungen gespeichert",
"Configuration incomplete": "Konfiguration unvollständig",
"OData Base URL": "OData-Basis-URL",
"Base URL without Company path segment": "Basis-URL ohne Company-Pfadsegment",
"Company name": "Firmenname",
"BC company name (URL-encoded automatically)": "BC-Firmenname (wird automatisch URL-kodiert)",
"Authentication": "Authentifizierung",
"Auth mode": "Auth-Modus",
"Basic Auth": "Basic Auth",
"OAuth2 (client credentials)": "OAuth2 (Client Credentials)",
"Username": "Benutzername",
"Password": "Passwort",
"Leave empty to keep current password": "Leer lassen, um das aktuelle Passwort beizubehalten",
"Saved": "Gespeichert",
"Azure Tenant ID": "Azure-Mandanten-ID",
"Client ID": "Client-ID",
"Client Secret": "Client-Secret",
"Token endpoint URL": "Token-Endpoint-URL",
"Connection test": "Verbindungstest",
"Test connection": "Verbindung testen",
"Connection successful": "Verbindung erfolgreich",
"Connection failed": "Verbindung fehlgeschlagen",
"Testing...": "Teste...",
"Form expired, please try again": "Formular abgelaufen, bitte erneut versuchen",
"OData Base URL must use HTTPS": "OData-Basis-URL muss HTTPS verwenden",
"Address & contact": "Adresse & Kontakt",
"Company": "Unternehmen",
"Company details": "Firmendetails",
"Contact & dates": "Kontakt & Termine",
"Could not load contacts.": "Ansprechpartner konnten nicht geladen werden.",
"Could not load tickets.": "Tickets konnten nicht geladen werden.",
"Last activity": "Letzte Aktivität",
"Ticket details": "Ticket-Details",
"Overview": "Übersicht",
"Open tickets": "Offene Tickets",
"All tickets": "Alle Tickets",
"All contacts": "Alle Ansprechpartner",
"Recent activity": "Letzte Aktivität",
"Support info & master data": "Support-Info & Stammdaten",
"Support type": "Supportart",
"Location": "Standort",
"No open tickets": "Keine offenen Tickets",
"No recent activity found.": "Keine aktuellen Aktivitäten gefunden.",
"Total tickets": "Alle Tickets",
"Total contracts": "Alle Verträge",
"Critical (>48h)": "Kritisch (>48h)",
"Oldest open": "Ältestes offenes",
"Ticket list": "Ticketliste",
"Next actions": "Nächste Aktionen",
"System recommendations": "System-Empfehlungen",
"Action": "Aktion",
"Age (h)": "Alter (h)",
"No support actions required right now.": "Aktuell sind keine Support-Aktionen erforderlich.",
"No system recommendations right now.": "Aktuell gibt es keine System-Empfehlungen.",
"Contracts & products": "Verträge & Produkte",
"No contracts found for this customer.": "Für diesen Debitor wurden keine Verträge gefunden.",
"Contract No.": "Vertragsnr.",
"Product type": "Produkttyp",
"Next invoicing": "Nächste Abrechnung",
"Amount": "Betrag",
"Active contracts": "Aktive Verträge",
"Could not load contracts.": "Verträge konnten nicht geladen werden.",
"Escalations": "Eskalationen",
"Escalations are not available yet.": "Eskalationen sind derzeit noch nicht verfügbar.",
"Escalated tickets": "Eskalierte Tickets",
"No escalated tickets right now.": "Aktuell gibt es keine eskalierten Tickets.",
"Could not load escalated tickets.": "Eskalierte Tickets konnten nicht geladen werden.",
"Escalation code": "Eskalationscode",
"SLA target": "SLA-Ziel",
"Overdue by": "Überfällig seit",
"day": "Tag",
"days": "Tage",
"Ticket volume": "Ticket-Volumen",
"Close rate": "Close-Rate",
"Avg. resolution": "Ø Lösungszeit",
"Open backlog": "Offene Tickets",
"kpi_tooltip_close_rate": "Geschlossene ÷ erstellte Tickets im Zeitraum. Über 1× = Rückstau wird abgebaut.",
"kpi_tooltip_resolution": "Median der Bearbeitungsdauer aller im Zeitraum geschlossenen Tickets.",
"kpi_tooltip_backlog": "Aktueller Stand aller offenen Tickets unabhängig vom gewählten Zeitraum. Zeigt den Rückstau.",
"Backlog shrinking": "Rückstau wird abgebaut",
"Backlog growing": "Rückstau wächst",
"unassigned": "ohne Bearbeiter",
"Ticket trend": "Ticket-Trend",
"Support efficiency": "Support-Effizienz",
"Contract metrics": "Vertrags-Kennzahlen",
"Risk assessment": "Risikoanalyse",
"vs. prev. period": "vs. Vorperiode",
"Low": "Niedrig",
"Medium": "Mittel",
"High": "Hoch",
"All checks passed": "Alle Checks bestanden",
"of": "von",
"checks flagged": "Checks auffällig",
"Limit": "Limit",
"No controlling data available.": "Keine Controlling-Daten verfügbar.",
"Resolution time": "Bearbeitungszeit",
"Oldest open ticket": "Ältestes offenes Ticket",
"Unassigned": "Nicht zugewiesen",
"risk_desc_ticket_volume": "Veränderung zum Vorperiode",
"risk_desc_resolution_time": "Median bis Schließung",
"risk_desc_open_aging": "Seit letzter Aktivität",
"risk_desc_unassigned": "Anteil offener Tickets ohne Bearbeiter",
"Ticket volume increase": "Ticketvolumen-Anstieg",
"High avg. resolution time": "Hohe Ø Lösungszeit",
"Open ticket aging": "Offene Tickets überfällig",
"Unassigned ticket ratio": "Nicht-zugewiesene Tickets",
"Could not load controlling dashboard.": "Controlling-Dashboard konnte nicht geladen werden.",
"Avg. open age": "Ø Alter offen",
"Without assignee": "Ohne Bearbeiter",
"30 days": "30 Tage",
"90 days": "90 Tage",
"6 months": "6 Monate",
"1 year": "1 Jahr",
"Escalation rate": "Eskalationsrate",
"Threshold (%)": "Schwellwert (%)",
"Threshold (hours)": "Schwellwert (Stunden)",
"Controlling risk configuration was invalid. Defaults were applied.": "Die Controlling-Risiko-Konfiguration war ungültig. Es wurden Standardwerte geladen.",
"Open ticket without activity for": "Offenes Ticket ohne Aktivität seit",
"hours": "Stunden",
"Open ticket without assigned support user": "Offenes Ticket ohne zugewiesenen Support-Bearbeiter",
"Follow up oldest open ticket": "Ältestes offenes Ticket nachverfolgen",
"System recommendation configuration was invalid. Defaults were applied.": "Die Konfiguration der System-Empfehlungen war ungültig. Es wurden Standardwerte geladen.",
"Maximum recommendations": "Maximale Empfehlungen",
"Rule templates": "Regel-Templates",
"Enabled": "Aktiv",
"Priority": "Priorität",
"Thresholds": "Schwellwerte",
"Escalation overdue": "Eskalation überfällig",
"High-risk aging": "High-Risk Alterung",
"Unassigned open": "Offen ohne Bearbeiter",
"Stale open": "Offen ohne Aktivität",
"Customer backlog": "Offene Tickets beim Kunden",
"Minimum overdue (minutes)": "Mindestens überfällig (Minuten)",
"High-risk codes (comma separated)": "High-Risk Codes (kommagetrennt)",
"Minimum age (hours)": "Mindestalter (Stunden)",
"Minimum open tickets": "Mindestens offene Tickets",
"Escalation SLA exceeded by {overdue_hours}h ({escalation_code}).": "SLA um {overdue_hours}h überschritten ({escalation_code}) — sofort eskalieren oder Kunden informieren.",
"High-risk ticket ({escalation_code}) is open for {age_hours}h.": "Kritisches Ticket ({escalation_code}) seit {age_hours}h offen — Priorität prüfen und Bearbeitung sicherstellen.",
"Ticket is unassigned for {age_hours}h.": "Seit {age_hours}h ohne Bearbeiter — dringend einem Mitarbeiter zuweisen.",
"No activity for {age_hours}h.": "Seit {age_hours}h keine Aktivität — prüfen ob Kunde auf Antwort wartet.",
"Customer backlog: {open_tickets} open tickets.": "{open_tickets} offene Tickets — älteste Tickets zuerst bearbeiten, um Rückstau abzubauen.",
"Created": "Erstellt",
"Loading...": "Laden...",
"Refresh data": "Daten aktualisieren",
"Mobile": "Mobil",
"Activity": "Aktivität",
"Activity timeline": "Aktivitätsverlauf",
"Message": "Nachricht",
"Status change": "Statusänderung",
"No activity found.": "Keine Aktivitäten gefunden.",
"Could not load activity log.": "Aktivitätsverlauf konnte nicht geladen werden.",
"Communication history": "Kommunikationsverlauf",
"No communication found.": "Keine Kommunikation gefunden.",
"Could not load communication history.": "Kommunikationsverlauf konnte nicht geladen werden.",
"Live communication unavailable, showing activity fallback.": "Live-Kommunikation nicht verfügbar, es werden Aktivitätsdaten als Fallback angezeigt.",
"Ticket communication": "Ticket-Kommunikation",
"Last 5 tickets": "Letzte 5 Tickets",
"Last 10 tickets": "Letzte 10 Tickets",
"Some ticket communications could not be loaded completely.": "Einige Ticket-Kommunikationen konnten nicht vollständig geladen werden.",
"Unknown user": "Unbekannter Benutzer",
"Unknown time": "Unbekannte Zeit",
"Source": "Quelle",
"SOAP": "SOAP",
"Activity fallback": "Aktivitäts-Fallback",
"sent a message": "hat eine Nachricht gesendet",
"changed status": "hat den Status geändert",
"Forwarded": "hat das Ticket weitergeleitet",
"attached a file": "hat eine Datei angehängt",
"logged an activity": "hat eine Aktivität erfasst",
"on": "am",
"Process": "Prozess",
"All": "Alle",
"Open": "Offen",
"In Progress": "In Bearbeitung",
"Closed": "Geschlossen",
"Monthly volume": "Monatliches Volumen",
"Support hours": "Support-Stunden",
"Contract overview": "Vertragsübersicht",
"No contract details available.": "Keine Vertragsdetails verfügbar.",
"Could not load sales dashboard.": "Vertriebsdashboard konnte nicht geladen werden.",
"Quantity": "Menge",
"Unit price": "Stückpreis",
"Line amount": "Zeilenbetrag",
"Line state": "Zeilenstatus",
"Starting date": "Startdatum",
"Invoicing period": "Abrechnungszeitraum",
"positions": "Positionen",
"per month": "pro Monat",
"Last invoicing": "Letzte Abrechnung",
"Analysis": "Analyse",
"New (30d)": "Neu (30T)",
"Resolved (30d)": "Gelöst (30T)",
"Avg. age open": "Ø Alter offen",
"vs. prev. 30d": "vs. Vorz. 30T",
"net (30d)": "netto (30T)",
"critical": "kritisch",
"Avg. contract value": "Ø Vertragswert",
"of {total} total": "von {total} gesamt",
"in {days} days": "in {days} Tagen",
"largest": "größter",
"Attention needed": "Handlungsbedarf",
"Recommendations": "Empfehlungen",
"Contract summary": "Vertragsübersicht",
"Contract trend": "Vertragsentwicklung",
"New contracts": "Neue Verträge",
"Ended contracts": "Beendete Verträge",
"active": "aktiv",
"ended": "beendet",
"Age": "Alter",
"Period": "Zeitraum",
"Last 30 days": "Letzte 30 Tage",
"Last 90 days": "Letzte 90 Tage",
"Last 180 days": "Letzte 180 Tage",
"Last 365 days": "Letzte 365 Tage",
"Automation": "Automatisierung",
"Risk monitoring": "Risiko-Monitoring",
"rule_help_escalation_overdue": "Empfiehlt Aktion, wenn SLA-Eskalationsfristen überschritten sind.",
"rule_help_high_risk_aging": "Erkennt kritische Tickets mit bestimmten Eskalationscodes, die zu lange offen sind.",
"rule_help_unassigned_open": "Weist auf offene Tickets hin, die keinem Bearbeiter zugewiesen sind.",
"rule_help_stale_open": "Markiert offene Tickets ohne aktuelle Aktivität zur Nachverfolgung.",
"rule_help_customer_backlog": "Warnt, wenn ein Kunde zu viele offene Tickets gleichzeitig hat.",
"rule_help_ticket_volume": "Löst aus, wenn das Ticketvolumen im Vergleich zur Vorperiode ungewöhnlich ansteigt.",
"rule_help_avg_resolution": "Warnt, wenn die durchschnittliche Bearbeitungszeit einen Schwellwert überschreitet.",
"rule_help_open_aging": "Erkennt offene Tickets, die zu lange ohne Bearbeitung sind.",
"rule_help_unassigned_ratio": "Warnt, wenn zu viele offene Tickets keinem Bearbeiter zugewiesen sind.",
"Automation configuration was invalid. Defaults were applied.": "Die Automatisierungskonfiguration war ungültig. Es wurden Standardwerte geladen.",
"Advanced options": "Erweiterte Optionen",
"Min. overdue": "Mind. überfällig",
"Min. age": "Mindestalter",
"Min. open": "Mind. offen",
"Team": "Team",
"Team dashboard": "Auslastung",
"Team workload": "Team-Auslastung",
"Support agent": "Support-Mitarbeiter",
"Critical (>48h open)": "Kritisch (>48h offen)",
"Avg. age (h)": "Ø Alter (h)",
"Resolved in period": "Gelöst im Zeitraum",
"Not assigned": "Nicht zugewiesen",
"Could not load team dashboard.": "Auslastung konnte nicht geladen werden.",
"No team data available.": "Keine Team-Daten verfügbar.",
"Top customers": "Top-Kunden",
"Top categories": "Top-Kategorien",
"Current": "Aktuell",
"Performance": "Leistung",
"Historical": "Historisch",
"Queue": "Warteschlange",
"trend_tooltip_up": "Mehr Tickets erhalten als gelöst im Zeitraum — Rückstau wächst.",
"trend_tooltip_down": "Mehr Tickets gelöst als erhalten im Zeitraum — Rückstau wird abgebaut.",
"Download file": "Datei herunterladen",
"Trend based on last {days} days": "Trend basiert auf den letzten {days} Tagen",
"Trend": "Trend",
"Risk radar": "Risiko-Radar",
"Risk score": "Risiko-Score",
"Risk traffic light logic": "Ampel-Logik",
"High risk (55-100)": "Hohes Risiko (55-100)",
"Medium risk (25-54)": "Mittleres Risiko (25-54)",
"Low risk (0-24)": "Niedriges Risiko (0-24)",
"Score = weighted sum: Open pressure (35), Trend (30), SLA overdue (25), Inactivity (10).": "Score = gewichtete Summe: Offene Tickets (35), Trend (30), SLA überfällig (25), Inaktivität (10).",
"High risk": "Hohes Risiko",
"Medium risk": "Mittleres Risiko",
"Low risk": "Niedriges Risiko",
"SLA overdue": "SLA überfällig",
"Net flow": "Netto-Zufluss",
"Open pressure": "Offene Tickets",
"Inactivity": "Inaktivität",
"No risk data available.": "Keine Risikodaten verfügbar.",
"Could not load risk radar.": "Risiko-Radar konnte nicht geladen werden.",
"Data may be incomplete. Not all tickets could be loaded.": "Daten möglicherweise unvollständig. Nicht alle Tickets konnten geladen werden.",
"Why at risk": "Warum kritisch",
"open": "offen",
"overdue": "überfällig",
"net": "netto",
"Search customers...": "Kunden suchen...",
"more than resolved": "mehr als gelöst",
"SLA breaches": "SLA-Verletzungen",
"Oldest ticket": "Ältestes Ticket",
"General connection": "Allgemeine Verbindung",
"Tenant connection": "Mandanten-Verbindung",
"Configuration source": "Konfigurationsquelle",
"Use tenant-specific configuration": "Mandantenspezifische Konfiguration verwenden",
"When enabled, this tenant uses its own BC connection instead of the global configuration.": "Wenn aktiviert, nutzt dieser Mandant seine eigene BC-Verbindung anstelle der globalen Konfiguration.",
"This tenant inherits the global configuration. Enable the toggle above to use tenant-specific settings.": "Dieser Mandant erbt die globale Konfiguration. Aktivieren Sie den Schalter oben, um mandantenspezifische Einstellungen zu verwenden.",
"Tenant settings saved": "Mandanten-Einstellungen gespeichert",
"Token endpoint must use HTTPS": "Token-Endpunkt muss HTTPS verwenden",
"The current tenant uses its own configuration. Changes here only affect tenants without a tenant-specific connection.": "Der aktuelle Mandant verwendet eine eigene Verbindung. Änderungen hier betreffen nur Mandanten ohne eigene Verbindung.",
"Failed to save tenant settings": "Mandanten-Einstellungen konnten nicht gespeichert werden",
"Meetings": "Termine",
"Released": "Freigegeben",
"Pending": "Ausstehend",
"Upcoming meetings": "Kommende Termine",
"Past meetings": "Vergangene Termine",
"No meetings found for this customer.": "Keine Termine für diesen Kunden gefunden.",
"Could not load meetings.": "Termine konnten nicht geladen werden.",
"Domains": "Domains",
"Search domains...": "Domains suchen...",
"Customer No.": "Kunden-Nr.",
"Customer Name": "Kundenname",
"Administration": "Verwaltung",
"No domains found": "Keine Domains gefunden",
"Could not load domains.": "Domains konnten nicht geladen werden.",
"Lookup": "Nachschlagen",
"Monitoring": "Monitoring",
"Contract type": "Vertragsart",
"Customer": "Kunde",
"Software products": "Software-Produkte",
"Software product": "Software-Produkt",
"Search software products...": "Software-Produkte suchen...",
"BC description": "BC-Bezeichnung",
"Product name": "Produktname",
"Code": "Code",
"Active": "Aktiv",
"Inactive": "Inaktiv",
"Last synced": "Zuletzt synchronisiert",
"Modified": "Geändert",
"Edit software product": "Software-Produkt bearbeiten",
"Back to list": "Zurück zur Liste",
"Save & close": "Speichern & schließen",
"Software product updated": "Software-Produkt aktualisiert",
"Software product not found": "Softwareprodukt nicht gefunden",
"Product details": "Produktdetails",
"Enter product name...": "Produktname eingeben...",
"Name must not exceed 255 characters": "Name darf maximal 255 Zeichen lang sein",
"Failed to save": "Speichern fehlgeschlagen",
"Handover protocol": "Übergabeprotokoll",
"Handover protocol schema": "Übergabeprotokoll-Schema",
"Define the fields that make up the handover protocol for this product.": "Definieren Sie die Felder, die das Übergabeprotokoll für dieses Produkt bilden.",
"Add field": "Feld hinzufügen",
"Remove field": "Feld entfernen",
"Duplicate field": "Feld duplizieren",
"Move up": "Nach oben",
"Move down": "Nach unten",
"Field key": "Feld-Schlüssel",
"Field label": "Feld-Bezeichnung",
"Field type": "Feldtyp",
"Required": "Pflichtfeld",
"Options": "Optionen",
"Add option": "Option hinzufügen",
"Remove option": "Option entfernen",
"Option value": "Optionswert",
"Option label": "Optionsbezeichnung",
"No fields defined yet. Click \"Add field\" to get started.": "Noch keine Felder definiert. Klicken Sie auf \"Feld hinzufügen\" um zu beginnen.",
"Heading": "Überschrift",
"Paragraph": "Absatz",
"Text": "Text",
"Textarea": "Textbereich",
"Number": "Zahl",
"Date": "Datum",
"Checkbox": "Checkbox",
"Select": "Auswahl",
"User selection": "Benutzerauswahl",
"Text content": "Textinhalt",
"Maximum %d fields allowed": "Maximal %d Felder erlaubt",
"Field %d: unknown type \"%s\"": "Feld %d: unbekannter Typ \"%s\"",
"Field %d: label is required": "Feld %d: Bezeichnung ist erforderlich",
"Field %d: generates duplicate key \"%s\" — use a more distinct label": "Feld %d: erzeugt doppelten Schlüssel \"%s\" — verwenden Sie eine eindeutigere Bezeichnung",
"Field %d: select must have at least one option": "Feld %d: Auswahl muss mindestens eine Option haben",
"Field %d, option %d: label is required": "Feld %d, Option %d: Bezeichnung ist erforderlich",
"Preview": "Vorschau",
"Add fields to see a live preview.": "Felder hinzufügen, um eine Vorschau zu sehen.",
"Field": "Feld",
"Operations": "Betrieb",
"Handovers": "Übergaben",
"Handover": "Übergabe",
"New handover": "Neue Übergabe",
"Handover created": "Übergabe erstellt",
"Handover updated": "Übergabe aktualisiert",
"Handover not found": "Übergabe nicht gefunden",
"Draft": "Entwurf",
"In progress": "In Bearbeitung",
"Completed": "Abgeschlossen",
"Archived": "Archiviert",
"Customer & product": "Kunde & Produkt",
"Protocol": "Protokoll",
"Select customer and product": "Kunde und Produkt auswählen",
"Choose the customer and software product for this handover protocol.": "Wählen Sie den Kunden und das Softwareprodukt für dieses Übergabeprotokoll.",
"Search by name or number...": "Nach Name oder Nummer suchen...",
"No customers found": "Keine Kunden gefunden",
"Search failed": "Suche fehlgeschlagen",
"Fill handover protocol": "Übergabeprotokoll ausfüllen",
"Create handover": "Übergabe erstellen",
"Continue": "Weiter",
"Cancel": "Abbrechen",
"Please select a customer": "Bitte wählen Sie einen Kunden",
"Please select a software product": "Bitte wählen Sie ein Softwareprodukt",
"Software product has no handover protocol schema": "Softwareprodukt hat kein Übergabeprotokoll-Schema",
"No software products with handover protocol schemas found.": "Keine Softwareprodukte mit Übergabeprotokoll-Schemata gefunden.",
"Please complete step 1 first": "Bitte schließen Sie zuerst Schritt 1 ab",
"Debitor number is required": "Debitornummer ist erforderlich",
"Software product is required": "Softwareprodukt ist erforderlich",
"Failed to create handover": "Übergabe konnte nicht erstellt werden",
"You do not have permission to edit this handover": "Sie haben keine Berechtigung, diese Übergabe zu bearbeiten",
"You do not have permission to set this status": "Sie haben keine Berechtigung, diesen Status zu setzen",
"Invalid status": "Ungültiger Status",
"Unknown field: %s": "Unbekanntes Feld: %s",
"%s is required": "%s ist erforderlich",
"Failed to update status": "Status konnte nicht aktualisiert werden",
"No protocol fields defined.": "Keine Protokollfelder definiert.",
"Please select...": "Bitte auswählen...",
"Change status": "Status ändern",
"Debitor No.": "Debitornr.",
"Progress": "Fortschritt",
"Created by": "Erstellt von",
"Search handovers...": "Übergaben suchen...",
"ID": "ID",
"History": "Verlauf",
"Viewing version %d": "Version %d wird angezeigt",
"compared with version %d": "verglichen mit Version %d",
"Back to current": "Zurück zur aktuellen Version",
"Restore this version": "Diese Version wiederherstellen",
"Restore this version?": "Diese Version wiederherstellen?",
"Version restored": "Version wiederhergestellt",
"Failed to restore": "Wiederherstellen fehlgeschlagen",
"Only managers can restore revisions": "Nur Manager können Versionen wiederherstellen",
"Revision not found": "Version nicht gefunden",
"Fields changed": "Felder geändert",
"Status changed": "Status geändert",
"Fields and status changed": "Felder und Status geändert",
"Restored": "Wiederhergestellt",
"was: %s": "war: %s",
"Yes": "Ja",
"No": "Nein",
"Changed": "Geändert",
"Compare with current": "Mit aktueller Version vergleichen",
"Domain": "Domain",
"Select a customer first...": "Bitte zuerst einen Kunden auswählen...",
"Loading domains...": "Domains werden geladen...",
"No domains found for this customer": "Keine Domains für diesen Kunden gefunden",
"No domains found for this customer. Enter domain name manually:": "Keine Domains für diesen Kunden gefunden. Domain-Name manuell eingeben:",
"Domain name (e.g. example.de)": "Domain-Name (z. B. example.de)",
"URL (optional, e.g. https://example.de)": "URL (optional, z. B. https://example.de)",
"Failed to load domains": "Domains konnten nicht geladen werden",
"Please select a domain": "Bitte wählen Sie eine Domain",
"Delete": "Löschen",
"Select all": "Alle auswählen",
"Delete selected handovers?": "Ausgewählte Übergaben löschen?",
"%d handover(s) deleted": "%d Übergabe(n) gelöscht",
"Failed to delete handovers": "Übergaben konnten nicht gelöscht werden",
"Only managers can delete handovers": "Nur Manager können Übergaben löschen",
"No handovers selected": "Keine Übergaben ausgewählt",
"Domain not found": "Domain nicht gefunden",
"Domain detail": "Domain-Details",
"Back to domains": "Zurück zu Domains",
"Open domain": "Domain öffnen",
"Open debitor": "Debitor öffnen",
"Customer information": "Kundeninformation",
"Contract information": "Vertragsinformation",
"Related domains": "Verwandte Domains",
"No handovers for this domain yet": "Noch keine Übergaben für diese Domain",
"No contract information available": "Keine Vertragsinformation verfügbar",
"Network error — please try again": "Netzwerkfehler — bitte erneut versuchen",
"Contract state": "Vertragsstatus",
"Total": "Gesamt",
"URL": "URL",
"State": "Status",
"Product": "Produkt",
"Updates": "Updates",
"Ticket status": "Ticketstatus",
"Assignment": "Zuweisung",
"Resolved": "Erledigt",
"Assign update": "Update zuweisen",
"Assign": "Zuweisen",
"Assigned": "Zugewiesen",
"Update": "Update",
"Hotfix": "Hotfix",
"Gitea link": "Gitea-Link",
"e.g. https://gitea.example.com/org/repo/src/branch/main/updates/2026-02": "z.B. https://gitea.example.com/org/repo/src/branch/main/updates/2026-02",
"Notes": "Notizen",
"No update tickets found": "Keine Update-Tickets gefunden",
"Failed to load update tickets": "Update-Tickets konnten nicht geladen werden",
"Update assigned successfully": "Update erfolgreich zugewiesen",
"Failed to assign update": "Update konnte nicht zugewiesen werden",
"Select domain...": "Domain auswählen...",
"No updates for this domain yet": "Noch keine Updates für diese Domain",
"Search updates...": "Updates suchen...",
"Open in Gitea": "In Gitea öffnen",
"Invalid category": "Ungültige Kategorie",
"Ticket number is required": "Ticket-Nummer ist erforderlich",
"View software updates list": "Software-Updates-Liste anzeigen",
"Assign and manage software updates": "Software-Updates zuweisen und verwalten",
"Security level": "Sicherheitsstufe",
"Normal": "Normal",
"Critical": "Kritisch",
"Save failed": "Speichern fehlgeschlagen",
"Invalid CSRF token": "Ungültiges CSRF-Token",
"No tenant context": "Kein Mandantenkontext",
"Missing domain number": "Domain-Nummer fehlt",
"Invalid security level": "Ungültige Sicherheitsstufe",
"Failed to save security level": "Sicherheitsstufe konnte nicht gespeichert werden",
"Under review": "In Prüfung",
"Assigned to": "Zugewiesen an",
"Assigned at": "Zugewiesen am",
"Not assigned yet": "Noch nicht zugewiesen",
"Change assignment": "Zuweisung ändern",
"Assign handover": "Übergabe zuweisen",
"Assign to": "Zuweisen an",
"— Select employee —": "— Mitarbeiter auswählen —",
"Due date (optional)": "Fälligkeitsdatum (optional)",
"Due date": "Fälligkeitsdatum",
"Currently assigned to": "Aktuell zugewiesen an",
"Resend notification": "Benachrichtigung erneut senden",
"Notification resent": "Benachrichtigung erneut gesendet",
"Failed to resend notification": "Benachrichtigung konnte nicht erneut gesendet werden",
"Handover assigned": "Übergabe zugewiesen",
"Failed to assign handover": "Übergabe konnte nicht zugewiesen werden",
"Only managers can assign handovers": "Nur Manager können Übergaben zuweisen",
"Only managers can resend notifications": "Nur Manager können Benachrichtigungen erneut senden",
"Handover has no assignee": "Übergabe hat keinen Bearbeiter",
"Please select an employee": "Bitte Mitarbeiter auswählen",
"Submit for review": "Zur Prüfung einreichen",
"Submit this handover for review?": "Diese Übergabe zur Prüfung einreichen?",
"Handover submitted for review": "Übergabe zur Prüfung eingereicht",
"Failed to submit for review": "Einreichen zur Prüfung fehlgeschlagen",
"You are not assigned to this handover": "Sie sind dieser Übergabe nicht zugewiesen",
"Handover cannot be submitted for review in its current status": "Übergabe kann im aktuellen Status nicht zur Prüfung eingereicht werden",
"Done": "Abgeschlossen",
"Assigned to (column)": "Zugewiesen an",
"How do you want to proceed?": "Wie möchten Sie vorgehen?",
"Create myself": "Selbst erstellen",
"I will fill in the handover protocol myself.": "Ich fülle das Übergabeprotokoll selbst aus.",
"Assign to employee": "Mitarbeiter zuweisen",
"An employee will receive an invitation to fill in the protocol.": "Ein Mitarbeiter erhält eine Einladung zum Ausfüllen des Protokolls.",
"Please select an option": "Bitte wählen Sie eine Option",
"Select customer, product and employee": "Kunde, Produkt und Mitarbeiter auswählen",
"Create and assign": "Erstellen & zuweisen",
"Handover created and assigned": "Übergabe erstellt und zugewiesen",
"No active employees found.": "Keine aktiven Mitarbeiter gefunden.",
"Please select an employee to assign": "Bitte wählen Sie einen Mitarbeiter aus",
"Delete handover": "Übergabe löschen",
"Delete this handover?": "Diese Übergabe löschen?",
"Handover deleted": "Übergabe gelöscht",
"Customer analytics": "Kundenanalyse",
"No-contact threshold": "Kein-Kontakt-Schwelle",
"Could not load customer analytics.": "Kundenanalyse konnte nicht geladen werden.",
"No customer data available.": "Keine Kundendaten verfügbar.",
"No contact": "Kein Kontakt",
"Never in contact": "Nie in Kontakt",
"days ago": "Tage her",
"never": "nie",
"Tickets in period": "Tickets im Zeitraum",
"Last contact": "Letzter Kontakt",
"Customers without recent contact": "Kunden ohne jüngsten Kontakt",
"Longest silence first — consider reaching out.": "Längste Funkstille zuerst — Kontaktaufnahme erwägen.",
"Top customers by communication": "Top-Kunden nach Kommunikation",
"Most ticket activity in the selected period.": "Meiste Ticket-Aktivität im gewählten Zeitraum.",
"Every customer has been in contact recently.": "Alle Kunden waren kürzlich in Kontakt.",
"No communication recorded in the selected period.": "Keine Kommunikation im gewählten Zeitraum erfasst.",
"Customer engagement": "Kundenbindung",
"No-contact threshold (days)": "Kein-Kontakt-Schwelle (Tage)",
"Customers without any communication for longer than this are flagged in the customer analytics view.": "Kunden ohne jegliche Kommunikation über diesen Zeitraum hinaus werden in der Kundenanalyse markiert."
}