- Case numbers SUP-000001, SUP-000002 … per customer, unique per customer (new index; a migration step renames any old duplicates first). The portal suggests the next number on the finding page and under the new "Ny sag" on the customer page; an empty field gets the next number, a typed one that is taken is refused. Concurrent creates retry. - SupportCase gains Source (Staff/Customer), description, contact name, e-mail, phone, the customer's Windows user and ClientRequestId. - POST/GET /api/v1/cases for the customer's agent (license with priority support): creates a case idempotently on ClientRequestId, links the finding it came from, lists the customer's cases incl. staff-created. Customer/license creation is shared with the findings endpoint. - Optional mail to support for customer cases (MailKit; prefers AUTH LOGIN as Microsoft 365 needs). A failed mail is logged, never fails the call. deploy-hub.yml writes optional SUPPORT_SMTP_* secrets to .env. - Supportrapport: created, closed, open now, average/median resolution time, oldest open case and customer-created share per customer for a period (default 90 days), plus the cases; CSV for Danish Excel. - Cases page: newest first, customer cases marked, contact/description. - Customer page: findings can be filtered to one instance (?instans=id, ignored for another customer's instance); active findings per instance by severity. - dotnet-ef as a local tool (dotnet-tools.json) for the migration. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
30 lines
1.1 KiB
Text
30 lines
1.1 KiB
Text
@if (Rows.Count == 0)
|
||
{
|
||
<p class="empty">Ingen aktive fund.</p>
|
||
}
|
||
else
|
||
{
|
||
<table>
|
||
<thead><tr><th>Alvor</th>@if (ShowCustomer) { <th>Kunde</th> }@if (ShowInstance) { <th>Instans</th> }<th>Fund</th><th>Regel</th><th>Sag</th><th>Siden</th></tr></thead>
|
||
<tbody>
|
||
@foreach (var f in Rows)
|
||
{
|
||
<tr>
|
||
<td><Sev Severity="f.Severity" /></td>
|
||
@if (ShowCustomer) { <td><a href="/portal/kunder/@f.CustomerId">@f.Customer</a></td> }
|
||
@if (ShowInstance) { <td>@f.Instance</td> }
|
||
<td><a href="/portal/fund/@f.Id">@f.Title</a></td>
|
||
<td class="mono">@f.RuleId</td>
|
||
<td>@(f.CaseReference ?? "–")</td>
|
||
<td class="nowrap">@f.FirstSeenAt.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)</td>
|
||
</tr>
|
||
}
|
||
</tbody>
|
||
</table>
|
||
}
|
||
|
||
@code {
|
||
[Parameter, EditorRequired] public IReadOnlyList<FindingRow> Rows { get; set; } = [];
|
||
[Parameter] public bool ShowCustomer { get; set; } = true;
|
||
[Parameter] public bool ShowInstance { get; set; } = true;
|
||
}
|