86 lines
4.4 KiB
PHP
86 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Enums\PurchasingRole;
|
|
use App\Models\AwardCancellation;
|
|
use App\Models\PurchaseAward;
|
|
use App\Models\PurchaseControlPolicy;
|
|
use App\Models\PurchaseControlReview;
|
|
use App\Models\PurchaseOrder;
|
|
use App\Models\PurchaseRevision;
|
|
use App\Models\Requisition;
|
|
use App\Services\PurchaseControlPolicyWorkflow;
|
|
use App\Services\PurchaseRevisionWorkflow;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
|
|
class PurchaseControlController extends Controller
|
|
{
|
|
public function index(Request $request): Response
|
|
{
|
|
$user = $request->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);
|
|
}
|
|
}
|