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(); } }