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']); 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); } }