diff --git a/app/Http/Controllers/IntegrationRequestController.php b/app/Http/Controllers/IntegrationRequestController.php index 14b88a12..3471a54c 100644 --- a/app/Http/Controllers/IntegrationRequestController.php +++ b/app/Http/Controllers/IntegrationRequestController.php @@ -79,6 +79,11 @@ class IntegrationRequestController extends Controller { $user = $request->user(); + // Not-doable requests are frozen: their tally can no longer be touched. + if ($integrationRequest->status === IntegrationRequestStatus::NotDoable) { + abort(404); + } + // Only votes cast this month can be undone, so the refund maps back to // the current quota while earlier months' tallies stay locked in. $vote = $integrationRequest->votes() diff --git a/resources/js/components/integration-requests/integration-requests-board.tsx b/resources/js/components/integration-requests/integration-requests-board.tsx index e117196f..81db4f11 100644 --- a/resources/js/components/integration-requests/integration-requests-board.tsx +++ b/resources/js/components/integration-requests/integration-requests-board.tsx @@ -138,7 +138,7 @@ export function IntegrationRequestsBoard({ }; const handleRemoveVote = async (item: IntegrationRequestItem) => { - if (busy || !item.can_unvote) { + if (busy || !item.can_unvote || item.status === 'not_doable') { return; } @@ -273,19 +273,22 @@ export function IntegrationRequestsBoard({ )}
- {item.can_unvote && ( - - )} + {item.can_unvote && + item.status !== 'not_doable' && ( + + )}