104 lines
5.4 KiB
PHP
104 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Services\InvestmentGeography;
|
|
use App\Services\InvestorContext;
|
|
use App\Services\InvestorContextInstallation;
|
|
use App\Services\InvestorPath;
|
|
use Illuminate\Http\Request;
|
|
use Inertia\Inertia;
|
|
|
|
final class InvestorContextController extends Controller
|
|
{
|
|
public function current(Request $r, InvestorContext $context)
|
|
{
|
|
return response()->json($context->current($r->user()));
|
|
}
|
|
|
|
public function focus(Request $r, InvestorContext $context)
|
|
{
|
|
return response()->json($context->focus($r->user(), $r->all()));
|
|
}
|
|
|
|
public function show(Request $r, string $id, InvestorContext $context)
|
|
{
|
|
return response()->json($context->view($r->user(), $id));
|
|
}
|
|
|
|
public function options(Request $r, InvestorContext $context)
|
|
{
|
|
$d = $r->validate(['q' => 'nullable|string|max:120']);
|
|
|
|
return response()->json($context->options($d['q'] ?? ''));
|
|
}
|
|
|
|
public function corridorOptions(Request $r)
|
|
{
|
|
$data = $r->validate(['corridor' => ['nullable', \Illuminate\Validation\Rule::in(array_keys(config('investment_corridors')))], 'territory' => 'nullable|uuid']);
|
|
$service = app(\App\Services\InvestmentCorridorContext::class);
|
|
return response()->json(['corridors' => collect(config('investment_corridors'))->map(fn($entry,$key)=>['key'=>$key,'name'=>$entry['name'],'provinces'=>$service->provinces($key)])->values(),
|
|
'parks' => $service->parks($data['corridor'] ?? null, $data['territory'] ?? null)]);
|
|
}
|
|
|
|
public function saveDraft(Request $r, string $id, InvestorContext $context)
|
|
{
|
|
return response()->json($context->saveDraft($r->user(), $id, $r->all()));
|
|
}
|
|
|
|
public function edit(Request $r, string $id, InvestorContext $context)
|
|
{
|
|
$data = $context->view($r->user(), $id);
|
|
abort_unless($data['can_write'], 403);
|
|
|
|
$ids = $r->validate(['opportunities' => 'sometimes|array|max:100', 'opportunities.*' => 'integer|distinct|min:1'])['opportunities'] ?? [];
|
|
$choices = $ids ? app(\App\Services\InvestmentOpportunityChoices::class)->resolve(array_map(fn ($id) => ['source' => 'opportunity:'.$id], $ids)) : null;
|
|
$source = $r->query('source') ? $context->reference($r->validate(['source' => 'required|string|max:100'])['source']) : null;
|
|
if ($choices === null && ($source['kind'] ?? '') === 'opportunity') $choices = app(\App\Services\InvestmentOpportunityChoices::class)->resolve([['source' => $source['key']]]);
|
|
$explicitChoices=$choices;
|
|
$selectionKey=$r->validate(['selection_key'=>'nullable|uuid'])['selection_key']??null;
|
|
$entryKey=fn($c)=>$c['opportunity']['key'].($selectionKey?'@'.$selectionKey:'');
|
|
$entrySources=array_map($entryKey,$explicitChoices??[]);
|
|
if ($choices !== null) $choices = collect([...($data['context']['opportunity_choices'] ?? []), ...$choices])->unique(fn ($choice) => $choice['opportunity']['key'])->values()->all();
|
|
$draft = $context->draft($r->user(), $id);
|
|
if ($draft && isset($draft['opportunity_choices'])) {
|
|
$recovered = app(\App\Services\InvestmentOpportunityChoices::class)->resolve($draft['opportunity_choices'], $data['context']['opportunity_choices'] ?? [], true);
|
|
$new=array_filter($explicitChoices??[],fn($c)=>!in_array($entryKey($c),$draft['entry_sources']??[],true));
|
|
$choices = collect([...$recovered, ...$new])->unique(fn($c)=>$c['opportunity']['key'])->values()->all();
|
|
}
|
|
return Inertia::render('investor-path/context', ['entrySources'=>$entrySources,'draft' => $draft, 'requestedChoices' => $choices, 'initial' => $data, 'options' => $context->options(), 'source' => $source, 'territorySelection' => isset($data['context']['selection']['territory']) ? app(InvestmentGeography::class)->path($data['context']['selection']['territory']['id']) : []]);
|
|
}
|
|
|
|
public function preview(Request $r, string $id, InvestorContext $context)
|
|
{
|
|
return response()->json($context->preview($r->user(), $id, $r->all()));
|
|
}
|
|
|
|
public function commit(Request $r, string $id, InvestorContext $context)
|
|
{
|
|
return response()->json($context->commit($r->user(), $id, $r->all()));
|
|
}
|
|
|
|
public function start(Request $r, InvestorPath $path, InvestorContext $context)
|
|
{
|
|
$d = $r->validate(['source' => 'nullable|string|max:100', 'step' => ['nullable', 'regex:/^S(0[1-9]|1[0-9])$/']]);
|
|
$ref = isset($d['source']) ? $context->reference($d['source']) : null;
|
|
|
|
$ids = $r->validate(['opportunities' => 'sometimes|array|max:100', 'opportunities.*' => 'integer|distinct|min:1'])['opportunities'] ?? [];
|
|
$choices = $ids ? app(\App\Services\InvestmentOpportunityChoices::class)->resolve(array_map(fn ($id) => ['source' => 'opportunity:'.$id], $ids)) : [];
|
|
return Inertia::render('investor-path/context-start', ['opportunityChoices' => $choices, 'contexts' => $path->contexts($r->user()), 'source' => $ref, 'step' => $d['step'] ?? null]);
|
|
}
|
|
|
|
public function installation(Request $r, InvestorContextInstallation $install)
|
|
{
|
|
$plan = $install->preview($r->user());
|
|
|
|
return $r->expectsJson() ? response()->json($plan) : Inertia::render('investor-path/context-installation', ['plan' => $plan]);
|
|
}
|
|
|
|
public function install(Request $r, InvestorContextInstallation $install)
|
|
{
|
|
return response()->json($install->apply($r->user(),$r->all()));
|
|
}
|
|
}
|