When the SOAP message map is applied to OData entries, the message text
is already embedded in the OData entries. The separate SOAP message
entries then cause duplicates with different actor/timestamp metadata.
Now: when soapMessageMap was used, filter out SOAP entries with
type_variant 'message' since they are already represented in OData.
Non-message SOAP entries (status, activity) are kept.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds 'Refresh data' button that re-fetches the communication feed
with ?refresh=1 to bypass the session cache. Shows loading skeleton
during reload.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SOAP entries often have an empty actor while OData entries have a code
like 'NKS'. After name resolution, one becomes 'Nikita Soldatov' and
the other stays empty — producing different signatures and causing
duplicates. The actor is not a reliable dedup field since the same
event can have different actor representations across sources.
Dedup now uses: ticket_no + timestamp_iso + type + message_hash.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the heading and the CSS override — communication feed starts
directly without a title in the ticket detail view.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the Status and Age KPI metric tiles from the ticket aside.
Merge all information into a single definition list: Status, Description,
Company, Contact, Category, Support, Created, Last activity, Age.
Consistent with the label/value pattern used across all detail views.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The timeline line between communication entries had gaps because each
item drew its own ::before segment with fixed overlap that didn't match
the feed gap. Replace with a single continuous ::before line on the
feed container. Item dots (::after) remain per-item. Works robustly
regardless of gap size or item height.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Contracts & products KPI tiles (active contracts, monthly volume,
support hours, next invoicing) distract from the ticket-focused support
view. Contract data remains available in the dedicated Sales tab.
Removes: section HTML, skeleton placeholder, JS render function + call.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set href to empty string so the Helpdesk sidebar icon toggles the
navigation panel open/closed without navigating to the customers page.
Same pattern as the bookmarks module.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Change default period from 90 to 30 days for a more current snapshot.
Add legend footnote: '↑↓ Trend basiert auf den letzten 30 Tagen'
so the user knows what the arrows refer to.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move border-radius to the section title header directly instead of
relying on overflow:hidden on the parent. Tooltips on trend arrows
are no longer clipped by the card boundary.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Hover over ↑/↓ shows a data-tooltip explaining the delta in plain
language: 'More tickets received than resolved — backlog is growing.'
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shows a small arrow next to the ticket count in each agent card header:
↑3 (orange) = received 3 more than resolved → backlog growing
↓2 (green) = resolved 2 more than received → backlog shrinking
Hidden when delta is 0 (stable).
Delta is computed from received_in_period (tickets created in the
selected period assigned to this agent) minus resolved_in_period.
No snapshot storage needed — derived from existing ticket data.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Revert queue detection, wait time summary, and visual separation.
All members are treated equally again — queue appears as a normal
agent entry sorted by the existing criteria.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
- 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>
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>
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>
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>
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>
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>
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>
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>
- 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>
- 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>
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>
- 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>
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>
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>
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>
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>
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>