Commit Graph

190 Commits

Author SHA1 Message Date
fs
fe1a0b2f78 fix(helpdesk): match queue name 'Wartschlange' (BC spelling without e)
BC uses 'Wartschlange Customer Care' not 'Warteschlange'. Match on
common stem 'wartschlang' to cover both spellings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 21:02:52 +02:00
fs
81dc642d34 feat(helpdesk): separate queue from agents in team dashboard with wait time
Queue detection: any member with 'warteschlange' in support_user name
(or empty) is treated as queue, not as a regular agent.

Current tab: queue cards shown at top with a wait time summary
(Ø/Min/Max from open ticket ages). Agents listed below.

Historical tab: queue cards shown before agents, same performance
widget pattern.

No backend changes — purely client-side separation using existing data.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:56:31 +02:00
fs
1c6bcd6ec3 fix(helpdesk): move resolution time to last column in performance grid
Reorder: Top customers | Top categories | Resolution time.
More logical flow — pick a filter on the left, see the result on the right.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:41:39 +02:00
fs
5c0364f687 feat(helpdesk): clickable top customers/categories filter resolution times
Clicking a customer or category in the Historical tab recalculates
Ø/Min/Max resolution times for only that filter. Click again to reset.
All computation is client-side from resolved_details already in the
response — no extra API calls. Active filter highlighted with primary
color, resolution values turn primary when filtered.

Backend now includes resolved_ticket_details per agent (customer_name,
category, resolution_hours) for client-side filtering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:31:08 +02:00
fs
fc98f2684a fix(helpdesk): consolidation fixes from drift/performance/security review
- Fix docblock: getTicketsForTeam() uses PBI_FP_Tickets, not LV
- Process_Stage check now uses isset() guard — FP entity does not
  expose this field, prevents false positives from default 0
- Remove exception message from JSON error response (security)
- Remove dead JS functions: formatAge(), formatDate()
- Remove debug console.error and verbose error display from JS

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:25:51 +02:00
fs
b82cef31a6 fix(helpdesk): replace generic loading with card-shaped skeleton placeholders
Skeleton loading now mirrors the actual agent card layout: bordered card
with header (avatar circle + name bar + badge) and three table-like rows.
Removes aria-busy toggle from JS. Three skeleton cards shown during load.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:19:11 +02:00
fs
e819e235a2 fix(helpdesk): add vertical dividers between performance stat columns
Subtle border-left separates the three insight areas for better
readability. On mobile, switches to border-top between stacked items.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:17:15 +02:00
fs
82266fb289 fix(helpdesk): unify resolution time layout with ranked list pattern
Replace the custom Ø/Min/Max column layout with the same ranked list
component used for top customers and categories. All three columns
now use identical markup and styling for visual consistency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:13:26 +02:00
fs
4ce7a32bfc feat(helpdesk): redesign Historical tab with per-agent performance widgets
Each agent gets a card with three insight columns:
- Resolution time: Ø / Min / Max (formatted as hours or days)
- Top 3 customers by resolved ticket count (ranked list)
- Top 3 categories by resolved ticket count (ranked list)

Backend collects resolved ticket details per agent: customer names,
categories, and resolution hours. Aggregates top-3 and min/max/avg.
Replaces the old compact single-row layout with rich widget cards
matching the Current tab pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:11:44 +02:00
fs
7a574768db fix(helpdesk): rename Performance tab to Historical
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:07:08 +02:00
fs
b817ebf662 fix(helpdesk): rename navigation and title to 'Team dashboard'
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:05:09 +02:00
fs
b667ecca0c fix(helpdesk): show 'System' instead of 'Unknown user' for empty actors
Ticket log entries without Created_By (e.g. system-generated) now show
'System' instead of 'Unbekannter Benutzer'. Missing timestamps show
a dash instead of 'Unbekannte Zeit'.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:03:50 +02:00
fs
c80e317875 fix(helpdesk): fix contact name resolution when customerNo is empty
getContactsForCustomerWithMeta() returned early when customerNo OR
customerName was empty. The communication service calls it with empty
customerNo and only customerName — which always hit the early return,
preventing any contact lookup. Fix: only return early when BOTH are
empty, so the primary Company_Name query path works correctly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:02:05 +02:00
fs
422746d141 fix(helpdesk): resolve all support actor codes instead of requiring exactly one per ticket
The previous logic only resolved support user codes to full names when
exactly one unique support code existed per ticket. Tickets with multiple
support codes (e.g. after reassignment) left all codes unresolved,
showing abbreviations like 'NKS' or 'FA' instead of full names.

Now: every support-role actor code in a ticket is mapped to that ticket's
Support_User_Name. For the debitor feed, codes are mapped on first
encounter to avoid conflicts from reassigned tickets.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:00:50 +02:00
fs
4a62ed07e9 fix(helpdesk): prevent vertical text in table headers on narrow viewports
Add white-space:nowrap + overflow:hidden on th elements. Set min-width
on table so columns never shrink below readable size — scroll wrapper
handles the overflow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:53:37 +02:00
fs
bc0e4e64a8 fix(helpdesk): wrap team ticket tables in scroll container for responsive
Table keeps its fixed column widths and becomes horizontally scrollable
on narrow viewports instead of breaking the layout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:52:52 +02:00
fs
b028ecf0be fix(helpdesk): widen ticket, category and activity columns
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:52:27 +02:00
fs
3c0d3bb6f4 fix(helpdesk): consistent table columns across agent cards via colgroup
Use table-layout:fixed with colgroup defining column widths in ch units.
Every agent card table gets the same colgroup, ensuring identical column
alignment across all cards. Ticket (9ch), Customer (22ch), Category
(16ch), Activity (11ch) are fixed; Description takes remaining space
with ellipsis. All cells get overflow:hidden + text-overflow:ellipsis.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:51:20 +02:00
fs
3123b8aa77 fix(helpdesk): edge-to-edge table in cards, larger avatar, sort by urgency
- Remove card padding, table goes full-width inside card border
- Section title gets own padding + subtle background as card header
- Avatar inline size increased from 1.6rem to 2rem
- Sort agents by critical tickets first (most urgent on top),
  then by open tickets. Unassigned queue stays last.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:49:40 +02:00
fs
9e94456759 feat(helpdesk): switch team query to PBI_FP_Tickets for richer data
FP entity provides Company_Contact_Name (full customer name),
Category_1_Description (readable category), and Last_Activity_By_Code.
Customer column shows name instead of number. Category shows readable
description instead of code. Debitor link only rendered when
customer_no is available (FP may not expose it).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:47:10 +02:00
fs
d214f08c3f feat(helpdesk): add Description and Cust_Name from LV entity to team table
PBI_LV_Tickets exposes Description and Cust_Name (not Company_Contact_Name
which is FP-only). Add both to select. Table now shows 5 columns:
Ticket (link) | Customer name (link) | Description (ellipsis) |
Category | Last activity.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:44:53 +02:00
fs
cc1ae1aaca fix(helpdesk): replace description column with category in team ticket table
Description is not available on PBI_LV_Tickets. Show Category_1_Code
as its own 'Category' column instead of misusing it as description.
Remove unused ticket-desc CSS class.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:39:45 +02:00
fs
bfa3f5a154 fix(helpdesk): remove unavailable fields from LV ticket query
PBI_LV_Tickets does not expose Description or Company_Contact_Name —
BC returns HTTP 400 on unknown select fields. Revert to original LV
field set. Description falls back to Category_1_Code. Customer column
shows Customer_No when Company_Contact_Name is unavailable. Show API
error message in UI for debugging.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:38:26 +02:00
fs
72d39822bc fix(helpdesk): revert to PBI_LV_Tickets for team query, add error logging
PBI_FP_Tickets (FactPage) fails without a customer filter. Switch back
to PBI_LV_Tickets which works reliably unfiltered. Description and
Company_Contact_Name added to select — BC will return them if available,
otherwise they fall back to empty strings via existing null-coalescing.
Add console.error in JS catch to surface rendering errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:36:58 +02:00
fs
75c96c901a fix(helpdesk): use auto table layout with max-width:0 ellipsis pattern
Fix missing closing brace in CSS. Use width:100% + max-width:0 on
description column for consistent ellipsis across all agent tables.
Narrow columns (ticket no, customer, date) use white-space:nowrap to
keep natural width. No fixed percentages — fully responsive.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:34:57 +02:00
fs
2398a73cde fix(helpdesk): remove fixed table-layout percentages, use auto layout
Let the browser distribute column widths based on content. Removes
brittle fixed percentages that break on narrow viewports.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:33:25 +02:00
fs
98ba2c024d fix(helpdesk): remove title line in team widgets, fix table columns and debitor links
- Hide section-title ::after line inside team widgets
- Fixed table-layout with consistent column widths (12/25/43/20%)
- Debitor link uses customer_no (route param), displays customer_name
- Add Customer_No to OData select for debitor link resolution
- Add customer_no to open_ticket_details backend structure

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:31:58 +02:00
fs
98f703b231 feat(helpdesk): enrich team ticket table with links, customer name, description, last activity
- Switch gateway from PBI_LV_Tickets to PBI_FP_Tickets to get
  Description and Company_Contact_Name fields
- Ticket number links to ticket detail page
- Customer column shows Company_Contact_Name with link to debitor detail
- Description column with text-overflow ellipsis
- Last activity column shows formatted date (was: age in hours)
- Backend provides last_activity ISO string and customer_name per ticket
- Table headers use i18n labels via data attributes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:29:02 +02:00
fs
8fd742141c fix(helpdesk): add border card around each agent widget for separation
Each agent section gets a border + border-radius wrapper. The inner
ticket table drops its own border to avoid double borders.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:25:57 +02:00
fs
49c3741c66 fix(helpdesk): neutral count badges, bordered tables, critical legend
- Count badge in section title is always neutral (no warning color)
- Critical highlighting only on ticket number, not entire row
- Ticket tables have border + border-radius + subtle header background
  matching the existing table widget pattern
- Legend at bottom explains the warning color when critical tickets exist

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:24:37 +02:00
fs
70bfbbdc30 refactor(helpdesk): redesign team dashboard with section widgets and ticket tables
Replace custom card layout with the existing debitor dashboard pattern:
each agent is a section with helpdesk-support-section-title (avatar
initials + name + count badge + line) and a ticket table underneath
(Ticket No, Customer, Description, Age). Critical rows highlighted.
Queue section uses same pattern without avatar. Performance tab uses
compact rows with avatar + name + resolved badge. No custom card or
pill styles — consistent with existing dashboard widgets.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:22:09 +02:00
fs
a58c870561 fix(helpdesk): simplify team dashboard visuals — remove bars and colors
Remove progress bars (meaningless without a defined per-agent limit),
remove deterministic hue coloring (too noisy), and fix spacing by using
gap on a container grid instead of border-bottom on items. Avatars now
use a single neutral style. Count badges remain as the key indicator
(warning-colored when critical tickets exist). Cleaner, quieter layout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:16:42 +02:00
fs
2c2b9c17a3 feat(helpdesk): redesign team dashboard with avatar cards and ticket pills
Replace card-with-ticket-list layout with a GitHub/Stripe-inspired design:

- Avatar initials circles with deterministic colors per agent (name → hue)
- Horizontal agent rows: avatar | name + count badge | load bar | ticket pills
- Ticket pills showing No · Customer · Age (description on hover/title)
- Critical tickets highlighted with warning color in pills
- Queue section at top with uppercase header and ticket pills directly
- Performance tab with smaller avatars and success-colored bars
- Agent load bars colored per-agent (matching avatar hue)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:13:47 +02:00
fs
397f9fe659 feat(helpdesk): redesign team dashboard with agent cards and ticket details
Replace KPI tiles + table with visual agent cards showing workload at a
glance. Each card has the agent name, ticket count badge (warning-colored
when critical), a proportional load bar, and the actual open tickets
listed underneath (number, description, age). Critical tickets are
highlighted with warning color. Queue (unassigned) shown as dashed card
at top. Performance tab uses compact cards with success-colored bars.
Backend now returns open_ticket_details per member (sorted: critical
first, then by age descending).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:09:15 +02:00
fs
82c76d6119 fix(helpdesk): hide zero-activity agents and add spacing in team dashboard
Filter out agents with 0 open tickets from Current tab and 0 resolved
from Performance tab to reduce noise. Add margin between period selector
and KPI card in the Performance panel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:58:10 +02:00
fs
0927dea7bb feat(helpdesk): add Stripe-style inline bars, badges, and muted zeros to team tables
Current tab: proportional bars behind open ticket counts for instant
visual comparison, warning badges for critical counts (>0), muted
styling for zero values. Performance tab: success-colored bars behind
resolved counts. Unassigned row gets muted bar variant.

Adds tabular-nums for aligned numbers, smooth bar transitions, and
de-emphasized table borders for a cleaner visual hierarchy.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:56:25 +02:00
fs
5ab4380a63 feat(helpdesk): split team dashboard into Current and Performance tabs
Current tab: snapshot KPIs (open, unassigned, avg age) and per-agent
table with open/critical/age columns. No period filter needed.

Performance tab: period-filtered KPI (resolved) with segment control
(30/90/180/365d) and per-agent table sorted by resolved count.

Separates the two core questions: "Who needs help now?" vs.
"How did the team perform over time?"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:53:39 +02:00
fs
cfb399b12a fix(helpdesk): wrap team dashboard content in single container for correct padding
All dashboard content (period selector, states, KPIs, table) now sits
inside one wrapper div as a direct child of section, so Core's
padding-inline rule applies consistently.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:50:38 +02:00
fs
0bbc448bcd refactor(helpdesk): reuse segment-control pattern for team period selector
Replace custom button-based period selector with the existing
helpdesk-segment-control radio+label pattern used in the controlling
dashboard. Removes duplicate CSS and ensures visual consistency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:49:16 +02:00
fs
cae66e5361 feat(helpdesk): add team workload dashboard with per-agent metrics
New standalone page (helpdesk/team) showing support agent workload
aggregated from BC tickets. KPI bar (open, unassigned, avg age, resolved),
per-agent table sorted by open tickets, period selector (30/90/180/365d).
Global OData query via getTicketsForTeam() without customer filter.
New permission helpdesk.team-workload.view with admin role assignment.
Includes 6 PHPUnit tests for buildTeamWorkloadDashboard().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:46:54 +02:00
fs
28d66dea33 refactor(helpdesk): use semantic <hr> instead of CSS borders for rule separators
Replace border-bottom on rule items and border-top on advanced disclosure
with native <hr> elements that inherit Core's muted-border styling.
Module CSS now only handles layout, not border presentation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:05:50 +02:00
fs
76ac8b945a fix(helpdesk): remove unnecessary typography overrides from settings CSS
Remove opacity and font-size overrides on small and span elements
that are already styled by core. Module CSS should only handle layout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:01:46 +02:00
fs
26bf972f47 feat(helpdesk): simplify settings by merging recommendations and controlling into automation tab
Merge 'System recommendations' (5 rules × 3-4 fields) and 'Controlling'
(4 rules × 2 fields) into a single 'Automation' tab with two sections:
Recommendations and Risk monitoring. Each rule now shows only a toggle and
help text; priority fields removed (hardcoded in action). Advanced disclosure
for recommendation thresholds. Fix nav highlighting bug where 'Kunden' was
also highlighted when Settings was active.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:58:00 +02:00
fs
b749b5d192 feat: centralize breadcrumbs in topbar and remove history navigation
Move breadcrumb rendering from individual page templates into the core
topbar. Each page now sets $breadcrumbs in its action .php file; the
topbar renders it automatically via the shared partial.

- Remove global back/forward buttons and app-nav-history.js component
- Remove Alt+Arrow keyboard shortcuts for history navigation
- Render breadcrumb in topbar-left section (replaces button area)
- Clean up breadcrumb CSS: context-neutral base (flex, no margin)
- Recalculate sticky titlebar offset in details container
- Migrate all 41 pages (core + helpdesk, audit, addressbook, api-docs)
- Add missing breadcrumbs to addressbook detail view
- Update architecture contract tests (nav-history references removed)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:17:06 +02:00
fs
7220aa7459 feat(helpdesk): add ticket grid filters and resolve support user names in chat
Add 3 new ticket list filters: Support User (dynamic select), Contact (dynamic
select), and Period (30/90/180/365 days). Extend categories endpoint to also
return support_users and contacts arrays from the same cached ticket data.
Add server-side filtering for all three in the data endpoint.

Resolve support user abbreviation codes to full names in the communication chat
widget. For single-ticket view, infer code-to-name from Support_User_Name when
only one support code appears. For debitor view, build map from already-fetched
entries across tickets with no additional API calls.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 16:37:07 +02:00
fs
eed1e848df feat(helpdesk): redesign ticket detail with communication as main content and metadata aside
Swap layout: communication feed becomes the primary main content area (full width),
ticket metadata moves to aside panel with 2 stacked KPI tiles (Status, Age) and
a Stripe-style key-value definition list (Description, Company link, Contact,
Category, Support, Debtor No.). Remove activity timeline entirely — communication
feed already includes activity fallback when SOAP is unavailable. Add skeleton
bubble loading for async communication. Simplify JS from 211 to 89 lines. Remove
unused ticketLogUrl data attribute and i18n keys.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 16:32:53 +02:00
fs
2f0f407268 feat(helpdesk): redesign dashboards with KPI groups, skeleton loading, and unified spacing
Restructure Support dashboard into 2 KPI groups (Tickets + Contracts) with
section dividers, merge escalations and recommendations into "Attention needed".
Redesign Sales dashboard with clickable contract timeline and dialog.
Add CSS shimmer skeleton loading for all dashboard tabs and aside.
Unify vertical rhythm via * + * sibling combinator on tab content containers.
Remove ~265 lines of dead CSS (contract cards, escalation styles) and unused JS
functions. Refactor hydrateTicketCategoryFilter into generic hydrateSelectFilter.
Fix role="button" CSS bleed from shell and remove extra future year from timeline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 16:32:34 +02:00
fs
aee9cb10f3 feat(helpdesk): add dashboards, communication feed, settings UI and fix routing
Add support/sales/controlling dashboards with KPIs, trend charts and
risk indicators. Add debitor communication timeline, contact filters,
system recommendations engine, and configurable controlling risk rules.

Rename search→index to fix query-string preservation on back navigation.
Remove fake escalation rate metric, add KPI info tooltips, and switch
trend chart colors to red (created) / green (closed) for clarity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:34:03 +02:00
fs
e897cc2c56 feat(helpdesk): add ticket/debtor communication feed and chat timeline UI 2026-04-03 16:45:41 +02:00
fs
8de67fa882 feat(helpdesk): enable oauth2 token flow and tenant-scoped cache 2026-04-02 21:46:01 +02:00