user(); $operational = in_array($user->purchasing_role, [PurchasingRole::Admin, PurchasingRole::Procurement, PurchasingRole::Finance]); $sources = Requisition::query()->where('requester_id', $user->id)->select('id'); $ownAwards = PurchaseAward::query()->whereIn('requisition_id', $sources)->select('id'); $cancellations = AwardCancellation::query()->whereIn('purchase_award_id', $ownAwards)->where('status', 'approved')->get(['id', 'purchase_award_id']); return Inertia::render('purchase-controls/index', [ 'role' => $user->purchasing_role->value, 'actorId' => $user->id, 'policies' => $operational ? PurchaseControlPolicy::query()->latest('revision')->get() : [], 'reviews' => $operational ? PurchaseControlReview::query()->get() : [], 'awards' => $operational ? PurchaseAward::query()->whereNotIn('requisition_id', PurchaseOrder::query()->select('requisition_id'))->latest('id')->get(['id', 'requisition_id', 'status']) : [], 'cancellations' => $operational ? AwardCancellation::query()->get(['id', 'purchase_award_id', 'created_by', 'status', 'reason', 'review_reason']) : [], 'sources' => $cancellations->map(function (AwardCancellation $cancellation) { $award = PurchaseAward::query()->findOrFail($cancellation->purchase_award_id); $source = Requisition::query()->findOrFail($award->requisition_id); return ['id' => $cancellation->id, 'number' => $source->number, 'revision_id' => PurchaseRevision::query()->where('award_cancellation_id', $cancellation->id)->value('requisition_id')]; }), ]); } public function propose(Request $request, PurchaseControlPolicyWorkflow $workflow): RedirectResponse { abort_unless($request->user()->purchasing_role === PurchasingRole::Admin, 403); $data = $request->validate(['previous_id' => 'required|integer|min:0', 'mode' => 'required|in:unissued_award', 'enabled' => 'required|boolean', 'valid_from' => 'required|date_format:Y-m-d', 'valid_until' => 'required|date_format:Y-m-d|after_or_equal:valid_from', 'reason' => 'required|string|min:10|max:4000']); $workflow->propose($request->user(), $data); return back(); } public function policyReview(Request $request, PurchaseControlPolicy $policy, PurchaseControlPolicyWorkflow $workflow): RedirectResponse { $data = $request->validate(['decision' => 'required|in:approved,rejected', 'reason' => 'required|string|min:10|max:4000']); $workflow->review($request->user(), $policy, $data['decision'], $data['reason']); return back(); } public function cancel(Request $request, PurchaseAward $award, PurchaseRevisionWorkflow $workflow): RedirectResponse { $data = $request->validate(['reason' => 'required|string|min:10|max:4000']); $workflow->request($request->user(), $award, $data['reason']); return back(); } public function review(Request $request, AwardCancellation $cancellation, PurchaseRevisionWorkflow $workflow): RedirectResponse { $data = $request->validate(['decision' => 'required|in:approved,rejected', 'reason' => 'required|string|min:10|max:4000']); $workflow->review($request->user(), $cancellation, $data['decision'], $data['reason']); return back(); } public function revise(Request $request, AwardCancellation $cancellation, PurchaseRevisionWorkflow $workflow): RedirectResponse { $data = $request->validate(['needed_by' => 'required|date_format:Y-m-d|after_or_equal:today', 'justification' => 'required|string|min:10|max:4000']); $revision = $workflow->revise($request->user(), $cancellation, $data['needed_by'], $data['justification']); return to_route('requisitions.edit', $revision); } }