json( [ 'additionals' => [ 'plantao_id' => $plantao->id ?? null, 'plantao_faixa_etaria_id' => $plantao->faixa_etaria_id ?? null, ], ], Response::HTTP_OK ); } public function create($id) { $this->auth(__FUNCTION__); $atendimento = Atendimento::where('fila_id', $id) ->orderBy('created_at', 'desc') ->firstOrFail(); $classificacaoRisco = $atendimento->classificacoesRisco->sortByDesc('created_at')->first(); $faa = $atendimento->faa; $parecerMedico = $faa->raat && $faa->raat->pareceresMedico ? $faa->raat->pareceresMedico()->orderByDesc('created_at')->first() : []; $classificacaoRisco = $this->getClassificacaoRisco($atendimento); if($atendimento->faa->paciente->cidadao->sexo_id === Sexo::FEMININO && $atendimento->faa->paciente->cidadao->idade && $atendimento->faa->paciente->cidadao->idade['anos'] >= 9 && $atendimento->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; } $formularioRelacionadoDor = RelacionadoFormularioDorToracica::where('formulario_id', $formulario_id)->get(); $dorToracicaRelacionada = []; foreach ($formularioRelacionadoDor as $registroRelacionado) { $dorToracicaRelacionada[] = $registroRelacionado->dor_toracica_id; } } return response()->json( [ 'form' => [ 'atendimento_medico' => $this->hasAtendimentoMedico($atendimento), 'encaminhamento_setores' => $this->getSetoresEncaminhamento(), 'alergia_tipos' => $this->getAlergiaTipos(), 'alergia_criticidades' => $this->getAlergiaCriticidades(), 'dataAtual' => Carbon::now()->format('d/m/Y'), 'atendimento_id' => $atendimento->id ?? null, 'statusExame' => ExameStatus::orderBy('nome')->get(), 'lotacao' => $this->getLotacao(), 'classificacoes_risco' => $this->getClassificacoesRisco(), 'paciente' => $this->getPaciente($atendimento), 'recepcao' => [ 'motivo_atendimento' => $atendimento->recepcao->motivo_atendimento ?? null, 'is_encaminhamento' => $atendimento->recepcao->is_encaminhamento, 'origem_unidade_encaminhamento' => $atendimento->recepcao->origem_unidade_encaminhamento, 'unidade_encaminhamento' => Unidade::find($atendimento->recepcao->unidade_encaminhamento_id), 'unidade_externa_encaminhamento' => UnidadeExterna::find($atendimento->recepcao->unidade_externa_encaminhamento_id), 'medico_solicitante_encaminhamento' => $atendimento->recepcao->medico_solicitante_encaminhamento, ], 'origens_unidade' => [ [ 'id' => OrigemUnidadeEncaminhamento::INTERNA, 'nome' => 'INTERNA' ], [ 'id' => OrigemUnidadeEncaminhamento::EXTERNA, 'nome' => 'EXTERNA' ], ], 'raat' => RaatService::getOptionsParecerMedico(), 'observacoes' => $this->getObservacoes($atendimento), 'pedidos_exames' => $this->getPedidosExames($atendimento, true), 'fatores_risco' => $this->getFatoresRisco(), 'fatores_risco_gestante' => $this->getFatoresRiscoGestante(), 'sinais_vitais' => $this->getSinaisVitais($atendimento, Carbon::now()), 'unidades_medida' => $this->getUnidadesMedida(), 'medicos_com_plantao' => $this->getMedicosComPlantao(), '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(), ], ], 'model' => [ 'dor_toracica' => $atendimento->dor_toracica, 'centro_custo_id_para' => null, 'alergias' => $this->getAlergiasCidadao($atendimento), 'medicamentos_uso_continuo' => $this->getMedicamentosUsoContinuo($atendimento, Carbon::now()), 'pedidos_exames' => $this->getPedidosExames($atendimento), 'observacoes' => null, 'fatores_risco' => $this->getCidadaoFatoresRisco($atendimento), 'fator_risco_outro' => optional(optional(optional($atendimento->faa)->paciente)->cidadao)->fator_risco_outro, 'sinais_vitais' => [], 'exibirFatorRiscoGestante' => $exibirFatorRiscoGestante, 'acidente_trabalho' => AcidenteTrabalhoService::getAcidenteTrabalho($atendimento->faa), 'classificacao_risco_id' => $classificacaoRisco['classificacao_risco_id'] ?? 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, ], 'additionals' => [ 'has_atendimento_medico' => $this->hasAtendimentoMedico($atendimento), 'is_paciente_em_observacao' => $this->isPacienteEmObservacao($atendimento), 'timeline' => AtendimentoService::getTimelineItems($id), ] ], Response::HTTP_OK ); } private function getObservacoes($atendimento) { return $atendimento->observacoes->map(function ($observacao) { return [ 'descricao' => $observacao->descricao, 'lotacao' => [ 'ocupacao' => [ 'id' => $observacao->createdLotacao->ocupacao->id ?? null, 'codigo' => $observacao->createdLotacao->ocupacao->codigo ?? null, 'nome' => $observacao->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $observacao->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $observacao->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $observacao->created_at->format('d/m/Y H:i:s') ?? null, ]; }); } 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 hasAtendimentoMedico($atendimento) { return $atendimento->atendimentosMedico->count() > 0; } private function isPacienteEmObservacao($atendimento) { return ($atendimento->fila->centroCusto->setor->tipo_id ?? null) === SetorTipo::OBSERVACAO; } private function getSetoresEncaminhamento() { return Encaminhamento::where('centro_custo_id_de', $this->getCentroCustoLogado()->id) ->whereHas('centroCustoPara', function ($query) { $query->whereHas('setor', function ($query) { $query->whereNotIn('tipo_id', [SetorTipo::RECEPCAO, SetorTipo::TRIAGEM]); }); }) ->get() ->map(function($query) { return [ 'id' => $query->centroCustoPara->id, 'nome' => $query->centroCustoPara->setor->nome, ]; }); } private function getCentroCustoLogado() : CentroCusto { return CentroCusto::findOrFail(auth()->payload()->get('centro_custo_id')); } private function getAlergiaTipos() { return AlergiaTipo::all()->map(function($query) { return [ 'id' => $query->id, 'descricao' => $query->descricao, ]; }); } private function getAlergiaCriticidades() { return AlergiaCriticidade::all()->map(function($query) { return [ 'id' => $query->id, 'nome' => $query->nome, ]; }); } private function getAlergiasCidadao($atendimento) { return $atendimento->faa->paciente->cidadao->alergias ->map(function($query, $i) { return [ 'index' => $i, 'alergia' => [ 'id' => $query->cidadaoAlergia->alergia_id, 'agente_substancia_especifica' => $query->agente_substancia_especifica, 'criticidade' => [ 'id' => $query->cidadaoAlergia->criticidade->id, 'nome' => $query->cidadaoAlergia->criticidade->nome, ], 'reacoes_observacoes' => $query->cidadaoAlergia->reacoes_observacoes, 'tipo' => [ 'id' => $query->tipo->id, 'descricao' => $query->tipo->descricao, ] ], 'lotacao' => [ 'ocupacao' => [ 'id' => $query->cidadaoAlergia->createdLotacao->ocupacao->id ?? null, 'codigo' => $query->cidadaoAlergia->createdLotacao->ocupacao->codigo ?? null, 'nome' => $query->cidadaoAlergia->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $query->cidadaoAlergia->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $query->cidadaoAlergia->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $query->cidadaoAlergia->created_at->format('d/m/Y H:i:s') ?? null, ]; }); } public function store(PedidoExameRequest $request) { $this->auth(__FUNCTION__); $pedidoExameImagem = new PedidoExame; DB::transaction(function() use ($pedidoExameImagem, $request) { PlantaoService::setStatusComAtendimento($request->plantao_id); $atendimento = Atendimento::findOrFail($request['atendimento_id']); $atendimentoExameImagem = $atendimento->atendimentosExameImagem() ->create(['is_observacao' => $this->isPacienteEmObservacao($atendimento)]); $this->handlePedidosExames($atendimentoExameImagem, $request->pedidos_exames, $request->plantao_id); $params = $request->all(); if ($params['fatores_risco'] ?? null) { $atendimento->faa->paciente->cidadao->fatoresRisco()->sync($request->fatores_risco); $this->handleFatorRiscoOutro($atendimento, $request); } $sinaisVitaisData = $this->prepareSinaisVitaisData($params, $atendimentoExameImagem); if (!empty($sinaisVitaisData)) { $atendimento->sinaisVitais()->createMany($sinaisVitaisData); } $atendimento->faa->paciente->cidadao->medicamentosUsoContinuo()->sync($this->prepareMedicamentosUsoContinuoData($params)); if (isset($params['observacoes'])) { $atendimento->observacoes()->create([ 'exame_imagem_id' => $atendimentoExameImagem->id, 'descricao' => $params['observacoes'] ]); } if (isset($params['finalizacao'])) { $atendimento->faa->update([ 'desfecho_id' => $params['finalizacao']['desfecho_id'], 'finalizado' => true, 'usuario_id' => $atendimentoExameImagem->createdLotacao->usuario_id, 'lotacao_id' => $atendimentoExameImagem->createdLotacao->id, 'data_hora_desfecho' => $atendimentoExameImagem->created_at ]); FilaService::dispatch($atendimento->fila->centroCusto); } else { if (!$atendimento->recepcao->is_encaminhamento || $atendimento->recepcao->is_encaminhamento && $atendimento->atendimentosMedico->count() > 0) { if (isset($params['centro_custo_id_para'])) { FilaService::forward([ 'centro_custo_id_para' => $params['centro_custo_id_para'] ], $atendimento->fila_id); } } } }); return response()->json($pedidoExameImagem->fresh(), Response::HTTP_CREATED); } private function handlePedidosExames($atendimentoExameImagem, $pedidosExamesRequested, $plantaoId) { $pedidoExamesAllowedChange = collect( $this->getPedidosExames($atendimentoExameImagem->atendimento) ); foreach (($pedidosExamesRequested ?? []) as $pedidoExamesRequested) { $isForm = $pedidoExamesRequested['is_form']; $pedidoExameRequestedId = $pedidoExamesRequested['id'] ?? null; if (is_null($pedidoExameRequestedId)) { $pedidoExamesData = $this->preparePedidoExamesData($atendimentoExameImagem, $pedidoExamesRequested, $plantaoId); if (!empty($pedidoExamesData)) { $pedidoExames = $atendimentoExameImagem->pedidosExames()->create($pedidoExamesData); $this->storePedidoExamesItens($pedidoExames, $pedidoExamesData['exames'], $atendimentoExameImagem); if(count($pedidoExamesData['files'] ?? []) > 0) { $this->storeFiles($pedidoExames, $pedidoExamesData['files'], $atendimentoExameImagem); } } continue; } if (!is_numeric($pedidoExameRequestedId)) { continue; } if (!$isForm && !$pedidoExamesAllowedChange->pluck('id')->contains($pedidoExameRequestedId)) { throw new PedidoExameCannotChangeStatusException; } if (!$isForm) { $this->requestedPedidoExamesAllowChangeStatus($pedidoExamesRequested, $pedidoExamesAllowedChange); } $pedidoExames = PedidoExame::findOrFail($pedidoExameRequestedId); $pedidoExames->plantao_id = $pedidoExames->plantao_id ?? $plantaoId; if (!$isForm) { foreach (($pedidoExamesRequested['exames']) as $item) { if ($item['disabled']) { continue; } $pedidoItem = $pedidoExames->exames->firstWhere('id', $item['id']); if ($pedidoItem->status_id != ($item['status_id'] ?? ExameStatusEnum::SOLICITADO)) { $pedidoItem->exame_imagem_id = $atendimentoExameImagem->id; $pedidoItem->status_id = $item['status_id'] ?? ExameStatusEnum::SOLICITADO; $pedidoItem->horario_realizacao = $item['horario_realizacao'] ?? null; $pedidoItem->save(); if ($item['status_id'] == ExameStatusEnum::REALIZADO) { $this->addProcedimento($pedidoItem->fresh(), $atendimentoExameImagem); } $this->storeItemObservacao($pedidoItem, $item['observacao'] ?? null); } } } if(count($pedidoExamesRequested['files'] ?? []) > 0) { $this->storeFiles($pedidoExames, $pedidoExamesRequested['files'], $atendimentoExameImagem); } $pedidoExames->save(); } } 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 prepareSinaisVitaisData($params, $atendimentoExameImagem) { $sinaisVitaisData = []; foreach (($params['sinais_vitais'] ?? []) as $sinaisVitais) { $sinaisVitaisData[] = [ 'atendimento_exame_imagem_id' => $atendimentoExameImagem->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 prepareMedicamentosUsoContinuoData(array $params) : array { $medicamentos = []; foreach (($params['medicamentos_uso_continuo'] ?? []) as $medicamento) { $medicamentos[] = $medicamento['medicamento_id']; } return $medicamentos; } private function addProcedimento($pedidoItem, $atendimentoExameImagem, $lotacaoExecutanteId = null) { $procedimento = $atendimentoExameImagem->atendimento->procedimentos() ->where('procedimento_id', $pedidoItem->exame->procedimento->id) ->first(); if (is_null($procedimento)) { $lotacaoId = null; if ($pedidoItem->pedidoExame->atendimentoMedico) { $lotacaoId = $pedidoItem->pedidoExame->atendimentoMedico->created_lotacao_id; } else { $lotacaoId = $lotacaoExecutanteId; } $atendimentoExameImagem->atendimento->procedimentos()->create([ 'lotacao_id' => $lotacaoId, 'exame_imagem_id' => $atendimentoExameImagem->id, 'procedimento_id' => $pedidoItem->exame->procedimento->id, 'quantidade' => 1, ]); } else { $procedimento->quantidade += 1; $procedimento->save(); } } private function getPedidosExames($atendimento, $isForm = false) { $result = []; foreach ($atendimento->pedidosExames as $pedidoExames) { $exames = $this->getExamesPedidoExames($pedidoExames, $isForm); $dataPedido = [ 'id' => $pedidoExames->id, 'urgente' => $pedidoExames->urgente, 'data_solicitacao' => $pedidoExames->data_solicitacao ? $pedidoExames->data_solicitacao->format('d/m/Y') : $pedidoExames->created_at->format('d/m/Y H:i'), 'medico_solicitante_encaminhamento' => $pedidoExames->medico_solicitante_encaminhamento, 'unidade_encaminhamento' => Unidade::find($pedidoExames->unidade_encaminhamento_id) ?? UnidadeExterna::find($pedidoExames->unidade_externa_encaminhamento_id) ?? null, "centro_custo" => [ "infraestrutura" => $pedidoExames->createdLotacao->infraestrutura->unidade->nome_fantasia, "setor" => $pedidoExames->createdCentroCusto->setor->nome ], 'lotacao' => [ 'ocupacao' => [ 'codigo' => $pedidoExames->createdLotacao->ocupacao->codigo, 'nome' => $pedidoExames->createdLotacao->ocupacao->nome ], 'profissional' => [ 'nome' => $pedidoExames->createdLotacao->usuario->cidadao->nome, ] ], 'justificativa' => $pedidoExames->justificativa, 'exames' => $exames, 'files' => $pedidoExames->laudos ->where('created_at', '>=', $pedidoExames->created_at) ->map(fn($laudo) => [ 'id' => $laudo->id, 'name' => $laudo->nome, 'hash' => $laudo->hash ]) ]; if ($isForm && !$this->hasExamesImagemSolicitadosOrAguardandoResultado($pedidoExames)) { $result[] = $dataPedido; } if (!$isForm && $this->hasExamesImagemSolicitadosOrAguardandoResultado($pedidoExames)) { $result[] = $dataPedido; } } return $result; } 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 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 getUnidadesMedida() { return UnidadeMedida::all()->map(function($query) { return [ 'id' => $query->id, 'nome' => $query->nome, 'sigla' => $query->sigla, ]; }); } 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 requestedPedidoExamesAllowChangeStatus($pedidoExamesRequested, $pedidoExamesAllowedChange) { $pedidoExamesAllowedIds = $pedidoExamesAllowedChange ->firstWhere('id', $pedidoExamesRequested['id'])['exames']->pluck('exame.id', 'id'); foreach ($pedidoExamesRequested['exames'] as $item) { $exameIdAllowed = $pedidoExamesAllowedIds[$item['id']]; if ($exameIdAllowed != $item['exame_id']) { throw new PedidoExameItemCannotChangeStatusException; } } } private function preparePedidoExamesData($atendimentoExameImagem, $pedidoExames, $plantaoId) { $result = [ 'atendimento_id' => $atendimentoExameImagem->atendimento->id, 'data_solicitacao' => Carbon::createFromFormat('d/m/Y', $pedidoExames['data_solicitacao']) ?? null, 'unidade_encaminhamento_id' => $pedidoExames['unidade_encaminhamento_id'] ?? null, 'unidade_externa_encaminhamento_id' => $pedidoExames['unidade_externa_encaminhamento_id'] ?? null, 'medico_solicitante_encaminhamento' => $pedidoExames['medico_solicitante_encaminhamento'] ?? null, 'plantao_id' => $plantaoId, 'urgente' => $pedidoExames['urgente'], 'justificativa' => $pedidoExames['justificativa'], 'files' => $pedidoExames['files'] ?? [], 'exames' => [], ]; foreach ($pedidoExames['exames'] as $item) { $result['exames'][] = [ 'exame_imagem_id' => $atendimentoExameImagem->id, 'disabled' => $item['disabled'], 'exame_id' => $item['exame_id'], 'status_id' => $item['status_id'] ?? ExameStatusEnum::SOLICITADO, 'observacao' => $item['observacao'] ?? null, 'horario_realizacao' => $item['horario_realizacao'] ?? null, 'lotacao_executante_id' => $pedidoExames['lotacao_executante_id'] ?? null, ]; } return $result; } private function storePedidoExamesItens($pedidoExames, $itens, $atendimentoExameImagem) { foreach ($itens as $item) { $pedidoItem = $pedidoExames->exames()->create($item); if ($item['status_id'] == ExameStatusEnum::REALIZADO) { $this->addProcedimento($pedidoItem, $atendimentoExameImagem, $item['lotacao_executante_id']); } $this->storeItemObservacao($pedidoItem, $item['observacao'] ?? null); } } private function storeFiles($pedidoExame, $files, $atendimentoExameImagem) { $laudoService = new LaudoService(); $laudoService->storeFile($pedidoExame, $files, ['exame_imagem_id' => $atendimentoExameImagem->id]); } private function storeItemObservacao($item, $observacao) { if (!is_null($observacao ?? null)) { $item->observacoes()->create([ 'observacao' => $observacao ]); } } private function getLotacao() { $lotacao = $this->getLotacaoLogado(); return [ 'ocupacao' => [ 'codigo' => $lotacao->ocupacao->codigo, 'nome' => $lotacao->ocupacao->nome, ], 'profissional' => [ 'id' => $lotacao->usuario->id, 'nome' => $lotacao->usuario->cidadao->nome, ], ]; } private function getLotacaoLogado() { return Lotacao::findOrFail(auth()->payload()->get('lotacao_id')); } private function getClassificacoesRisco() { return ClassificacaoRisco::all()->map(function($query) { return [ 'id' => $query->id, 'nome' => $query->nome, 'cor' => $query->tipo->cor, 'cor_nome' => $query->tipo->cor_nome, ]; }); } private function getPaciente($atendimento) { return [ '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, 'idade' => $atendimento->faa->paciente->cidadao->idade, 'sexo' => $atendimento->faa->paciente->cidadao->sexo, 'pcd' => $this->getPcd($atendimento->faa->paciente->cidadao) ]; } 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 getExamesPedidoExames($pedidoExames, $isForm) { $result = []; $itens = $pedidoExames->exames(); return $itens->get() ->map(function ($item) { $anoMes = $item->data_solicitacao ? $item->data_solicitacao->format('Ym') : $item->created_at->format('Ym'); $competencias = Competencia::orderByDesc('valor')->take(4)->get(); $competencia = $competencias->firstWhere('valor', $anoMes); if (is_null($competencia)) { $competencia = $competencias->first(); }; if ($item->exame->procedimento) $procedimentoServiceValidation = new ProcedimentoValidationService( Procedimento::where('codigo', $item->exame->procedimento->codigo) ->where('competencia_id', $competencia->id) ->first() ); $disabled = $item->status_id === ExameStatusEnum::REALIZADO || $item->status_id === ExameStatusEnum::NAO_REALIZADO || $item->exame->tipo_id === ExameTipo::LABORATORIAL; return [ 'id' => $item->id, 'disabled' => $disabled, 'horario_realizacao' => $item->horario_realizacao, 'exame' => [ 'id' => $item->exame->id, 'nome' => $item->exame->nome, 'observacao' => $item->exame->observacao, 'tipo' => [ 'id' => $item->exame->tipo->id, 'nome' => $item->exame->tipo->nome, ], 'procedimento' => [ 'codigo' => $item->exame->procedimento->codigo ?? null, 'nome' => $item->exame->procedimento->nome ?? null, ], ], 'status' => [ 'id' => $item->status->id, 'nome' => $item->status->nome, ], ]; }); } private function hasExamesImagemSolicitadosOrAguardandoResultado($pedidoExames) { foreach($pedidoExames->exames as $item) { if($item->exame->tipo_id === ExameTipo::IMAGEM) { if($item->status_id === ExameStatusEnum::SOLICITADO) { return true; } else if($item->status_id === ExameStatusEnum::AGUARDANDO_RESULTADO) { return true; } } } return false; } private function getClassificacaoRisco($atendimento) { if (is_null($atendimento)) { return null; } $classificacaoRisco = $atendimento->classificacoesRisco() ->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 getMedicosComPlantao() { $currentCentroCusto = self::getCurrentCentroCusto(); return DB::table('cadastro_usuario') ->select([ 'cadastro_lotacao.id', DB::raw("CONCAT(cadastro_cidadao.nome, ' - ', ocupacao.nome) AS descricao"), 'ocupacao.codigo AS cbo', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('pronto_atendimento_plantao', 'pronto_atendimento_plantao.lotacao_id', 'cadastro_lotacao.id') ->whereNull('pronto_atendimento_plantao.deleted_at') ->whereIn('pronto_atendimento_plantao.status_id', [Status::CONFIRMADO, Status::COM_ATENDIMENTO_AGENDADO]) ->where('pronto_atendimento_plantao.servico_id', Servico::CONSULTA_MEDICA) ->whereRaw('pronto_atendimento_plantao.inicio <= CURRENT_TIMESTAMP') ->whereRaw('pronto_atendimento_plantao.fim >= CURRENT_TIMESTAMP') ->where('cadastro_lotacao.infraestrutura_id', $currentCentroCusto->infraestrutura_id) ->get(); } private static function getCaracteristicaDor() { $caracteristicasEnum = [ DorToracicaEnum::CONTRICAO, DorToracicaEnum::QUEIMACAO, DorToracicaEnum::COMPRESSAO, DorToracicaEnum::PESO, DorToracicaEnum::DOR_SURDA ]; $result = OrigemDorToracica::whereIn('id', $caracteristicasEnum) ->orderBy('id') ->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('id') ->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('id') ->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('id') ->get() ->map(fn ($dorToracica) => [ 'id' => $dorToracica->id, 'nome' => $dorToracica->nome, ]); return $result; } private static function getDuracaoDor() { $result = OrigemDorToracica::orderBy('id') ->where('id', '=', DorToracicaEnum::DURACAO_DA_DOR) ->get() ->map(fn ($duracao) => [ 'id' => $duracao->id, 'nome' => $duracao->nome, ]); return $result; } }