74 lines
4.3 KiB
PHP
74 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Opportunity;
|
|
use App\Services\CorridorAgribusinessOpportunities;
|
|
use App\Services\OpportunityManagement;
|
|
use App\Services\OpportunityPromotion;
|
|
use App\Services\PortalProfileAccess;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Inertia\Inertia;
|
|
|
|
final class CorridorAgribusinessController extends Controller
|
|
{
|
|
private function manifest(CorridorAgribusinessOpportunities $service): string
|
|
{
|
|
return hash('sha256', json_encode($service->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];
|
|
}));
|
|
}
|
|
}
|