96 lines
5.0 KiB
PHP
96 lines
5.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\ExistingBusiness;
|
|
use App\Models\ExistingBusinessObject;
|
|
use App\Models\Sector;
|
|
use App\Services\BusinessFormSchema;
|
|
use App\Services\ExistingBusinessDrafts;
|
|
use App\Services\ExistingBusinessIntake;
|
|
use App\Services\ExistingBusinessObjects;
|
|
use App\Services\ExistingBusinessVerification;
|
|
use App\Services\Mne\BusinessRepository;
|
|
use App\Services\Mne\CompatibilityShadow;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Crypt;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
|
|
class ExistingBusinessController extends Controller
|
|
{
|
|
public function index(Request $request): Response|JsonResponse
|
|
{
|
|
$management = $request->is('management/*', 'api/v1/existing-business/review*');
|
|
$query = app(BusinessRepository::class)->query();
|
|
if ($management) {
|
|
Gate::authorize('reviewQueue', ExistingBusiness::class);
|
|
$query->where('owner_user_id', '<>', $request->user()->id)->whereIn('status', ['submitted', 'in_review', 'needs_information']);
|
|
} else {
|
|
$query->where('owner_user_id', $request->user()->id);
|
|
}
|
|
$props = ['records' => $query->orderByDesc('updated_at')->paginate(20)->through(fn ($row) => $this->record($row)),
|
|
'management' => $management, 'modalities' => ExistingBusinessDrafts::MODALITIES];
|
|
|
|
return $request->expectsJson() ? response()->json($props) : Inertia::render('investment/businesses', $props);
|
|
}
|
|
|
|
public function show(Request $request, string $id): Response|JsonResponse
|
|
{
|
|
$business = app(BusinessRepository::class)->find($id);
|
|
Gate::authorize('view', $business);
|
|
app(CompatibilityShadow::class)->schedule($id);
|
|
$props = ['sectors' => Sector::where('is_active', true)->orderBy('name')->get(['id', 'name']), 'formSchema' => BusinessFormSchema::fields(), 'record' => $this->record($business), 'canEdit' => $request->user()->can('update', $business),
|
|
'owner' => $request->user()->can('owns', $business), 'canReview' => $request->user()->can('review', $business),
|
|
'modalities' => ExistingBusinessDrafts::MODALITIES,
|
|
'objectKinds' => ExistingBusinessObjects::KINDS,
|
|
'verificationChecks' => ExistingBusinessVerification::CHECKS,
|
|
'verifications' => app(ExistingBusinessVerification::class)->findings($business),
|
|
'objects' => ExistingBusinessObject::where('business_id', $id)->orderBy('created_at')->get()->map(fn ($object) => [
|
|
...$object->only(['id', 'kind', 'verification_status']), 'payload' => $object->payload]),
|
|
'history' => DB::table('existing_business_revisions')->where('business_id', $id)->orderByDesc('version_no')->limit(50)
|
|
->get(['version_no', 'action', 'created_at', 'reason'])->map(fn ($row) => ['version_no' => $row->version_no,
|
|
'action' => $row->action, 'created_at' => $row->created_at, 'note' => Crypt::decryptString($row->reason)])];
|
|
|
|
return $request->expectsJson() ? response()->json($props) : Inertia::render('investment/business', $props);
|
|
}
|
|
|
|
public function save(Request $request, ExistingBusinessDrafts $drafts, ?string $id = null): JsonResponse
|
|
{
|
|
$business = $drafts->save($request->user(), $request->all(), $id);
|
|
|
|
return response()->json($this->record($business), $id ? 200 : 201);
|
|
}
|
|
|
|
public function transition(Request $request, ExistingBusinessIntake $intake, string $id): JsonResponse
|
|
{
|
|
$data = $request->validate(['version_no' => ['required', 'integer', 'min:1'], 'action' => ['required', 'string'],
|
|
'note' => ['required', 'string'], 'review_consent' => ['nullable', 'boolean'], 'confirmation_code' => ['nullable', 'string', 'max:100']]);
|
|
$business = $intake->transition($request->user(), $id, $data['version_no'], $data['action'], $data['note'], (bool) ($data['review_consent'] ?? false), $data['confirmation_code'] ?? null);
|
|
|
|
return response()->json($this->record($business));
|
|
}
|
|
|
|
public function verify(Request $request, ExistingBusinessVerification $verification, string $id): JsonResponse
|
|
{
|
|
return response()->json($this->record($verification->save($request->user(), $id, $request->all())));
|
|
}
|
|
|
|
public function saveObject(Request $request, ExistingBusinessObjects $objects, string $id, ?string $object = null): JsonResponse
|
|
{
|
|
$saved = $objects->save($request->user(), $id, $request->all(), $object);
|
|
|
|
return response()->json(['id' => $saved->id, 'verification_status' => 'pending',
|
|
'version_no' => app(BusinessRepository::class)->find($id)->version_no], $object ? 200 : 201);
|
|
}
|
|
|
|
/** @return array<string,mixed> */
|
|
private function record(ExistingBusiness $business): array
|
|
{
|
|
return [...$business->only(['id', 'code', 'modality', 'status', 'classification', 'version_no', 'sector_id']), 'payload' => $business->payload];
|
|
}
|
|
}
|