Files
breadcrumb-the-shire/modules/helpdesk/i18n/default_en.json
fs ea786f5341 feat(helpdesk): add multi-tenant BC connection settings with risk radar refinements
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>
2026-04-06 10:29:59 +02:00

341 lines
16 KiB
JSON

{
"Helpdesk": "Helpdesk",
"Helpdesk settings": "Helpdesk settings",
"Customers": "Customers",
"Debtor search": "Debtor search",
"Search debtors": "Search debtors",
"Search by name or debtor number...": "Search by name or debtor number...",
"Search": "Search",
"Please provide a customer number": "Please provide a customer number",
"Minimum 2 characters": "Minimum 2 characters",
"Please enter at least 2 characters.": "Please enter at least 2 characters.",
"No debtors found": "No debtors found",
"Try a different search term.": "Try a different search term.",
"Could not connect to Business Central.": "Could not connect to Business Central.",
"BC connection is not configured.": "BC connection is not configured.",
"BC connection is not configured. Please configure the connection in the settings.": "BC connection is not configured. Please configure the connection in the settings.",
"BC connection is not configured": "BC connection is not configured",
"Open settings": "Open settings",
"Debtor No.": "Debtor No.",
"Name": "Name",
"City": "City",
"Phone": "Phone",
"E-Mail": "E-Mail",
"Master data": "Master data",
"Contacts": "Contacts",
"Tickets": "Tickets",
"Debtor details": "Debtor details",
"Search name": "Search name",
"Address": "Address",
"Postal code": "Postal code",
"Salesperson": "Salesperson",
"No contacts found": "No contacts found",
"No contacts are linked to this debtor in Business Central.": "No contacts are linked to this debtor in Business Central.",
"No.": "No.",
"Type": "Type",
"Job title": "Job title",
"No tickets found": "No tickets found",
"No tickets are linked to this debtor in Business Central.": "No tickets are linked to this debtor in Business Central.",
"Ticket No.": "Ticket No.",
"Description": "Description",
"Status": "Status",
"Category": "Category",
"Contact": "Contact",
"Support": "Support",
"Sales": "Sales",
"Controlling": "Controlling",
"Ticket": "Ticket",
"Debtor": "Debtor",
"Debtor not found": "Debtor not found",
"Ticket not found": "Ticket not found",
"Back to search": "Back to search",
"Back": "Back",
"Settings": "Settings",
"Connection": "Connection",
"Save": "Save",
"Settings saved": "Settings saved",
"Configuration incomplete": "Configuration incomplete",
"OData connection": "OData connection",
"OData Base URL": "OData Base URL",
"Base URL without Company path segment": "Base URL without Company path segment",
"Company name": "Company name",
"BC company name (URL-encoded automatically)": "BC company name (URL-encoded automatically)",
"Authentication": "Authentication",
"Auth mode": "Auth mode",
"Basic Auth": "Basic Auth",
"OAuth2 (client credentials)": "OAuth2 (client credentials)",
"Basic Auth credentials": "Basic Auth credentials",
"Username": "Username",
"Password": "Password",
"Leave unchanged to keep current password": "Leave unchanged to keep current password",
"OAuth2 credentials": "OAuth2 credentials",
"Azure Tenant ID": "Azure Tenant ID",
"Client ID": "Client ID",
"Client Secret": "Client Secret",
"Token endpoint URL": "Token endpoint URL",
"Connection test": "Connection test",
"Test connection": "Test connection",
"Connection successful": "Connection successful",
"Connection failed": "Connection failed",
"Testing...": "Testing...",
"Form expired, please try again": "Form expired, please try again",
"OData Base URL must use HTTPS": "OData Base URL must use HTTPS",
"Address & contact": "Address & contact",
"Company": "Company",
"Company details": "Company details",
"Contact & dates": "Contact & dates",
"Could not load contacts.": "Could not load contacts.",
"Could not load tickets.": "Could not load tickets.",
"Last activity": "Last activity",
"Ticket details": "Ticket details",
"Overview": "Overview",
"Open tickets": "Open tickets",
"All tickets": "All tickets",
"All contacts": "All contacts",
"Recent activity": "Recent activity",
"Support info & master data": "Support info & master data",
"Support type": "Support type",
"Location": "Location",
"No open tickets": "No open tickets",
"No recent activity found.": "No recent activity found.",
"Total tickets": "Total tickets",
"Total contracts": "Total contracts",
"Critical (>48h)": "Critical (>48h)",
"Oldest open": "Oldest open",
"Ticket list": "Ticket list",
"Next actions": "Next actions",
"System recommendations": "System recommendations",
"Action": "Action",
"Age (h)": "Age (h)",
"No support actions required right now.": "No support actions are required right now.",
"No system recommendations right now.": "No system recommendations right now.",
"Contracts & products": "Contracts & products",
"No contracts found for this customer.": "No contracts found for this customer.",
"Contract No.": "Contract No.",
"Product type": "Product type",
"Next invoicing": "Next invoicing",
"Amount": "Amount",
"Active contracts": "Active contracts",
"Could not load contracts.": "Could not load contracts.",
"Escalations": "Escalations",
"Escalations are not available yet.": "Escalations are not available yet.",
"Escalated tickets": "Escalated tickets",
"No escalated tickets right now.": "No escalated tickets right now.",
"Could not load escalated tickets.": "Could not load escalated tickets.",
"Escalation code": "Escalation code",
"SLA target": "SLA target",
"Overdue by": "Overdue by",
"day": "day",
"days": "days",
"Ticket volume": "Ticket volume",
"Close rate": "Close rate",
"Avg. resolution": "Avg. resolution",
"Open backlog": "Open tickets",
"kpi_tooltip_close_rate": "Closed \u00f7 created tickets in period. Above 1\u00d7 = open ticket queue is shrinking.",
"kpi_tooltip_resolution": "Median processing time of all tickets closed in the selected period.",
"kpi_tooltip_backlog": "Current snapshot of all open tickets \u2013 independent of the selected period. Shows the pending queue.",
"Backlog shrinking": "Queue shrinking",
"Backlog growing": "Queue growing",
"unassigned": "unassigned",
"Ticket trend": "Ticket trend",
"Support efficiency": "Support efficiency",
"Contract metrics": "Contract metrics",
"Risk assessment": "Risk assessment",
"vs. prev. period": "vs. prev. period",
"Low": "Low",
"Medium": "Medium",
"High": "High",
"All checks passed": "All checks passed",
"of": "of",
"checks flagged": "checks flagged",
"Limit": "Limit",
"No controlling data available.": "No controlling data available.",
"Resolution time": "Resolution time",
"Oldest open ticket": "Oldest open ticket",
"Unassigned": "Unassigned",
"risk_desc_ticket_volume": "Change vs. previous period",
"risk_desc_resolution_time": "Median time to close",
"risk_desc_open_aging": "Since last activity",
"risk_desc_unassigned": "Share of open tickets without assignee",
"Ticket volume increase": "Ticket volume increase",
"High avg. resolution time": "High avg. resolution time",
"Open ticket aging": "Open ticket aging",
"Unassigned ticket ratio": "Unassigned ticket ratio",
"Could not load controlling dashboard.": "Could not load controlling dashboard.",
"Avg. open age": "Avg. open age",
"Without assignee": "Without assignee",
"30 days": "30 days",
"90 days": "90 days",
"6 months": "6 months",
"1 year": "1 year",
"Escalation rate": "Escalation rate",
"Threshold (%)": "Threshold (%)",
"Threshold (hours)": "Threshold (hours)",
"Controlling risk configuration was invalid. Defaults were applied.": "Controlling risk configuration was invalid. Defaults were applied.",
"Open ticket without activity for": "Open ticket without activity for",
"hours": "hours",
"Open ticket without assigned support user": "Open ticket without assigned support user",
"Follow up oldest open ticket": "Follow up oldest open ticket",
"System recommendation configuration was invalid. Defaults were applied.": "System recommendation configuration was invalid. Defaults were applied.",
"Maximum recommendations": "Maximum recommendations",
"Rule templates": "Rule templates",
"Enabled": "Enabled",
"Priority": "Priority",
"Thresholds": "Thresholds",
"Escalation overdue": "Escalation overdue",
"High-risk aging": "High-risk aging",
"Unassigned open": "Unassigned open",
"Stale open": "Stale open",
"Customer backlog": "Open tickets for customer",
"Minimum overdue (minutes)": "Minimum overdue (minutes)",
"High-risk codes (comma separated)": "High-risk codes (comma separated)",
"Minimum age (hours)": "Minimum age (hours)",
"Minimum open tickets": "Minimum open tickets",
"Escalation SLA exceeded by {overdue_hours}h ({escalation_code}).": "SLA exceeded by {overdue_hours}h ({escalation_code}) — escalate immediately or inform customer.",
"High-risk ticket ({escalation_code}) is open for {age_hours}h.": "Critical ticket ({escalation_code}) open for {age_hours}h — review priority and ensure progress.",
"Ticket is unassigned for {age_hours}h.": "Unassigned for {age_hours}h — assign to a team member urgently.",
"No activity for {age_hours}h.": "No activity for {age_hours}h — check if customer is waiting for a response.",
"Customer backlog: {open_tickets} open tickets.": "{open_tickets} open tickets — address oldest tickets first to reduce the queue.",
"Created": "Created",
"Loading...": "Loading...",
"Refresh data": "Refresh data",
"Mobile": "Mobile",
"Activity": "Activity",
"Activity timeline": "Activity timeline",
"Message": "Message",
"Status change": "Status change",
"No activity found.": "No activity found.",
"Could not load activity log.": "Could not load activity log.",
"Communication history": "Communication history",
"No communication found.": "No communication found.",
"Could not load communication history.": "Could not load communication history.",
"Live communication unavailable, showing activity fallback.": "Live communication unavailable, showing activity fallback.",
"Ticket communication": "Ticket communication",
"Last 5 tickets": "Last 5 tickets",
"Last 10 tickets": "Last 10 tickets",
"Some ticket communications could not be loaded completely.": "Some ticket communications could not be loaded completely.",
"Unknown user": "Unknown user",
"Unknown time": "Unknown time",
"Source": "Source",
"SOAP": "SOAP",
"Activity fallback": "Activity fallback",
"sent a message": "sent a message",
"changed status": "changed status",
"Forwarded": "forwarded the ticket",
"attached a file": "attached a file",
"logged an activity": "logged an activity",
"on": "on",
"Process": "Process",
"All": "All",
"Open": "Open",
"In Progress": "In Progress",
"Closed": "Closed",
"Monthly volume": "Monthly volume",
"Support hours": "Support hours",
"Contract overview": "Contract overview",
"No contract details available.": "No contract details available.",
"Could not load sales dashboard.": "Could not load sales dashboard.",
"Quantity": "Quantity",
"Unit price": "Unit price",
"Line amount": "Line amount",
"Line state": "Line state",
"Starting date": "Starting date",
"Invoicing period": "Invoicing period",
"positions": "positions",
"per month": "per month",
"Last invoicing": "Last invoicing",
"Analysis": "Analysis",
"New (30d)": "New (30d)",
"Resolved (30d)": "Resolved (30d)",
"Avg. age open": "Avg. age open",
"vs. prev. 30d": "vs. prev. 30d",
"net (30d)": "net (30d)",
"critical": "critical",
"Avg. contract value": "Avg. contract value",
"of {total} total": "of {total} total",
"in {days} days": "in {days} days",
"largest": "largest",
"Attention needed": "Attention needed",
"Recommendations": "Recommendations",
"Contract summary": "Contract summary",
"Contract trend": "Contract trend",
"New contracts": "New contracts",
"Ended contracts": "Ended contracts",
"active": "active",
"ended": "ended",
"Age": "Age",
"Period": "Period",
"Last 30 days": "Last 30 days",
"Last 90 days": "Last 90 days",
"Last 180 days": "Last 180 days",
"Last 365 days": "Last 365 days",
"Automation": "Automation",
"Risk monitoring": "Risk monitoring",
"rule_help_escalation_overdue": "Recommends action when SLA escalation deadlines are exceeded.",
"rule_help_high_risk_aging": "Detects critical tickets with specific escalation codes that have been open too long.",
"rule_help_unassigned_open": "Flags open tickets that are not assigned to any support agent.",
"rule_help_stale_open": "Marks open tickets without recent activity for follow-up.",
"rule_help_customer_backlog": "Warns when a customer has too many open tickets at once.",
"rule_help_ticket_volume": "Triggers when ticket volume rises significantly compared to the previous period.",
"rule_help_avg_resolution": "Warns when average resolution time exceeds the threshold.",
"rule_help_open_aging": "Detects open tickets that have been without activity for too long.",
"rule_help_unassigned_ratio": "Warns when too many open tickets lack an assigned agent.",
"Automation configuration was invalid. Defaults were applied.": "Automation configuration was invalid. Defaults were applied.",
"Advanced options": "Advanced options",
"Min. overdue": "Min. overdue",
"Min. age": "Min. age",
"Min. open": "Min. open",
"Team": "Team",
"Team dashboard": "Team dashboard",
"Team workload": "Team workload",
"Support agent": "Support agent",
"Open": "Open",
"Critical (>48h open)": "Critical (>48h open)",
"Avg. age (h)": "Avg. age (h)",
"Resolved in period": "Resolved in period",
"Not assigned": "Not assigned",
"Could not load team dashboard.": "Could not load team dashboard.",
"No team data available.": "No team data available.",
"Top customers": "Top customers",
"Top categories": "Top categories",
"Current": "Current",
"Performance": "Performance",
"Historical": "Historical",
"Queue": "Queue",
"trend_tooltip_up": "More tickets received than resolved in the period — backlog is growing.",
"trend_tooltip_down": "More tickets resolved than received in the period — backlog is shrinking.",
"Download file": "Download file",
"Trend based on last {days} days": "Trend based on last {days} days",
"Trend": "Trend",
"Risk radar": "Risk radar",
"Risk score": "Risk score",
"High risk": "High risk",
"Medium risk": "Medium risk",
"Low risk": "Low risk",
"SLA overdue": "SLA overdue",
"Net flow": "Net flow",
"Open pressure": "Open pressure",
"Inactivity": "Inactivity",
"No risk data available.": "No risk data available.",
"Could not load risk radar.": "Could not load risk radar.",
"Data may be incomplete. Not all tickets could be loaded.": "Data may be incomplete. Not all tickets could be loaded.",
"Why at risk": "Why at risk",
"open": "open",
"overdue": "overdue",
"net": "net",
"Search customers...": "Search customers...",
"more than resolved": "more than resolved",
"SLA breaches": "SLA breaches",
"Oldest ticket": "Oldest ticket",
"Tenant override": "Tenant override",
"Configuration source": "Configuration source",
"Current tenant": "Current tenant",
"Use tenant-specific configuration": "Use tenant-specific configuration",
"When enabled, this tenant uses its own BC connection instead of the global configuration.": "When enabled, this tenant uses its own BC connection instead of the global configuration.",
"Tenant connection": "Tenant connection",
"Tenant authentication": "Tenant authentication",
"This tenant inherits the global configuration. Enable the toggle above to use tenant-specific settings.": "This tenant inherits the global configuration. Enable the toggle above to use tenant-specific settings.",
"Tenant settings saved": "Tenant settings saved",
"Token endpoint must use HTTPS": "Token endpoint must use HTTPS"
}