79 lines
3.9 KiB
PHP
79 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Services\Ai\EvidenceRepository;
|
|
use App\Services\Ai\InvestorGuidance;
|
|
use App\Services\InvestorPath;
|
|
use App\Services\VirtualDesk;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
class InvestorGuidanceController extends Controller
|
|
{
|
|
public function contexts(Request $request, VirtualDesk $desk): JsonResponse
|
|
{
|
|
$actor = $request->user();
|
|
$organizations = DB::table('memberships')->where('user_id', $actor->id)->whereNull('deleted_at')->pluck('organization_id');
|
|
$cases = DB::table('desk_cases')->whereNull('closed_at')->where(fn ($q) => $q->where(fn ($p) => $p->where('user_id', $actor->id)->whereNull('organization_id'))->orWhereIn('organization_id', $organizations))
|
|
->orderByDesc('updated_at')->get(['id', 'title', 'journey_id'])->map(function ($case) {
|
|
return ['id' => $case->id, 'title' => $case->title, 'path_supported' => app(InvestorPath::class)->available()
|
|
&& $case->journey_id && DB::table('investor_journeys')->where('id', $case->journey_id)->whereNotNull('path_definition_id')->exists()];
|
|
});
|
|
|
|
return response()->json(['cases' => $cases]);
|
|
}
|
|
|
|
public function show(Request $request, string $id, InvestorGuidance $guidance): JsonResponse
|
|
{
|
|
return response()->json($guidance->view($request->user(), $id));
|
|
}
|
|
|
|
public function assumptions(Request $request, string $id, InvestorGuidance $guidance): JsonResponse|RedirectResponse
|
|
{
|
|
$guidance->assumptions($request->user(), $id, $request->all());
|
|
|
|
return $this->completed($request, 'Pressupostos corrigidos; os dados dos módulos de origem foram preservados.');
|
|
}
|
|
|
|
public function feedback(Request $request, string $id, InvestorGuidance $guidance): JsonResponse|RedirectResponse
|
|
{
|
|
$guidance->feedback($request->user(), $id, $request->all());
|
|
|
|
return $this->completed($request, 'Revisão registada. Assumir uma tarefa continua a ser uma acção separada.');
|
|
}
|
|
|
|
public function task(Request $request, string $id, InvestorGuidance $guidance): JsonResponse|RedirectResponse
|
|
{
|
|
$task = $guidance->acceptTask($request->user(), $id, $request->all());
|
|
|
|
return $request->expectsJson() ? response()->json(['id' => $task->id], 201) : back()->with('success', 'Tarefa assumida no CRM interno. Sincronização externa pendente de finalidade e autorização.');
|
|
}
|
|
|
|
public function updateTask(Request $request, string $id, string $task, InvestorGuidance $guidance): JsonResponse|RedirectResponse
|
|
{
|
|
$guidance->updateTask($request->user(), $id, $task, $request->all());
|
|
|
|
return $this->completed($request, 'Resultado da tarefa registado no mesmo histórico do dossier.');
|
|
}
|
|
|
|
public function search(Request $request, string $id, VirtualDesk $desk, EvidenceRepository $evidence): JsonResponse
|
|
{
|
|
$desk->case($request->user(), $id);
|
|
$data = $request->validate(['query' => 'required|string|min:3|max:300']);
|
|
$enabled = config('investmoz_ai.enabled') && Schema::hasTable('ai_controls') && DB::table('ai_controls')->where('capability', 'search')->where('suspended', false)->exists();
|
|
$items = $enabled ? $evidence->search($data['query'], 'pt', ['public_only' => true]) : [];
|
|
|
|
return response()->json(['mode' => 'lexical_evidence', 'model' => null, 'status' => ! $enabled ? 'unavailable' : ($items ? 'evidence_found' : 'no_evidence'),
|
|
'consulted' => $items, 'limitations' => ['Apenas excertos das fontes públicas autorizadas indexadas; não é uma consulta exaustiva nem validação jurídica.']]);
|
|
}
|
|
|
|
private function completed(Request $request, string $message): JsonResponse|RedirectResponse
|
|
{
|
|
return $request->expectsJson() ? response()->json(['message' => $message]) : back()->with('success', $message);
|
|
}
|
|
}
|