commit de armazens
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-11-04 09:40:26 +02:00
parent e753f7a0a4
commit 63d20b10fc
245 changed files with 10847 additions and 230 deletions
@@ -0,0 +1,101 @@
<?php
namespace App\Http\Controllers;
use App\Models\OrderCancellation;
use App\Models\OrderCancellationPolicy;
use App\Models\PurchaseOrder;
use App\Models\Requisition;
use App\Models\User;
use App\Services\OrderCancellationPolicyWorkflow;
use App\Services\OrderCancellationWorkflow;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Inertia\Inertia;
use Symfony\Component\HttpFoundation\Response;
class OrderCancellationController extends Controller
{
private function actor(Request $request): User
{
$actor = $request->user('web');
abort_unless($actor instanceof User, 403);
abort_unless(config('order_cancellation.enabled') && Schema::hasTable('order_cancellations'), 503, 'Cancelamento de ordens não activado.');
return $actor;
}
public function index(Request $request, OrderCancellationWorkflow $workflow): Response
{
$actor = $this->actor($request);
$focus = $request->validate(['cancellation_id' => 'nullable|integer|min:1'])['cancellation_id'] ?? null;
abort_unless($actor->hasFunctions(['admin', 'procurement', 'finance', 'requester', 'department_head']), 403);
return DB::transaction(function () use ($request, $actor, $workflow, $focus) {
if (DB::getDriverName() === 'pgsql' && DB::transactionLevel() === 1) {
DB::statement('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY');
}
Inertia::encryptHistory();
$records = OrderCancellation::query()->whereIn('purchase_order_id', PurchaseOrder::query()->visibleTo($actor)->select('id'))
->when($focus !== null, fn ($q) => $q->whereKey($focus))
->orderByDesc('id')->paginate(15)->withQueryString()->through(function ($record) use ($actor, $workflow) {
$order = PurchaseOrder::query()->findOrFail($record->purchase_order_id);
$source = Requisition::query()->findOrFail($order->requisition_id);
return [...$record->only(['id', 'purchase_order_id', 'created_by', 'reason', 'evidence', 'status', 'review_reason', 'reviewed_at', 'revised_requisition_id']),
'order_number' => $order->number, 'canDecide' => $workflow->canDecide($actor, $record),
'source_href' => $actor->hasFunctions(['admin', 'procurement', 'finance', 'department_head']) ? '/ordens/'.$order->id : '/requisicoes/'.$source->id.'/processo',
'canRevise' => $workflow->canRevise($actor, $record)];
});
$response = Inertia::render('purchase-controls/orders', ['records' => $records,
'policies' => $actor->hasFunctions(['admin']) ? OrderCancellationPolicy::query()->latest('revision')->get()->map(fn ($p) => [...$p->toArray(),
'canReview' => app(OrderCancellationPolicyWorkflow::class)->canReview($actor, $p)]) : [],
'canAdminister' => $actor->hasFunctions(['admin']), 'canDecide' => $actor->hasFunctions(['finance'])])->toResponse($request);
$response->headers->set('Cache-Control', 'private, no-store, max-age=0');
return $response;
});
}
public function request(Request $request, PurchaseOrder $order, OrderCancellationWorkflow $workflow): Response
{
$workflow->request($this->actor($request), $order, $request->all());
return redirect('/ordens/cancelamentos');
}
public function decide(Request $request, int $cancellation, OrderCancellationWorkflow $workflow): Response
{
$actor = $this->actor($request);
$data = $request->validate(['decision' => 'required|in:approved,rejected', 'reason' => 'required|string|min:10|max:4000']);
$workflow->decide($actor, OrderCancellation::query()->findOrFail($cancellation), $data['decision'], $data['reason']);
return back();
}
public function revise(Request $request, int $cancellation, OrderCancellationWorkflow $workflow): Response
{
$actor = $this->actor($request);
$data = $request->validate(['needed_by' => 'required|date_format:Y-m-d|after_or_equal:today', 'reason' => 'required|string|min:10|max:4000']);
$record = $workflow->revise($actor, OrderCancellation::query()->findOrFail($cancellation), $data['needed_by'], $data['reason']);
return redirect('/requisicoes/'.$record->id);
}
public function policy(Request $request, OrderCancellationPolicyWorkflow $workflow): Response
{
$workflow->propose($this->actor($request), $request->all());
return back();
}
public function policyReview(Request $request, int $policy, OrderCancellationPolicyWorkflow $workflow): Response
{
$actor = $this->actor($request);
$data = $request->validate(['decision' => 'required|in:approved,rejected', 'reason' => 'required|string|min:10|max:4000']);
$workflow->review($actor, OrderCancellationPolicy::query()->findOrFail($policy), $data['decision'], $data['reason']);
return back();
}
}