entries(), JSON_THROW_ON_ERROR)); } public function show(Request $request, CorridorAgribusinessOpportunities $service) { $access = app(PortalProfileAccess::class); abort_unless($access->internalAssignment($request->user(), 'investment_project') || $access->has($request->user(), 'publisher'), 403); $records = Opportunity::withTrashed()->whereIn('management_creation_key', array_column($service->entries(), 'key'))->get()->keyBy('management_creation_key'); foreach ($records as $record) abort_unless($access->canView($request->user(), $record), 403); return Inertia::render('management/corridor-agribusiness', ['manifestHash' => $this->manifest($service), 'canRegister' => (bool) $access->internalAssignment($request->user(), 'investment_project'), 'entries' => array_map(function ($entry) use ($records) { $r = $records->get($entry['key']); return [...$entry, 'id' => $r?->id, 'status' => $r?->status, 'href' => $r ? '/oportunidades/'.$r->slug : null]; }, $service->entries())]); } public function register(Request $request, CorridorAgribusinessOpportunities $service) { $data = $request->validate(['manifest_hash' => 'required|string|size:64', 'confirm' => 'required|accepted']); abort_unless(hash_equals($this->manifest($service), $data['manifest_hash']), 409, 'A fonte mudou; recupere a prévia.'); $access = app(PortalProfileAccess::class); $grant = $access->internalAssignment($request->user(), 'investment_project'); abort_unless($grant && $access->mfa($request->user()), 403, 'Use a designação existente e MFA recente.'); return response()->json(['records' => $service->register($request->user(), $grant->organization_id)]); } public function preview(Request $request, CorridorAgribusinessOpportunities $service) { $previews = []; foreach ($service->entries() as $entry) { $record = Opportunity::where('management_creation_key', $entry['key'])->firstOrFail(); $input = data_get($record->workflow_context, 'promotional_summary.input'); abort_unless(is_array($input), 409, 'Complete a selecção pública na divulgação individual.'); $previews[] = ['id' => $record->id, ...app(OpportunityPromotion::class)->preview($request->user(), $record, [...$input, 'source_date' => $input['source_date'] ?: null, 'action' => 'disclose', 'etag' => app(OpportunityManagement::class)->etag($record)])]; } return response()->json(['previews' => $previews]); } public function disclose(Request $request, CorridorAgribusinessOpportunities $service) { $data = $request->validate(['confirm' => 'required|accepted', 'reason' => 'required|string|min:20|max:1000', 'previews' => 'required|array|size:34', 'previews.*.id' => 'required|integer|distinct', 'previews.*.token' => 'required|string|max:300000', 'previews.*.operation_key' => 'required|uuid|distinct']); $expected = Opportunity::whereIn('management_creation_key', array_column($service->entries(), 'key'))->pluck('id')->sort()->values()->all(); $supplied = array_column($data['previews'], 'id'); sort($supplied); abort_unless($expected === $supplied && count($expected) === 34, 409, 'A prévia deve identificar exactamente as 34 fichas deste lote.'); return response()->json(DB::transaction(function () use ($request, $data) { $result = []; foreach ($data['previews'] as $preview) $result[] = app(OpportunityPromotion::class)->confirm($request->user(), $preview['id'], [...$preview, 'confirm' => true, 'reason' => $data['reason']]); return ['records' => $result]; })); } }