validate(['state' => 'nullable|in:draft,submitted,in_review,needs_information,rejected,approved']); $records = $access->scope(Opportunity::query(), $request->user())->whereNotNull('workflow_context->private_offer_preparation') ->when($filters['state'] ?? null, fn ($q, $state) => $q->where('workflow_context->private_offer_preparation->state', $state)) ->orderByDesc('id')->paginate(20)->withQueryString(); return Inertia::render('offers/preparation-index', ['records' => $records->through(fn ($r) => [ 'id' => $r->id, 'title' => app(OpportunityManagement::class)->values($r)['title'] ?? null, 'reference' => $r->reference, 'state' => $access->state($r), ]), 'filters' => $filters, 'canCreate' => count($access->navigation($request->user())['contexts']) > 0]); } public function edit(Request $request, PrivateOfferPreparation $service, ?int $id = null): Response|JsonResponse { $record = $id ? $service->record($request->user(), $id) : null; $contexts = app(PortalProfileAccess::class)->navigation($request->user())['contexts']; abort_unless($record || count($contexts) > 0, 403, 'É necessária uma atribuição de promotor no âmbito da oferta.'); $presentation = $record ? $service->presentation($request->user(), $record) : null; if ($request->expectsJson() && ! $request->header('X-Inertia')) { return response()->json(['record' => $presentation]); } $options = app(OpportunityCanonicalContract::class)->options($request->user(), $record); return Inertia::render('offers/preparation', ['record' => $presentation, 'contexts' => $contexts, 'contacts' => $options['contacts'], 'contactInvestors' => $options['contactInvestors']]); } public function save(Request $request, PrivateOfferPreparation $service, ?int $id = null): JsonResponse { if ($id) { $service->record($request->user(), $id, true); } $record = $service->save($request->user(), $request->all(), $id); return response()->json(['record' => $service->presentation($request->user(), $record)], $id ? 200 : 201); } public function submit(Request $request, PrivateOfferPreparation $service, int $id): JsonResponse { $record = $service->submit($request->user(), $id, $request->all()); return response()->json(['record' => $service->presentation($request->user(), $record), 'message' => 'Submissão privada registada. A oferta não foi publicada.']); } public function transition(Request $request, PrivateOfferPreparation $service, OpportunityProfileWorkflow $workflow, int $id): JsonResponse { $service->record($request->user(), $id); $data = $request->validate(['etag' => 'required|string|size:64', 'action' => 'required|in:start_review,assign_review,request_correction,reject,approve,request_revision', 'assignee_user_id' => 'required_if:action,assign_review|integer|min:1', 'reason' => 'required|string|min:20|max:1000', 'correction_items' => 'sometimes|array', 'correction_items.*' => 'string']); $record = $workflow->transition($request->user(), $id, $data); return response()->json(['record' => $service->presentation($request->user(), $record), 'message' => 'Decisão privada registada. A oferta não foi publicada.']); } }