id); $atendimentosSoap = self::getAtendimentoSoapQuery($paciente->id); $posConsulta = self::getPosConsultaQuery($paciente->id); $prontoAtendimento = self::getProntoAtendimentosQuery($paciente->id); $query = $preAtendimentos ->unionAll($atendimentosSoap) ->unionAll($posConsulta) ->unionAll($prontoAtendimento) ->orderBy('data_atendimento', 'desc'); $paginator = $query->paginate((int) $limit); return [ 'current_page' => $paginator->currentPage(), 'data' => array_map(function ($item) { return self::formatItem($item); }, $paginator->items()), 'first_page_url' => $paginator->url(1), 'from' => $paginator->firstItem(), 'last_page' => $paginator->lastPage(), 'last_page_url' => $paginator->url($paginator->lastPage()), 'next_page_url' => $paginator->nextPageUrl(), 'path' => $paginator->path(), 'per_page' => $paginator->perPage(), 'prev_page_url' => $paginator->previousPageUrl(), 'to' => $paginator->lastItem(), 'total' => $paginator->total(), ]; } public function getDetalhes($id, $sourceType) { switch ($sourceType) { case 'pre-atendimento': return AmbulatorioHistoricoService::getPreAtendimento($id); case 'soap': return AmbulatorioHistoricoService::getAtendimentoSoap($id); case 'pos-consulta': return AmbulatorioHistoricoService::getPosConsulta($id); case 'pronto-atendimento': return ProntoAtendimentoHistoricoService::getAtendimento($id); default: throw new Exception('Tipo de atendimento inválido.'); } } public function avaliar(string $sourceType, int $id, array $params): void { $avaliacao = new ConectaCidadaoAvaliacaoAtendimento(); switch ($sourceType) { case 'pre-atendimento': AtendimentoPreAtendimento::findOrFail($id); $avaliacao->ambulatorio_atendimento_pre_atendimento_id = $id; break; case 'soap': AtendimentoSoap::findOrFail($id); $avaliacao->ambulatorio_atendimento_soap_id = $id; break; case 'pos-consulta': AtendimentoPosConsulta::findOrFail($id); $avaliacao->ambulatorio_atendimento_pos_consulta_id = $id; break; case 'pronto-atendimento': Atendimento::findOrFail($id); $avaliacao->pronto_atendimento_atendimento_id = $id; break; default: throw new \InvalidArgumentException('Tipo de origem inválido.'); } $avaliacao->nota = $params['nota'] ?? null; $avaliacao->comentario = $params['comentario'] ?? null; $avaliacao->save(); } private static function formatItem($item) { $item->created_at = Carbon::create($item->data_atendimento); $dadosHistorico = [ 'tipo' => $item->source_type, 'data_hora' => $item->created_at->format('d/m/Y \à\s H:i'), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $item->ocupacao_codigo, 'nome' => $item->ocupacao_nome, ], 'profissional' => [ 'nome' => $item->cidadao_nome, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $item->setor_nome, ], 'unidade' => [ 'nome_fantasia' => $item->unidade_nome_fantasia, ], ], 'tipo_atendimento' => $item->tipo_atendimento, 'id' => $item->id, 'atendimento_id' => $item->atendimento_id, 'is_atendimento_enfermagem' => (bool) $item->is_atendimento_enfermagem, 'is_atendimento_soap_assinado' => (bool) $item->is_atendimento_soap_assinado, ]; return (object) $dadosHistorico; } private static function getProntoAtendimentosQuery($pacienteId) { return DB::table('pronto_atendimento_atendimento') ->select([ 'pronto_atendimento_atendimento.id', 'pronto_atendimento_atendimento.id as atendimento_id', 'pronto_atendimento_atendimento_recepcao.atendido_em as data_atendimento', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', 'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("'Pronto Atendimento' AS tipo_atendimento"), DB::raw("false as is_atendimento_enfermagem"), DB::raw("false as is_atendimento_soap_assinado"), DB::raw("'pronto-atendimento' as source_type") ]) ->join('pronto_atendimento_faa', 'pronto_atendimento_faa.id', 'pronto_atendimento_atendimento.faa_id') ->join('pronto_atendimento_atendimento_recepcao', 'pronto_atendimento_atendimento_recepcao.atendimento_id', 'pronto_atendimento_atendimento.id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_faa.lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'pronto_atendimento_faa.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('pronto_atendimento_faa.paciente_id', $pacienteId) ->whereNull('pronto_atendimento_atendimento.deleted_at'); } private static function getPreAtendimentoQuery($pacienteId) { return DB::table('ambulatorio_atendimento_pre_atendimento') ->select([ 'ambulatorio_atendimento_pre_atendimento.id', 'ambulatorio_atendimento_pre_atendimento.atendimento_id', 'ambulatorio_atendimento_pre_atendimento.created_at as data_atendimento', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', 'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("'Pré-atendimento' AS tipo_atendimento"), DB::raw("false as is_atendimento_enfermagem"), DB::raw("false as is_atendimento_soap_assinado"), DB::raw("'pre-atendimento' as source_type") ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pre_atendimento.atendimento_id') ->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pre_atendimento.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pre_atendimento.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('ambulatorio_agendamento.paciente_id', $pacienteId) ->unionAll( DB::table('ambulatorio_atendimento_pre_atendimento') ->select([ 'ambulatorio_atendimento_pre_atendimento.id', 'ambulatorio_atendimento_pre_atendimento.atendimento_id', 'ambulatorio_atendimento_pre_atendimento.created_at as data_atendimento', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', 'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("'Pré-atendimento' AS tipo_atendimento"), DB::raw("false as is_atendimento_enfermagem"), DB::raw("false as is_atendimento_soap_assinado"), DB::raw("'pre-atendimento' as source_type") ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pre_atendimento.atendimento_id') ->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pre_atendimento.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pre_atendimento.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId) ); } private static function getAtendimentoSoapQuery($pacienteId) { return DB::table('ambulatorio_atendimento_soap') ->select([ 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap.atendimento_id', 'jornada.data as data_atendimento', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', 'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("'Atendimento' AS tipo_atendimento"), 'ambulatorio_atendimento_soap.is_atendimento_enfermagem', 'ambulatorio_atendimento_soap.is_atendimento_soap_assinado', DB::raw("'soap' as source_type") ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id') ->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id') ->join('ambulatorio_jornada as jornada', 'jornada.id', 'ambulatorio_agendamento.jornada_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'jornada.lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_soap.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('ambulatorio_atendimento_soap.is_rascunho', false) ->where('ambulatorio_agendamento.paciente_id', $pacienteId) ->unionAll( DB::table('ambulatorio_atendimento_soap') ->select([ 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap.atendimento_id', 'ambulatorio_demanda_espontanea.data as data_atendimento', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', 'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("'Atendimento' AS tipo_atendimento"), 'ambulatorio_atendimento_soap.is_atendimento_enfermagem', 'ambulatorio_atendimento_soap.is_atendimento_soap_assinado', DB::raw("'soap' as source_type") ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id') ->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_soap.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_soap.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('ambulatorio_atendimento_soap.is_rascunho', false) ->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId) ); } private static function getPosConsultaQuery($pacienteId) { return DB::table('ambulatorio_atendimento_pos_consulta') ->select([ 'ambulatorio_atendimento_pos_consulta.id', 'ambulatorio_atendimento_pos_consulta.atendimento_id', 'ambulatorio_atendimento_pos_consulta.created_at as data_atendimento', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', 'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("'Pós-consulta' AS tipo_atendimento"), DB::raw("false as is_atendimento_enfermagem"), DB::raw("false as is_atendimento_soap_assinado"), DB::raw("'pos-consulta' as source_type") ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pos_consulta.atendimento_id') ->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pos_consulta.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pos_consulta.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('ambulatorio_agendamento.paciente_id', $pacienteId) ->unionAll( DB::table('ambulatorio_atendimento_pos_consulta') ->select([ 'ambulatorio_atendimento_pos_consulta.id', 'ambulatorio_atendimento_pos_consulta.atendimento_id', 'ambulatorio_atendimento_pos_consulta.created_at as data_atendimento', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', 'cadastro_centro_custo.infraestrutura_id AS centro_custo_infraestrutura_id', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("'Pós-consulta' AS tipo_atendimento"), DB::raw("false as is_atendimento_enfermagem"), DB::raw("false as is_atendimento_soap_assinado"), DB::raw("'pos-consulta' as source_type") ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_pos_consulta.atendimento_id') ->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_pos_consulta.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_pos_consulta.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('ambulatorio_demanda_espontanea.paciente_id', $pacienteId) ); } public function avaliacao(string $sourceType, int $id, array $params) { $campoMap = [ 'pre-atendimento' => 'ambulatorio_atendimento_pre_atendimento_id', 'soap' => 'ambulatorio_atendimento_soap_id', 'pos-consulta' => 'ambulatorio_atendimento_pos_consulta_id', 'pronto-atendimento' => 'pronto_atendimento_atendimento_id', ]; if (!isset($campoMap[$sourceType])) { throw new \InvalidArgumentException("Tipo de atendimento inválido: {$sourceType}"); } $campo = $campoMap[$sourceType]; $avaliacao = DB::table('conecta_cidadao_avaliacao_atendimento') ->where($campo, $id) ->first(); if (!$avaliacao) { throw new ModelNotFoundException('Avaliação não encontrada.'); } return $avaliacao; } }