feat(helpdesk): add handover protocol management

Implement handover protocols as a new entity in the helpdesk module,
allowing users to create fillable protocol records from admin-defined
software product schemas.

Key additions:
- DB migration (helpdesk_handovers table) with tenant scope
- HandoverService with status workflow (draft/in_progress/completed/archived)
- Three-tier permissions (view/create/manage)
- Two-step creation wizard (Stripe-style assistant)
- Grid.js list page with search and status filter
- Edit/detail page with aside metadata and status controls
- Reusable core autocomplete lookup component (app-lookup-field)
- Debitor lookup data endpoint for autocomplete
- Dynamic form rendering from schema snapshots
- 11 PHPUnit tests for HandoverService
- DE+EN i18n translations (48 keys each)

Also includes: PHPStan fixes (dead code removal, stale baseline cleanup),
software product edit title improvement, fieldset simplification,
and Stripe-style hover for schema preview.

Workflow: HD-HANDOVERS-001 (.agents/runs/HD-HANDOVERS-001/)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-15 20:42:41 +02:00
parent 57b7920098
commit a26c106083
34 changed files with 2572 additions and 91 deletions

View File

@@ -22,11 +22,17 @@ final class HelpdeskLayoutProvider implements LayoutContextProvider
$canViewTeam = $authorizationService->authorize('helpdesk.team-workload.view', $actorContext)->isAllowed();
$canViewRiskRadar = $authorizationService->authorize('helpdesk.risk-radar.view', $actorContext)->isAllowed();
$canManageSoftwareProducts = $authorizationService->authorize('helpdesk.software-products.manage', $actorContext)->isAllowed();
$canViewHandovers = $authorizationService->authorize('helpdesk.handovers.view', $actorContext)->isAllowed();
$canCreateHandovers = $authorizationService->authorize('helpdesk.handovers.create', $actorContext)->isAllowed();
$canManageHandovers = $authorizationService->authorize('helpdesk.handovers.manage', $actorContext)->isAllowed();
} catch (\Throwable) {
$canManageSettings = false;
$canViewTeam = false;
$canViewRiskRadar = false;
$canManageSoftwareProducts = false;
$canViewHandovers = false;
$canCreateHandovers = false;
$canManageHandovers = false;
}
return ['helpdesk.nav' => [
@@ -34,6 +40,9 @@ final class HelpdeskLayoutProvider implements LayoutContextProvider
'can_view_team' => $canViewTeam,
'can_view_risk_radar' => $canViewRiskRadar,
'can_manage_software_products' => $canManageSoftwareProducts,
'can_view_handovers' => $canViewHandovers,
'can_create_handovers' => $canCreateHandovers,
'can_manage_handovers' => $canManageHandovers,
]];
}
}