json( [ 'additionals' => [ 'plantao_id' => $plantao->id ?? null, 'plantao_faixa_etaria_id' => $plantao->faixa_etaria_id ?? null, ], ], Response::HTTP_OK ); } public function storeFaaAssinada($id) { $path = 'assinatura-eletronica' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . 'pronto-atendimento' . DIRECTORY_SEPARATOR . 'atendimento-medico'; $arquivo = "{$id}.PDF"; $atendimentoMedico = AtendimentoMedico::findOrFail($id); if (!is_null($atendimentoMedico)) { $pdf = base64_decode(request()->faa_assinada['data']); if (!Storage::disk('local')->put($path . DIRECTORY_SEPARATOR . $arquivo, $pdf)) { throw new Exception('Erro ao assinar o arquivo.'); } else { $atendimentoMedico->update(['is_faa_assinada' => true]); } } return response($atendimentoMedico->fresh(), Response::HTTP_OK); } public function storeReceitasAssinadas($id) { $path = 'assinatura-eletronica' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . 'pronto-atendimento' . DIRECTORY_SEPARATOR . 'atendimento-medico-receita-medica'; $receita = Receita::findOrFail($id); $proximaOrdem = $receita->receitasAssinadas()->max('ordem') + 1; foreach (request()->receitas_assinadas as $receitaAssinada) { $pdf = base64_decode($receitaAssinada); $idReceitaAssinada = $receita->receitasAssinadas()->create(['ordem' => $proximaOrdem])->id; $arquivo = "{$idReceitaAssinada}.PDF"; if (!Storage::disk('local')->put($path . DIRECTORY_SEPARATOR . $arquivo, $pdf)) { throw new Exception('Erro ao assinar o arquivo.'); } } $receita->update(['is_assinada' => true]); return response($receita->fresh(), Response::HTTP_OK); } public function create($id) { $this->auth(__FUNCTION__); $centroCustoLogado = $this->getCentroCustoLogado(); $lotacao = $this->getLotacaoLogado(); $model = [ 'profissional' => $lotacao->usuario->cidadao->nome, 'ocupacao' => $lotacao->ocupacao, ]; if ($id) { $atendimento = Atendimento::where('fila_id', $id) ->orderBy('created_at', 'desc') ->firstOrFail(); $atendimento->faa->makeHidden('paciente'); $ultimaClassificacaoRisco = $atendimento->classificacoesRisco()->orderByDesc('created_at')->first(); $faa = $atendimento->faa; $alergias = $this->getAlergias($atendimento, Carbon::now()); $medicamentosUsoContinuo = $this->getMedicamentosUsoContinuo($atendimento, Carbon::now()); $cids = $atendimento->cids() ->with('cid') ->orderBy('created_at') ->get() ->makeHidden(['atendimento_id', 'atendimento_medico_id', 'cid_id']); $cidPrincipal = $cids->last(); $atendimentoMedico = $atendimento->atendimentosMedico()->orderByDesc('created_at')->first(); $parecerMedico = $faa->raat && $faa->raat->pareceresMedico ? $faa->raat->pareceresMedico()->orderByDesc('created_at')->first() : []; if($faa->paciente->cidadao->sexo_id === Sexo::FEMININO && $faa->paciente->cidadao->idade && $faa->paciente->cidadao->idade['anos'] >= 9 && $faa->paciente->cidadao->idade['anos'] <= 60){ $exibirFatorRiscoGestante = true; } else { $exibirFatorRiscoGestante = false; } if ($atendimento->dor_toracica == true) { $formulario = FormularioDorToracica::where('atendimento_id', $atendimento->id)->get(); foreach ($formulario as $registro) { $formulario_id = $registro->id; $data_sintoma = $registro->data_sintoma; $hora_sintoma = $registro->hora_sintoma; $data_ecg_admissao = $registro->data_ecg_admissao; $hora_ecg_admissao = $registro->hora_ecg_admissao; $dispneia = $registro->dispneia; $dorToracicaProtocoloFinalizado = $registro->protocolo_finalizado; $dorToracicaProtocoloTemProsseguimento = $registro->protocolo_tem_prosseguimento; $dorToracicaTemContraIndicacaoTrombolitico = $registro->tem_contra_indicacao_trombolitico; $dorToracicaContraIndicacaoTromboliticoMotivo = $registro->contra_indicacao_trombolitico_motivo; } $formularioRelacionadoDor = RelacionadoFormularioDorToracica::where('formulario_id', $formulario_id)->get(); $dorToracicaRelacionada = []; foreach ($formularioRelacionadoDor as $registroRelacionado) { $dorToracicaRelacionada[] = $registroRelacionado->dor_toracica_id; } $formularioDorToracica = $formulario->where('id', $formulario_id)->first(); $dorToracicaGetTimeText = function ($from, $to) { $diff = $from->diffInMinutes($to); $hours = floor($diff / 60); $minutes = $diff % 60; return trim(($hours > 0 ? "{$hours} hora(s) " : '') . ($minutes > 0 ? "{$minutes} minuto(s)" : '')); }; $dorToracicaResultadosEletrocardiograma = collect(); $dorToracicaTempoChegadaAteTriagem = null; $dorToracicaTempoTriagemAteResultadoEletrocardiograma = null; $dorToracicaTempoTriagemAteAtendimentoMedico = null; $dorToracicaTempoAtendimentoAteFinalizacaoProtocolo = null; $dorToracicaSinaisInstabilidade = collect(); if (!is_null($formularioDorToracica)) { if ($formularioDorToracica->protocolo_finalizado) { $dorToracicaTempoAtendimentoAteFinalizacaoProtocolo = $dorToracicaGetTimeText( new Carbon($atendimento->recepcao->atendido_em), $formularioDorToracica->protocolo_finalizado_em ); } $dorToracicaSinaisInstabilidade = $formularioDorToracica->sinaisInstabilidade()->pluck('id'); $dorToracicaResultadosEletrocardiograma = $formularioDorToracica->resultadosEletrocardiograma() ->orderBy('created_at') ->get(); $dorToracicaAtendimentoTriagem = $atendimento->atendimentosTriagem() ->where('created_at', '<=', $formularioDorToracica->created_at) ->orderByDesc('created_at') ->first(); if (!is_null($dorToracicaAtendimentoTriagem)) { $dorToracicaTempoChegadaAteTriagem = $dorToracicaGetTimeText( new Carbon($atendimento->recepcao->atendido_em), $dorToracicaAtendimentoTriagem->created_at ); if ($dorToracicaResultadosEletrocardiograma->isNotEmpty()) { $dorToracicaTempoTriagemAteResultadoEletrocardiograma = $dorToracicaGetTimeText( $dorToracicaAtendimentoTriagem->created_at, $dorToracicaResultadosEletrocardiograma->first()->created_at ); } $dorToracicaAtendimentoMedico = $atendimento->atendimentosMedico() ->where('created_at', '>=', $dorToracicaAtendimentoTriagem->created_at) ->orderBy('created_at') ->first(); if (!is_null($dorToracicaAtendimentoMedico)) { $dorToracicaTempoTriagemAteAtendimentoMedico = $dorToracicaGetTimeText( $dorToracicaAtendimentoTriagem->created_at, $dorToracicaAtendimentoMedico->created_at ); } } } $dorToracicaTempoTotalAtendimento = $dorToracicaGetTimeText( new Carbon($atendimento->recepcao->atendido_em), Carbon::now() ); } $model = array_merge($model, [ 'dor_toracica' => $atendimento->dor_toracica, 'proxima_reavaliacao' => null, 'data_proxima_reavaliacao' => Carbon::now()->format('d/m/Y'), 'hora_proxima_reavaliacao' => null, 'atendimento_id' => $atendimento->id, 'classificacao_risco_id' => $ultimaClassificacaoRisco->classificacaoRisco->id ?? null, 'faa' => $faa, 'data_atendimento' => $atendimento->created_at->format('d/m/Y'), 'alergias' => $alergias, 'fatores_risco' => $this->getCidadaoFatoresRisco($atendimento), 'fator_risco_outro' => $faa->paciente->cidadao->fator_risco_outro, 'sinais_vitais' => [], 'anotacoes' => [], 'avaliacao_antropometrica' => $this->getAvaliacaoAntropometrica( $atendimento->avaliacoesAntropometricas()->orderByDesc('created_at')->first() ), 'exibirFatorRiscoGestante' => $exibirFatorRiscoGestante, 'cid' => $cidPrincipal->cid ?? null, 'medicamentos_uso' => null, 'procedimentos' => [], 'encaminhamentos' => [], 'pedidos_exames' => [], 'evolucao' => null, 'atendimento_geral' => null, 'queixa_principal_duracao' => null, 'historia' => null, 'exame_fisico' => null, 'diagnostico' => null, 'conduta' => null, 'observacoes_enfermagem' => null, 'servicos_enfermagem' => [], 'observacoes' => null, 'centro_custo_id_para' => null, 'solicitou_reavaliacao' => null, 'prescricoes_internas' => [], 'receitas_medicas_assinadas' => [], 'receita_medica' => [ 'is_assinada' => false, 'medicamentos' => [] ], 'medicamentos_uso_continuo' => $medicamentosUsoContinuo, 'gestacao' => $this->getGestacao($atendimento), 'finalizacao' => [ 'desfecho_id' => null, 'evasao' => [ 'motivo' => null, ], 'encaminhamento_hospitalar' => [ 'unidade_id' => null, 'unidade_outra' => false, 'unidade_nome' => null, 'quarto' => null, 'leito' => null, 'cid' => null, 'medico_hospitalar' => null, 'observacoes' => null, ], 'obito' => [ 'data_obito' => null, 'hora_obito' => null, 'obito_em' => null, 'declaracao' => null, 'causa' => null, 'cid' => null, ] ], 'orientacoes' => $atendimentoMedico->orientacoes ?? null, 'acidente_trabalho' => AcidenteTrabalhoService::getAcidenteTrabalho($atendimento->faa), 'atestado' => [ 'nome' => $atendimentoMedico->atestado->nome ?? null, 'paciente' => $atendimentoMedico->atestado->paciente ?? 0, 'imprime_cid' => $atendimentoMedico->atestado->imprime_cid ?? true, 'modelo_id' => $atendimentoMedico->atestado->modelo_id ?? AtestadoModelo::PADRAO, 'dias' => $atendimentoMedico->atestado->dias ?? null, 'quantidade_horas' => $atendimentoMedico->atestado->quantidade_horas ?? null, 'horario_inicial' => $atendimentoMedico->atestado->horario_inicial ?? null, 'documento_tipo_id' => $atendimentoMedico->atestado->documento_tipo_id ?? null, 'documento_numero' => $atendimentoMedico->atestado->documento_numero ?? null, 'cpf_acompanhante' => $atendimentoMedico->atestado->cpf_acompanhante ?? null, ], 'declaracoes_comparecimento' => [], 'doencas_cronicas' => null, 'escalas_coma_glasgow' => [], 'dor_toracica_protocolo_finalizado' => $dorToracicaProtocoloFinalizado ?? null, 'dor_toracica_protocolo_tem_prosseguimento' => $dorToracicaProtocoloTemProsseguimento ?? null, 'dor_toracica_data_hora_chegada' => (new Carbon($atendimento->recepcao->atendido_em))->format('d/m/Y H:i:s'), 'dor_toracica_tempo_chegada_ate_triagem' => $dorToracicaTempoChegadaAteTriagem ?? null, 'dor_toracica_tempo_triagem_ate_resultado_eletrocardiograma' => $dorToracicaTempoTriagemAteResultadoEletrocardiograma ?? null, 'dor_toracica_tempo_triagem_ate_atendimento_medico' => $dorToracicaTempoTriagemAteAtendimentoMedico ?? null, 'dor_toracica_tempo_total_atendimento' => $dorToracicaTempoTotalAtendimento ?? null, 'dor_toracica_tempo_atendimento_ate_finalizacao_protocolo' => $dorToracicaTempoAtendimentoAteFinalizacaoProtocolo ?? null, 'dor_toracica_data_sintoma' => $data_sintoma ?? null, 'dor_toracica_hora_sintoma' => $hora_sintoma ?? null, 'dor_toracica_data_ecg_admissao' => $data_ecg_admissao ?? null, 'dor_toracica_hora_ecg_admissao' => $hora_ecg_admissao ?? null, 'dor_toracica_caracteristica_dor' => $dorToracicaRelacionada ?? null, 'dor_toracica_localizacao_dor' => $dorToracicaRelacionada ?? null, 'dor_toracica_fator_descadeante' => $dorToracicaRelacionada ?? null, 'dor_toracica_duracao_dor' => $dorToracicaRelacionada ?? null, 'dor_toracica_fatores_riscos' => $dorToracicaRelacionada ?? null, 'dor_toracica_dispneia' => $dispneia ?? null, 'dor_toracica_resultado_eletrocardiograma' => null, 'dor_toracica_resultados_eletrocardiograma' => ($dorToracicaResultadosEletrocardiograma ?? collect()) ->map(fn ($resultado) => [ 'centro_custo' => [ 'setor' => [ 'nome' => $resultado->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $resultado->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $resultado->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'data_hora' => $resultado->created_at->format('d/m/Y H:i:s'), 'descricao' => $resultado->descricao, ]), 'dor_toracica_permite_resultado_eletrocardiograma' => isset($dorToracicaResultadosEletrocardiograma) ? self::hasEletrocardiogramaRealizado($atendimento, $dorToracicaResultadosEletrocardiograma, $formularioDorToracica) : false, 'dor_toracica_tem_contra_indicacao_trombolitico' => $dorToracicaTemContraIndicacaoTrombolitico ?? null, 'dor_toracica_contra_indicacao_trombolitico_motivo' => $dorToracicaContraIndicacaoTromboliticoMotivo ?? null, 'dor_toracica_sinais_instabilidade' => $dorToracicaSinaisInstabilidade ?? [], 'cancelamento_desfecho' => false, ]); } return [ 'model' => $model, 'form' => $this->getDadosForm($atendimento, $centroCustoLogado), 'additionals' => [ 'timeline' => AtendimentoService::getTimelineItems($id), 'from_observacao' => Fila::findOrFail($id)->centroCusto->setor->tipo_id === SetorTipo::OBSERVACAO, 'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao), 'assinatura_eletronica_ativa' => Parametrizacao::first()->assinatura_eletronica ?? false, ] ]; } private function hasEletrocardiogramaRealizado($atendimento, $dorToracicaResultadosEletrocardiograma, $formularioDorToracica) { $quantidadeEletrocardiogramasRealizados = $atendimento->atendimentosMedico() ->whereHas('pedidosExames', fn ($q) => $q ->where('created_at', '>=', $formularioDorToracica->created_at) ->whereHas('exames', fn ($q) => $q ->whereHas('exame', fn ($q) => $q ->where('codigo', ProcedimentoEnum::ELETROCARDIOGRAMA) ) ->where('status_id', ExameStatusEnum::REALIZADO) ) ) ->count(); return $dorToracicaResultadosEletrocardiograma->count() < $quantidadeEletrocardiogramasRealizados; } public function getMedicosAtendimento($atendimentoId) { $usuarios = collect(); Atendimento::findOrFail($atendimentoId) ->atendimentosMedico ->each(function ($atendimentoMedico) use ($usuarios) { $usuario = $atendimentoMedico->createdLotacao->usuario; if (!$usuarios->contains('id', $usuario->id)) { $usuarios->push([ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome ]); } }); return response()->json($usuarios->sortBy('nome')->values(), Response::HTTP_OK); } public function getProfissionaisAtendimento($atendimentoId) { $usuarios = collect(); $atendimento = Atendimento::findOrFail($atendimentoId); $atendimento->atendimentosMedico ->each(function ($atendimentoMedico) use ($usuarios) { $usuario = $atendimentoMedico->createdLotacao->usuario; if (!$usuarios->contains('id', $usuario->id)) { $usuarios->push([ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome ]); } }); $atendimento->atendimentosEnfermagem ->each(function ($atendimentoEnfermagem) use ($usuarios) { $usuario = $atendimentoEnfermagem->createdLotacao->usuario; if (!$usuarios->contains('id', $usuario->id)) { $usuarios->push([ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome ]); } }); $atendimento->atendimentosExameImagem ->each(function ($atendimentoExameImagem) use ($usuarios) { $usuario = $atendimentoExameImagem->createdLotacao->usuario; if (!$usuarios->contains('id', $usuario->id)) { $usuarios->push([ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome ]); } }); $atendimento->pacienteObservacoes ->each(function ($observacoes) use ($usuarios) { $usuario = $observacoes->createdLotacao->usuario; if (!$usuarios->contains('id', $usuario->id)) { $usuarios->push([ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome ]); } }); $atendimento->atendimentosTriagem ->each(function ($atendimentoTriagem) use ($usuarios) { $usuario = $atendimentoTriagem->createdLotacao->usuario; if (!$usuarios->contains('id', $usuario->id)) { $usuarios->push([ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome ]); } }); if ($atendimento->recepcao) { $usuario = $atendimento->recepcao->createdLotacao->usuario; if (!$usuarios->contains('id', $usuario->id)) { $usuarios->push([ 'id' => $usuario->id, 'nome' => $usuario->cidadao->nome ]); } } return response()->json($usuarios->sortBy('nome')->values(), Response::HTTP_OK); } private function getGestacao($atendimento) { $gestacao = $atendimento->gestacoes()->orderByDesc('created_at')->first(); $gestacaoPaciente = $atendimento->faa->paciente->dum; return [ 'dpp' => $gestacaoPaciente && $gestacaoPaciente->data_possivel_parto ? Carbon::create($gestacaoPaciente->data_possivel_parto)->format('d/m/Y') : $gestacao->dpp ?? null, 'dum_min_date' => $atendimento->created_at->subDays(308)->format('d/m/Y'), 'dum_max_date' => $atendimento->created_at->format('d/m/Y'), 'dum' => $gestacaoPaciente && $gestacaoPaciente->data_ultima_menstruacao ? $gestacaoPaciente->data_ultima_menstruacao : $gestacao->dum ?? null, 'gestante' => $atendimento->faa->paciente->cidadao->fatoresRisco->contains(FatorRiscoEnum::GESTANTE) ?? $gestacao->gestante ?? false, 'idade_gestacional' => [ 'dias' => $gestacaoPaciente && $gestacaoPaciente->idade_gestacional_dias ? $gestacaoPaciente->idade_gestacional_dias : $gestacao->idade_gestacional['dias'] ?? null, 'semanas' => $gestacaoPaciente && $gestacaoPaciente->idade_gestacional_semanas ? $gestacaoPaciente->idade_gestacional_semanas : $gestacao->idade_gestacional['semanas'] ?? null, ], ]; } public function getDeclaracoesComparecimento($atendimentoId) { $declaracoesComparecimento = []; $atendimento = Atendimento::findOrFail($atendimentoId); $atendimento->atendimentosMedico ->each(function ($atendimentoMedico) { foreach ($atendimentoMedico->declaracoesComparecimento as $declaracaoComparecimento) { $declaracoesComparecimento[] = [ 'id' => $declaracaoComparecimento->id, 'tipo_id' => $declaracaoComparecimento->tipo_id ?? null, 'data_de' => $declaracaoComparecimento->de->format('d/m/Y') ?? null, 'hora_de' => $declaracaoComparecimento->de->format('H:i:s') ?? null, 'data_ate' => $declaracaoComparecimento->ate->format('d/m/Y') ?? null, 'hora_ate' => $declaracaoComparecimento->ate->format('H:i:s') ?? null, ]; } }); $atendimento->atendimentosEnfermagem ->each(function ($atendimentoEnfermagem) { foreach ($atendimentoEnfermagem->declaracoesComparecimento as $declaracaoComparecimento) { $declaracoesComparecimento[] = [ 'id' => $declaracaoComparecimento->id, 'tipo_id' => $declaracaoComparecimento->tipo_id ?? null, 'data_de' => $declaracaoComparecimento->de->format('d/m/Y') ?? null, 'hora_de' => $declaracaoComparecimento->de->format('H:i:s') ?? null, 'data_ate' => $declaracaoComparecimento->ate->format('d/m/Y') ?? null, 'hora_ate' => $declaracaoComparecimento->ate->format('H:i:s') ?? null, ]; } }); $atendimento->atendimentosExameImagem ->each(function ($atendimentoExameImagem) { foreach ($atendimentoExameImagem->declaracoesComparecimento as $declaracaoComparecimento) { $declaracoesComparecimento[] = [ 'id' => $declaracaoComparecimento->id, 'tipo_id' => $declaracaoComparecimento->tipo_id ?? null, 'data_de' => $declaracaoComparecimento->de->format('d/m/Y') ?? null, 'hora_de' => $declaracaoComparecimento->de->format('H:i:s') ?? null, 'data_ate' => $declaracaoComparecimento->ate->format('d/m/Y') ?? null, 'hora_ate' => $declaracaoComparecimento->ate->format('H:i:s') ?? null, ]; } }); $atendimento->pacienteObservacoes ->each(function ($observacoes) { foreach ($observacoes->declaracoesComparecimento as $declaracaoComparecimento) { $declaracoesComparecimento[] = [ 'id' => $declaracaoComparecimento->id, 'tipo_id' => $declaracaoComparecimento->tipo_id ?? null, 'data_de' => $declaracaoComparecimento->de->format('d/m/Y') ?? null, 'hora_de' => $declaracaoComparecimento->de->format('H:i:s') ?? null, 'data_ate' => $declaracaoComparecimento->ate->format('d/m/Y') ?? null, 'hora_ate' => $declaracaoComparecimento->ate->format('H:i:s') ?? null, ]; } }); $atendimento->atendimentosTriagem ->each(function ($atendimentoTriagem) { foreach ($atendimentoTriagem->declaracoesComparecimento as $declaracaoComparecimento) { $declaracoesComparecimento[] = [ 'id' => $declaracaoComparecimento->id, 'tipo_id' => $declaracaoComparecimento->tipo_id ?? null, 'data_de' => $declaracaoComparecimento->de->format('d/m/Y') ?? null, 'hora_de' => $declaracaoComparecimento->de->format('H:i:s') ?? null, 'data_ate' => $declaracaoComparecimento->ate->format('d/m/Y') ?? null, 'hora_ate' => $declaracaoComparecimento->ate->format('H:i:s') ?? null, ]; } }); if ($atendimento->recepcao) { foreach ($atendimento->recepcao->declaracoesComparecimento as $declaracaoComparecimento) { $declaracoesComparecimento[] = [ 'id' => $declaracaoComparecimento->id, 'tipo_id' => $declaracaoComparecimento->tipo_id ?? null, 'data_de' => $declaracaoComparecimento->de->format('d/m/Y') ?? null, 'hora_de' => $declaracaoComparecimento->de->format('H:i:s') ?? null, 'data_ate' => $declaracaoComparecimento->ate->format('d/m/Y') ?? null, 'hora_ate' => $declaracaoComparecimento->ate->format('H:i:s') ?? null, ]; } } return response()->json($declaracoesComparecimento, Response::HTTP_OK); } public function storeDeclaracaoComparecimento() { $data = $this->prepareDeclaracoesComparecimentoData([ 'declaracoes_comparecimento' => [request()->except(['atendimento_id', 'medico_id'])] ])[0]; $declaracao = AtendimentoMedico::where('atendimento_id', request()->atendimento_id) ->whereHas('createdLotacao', function ($query) { $query->where('usuario_id', request()->medico_id); }) ->orderBy('id') ->first(); if ($declaracao) { $declaracao = $declaracao->declaracoesComparecimento()->create($data); } else { $declaracao = AtendimentoEnfermagem::where('atendimento_id', request()->atendimento_id) ->whereHas('createdLotacao', function ($query) { $query->where('usuario_id', request()->medico_id); }) ->orderBy('id') ->first(); if ($declaracao) { $declaracao = $declaracao->declaracoesComparecimento()->create($data); } else { $declaracao = AtendimentoExameImagem::where('atendimento_id', request()->atendimento_id) ->whereHas('createdLotacao', function ($query) { $query->where('usuario_id', request()->medico_id); }) ->orderBy('id') ->first(); if ($declaracao) { $declaracao = $declaracao->declaracoesComparecimento()->create($data); } else { $declaracao = PacienteObservacao::where('atendimento_id', request()->atendimento_id) ->whereHas('createdLotacao', function ($query) { $query->where('usuario_id', request()->medico_id); }) ->orderBy('id') ->first(); if ($declaracao) { $declaracao = $declaracao->declaracoesComparecimento()->create($data); } else { $declaracao = AtendimentoTriagem::where('atendimento_id', request()->atendimento_id) ->whereHas('createdLotacao', function ($query) { $query->where('usuario_id', request()->medico_id); }) ->orderBy('id') ->first(); if ($declaracao) { $declaracao = $declaracao->declaracoesComparecimento()->create($data); } else { $declaracao = Recepcao::where('atendimento_id', request()->atendimento_id) ->whereHas('createdLotacao', function ($query) { $query->where('usuario_id', request()->medico_id); }) ->orderBy('id') ->first(); if ($declaracao) { $declaracao = $declaracao->declaracoesComparecimento()->create($data); } } } } } } return response()->json($declaracao, Response::HTTP_CREATED); } public function store(MedicoRequest $request) { $this->auth(__FUNCTION__); $atendimentoMedico = new AtendimentoMedico; $params = $request->all(); DB::transaction(function () use ($atendimentoMedico, $params) { $atendimento = Atendimento::findOrFail($params['atendimento_id']); $isReavaliacao = $atendimento->atendimentosMedico()->get()->isNotEmpty(); $centroCustoPara = isset($params['centro_custo_id_para']) ? CentroCusto::find($params['centro_custo_id_para']) : null; $centroCustoSetorTipo = $centroCustoPara ? $centroCustoPara->setor->tipo_id : null; $fila = Fila::findOrFail($atendimento->fila_id); if ($params['cancelamento_desfecho'] == true) { $atendimento->faa->update([ 'canceled_desfecho_lotacao_id' => auth()->payload()->get('lotacao_id'), ]); } if (($params['data_hora_proxima_reavaliacao'] ?? null) || ($centroCustoSetorTipo && $centroCustoSetorTipo == SetorTipo::OBSERVACAO)) { $procedimentosAnteriores = $atendimento->procedimentos()->pluck('procedimento_id')->toArray(); $primeiroAtendimento = $atendimento->pacienteObservacoes ? $atendimento->pacienteObservacoes()->orderBy('created_at')->first() : null; $tempoAtendimento = null; if ( !is_null($primeiroAtendimento) ) { $tempoAtendimento = $primeiroAtendimento->created_at->diff(Carbon::now()); } $sigtapProcedimento = Procedimento::where('codigo', ProcedimentoEnum::ATEND_URG_OBS_ATE_24_HORAS_ATENCAO_ESPECIALIZADA)->orderByDesc('competencia_id')->firstOrFail(); if (!in_array($sigtapProcedimento->id, $procedimentosAnteriores) || (!is_null($tempoAtendimento) && $tempoAtendimento->d >= 1)) { array_push($params['procedimentos'], [ 'procedimento_id' => $sigtapProcedimento->id, 'cid_principal_id' => $sigtapProcedimento->cidsPrincipais()->pluck('id')->first(), 'quantidade' => 1, 'is_parametrizado' => $sigtapProcedimento->parametrizacaoProcedimento()->exists(), ]); } } $alergiasData = $this->prepareAlergiasData($params); $atendimento->faa->paciente->cidadao->alergias()->sync($alergiasData); $medicamentosUsoContinuoData = $this->prepareMedicamentosUsoContinuoData($params); $atendimento->faa->paciente->cidadao->medicamentosUsoContinuo()->sync($medicamentosUsoContinuoData); $atendimento->faa->paciente->cidadao->fatoresRisco()->sync($params['fatores_risco'] ?? []); $this->handleFatorRiscoOutro($atendimento, $params); $atendimentoMedico->fill($this->prepareAtendimentoMedicoData($params, $atendimento, $isReavaliacao)); $atendimento->atendimentosMedico()->save($atendimentoMedico); $cidData = $this->prepareCidData($params, $atendimentoMedico); if (!is_null($cidData)) { $atendimento->cids()->create($cidData); } $classificacaoRiscoData = $this->prepareClassificacaoRiscoData($params, $atendimentoMedico); $atendimento->classificacoesRisco()->create($classificacaoRiscoData); $gestacaoData = $this->prepareGestacaoData($params, $atendimentoMedico); if (!is_null($gestacaoData)) { $atendimento->gestacoes()->create($gestacaoData); if ($params['gestacao']['dum']) { $atendimento->faa->paciente->dum()->updateOrCreate( ['paciente_id' => $atendimento->faa->paciente->id], ['data_ultima_menstruacao' => $params['gestacao']['dum']] ); } if (!$atendimento->faa->paciente->cidadao->fatoresRisco->contains(FatorRiscoEnum::GESTANTE)) { $atendimento->faa->paciente->cidadao->fatoresRisco()->attach(FatorRiscoEnum::GESTANTE); } } $medicamentosUsoData = $this->prepareMedicamentosUsoData($params, $atendimentoMedico); if (!empty($medicamentosUsoData)) { $atendimento->medicamentosUso()->create($medicamentosUsoData); } $sinaisVitaisData = $this->prepareSinaisVitaisData($params, $atendimentoMedico); if (!empty($sinaisVitaisData)) { $atendimento->sinaisVitais()->createMany($sinaisVitaisData); } $avaliacaoAntropometricaData = $this->prepareAvaliacaoAntropometricaData($params, $atendimentoMedico); if (!is_null($avaliacaoAntropometricaData)) { $ultimaAvaliacao = $atendimentoMedico->atendimento->avaliacoesAntropometricas() ->orderByDesc('created_at') ->first(); if (!(!is_null($ultimaAvaliacao) && $avaliacaoAntropometricaData['massa'] == $ultimaAvaliacao->massa && $avaliacaoAntropometricaData['massa_unidade_medida_id'] == $ultimaAvaliacao->massa_unidade_medida_id && $avaliacaoAntropometricaData['altura_tipo_medida_id'] == $ultimaAvaliacao->altura_tipo_medida_id && $avaliacaoAntropometricaData['altura'] == $ultimaAvaliacao->altura && $avaliacaoAntropometricaData['altura_unidade_medida_id'] == $ultimaAvaliacao->altura_unidade_medida_id) ) { $atendimento->avaliacoesAntropometricas()->create($avaliacaoAntropometricaData); } } $observacaoData = $this->prepareObservacaoData($params, $atendimentoMedico); if (!is_null($observacaoData)) { $atendimento->observacoes()->create($observacaoData); } $this->handleDorToracica($params, $atendimentoMedico); $doencasCronicasData = $this->prepareDoencasCronicasData($params); if (!is_null($doencasCronicasData)) { $atendimento->faa->paciente->cidadao->doencasCronicas()->create($doencasCronicasData); } $atestadoData = $this->prepareAtestadoData($params); if (!is_null($atestadoData)) { $atendimentoMedico->atestado()->create($atestadoData); } $encaminhamentosData = $this->prepareEncaminhamentosData($params); if (!empty($encaminhamentosData)) { $atendimentoMedico->encaminhamentos()->createMany($encaminhamentosData); } $declaracoesComparecimentoData = $this->prepareDeclaracoesComparecimentoData($params); if (!empty($declaracoesComparecimentoData)) { $atendimentoMedico->declaracoesComparecimento()->createMany($declaracoesComparecimentoData); } $receitaMedicaData = $this->prepareReceitaMedicaData($params); if (!empty($receitaMedicaData)) { $this->storeReceitaMedica($receitaMedicaData, $atendimentoMedico, $params['receitas_medicas_assinadas']); } $prescricoesInternasData = $this->preparePrescricoesInternasData($params, $atendimentoMedico); if (!empty($prescricoesInternasData)) { $this->storePrescricoesInternas($prescricoesInternasData, $atendimentoMedico); } $raatData = $this->prepareRaatData($params, $atendimentoMedico); if (!is_null($raatData)) { $this->storeRaat($raatData, $atendimento); if($params['raat']['tipo_formulario_acidente_trabalho'] != TipoFormularioAcidenteTrabalho::RAAT) { $this->storeCat($params); } } $procedimentosData = $this->prepareProcedimentosData($params, $atendimentoMedico, $isReavaliacao); if (!empty($procedimentosData)) { $atendimento->procedimentos()->createMany($procedimentosData); } $pedidoExameData = $this->preparePedidoExameData($params, $atendimento); if (!empty($pedidoExameData)) { $this->storePedido($pedidoExameData, $atendimentoMedico); } if (isset($params['servicos_enfermagem'])) { $atendimentoMedico->servicosEnfermagem()->createMany($params['servicos_enfermagem']); } if (isset($request['escala_coma_glasgow'])) { $atendimentoMedico->escalasComaGlasgow()->createMany($request['escala_coma_glasgow']); } if ($this->isFromObservacao($atendimento)) { $procedimentoObservacao = new ProcedimentoObservacaoService( $this->getCurrentLotacao(), $atendimentoMedico ); $procedimentoObservacao->save(); } if (isset($params['desfecho'])) { $this->storeDesfecho($params['desfecho'], $atendimentoMedico); } if (isset($params['finalizacao'])) { $atendimentoMedico->desfecho_id = $params['finalizacao']['desfecho_id']; $this->storeFinalizacao($params['finalizacao'], $atendimentoMedico); $atendimentoMedico->save(); } else if (!is_null($params['centro_custo_id_para'] ?? null)) { FilaService::forward([ 'centro_custo_id_para' => $params['centro_custo_id_para'], 'prioridade_id' => $fila['prioridade_id'] ], $atendimento->fila_id); } }); $atendimentoMedico->refresh(); $atendimentoMedico->faa_id = $atendimentoMedico->atendimento->faa_id; $atendimentoMedico->impressoes = ImpressaoService::getImpressoes( $atendimentoMedico->atendimento_id, ); $atendimentoMedico->assinar = Parametrizacao::first()->assinatura_eletronica ?? false; return response()->json($atendimentoMedico, Response::HTTP_CREATED); } private function storeReceitaMedica($receitaMedica, $atendimentoMedico, $receitasMedicasAssinadasAgrupadas) { $receita = $atendimentoMedico->receita()->create($receitaMedica); foreach ($receitaMedica['medicamentos'] as $item) { $receita->medicamentos()->create($item); } foreach ($receitasMedicasAssinadasAgrupadas as $i => $receitasMedicasAssinadas) { $ordem = $i + 1; foreach ($receitasMedicasAssinadas as $receitaMedicaAssinada) { $receita->receitasAssinadas()->create([ 'ordem' => $ordem, 'receita' => $receitaMedicaAssinada, ]); } } } private function storePrescricoesInternas(array $prescricoesInternas, AtendimentoMedico $atendimentoMedico) { foreach ($prescricoesInternas as $params) { $prescricaoInterna = $atendimentoMedico->prescricoesInternas()->create($params); foreach ($params['medicamentos'] as $medicamento) { $item = $prescricaoInterna->medicamentos()->create($medicamento); $frequenciaQuantidadeVezes = $prescricaoInterna->frequencia_quantidade_vezes; if ($prescricaoInterna->doseUnica) { $frequenciaQuantidadeVezes = 1; } for ($i = 0; $i < $frequenciaQuantidadeVezes; $i++) { $aplicacao = [ 'status_id' => ExameStatusEnum::SOLICITADO, ]; $item->aplicacoes()->create($aplicacao); } } } } private function storeRaat(array $raat, Atendimento $atendimento) { Raat::where('id', $raat['id'])->update(['acidente_tipo_id' => $raat['acidente_tipo_id']]); $parecerMedico = $atendimento->faa->raat->pareceresMedico()->create($raat); $parecerMedico->partesCorpoAtingidas()->sync($raat['partes_corpo_atingidas']); $parecerMedico->causasAcidente()->sync($raat['causas_acidente']); $parecerMedico->diagnosticos()->sync($raat['diagnosticos']); } private function storeCat(array $params) { $params = $params['raat']; $cat = [ 'paciente_sofreu_acidente_trabalho' => $params['paciente_sofreu_acidente_trabalho'], 'paciente_portador_doenca_ocupacional' => $params['paciente_portador_doenca_ocupacional'], 'paciente_precisa_internacao' => $params['paciente_precisa_internacao'], 'dias_afastamento' => $params['dias_afastamento'], ]; Cat::where('raat_id', $params['id'])->update($cat); } private function storeDesfecho($desfecho, $atendimentoMedico) { switch ($desfecho['id']) { case Desfecho::EVASAO: { $atendimentoMedico->motivo_evasao = $desfecho['evasao']['motivo']; break; } case Desfecho::OBITO: { $obitoService = new ObitoService($atendimentoMedico->atendimento->faa->paciente->cidadao); $obitoService->save( Carbon::createFromFormat('d/m/Y H:i', $desfecho['obito']['obito_em']), $desfecho['obito']['declaracao'], $desfecho['obito']['causa'], $desfecho['obito']['cid_id'], $atendimentoMedico->createdLotacao->usuario_id ); $cadastroIndividual = CadastroIndividual::where('paciente_id', $atendimentoMedico->atendimento->faa->paciente->id)->first(); $cadastroCidadaoInformacaoSocial = PacienteInformacaoSocial::where('paciente_id', $atendimentoMedico->atendimento->faa->paciente->id)->first(); if($cadastroIndividual){ $cadastroIndividual->update([ 'data_usuario_responsavel' => Carbon::now(), 'saida_cidadao_id' => SaidaCidadao::OBITO ]); } if($cadastroCidadaoInformacaoSocial){ $cadastroCidadaoInformacaoSocial->update([ 'saida_cidadao_id' => SaidaCidadao::OBITO ]); } self::saveHistorico($atendimentoMedico->atendimento->faa->paciente->id); break; } case Desfecho::ENCAMINHAMENTO_HOSPITALAR: { $atendimentoMedico->encaminhamentoHospitalar()->create([ 'atendimento_id' => $atendimentoMedico->atendimento->id, 'usuario_id' => $atendimentoMedico->createdLotacao->usuario_id, 'unidade_id' => $desfecho['encaminhamento_hospitalar']['unidade_id'] ?? null, 'unidade_nome' => $desfecho['encaminhamento_hospitalar']['unidade_nome'] ?? null, 'quarto' => $desfecho['encaminhamento_hospitalar']['quarto'] ?? null, 'leito' => $desfecho['encaminhamento_hospitalar']['leito'] ?? null, 'cid_id' => $desfecho['encaminhamento_hospitalar']['cid_id'] ?? null, 'medico_hospitalar' => $desfecho['encaminhamento_hospitalar']['medico_hospitalar'] ?? null, 'observacoes' => $desfecho['encaminhamento_hospitalar']['observacoes'] ?? null, ]); break; } } $atendimentoMedico->desfecho_id = $desfecho['id']; $atendimentoMedico->save(); } private function storeFinalizacao(array $params, AtendimentoMedico $atendimentoMedico) { switch ($params['desfecho_id']) { case Desfecho::EVASAO: { FilaService::evade([ 'motivo_evasao' => $params['evasao']['motivo'] ], $atendimentoMedico->atendimento->fila_id); break; } case Desfecho::OBITO: { $obitoService = new ObitoService($atendimentoMedico->atendimento->faa->paciente->cidadao); $obitoService->save( Carbon::createFromFormat('d/m/Y H:i', $params['obito']['obito_em']), $params['obito']['declaracao'], $params['obito']['causa'], $params['obito']['cid_id'], $atendimentoMedico->createdLotacao->usuario_id ); $cadastroIndividual = CadastroIndividual::where('paciente_id', $atendimentoMedico->atendimento->faa->paciente->id)->first(); $cadastroCidadaoInformacaoSocial = PacienteInformacaoSocial::where('paciente_id', $atendimentoMedico->atendimento->faa->paciente->id)->first(); if($cadastroIndividual){ $cadastroIndividual->update([ 'data_usuario_responsavel' => Carbon::now(), 'saida_cidadao_id' => SaidaCidadao:: OBITO ]); } if($cadastroCidadaoInformacaoSocial){ $cadastroCidadaoInformacaoSocial->update([ 'saida_cidadao_id' => SaidaCidadao::OBITO ]); } self::saveHistorico($atendimentoMedico->atendimento->faa->paciente->id); break; } case Desfecho::ENCAMINHAMENTO_HOSPITALAR: { $atendimentoMedico->encaminhamentoHospitalar()->create([ 'atendimento_id' => $atendimentoMedico->atendimento->id, 'usuario_id' => $atendimentoMedico->createdLotacao->usuario_id, 'unidade_id' => $params['encaminhamento_hospitalar']['unidade_id'] ?? null, 'unidade_nome' => $params['encaminhamento_hospitalar']['unidade_nome'] ?? null, 'quarto' => $params['encaminhamento_hospitalar']['quarto'] ?? null, 'leito' => $params['encaminhamento_hospitalar']['leito'] ?? null, 'cid_id' => $params['encaminhamento_hospitalar']['cid_id'] ?? null, 'medico_hospitalar' => $params['encaminhamento_hospitalar']['medico_hospitalar'] ?? null, 'observacoes' => $params['encaminhamento_hospitalar']['observacoes'] ?? null, ]); break; } } $atendimentoMedico->atendimento->faa->update([ 'desfecho_id' => $params['desfecho_id'], 'finalizado' => true, 'usuario_id' => $atendimentoMedico->createdLotacao->usuario_id, 'lotacao_id' => $atendimentoMedico->createdLotacao->id, 'data_hora_desfecho' => $atendimentoMedico->created_at ]); if ($params['desfecho_id'] != Desfecho::EVASAO) { FilaService::dispatch($atendimentoMedico->atendimento->fila->centroCusto); } } private static function saveHistorico($pacienteId) { $historico = new PacienteHistorico; $historico->paciente_id = $pacienteId; $historico->save(); } private function prepareAlergiasData(array $params) : array { $alergias = []; foreach (($params['alergias'] ?? []) as $alergia) { $alergias[$alergia['alergia_id']] = [ 'criticidade_id' => $alergia['criticidade_id'], 'reacoes_observacoes' => $alergia['reacoes_observacoes'] ?? null, ]; } return $alergias; } private function prepareMedicamentosUsoContinuoData(array $params) : array { $medicamentos = []; foreach (($params['medicamentos_uso_continuo'] ?? []) as $medicamento) { $medicamentos[] = $medicamento['medicamento_id']; } return $medicamentos; } private function handleFatorRiscoOutro($atendimento, $params) { $atendimento->faa->paciente->cidadao->fator_risco_outro = null; if (in_array(FatorRiscoEnum::OUTRO, $params['fatores_risco'] ?? [])) { $atendimento->faa->paciente->cidadao->fator_risco_outro = $params['fator_risco_outro'] ?? null; } $atendimento->faa->paciente->cidadao->save(); } private function prepareAtendimentoMedicoData($params, $atendimento, $isReavaliacao) { $centroCustoLogado = $this->getCentroCustoLogado(); $parametrizacao = ParametrizacaoAtendimentoMedicoService::get($centroCustoLogado->infraestrutura_id); $isAtendimentoSimples = $parametrizacao->tipo_id === TipoAtendimento::SIMPLES; PlantaoService::setStatusComAtendimento($params['plantao_id']); $atendimentoMedico = [ 'plantao_id' => $params['plantao_id'], 'is_observacao' => $this->isFromObservacao($atendimento), 'simples' => $isAtendimentoSimples, 'orientacoes' => $params['orientacoes'] ?? null, 'desfecho_id' => $params['desfecho_id'] ?? null, ]; if ($isReavaliacao) { $atendimentoMedico['evolucao'] = $params['evolucao']; } if ($isAtendimentoSimples) { $atendimentoMedico['atendimento_geral'] = $params['atendimento_geral'] ?? null; } else { $atendimentoMedico['queixa_principal_duracao'] = $params['queixa_principal_duracao'] ?? null; $atendimentoMedico['historia'] = $params['historia'] ?? null; $atendimentoMedico['exame_fisico'] = $params['exame_fisico'] ?? null; $atendimentoMedico['diagnostico'] = $params['diagnostico'] ?? null; $atendimentoMedico['conduta'] = $params['conduta'] ?? null; } $atendimentoMedico['observacoes_enfermagem'] = $params['observacoes_enfermagem'] ?? null; if ($this->isFromObservacao($atendimento) || (!is_null($params['centro_custo_id_para'] ?? null) && $this->isCentroCustoParaObservacao($params['centro_custo_id_para']) )) { if (!is_null($params['data_hora_proxima_reavaliacao'] ?? null)) { $atendimentoMedico['data_hora_proxima_reavaliacao'] = Carbon::createFromFormat('d/m/Y H:i', $params['data_hora_proxima_reavaliacao']); } } return $atendimentoMedico; } private function isCentroCustoParaObservacao($centroCustoIdPara) { $centroCustoPara = CentroCusto::findOrFail($centroCustoIdPara); return $centroCustoPara->setor->tipo_id === SetorTipo::OBSERVACAO; } private function isFromObservacao($atendimento) { return $atendimento->fila && $atendimento->fila->centroCusto->setor->tipo_id === SetorTipo::OBSERVACAO; } private function prepareCidData(array $params, AtendimentoMedico $atendimentoMedico) : ?array { if (!isset($params['cid_id'])) { return null; } return [ 'atendimento_medico_id' => $atendimentoMedico->id, 'cid_id' => $params['cid_id'], ]; } private function prepareClassificacaoRiscoData(array $params, AtendimentoMedico $atendimentoMedico) : array { return [ 'atendimento_medico_id' => $atendimentoMedico->id, 'classificacao_risco_id' => $params['classificacao_risco_id'], ]; } private function prepareGestacaoData(array $params, AtendimentoMedico $atendimentoMedico) : ?array { if (!isset($params['gestacao']) || $params['gestacao']['gestante'] == false) { return null; } $cidadao = $atendimentoMedico->atendimento->faa->paciente->cidadao; $sexoPermitido = $cidadao->sexo_id === Sexo::FEMININO; $idadePermitida = $cidadao->data_nascimento ? $cidadao->idade['anos'] >= 9 && $cidadao->idade['anos'] <= 60 : true; if (!$sexoPermitido || !$idadePermitida) { return null; } $params = $params['gestacao']; return [ 'atendimento_medico_id' => $atendimentoMedico->id, 'gestante' => $params['gestante'], 'dum' => $params['gestante'] ? ($params['dum'] ?? null) : null, ]; } private function prepareMedicamentosUsoData(array $params, AtendimentoMedico $atendimentoMedico) : ?array { if (!isset($params['medicamentos_uso'])) { return null; } return [ 'atendimento_medico_id' => $atendimentoMedico->id, 'descricao' => $params['medicamentos_uso'], ]; } private function prepareSinaisVitaisData(array $params, AtendimentoMedico $atendimentoMedico) : array { $sinaisVitaisData = []; foreach (($params['sinais_vitais'] ?? []) as $sinaisVitais) { $sinaisVitaisData[] = [ 'atendimento_medico_id' => $atendimentoMedico->id, 'pa' => $sinaisVitais['pa'] ?? null, 'pa_unidade_medida_id' => isset($sinaisVitais['pa']) ? $sinaisVitais['pa_unidade_medida_id'] : null, 'glicemia' => $sinaisVitais['glicemia'] ?? null, 'temperatura' => $sinaisVitais['temperatura'] ?? null, 'pulso' => $sinaisVitais['pulso'] ?? null, 'respiracao' => $sinaisVitais['respiracao'] ?? null, 'saturacao' => $sinaisVitais['saturacao'] ?? null, 'intensidade_dor' => $sinaisVitais['intensidade_dor'] ?? null, 'cintura' => $sinaisVitais['cintura'] ?? null, ]; } return $sinaisVitaisData; } private function prepareAvaliacaoAntropometricaData(array $params, AtendimentoMedico $atendimentoMedico) : ?array { if (!isset($params['avaliacao_antropometrica'])) { return null; } $params = $params['avaliacao_antropometrica']; return [ 'atendimento_medico_id' => $atendimentoMedico->id, 'massa' => $params['massa'] ?? null, 'massa_unidade_medida_id' => isset($params['massa']) ? $params['massa_unidade_medida_id'] : null, 'altura' => $params['altura'] ?? null, 'altura_unidade_medida_id' => isset($params['altura']) ? $params['altura_unidade_medida_id'] : null, 'altura_tipo_medida_id' => isset($params['altura']) ? $params['altura_tipo_medida_id'] : null, ]; } private function prepareObservacaoData(array $params, AtendimentoMedico $atendimentoMedico) : ?array { if (!isset($params['observacoes'])) { return null; } return [ 'atendimento_medico_id' => $atendimentoMedico->id, 'descricao' => $params['observacoes'], ]; } private function handleDorToracica(array $params, AtendimentoMedico $atendimentoMedico) { $formulario = FormularioDorToracica::where('atendimento_id', $atendimentoMedico->atendimento->id)->get(); foreach ($formulario as $registro) { $formularioId = $registro->id; } if (!isset($formularioId)) { return; } $formulario = $formulario->where('id', $formularioId)->first(); $formulario->update([ 'protocolo_finalizado' => $params['dor_toracica_protocolo_finalizado'], 'protocolo_finalizado_em' => !$params['dor_toracica_protocolo_finalizado'] ? null : ($formulario->dor_toracica_protocolo_finalizado ? $formulario->protocolo_finalizado_em : Carbon::now()), 'protocolo_tem_prosseguimento' => $params['dor_toracica_protocolo_tem_prosseguimento'], 'tem_contra_indicacao_trombolitico' => $params['dor_toracica_protocolo_tem_prosseguimento'] ? $params['dor_toracica_tem_contra_indicacao_trombolitico'] : null, 'contra_indicacao_trombolitico_motivo' => $params['dor_toracica_protocolo_tem_prosseguimento'] && $params['dor_toracica_tem_contra_indicacao_trombolitico'] ? $params['dor_toracica_contra_indicacao_trombolitico_motivo'] : null, ]); if (isset($params['dor_toracica_resultado_eletrocardiograma'])) { FormularioDorToracicaResultadoEletrocardiograma::create([ 'formulario_dor_toracica_id' => $formularioId, 'atendimento_medico_id' => $atendimentoMedico->id, 'descricao' => $params['dor_toracica_resultado_eletrocardiograma'], ]); } $formulario->sinaisInstabilidade()->sync($params['dor_toracica_protocolo_tem_prosseguimento'] ? $params['dor_toracica_sinais_instabilidade'] : [] ); } private function prepareDoencasCronicasData(array $params) : ?array { if (!isset($params['doencas_cronicas'])) { return null; } return [ 'descricao' => $params['doencas_cronicas'], ]; } private function prepareAtestadoData(array $params) : ?array { if (!isset($params['atestado'])) { return null; } $params = $params['atestado']; return [ 'modelo_id' => $params['modelo_id'] ?? AtestadoModelo::PADRAO, 'nome_acompanhante' => $params['nome_acompanhante'], 'paciente' => $params['paciente'], 'imprime_cid' => $params['imprime_cid'], 'dias' => $params['dias'] ?? null, 'quantidade_horas' => $params['quantidade_horas'] ?? null, 'horario_inicial' => $params['horario_inicial'] ?? null, 'documento_tipo_id' => $params['documento_tipo_id'], 'documento_numero' => $params['documento_numero'], ]; } private function prepareEncaminhamentosData(array $params) : array { $encaminhamentos = []; foreach (($params['encaminhamentos'] ?? []) as $encaminhamento) { $encaminhamentos[] = [ 'urgente' => $encaminhamento['urgente'], 'ocupacao_id' => $encaminhamento['ocupacao_id'], 'motivo' => $encaminhamento['motivo'], 'observacoes' => $encaminhamento['observacoes'] ?? null, ]; } return $encaminhamentos; } private function prepareDeclaracoesComparecimentoData(array $params) : array { $declaracoesComparecimento = []; foreach (($params['declaracoes_comparecimento'] ?? []) as $declaracao) { $item = [ 'tipo_id' => $declaracao['tipo_id'], 'documento_tipo_id' => $declaracao['documento_tipo_id'], 'documento_numero' => $declaracao['documento_numero'], 'de' => $declaracao['de'], 'ate' => $declaracao['ate'], 'motivo' => $declaracao['motivo'], ]; if ($declaracao['tipo_id'] === DeclaracaoComparecimentoTipo::ACOMPANHANTE) { $item['nome'] = $declaracao['nome']; } $declaracoesComparecimento[] = $item; } return $declaracoesComparecimento; } private function prepareReceitaMedicaData($params) { if (is_null($params['receita_medica'] ?? null) || (empty($params['receita_medica']['medicamentos']) && empty($params['receitas_medicas_assinadas']) ) ) { return []; } $receitaMedica = [ 'is_assinada' => $params['receita_medica']['is_assinada'], 'medicamentos' => [], ]; foreach ($params['receita_medica']['medicamentos'] as $medicamento) { $viaAdministracaoId = null; if (!is_null($medicamento['medicamento_id'])) { $viaAdministracaoId = Medicamento::findOrFail($medicamento['medicamento_id']) ->via_administracao_id; } $item = [ 'prescricao_manual' => $medicamento['prescricao_manual'], 'medicamento_id' => $medicamento['medicamento_id'], 'medicamento_manual' => $medicamento['medicamento_manual'], ]; if ($viaAdministracaoId === EnumViaAdministracao::OUTRAS) { $item['via_administracao_outras'] = $medicamento['via_administracao_outras']; } $usoContinuo = $medicamento['tipo_aplicacao'] === 'uso_continuo'; $livre = $medicamento['tipo_aplicacao'] === 'livre'; $padrao = $medicamento['tipo_aplicacao'] === 'padrao'; if ($padrao || $usoContinuo) { if (($medicamento['v'] ?? null) === TipoPosologia::FREQUENCIA) { $item['intervalo_tempo'] = $medicamento['intervalo_tempo']; $item['intervalo_medida_tempo_id'] = $medicamento['intervalo_medida_tempo_id']; } else if (($medicamento['tipo_posologia'] ?? null) === TipoPosologia::TURNO) { $item['turno_id'] = $medicamento['turno_id']; } } if ($padrao) { $item['durante_tempo'] = $medicamento['durante_tempo']; $item['durante_medida_tempo_id'] = $medicamento['durante_medida_tempo_id']; } if ($livre) { $item['descricao'] = $medicamento['descricao']; } else { $item['quantidade'] = $medicamento['quantidade']; $item['recomendacoes'] = $medicamento['recomendacoes'] ?? null; } $receitaMedica['medicamentos'][] = $item; } return $receitaMedica; } private function preparePrescricoesInternasData(array $params) : array { $prescricoesInternas = []; foreach (($params['prescricoes_internas'] ?? []) as $prescricao) { $prescricaoInterna = [ 'observacoes' => $prescricao['observacoes'], 'medicamentos' => [], ]; if (!$prescricao['dose_unica']) { $prescricaoInterna['frequencia_quantidade_vezes'] = $prescricao['frequencia_quantidade_vezes']; $prescricaoInterna['frequencia_tempo'] = $prescricao['frequencia_tempo']; $prescricaoInterna['frequencia_medida_tempo_id'] = $prescricao['frequencia_medida_tempo_id']; } foreach ($prescricao['medicamentos'] as $medicamento) { $prescricaoInterna['medicamentos'][] = [ 'medicamento_id' => $medicamento['medicamento_id'], 'unidade_medida_id' => $medicamento['unidade_medida_id'], 'quantidade' => $medicamento['quantidade'], 'administracao' => $medicamento['administracao'], ]; } $prescricoesInternas[] = $prescricaoInterna; } return $prescricoesInternas; } private function prepareRaatData(array $params, AtendimentoMedico $atendimentoMedico) : ?array { if (!isset($params['raat'])) { return null; } if (!$atendimentoMedico->atendimento->faa->isRaatAberta) { return null; } $params = $params['raat']; $raat = [ 'id' => $params['id'], 'atendimento_medico_id' => $atendimentoMedico->id, 'agente_id' => $params['agente_id'], 'partes_corpo_atingidas' => $params['partes_corpo_atingidas'], 'causas_acidente' => $params['causas_acidente'], 'diagnosticos' => $params['diagnosticos'], 'observacao' => $params['observacao'] ?? null, 'classificacao_inicial_id' => $params['classificacao_inicial_id'], 'afastado' => $params['afastado'], 'acidente_tipo_id' => $params['acidente_tipo_id'] ]; if (in_array(ParteCorpoAtingida::OUTROS, $raat['partes_corpo_atingidas'])) { $raat['parte_corpo_atingida_outras'] = $params['parte_corpo_atingida_outras']; } if (in_array(CausaAcidente::OUTROS, $raat['causas_acidente'])) { $raat['causa_acidente_outras'] = $params['causa_acidente_outras']; } if (in_array(Diagnostico::OUTROS, $raat['diagnosticos'])) { $raat['diagnostico_outros'] = $params['diagnostico_outros']; } return $raat; } private function prepareProcedimentosData($params, $atendimentoMedico, $isReavaliacao) { $procedimentos = []; foreach (($params['procedimentos'] ?? []) as $procedimento) { $procedimentos[] = [ 'lotacao_id' => auth()->payload()->get('lotacao_id'), 'atendimento_medico_id' => $atendimentoMedico->id, 'procedimento_id' => $procedimento['procedimento_id'], 'cid_principal_id' => $procedimento['cid_principal_id'] ?? null, 'cid_secundario_id' => isset($procedimento['cid_principal_id']) ? $procedimento['cid_secundario_id'] ?? null : null, 'quantidade' => $procedimento['quantidade'], ]; } if (!$isReavaliacao) { $procedimentoParametrizado = $this->getProcedimentoParametrizado(); if ($procedimentoParametrizado) { $procedimentos[] = [ 'lotacao_id' => auth()->payload()->get('lotacao_id'), 'atendimento_medico_id' => $atendimentoMedico->id, 'procedimento_id' => $procedimentoParametrizado['procedimento']['id'], 'cid_principal_id' => $params['cid_id'] ?? null, 'quantidade' => 1, 'is_parametrizado' => true, ]; } } if (!is_null($atendimentoMedico->avaliacaoAntropometrica)) { $this->addProcedimentoAvaliacaoAntropometricaData($procedimentos, $atendimentoMedico); } $sinaisVitais = $atendimentoMedico->sinaisVitais()->get(); if ($sinaisVitais->isNotEmpty()) { $this->addProcedimentosSinaisVitaisData($sinaisVitais, $procedimentos, $atendimentoMedico->id); } return $procedimentos; } private function preparePedidoExameData(array $params, Atendimento $atendimento) : ?array { if (!isset($params['pedidos_exames'])) { return null; } $pedidoExame = $params['pedidos_exames']; $result = [ 'atendimento_id' => $atendimento->id, 'urgente' => $pedidoExame['urgente'], 'justificativa' => $pedidoExame['justificativa'], 'exames' => [], ]; foreach ($pedidoExame['exames'] as $exame) { $valor = Exame::findOrFail($exame['exame_id']); $result['exames'][] = [ 'exame_id' => $exame['exame_id'], 'valor_exame' => $valor->valor ?? null, 'observacao' => $exame['observacao'] ?? null, ]; } return $result; } private function storePedido($pedidoExame, $atendimentoMedico) { $pedido = $atendimentoMedico->pedidosExames()->create($pedidoExame); foreach ($pedidoExame['exames'] as $item) { $createdItem = $pedido->exames()->create($item); if (!empty($item['observacao'])) { $createdItem->observacoes()->create([ 'observacao' => $item['observacao'] ]); } } } private function addProcedimentoAvaliacaoAntropometricaData(&$procedimentos, $atendimentoMedico) { $proc = Procedimento::where('codigo', ProcedimentoEnum::AVALIACAO_ANTROPOMETRICA) ->orderByDesc('competencia_id') ->firstOrFail(); $validation = new ProcedimentoValidationService($proc); if ($validation->isOcupacaoValid($this->getCurrentLotacao()->ocupacao)) { if (!$atendimentoMedico->atendimento->procedimentos->contains('procedimento_id', $proc->id)) { if (collect($procedimentos)->contains('procedimento_id', $proc->id)) { foreach ($procedimentos as $i => $procedimento) { if ($procedimento['procedimento_id'] === $proc->id) { $procedimentos[$i]['quantidade']++; break; } } } else { $procedimentos[] = [ 'lotacao_id' => auth()->payload()->get('lotacao_id'), 'atendimento_medico_id' => $atendimentoMedico->id, 'procedimento_id' => $proc->id, 'quantidade' => 1, ]; } } } } private function addProcedimentosSinaisVitaisData($sinaisVitais, &$procedimentos, int $atendimentoMedicoId) { $quantidadeMedicoesPa = 0; $quantidadeMedicoesGlicemia = 0; foreach ($sinaisVitais as $sinaisVitaisItem) { if (!is_null($sinaisVitaisItem->pa)) { $quantidadeMedicoesPa++; } if (!is_null($sinaisVitaisItem->glicemia)) { $quantidadeMedicoesGlicemia++; } } if ($quantidadeMedicoesPa > 0) { $this->addProcedimentoPaData($quantidadeMedicoesPa, $procedimentos, $atendimentoMedicoId); } if ($quantidadeMedicoesGlicemia > 0) { $this->addProcedimentoGlicemiaData($quantidadeMedicoesGlicemia, $procedimentos, $atendimentoMedicoId); } } private function addProcedimentoPaData($quantidade, &$procedimentos, int $atendimentoMedicoId) { $proc = Procedimento::where('codigo', ProcedimentoEnum::AFERICAO_PRESSAO_ARTERIAL) ->orderByDesc('competencia_id') ->firstOrFail(); $validation = new ProcedimentoValidationService($proc); if ($validation->isOcupacaoValid($this->getCurrentLotacao()->ocupacao)) { if (collect($procedimentos)->contains('procedimento_id', $proc->id)) { foreach ($procedimentos as $i => $procedimento) { if ($procedimento['procedimento_id'] === $proc->id) { $procedimentos[$i]['quantidade'] += $quantidade; break; } } } else { $procedimentos[] = [ 'lotacao_id' => auth()->payload()->get('lotacao_id'), 'atendimento_medico_id' => $atendimentoMedicoId, 'procedimento_id' => $proc->id, 'quantidade' => $quantidade, ]; } } } private function addProcedimentoGlicemiaData($quantidade, &$procedimentos, int $atendimentoMedicoId) { $proc = Procedimento::where('codigo', ProcedimentoEnum::GLICEMIA_CAPILAR) ->orderByDesc('competencia_id') ->firstOrFail(); $validation = new ProcedimentoValidationService($proc); if ($validation->isOcupacaoValid($this->getCurrentLotacao()->ocupacao)) { if (collect($procedimentos)->contains('procedimento_id', $proc->id)) { foreach ($procedimentos as $i => $procedimento) { if ($procedimento['procedimento_id'] === $proc->id) { $procedimentos[$i]['quantidade'] += $quantidade; break; } } } else { $procedimentos[] = [ 'lotacao_id' => auth()->payload()->get('lotacao_id'), 'atendimento_medico_id' => $atendimentoMedicoId, 'procedimento_id' => $proc->id, 'quantidade' => $quantidade, ]; } } } private function getCentroCustoLogado() { return CentroCusto::findOrFail(auth()->payload()->get('centro_custo_id')); } private function getDadosForm($atendimento, $centroCustoLogado) { $lotacao = $this->getLotacaoLogado(); $parametrizacao = ParametrizacaoAtendimentoMedicoService::get($centroCustoLogado->infraestrutura_id); $atendimentoCids = $atendimento->cids() ->groupBy('cid_id') ->with('cid') ->orderBy('created_at') ->get() ->makeHidden(['atendimento_id', 'atendimento_medico_id', 'cid_id']); $cids = []; foreach ($atendimentoCids as $value) { $cids[] = [ 'id' => $value->id ?? null, 'cid' => $value->cid, 'lotacao' => [ 'ocupacao' => [ 'id' => $value->createdLotacao->ocupacao->id ?? null, 'codigo' => $value->createdLotacao->ocupacao->codigo ?? null, 'nome' => $value->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $value->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $value->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $value->atendimentoMedico->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $value->created_at->format('d/m/Y H:i:s') ?? null, ]; } $encaminhamentos = []; foreach ($atendimento->atendimentosMedico as $atendimentoMedico) { foreach ($atendimentoMedico->encaminhamentos as $encaminhamento) { $encaminhamentos[] = [ 'id' => $encaminhamento->id ?? null, 'lotacao' => [ 'ocupacao' => [ 'codigo' => $encaminhamento->createdLotacao->ocupacao->codigo ?? null, ], 'profissional' => [ 'nome' => $encaminhamento->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'ocupacao' => [ 'id' => $encaminhamento->ocupacao->id ?? null, 'nome' => $encaminhamento->ocupacao->nome ?? null, ], 'urgente' => $encaminhamento->urgente ?? false, 'motivo' => $encaminhamento->motivo ?? null, 'observacoes' => $encaminhamento->observacoes ?? null, ]; } } $declaracoesComparecimento = []; foreach ($atendimento->atendimentosMedico as $atendimentoMedico) { foreach ($atendimentoMedico->declaracoesComparecimento as $declaracaoComparecimento) { $nome = $declaracaoComparecimento->tipo_id === DeclaracaoComparecimentoTipo::PACIENTE ? $declaracaoComparecimento->atendimentoMedico->atendimento->faa->paciente->cidadao->nome : $declaracaoComparecimento->nome; $declaracoesComparecimento[] = [ 'id' => $declaracaoComparecimento->id, 'lotacao' => [ 'ocupacao' => [ 'id' => $declaracaoComparecimento->createdLotacao->ocupacao->id ?? null, 'codigo' => $declaracaoComparecimento->createdLotacao->ocupacao->codigo ?? null, 'nome' => $declaracaoComparecimento->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $declaracaoComparecimento->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $declaracaoComparecimento->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $declaracaoComparecimento->atendimentoMedico->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $declaracaoComparecimento->created_at->format('d/m/Y H:i:s') ?? null, 'tipo_id' => $declaracaoComparecimento->tipo_id ?? null, 'nome' => $nome ?? null, 'documento_numero' => $declaracaoComparecimento->documento_numero ?? null, 'documento_tipo_id' => $declaracaoComparecimento->documento_tipo_id ?? null, 'data_de' => $declaracaoComparecimento->de->format('d/m/Y') ?? null, 'hora_de' => $declaracaoComparecimento->de->format('H:i:s') ?? null, 'data_ate' => $declaracaoComparecimento->ate->format('d/m/Y') ?? null, 'hora_ate' => $declaracaoComparecimento->ate->format('H:i:s') ?? null, 'motivo' => $declaracaoComparecimento->motivo ?? null, ]; } } $prescricoesInternas = []; foreach ($atendimento->atendimentosMedico as $atendimentoMedico) { foreach ($atendimentoMedico->prescricoesInternas as $prescricaoInterna) { $prescricoesInternas[] = [ 'id' => $prescricaoInterna->id ?? null, 'frequencia_quantidade_vezes' => $prescricaoInterna->frequencia_quantidade_vezes ?? null, 'frequencia_tempo' => $prescricaoInterna->frequencia_tempo ?? null, 'frequencia_medida_tempo_id' => $prescricaoInterna->frequencia_medida_tempo_id ?? null, 'observacoes' => $prescricaoInterna->observacoes ?? null, 'medicamentos' => $prescricaoInterna->medicamentos->map(function($medicamento) { return [ 'id' => $medicamento->id ?? null, 'medicamento' => $medicamento->medicamento ?? null, 'quantidade' => $medicamento->quantidade ?? null, 'unidade_medida_id' => $medicamento->unidadeMedida->id ?? null, 'unidade_medida_sigla' => $medicamento->unidadeMedida->sigla ?? null, 'forma_farmaceutica_nome' => $medicamento->medicamento->formaFarmaceutica->nome ?? null, 'administracao' => $medicamento->administracao ?? null, 'aplicacoes' => $medicamento->aplicacoes->map(fn ($aplicacao) => [ 'id' => $aplicacao->id, 'status' => [ 'id' => $aplicacao->status->id, 'nome' => $aplicacao->status->nome, ], 'profissional' => [ 'nome' => $aplicacao->updatedLotacao->usuario->cidadao->nome, ], 'horario_aplicacao' => $aplicacao->horario_aplicacao, ]) ]; }), 'dose_unica' => $prescricaoInterna->dose_unica ?? false, 'lotacao' => [ 'ocupacao' => [ 'id' => $prescricaoInterna->createdLotacao->ocupacao->id ?? null, 'codigo' => $prescricaoInterna->createdLotacao->ocupacao->codigo ?? null, 'nome' => $prescricaoInterna->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $prescricaoInterna->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $prescricaoInterna->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $prescricaoInterna->atendimentoMedico->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $prescricaoInterna->created_at->format('d/m/Y H:i:s') ?? null, 'collapse' => true, ]; } } $atestados = []; foreach ($atendimento->faa->paciente->faas as $pacienteFaa) { foreach ($pacienteFaa->atendimentos->first()->atendimentosMedico as $atendimentoMedico) { if ($atendimentoMedico->atestado) { $atestados[] = [ 'data' => new Carbon($atendimentoMedico->atestado->created_at), 'unidade' => [ 'nome_fantasia' => $atendimentoMedico->atestado->createdLotacao->infraestrutura->unidade->nome_fantasia ?? null, ], 'profissional' => [ 'nome' => $atendimentoMedico->atestado->createdLotacao->usuario->cidadao->nome ?? null ] ]; } } } $cboLogado = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'))->ocupacao->codigo; $encaminhamentoSetores = []; if ($atendimento->fila->centroCusto->setor->tipo_id === SetorTipo::OBSERVACAO) { $encaminhamentoSetores = Encaminhamento::where('centro_custo_id_de', $atendimento->fila->centro_custo_id) ->whereDoesntHave('centroCustoPara.setor', fn ($q) => $q->where('tipo_id', SetorTipo::OBSERVACAO)); } else { $encaminhamentoSetores = Encaminhamento::where('centro_custo_id_de', auth()->payload()->get('centro_custo_id')); } $exibeHistoricoErpsaude = app('config')->get('database.default') == 'santarita' ? true : false; return [ 'data_atual' => Carbon::now()->format('d/m/Y'), 'data_max_proxima_reavaliacao' => Carbon::now()->addDay()->format('d/m/Y'), 'tipo_atendimento_id' => $parametrizacao->tipo_id, 'classificacoes_risco' => ClassificacaoRisco::all()->map(function($query) { return [ 'id' => $query->id, 'nome' => $query->nome, 'cor' => $query->tipo->cor, 'cor_nome' => $query->tipo->cor_nome, ]; }), 'atendimento_triagem' => [ 'procedimentos' => $this->getProcedimentos($atendimento, Carbon::now(), 'triagem'), 'outras_avaliacoes_condicoes' => AtendimentoTriagem::where('atendimento_id', $atendimento->id) ->whereNotNull('outras_avaliacoes_condicoes') ->orderBy('created_at') ->get() ->map(function ($avaliacao) { return [ 'descricao' => $avaliacao->outras_avaliacoes_condicoes, 'lotacao' => [ 'ocupacao' => [ 'id' => $avaliacao->createdLotacao->ocupacao->id ?? null, 'codigo' => $avaliacao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $avaliacao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $avaliacao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $avaliacao->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $avaliacao->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $avaliacao->created_at->format('d/m/Y H:i:s'), ]; }) ], 'atendimento_enfermagem' => [ 'historicos' => $this->getAreaAtendimentoEnfermagemByKey($atendimento, 'historico'), 'diagnosticos' => $this->getAreaAtendimentoEnfermagemByKey($atendimento, 'diagnostico'), 'planejamentos' => $this->getAreaAtendimentoEnfermagemByKey($atendimento, 'planejamento'), 'implementacoes' => $this->getAreaAtendimentoEnfermagemByKey($atendimento, 'implementacao'), 'avaliacoes' => $this->getAreaAtendimentoEnfermagemByKey($atendimento, 'avaliacao'), 'procedimentos' => $this->getProcedimentos($atendimento, Carbon::now(), 'enfermagem'), 'anotacoes' => $this->getAnotacoes($atendimento, Carbon::now()), ], 'atendimento_exame_imagem' => [ 'procedimentos' => $this->getProcedimentos($atendimento, Carbon::now(), 'exame_imagem'), ], 'traumas' => $this->getTraumas(), 'unidades_medida' => UnidadeMedida::orderBy('sigla')->get(), 'raat' => RaatService::getOptionsParecerMedico(), 'encaminhamentos' => $encaminhamentos, 'encaminhamento_especialidades' => Ocupacao::whereIn('id', EncaminhamentoEspecialidade::all() ->pluck('ocupacao_id')) ->orderBy('nome') ->get(), 'prescricao_medica' => ReceitaTipo::all(), 'vias_administracao' => ViaAdministracao::all(), 'formas_farmaceutica' => FormaFarmaceutica::all(), 'unidades_medida_tempo' => MedidaTempo::all(), 'unidades_medida' => UnidadeMedida::all(), 'unidades_medida_medicamento' => UnidadeMedida::where('id', '<>', UnidadeMedidaEnum::NIVEL_DE_DOR) ->where('id', '<>', UnidadeMedidaEnum::BATIMENTOS_POR_MINUTO) ->where('id', '<>', UnidadeMedidaEnum::CELSIUS) ->get() ->map(fn ($unidadesMedidas) => [ 'id' => $unidadesMedidas->id, 'nome' => $unidadesMedidas->nome, 'sigla' => $unidadesMedidas->sigla, ]), 'documentos_tipo' => DocumentoTipo::all(), 'paciente' => [ 'id' => $atendimento->faa->paciente->id, 'nome' => $atendimento->faa->paciente->cidadao->nome, 'nome_social' => $atendimento->faa->paciente->cidadao->nome_social, 'preferencia_nome_id' => $atendimento->faa->paciente->cidadao->preferencia_nome_id, 'prontuario' => $atendimento->faa->paciente->prontuario, 'cpf' => $atendimento->faa->paciente->cidadao->cpf, 'cns' => $atendimento->faa->paciente->cidadao->cns, 'data_nascimento' => $atendimento->faa->paciente->cidadao->data_nascimento, 'idade' => $atendimento->faa->paciente->cidadao->idade, 'is_desconhecido' => $atendimento->faa->paciente->is_desconhecido, 'caracteristicas_fisicas' => $atendimento->faa->paciente->cidadao->caracteristicas_fisicas, 'sexo' => $atendimento->faa->paciente->cidadao->sexo, 'pcd' => $this->getPcd($atendimento->faa->paciente->cidadao), ], 'recepcao' => [ 'motivo_atendimento' => $atendimento->recepcao->motivo_atendimento ?? null, 'acompanhante' => $atendimento->recepcao->acompanhante, 'atendido_em' => $atendimento->recepcao->atendido_em, 'data_de' => $atendimento->recepcao->atendido_em, 'hora_de' => Carbon::parse($atendimento->recepcao->atendido_em)->format('H:i') ], 'alergia_criticidades' => AlergiaCriticidade::all()->map(function($query) { return [ 'id' => $query->id, 'nome' => $query->nome, ]; }), 'alergia_tipos' => AlergiaTipo::all()->map(function($query) { return [ 'id' => $query->id, 'descricao' => $query->descricao, ]; }), 'encaminhamento_setores' => $encaminhamentoSetores ->get() ->map(function($query) { return [ 'id' => $query->centroCustoPara->id ?? null, 'nome' => $query->centroCustoPara->setor->nome ?? null, 'tipo' => [ 'id' => $query->centroCustoPara->setor->tipo_id ?? null ], ]; })->values(), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $lotacao->ocupacao->codigo, 'nome' => $lotacao->ocupacao->nome, ], 'profissional' => [ 'id' => $lotacao->usuario->id, 'nome' => $lotacao->usuario->cidadao->nome, ], ], 'medicamentos_uso' => $this->getMedicamentosUso($atendimento, Carbon::now()), 'unidades' => Unidade::orderBy('nome_fantasia')->get(), 'kits' => KitExame::orderBy('nome') ->get() ->map(fn ($kit) => [ 'id' => $kit->id, 'nome' => $kit->nome, 'checked' => false, 'exames' => DB::table('parametrizacao_kit_exame_item') ->join( 'parametrizacao_exame', 'parametrizacao_exame.id', 'parametrizacao_kit_exame_item.exame_id' ) ->join('sigtap.procedimento', function ($join) { $join->on('sigtap.procedimento.codigo', 'parametrizacao_exame.codigo') ->where('sigtap.procedimento.competencia_id', '=', function ($query) { $query->select('sigtap.competencia.id') ->from('sigtap.competencia') ->orderByDesc('sigtap.competencia.valor') ->limit(1); }); }) ->whereNull('parametrizacao_kit_exame_item.deleted_at') ->where('parametrizacao_kit_exame_item.kit_exame_id', $kit->id) ->when($kit->tipo_id === Tipo::IMAGEM, function ($query) use ($cboLogado) { $query->whereExists(function($query) use ($cboLogado) { $query->select(DB::raw(1)) ->from('sigtap.procedimento_ocupacao') ->whereColumn('sigtap.procedimento_ocupacao.procedimento_id', 'sigtap.procedimento.id') ->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'sigtap.procedimento_ocupacao.ocupacao_id') ->where('sigtap.ocupacao.codigo', $cboLogado); })->orWhereNotExists(function($query) { $query->select(DB::raw(1)) ->from('sigtap.procedimento_ocupacao') ->whereColumn('sigtap.procedimento_ocupacao.procedimento_id', 'sigtap.procedimento.id'); }); }) ->when($kit->tipo_id === Tipo::LABORATORIAL, function ($query) { $query->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('exame_laboratorial_parametrizacao_unidade_solicitante_exame_item') ->join( 'exame_laboratorial_parametrizacao_unidade_solicitante_exame', 'exame_laboratorial_parametrizacao_unidade_solicitante_exame.id', 'exame_laboratorial_parametrizacao_unidade_solicitante_exame_item.unidade_solicitante_exame_id' ) ->whereColumn( 'exame_laboratorial_parametrizacao_unidade_solicitante_exame_item.exame_id', 'parametrizacao_exame.id' ) ->where( 'exame_laboratorial_parametrizacao_unidade_solicitante_exame.infraestrutura_id', self::getCentroCustoLogado()->infraestrutura_id ) ) ->orWhereNotExists(fn ($q) => $q ->selectRaw(1) ->from('exame_laboratorial_parametrizacao_unidade_solicitante_exame') ->where( 'exame_laboratorial_parametrizacao_unidade_solicitante_exame.infraestrutura_id', self::getCentroCustoLogado()->infraestrutura_id ) ) ); }) ->orderBy('parametrizacao_exame.nome') ->select( 'parametrizacao_exame.id', 'parametrizacao_exame.codigo', 'parametrizacao_exame.nome', 'parametrizacao_exame.tipo_id' ) ->get() ->map(fn ($exame) => [ 'id' => $exame->id, 'codigo' => $exame->codigo, 'nome' => $exame->nome, 'tipo_id' => $exame->tipo_id, 'checked' => false, ]) ->values() ]) ->filter(fn ($kit) => count($kit['exames']) > 0) ->values(), 'procedimentos' => $this->getProcedimentos($atendimento, Carbon::now()), 'servicos_enfermagem' => $this->getServicosEnfermagem($atendimento), 'cids' => $cids, 'reavaliacao' => $atendimento->atendimentosMedico()->get()->isNotEmpty(), 'pedidos_exames' => $this->getPedidoExame($atendimento), 'prescricoes_internas' => $prescricoesInternas, 'atestados' => $atestados, 'sinais_vitais' => $this->getSinaisVitais($atendimento, Carbon::now()), 'evolucao' => $atendimento->atendimentosMedico->whereNotNull('evolucao') ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->evolucao, ]; }) ->values(), 'atendimento_geral' => $atendimento->atendimentosMedico->whereNotNull('atendimento_geral') ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->atendimento_geral, ]; }) ->values(), 'queixa_principal_duracao' => $atendimento->atendimentosMedico->whereNotNull('queixa_principal_duracao') ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->queixa_principal_duracao, ]; }) ->values(), 'historia' => $atendimento->atendimentosMedico->whereNotNull('historia') ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->historia, ]; }) ->values(), 'exame_fisico' => $atendimento->atendimentosMedico->whereNotNull('exame_fisico') ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->exame_fisico, ]; }) ->values(), 'diagnostico' => $atendimento->atendimentosMedico->whereNotNull('diagnostico') ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->diagnostico, ]; }) ->values(), 'conduta' => $atendimento->atendimentosMedico->whereNotNull('conduta') ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->conduta, ]; }) ->values(), 'observacoes_enfermagem' => $atendimento->atendimentosMedico->whereNotNull('observacoes_enfermagem') ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->observacoes_enfermagem, ]; }) ->values(), 'observacoes' => $atendimento->observacoes ->map(function($query) { return [ 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'descricao' => $query->descricao, ]; }) ->values(), 'declaracoes_comparecimento' => $declaracoesComparecimento, 'historico_atendimento' => $this->getHistoricoAtendimento($atendimento), 'fatores_risco' => $this->getFatoresRisco($atendimento), 'fatores_risco_gestante' => $this->getFatoresRiscoGestante($atendimento), 'paciente_observacao' => $this->getPacienteObservacaoData($atendimento), 'turnos' => Turno::orderBy('nome') ->get() ->map(function ($turno) { return [ 'id' => $turno->id, 'nome' => $turno->nome ]; }), 'escalas_coma_glasgow' => $this->getEscalasComaGlasgow($atendimento), 'glasgow' => [ 'aberturas_ocular' => $this->getGlasgowAberturaOcular(), 'reatividades_Pupilar' => $this->getGlasgowReatividadePupilar(), 'respostas_motora' => $this->getGlasgowRespostaMotora(), 'respostas_verbal' => $this->getGlasgowRespostaVerbal(), ], 'formulario_dor_toracica' => [ 'dor_toracica_data_sintoma' => null, 'dor_toracica_hora_ecg_admissao' => null, 'hora_sintoma' => null, 'hora_ecg_admissao' => null, 'dispneia' => null, 'caracteristica_dor' => $this->getCaracteristicaDor(), 'localizacao_dor' => $this->getLocalizacaoDor(), 'fator_desencadeante' => $this->getFatorDesencadeante(), 'fatores_risco_toracica' => $this->getFatoresRiscoToracica(), 'duracao_dor' => $this->getDuracaoDor(), 'sugestoes_medicacoes' => [ ['nome' => 'Ácido Acetil Salicílico'], ['nome' => 'Alteplase'], ['nome' => 'Clopidrogel'], ], 'sinais_instabilidade' => DorToracicaSinalInstabilidade::orderBy('nome')->get(['id', 'nome']), ], 'desfechos' => ModelDesfecho::get(), 'prioridades' => Prioridade::orderBy('nome') ->get() ->map(fn ($prioridade) => [ 'id' => $prioridade->id, 'nome' => $prioridade->nome, ]), 'prioridade_id' => $atendimento->fila->prioridade_id, 'historico' => AmbulatorioAtendimentoService::getHistorico($atendimento->faa->paciente->id), 'historico_erpsaude' => $exibeHistoricoErpsaude ? AmbulatorioAtendimentoService::getHistoricoErpsaude($atendimento->faa->paciente) : null, 'exibe_historico_erpsaude' => $exibeHistoricoErpsaude, ]; } private function getAnotacoes($atendimento, $datetime) { return Anotacao::where('created_at', '<=', $datetime) ->whereHas('atendimentoEnfermagem', function ($query) use ($atendimento) { $query->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($anotacao) { return array_merge( $this->getBaseHistoricoAreaAtendimento($anotacao->atendimentoEnfermagem, $anotacao->atendimentoEnfermagem->atendimento), [ 'id' => $anotacao->id, 'data_hora_anotacao' => $anotacao->anotado_em->format('Y-m-d H:i'), 'anotacao' => $anotacao->descricao, ] ); }) ->sortBy('created_at'); } private function getBaseHistoricoAreaAtendimento($model, $atendimento) { $result = [ 'centro_custo' => [ 'setor' => [ 'nome' => $model->createdCentroCusto->setor->nome, ], ], 'lotacao' => [ 'ocupacao' => [ 'codigo' => $model->createdLotacao->ocupacao->codigo, 'nome' => $model->createdLotacao->ocupacao->nome, ], 'profissional' => [ 'nome' => $model->createdLotacao->usuario->cidadao->nome, ], ], 'classificacao_risco' => [ 'nome' => $this->getClassificacaoRisco($atendimento, $model->created_at)['nome'] ?? null ], 'data_hora' => $model->created_at->format('d/m/Y H:i:s'), ]; return $result; } private function getClassificacaoRisco($atendimento, $datetime) { $classificacaoRisco = $atendimento->classificacoesRisco() ->where('created_at', '<=', $datetime) ->get() ->sortByDesc('created_at') ->first(); if ($classificacaoRisco == null) return null; return [ 'id' => $classificacaoRisco->id, 'classificacao_risco_id' => $classificacaoRisco->classificacao_risco_id, 'nome' => $classificacaoRisco->classificacaoRisco->nome, ]; } private function getAreaAtendimentoEnfermagemByKey($atendimento, $key) { switch($key) { case 'historico': { return Historico::where('atendimento_id', $atendimento->id) ->orderBy('created_at') ->get() ->map(function ($historico) use ($atendimento) { return [ 'descricao' => $historico->descricao, 'lotacao' => [ 'ocupacao' => [ 'id' => $historico->createdLotacao->ocupacao->id ?? null, 'codigo' => $historico->createdLotacao->ocupacao->codigo ?? null, 'nome' => $historico->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $historico->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $historico->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $this->getClassificacaoRisco($atendimento, $historico->created_at)['nome'] ?? null, ], 'data_hora' => $historico->created_at->format('d/m/Y H:i:s'), ]; }); } case 'diagnostico': { return DiagnosticoEnfermagem::where('atendimento_id', $atendimento->id) ->orderBy('created_at') ->get() ->map(function ($diagnostico) use ($atendimento) { return [ 'descricao' => $diagnostico->descricao, 'lotacao' => [ 'ocupacao' => [ 'id' => $diagnostico->createdLotacao->ocupacao->id ?? null, 'codigo' => $diagnostico->createdLotacao->ocupacao->codigo ?? null, 'nome' => $diagnostico->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $diagnostico->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $diagnostico->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $this->getClassificacaoRisco($atendimento, $diagnostico->created_at)['nome'] ?? null, ], 'data_hora' => $diagnostico->created_at->format('d/m/Y H:i:s'), ]; }); } case 'planejamento': { return Planejamento::where('atendimento_id', $atendimento->id) ->orderBy('created_at') ->get() ->map(function ($planejamento) use ($atendimento) { return [ 'descricao' => $planejamento->descricao, 'lotacao' => [ 'ocupacao' => [ 'id' => $planejamento->createdLotacao->ocupacao->id ?? null, 'codigo' => $planejamento->createdLotacao->ocupacao->codigo ?? null, 'nome' => $planejamento->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $planejamento->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $planejamento->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $this->getClassificacaoRisco($atendimento, $planejamento->created_at)['nome'] ?? null, ], 'data_hora' => $planejamento->created_at->format('d/m/Y H:i:s'), ]; }); } case 'implementacao': { return Implementacao::where('atendimento_id', $atendimento->id) ->orderBy('created_at') ->get() ->map(function ($implementacao) use ($atendimento) { return [ 'descricao' => $implementacao->descricao, 'lotacao' => [ 'ocupacao' => [ 'id' => $implementacao->createdLotacao->ocupacao->id ?? null, 'codigo' => $implementacao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $implementacao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $implementacao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $implementacao->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $this->getClassificacaoRisco($atendimento, $implementacao->created_at)['nome'] ?? null, ], 'data_hora' => $implementacao->created_at->format('d/m/Y H:i:s'), ]; }); } case 'avaliacao': { return Avaliacao::where('atendimento_id', $atendimento->id) ->orderBy('created_at') ->get() ->map(function ($avaliacao) use ($atendimento) { return [ 'descricao' => $avaliacao->descricao, 'lotacao' => [ 'ocupacao' => [ 'id' => $avaliacao->createdLotacao->ocupacao->id ?? null, 'codigo' => $avaliacao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $avaliacao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $avaliacao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $avaliacao->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $this->getClassificacaoRisco($atendimento, $avaliacao->created_at)['nome'] ?? null, ], 'data_hora' => $avaliacao->created_at->format('d/m/Y H:i:s'), ]; }); } } } private function getTraumas() { return PacienteTraumaStatus::all() ->map(function ($pacienteTrauma) { return [ 'id' => $pacienteTrauma->id, 'nome' => $pacienteTrauma->nome, ]; }); } private function getAlergias($atendimento, $datetime) { $alergias = $atendimento->faa->paciente->cidadao->alergias()->wherePivot('created_at', '<=', $datetime)->get(); $result = []; foreach ($alergias as $i => $alergia) { $result[] = [ 'index' => $i, 'alergia' => [ 'agente_substancia_especifica' => $alergia->agente_substancia_especifica, 'criticidade' => [ 'id' => $alergia->cidadaoAlergia->criticidade->id, 'nome' => $alergia->cidadaoAlergia->criticidade->nome, ], 'id' => $alergia->cidadaoAlergia->alergia_id, 'reacoes_observacoes' => $alergia->cidadaoAlergia->reacoes_observacoes, 'tipo' => [ 'id' => $alergia->tipo->id, 'descricao' => $alergia->tipo->descricao, ] ], 'lotacao' => [ 'ocupacao' => [ 'id' => $alergia->cidadaoAlergia->createdLotacao->ocupacao->id ?? null, 'codigo' => $alergia->cidadaoAlergia->createdLotacao->ocupacao->codigo ?? null, 'nome' => $alergia->cidadaoAlergia->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $alergia->cidadaoAlergia->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $alergia->cidadaoAlergia->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $alergia->cidadaoAlergia->created_at->format('d/m/Y H:i:s') ?? null, ]; } return $result; } private function getMedicamentosUsoContinuo($atendimento, $datetime) { $medicamentos = $atendimento->faa->paciente->cidadao->medicamentosUsoContinuo()->wherePivot('created_at', '<=', $datetime)->get(); $result = []; foreach ($medicamentos as $medicamento) { $result[] = [ 'medicamento' => [ 'nome' => $medicamento->nome, 'id' => $medicamento->CidadaoMedicamentoUsoContinuo->medicamento_id, ], 'lotacao' => [ 'ocupacao' => [ 'id' => $medicamento->CidadaoMedicamentoUsoContinuo->createdLotacao->ocupacao->id ?? null, 'codigo' => $medicamento->CidadaoMedicamentoUsoContinuo->createdLotacao->ocupacao->codigo ?? null, 'nome' => $medicamento->CidadaoMedicamentoUsoContinuo->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $medicamento->CidadaoMedicamentoUsoContinuo->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $medicamento->CidadaoMedicamentoUsoContinuo->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $medicamento->CidadaoMedicamentoUsoContinuo->created_at->format('d/m/Y H:i:s') ?? null, ]; } return $result; } private function getCidadaoFatoresRisco($atendimento) { $cidadao = $atendimento->faa->paciente->cidadao; $fatoresRisco = $cidadao->fatoresRisco; $result = []; foreach ($fatoresRisco as $fatorRisco) { $result[] = $fatorRisco->cidadaoFatorRisco->fator_risco_id; } return $result; } private function getMedicamentosUso($atendimento, $datetime) { return $atendimento->medicamentosUso->where('created_at', '<=', $datetime) ->map(function($query) { return [ 'data_hora' => $query->created_at->format('d/m/Y H:i:s'), 'centro_custo' => [ 'setor' => [ 'nome' => $query->createdCentroCusto->setor->nome ?? null, ], ], 'descricao' => $query->descricao, 'lotacao' => [ 'ocupacao' => [ 'nome' => $query->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null, ], ], ]; })->values(); } private function getHistoricoAtendimento($atendimento) { $historicoAtendimento = Atendimento::whereHas('faa', function($query) use ($atendimento) { $query->where('paciente_id', $atendimento->faa->paciente_id); }) ->where('id', '<>', $atendimento->id) ->orderBy('created_at', 'desc') ->take(10) ->get(); return $historicoAtendimento->map(function($value) { $atendimento = $value->faa->atendimentos->sortByDesc('created_at')->first(); $atendimentoClassificacaoRisco = $atendimento->classificacoesRisco->sortByDesc('created_at')->first(); $atendimentoCid = $atendimento->cids->sortByDesc('created_at')->first(); $receitas = collect([]); $hasAtendimento = $atendimento ->where(function ($query) { $query->whereHas('atendimentosTriagem') ->orWhereHas('atendimentosMedico') ->orWhereHas('atendimentosEnfermagem') ->orWhereHas('pedidosExames') ->orWhereHas('pacienteObservacoes'); }) ->where('id', $atendimento->id) ->exists(); if (!$hasAtendimento) { $procedimentoPadrao = $atendimento->procedimentos->where('is_parametrizado', true)->last(); $lotacaoProfissionalResponsavel = !is_null($procedimentoPadrao) ? $procedimentoPadrao->lotacao : $atendimento->createdLotacao ?? null; } else { $firstAtendimentoMedico = $atendimento->atendimentosMedico->first(); $atendimento->atendimentosMedico->map(function($atendimentoMedico) use ($receitas) { if (!is_null($atendimentoMedico->receita ?? null)) { if ($atendimentoMedico->receita->medicamentos->isNotEmpty()) { $receitas->push($atendimentoMedico->receita); } } }); $lotacaoProfissionalResponsavel = !is_null($firstAtendimentoMedico) ? $firstAtendimentoMedico->createdLotacao : $atendimento->createdLotacao ?? null; } $params = [ 'paciente' => [ 'id' => $value->faa->paciente_id, ], 'atendido_em' => Carbon::create($value->recepcao->atendido_em)->format('d/m/Y H:i:s') ?? null, 'cid' => [ 'codigo' => $atendimentoCid->cid->codigo ?? $procedimentoPadrao->cidPrincipal->codigo ?? null, 'nome' => $atendimentoCid->cid->nome ?? $procedimentoPadrao->cidPrincipal->nome ?? null, ], 'classificacao_risco' => [ 'cor' => $atendimentoClassificacaoRisco->classificacaoRisco->tipo->cor ?? "#FFFFFF", 'nome' => $atendimentoClassificacaoRisco->classificacaoRisco->nome ?? null, ], 'id' => $atendimento->id ?? null, 'lotacao' => [ 'ocupacao' => [ 'nome' => $lotacaoProfissionalResponsavel->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $lotacaoProfissionalResponsavel->usuario->cidadao->nome ?? null, ], ], 'unidade' => [ 'nome' => $atendimento->createdLotacao->infraestrutura->unidade->nome_fantasia ?? null, ], 'receitas' => $receitas, 'desfecho' => [ 'nome' => $atendimento->faa->desfecho->nome ?? null, ], ]; return $params; }); } private static function getFatoresRisco() { $result = FatorRisco::orderBy('id') ->whereIn('id', [ FatorRiscoEnum::CANCERO, FatorRiscoEnum::DIABETES, FatorRiscoEnum::ETILISMO, FatorRiscoEnum::HIPERTENSAO, FatorRiscoEnum::OBESIDADE, FatorRiscoEnum::PERFIL_SANGUINEO_ALTERADO, FatorRiscoEnum::RADIOTERAPIA, FatorRiscoEnum::TABAGISMO, FatorRiscoEnum::USO_DE_MEDICAMENTOS_ANTINEOPLASICOS_OU_IMUNOSSUPRESSORES, FatorRiscoEnum::OUTRO, ]) ->get() ->map(fn ($fatorRisco) => [ 'id' => $fatorRisco->id, 'nome' => $fatorRisco->nome, ]); return $result; } private static function getFatoresRiscoGestante() { $result = FatorRisco::orderBy('nome') ->whereIn('id', [ FatorRiscoEnum::CANCERO, FatorRiscoEnum::DIABETES, FatorRiscoEnum::ETILISMO, FatorRiscoEnum::HIPERTENSAO, FatorRiscoEnum::OBESIDADE, FatorRiscoEnum::PERFIL_SANGUINEO_ALTERADO, FatorRiscoEnum::RADIOTERAPIA, FatorRiscoEnum::TABAGISMO, FatorRiscoEnum::USO_DE_MEDICAMENTOS_ANTINEOPLASICOS_OU_IMUNOSSUPRESSORES, FatorRiscoEnum::OUTRO, FatorRiscoEnum::GESTANTE, ]) ->get() ->map(fn ($fatorRisco) => [ 'id' => $fatorRisco->id, 'nome' => $fatorRisco->nome, ]); return $result; } private function getPacienteObservacaoData($atendimento) { $pacienteObservacoes = $atendimento->pacienteObservacoes()->orderBy('created_at')->get(); $firstPacienteObservacao = $pacienteObservacoes->first(); $lastPacienteObservacao = $pacienteObservacoes->last(); if (is_null($firstPacienteObservacao)) { return null; } $entradaObservacao = $firstPacienteObservacao->created_at->format('d/m/Y H:i:s'); $lastAtendimentoMedico = $atendimento->atendimentosMedico()->orderBy('created_at')->get()->last(); $dataHoraProximaReavaliacao = null; if (!is_null($lastAtendimentoMedico->data_hora_proxima_reavaliacao ?? null)) { $dataHoraProximaReavaliacao = $lastAtendimentoMedico->data_hora_proxima_reavaliacao->format('d/m/Y H:i'); } return [ 'entrada_observacao' => $entradaObservacao, 'tempo_em_observacao' => $this->getTempoEmObservacao($atendimento), 'paciente_atingiu24horas' => $this->pacienteAtingiu24HorasObservacao($atendimento), 'quarto' => $lastPacienteObservacao->quarto, 'leito' => $lastPacienteObservacao->leito, 'data_hora_proxima_reavaliacao' => $dataHoraProximaReavaliacao, 'hemorragia_externa_grave' => [ 'id' => $lastPacienteObservacao->hemorragiaExternaGrave->id ?? null, 'nome' => $lastPacienteObservacao->hemorragiaExternaGrave->nome ?? null, ], 'hemorragia_externa_grave_local' => $lastPacienteObservacao->hemorragia_externa_grave_local ?? null, 'vias_aerias' => [ 'id' => $lastPacienteObservacao->viasAerias->id ?? null, 'nome' => $lastPacienteObservacao->viasAerias->nome ?? null, ], 'vias_aerias_obstrucao_por' => $lastPacienteObservacao->vias_aerias_obstrucao_por ?? null, 'oxigenacao_respiracao_ventilacao' => [ 'id' => $lastPacienteObservacao->oxigenacaoRespiracaoVentilacao->id ?? null, 'nome' => $lastPacienteObservacao->oxigenacaoRespiracaoVentilacao->nome ?? null, ], 'pulso' => [ 'id' => $lastPacienteObservacao->pulso->id ?? null, 'nome' => $lastPacienteObservacao->pulso->nome ?? null, ], 'pele' => [ 'id' => $lastPacienteObservacao->pele->id ?? null, 'nome' => $lastPacienteObservacao->pele->nome ?? null, ], 'pele_alteracao' => $lastPacienteObservacao->pele_alteracao ?? null, 'perfusao' => [ 'id' => $lastPacienteObservacao->perfuracao->id ?? null, 'nome' => $lastPacienteObservacao->perfuracao->nome ?? null, ], 'perfusao_lentificada' => $lastPacienteObservacao->perfuracao_lentificada ?? null, 'sangramento' => [ 'id' => $lastPacienteObservacao->sangramento->id ?? null, 'nome' => $lastPacienteObservacao->sangramento->nome ?? null, ], 'sangramento_local' => $lastPacienteObservacao->sangramento_local ?? null, 'pupilas' => [ 'id' => $lastPacienteObservacao->pupilas->id ?? null, 'nome' => $lastPacienteObservacao->pupilas->nome ?? null, ], 'paresias' => [ 'id' => $lastPacienteObservacao->paresias->id ?? null, 'nome' => $lastPacienteObservacao->paresias->nome ?? null, ], 'plegia' => [ 'id' => $lastPacienteObservacao->plegia->id ?? null, 'nome' => $lastPacienteObservacao->plegia->nome ?? null, ], 'exposicao_hipotermia' => [ 'id' => $lastPacienteObservacao->exposicaoHipotermia->id ?? null, 'nome' => $lastPacienteObservacao->exposicaoHipotermia->nome ?? null, ], 'exposicao_hipotermia_observacao' => $lastPacienteObservacao->exposicao_hipotermia_observacao ?? null, 'avaliacao_cabeca_pescoco' => $this->getAvaliacaoCabecaPescoco($lastPacienteObservacao), 'avaliacao_torax' => $lastPacienteObservacao->avaliacao_torax ?? null, 'avaliacao_abdome' => $lastPacienteObservacao->avaliacao_abdome ?? null, 'avaliacao_mmss_mmii' => $lastPacienteObservacao->avaliacao_mmss_mmii ?? null, 'observacao' => $lastPacienteObservacao->observacao ?? null, 'procedimentos' => $this->getProcedimentos($atendimento, Carbon::now(), 'observacao'), ]; } private function getAvaliacaoCabecaPescoco($pacienteObservacao) { if (is_null($pacienteObservacao)) { return null; } return [ 'avaliacao_cabeca_pescoco' => $pacienteObservacao->avaliacao_cabeca_pescoco ?? null, 'lotacao' => [ 'ocupacao' => [ 'id' => $pacienteObservacao->createdLotacao->ocupacao->id ?? null, 'codigo' => $pacienteObservacao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $pacienteObservacao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $pacienteObservacao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $pacienteObservacao->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => $pacienteObservacao->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $pacienteObservacao->created_at->format('d/m/Y H:i:s'), ]; } private function getTempoEmObservacao($atendimento) { $firstPacienteObservacao = $atendimento->pacienteObservacoes ? $atendimento->pacienteObservacoes()->orderBy('created_at')->first() : null; if (is_null($firstPacienteObservacao)) { return '00:00:00'; } $diff = $firstPacienteObservacao->created_at->diff(Carbon::now()); $msg = $diff->format('%H:%I:%S'); if ($diff->d >= 1) { $createdAtPacienteObservacao = new Carbon($firstPacienteObservacao->created_at); $timeReach24Hours = $createdAtPacienteObservacao->modify('+24 hours'); $msg = $timeReach24Hours->format('H:i:s'); } return $msg; } private function pacienteAtingiu24HorasObservacao($atendimento) { $firstPacienteObservacao = $atendimento->pacienteObservacoes ? $atendimento->pacienteObservacoes()->orderBy('created_at')->first() : null; if (is_null($firstPacienteObservacao)) { return false; } $diff = $firstPacienteObservacao->created_at->diff(Carbon::now()); return $diff->d >= 1; } private function getSinaisVitais($atendimento, $datetime) { $sinaisVitais = $atendimento->sinaisVitais()->where('created_at', '<=', $datetime)->get(); $result = []; foreach ($sinaisVitais as $sinalVital) { $result[] = [ 'id' => $sinalVital->id, 'pa' => $sinalVital->pa, 'pa_unidade_medida_id' => $sinalVital->pa_unidade_medida_id, 'glicemia' => $sinalVital->glicemia, 'glicemia_unidade_medida_id' => UnidadeMedidaEnum::MILIGRAMAS_POR_DECILITRO, 'temperatura' => $sinalVital->temperatura, 'temperatura_unidade_medida_id' => UnidadeMedidaEnum::CELSIUS, 'pulso' => $sinalVital->pulso, 'pulso_unidade_medida_id' => UnidadeMedidaEnum::BATIMENTOS_POR_MINUTO, 'respiracao' => $sinalVital->respiracao, 'respiracao_unidade_medida_id' => UnidadeMedidaEnum::MOVIMENTOS_POR_MINUTO, 'saturacao' => $sinalVital->saturacao, 'saturacao_unidade_medida_id' => UnidadeMedidaEnum::PORCENTAGEM, 'intensidade_dor' => $sinalVital->intensidade_dor, 'intensidade_dor_unidade_medida_id' => UnidadeMedidaEnum::NIVEL_DE_DOR, 'cintura' => $sinalVital->cintura, 'cintura_unidade_medida_id' => UnidadeMedidaEnum::CENTIMETROS, 'lotacao' => [ 'ocupacao' => [ 'id' => $sinalVital->createdLotacao->ocupacao->id ?? null, 'codigo' => $sinalVital->createdLotacao->ocupacao->codigo ?? null, 'nome' => $sinalVital->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $sinalVital->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $sinalVital->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => ( $sinalVital->atendimentoMedico ?? $sinalVital->atendimentoTriagem ?? $sinalVital->atendimentoEnfermagem ?? $sinalVital->pacienteObservacao )->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $sinalVital->created_at->format('d/m/Y H:i:s'), ]; } return $result; } private function getAvaliacaoAntropometrica($avaliacaoAntropometrica) { return [ 'massa' => $avaliacaoAntropometrica->massa ?? null, 'massa_unidade_medida_id' => $avaliacaoAntropometrica->massa_unidade_medida_id ?? UnidadeMedidaEnum::QUILOGRAMAS, 'massa_unidade_medida' => [ 'nome' => $avaliacaoAntropometrica->massaUnidadeMedida->nome ?? null, 'sigla' => $avaliacaoAntropometrica->massaUnidadeMedida->sigla ?? null, ], 'altura_tipo_medida_id' => $avaliacaoAntropometrica->altura_tipo_medida_id ?? TipoMedidaAlturaEnum::ESTATURA, 'altura' => $avaliacaoAntropometrica->altura ?? null, 'altura_tipo_medida' => [ 'nome' => $avaliacaoAntropometrica->alturaTipoMedida->nome ?? null, ], 'altura_unidade_medida_id' => $avaliacaoAntropometrica->altura_unidade_medida_id ?? UnidadeMedidaEnum::METROS, 'altura_unidade_medida' => [ 'nome' => $avaliacaoAntropometrica->alturaUnidadeMedida->nome ?? null, 'sigla' => $avaliacaoAntropometrica->alturaUnidadeMedida->sigla ?? null, ], 'imc' => [ 'imc' => $avaliacaoAntropometrica->imc['imc'] ?? null, 'classificacao' => $avaliacaoAntropometrica->imc['classificacao'] ?? null, ], ]; } private function getPcd($cidadao) { if ($cidadao->deficiencia_id === null) { return null; } $deficiencia = [ 'id' => $cidadao->deficiencia->id, 'deficiencia_base_id' => $cidadao->deficiencia->deficiencia_base_id, 'descricao' => $cidadao->deficiencia->descricao ]; if ($cidadao->deficiencia->deficiencia_base_id === Deficiencia::OUTRA) { $deficiencia['deficiencia_outro'] = $cidadao->deficiencia_outro; return $deficiencia; } return $deficiencia; } private function getProcedimentos($atendimento, $datetime, $origem = 'medico') { $procedimentos = $atendimento->procedimentos() ->with('procedimento', 'cidPrincipal') ->where('created_at', '<=', $datetime); if ($origem === 'medico') { $procedimentos->whereNotNull('atendimento_medico_id'); } else if ($origem === 'triagem') { $procedimentos->whereNotNull('atendimento_triagem_id'); } else if ($origem === 'enfermagem') { $procedimentos->whereNotNull('atendimento_enfermagem_id'); } else if ($origem === 'exame_imagem') { $procedimentos->whereNotNull('exame_imagem_id'); } else if ($origem === 'observacao') { $procedimentos->whereNotNull('paciente_observacao_id'); } $procedimentos = $procedimentos->orderBy('created_at')->get(); $result = []; foreach ($procedimentos as $procedimento) { $result[] = [ 'id' => $procedimento->id ?? null, 'lotacao' => [ 'ocupacao' => [ 'id' => $procedimento->createdLotacao->ocupacao->id ?? null, 'codigo' => $procedimento->createdLotacao->ocupacao->codigo ?? null, 'nome' => $procedimento->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $procedimento->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'procedimento' => $procedimento->procedimento, 'cid_principal' => $procedimento->cidPrincipal ?? null, 'quantidade' => $procedimento->quantidade ?? null, 'centro_custo' => [ 'setor' => [ 'nome' => $procedimento->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => ($procedimento->atendimentoMedico ?? $procedimento->atendimentoTriagem ?? $procedimento->atendimentoEnfermagem ?? $procedimento->pacienteObservacao )->classificacaoRisco->classificacaoRisco->nome ?? null, ], 'data_hora' => $procedimento->created_at->format('d/m/Y H:i:s'), ]; } if ($origem === 'medico') { $isReavaliacao = $atendimento->atendimentosMedico()->get()->isNotEmpty(); if (!$isReavaliacao) { $procedimentoParametrizado = $this->getProcedimentoParametrizado(); if ($procedimentoParametrizado) { $result[] = $procedimentoParametrizado; } } } return $result; } private function getProcedimentoParametrizado() { $centroCustoLogado = $this->getCentroCustoLogado(); $lotacao = $this->getLotacaoLogado(); $procedimentoParametrizado = ParametrizacaoAtendimentoMedico::first()->procedimento_padrao ?? null; if (is_null($procedimentoParametrizado)) { return null; } return [ 'id' => null, 'lotacao' => [ 'ocupacao' => [ 'id' => $lotacao->ocupacao->id ?? null, 'codigo' => $lotacao->ocupacao->codigo ?? null, 'nome' => $lotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $lotacao->usuario->cidadao->nome ?? null, ], ], 'procedimento' => [ 'id' => $procedimentoParametrizado->id, 'codigo' => $procedimentoParametrizado->codigo ?? null, 'nome' => $procedimentoParametrizado->nome ?? null, 'is_parametrizado' => true, ], 'cid_principal' => [ 'id' => null, 'codigo' => null, 'nome' => null, ], 'cid_secundario' => [ 'id' => null, 'codigo' => null, 'nome' => null, ], 'quantidade' => 1, 'centro_custo' => [ 'setor' => [ 'nome' => $centroCustoLogado->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => null, ], 'data_hora' => null, ]; } private function getServicosEnfermagem($atendimento) { $result = []; ServicoEnfermagem::where(function ($query) use ($atendimento) { $query ->whereHas('atendimentoMedico', function ($query) use ($atendimento) { $query->where('atendimento_id', $atendimento->id); }) ->orWhereHas('atendimentoEnfermagem', function ($query) use ($atendimento) { $query->where('atendimento_id', $atendimento->id); }); })->each(function ($servicoEnfermagem) use (&$result) { $result[] = [ 'id' => $servicoEnfermagem->id ?? null, 'status' => [ 'id' => $servicoEnfermagem->status_id, 'nome' => $servicoEnfermagem->status->nome, ], 'lotacao' => [ 'ocupacao' => [ 'id' => $servicoEnfermagem->createdLotacao->ocupacao->id ?? null, 'codigo' => $servicoEnfermagem->createdLotacao->ocupacao->codigo ?? null, 'nome' => $servicoEnfermagem->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $servicoEnfermagem->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'procedimento' => $servicoEnfermagem->procedimento, 'centro_custo' => [ 'setor' => [ 'nome' => $servicoEnfermagem->createdCentroCusto->setor->nome ?? null, ], ], 'classificacao_risco' => [ 'nome' => ($servicoEnfermagem->atendimentoMedico->classificacaoRisco ?? $servicoEnfermagem->atendimentoEnfermagem->classificacaoRisco )->classificacaoRisco->nome ?? null, ], 'data_hora' => $servicoEnfermagem->created_at->format('d/m/Y H:i:s'), 'observacoes' => $servicoEnfermagem->observacoes, ]; }); return $result; } private function getPedidoExame($atendimento) { $lotacaoLogado = $this->getLotacaoLogado(); $pedidosExames = []; foreach ($atendimento->atendimentosMedico as $atendimentoMedico) { foreach ($atendimentoMedico->pedidosExames as $pedidoExame) { $pedido = [ 'id' => $pedidoExame->id ?? null, 'urgente' => $pedidoExame->urgente ?? null, 'justificativa' => $pedidoExame->justificativa ?? null, 'data_solicitacao' => $pedidoExame->data_solicitacao ? $pedidoExame->data_solicitacao->format('d/m/Y') : $pedidoExame->created_at->format('d/m/Y H:i'), 'lotacao' => [ 'ocupacao' => [ 'codigo' => $pedidoExame->createdLotacao->ocupacao->codigo ?? null, ], 'profissional' => [ 'nome' => $pedidoExame->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'files' => $pedidoExame->laudos ->where('created_at', '>=', $pedidoExame->created_at) ->map(fn($laudo) => [ 'id' => $laudo->id, 'name' => $laudo->nome, 'hash' => $laudo->hash ]) ]; foreach ($pedidoExame->exames as $item) { $pedido['exames'][] = [ 'codigo' => $item->exame->codigo ?? null, 'nome' => $item->exame->nome ?? null, 'tipo_id' => $item->exame->tipo_id ?? null, 'status' => [ 'id' => $item->status->id ?? null, 'nome' => $item->status->nome ?? null, ], ]; } $pedidosExames[] = $pedido; } } return $pedidosExames; } private function getLotacaoLogado() { return Lotacao::findOrFail(auth()->payload()->get('lotacao_id')); } private function getEscalasComaGlasgow($atendimento) { return EscalaComaGlasgow::whereHas('pacienteObservacao', function($query) use ($atendimento) { $query->where('atendimento_id', $atendimento->id); })->orWhereHas('atendimentoTriagem', function($query) use ($atendimento) { $query->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($escalaComaGlasgow) use ($atendimento) { return array_merge( $this->getBaseHistoricoAreaAtendimento($escalaComaGlasgow, $atendimento), [ 'id' => $escalaComaGlasgow->id, 'pontuacao' => $this->getEscalaComaGlasgowPontuacao($escalaComaGlasgow), 'abertura_ocular' => $escalaComaGlasgow->aberturaOcular, 'resposta_verbal' => $escalaComaGlasgow->respostaVerbal, 'resposta_motora' => $escalaComaGlasgow->respostaMotora, 'reatividade_pupilar' => $escalaComaGlasgow->reatividadePupilar, 'observacoes' => $escalaComaGlasgow->observacao, 'resultado' => $this->getEscalaComaGlasgowResultado($escalaComaGlasgow), ] ); }); } private function getEscalaComaGlasgowResultado($escalaComaGlasgow) { $pontuacao = $this->getEscalaComaGlasgowPontuacao($escalaComaGlasgow); if ($escalaComaGlasgow->aberturaOcular->pontos === 0 || $escalaComaGlasgow->respostaVerbal->pontos === 0 || $escalaComaGlasgow->respostaMotora->pontos === 0) { return 'A pontuação não pode ser calculada. Um ou mais itens não foram testados'; } $glasgowInterpretacaoResultado = GlasgowInterpretacaoResultado::all(); $result = $glasgowInterpretacaoResultado->filter(function ($glasgowInterpretacaoResultado, $key) use ($pontuacao) { return $pontuacao >= $glasgowInterpretacaoResultado->min && $pontuacao <= ($glasgowInterpretacaoResultado->max ?? PHP_INT_MAX); })->first(); return $result->descricao; } private function getEscalaComaGlasgowPontuacao($escalaComaGlasgow) { $result = $escalaComaGlasgow->aberturaOcular->pontos + $escalaComaGlasgow->respostaVerbal->pontos + $escalaComaGlasgow->respostaMotora->pontos - $escalaComaGlasgow->reatividadePupilar->pontos; return $result; } private function getGlasgowAberturaOcular() { return GlasgowAberturaOcular::all() ->map(function ($aberturaOcular) { return [ 'id' => $aberturaOcular->id, 'descricao' => $aberturaOcular->descricao, 'pontos' => $aberturaOcular->pontos, ]; }); } private function getGlasgowReatividadePupilar() { return GlasgowReatividadePupilar::all() ->map(function ($reatividadePupilar) { return [ 'id' => $reatividadePupilar->id, 'descricao' => $reatividadePupilar->descricao, 'pontos' => $reatividadePupilar->pontos, ]; }); } private function getGlasgowRespostaMotora() { return GlasgowRespostaMotora::all() ->map(function ($respostaMotora) { return [ 'id' => $respostaMotora->id, 'descricao' => $respostaMotora->descricao, 'pontos' => $respostaMotora->pontos, ]; }); } private function getGlasgowRespostaVerbal() { return GlasgowRespostaVerbal::all() ->map(function ($respostaVerbal) { return [ 'id' => $respostaVerbal->id, 'descricao' => $respostaVerbal->descricao, 'pontos' => $respostaVerbal->pontos, ]; }); } private static function getCaracteristicaDor() { $caracteristicasEnum = [ DorToracicaEnum::CONTRICAO, DorToracicaEnum::QUEIMACAO, DorToracicaEnum::COMPRESSAO, DorToracicaEnum::PESO, DorToracicaEnum::DOR_SURDA ]; $result = OrigemDorToracica::whereIn('id', $caracteristicasEnum) ->orderBy('nome') ->get() ->map(fn ($dorToracica) => [ 'id' => $dorToracica->id, 'nome' => $dorToracica->nome, ]); return $result; } private static function getLocalizacaoDor() { $caracteristicasEnum = [ DorToracicaEnum::RETROESTERNAL, DorToracicaEnum::MSE, DorToracicaEnum::FACE, DorToracicaEnum::PESCOCO, DorToracicaEnum::DENTES, DorToracicaEnum::INTER_ESCAPULAR, DorToracicaEnum::EPIGASTRICA, ]; $result = OrigemDorToracica::whereIn('id', $caracteristicasEnum) ->orderBy('nome') ->get() ->map(fn ($dorToracica) => [ 'id' => $dorToracica->id, 'nome' => $dorToracica->nome, ]); return $result; } private static function getFatorDesencadeante() { $caracteristicasEnum = [ DorToracicaEnum::EXERCICIO, DorToracicaEnum::EXCITACAO, DorToracicaEnum::ESTRESSE, DorToracicaEnum::FRIO, DorToracicaEnum::REFEICOES_COPIOSAS, ]; $result = OrigemDorToracica::whereIn('id', $caracteristicasEnum) ->orderBy('nome') ->get() ->map(fn ($dorToracica) => [ 'id' => $dorToracica->id, 'nome' => $dorToracica->nome, ]); return $result; } private static function getFatoresRiscoToracica() { $caracteristicasEnum = [ DorToracicaEnum::HAS, DorToracicaEnum::DM, DorToracicaEnum::DISLIPIDEMIA, DorToracicaEnum::HISTORIA_FAMILIAR, DorToracicaEnum::IDADE_MAIOR_SESSENTA, DorToracicaEnum::OBESIDADE, DorToracicaEnum::TABAGISMO, DorToracicaEnum::REVASCULARIZADO_PREVIO, ]; $result = OrigemDorToracica::whereIn('id', $caracteristicasEnum) ->orderBy('nome') ->get() ->map(fn ($dorToracica) => [ 'id' => $dorToracica->id, 'nome' => $dorToracica->nome, ]); return $result; } private static function getDuracaoDor() { $result = OrigemDorToracica::orderBy('id') ->whereIn('id', [DorToracicaEnum::DURACAO_DA_DOR, DorToracicaEnum::DURACAO_DA_DOR_MAIOR_10_MINUTOS]) ->get() ->map(fn ($duracao) => [ 'id' => $duracao->id, 'nome' => $duracao->nome, ]); return $result; } }