Introduce per-tenant override for helpdesk BC connection config. New table helpdesk_tenant_settings stores tenant-specific credentials with encrypted secrets (AES-256-GCM). EffectiveHelpdeskSettingsService resolves global vs tenant config per request. Settings UI extended with tenant override tab, toggle, and dual editing mode. All runtime consumers (OData, SOAP, OAuth) read through the new resolver. Token cache flushed on any config change. Default behavior unchanged — tenants use global config until override explicitly enabled. Also includes risk radar UI refinements: Stripe-style card redesign with accent borders and score pills, removal of redundant KPI tiles and search, and filtering of zero-score entries. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
341 lines
17 KiB
JSON
341 lines
17 KiB
JSON
{
|
|
"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.",
|
|
"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 connection": "OData-Verbindung",
|
|
"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)",
|
|
"Basic Auth credentials": "Basic-Auth-Zugangsdaten",
|
|
"Username": "Benutzername",
|
|
"Password": "Passwort",
|
|
"Leave unchanged to keep current password": "Leer lassen, um das aktuelle Passwort beizubehalten",
|
|
"OAuth2 credentials": "OAuth2-Zugangsdaten",
|
|
"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 \u00f7 erstellte Tickets im Zeitraum. \u00dcber 1\u00d7 = R\u00fcckstau wird abgebaut.",
|
|
"kpi_tooltip_resolution": "Median der Bearbeitungsdauer aller im Zeitraum geschlossenen Tickets.",
|
|
"kpi_tooltip_backlog": "Aktueller Stand aller offenen Tickets \u2013 unabh\u00e4ngig vom gew\u00e4hlten Zeitraum. Zeigt den R\u00fcckstau.",
|
|
"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": "Team-Dashboard",
|
|
"Team workload": "Team-Auslastung",
|
|
"Support agent": "Support-Mitarbeiter",
|
|
"Open": "Offen",
|
|
"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.": "Team-Dashboard 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",
|
|
"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",
|
|
"Tenant override": "Mandanten-Override",
|
|
"Configuration source": "Konfigurationsquelle",
|
|
"Current tenant": "Aktueller Mandant",
|
|
"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.",
|
|
"Tenant connection": "Mandanten-Verbindung",
|
|
"Tenant authentication": "Mandanten-Authentifizierung",
|
|
"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"
|
|
}
|