fix: allow organiser to approve shift assignments when shift is full

The approve() and bulkApprove() methods in ShiftAssignmentService
hard-blocked with a 422 when all slots were filled. This was incorrect
for organiser actions — only volunteer claims (portal self-service)
should enforce capacity limits. Organiser assign() already allowed
overbooking, making the approve block inconsistent.

Changes:
- Remove capacity hard-block from approve() and bulkApprove(), replace
  with audit log entry (shift.overbooked_approval)
- Add overbook confirmation dialog in ShiftDetailPanel before approving
  a full shift (single + bulk approve)
- Add onError handlers to all mutations in ShiftDetailPanel (approve,
  reject, cancel, bulk-approve) so errors display in the snackbar
- Add global 422 validation error display in axios interceptor via
  useNotificationStore as safety net for all components
- Add PHPUnit test for approve-when-full scenario

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-14 17:42:04 +02:00
parent a9ef384515
commit ed1eddd486
4 changed files with 159 additions and 13 deletions

View File

@@ -62,7 +62,11 @@ apiClient.interceptors.response.use(
notificationStore.show('The requested item was not found.', 'warning')
}
else if (status === 422) {
// Validation errors — pass through to calling component
// Show validation message to user; still reject so component onError handlers can react
const message = error.response?.data?.message
if (message && typeof message === 'string') {
notificationStore.show(message, 'error')
}
}
else if (status === 503) {
notificationStore.show('Service temporarily unavailable. Please try again later.', 'error')