exame_id) { $exame = Exame::findOrFail(request()->exame_id); if (is_null($exame->validade)) { return false; } } else if (request()->codigo_procedimento) { $exame = Exame::where('codigo', request()->codigo_procedimento)->first(); if (!$exame || is_null($exame->validade)) { return false; } } else { return false; } $pacienteId = request()->paciente_id; $ultimaSolicitacaoAmbulatorial = DB::table('ambulatorio_atendimento_soap_solicitacao_exame_item as item') ->join('ambulatorio_atendimento_soap_solicitacao_exame as solicitacao', 'solicitacao.id', 'item.solicitacao_exame_id') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'solicitacao.soap_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->join('parametrizacao_exame as exame', 'exame.id', 'item.exame_id') ->leftJoin('regulacao_solicitacao', 'regulacao_solicitacao.soap_id', 'soap.id') ->leftJoin('regulacao_status as regulacaoStatus', 'regulacaoStatus.id', 'regulacao_solicitacao.status_id') ->where('soap.is_rascunho', false) ->where(function ($q) { $q->whereNull('regulacaoStatus.tipo_id') ->orWhere('regulacaoStatus.tipo_id', '!=', RegulacaoStatusTipo::CANCELADO); }) ->where('atendimento.paciente_id', $pacienteId) ->when(request()->exame_id, fn ($q, $id) => $q->where('item.exame_id', $id)) ->when(request()->codigo_procedimento, fn ($q, $codigo) => $q->where('exame.codigo', $codigo)) ->select('item.created_at') ->orderByDesc('item.created_at') ->first(); $ultimaSolicitacaoLaboratorio = DB::table('exame_laboratorial_agendamento as a') ->join('exame_laboratorial_agendamento_exame as ae', 'ae.agendamento_id', 'a.id') ->join('parametrizacao_exame as exame', 'exame.id', 'ae.exame_id') ->where('a.paciente_id', $pacienteId) ->when(request()->exame_id, fn ($q, $id) => $q->where('ae.exame_id', $id)) ->when(request()->codigo_procedimento, fn ($q, $codigo) => $q->where('exame.codigo', $codigo)) ->select('a.data as created_at') ->orderByDesc('a.data') ->first(); $datas = collect([ optional($ultimaSolicitacaoAmbulatorial)->created_at, optional($ultimaSolicitacaoLaboratorio)->created_at, ])->filter()->map(fn ($d) => new Carbon($d)); if ($datas->isEmpty()) { return false; } $dataMaisRecente = $datas->sortDesc()->first()->startOfDay(); return Carbon::today()->diff($dataMaisRecente)->days <= $exame->validade; } public static function encaminhamentoPendente() { $ultimaSolicitacao = DB::table('regulacao_solicitacao as solicitacao') ->join('regulacao_solicitacao_item as item', 'item.solicitacao_id', 'solicitacao.id') ->join('regulacao_status as status', 'status.id', 'solicitacao.status_id') ->where('item.especialidade_id', request()->especialidade_id) ->where('solicitacao.paciente_id', request()->paciente_id) ->whereNotIn('status.tipo_id', [RegulacaoStatusTipo::CANCELADO, RegulacaoStatusTipo::FALTA, RegulacaoStatusTipo::REALIZADO]) ->select('solicitacao.created_at') ->first(); if (is_null($ultimaSolicitacao)) { return false; } return true; } public static function uploadImagem() { $images = request()->file('images'); $ids = request()->input('ids'); if (!$images || !$ids) { return response()->json(['error' => 'Nenhuma imagem ou ID recebido.'], 400); } if (count($images) !== count($ids)) { return response()->json(['error' => 'Número de imagens e IDs não corresponde.'], 400); } foreach ($images as $index => $image) { $feridaId = $ids[$index]; if (!$image->isValid()) { continue; } $arquivo = Str::uuid() . '.' . $image->getClientOriginalExtension(); $soapFeridaId = AtendimentoSoapFerida::where('id_old', $feridaId) ->value('id'); $imagem = new AtendimentoSoapFeridaImagem(); $imagem->soap_ferida_id = $soapFeridaId; $imagem->arquivo = $arquivo; $imagem->save(); $path = Storage::path('ambulatorio' . DIRECTORY_SEPARATOR . 'feridas' . DIRECTORY_SEPARATOR . app('config')->get('database.default')); if (file_exists($path) === false) { File::makeDirectory($path, 0777, true, true); } $image->move($path, $arquivo); } } public static function destroy($id) { $imagem = AtendimentoSoapFeridaImagem::findOrFail($id); if(Storage::exists('ambulatorio' . DIRECTORY_SEPARATOR . 'feridas' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . $imagem->arquivo)){ Storage::delete('ambulatorio' . DIRECTORY_SEPARATOR . 'feridas' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . $imagem->arquivo); } AtendimentoSoapFeridaImagem::findOrFail($id)->delete(); } public static function prescricaoMedicamento() { $ultimaSolicitacao = DB::table('ambulatorio_atendimento_soap_prescricao_medicamento as solicitacao') ->join('ambulatorio_atendimento_soap_prescricao_medicamento_item as item', 'item.prescricao_medicamento_id', 'solicitacao.id') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'solicitacao.soap_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->join('painel_senha_fila as fila', 'fila.id', 'atendimento.fila_id') ->join('cadastro_material as material', 'material.id', 'item.material_id') ->join('cadastro_via_administracao', 'cadastro_via_administracao.id', 'material.via_administracao_id') ->leftJoin('cadastro_unidade_medida as um', 'um.id', '=', 'item.unidade_medida_id') ->leftJoin('geral_medida_tempo as imt', 'imt.id', '=', 'item.intervalo_medida_tempo_id') ->leftJoin('geral_medida_tempo as gmt', 'gmt.id', '=', 'item.duracao_medida_tempo_id') ->leftJoin('geral_turno as t', 't.id', '=', 'item.turno_id') ->where('fila.paciente_id', request()->paciente_id) ->where('item.material_id', request()->medicamento_id) ->where(function ($q) { $q->where(function ($q2) { $q2->where('item.is_dose_unica', true) ->whereDate('item.inicio', '<=', now()); }) ->orWhere(function ($q2) { $q2->where('item.is_dose_unica', false) ->whereRaw(" CASE WHEN item.duracao_medida_tempo_id = ? THEN DATE_ADD(item.inicio, INTERVAL item.duracao DAY) WHEN item.duracao_medida_tempo_id = ? THEN DATE_ADD(item.inicio, INTERVAL item.duracao WEEK) WHEN item.duracao_medida_tempo_id = ? THEN DATE_ADD(item.inicio, INTERVAL item.duracao MONTH) ELSE item.inicio END >= NOW() ", [ MedidaTempoEnum::DIAS, MedidaTempoEnum::SEMANAS, MedidaTempoEnum::MESES, ]); }); }) ->select( 'item.id', 'item.created_at', DB::raw(" CASE WHEN item.is_dose_unica = 1 THEN 'Sim' ELSE 'Não' END as is_dose_unica "), DB::raw(" CASE WHEN item.is_uso_continuo = 1 THEN 'Sim' ELSE 'Não' END as is_uso_continuo "), DB::raw("DATE_FORMAT(item.inicio, '%d/%m/%Y') as inicio"), 'material.receita_tipo_id', 'item.duracao_medida_tempo_id', 'gmt.nome as duracao_medida_tempo', 'item.duracao', 'item.recomendacoes', 'material.descricao as material', 'cadastro_via_administracao.nome as materialViaAdministracao', DB::raw(" DATE_FORMAT( CASE WHEN item.is_dose_unica = 1 THEN item.inicio WHEN item.duracao_medida_tempo_id = " . MedidaTempoEnum::DIAS . " THEN DATE_ADD(item.inicio, INTERVAL item.duracao DAY) WHEN item.duracao_medida_tempo_id = " . MedidaTempoEnum::SEMANAS . " THEN DATE_ADD(item.inicio, INTERVAL item.duracao WEEK) WHEN item.duracao_medida_tempo_id = " . MedidaTempoEnum::MESES . " THEN DATE_ADD(item.inicio, INTERVAL item.duracao MONTH) ELSE item.inicio END, '%d/%m/%Y' ) as data_conclusao "), DB::raw(" CASE WHEN item.is_dose_unica = 1 THEN CONCAT(item.dose, ' dose única') WHEN item.frequencia_vezes IS NOT NULL THEN CONCAT( item.dose, COALESCE(CONCAT(' ', um.nome), ' (dose)'), ', ', item.frequencia_vezes, ' vez(es)', CASE WHEN item.intervalo = 1 AND item.intervalo_medida_tempo_id = " . MedidaTempoEnum::DIAS . " THEN ' ao dia' ELSE CONCAT(' a cada ', item.intervalo, ' ', imt.nome) END ) WHEN item.turno_id IS NOT NULL THEN CONCAT( item.dose, COALESCE(CONCAT(' ', um.nome), ' (dose)'), ', pela ', t.nome, CASE WHEN NOT (item.intervalo = 1 AND item.intervalo_medida_tempo_id = " . MedidaTempoEnum::DIAS . ") THEN CONCAT(' a cada ', item.intervalo, ' ', imt.nome) ELSE '' END ) ELSE CONCAT( item.dose, COALESCE(CONCAT(' ', um.nome), ' (dose)'), ', a cada ', CASE WHEN item.intervalo_medida_tempo_id = " . MedidaTempoEnum::HORAS . " THEN IF(item.intervalo > 1, CONCAT(item.intervalo, ' ', imt.nome), ' hora') ELSE CONCAT(item.intervalo, ' ', imt.nome) END ) END as posologia ") ) ->orderByDesc('item.created_at') ->first(); if (is_null($ultimaSolicitacao)) { return false; } return $ultimaSolicitacao; } public static function getHistoricoPreAtendimento($id) { return AtendimentoHistoricoService::getPreAtendimento($id); } public static function getHistoricoAtendimentoSoap($id) { return AtendimentoHistoricoService::getAtendimentoSoap($id); } public static function getHistoricoAtendimentoHospital($id) { return AtendimentoHistoricoService::getAtendimentoHospital($id); } public static function getHistoricoPosConsulta($id) { return AtendimentoHistoricoService::getPosConsulta($id); } public static function getHistoricoProntoAtendimentoAtendimento($id) { $historico = ProntoAtendimentoHistoricoService::getAtendimento($id); $historico->atendimentos = collect($historico->atendimentos) ->map(function ($atendimento) { $atendimento['visible'] = false; return $atendimento; }); return $historico; } public static function list() { switch (request()->origem) { case 'avaliacao': { return self::getAvaliacaoList(); } case 'plano': { return self::getPlanoList(); } case 'desfecho': { return self::getDesfechoList(); } case 'protocolos': { return self::getProtocolosList(); } } } private static function getAvaliacaoList() { $params = (object) request()->all(); switch (request()->listar) { case 'ocis': { return self::getOcisVinculadasComCid($params); } } } private static function getOcisVinculadasComCid($params) { $ocis = DB::table('cadastro_oci AS oci') ->join('sigtap.procedimento AS procedimento', fn ($j) => $j ->on('procedimento.codigo', 'oci.procedimento_codigo') ->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id')) ) ->where('oci.ativo', true) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('sigtap.procedimento_cid AS procedimento_cid') ->whereColumn('procedimento_cid.procedimento_id', 'procedimento.id') ->where('procedimento_cid.cid_id', $params->cid_id) ) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('sigtap.procedimento_ocupacao AS procedimento_ocupacao') ->whereColumn('procedimento_ocupacao.procedimento_id', 'procedimento.id') ->where('procedimento_ocupacao.ocupacao_id', self::getCurrentLotacao()->ocupacao_id) ) ->select( 'oci.id', 'oci.nome', 'oci.linha_cuidado' ) ->orderBy('oci.nome') ->get(); return $ocis; } private static function getPlanoList() { $params = (object) request()->all(); switch (request()->listar) { case 'encaminhamento-intersetorial-infraestruturas': { return [ 'infraestruturas' => self::getEncaminhamentoIntersetorialInfraestruturas($params), ]; } } } private static function getEncaminhamentoIntersetorialInfraestruturas($params) { return Infraestrutura::setEagerLoads([]) ->where('unidade_id', $params->unidade_id) ->whereHas('ambulatorioParametrizacaoJornadaInfraestrutura') ->get(['id', 'nome', 'principal', 'unidade_id']) ->map(fn ($infraestrutura) => [ 'id' => $infraestrutura->id, 'nome' => $infraestrutura->nome, ]) ->sortBy('nome') ->values(); } private static function getDesfechoList() { $params = (object) request()->all(); $atendimento = Fila::findOrFail($params->fila_id)->ambulatorioAtendimento; $params->paciente_id = $atendimento->paciente->id; $params->paciente_nao_municipe = $atendimento->paciente->classificacao_id !== Classificacao::MUNICIPE; $params->infraestrutura_id = self::getCurrentCentroCusto()->infraestrutura_id; $params->data = Carbon::today(); switch (request()->listar) { case 'ocupacoes': { return [ 'ocupacoes' => self::getOcupacoesWithJornada($params), 'especialidades' => [], ]; } case 'especialidades': { return [ 'especialidades' => self::getEspecialidadesWithJornada($params), ]; } } } private static function getProtocolosList() { $params = (object) request()->all(); switch (request()->listar) { case 'ocis': { return self::getProtocolosOcis($params); } } } private static function getProtocolosOcis($params) { return DB::table('cadastro_oci AS oci') ->join('sigtap.procedimento AS procedimento', fn ($j) => $j ->on('procedimento.codigo', 'oci.procedimento_codigo') ->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id')) ) ->where('oci.ativo', true) ->when($params->nome, fn ($q) => $q->where('oci.nome', 'like', "{$params->nome}%")) ->when($params->linha_cuidado, fn ($q) => $q->where('oci.linha_cuidado', 'like', "{$params->linha_cuidado}%")) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('sigtap.procedimento_ocupacao AS procedimento_ocupacao') ->whereColumn('procedimento_ocupacao.procedimento_id', 'procedimento.id') ->where('procedimento_ocupacao.ocupacao_id', self::getCurrentLotacao()->ocupacao_id) ) ->select( 'oci.id', 'oci.nome', 'oci.linha_cuidado', ) ->get(); } public static function create($filaId, $agendamentoId = null) { $fila = null; $agendamento = null; if (!is_null($agendamentoId)) { $agendamento = Agendamento::findOrFail($agendamentoId); if (is_null($agendamento->atendimento)) { $dataHoraRetroativa = Carbon::create($agendamento->jornada->data->format('Y-m-d') . ' ' . $agendamento->horario->format('H:i:s')); $agendamentoAtendimento = $agendamento->atendimento()->create([ 'paciente_id' => $agendamento->paciente_id ]); $agendamentoAtendimento->created_at = $dataHoraRetroativa; $agendamentoAtendimento->updated_at = $dataHoraRetroativa; $agendamentoAtendimento->save(); $agendamento->refresh(); } } else { $fila = Fila::findOrFail($filaId); if (!$fila->ambulatorioAtendimento->soaps()->where('is_atendimento_enfermagem', false)->where('is_rascunho', true)->exists()) { FilaService::answer($fila->id); } } $atendimento = $fila->ambulatorioAtendimento ?? $agendamento->atendimento; $soapRascunho = $atendimento->soaps()->where('is_atendimento_enfermagem', false)->where('is_rascunho', true)->first(); return [ 'additionals' => self::getAdditionalsData($atendimento, $soapRascunho), 'form' => self::getFormData($atendimento, $soapRascunho, $fila), 'model' => self::getModelData($atendimento, $soapRascunho, $fila), ]; } public static function getHistoricoErpsaude($paciente) { return AtendimentoHistoricoService::getHistoricoErpsaudeResumido($paciente); } private static function getAdditionalsData($atendimento, $soapRascunho) { $now = Carbon::now(); $unidadeLogada = self::getCurrentCentroCusto()->infraestrutura->unidade; $hasCadastroIndividual = CadastroIndividual::where('paciente_id', $atendimento->paciente_id)->exists(); $parametrizacaoAtendimento = ParametrizacaoAtendimento::first(); $isOocupacaoParametrizadaMarcadorConsumoAlimentar = OutrosPermissaoOcupacao::where( 'ocupacao', self::getCurrentLotacao()->ocupacao->codigo ) ->where('permissao_id', AtencaoBasicaPermissao::MARCADORES_DE_CONSUMO_ALIMENTAR) ->exists(); $currentLotacao = self::getCurrentLotacao(); return [ 'unidade' => [ 'nome' => $currentLotacao->infraestrutura->unidade->nome_fantasia, 'cnes' => $currentLotacao->infraestrutura->unidade->cnes, ], 'data_atendimento' => Carbon::parse($atendimento->created_at)->format('d/m/Y'), 'atendimento_id' => $atendimento->id, 'tipo_agendamento_safecare' => optional(ParametrizacaoIntegracaoAplicativo::first())->habilita_integracao_aplicativo_feridas ?? false, 'data_atual' => $now->format('d/m/Y'), 'hora_inicio_atendimento' => $now->format('H:i'), 'agendamento_competencia_id' => $atendimento->agendamento ? Competencia::where('valor', '<=', $atendimento->agendamento->jornada->data->format('Ym')) ->orderByDesc('valor') ->first()->id ?? null : null, 'is_demanda_espontanea' => $atendimento->is_demanda_espontanea, 'show_marcador_consumo_alimentar' => self::criaFicha('marcador-consumo-alimentar') && $isOocupacaoParametrizadaMarcadorConsumoAlimentar, 'is_primeiro_atendimento_puericultura' => is_null( self::getUltimoSoapPuericultura($atendimento->paciente) ), 'is_atendimento_saude_bucal' => self::isProfissionalSaudeBucal(), 'cria_ficha_atencao_basica' => self::criaFichaAtencaoBasica(), 'cria_ficha_atencao_basica_atendimento_individual' => self::criaFicha('atendimento-individual'), 'cria_ficha_atencao_basica_atendimento_domiciliar' => self::criaFicha('atendimento-domiciliar'), 'cria_ficha_atencao_basica_atendimento_odontologico' => self::criaFicha('atendimento-odontologico'), 'cria_ficha_atencao_basica_avaliacao' => self::criaFicha('avaliacao'), 'has_permissao_equipe_avaliacao' => self::getPermissaoEquipe(Permissao::AVALIACAO_ELEGIBILIDADE_ADMISSAO), 'has_permissao_equipe_atendimento_domiciliar' => self::getPermissaoEquipe(Permissao::ATENDIMENTO_DOMICILIAR), 'fatura_procedimento_raas' => self::faturaProcedimentoRaas(), 'exibe_box_exame_laboratorial_solicitado' => $parametrizacaoAtendimento->exibe_box_exame_laboratorial_solicitado ?? false, 'receita_nao_padronizada_justificativa_obrigatoria' => $parametrizacaoAtendimento->receita_nao_padronizada_justificativa_obrigatoria ?? false, 'visualizar_remume' => $parametrizacaoAtendimento->visualizar_remume ?? false, 'permite_exame_laboratorial_repetido' => $parametrizacaoAtendimento->permite_exame_laboratorial_repetido ?? false, 'permite_exame_imagem_repetido' => $parametrizacaoAtendimento->permite_exame_imagem_repetido ?? false, 'permite_encaminhar_repetido' => $parametrizacaoAtendimento->permite_encaminhar_repetido ?? false, 'permite_prescricao_repetida' => $parametrizacaoAtendimento->permite_prescricao_repetida ?? false, 'protocolo_fechamento' => self::getProtocoloFechamento($atendimento->agendamento_id), 'precisa_informar_conclusao_tratamento' => self::precisaInformarConclusaoTratamento($atendimento), 'is_rascunho' => isset($soapRascunho), 'has_avaliacao_elegibilidade' => Avaliacao::where('paciente_id', $atendimento->paciente->id)->first() ? true : false, 'permissao_assinatura' => self::getPermissaoAssinatura(), 'infraestrutura_id' => self::getCurrentLotacao()->infraestrutura_id, 'unidade_logada' => [ 'id' => $unidadeLogada->id, 'nome_fantasia' => $unidadeLogada->nome_fantasia, 'cnes' => $unidadeLogada->cnes, ], 'oci' => self::getOciAdditionalsData($atendimento), 'em_atendimento' => true, 'has_cadastro_individual' => $hasCadastroIndividual, ]; } private static function getOciAdditionalsData($atendimento) { $acompanhamentoOci = $atendimento->is_demanda_espontanea ? null : AcompanhamentoOci::where('paciente_id', $atendimento->paciente->id) ->where('ocupacao_id', $atendimento->ocupacao->id) ->whereNull('finalizado_em') ->first(); $hasOciAtivada = !is_null($acompanhamentoOci); $ultimaEtapaRealizadaMesmoAtendimento = false; $problemasCondicoesLancadosEtapaEntrada = collect(); if ($hasOciAtivada) { $ultimaEtapaConcluida = $acompanhamentoOci->etapasClinicasConcluidas()->orderByDesc('id')->first(); $ultimaEtapaRealizadaMesmoAtendimento = ($ultimaEtapaConcluida->soap->atendimento_id ?? null) === $atendimento->id; $problemasCondicoesLancadosEtapaEntrada = self::getCidCiapLancadoNaEtapaEntradaOci($acompanhamentoOci); } return [ 'has_oci_ativada' => $hasOciAtivada, 'acompanhamento_oci_id' => $acompanhamentoOci->id ?? null, 'ultima_etapa_realizada_mesmo_atendimento' => $ultimaEtapaRealizadaMesmoAtendimento, 'recusou_continuidade_oci' => false, 'problemas_condicoes_lancados_etapa_entrada' => $problemasCondicoesLancadosEtapaEntrada, ]; } private static function getCidCiapLancadoNaEtapaEntradaOci($acompanhamentoOci) { $problemasCondicoesLancadosEtapaEntrada = collect(); $etapaEntrada = $acompanhamentoOci->etapasClinicasConcluidas() ->where('etapa_clinica_id', EtapaClinicaEnum::ENTRADA) ->first(); $cidsOci = self::getCidsOci($acompanhamentoOci->oci); if ($etapaEntrada->soap) { $etapaEntrada->soap->problemasCondicoes() ->whereIn('cid_id', $cidsOci) ->get() ->each(function ($problemaCondicao) use ($problemasCondicoesLancadosEtapaEntrada) { $problemasCondicoesLancadosEtapaEntrada->push([ 'automatico' => false, 'id' => null, 'ciap' => $problemaCondicao->ciap ? [ 'id' => $problemaCondicao->ciap->id, 'codigo' => $problemaCondicao->ciap->codigo, 'descricao' => $problemaCondicao->ciap->descricao, ] : null, 'cid' => [ 'id' => $problemaCondicao->cid->id, 'codigo' => $problemaCondicao->cid->codigo, 'nome' => $problemaCondicao->cid->nome, ], 'incluir_lista_paciente' => false, 'situacao_id' => null, 'situacao_nome' => null, 'inicio' => null, 'fim' => null, 'observacao' => null, ]); }); } else if ($etapaEntrada->regulacaoSolicitacao && !is_null($etapaEntrada->regulacaoSolicitacao->cid_id) && $cidsOci->contains($etapaEntrada->regulacaoSolicitacao->cid_id) ) { $problemasCondicoesLancadosEtapaEntrada->push([ 'automatico' => false, 'id' => null, 'ciap' => null, 'cid' => [ 'id' => $etapaEntrada->regulacaoSolicitacao->cid->id, 'codigo' => $etapaEntrada->regulacaoSolicitacao->cid->codigo, 'nome' => $etapaEntrada->regulacaoSolicitacao->cid->nome, ], 'incluir_lista_paciente' => false, 'situacao_id' => null, 'situacao_nome' => null, 'inicio' => null, 'fim' => null, 'observacao' => null, ]); } return $problemasCondicoesLancadosEtapaEntrada; } public static function getPermissaoAssinatura() { $lotacaoLogada = self::getCurrentLotacao(); return DB::table('ambulatorio_parametrizacao_infraestrutura_assinatura_eletronica AS infraestrutura_assinatura_eletronica') ->join('ambulatorio_parametrizacao_infraestrutura AS parametrizacao_infraestrutura', 'parametrizacao_infraestrutura.id', 'infraestrutura_assinatura_eletronica.parametrizacao_infraestrutura_id') ->join('ambulatorio_parametrizacao_assinatura_eletronica as assinatura_eletronica', 'assinatura_eletronica.id', 'infraestrutura_assinatura_eletronica.parametrizacao_assinatura_eletronica_id') ->when($lotacaoLogada->infraestrutura_id, fn ($q, $id) => $q->where('parametrizacao_infraestrutura.infraestrutura_id', $id)) ->select( 'assinatura_eletronica.id as id' ) ->get(); } public static function getPermissaoEquipe($funcionalidadeIdentificador) { $lotacaoLogada = self::getCurrentLotacao(); return DB::table('atencao_basica_parametrizacao_equipe_usuario AS usuario') ->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'usuario.equipe_id') ->join('cadastro_lotacao AS lotacao', 'lotacao.usuario_id', 'usuario.usuario_id') ->where('usuario.ativo', true) ->when($lotacaoLogada->usuario_id, fn ($q, $id) => $q->where('usuario.usuario_id', $id)) ->when($lotacaoLogada->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id)) ->whereExists(function ($query) use ($lotacaoLogada, $funcionalidadeIdentificador) { $query->select(DB::raw(1)) ->from('atencao_basica_parametrizacao_outros_permissao_ocupacao') ->join('sigtap.ocupacao', 'sigtap.ocupacao.codigo', 'atencao_basica_parametrizacao_outros_permissao_ocupacao.ocupacao') ->where('atencao_basica_parametrizacao_outros_permissao_ocupacao.permissao_id', $funcionalidadeIdentificador) ->where('sigtap.ocupacao.id', $lotacaoLogada->ocupacao->id) ->whereColumn('lotacao.usuario_id', 'usuario.usuario_id'); }) ->exists(); } public static function criaFicha($funcionalidadeIdentificador) { $lotacaoLogada = self::getCurrentLotacao(); return ParametrizacaoInfraestruturaOcupacao::whereHas('parametrizacaoInfraestrutura', fn ($q) => $q ->where('infraestrutura_id', $lotacaoLogada->infraestrutura_id) ) ->where('ocupacao_id', $lotacaoLogada->ocupacao_id) ->whereHas('fichasAtb', fn ($q) => $q ->where('funcionalidade_id', Funcionalidade::whereHas('modulo', fn ($q) => $q ->where('identificador', 'atencao-basica') ) ->where('identificador', $funcionalidadeIdentificador) ->first('id')->id ) ) ->exists(); } private static function getFormData($atendimento, $soapRascunho, $fila = null) { $unidade = $atendimento->infraestrutura->unidade; $medicoesFormData = self::getMedicoesFormData($atendimento); $exibeHistoricoErpsaude = app('config')->get('database.default') == 'santarita' ? true : false; return [ 'acompanhamentos_saude' => self::getAcompanhamentosSaude($atendimento), 'unidade' => [ 'cnes' => $unidade->cnes, ], 'paciente' => self::getPacienteData($atendimento->paciente), 'usuario' => [ 'nome' => $atendimento->usuario->nome ?? null, 'ocupacao_codigo' => $atendimento->ocupacao->codigo ?? null, 'especialidade_nome' => $atendimento->especialidade->nome ?? null, ], 'soap' => [ 'acompanhamento_idoso' => self::getAcompanhamentoIdosoFormData($atendimento->paciente), 'medicoes' => $medicoesFormData, 'feridas' => self::getFeridaFormData(), 'problemas_condicoes_autorreferidas' => self::getProblemasCondicoesAutorreferidas($atendimento->paciente), 'raas' => self::getRaasFormData($atendimento), 'antecedentes' => self::getAntecedentesFormData($atendimento), 'subjetivo' => self::getSubjetivoFormData($atendimento), 'objetivo' => self::getObjetivoFormData($atendimento, $medicoesFormData), 'avaliacao' => self::getAvaliacaoFormData($atendimento), 'plano' => self::getPlanoFormData($atendimento, $soapRascunho), 'finalizacao' => self::getFinalizacaoFormData($atendimento, $fila), 'perfis_epidemiologicos' => CadastroPerfilEpidemiologico::orderBy('id') ->get(['id', 'descricao']), ], 'historico_soap' => [ 'subjetivo' => self::getHistoricoSubjetivoFormData($atendimento), 'avaliacao' => self::getHistoricoAvaliacaoFormData($atendimento), 'plano' => self::getHistoricoPlanoFormData($atendimento), 'finalizacao' => self::getHistoricoFinalizacaoFormData($atendimento), 'risco_cardiovascular_framingham' => self::getHistoricoRiscoCardiovascularFraminghamFormData($atendimento), ], 'historico' => self::getHistorico($atendimento->paciente->id), 'historico_erpsaude' => $exibeHistoricoErpsaude ? self::getHistoricoErpsaude($atendimento->paciente) : null, 'exibe_historico_erpsaude' => $exibeHistoricoErpsaude, 'finalizado_em' => $atendimento->finalizado_em, ]; } private static function getAcompanhamentosSaude($atendimento) { $acompanhamentos = collect(); $idade = $atendimento->paciente->cidadao->idade; if ($idade) { if ($idade['anos'] < 12) { $acompanhamentos->push([ 'sequencia' => 6, 'value' => 'crescimento-desenvolvimento-infantil', 'text' => 'CRESCIMENTO E DESENVOLVIMENTO INFANTIL' ]); } if ($idade['anos'] >= 10 && $idade['anos'] <= 64 && $atendimento->paciente->cidadao->sexo_id === Sexo::FEMININO && self::hasProblemaCondicaoGravidezAtivoOuLatente($atendimento->paciente) ) { $acompanhamentos->push(['sequencia' => 2, 'value' => 'gestante', 'text' => 'GESTANTE']); } if ($idade['anos'] >= 20) { if (self::hasProblemaCondicaoHipertensaoAtivoOuLatente($atendimento->paciente)) { $acompanhamentos->push(['sequencia' => 3, 'value' => 'hipertenso', 'text' => 'HIPERTENSO']); } if (self::hasProblemaCondicaoDiabeteAtivoOuLatente($atendimento->paciente)) { $acompanhamentos->push(['sequencia' => 4, 'value' => 'diabetico', 'text' => 'DIABÉTICO']); } } if ($idade['anos'] >= 60) { $acompanhamentos->push(['sequencia' => 1, 'value' => 'idoso', 'text' => 'IDOSO']); } if ($atendimento->paciente->cidadao->sexo_id === Sexo::FEMININO && ( ($idade['anos'] >= 25 && $idade['anos'] <= 64) || ($idade['anos'] >= 50 && $idade['anos'] <= 69) || ($idade['anos'] >= 9 && $idade['anos'] <= 64) ) ) { $acompanhamentos->push(['sequencia' => 5, 'value' => 'saude-mulher', 'text' => 'SAÚDE DA MULHER']); } } return $acompanhamentos ->sortBy('sequencia') ->map(fn ($a) => ['value' => $a['value'], 'text' => $a['text']]) ->values(); } private static function hasProblemaCondicaoGravidezAtivoOuLatente($paciente) { return DB::table('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->join('geral_ciap as ciap', 'ciap.id', 'problema_condicao.ciap_id') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'problema_condicao.soap_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->leftJoin('ambulatorio_agendamento as agendamento', 'agendamento.id', 'atendimento.agendamento_id') ->leftJoin('ambulatorio_demanda_espontanea as demanda_espontanea', 'demanda_espontanea.id', 'atendimento.demanda_espontanea_id') ->whereIn('problema_condicao.situacao_id', [ ProblemaCondicaoSituacaoEnum::ATIVO, ProblemaCondicaoSituacaoEnum::LATENTE, ]) ->where('ciap.codigo', CiapEnum::GRAVIDEZ) ->where('soap.is_rascunho', false) ->where(fn ($q) => $q ->where('agendamento.paciente_id', $paciente->id) ->orWhere('demanda_espontanea.paciente_id', $paciente->id) ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao_posterior') ->join('ambulatorio_atendimento_soap as soap_posterior', 'soap_posterior.id', 'problema_condicao_posterior.soap_id') ->whereColumn('problema_condicao_posterior.problema_condicao_anterior_id', 'problema_condicao.id') ->where('soap_posterior.is_rascunho', false) ) ->exists(); } private static function hasProblemaCondicaoHipertensaoAtivoOuLatente($paciente) { return DB::table('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->join('sigtap.cid as cid', 'cid.id', 'problema_condicao.cid_id') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'problema_condicao.soap_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->leftJoin('ambulatorio_agendamento as agendamento', 'agendamento.id', 'atendimento.agendamento_id') ->leftJoin('ambulatorio_demanda_espontanea as demanda_espontanea', 'demanda_espontanea.id', 'atendimento.demanda_espontanea_id') ->whereIn('problema_condicao.situacao_id', [ ProblemaCondicaoSituacaoEnum::ATIVO, ProblemaCondicaoSituacaoEnum::LATENTE, ]) ->whereIn('cid.codigo', [ CidEnum::HIPERTENSAO_ESSENCIAL_PRIMARIA, CidEnum::DOENCA_CARDIACA_HIPERTENSIVA, CidEnum::DOENCA_RENAL_HIPERTENSIVA, CidEnum::DOENCA_CARDIACA_E_RENAL_HIPERTENSIVA, CidEnum::HIPERTENSAO_SECUNDARIA, ]) ->where('soap.is_rascunho', false) ->where(fn ($q) => $q ->where('agendamento.paciente_id', $paciente->id) ->orWhere('demanda_espontanea.paciente_id', $paciente->id) ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao_posterior') ->join('ambulatorio_atendimento_soap as soap_posterior', 'soap_posterior.id', 'problema_condicao_posterior.soap_id') ->whereColumn('problema_condicao_posterior.problema_condicao_anterior_id', 'problema_condicao.id') ->where('soap_posterior.is_rascunho', false) ) ->exists(); } private static function hasProblemaCondicaoDiabeteAtivoOuLatente($paciente) { return DB::table('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->join('sigtap.cid as cid', 'cid.id', 'problema_condicao.cid_id') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'problema_condicao.soap_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->leftJoin('ambulatorio_agendamento as agendamento', 'agendamento.id', 'atendimento.agendamento_id') ->leftJoin('ambulatorio_demanda_espontanea as demanda_espontanea', 'demanda_espontanea.id', 'atendimento.demanda_espontanea_id') ->whereIn('problema_condicao.situacao_id', [ ProblemaCondicaoSituacaoEnum::ATIVO, ProblemaCondicaoSituacaoEnum::LATENTE, ]) ->whereIn('cid.codigo', [ CidEnum::DIABETES_MELLITUS_INSULINO_DEPENDENTE, CidEnum::DIABETES_MELLITUS_NAO_INSULINO_DEPENDENTE, CidEnum::DIABETES_MELLITUS_RELACIONADO_COM_A_DESNUTRICAO, CidEnum::OUTROS_TIPOS_ESPECIFICADOS_DE_DIABETES_MELLITUS, CidEnum::DIABETES_MELLITUS_NAO_ESPECIFICADO, ]) ->where('soap.is_rascunho', false) ->where(fn ($q) => $q ->where('agendamento.paciente_id', $paciente->id) ->orWhere('demanda_espontanea.paciente_id', $paciente->id) ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao_posterior') ->join('ambulatorio_atendimento_soap as soap_posterior', 'soap_posterior.id', 'problema_condicao_posterior.soap_id') ->whereColumn('problema_condicao_posterior.problema_condicao_anterior_id', 'problema_condicao.id') ->where('soap_posterior.is_rascunho', false) ) ->exists(); } private static function getPacienteData($paciente) { $municipioResidencia = $paciente->cidadao->domicilio->endereco->logradouro->municipio ?? null; return [ 'id' => $paciente->id, 'nome' => $paciente->cidadao->nome, 'nome_social' => $paciente->cidadao->nome_social, 'preferencia_nome_id' => $paciente->cidadao->preferencia_nome_id, 'sexo_id' => $paciente->cidadao->sexo_id, 'sexo_descricao' => $paciente->cidadao->sexo->descricao, 'sexo_identificador' => $paciente->cidadao->sexo->identificador, 'data_nascimento' => is_null($paciente->cidadao->data_nascimento) ? null : (new Carbon($paciente->cidadao->data_nascimento))->format('d/m/Y'), 'idade_em_dias' => is_null($paciente->cidadao->data_nascimento) ? null : Carbon::now()->diffInDays($paciente->cidadao->data_nascimento), 'idade_em_meses' => is_null($paciente->cidadao->data_nascimento) ? null : ceil(Carbon::now()->diffInDays($paciente->cidadao->data_nascimento) / 31), 'idade_anos' => is_null($paciente->cidadao->data_nascimento) ? null : $paciente->cidadao->idade['anos'], 'idade_formatada' => $paciente->cidadao->idade_formatada, 'idade_meses' => is_null($paciente->cidadao->data_nascimento) ? null : $paciente->cidadao->idade['meses'], 'is_idoso' => is_null($paciente->cidadao->data_nascimento) ? false : $paciente->cidadao->idade['anos'] >= self::IDADE_ANOS_INICIAL_IDOSO, 'is_crianca' => is_null($paciente->cidadao->data_nascimento) ? false : $paciente->cidadao->idade['anos'] <= self::IDADE_ANOS_FINAL_CRIANCA, 'is_crianca_aleitamento' => is_null($paciente->cidadao->data_nascimento) ? false : $paciente->cidadao->idade['anos'] <= self::IDADE_ANOS_FINAL_CRIANCA_ALEITAMENTO, 'is_adolescente' => is_null($paciente->cidadao->data_nascimento) ? false : $paciente->cidadao->idade['anos'] > self::IDADE_ANOS_FINAL_CRIANCA && $paciente->cidadao->idade['anos'] <= self::IDADE_ANOS_FINAL_ADOLESCENTE, 'nome_mae' => $paciente->cidadao->nome_mae, 'prontuario' => $paciente->prontuario, 'cpf' => MaskUtil::getCpfMasked($paciente->cidadao->cpf), 'cns' => MaskUtil::getCnsMasked($paciente->cidadao->cns), 'municipio_uf' => is_null($municipioResidencia) ? null : "{$municipioResidencia->nome} / {$municipioResidencia->estado->uf}", 'telefone_id' => $paciente->cidadao->telefone_principal->id ?? null, 'telefone_numero' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null), 'telefone_autoriza_sms' => $paciente->cidadao->telefone_principal->autoriza_sms ?? false, 'telefone_atualizado' => false, 'unidade_referencia' => $paciente->unidade->nome_fantasia ?? null, 'cep' => $paciente->cidadao->domicilio->endereco->logradouro->cep ?? null, 'ibge' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null, 'raca_cor_descricao' => $paciente->cidadao->racaCor->descricao, 'raca_cor_id' => $paciente->cidadao->raca_cor_id, 'etnia_indigena' => Str::substr($paciente->cidadao->etniaIndigena->descricao ?? '', 0, 20), 'email' => $paciente->email ?? null, 'nacionalidade_id' => $paciente->cidadao->nacionalidade_id ?? null, 'has_campos_obrigatorios_mama' => !is_null($paciente->cidadao->nome) && !is_null($paciente->cidadao->data_nascimento) && (!is_null($paciente->cidadao->cpf) || !is_null($paciente->cidadao->cns)) ]; } private static function getAcompanhamentoIdosoFormData($paciente) { return [ 'data_ultima_avaliacao_multidimensional' => self::getDataUltimaAvaliacaoMultidimensional($paciente), ]; } private static function getDataUltimaAvaliacaoMultidimensional($paciente) { return DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento') ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'atendimento_procedimento.procedimento_id') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'atendimento_procedimento.soap_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->where('soap.is_rascunho', false) ->where('atendimento.paciente_id', $paciente->id) ->where('procedimento.codigo', ProcedimentoEnum::AVALIACAO_MULTIDIMENSIONAL_DA_PESSOA_IDOSA) ->select( DB::raw("DATE_FORMAT(atendimento_procedimento.created_at, '%d/%m/%Y') as data") ) ->orderByDesc('atendimento_procedimento.created_at') ->first()->data ?? null; } public static function getMedicoesFormData($atendimento) { return [ 'gestacao' => [ 'grafico' => self::getGraficoGestacaoData(), ], 'antropometria' => [ 'faixas_etarias' => self::getFaixasEtarias($atendimento->paciente), 'grafico' => self::getGraficoAntropometriaData($atendimento), ], 'medicoes_gestacao' => self::getMedicoesGestacao($atendimento->paciente), 'periodos_gestacao' => self::getPeriodosGestacao($atendimento->paciente), 'antropometrias' => self::getMedicoesAntropometriasFormData($atendimento->paciente), 'sinais_vitais' => self::getMedicoesSinaisVitaisFormData($atendimento->paciente), 'glicemias_capilares' => self::getMedicoesGlicemiasCapilaresFormData($atendimento->paciente), ]; } private static function getGraficoGestacaoData() { $semanaInicial = 13; $semanaFinal = 41; $maxYScale = 39; $datasets = collect([ (object) ['measure' => 'p10', 'axis' => collect()], (object) ['measure' => 'p90', 'axis' => collect()], (object) ['measure' => 'max', 'axis' => collect()], ]); $getPercentil = function ($percentil, $semana) { return $percentil === 10 ? -0.0068839207 * ($semana * $semana) + 1.23239022 * $semana - 6.9606459 : -0.0139899373 * ($semana * $semana) + 1.55868069 * $semana - 4.6141899; }; for ($semana = $semanaInicial; $semana <= $semanaFinal; $semana++) { $datasets->where('measure', 'p10')->first()->axis ->push(['x' => $semana, 'y' => $getPercentil(10, $semana)]); $datasets->where('measure', 'p90')->first()->axis ->push(['x' => $semana, 'y' => $getPercentil(90, $semana)]); $datasets->where('measure', 'max')->first()->axis ->push(['x' => $semana, 'y' => $maxYScale]); } return [ 'scales' => [ 'x' => [ 'title' => 'Idade gestacional (semanas)', 'min' => $semanaInicial, 'max' => $semanaFinal, 'step_size' => 2, ], 'y' => [ 'title' => 'Altura uterina (cm)', 'min' => 7, 'max' => $maxYScale, 'step_size' => 2, ], ], 'measures' => $datasets, ]; } private static function getFaixasEtarias($paciente) { $faixasEtarias = collect(); if (!is_null($paciente->cidadao->idade)) { $idadePaciente = $paciente->cidadao->idade['anos']; $getFaixaEtaria = fn ($min, $max) => [ 'value' => "{$min}-{$max}", 'text' => "{$min} a {$max} anos", 'min' => $min, 'max' => $max, ]; $faixasEtarias->push($getFaixaEtaria(0, 2)); if ($idadePaciente > 2) { $faixasEtarias->push($getFaixaEtaria(2, 5)); } if ($idadePaciente > 5) { $faixasEtarias->push($getFaixaEtaria(5, 10)); } if ($idadePaciente > 10) { $faixasEtarias->push($getFaixaEtaria(10, 15)); } if ($idadePaciente > 15) { $faixasEtarias->push($getFaixaEtaria(15, 19)); } if ($idadePaciente > 19) { $faixasEtarias->push($getFaixaEtaria(19, 30)); } if ($idadePaciente > 30) { for ($idadeInicial = 30; $idadeInicial <= $idadePaciente; $idadeInicial += 10) { $idadeFinal = $idadeInicial + 10; $faixasEtarias->push($getFaixaEtaria($idadeInicial, $idadeFinal)); } } } return $faixasEtarias; } private static function getGraficoAntropometriaData($atendimento) { $sexoId = $atendimento->paciente->cidadao->sexo_id; $getMonths = fn ($years) => $years * 12; $getData = fn ($tipoId, $xMin, $xMax, $xStepSize, $yTitle, $yMin, $yMax, $yStepSize, $getZScores = true) => [ 'scales' => [ 'x' => [ 'title' => 'Idade (meses completos e anos)', 'min' => $getMonths($xMin), 'max' => $getMonths($xMax), 'step_size' => $xStepSize, ], 'y' => [ 'title' => $yTitle, 'min' => $yMin, 'max' => $yMax, 'step_size' => $yStepSize, ], ], 'z_scores' => $getZScores ? self::getZScores($tipoId, $sexoId, $getMonths($xMin), $getMonths($xMax), $yMax) : [], ]; $pesoTitle = 'Peso (kg)'; $alturaTitle = 'Altura (cm)'; $imcTitle = 'IMC (kg/m²)'; $perimetroCefalicoTitle = 'Perímetro cefálico (cm)'; $peso = collect(); $altura = collect(); $imc = collect(); $perimetroCefalico = collect(); if (!is_null($atendimento->paciente->cidadao->idade)) { $idadePaciente = $atendimento->paciente->cidadao->idade['anos']; $peso->push([ 'faixa_etaria' => '0-2', 'data' => $getData(LmsParametroTipo::PESO, 0, 2, 2, $pesoTitle, 0, 20, 1), ]); $altura->push([ 'faixa_etaria' => '0-2', 'data' => $getData(LmsParametroTipo::ALTURA, 0, 2, 2, $alturaTitle, 40, 105, 5), ]); $imc->push([ 'faixa_etaria' => '0-2', 'data' => $getData(LmsParametroTipo::IMC, 0, 2, 2, $imcTitle, 5, 25, 1), ]); $perimetroCefalico->push([ 'faixa_etaria' => '0-2', 'data' => $getData(LmsParametroTipo::PERIMETRO_CEFALICO, 0, 2, 2, $perimetroCefalicoTitle, 30, 53, 1), ]); if ($idadePaciente > 2) { $peso->push([ 'faixa_etaria' => '2-5', 'data' => $getData(LmsParametroTipo::PESO, 2, 5, 2, $pesoTitle, 7, 32, 1), ]); $altura->push([ 'faixa_etaria' => '2-5', 'data' => $getData(LmsParametroTipo::ALTURA, 2, 5, 2, $alturaTitle, 75, 130, 5), ]); $imc->push([ 'faixa_etaria' => '2-5', 'data' => $getData(LmsParametroTipo::IMC, 2, 5, 2, $imcTitle, 10, 25, 1), ]); $perimetroCefalico->push([ 'faixa_etaria' => '2-5', 'data' => $getData(LmsParametroTipo::PERIMETRO_CEFALICO, 2, 5, 2, $perimetroCefalicoTitle, 30, 53, 1), ]); } if ($idadePaciente > 5) { $peso->push([ 'faixa_etaria' => '5-10', 'data' => $getData(LmsParametroTipo::PESO, 5, 10, 4, $pesoTitle, 10, 65, 5), ]); $altura->push([ 'faixa_etaria' => '5-10', 'data' => $getData(LmsParametroTipo::ALTURA, 5, 10, 4, $alturaTitle, 90, 165, 5), ]); $imc->push([ 'faixa_etaria' => '5-10', 'data' => $getData(LmsParametroTipo::IMC, 5, 10, 4, $imcTitle, 10, 30, 1), ]); $perimetroCefalico->push([ 'faixa_etaria' => '5-10', 'data' => $getData(LmsParametroTipo::PERIMETRO_CEFALICO, 5, 10, 4, $perimetroCefalicoTitle, 30, 53, 1, false), ]); } if ($idadePaciente > 10) { $peso->push([ 'faixa_etaria' => '10-15', 'data' => $getData(LmsParametroTipo::PESO, 10, 15, 4, $pesoTitle, 25, 150, 5, false), ]); $altura->push([ 'faixa_etaria' => '10-15', 'data' => $getData(LmsParametroTipo::ALTURA, 10, 15, 4, $alturaTitle, 100, 205, 5), ]); $imc->push([ 'faixa_etaria' => '10-15', 'data' => $getData(LmsParametroTipo::IMC, 10, 15, 4, $imcTitle, 10, 40, 2), ]); $perimetroCefalico->push([ 'faixa_etaria' => '10-15', 'data' => $getData(LmsParametroTipo::PERIMETRO_CEFALICO, 10, 15, 4, $perimetroCefalicoTitle, 30, 53, 1, false), ]); } if ($idadePaciente > 15) { $peso->push([ 'faixa_etaria' => '15-19', 'data' => $getData(LmsParametroTipo::PESO, 15, 19, 4, $pesoTitle, 25, 150, 5, false), ]); $altura->push([ 'faixa_etaria' => '15-19', 'data' => $getData(LmsParametroTipo::ALTURA, 15, 19, 4, $alturaTitle, 110, 210, 10), ]); $imc->push([ 'faixa_etaria' => '15-19', 'data' => $getData(LmsParametroTipo::IMC, 15, 19, 4, $imcTitle, 10, 40, 2), ]); $perimetroCefalico->push([ 'faixa_etaria' => '15-19', 'data' => $getData(LmsParametroTipo::PERIMETRO_CEFALICO, 15, 19, 4, $perimetroCefalicoTitle, 30, 53, 1, false), ]); } if ($idadePaciente > 19) { $peso->push([ 'faixa_etaria' => '19-30', 'data' => $getData(LmsParametroTipo::PESO, 19, 30, 6, $pesoTitle, 25, 150, 5, false), ]); $altura->push([ 'faixa_etaria' => '19-30', 'data' => $getData(LmsParametroTipo::ALTURA, 19, 30, 6, $alturaTitle, 110, 200, 5, false), ]); $imc->push([ 'faixa_etaria' => '19-30', 'data' => $getData(LmsParametroTipo::IMC, 19, 30, 6, $imcTitle, 10, 40, 2, false), ]); $perimetroCefalico->push([ 'faixa_etaria' => '19-30', 'data' => $getData(LmsParametroTipo::PERIMETRO_CEFALICO, 19, 30, 6, $perimetroCefalicoTitle, 30, 53, 1, false), ]); } if ($idadePaciente > 30) { for ($idadeInicial = 30; $idadeInicial <= $idadePaciente; $idadeInicial += 10) { $idadeFinal = $idadeInicial + 10; $faixaEtaria = "{$idadeInicial}-{$idadeFinal}"; $peso->push([ 'faixa_etaria' => $faixaEtaria, 'data' => $getData(LmsParametroTipo::PESO, $idadeInicial, $idadeFinal, 6, $pesoTitle, 25, 150, 5, false), ]); $altura->push([ 'faixa_etaria' => $faixaEtaria, 'data' => $getData(LmsParametroTipo::ALTURA, $idadeInicial, $idadeFinal, 6, $alturaTitle, 110, 200, 5, false), ]); $imc->push([ 'faixa_etaria' => $faixaEtaria, 'data' => $getData(LmsParametroTipo::IMC, $idadeInicial, $idadeFinal, 6, $imcTitle, 10, 40, 2, false), ]); $perimetroCefalico->push([ 'faixa_etaria' => $faixaEtaria, 'data' => $getData(LmsParametroTipo::PERIMETRO_CEFALICO, $idadeInicial, $idadeFinal, 6, $perimetroCefalicoTitle, 30, 53, 1, false), ]); } } } return [ 'peso' => $peso, 'altura' => $altura, 'imc' => $imc, 'perimetro_cefalico' => $perimetroCefalico, ]; } private static function getZScores($parametroTipoId, $sexoId, $idadeMesesMin, $idadeMesesMax, $maxYScale = null) { $parametros = LmsParametro::where('tipo_id', $parametroTipoId) ->where('sexo_id', $sexoId) ->whereIn('mes', [ $idadeMesesMin, $idadeMesesMax, ]) ->get(); if ($parametros->isNotEmpty()) { $datasets = collect([ (object) ['z-score' => -3, 'axis' => collect()], (object) ['z-score' => -2, 'axis' => collect()], (object) ['z-score' => -1, 'axis' => collect()], (object) ['z-score' => 0, 'axis' => collect()], (object) ['z-score' => 1, 'axis' => collect()], (object) ['z-score' => 2, 'axis' => collect()], (object) ['z-score' => 3, 'axis' => collect()], ]); $parametros->each(function ($parametro) use ($datasets, $maxYScale) { $datasets->where('z-score', -3)->first()->axis ->push(['x' => $parametro->mes, 'y' => $parametro->sd_3_negativo]); $datasets->where('z-score', -2)->first()->axis ->push(['x' => $parametro->mes, 'y' => $parametro->sd_2_negativo]); $datasets->where('z-score', -1)->first()->axis ->push(['x' => $parametro->mes, 'y' => $parametro->sd_1_negativo]); $datasets->where('z-score', 0)->first()->axis ->push(['x' => $parametro->mes, 'y' => $parametro->sd_0]); $datasets->where('z-score', 1)->first()->axis ->push(['x' => $parametro->mes, 'y' => $parametro->sd_1]); $datasets->where('z-score', 2)->first()->axis ->push(['x' => $parametro->mes, 'y' => $parametro->sd_2]); $datasets->where('z-score', 3)->first()->axis ->push(['x' => $parametro->mes, 'y' => $maxYScale ?? $parametro->sd_3]); }); return $datasets; } return []; } private static function getMedicoesGestacao($paciente) { $ultimaDataPreNatal = null; return DB::table('ambulatorio_atendimento_soap as soap') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->where('soap.is_rascunho', false) ->where('atendimento.paciente_id', $paciente->id) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->join('cadastro_paciente_gestacao as gestacao', 'gestacao.id', 'problema_condicao.paciente_gestacao_id') ->whereColumn('problema_condicao.soap_id', 'soap.id') ->where('problema_condicao.situacao_id', '<>', ProblemaCondicaoSituacaoEnum::RESOLVIDO) ->whereNull('gestacao.fim') ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('geral_ciap as ciap') ->whereColumn('ciap.id', 'problema_condicao.ciap_id') ->where('ciap.codigo', self::CIAPS_GRAVIDEZ_NORMAL) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('sigtap.cid as cid') ->whereColumn('cid.id', 'problema_condicao.cid_id') ->whereIn('cid.codigo', self::CIDS_GRAVIDEZ_NORMAL) ) ) ) ->orderBy('soap.created_at') ->select('soap.id') ->get() ->map(function ($soap, $i) use (&$ultimaDataPreNatal) { $ordem = $i + 1; $soap = AtendimentoSoap::find($soap->id); $medidoEm = $soap->created_at->startOfDay(); $idadeGestacional = ['semanas' => 0, 'dias' => 0]; if (is_null($ultimaDataPreNatal)) { $ultimaDataPreNatal = $medidoEm; } else { $interval = $medidoEm->diff($ultimaDataPreNatal); $idadeGestacional['semanas'] = floor($interval->days / 7); $idadeGestacional['dias'] = $interval->days % 7; } return array_merge(self::getLogData($soap), [ 'ordem_atendimento' => "{$ordem}º", 'idade_gestacional' => [ 'semanas' => $idadeGestacional['semanas'], 'dias' => $idadeGestacional['dias'], ], 'edema_nome' => $soap->preNatalEdema->nome ?? null, 'altura_uterina' => $soap->pre_natal_altura_uterina, 'batimento_cardiaco_fetal' => $soap->pre_natal_batimento_cardiaco_fetal, 'movimentacao_fetal' => $soap->pre_natal_movimentacao_fetal, ]); }); } private static function getPeriodosGestacao($paciente) { return $paciente->gestacoes()->orderBy('inicio')->get()->map(function ($gestacao) use ($paciente) { $inicio = $gestacao->inicio; $inicioIdadeMeses = null; $fim = $gestacao->fim ?? Carbon::today(); $fimIdadeMeses = null; if (!is_null($paciente->cidadao->data_nascimento)) { $idadeInicio = AgeService::getAge($paciente->cidadao->data_nascimento, $inicio); $idadeFim = AgeService::getAge($paciente->cidadao->data_nascimento, $fim); $inicioIdadeMeses = $idadeInicio->years * 12 + $idadeInicio->months; $fimIdadeMeses = $idadeFim->years * 12 + $idadeFim->months; } return [ 'inicio' => $inicio->format('d/m/Y'), 'inicio_idade_meses' => $inicioIdadeMeses, 'fim' => $fim->format('d/m/Y'), 'fim_idade_meses' => $fimIdadeMeses, ]; }); } private static function getMedicoesAntropometriasFormData($paciente) { return DB::table('ambulatorio_atendimento_antropometria') ->select([ 'ambulatorio_atendimento_antropometria.id', 'ambulatorio_atendimento_antropometria.created_at', 'ambulatorio_atendimento_antropometria.medido_em', 'ambulatorio_atendimento_antropometria.peso', 'ambulatorio_atendimento_antropometria.altura', 'ambulatorio_atendimento_antropometria.perimetro_cefalico', 'ambulatorio_atendimento_antropometria.circunferencia_abdominal', 'ambulatorio_atendimento_antropometria.perimetro_panturrilha', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_antropometria.atendimento_id') ->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_antropometria.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_antropometria.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->where('ambulatorio_agendamento.paciente_id', $paciente->id) ->where(function ($query) { $query ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap') ->whereColumn('ambulatorio_atendimento_soap.atendimento_id', 'ambulatorio_atendimento.id') ->where('ambulatorio_atendimento_soap.is_rascunho', false); }) ->orWhereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap') ->whereColumn('ambulatorio_atendimento_soap.atendimento_id', 'ambulatorio_atendimento.id'); }); }) ->unionAll( DB::table('ambulatorio_atendimento_antropometria') ->select([ 'ambulatorio_atendimento_antropometria.id', 'ambulatorio_atendimento_antropometria.created_at', 'ambulatorio_atendimento_antropometria.medido_em', 'ambulatorio_atendimento_antropometria.peso', 'ambulatorio_atendimento_antropometria.altura', 'ambulatorio_atendimento_antropometria.perimetro_cefalico', 'ambulatorio_atendimento_antropometria.circunferencia_abdominal', 'ambulatorio_atendimento_antropometria.perimetro_panturrilha', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_antropometria.atendimento_id') ->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_antropometria.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_antropometria.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->where('ambulatorio_demanda_espontanea.paciente_id', $paciente->id) ) ->get() ->map(function ($antropometria) { $antropometria->created_at = Carbon::create($antropometria->created_at); $antropometria->medido_em = Carbon::create($antropometria->medido_em); $antropometria->createdLotacao = (object) [ 'ocupacao' => (object) [ 'id' => $antropometria->ocupacao_id, 'codigo' => $antropometria->ocupacao_codigo, 'nome' => $antropometria->ocupacao_nome, ], 'profissional' => (object) [ 'nome' => $antropometria->cidadao_nome, ], ]; $antropometria->createdCentroCusto = (object) [ 'setor' => (object) [ 'nome' => $antropometria->setor_nome ], ]; return array_merge(self::getLogData($antropometria), [ 'id' => $antropometria->id, 'medido_em' => $antropometria->medido_em->format('d/m/Y'), 'peso' => $antropometria->peso, 'altura' => (int) $antropometria->altura, 'imc' => isset($antropometria->peso) && isset($antropometria->altura) ? ImcService::calculate( UnidadeMedidaEnum::QUILOGRAMAS, $antropometria->peso, UnidadeMedidaEnum::CENTIMETROS, $antropometria->altura )['imc'] : null, 'perimetro_cefalico' => $antropometria->perimetro_cefalico, 'circunferencia_abdominal' => (int) $antropometria->circunferencia_abdominal, 'perimetro_panturrilha' => (int) $antropometria->perimetro_panturrilha, ]); }); } private static function getMedicoesSinaisVitaisFormData($paciente) { return DB::table('ambulatorio_atendimento_sinal_vital') ->select([ 'ambulatorio_atendimento_sinal_vital.id', 'ambulatorio_atendimento_sinal_vital.created_at', 'ambulatorio_atendimento_sinal_vital.pressao_arterial', 'ambulatorio_atendimento_sinal_vital.frequencia_respiratoria', 'ambulatorio_atendimento_sinal_vital.frequencia_cardiaca', 'ambulatorio_atendimento_sinal_vital.temperatura', 'ambulatorio_atendimento_sinal_vital.saturacao_o2', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_sinal_vital.atendimento_id') ->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_sinal_vital.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_sinal_vital.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->where('ambulatorio_agendamento.paciente_id', $paciente->id) ->where(function ($query) { $query ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap') ->whereColumn('ambulatorio_atendimento_soap.atendimento_id', 'ambulatorio_atendimento.id') ->where('ambulatorio_atendimento_soap.is_rascunho', false); }) ->orWhereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap') ->whereColumn('ambulatorio_atendimento_soap.atendimento_id', 'ambulatorio_atendimento.id'); }); }) ->unionAll( DB::table('ambulatorio_atendimento_sinal_vital') ->select([ 'ambulatorio_atendimento_sinal_vital.id', 'ambulatorio_atendimento_sinal_vital.created_at', 'ambulatorio_atendimento_sinal_vital.pressao_arterial', 'ambulatorio_atendimento_sinal_vital.frequencia_respiratoria', 'ambulatorio_atendimento_sinal_vital.frequencia_cardiaca', 'ambulatorio_atendimento_sinal_vital.temperatura', 'ambulatorio_atendimento_sinal_vital.saturacao_o2', 'ocupacao.id AS ocupacao_id', 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_setor.nome AS setor_nome', ]) ->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_sinal_vital.atendimento_id') ->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id') ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_atendimento_sinal_vital.created_lotacao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'cadastro_lotacao.ocupacao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'ambulatorio_atendimento_sinal_vital.created_centro_custo_id') ->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id') ->where('ambulatorio_demanda_espontanea.paciente_id', $paciente->id) ) ->get() ->map(function ($sinalVital) { $sinalVital->created_at = Carbon::create($sinalVital->created_at); $sinalVital->createdLotacao = (object) [ 'ocupacao' => (object) [ 'id' => $sinalVital->ocupacao_id, 'codigo' => $sinalVital->ocupacao_codigo, 'nome' => $sinalVital->ocupacao_nome, ], 'profissional' => (object) [ 'nome' => $sinalVital->cidadao_nome, ], ]; $sinalVital->createdCentroCusto = (object) [ 'setor' => (object) [ 'nome' => $sinalVital->setor_nome ], ]; return array_merge(self::getLogData($sinalVital), [ 'id' => $sinalVital->id, 'medido_em' => $sinalVital->created_at->format('d/m/Y'), 'pressao_arterial' => $sinalVital->pressao_arterial, 'frequencia_respiratoria' => $sinalVital->frequencia_respiratoria, 'frequencia_cardiaca' => $sinalVital->frequencia_cardiaca, 'temperatura' => $sinalVital->temperatura, 'saturacao_o2' => $sinalVital->saturacao_o2, ]); }); } private static function getMedicoesGlicemiasCapilaresFormData($paciente) { return AtendimentoGlicemiaCapilar::whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ->where(fn ($q) => $q ->whereDoesntHave('soap') ->orWhereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ) ) ->get() ->map(fn ($glicemiaCapilar) => array_merge(self::getLogData($glicemiaCapilar), [ 'id' => $glicemiaCapilar->id, 'medido_em' => $glicemiaCapilar->created_at->format('d/m/Y'), 'valor' => $glicemiaCapilar->valor, 'momento_coleta_nome' => $glicemiaCapilar->momentoColeta->nome, ])); } private static function getProblemasCondicoesAutorreferidas($paciente) { if (is_null($paciente->cadastroIndividual)) { return []; } $cadastroIndividual = $paciente->cadastroIndividual; $problemas = collect(); $booleanItens = [ [ 'field' => 'gestante', 'label' => 'Gestante' . (is_null($cadastroIndividual->maternidade_referencia) ? '' : " ({$cadastroIndividual->maternidade_referencia})") ], [ 'field' => 'fumante', 'label' => 'Fumante' ], [ 'field' => 'usa_alcool', 'label' => 'Usa álcool' ], [ 'field' => 'outras_drogas', 'label' => 'Outras drogas' ], [ 'field' => 'hipertensao', 'label' => 'Hipertensão' ], [ 'field' => 'diabetes', 'label' => 'Diabetes' ], [ 'field' => 'avc_derrame', 'label' => 'Teve AVC/Derrame' ], [ 'field' => 'infarto', 'label' => 'Teve infarto' ], [ 'field' => 'hanseniase', 'label' => 'Está com hanseníase' ], [ 'field' => 'tuberculose', 'label' => 'Está com tuberculose' ], [ 'field' => 'cancer', 'label' => 'Tem ou teve câncer' ], [ 'field' => 'fibromialgia', 'label' => 'Fibromialgia' ], [ 'field' => 'transtorno_espectro_autista', 'label' => 'Transtorno do espectro autista' ], [ 'field' => 'internacao', 'label' => 'Internação nos últimos 12 meses' . (is_null($cadastroIndividual->internacao_motivo) ? '' : " ({$cadastroIndividual->internacao_motivo})") ], [ 'field' => 'doenca_cardiaca', 'label' => 'Doença cardíaca/do coração' . ($cadastroIndividual->doencaCardiaca->isEmpty() ? '' : " ({$cadastroIndividual->doencaCardiaca->pluck('descricao')->join(', ')})") ], [ 'field' => 'problemas_rins', 'label' => 'Problemas nos rins' . ($cadastroIndividual->problemasRins->isEmpty() ? '' : " ({$cadastroIndividual->problemasRins->pluck('descricao')->join(', ')})") ], [ 'field' => 'doenca_respiratoria', 'label' => 'Doença respiratória/no pulmão' . ($cadastroIndividual->doencaRespiratoria->isEmpty() ? '' : " ({$cadastroIndividual->doencaRespiratoria->pluck('descricao')->join(', ')})") ], [ 'field' => 'tratamento_saude_mental', 'label' => 'Tratamento psiquiátrico ou teve internação por problema de saúde mental' ], [ 'field' => 'acamado', 'label' => 'Acamado' ], [ 'field' => 'domiciliado', 'label' => 'Domiciliado' ], [ 'field' => 'plantas_medicinais', 'label' => 'Plantas medicinais' . (is_null($cadastroIndividual->plantas_medicinais_quais) ? '' : " ({$cadastroIndividual->plantas_medicinais_quais})") ], [ 'field' => 'praticas_integrativas', 'label' => 'Práticas integrativas e complementares' ], ]; foreach ($booleanItens as $item) { if ($cadastroIndividual->{$item['field']}) { $problemas->push($item['label']); } } if (!is_null($cadastroIndividual->peso_id)) { $problemas->push(Str::ucfirst(Str::lower(Peso::findOrFail($cadastroIndividual->peso_id)->descricao))); } if (!is_null($cadastroIndividual->outras_condicoes_primaria)) { $problemas->push($cadastroIndividual->outras_condicoes_primaria); } if (!is_null($cadastroIndividual->outras_condicoes_secundaria)) { $problemas->push($cadastroIndividual->outras_condicoes_secundaria); } if (!is_null($cadastroIndividual->outras_condicoes_terciaria)) { $problemas->push($cadastroIndividual->outras_condicoes_terciaria); } return $problemas; } private static function getRaasFormData($atendimento) { return [ 'origens_paciente' => OrigemPaciente::orderBy('nome')->get(['id', 'nome']), 'destinos_paciente' => DestinoPaciente::orderBy('nome')->get(['id', 'nome']), 'motivos_saida_permanencia' => MotivoSaidaPermanencia::orderBy('nome')->get(['id', 'nome']), 'carateres_atendimento' => CaraterAtendimento::orderBy('nome')->get(['id', 'nome']), 'classificacoes' => SigtapClassificacao::where('competencia_id', Competencia::max('id')) ->whereHas('servico', fn ($q) => $q ->where('codigo', SigtapServicoEnum::SERVICO_DE_ATENCAO_PSICOSSOCIAL) ) ->whereIn('codigo', [ ClassificacaoServicoAtencaoPsicossocial::RESIDENCIA_TERAPEUTICA_EM_SAUDE_MENTAL, ClassificacaoServicoAtencaoPsicossocial::SERVICO_RESIDENCIAL_TERAPEUTICO_TIPO_I_SRT_TIPO_I, ClassificacaoServicoAtencaoPsicossocial::SERVICO_RESIDENCIAL_TERAPEUTICO_TIPO_II_SRT_TIPO_II, ]) ->orderBy('nome') ->get(['id', 'nome']), 'locais_realizacao_exame' => LocalRealizacaoExame::orderBy('nome')->get(['id', 'nome']), 'motivo_saida_permanencia_id' => $atendimento->especialidade->atencao_basica_motivo_saida_permanencia_id ?? null, 'numero_autorizacao' => $atendimento->especialidade->atencao_basica_numero_autorizacao ?? null, 'classificacao_id' => is_null($atendimento->especialidade) ? null : SigtapClassificacao::where('competencia_id', Competencia::max('id')) ->whereHas('servico', fn ($q) => $q ->where('codigo', SigtapServicoEnum::SERVICO_DE_ATENCAO_PSICOSSOCIAL) ) ->where('codigo', $atendimento->especialidade->atencao_basica_classificacao_codigo) ->first()->id ?? null, 'has_procedimento_raas' => self::hasProcedimentoRaas($atendimento), 'has_procedimento_raas_que_precisa_de_classificacao' => self::hasProcedimentoRaasQuePrecisaDeClassificacao($atendimento), 'has_procedimento_raas_que_precisa_de_autorizacao' => self::hasProcedimentoRaasQuePrecisaDeAutorizacao($atendimento), ]; } private static function getFeridaFormData() { return [ 'tipos' => Ferida::where('ativo', true)->orderBy('nome')->get(['id', 'nome']), 'locais_anatomico' => LocalAnatomico::orderBy('descricao')->get(['id', 'descricao']), 'locais_anatomico_regiao' => LocalAnatomicoRegiao::orderBy('descricao')->get(['id', 'descricao', 'local_anatomico_id']), 'exsudatos' => FeridaExsudato::orderBy('descricao')->get(['id', 'descricao']), 'necroses' => FeridaNecrose::orderBy('id')->get(['id', 'descricao']), ]; } private static function hasProcedimentoRaas($atendimento, $withRascunho = false) { return DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento') ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'atendimento_procedimento.procedimento_id') ->join('sigtap.procedimento_registro as procedimento_registro', 'procedimento_registro.procedimento_id', 'procedimento.id') ->join('sigtap.registro as registro', 'registro.id', 'procedimento_registro.registro_id') ->where('atendimento_procedimento.atendimento_id', $atendimento->id) ->when(!$withRascunho, fn ($q) => $q->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap as soap') ->whereColumn('soap.id', 'atendimento_procedimento.soap_id') ->where('soap.is_rascunho', false) ) ->orWhereNotExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap as soap') ->whereColumn('soap.id', 'atendimento_procedimento.soap_id') ) )) ->where('registro.codigo', Registro::RAAS_ATENCAO_PSICOSSOCIAL) ->exists(); } private static function hasProcedimentoRaasQuePrecisaDeClassificacao($atendimento, $withRascunho = false) { return DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento') ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'atendimento_procedimento.procedimento_id') ->where('atendimento_procedimento.atendimento_id', $atendimento->id) ->when(!$withRascunho, fn ($q) => $q->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap as soap') ->whereColumn('soap.id', 'atendimento_procedimento.soap_id') ->where('soap.is_rascunho', false) ) ->orWhereNotExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap as soap') ->whereColumn('soap.id', 'atendimento_procedimento.soap_id') ) )) ->where('procedimento.codigo', ProcedimentoEnum::ACOMPANHAMENTO_DE_PACIENTE_EM_SAUDE_MENTAL) ->exists(); } private static function hasProcedimentoRaasQuePrecisaDeAutorizacao($atendimento, $withRascunho = false) { return DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento') ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'atendimento_procedimento.procedimento_id') ->where('atendimento_procedimento.atendimento_id', $atendimento->id) ->when(!$withRascunho, fn ($q) => $q->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap as soap') ->whereColumn('soap.id', 'atendimento_procedimento.soap_id') ->where('soap.is_rascunho', false) ) ->orWhereNotExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_atendimento_soap as soap') ->whereColumn('soap.id', 'atendimento_procedimento.soap_id') ) )) ->whereIn('procedimento.codigo', [ ProcedimentoEnum::ACOMPANHAMENTO_DE_PACIENTE_EM_SAUDE_MENTAL, ProcedimentoEnum::ACOMPANHAMENTO_DE_PESSOAS_COM_NECESSIDADES_DECORRENTES_DO_USO_DE_ALCOOL_CRACK_E_OUTRAS_DROGAS, ProcedimentoEnum::ACOMPANHAMENTO_DE_PESSOAS_ADULTAS_COM_SOFRIMENTO_OU_TRANSTORNOS_MENTAIS_DECORRENTES_DO_USO_DE_CRACK_ALCOOL_E_OUTRAS_DROGAS, ProcedimentoEnum::ACOMPANHAMENTO_DA_POPULACAO_INFANTO_JUVENIL_COM_SOFRIMENTO_OU_TRANSTORNOS_MENTAIS_DECORRENTES_DO_USO_DE_CRACK_ALCOOL_E_OUTRAS_DROGAS, ]) ->exists(); } private static function getAntecedentesFormData($atendimento) { return [ 'puericultura' => [ 'gravidez_tipos' => GravidezTipo::get(['id', 'nome']), 'parto_tipos' => PartoTipo::get(['id', 'nome']), ], 'problema_condicao' => [ 'situacoes' => ProblemaCondicaoSituacao::orderBy('nome')->get(['id', 'nome']), ], 'problemas_condicoes' => self::getProblemasCondicoesResolvidos($atendimento->paciente), ]; } private static function getProblemasCondicoesResolvidos($paciente) { return AtendimentoSoapProblemaCondicao::where('situacao_id', ProblemaCondicaoSituacaoEnum::RESOLVIDO) ->whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->get() ->map(fn ($problemaCondicao) => array_merge(self::getLogData($problemaCondicao), [ 'id' => $problemaCondicao->id, 'ciap' => is_null($problemaCondicao->ciap_id) ? null : [ 'codigo' => $problemaCondicao->ciap->codigo, 'descricao' => $problemaCondicao->ciap->descricao, ], 'cid' => is_null($problemaCondicao->cid_id) ? null : [ 'codigo' => $problemaCondicao->cid->codigo, 'nome' => $problemaCondicao->cid->nome, ], 'situacao' => [ 'nome' => $problemaCondicao->situacao->nome, ], 'inicio' => [ 'data' => is_null($problemaCondicao->inicio) ? null : $problemaCondicao->inicio->format('d/m/Y'), ], 'fim' => [ 'data' => is_null($problemaCondicao->fim) ? null : $problemaCondicao->fim->format('d/m/Y'), ], 'observacao' => $problemaCondicao->observacao, ])) ->all(); } private static function getSubjetivoFormData($atendimento) { $preAtendimento = $atendimento->preAtendimento; if (!$preAtendimento){ return []; } return [ 'ciap_id' => $preAtendimento->ciap_id ?? null, 'ciap' => [ 'codigo' => is_null($preAtendimento->ciap_id) ? null : $preAtendimento->ciap->codigo, 'descricao' => is_null($preAtendimento->ciap_id) ? null : $preAtendimento->ciap->descricao, ], 'observacao' => $preAtendimento->motivo_atendimento, ]; } private static function getHistoricoSubjetivoFormData($atendimento) { $motivos = AtendimentoSoapMotivo::whereHas('soap', function ($q) use ($atendimento) { $q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($motivo) { return [ 'cid_id' => $motivo->cid_id ?? null, 'cid' => [ 'id' => $motivo->cid->id ?? null, 'codigo' => $motivo->cid->codigo ?? null, 'nome' => $motivo->cid->nome ?? null, ], ]; }); return [ 'motivos' => $motivos, ]; } private static function getHistoricoAvaliacaoFormData($atendimento) { $problemasCondicoes = AtendimentoSoapProblemaCondicao::whereHas('soap', function ($q) use ($atendimento) { $q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($problemaCondicao) { return [ 'cid' => $problemaCondicao->cid ? [ 'id' => $problemaCondicao->cid->id, 'codigo' => $problemaCondicao->cid->codigo, 'nome' => $problemaCondicao->cid->nome, ] : null, ]; }); return [ 'problemas_condicoes' => $problemasCondicoes, ]; } private static function getHistoricoPlanoFormData($atendimento) { $compartilhamentosCuidados = AtendimentoSoapCompartilhamentoCuidado::whereHas('soap', function ($q) use ($atendimento) { $q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($compartilhamentoCuidado) { return [ 'cid' => $compartilhamentoCuidado->cid ? [ 'id' => $compartilhamentoCuidado->cid->id, 'codigo' => $compartilhamentoCuidado->cid->codigo, 'nome' => $compartilhamentoCuidado->cid->nome, ] : null, ]; }); $solicitacaoExamesComuns = self::getHistoricoSolicitacaoExamesComuns($atendimento->id); $solicitacaoExamesAltoCusto = self::getHistoricoSolicitacaoExamesAltoCusto($atendimento->id); $encaminhamentos = self::getHistoricoEncaminhamentos($atendimento->id); $atestados = self::getHistoricoAtestados($atendimento->id); return [ 'compartilhamentos_cuidados' => $compartilhamentosCuidados, 'solicitacoes_exames_comuns' => $solicitacaoExamesComuns, 'solicitacoes_exames_alto_custo' => $solicitacaoExamesAltoCusto, 'encaminhamentos' => $encaminhamentos, 'atestados' => $atestados, ]; } private static function getHistoricoFinalizacaoFormData($atendimento) { $cidEmad = AtendimentoSoap::where('is_rascunho', false) ->where('atendimento_id', $atendimento->id) ->whereNotNull('emad_cid_primario_id') ->get() ->map(function ($soap) { return [ 'cid' => $soap->emad_cid_primario_id ? [ 'id' => $soap->emad_cid_primario_id, 'nome' => Cid::where('id', $soap->emad_cid_primario_id)->first()->nome, 'codigo' => Cid::where('id', $soap->emad_cid_primario_id)->first()->codigo, ] : null, ]; }); return [ 'cid_emad' => $cidEmad, ]; } private static function getObjetivoFormData($atendimento) { $preAtendimento = $atendimento->preAtendimento; $unideMedidaQuilogramasSigla = UnidadeMedida::findOrFail(UnidadeMedidaEnum::QUILOGRAMAS)->sigla; $unideMedidaCentimetrosSigla = UnidadeMedida::findOrFail(UnidadeMedidaEnum::CENTIMETROS)->sigla; $examesAvaliados = self::getExamesAvaliados($atendimento); $triagensNeonatal = self::getTriagensNeoNatal($atendimento); $ultimoPreAtendimento = AtendimentoPreAtendimento::whereHas('atendimento', fn ($q) => $q->where('paciente_id', $atendimento->paciente->id) ->whereDate('created_at', $atendimento->created_at) ) ->whereHas('antropometria') ->orderByDesc('created_at') ->first(); $pacienteSoaps = self::getSoapsByPaciente($atendimento->paciente->id); $questionarioMChatR = collect(); $pacienteSoaps->filter(fn ($q) => $q->puericulturaQuestionarioMChatR->isNotEmpty())->each(function($soap) use (&$questionarioMChatR) { $score = PuericulturaQuestionarioMChatR::orderBy('id') ->get() ->reduce(function ($total, $query) use ($soap) { $questionario = $soap->puericulturaQuestionarioMChatR() ->where('questionario_m_chat_r_id', $query->id) ->first(); $valor = $questionario->resposta ? $query->valor_resposta_sim : $query->valor_resposta_nao; return $total + $valor; }, 0); $classificacao = null; if ($score <= 2) { $classificacao = 'Baixo risco'; } elseif ($score >= 3 && $score <= 7) { $classificacao = 'Risco moderado'; } elseif ($score >= 8) { $classificacao = 'Alto risco'; } $questionarioMChatR->push([ 'atendimento_id' => $soap->atendimento_id, 'soap_id' => $soap->id, 'data_hora_atendimento' => $soap->created_at->format('d/m/Y \à\s H:i'), 'usuario_nome' => $soap->createdLotacao->usuario->cidadao->nome ?? null, 'score' => $score, 'classificacao' => $classificacao, ]); }); return [ 'idade_gestacional' => self::getIdadeGestacional($atendimento->paciente), 'ultimo_atendimento_pre_natal' => self::getUltimoAtendimentoPreNatal($atendimento->paciente), 'ultima_dum' => self::getUltimaDum($atendimento->paciente), 'glicemia_capilar' => [ 'momentos_coleta' => GlicemiaCapilarMomentoColeta::orderBy('id')->get(['id', 'nome']), 'valor' => $ultimoPreAtendimento->glicemiaCapilar->valor ?? null, 'momento_coleta' => [ 'nome' => $ultimoPreAtendimento->glicemiaCapilar->momentoColeta->nome ?? null, ] ], 'antropometria' => $ultimoPreAtendimento ? (object) [ 'peso' => $ultimoPreAtendimento->antropometria->peso ?? null, 'peso_unidade_medida_sigla' => $unideMedidaQuilogramasSigla, 'altura' => $ultimoPreAtendimento->antropometria->altura ?? null, 'altura_unidade_medida_sigla' => $unideMedidaCentimetrosSigla, 'imc' => isset($ultimoPreAtendimento->antropometria->peso) && isset($ultimoPreAtendimento->antropometria->altura) ? (object) ImcService::calculate( UnidadeMedidaEnum::QUILOGRAMAS, $ultimoPreAtendimento->antropometria->peso, UnidadeMedidaEnum::CENTIMETROS, $ultimoPreAtendimento->antropometria->altura ) : (object) [ 'imc' => null, 'classificacao' => null, 'grau_obesidade' => null, ], 'perimetro_cefalico' => $ultimoPreAtendimento->antropometria->perimetro_cefalico ?? null, 'perimetro_cefalico_unidade_medida_sigla' => $unideMedidaCentimetrosSigla, 'circunferencia_abdominal' => $ultimoPreAtendimento->antropometria->circunferencia_abdominal ?? null, 'circunferencia_abdominal_unidade_medida_sigla' => $unideMedidaCentimetrosSigla, 'perimetro_panturrilha' => $ultimoPreAtendimento->antropometria->perimetro_panturrilha ?? null, 'perimetro_panturrilha_unidade_medida_sigla' => $unideMedidaCentimetrosSigla, ] : null, 'sinal_vital' => $ultimoPreAtendimento ? (object) [ 'pressao_arterial' => $ultimoPreAtendimento->sinalVital->pressao_arterial ?? null, 'frequencia_respiratoria' => $ultimoPreAtendimento->sinalVital->frequencia_respiratoria ?? null, 'frequencia_cardiaca' => $ultimoPreAtendimento->sinalVital->frequencia_cardiaca ?? null, 'temperatura' => $ultimoPreAtendimento->sinalVital->temperatura ?? null, 'saturacao_o2' => $ultimoPreAtendimento->sinalVital->saturacao_o2 ?? null, ] : null, 'marcador_consumo_alimentar' => [ 'perguntas' => MarcadorConsumoAlimentarService::getGrupoPerguntas($atendimento->paciente->id), 'titulo' => MarcadorConsumoAlimentarService::getTitulo($atendimento->paciente->id), 'titulo_area' => MarcadorConsumoAlimentarService::getTituloArea($atendimento->paciente->id), ], 'tria' => [ 'alimentos_acabaram' => optional($atendimento->paciente->informacaoSocial)->alimentos_acabaram, 'comeu_alguns_alimentos' => optional($atendimento->paciente->informacaoSocial)->comeu_alguns_alimentos, 'data_atualizacao_tria' => optional($atendimento->paciente->informacaoSocial)->data_atualizacao_tria ? (new Carbon(optional($atendimento->paciente->informacaoSocial)->data_atualizacao_tria))->format('d/m/Y') : null, 'is_desatualizado' => self::isTriaDesatualizado( optional($atendimento->paciente->informacaoSocial)->data_atualizacao_tria ?? optional($atendimento->paciente->cadastroIndividual)->data_atualizacao_tria ?? optional($atendimento->paciente->cadastroIndividual)->updated_at ), ], 'resultado_exame' => [ 'resultado_tipos' => ExameResultadoTipo::get(['id', 'nome']), ], 'coletas_materiais' => is_null($preAtendimento) ? [] : $preAtendimento->coletasMateriais()->orderBy('nome')->pluck('nome'), 'outros_procedimentos' => is_null($preAtendimento) ? [] : $preAtendimento->outrosProcedimentos()->orderBy('nome')->pluck('nome'), 'administracoes_medicamentos' => is_null($preAtendimento) ? [] : $preAtendimento->administracoesMedicamentos()->orderBy('descricao')->pluck('descricao'), 'resultados_exames_laboratoriais' => self::getResultadosExamesLaboratoriais($atendimento->paciente), 'resultados_exames_imagens' => self::getResultadosExamesImagens($atendimento->paciente), 'exame_solicitado_avaliado' => ExameSolicitadoAvaliado::whereNotIn('id', $examesAvaliados->pluck('id')) ->orderBy('descricao') ->get(), 'exames_avaliados' => $examesAvaliados, 'triagens_neonatal' => $triagensNeonatal, 'triagem_neonatal' => TriagemNeonatal::whereNotIn('id', $triagensNeonatal->pluck('id')) ->orderBy('descricao') ->get(), 'pre_natal' => self::getPreNatalFormData(), 'puericultura' => [ 'gravidez_tipos' => GravidezTipo::get(['id', 'nome']), 'parto_tipos' => PartoTipo::get(['id', 'nome']), 'aleitamento_tipos' => AleitamentoMaterno::get(['id', 'descricao']), 'questionario_m_chat_r' => $questionarioMChatR, ], ]; } public static function getIdadeGestacional($paciente) { $atendimento = AtendimentoSoap::where('is_rascunho', false) ->whereNotNull('dum') ->where(fn($q) => $q->whereHas('atendimento.agendamento', fn($q) => $q->where('paciente_id', $paciente->id)) ->orWhereHas('atendimento.demandaEspontanea', fn($q) => $q->where('paciente_id', $paciente->id)) ) ->whereHas('problemasCondicoes', fn($q) => $q->where('situacao_id', '<>', ProblemaCondicaoSituacaoEnum::RESOLVIDO) ->whereHas('pacienteGestacao', fn($q) => $q->whereNull('fim')) ->where(fn($q) => $q->whereHas('ciap', fn($q) => $q->where('codigo', self::CIAPS_GRAVIDEZ_NORMAL)) ->orWhereHas('cid', fn($q) => $q->whereIn('codigo', self::CIDS_GRAVIDEZ_NORMAL)) ) ) ->orderByDesc('ambulatorio_atendimento_soap.created_at') ->first(); if($atendimento) { $interval = $atendimento->dum->diff(Carbon::today()); return [ 'semanas' => floor($interval->days / 7), 'dias' => $interval->days % 7, ]; } return null; } private static function getUltimoAtendimentoPreNatal($paciente) { return DB::table('ambulatorio_atendimento_soap as soap') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->leftjoin('ambulatorio_agendamento as agendamento', 'agendamento.id', 'atendimento.agendamento_id') ->leftJoin('ambulatorio_demanda_espontanea as demanda', 'demanda.id', 'atendimento.demanda_espontanea_id') ->leftjoin('ambulatorio_jornada as jornada', 'jornada.id', 'agendamento.jornada_id') ->leftjoin('cadastro_lotacao as lotacao', 'lotacao.id', 'jornada.lotacao_id') ->join('cadastro_usuario as usuario', function($join) { $join->on('usuario.id', 'lotacao.usuario_id') ->orOn('usuario.id', 'demanda.usuario_id'); }) ->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id') ->where('soap.is_rascunho', false) ->where('is_atendimento_pre_natal', true) ->where('atendimento.paciente_id', $paciente->id) ->select(DB::raw(" DATE_FORMAT(soap.created_at, '%d/%m/%Y') as data, cidadao.nome as usuario_nome ")) ->orderByDesc('soap.created_at') ->first(); } public static function getUltimaDum($paciente) { if ($paciente->cidadao->sexo_id === Sexo::FEMININO) { $soap = DB::table('ambulatorio_atendimento_soap as soap') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->where('soap.is_rascunho', false) ->whereNotNull('dum') ->where('atendimento.paciente_id', $paciente->id) ->select(DB::raw(" soap.created_at, DATE_FORMAT(soap.dum, '%d/%m/%Y') as dum ")) ->union(DB::table('ambulatorio_atendimento_pre_atendimento as pre_atendimento') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'pre_atendimento.atendimento_id') ->whereNotNull('dum') ->where('atendimento.paciente_id', $paciente->id) ->select(DB::raw(" pre_atendimento.created_at, DATE_FORMAT(pre_atendimento.dum, '%d/%m/%Y') as dum ")) ) ->orderByDesc('created_at') ->first('dum'); if (!is_null($soap)) { return $soap->dum; } } return null; } private static function getResultadosExamesLaboratoriais($paciente) { return self::getResultadosExamesLaboratoriaisAmbulatorio($paciente) ->concat(self::getResultadosExamesLaboratoriaisExameLaboratorial($paciente)); } private static function getResultadosExamesLaboratoriaisAmbulatorio($paciente) { return AtendimentoSoapResultadoExame::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->whereHas('exame', fn ($q) => $q->where('tipo_id', ExameTipo::LABORATORIAL)) ->get() ->map(fn ($resultado) => array_merge(self::getLogData($resultado), [ 'origem' => 'ambulatorio', 'percentual' => $resultado->percentual, 'idade_gestacional_semanas_eco' => $resultado->idade_gestacional_semanas_eco, 'idade_gestacional_dias_eco' => $resultado->idade_gestacional_dias_eco, 'dpp_eco' => is_null($resultado->dpp_eco) ? null : $resultado->dpp_eco->format('d/m/Y'), 'exame' => [ 'codigo' => $resultado->exame->codigo, 'nome' => $resultado->exame->nome, ], 'solicitado_em' => is_null($resultado->solicitado_em) ? null : $resultado->solicitado_em->format('d/m/Y'), 'realizado_em' => $resultado->realizado_em->format('d/m/Y'), 'resultado_em' => is_null($resultado->resultado_em) ? null : $resultado->resultado_em->format('d/m/Y'), 'resultado' => $resultado->resultado, 'resultado_tipo_nome' => $resultado->resultadoTipo->nome ?? null, ])); } private static function getResultadosExamesLaboratoriaisExameLaboratorial($paciente) { $agendamentos = collect(); $setWhereStatus = function ($query) { $query->where(fn ($q) => $q ->whereIn('agendamento_exame.status_id', [ StatusAgendamento::ASSINADO, StatusAgendamento::PENDENTE_ENTREGA, StatusAgendamento::ENTREGUE, ]) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('exame_laboratorial_agendamento_exame_resultado AS resultado') ->whereColumn('resultado.agendamento_exame_id', 'agendamento_exame.id') ) ) ->orWhere(fn ($q) => $q ->whereIn('agendamento_exame.status_id', [ StatusAgendamento::REALIZADO, StatusAgendamento::PENDENTE_ASSINATURA, StatusAgendamento::ASSINADO, StatusAgendamento::PENDENTE_ENTREGA, StatusAgendamento::ENTREGUE, ]) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('exame_laboratorial_agendamento_laudo AS laudo') ->whereColumn('laudo.agendamento_id', 'agendamento.id') ) ); }; DB::table('exame_laboratorial_agendamento_exame AS agendamento_exame') ->join('parametrizacao_exame AS exame', 'exame.id', 'agendamento_exame.exame_id') ->join('cadastro_grupo AS grupo', 'grupo.id', 'exame.grupo_tipo_id') ->join('exame_laboratorial_agendamento AS agendamento', 'agendamento.id', 'agendamento_exame.agendamento_id') ->leftJoin('cadastro_usuario AS coleta_usuario', 'coleta_usuario.id', 'agendamento.usuario_id') ->leftJoin('cadastro_cidadao AS coleta_cidadao', 'coleta_cidadao.id', 'coleta_usuario.cidadao_id') ->leftJoin('sigtap.ocupacao AS coleta_ocupacao', 'coleta_ocupacao.id', 'agendamento.ocupacao_id') ->whereNotNull('exame.grupo_tipo_id') ->where($setWhereStatus) ->where('exame.mapa_agrupado', true) ->where('agendamento.paciente_id', $paciente->id) ->select( 'agendamento.id AS agendamento_id', DB::raw("CONCAT(agendamento.data, ' ', agendamento.horario) AS data_hora_agendada"), 'coleta_cidadao.nome AS coleta_usuario_nome', 'coleta_ocupacao.nome AS coleta_ocupacao_nome', DB::raw("CAST(agendamento_exame.data_coleta AS DATE) AS data_coleta"), DB::raw("IF (agendamento_exame.status_id IN ( " . StatusAgendamento::REALIZADO . ", " . StatusAgendamento::PENDENTE_ASSINATURA . " ), NULL, CAST(agendamento_exame.data_laudo AS DATE) ) AS data_resultado"), 'agendamento_exame.assinatura_profissional_id', 'grupo.id AS exame_grupo_id', 'grupo.nome AS exame_grupo_nome', DB::raw('TRUE AS pertence_grupo'), DB::raw('TRUE AS mapa_agrupado') ) ->groupBy( 'agendamento.id', 'grupo.id', 'agendamento_exame.assinatura_profissional_id', ) ->unionAll(DB::table('exame_laboratorial_agendamento_exame AS agendamento_exame') ->join('parametrizacao_exame AS exame', 'exame.id', 'agendamento_exame.exame_id') ->join('exame_laboratorial_agendamento AS agendamento', 'agendamento.id', 'agendamento_exame.agendamento_id') ->leftJoin('cadastro_usuario AS coleta_usuario', 'coleta_usuario.id', 'agendamento.usuario_id') ->leftJoin('cadastro_cidadao AS coleta_cidadao', 'coleta_cidadao.id', 'coleta_usuario.cidadao_id') ->leftJoin('sigtap.ocupacao AS coleta_ocupacao', 'coleta_ocupacao.id', 'agendamento.ocupacao_id') ->whereNotNull('exame.grupo_tipo_id') ->where($setWhereStatus) ->where(fn ($q) => $q ->where('exame.mapa_agrupado', false) ->orWhereNull('exame.mapa_agrupado') ) ->where('agendamento.paciente_id', $paciente->id) ->select( 'agendamento.id AS agendamento_id', DB::raw("CONCAT(agendamento.data, ' ', agendamento.horario) AS data_hora_agendada"), 'coleta_cidadao.nome AS coleta_usuario_nome', 'coleta_ocupacao.nome AS coleta_ocupacao_nome', DB::raw("CAST(agendamento_exame.data_coleta AS DATE) AS data_coleta"), DB::raw("IF (agendamento_exame.status_id IN ( " . StatusAgendamento::REALIZADO . ", " . StatusAgendamento::PENDENTE_ASSINATURA . " ), NULL, CAST(agendamento_exame.data_laudo AS DATE) ) AS data_resultado"), 'agendamento_exame.assinatura_profissional_id', 'exame.id AS exame_grupo_id', 'exame.nome AS exame_grupo_nome', DB::raw('TRUE AS pertence_grupo'), DB::raw('FALSE AS mapa_agrupado') ) ->groupBy( 'agendamento.id', 'exame.id' ) ) ->unionAll(DB::table('exame_laboratorial_agendamento_exame AS agendamento_exame') ->join('parametrizacao_exame AS exame', 'exame.id', 'agendamento_exame.exame_id') ->join('exame_laboratorial_agendamento AS agendamento', 'agendamento.id', 'agendamento_exame.agendamento_id') ->leftJoin('cadastro_usuario AS coleta_usuario', 'coleta_usuario.id', 'agendamento.usuario_id') ->leftJoin('cadastro_cidadao AS coleta_cidadao', 'coleta_cidadao.id', 'coleta_usuario.cidadao_id') ->leftJoin('sigtap.ocupacao AS coleta_ocupacao', 'coleta_ocupacao.id', 'agendamento.ocupacao_id') ->whereNull('exame.grupo_tipo_id') ->where($setWhereStatus) ->where('agendamento.paciente_id', $paciente->id) ->select( 'agendamento.id AS agendamento_id', DB::raw("CONCAT(agendamento.data, ' ', agendamento.horario) AS data_hora_agendada"), 'coleta_cidadao.nome AS coleta_usuario_nome', 'coleta_ocupacao.nome AS coleta_ocupacao_nome', DB::raw("CAST(agendamento_exame.data_coleta AS DATE) AS data_coleta"), DB::raw("IF (agendamento_exame.status_id IN ( " . StatusAgendamento::REALIZADO . ", " . StatusAgendamento::PENDENTE_ASSINATURA . " ), NULL, CAST(agendamento_exame.data_laudo AS DATE) ) AS data_resultado"), 'agendamento_exame.assinatura_profissional_id', 'exame.id AS exame_grupo_id', 'exame.nome AS exame_grupo_nome', DB::raw('FALSE AS pertence_grupo'), DB::raw('NULL AS mapa_agrupado') ) ) ->get() ->each(function ($agendamentoExame) use ($agendamentos) { $agendamento = $agendamentos->where('agendamento_id', $agendamentoExame->agendamento_id)->first(); if (is_null($agendamento)) { $agendamento = (object) [ 'origem' => 'exame-laboratorial', 'agendamento_id' => $agendamentoExame->agendamento_id, 'data_hora_agendada' => Carbon::create($agendamentoExame->data_hora_agendada)->format('d/m/Y \à\s H:i'), 'coleta_usuario_nome' => $agendamentoExame->coleta_usuario_nome, 'coleta_ocupacao_nome' => $agendamentoExame->coleta_ocupacao_nome, 'laudos' => self::getExameLaboratorialLaudos($agendamentoExame->agendamento_id), 'exames' => collect(), ]; $agendamentos->push($agendamento); } $agendamento->exames->push((object) [ 'agendamento_id' => $agendamentoExame->agendamento_id, 'exame_grupo_id' => $agendamentoExame->exame_grupo_id, 'exame_grupo_nome' => $agendamentoExame->exame_grupo_nome, 'pertence_grupo' => $agendamentoExame->pertence_grupo, 'mapa_agrupado' => $agendamentoExame->mapa_agrupado, 'data_coleta' => $agendamentoExame->data_coleta, 'data_resultado' => $agendamentoExame->data_resultado, 'assinatura_profissional_id' => $agendamentoExame->assinatura_profissional_id, ]); }); $agendamentos->each(function ($agendamento) { unset($agendamento->agendamento_id); }); return $agendamentos; } private static function getExameLaboratorialLaudos($agendamentoId) { return DB::table('exame_laboratorial_agendamento_laudo AS laudo') ->leftJoin('cadastro_lotacao AS lotacao', 'lotacao.id', 'laudo.created_lotacao_id') ->leftJoin('cadastro_usuario AS usuario', 'usuario.id', 'lotacao.usuario_id') ->leftJoin('cadastro_cidadao AS cidadao', 'cidadao.id', 'usuario.cidadao_id') ->leftJoin('web_service_usuario AS ws_usuario', 'ws_usuario.id', 'laudo.externo_created_usuario_id') ->where('laudo.agendamento_id', $agendamentoId) ->select( 'laudo.id', 'laudo.arquivo', 'laudo.url', DB::raw("CAST(laudo.created_at AS DATE) AS data"), DB::raw("COALESCE(cidadao.nome, CONCAT(ws_usuario.nome, ' (Web service)')) AS responsavel") ) ->get(); } private static function getResultadosExamesImagens($paciente) { return self::getResultadosExamesImagensAmbulatorio($paciente) ->concat(self::getResultadosExamesLaboratoriaisExameImagem($paciente)); } private static function getResultadosExamesImagensAmbulatorio($paciente) { return AtendimentoSoapResultadoExame::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->whereHas('exame', fn ($q) => $q->where('tipo_id', ExameTipo::IMAGEM)) ->get() ->map(fn ($resultado) => array_merge(self::getLogData($resultado), [ 'origem' => 'ambulatorio', 'percentual' => $resultado->percentual, 'idade_gestacional_semanas_eco' => $resultado->idade_gestacional_semanas_eco, 'idade_gestacional_dias_eco' => $resultado->idade_gestacional_dias_eco, 'dpp_eco' => is_null($resultado->dpp_eco) ? null : $resultado->dpp_eco->format('d/m/Y'), 'exame' => [ 'codigo' => $resultado->exame->codigo, 'nome' => $resultado->exame->nome, ], 'solicitado_em' => is_null($resultado->solicitado_em) ? null : $resultado->solicitado_em->format('d/m/Y'), 'realizado_em' => $resultado->realizado_em->format('d/m/Y'), 'resultado_em' => is_null($resultado->resultado_em) ? null : $resultado->resultado_em->format('d/m/Y'), 'resultado' => $resultado->resultado, 'resultado_tipo_nome' => $resultado->resultadoTipo->nome ?? null, ])); } private static function getResultadosExamesLaboratoriaisExameImagem($paciente) { $agendamentos = collect(); DB::table('exame_imagem_agendamento_exame AS agendamento_exame') ->join('parametrizacao_exame AS exame', 'exame.id', 'agendamento_exame.exame_id') ->join('exame_imagem_historico_alteracao AS historico', fn ($j) => $j ->on('historico.agendamento_exame_id', 'agendamento_exame.id') ->where('historico.id', fn ($q) => $q ->select('historico2.id') ->from('exame_imagem_historico_alteracao AS historico2') ->whereColumn('historico2.agendamento_exame_id', 'agendamento_exame.id') ->orderByDesc('historico2.created_at') ->limit(1) ) ) ->join('exame_imagem_agendamento AS agendamento', 'agendamento.id', 'agendamento_exame.agendamento_id') ->join('exame_imagem_jornada AS jornada', 'jornada.id', 'agendamento.jornada_id') ->join('cadastro_usuario AS jornada_usuario', 'jornada_usuario.id', 'jornada.usuario_id') ->join('cadastro_cidadao AS jornada_cidadao', 'jornada_cidadao.id', 'jornada_usuario.cidadao_id') ->whereIn('agendamento_exame.status_id', [FechamentoStatus::REALIZADO, FechamentoStatus::RESULTADO]) ->where('agendamento.paciente_id', $paciente->id) ->where(fn ($q) => $q ->whereNotNull('agendamento_exame.resultado') ->orWhereNotNull('historico.arquivo') ) ->select( 'agendamento.id AS agendamento_id', 'agendamento_exame.id AS agendamento_exame_id', DB::raw("CONCAT(agendamento.data, ' ', agendamento.hora_exame) AS data_hora_agendada"), 'jornada_cidadao.nome AS usuario_nome', 'exame.nome AS exame_nome', DB::raw("IF(agendamento_exame.resultado IS NOT NULL, TRUE, FALSE) AS has_resultado"), DB::raw("IF(agendamento_exame.arquivo IS NOT NULL, TRUE, FALSE) AS has_laudo"), DB::raw("historico.created_at AS data_hora_resultado_laudo") ) ->get() ->map(function ($agendamentoExame) use ($agendamentos) { $agendamento = $agendamentos->where('agendamento_id', $agendamentoExame->agendamento_id)->first(); if (is_null($agendamento)) { $agendamento = (object) [ 'origem' => 'exame-imagem', 'agendamento_id' => $agendamentoExame->agendamento_id, 'data_hora_agendada' => Carbon::create($agendamentoExame->data_hora_agendada)->format('d/m/Y \à\s H:i'), 'usuario_nome' => $agendamentoExame->usuario_nome, 'exames' => collect(), ]; $agendamentos->push($agendamento); } $agendamento->exames->push((object) [ 'agendamento_exame_id' => $agendamentoExame->agendamento_exame_id, 'exame_nome' => $agendamentoExame->exame_nome, 'has_resultado' => (bool) $agendamentoExame->has_resultado, 'has_laudo' => (bool) $agendamentoExame->has_laudo, 'data_hora_resultado_laudo' => $agendamentoExame->data_hora_resultado_laudo, ]); }); $agendamentos->each(function ($agendamento) { unset($agendamento->agendamento_id); }); return $agendamentos; } private static function getAvaliacaoFormData($atendimento) { return [ 'problema_condicao' => [ 'condicoes_avaliadas' => CondicaoAvaliada::whereNotIn('id', [ AtendimentoIndividualCondicaoAvaliada::PRE_NATAL, AtendimentoIndividualCondicaoAvaliada::PUERICULTURA, ]) ->orderBy('descricao') ->get(['id', 'descricao']), 'condicoes_emad' => AtendimentoDomiciliarCondicaoAvaliada::get() ->map(function($query) { return [ 'nome' => $query->nome, 'codigo' => $query->codigo ]; }), 'doencas_transmissiveis' => DoencaTransmissivel::orderBy('descricao')->get(['id', 'descricao']), 'rastreamentos' => Rastreamento::orderBy('descricao')->get(['id', 'descricao']), 'problemas_condicoes_paciente' => self::getProblemasCondicoesAtivosOuLatentes($atendimento->paciente), 'situacoes' => ProblemaCondicaoSituacao::orderBy('nome')->get(['id', 'nome']), ], 'alergia' => [ 'tipos' => AlergiaTipo::orderBy('descricao')->get(['id', 'descricao']), 'criticidades' => AlergiaCriticidade::orderBy('nome')->get(['id', 'nome']), ], 'pre_natal' => self::getPreNatalFormData(), 'saude_bucal' => [ 'vigilancias' => SaudeBucalVigilancia::orderBy('nome')->get(['id', 'nome']), ], ]; } private static function getProblemasCondicoesAtivosOuLatentes($paciente) { return AtendimentoSoapProblemaCondicao::whereIn('situacao_id', [ ProblemaCondicaoSituacaoEnum::ATIVO, ProblemaCondicaoSituacaoEnum::LATENTE, ]) ->whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->whereDoesntHave('problemaCondicaoPosterior', fn ($q) => $q ->whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ) ) ->get() ->map(fn ($problemaCondicao) => array_merge(self::getLogData($problemaCondicao), [ 'id' => $problemaCondicao->id, 'ciap' => [ 'id' => $problemaCondicao->ciap_id, 'codigo' => $problemaCondicao->ciap->codigo ?? null, 'descricao' => $problemaCondicao->ciap->descricao ?? null, ], 'cid' => [ 'id' => $problemaCondicao->cid_id, 'codigo' => $problemaCondicao->cid->codigo ?? null, 'nome' => $problemaCondicao->cid->nome ?? null, ], 'situacao_id' => $problemaCondicao->situacao_id, 'situacao_nome' => $problemaCondicao->situacao->nome, 'inicio' => is_null($problemaCondicao->inicio) ? null : $problemaCondicao->inicio->format('d/m/Y'), 'fim' => is_null($problemaCondicao->fim) ? null : $problemaCondicao->fim->format('d/m/Y'), 'observacao' => $problemaCondicao->observacao, ])); } private static function getPreNatalFormData() { return [ 'gravidez_tipos' => GravidezTipo::orderBy('id')->get(['id', 'nome']), 'edemas' => GravidezEdema::orderBy('id')->get(['id', 'nome']), ]; } private static function getPlanoFormData($atendimento, $soapRascunho) { $testesRapidosRealizados = self::getTestesRapidosRealizados($atendimento); $ultimoPreAtendimento = AtendimentoPreAtendimento::whereHas('atendimento', fn ($q) => $q->where('paciente_id', $atendimento->paciente->id) ->whereDate('created_at', $atendimento->created_at->format('Y-m-d')) ) ->whereHas('testesRapidos') ->orderByDesc('created_at') ->first(); return [ 'saude_bucal' => self::getPlanoSaudeBucalFormData($atendimento->paciente), 'encaminhamento_hospitalar' => [ 'procedimento' => [ 'clinicas' => AmbulatorioEncaminhamentoClinica::orderBy('nome')->get(['id', 'nome']), 'caraters_internacao' => AmbulatorioEncaminhamentoCaraterInternacao::orderBy('nome')->get(['id', 'nome']), 'documentos' => DocumentoTipo::orderBy('nome')->whereIn('id', [ DocumentoTipoEnum::CPF, DocumentoTipoEnum::CNS, ])->get(['id', 'nome']), ], 'causa_externa' => [ 'causas_externas' => \App\Models\ProntoAtendimento\Aih\CausaExterna::orderBy('nome')->get(['id', 'nome']) ->prepend(['id' => null, 'nome' => 'NÃO INFORMADO']), 'vinculos_previdencia' => \App\Models\ProntoAtendimento\Aih\VinculoPrevidencia::orderBy('nome')->get(['id', 'nome']) ->prepend(['id' => null, 'nome' => 'NÃO INFORMADO']), ], 'autorizacao' => [ 'documentos' => DocumentoTipo::orderBy('nome')->whereIn('id', [ DocumentoTipoEnum::CPF, DocumentoTipoEnum::CNS, ])->get(['id', 'nome']), ], ], 'prescricao_medicamentos' => [ 'receita_tipos' => ReceitaTipo::whereIn('id', [TipoReceita::COMUM, TipoReceita::ESPECIAL]) ->orderBy('nome') ->get(['id', 'nome']), 'frequencias_dose' => [ ['value' => PrescricaoFrequenciaDose::INTERVALO, 'text' => 'Intervalo'], ['value' => PrescricaoFrequenciaDose::FREQUENCIA, 'text' => 'Frequência'], ['value' => PrescricaoFrequenciaDose::TURNO, 'text' => 'Turno'], ], 'intervalos' => [4, 6, 8, 12, 24], 'frequencias' => [1, 2, 3, 4], 'turnos' => Turno::orderBy('id')->get(['id', 'nome']), 'unidades_medida_tempo' => MedidaTempo::whereIn('id', [ MedidaTempoEnum::DIAS, MedidaTempoEnum::SEMANAS, MedidaTempoEnum::MESES, ]) ->orderBy('id') ->get(['id', 'nome']), ], 'unidades_medida' => self::getUnidadesMedida(), 'solicitacao_exame_comum' => [ 'kits_exames' => self::getKitsExames(), 'classificacoes_risco' => ClassificacaoRisco::orderBy('id') ->get(['id', 'nome', 'descricao_encaminhamento', 'cor']), ], 'solicitacao_exame_alto_custo' => [ 'classificacoes_risco' => ClassificacaoRisco::orderBy('id') ->get(['id', 'nome', 'descricao_encaminhamento', 'cor']), ], 'solicitacao_procedimento_cirurgico' => [ 'classificacoes_risco' => ClassificacaoRisco::orderBy('id') ->get(['id', 'nome', 'descricao_encaminhamento', 'cor']), ], 'atestado' => [ 'modelos' => AtestadoModelo::orderBy('id')->get(['id', 'nome']), 'documento_tipos' => DocumentoTipo::whereIn('id', [ DocumentoTipoEnum::CNS, DocumentoTipoEnum::CPF, ]) ->orderBy('nome') ->get(['id', 'nome']), ], 'declaracao_comparecimento' => [ 'turnos' => Turno::orderBy('id')->get(['id', 'nome']), ], 'encaminhamento' => [ 'encaminhamentos' => Encaminhamento::orderBy('descricao') ->whereNotIn('id', [EncaminhamentoEnum::ENCAMINHAMENTO_INTERNO_NO_DIA]) ->get(['id', 'descricao']), 'servico_especializado' => [ 'especialidades' => Especialidade::where('ativo', true) ->where('encaminhamento', true) ->where(function ($q) { $q->where('is_regulado', false) ->orWhere(function ($q2) { $q2->where('is_regulado', true) ->whereExists(function ($sub) { $sub->select(DB::raw(1)) ->from('regulacao_parametrizacao_solicitante as solicitante') ->join('regulacao_parametrizacao_solicitante_regulador as regulador', 'regulador.solicitante_id', 'solicitante.id') ->join('regulacao_parametrizacao_solicitante_regulador_especialidade as regulador_especialidade', 'regulador_especialidade.solicitante_regulador_id', 'regulador.id') ->whereColumn('regulador_especialidade.especialidade_id', 'cadastro_especialidade.id') ->where('solicitante.infraestrutura_id', self::getCurrentCentroCusto()->infraestrutura_id); }); }); }) ->orderBy('nome') ->get(['id', 'nome', 'ocupacao_id', 'exigir_peso_altura_circunferencia']) ->map(fn ($especialidade) => [ 'id' => $especialidade->id, 'descricao' => "{$especialidade->ocupacao->codigo} - {$especialidade->nome}", 'exigir_peso_altura_circunferencia' => $especialidade->exigir_peso_altura_circunferencia, ]), 'classificacoes_risco' => ClassificacaoRisco::orderBy('id') ->get(['id', 'nome', 'descricao_encaminhamento', 'cor']), ], 'intersetorial' => [ 'unidades' => self::getEncaminhamentoIntersetorialUnidades(), 'infraestruturas' => [], ], ], 'compartilhamento_cuidado' => [ 'especialidades' => Especialidade::where('ativo', true) ->orderBy('nome') ->get(['id', 'nome', 'ocupacao_id']) ->map(fn ($especialidade) => [ 'id' => $especialidade->id, 'descricao' => "{$especialidade->ocupacao->codigo} - {$especialidade->nome}", ]), 'classificacoes_risco' => ClassificacaoRisco::orderBy('id')->get(['id', 'nome', 'cor']), ], 'prescricoes_medicamentos' => self::getPrescricoesMedicamentos($atendimento->paciente, $soapRascunho), 'solicitacoes_exames_comuns' => self::getSolicitacaoExamesComuns($atendimento->paciente), 'solicitacoes_exames_alto_custo' => self::getSolicitacaoExamesAltoCusto($atendimento->paciente), 'solicitacoes_procedimentos_cirurgicos' => self::getSolicitacaoProcedimentosCirurgicos($atendimento->paciente), 'testes_rapidos' => TesteRapido::whereNotIn('id', $testesRapidosRealizados->pluck('id')) ->whereNotIn('id', [ TesteRapidoEnum::DETECCAO_DE_HEPATITE_C, TesteRapidoEnum::SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO, TesteRapidoEnum::DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO, TesteRapidoEnum::DETECCAO_DE_INFECCAO_PELO_HBV ]) ->orderBy('nome') ->get(['id', 'codigo', 'nome']), 'testes_rapidos_ultimo_atendimento' => $ultimoPreAtendimento->testesRapidos ?? null, 'testes_rapidos_realizados' => $testesRapidosRealizados, 'atestados' => self::getAtestados($atendimento->paciente), 'declaracoes_comparecimento' => self::getDeclaracoesComparecimento($atendimento->paciente), 'orientacoes' => self::getOrientacoes($atendimento->paciente), 'cartas_medicas' => self::getCartasMedicas($atendimento->paciente), 'encaminhamentos' => self::getEncaminhamentos($atendimento->paciente), 'exame_solicitado_avaliado' => ExameSolicitadoAvaliado::whereNotIn('id', self::getExameSolicitadosItens($atendimento)) ->whereNotIn('id', [EnumExameSolicitadoAvaliado::ELETROCARDIOGRAMA, EnumExameSolicitadoAvaliado::ESPIROMETRIA, EnumExameSolicitadoAvaliado::ULTRASSONOGRAFIA_OBSTETRICA]) ->orderBy('descricao') ->get(), 'exames_solicitados' => self::getExameSolicitados($atendimento), 'triagens_neonatal' => self::getTriagemNeonatalSolicitados($atendimento), 'triagem_neonatal' => TriagemNeonatal::whereNotIn('id', self::getTriagemNeonatalSolicitadosItens($atendimento)) ->orderBy('descricao') ->get(), 'procedimentos_emad' => Procedimento::whereIn('codigo', [ EnumAtendimentoDomiciliarProcedimento::ACOMPANHAMENTO_PACIENTE_REABILITACAO_COMUNICACAO, EnumAtendimentoDomiciliarProcedimento::ANTIBIOTICOTERAPIA_PARENTERAL, EnumAtendimentoDomiciliarProcedimento::ATENDIMENTO_ACOMPANHAMENTO_PACIENTE_REABILITACAO_DESENVOLVIMENTO_MOTOR, EnumAtendimentoDomiciliarProcedimento::ATENDIMENTO_FISIOTERAPEUTICO_PACIENTE_TRANSTORNO_RESPIRATORIO_SEM_COMPLICACOES_SISTEMICAS, EnumAtendimentoDomiciliarProcedimento::ATEMDIMENTO_MEDICO_FINALIDADE_ATESTAR_OBITO, EnumAtendimentoDomiciliarProcedimento::ATENDIMENTO_ACOMPANHAMENTO_REABILITACAO_MULTIPLAS_DEFICIENCIAS, EnumAtendimentoDomiciliarProcedimento::CATETERISMO_VESICAL_ALIVIO, EnumAtendimentoDomiciliarProcedimento::CATETERISMO_VESICAL_DEMORA, EnumAtendimentoDomiciliarProcedimento::COLETA_MATERIAL_EXAME_LABORATORIAL, EnumAtendimentoDomiciliarProcedimento::CUIDADOS_ESTOMAS, EnumAtendimentoDomiciliarProcedimento::CUIDADOS_TRAQUEOSTOMIA, EnumAtendimentoDomiciliarProcedimento::ENEMA, EnumAtendimentoDomiciliarProcedimento::OXIGENOTERAPIA, EnumAtendimentoDomiciliarProcedimento::RETIRADAS_PONTOS_CIRURGIAS_BASICAS, EnumAtendimentoDomiciliarProcedimento::SONDAGEM_GASTRICA, EnumAtendimentoDomiciliarProcedimento::TERAPIA_REIDRATACAO_ORAL, EnumAtendimentoDomiciliarProcedimento::TERAPIA_REIDRATACAO_PARENTERAL, EnumAtendimentoDomiciliarProcedimento::TERAPIA_FONOAUDIOLOGICA_INDIVIDUAL, EnumAtendimentoDomiciliarProcedimento::TRATAMENTO_TRAUMATISMO, EnumAtendimentoDomiciliarProcedimento::TRATAMENTO_REABILITACAO, EnumAtendimentoDomiciliarProcedimento::TRAQUEOSTOMIA, ]) ->groupBy('codigo') ->get() ->map(function($query){ return [ 'id' => $query->id, 'nome' => $query->nome, 'codigo' => $query->codigo ]; }), ]; } private static function getPlanoSaudeBucalFormData($paciente) { $odontogramasData = self::getOdontogramas($paciente); return [ 'odontograma' => self::getPlanoSaudeBucalOdontogramaFormData(), 'odontogramas' => $odontogramasData['odontogramas'], 'procedimentos' => $odontogramasData['procedimentos'], ]; } private static function getPlanoSaudeBucalOdontogramaFormData() { return [ 'proteses_totais' => [ ['value' => 'superior', 'text' => 'Total superior'], ['value' => 'inferior', 'text' => 'Total inferior'], ], 'dentes' => [ 'dente' => [ 'problemas_condicoes' => self::getDentesProblemasCondicoes(), ], ], ]; } private static function getDentesProblemasCondicoes() { return [ [ 'dentes' => [18, 17, 16, 15, 14, 24, 25, 26, 27, 28, 48, 47, 46, 45, 44, 34, 35, 36, 37, 38], 'itens' => SaudeBucalDenteProblemaCondicao::orderBy('nome') ->whereIn('id', [ SaudeBucalDenteProblemaCondicaoEnum::AUSENTE_A, SaudeBucalDenteProblemaCondicaoEnum::EXTRAIDO_E, SaudeBucalDenteProblemaCondicaoEnum::HIGIDO_H, SaudeBucalDenteProblemaCondicaoEnum::HIGIDO_SELADO_HS, SaudeBucalDenteProblemaCondicaoEnum::PROTESE_PARCIAL_REMOVIVEL, SaudeBucalDenteProblemaCondicaoEnum::PROTESE_TEMPORARIA, SaudeBucalDenteProblemaCondicaoEnum::INCLUSO_I, SaudeBucalDenteProblemaCondicaoEnum::PROTESE_CORONARIA_UNITARIA, SaudeBucalDenteProblemaCondicaoEnum::COROA_CO, SaudeBucalDenteProblemaCondicaoEnum::IMPLANTE, SaudeBucalDenteProblemaCondicaoEnum::PILAR_P, SaudeBucalDenteProblemaCondicaoEnum::NUCLEO_PINO, SaudeBucalDenteProblemaCondicaoEnum::RESTO_RADICULAR_RR, SaudeBucalDenteProblemaCondicaoEnum::RETRACAO_GENGIVAL_RG, SaudeBucalDenteProblemaCondicaoEnum::CALCULO_DENTAL_CD, SaudeBucalDenteProblemaCondicaoEnum::EXTRACAO_INDICADA_EI, SaudeBucalDenteProblemaCondicaoEnum::SELANTE_INDICADO_SI, SaudeBucalDenteProblemaCondicaoEnum::FRATURA_FR, SaudeBucalDenteProblemaCondicaoEnum::MANCHA_BRANCA_ATIVA_M, SaudeBucalDenteProblemaCondicaoEnum::CARIADO_C, SaudeBucalDenteProblemaCondicaoEnum::RESTAURADO_R, SaudeBucalDenteProblemaCondicaoEnum::CARIE_DA_RAIZ, SaudeBucalDenteProblemaCondicaoEnum::RESTAURADO_COM_CARIE_RC, SaudeBucalDenteProblemaCondicaoEnum::RAIZ_RESTAURADA, SaudeBucalDenteProblemaCondicaoEnum::NECESSITA_DE_TRATAMENTO_ENDODONTICO, SaudeBucalDenteProblemaCondicaoEnum::POSSUI_LESAO_DE_FURCA, SaudeBucalDenteProblemaCondicaoEnum::TRATAMENTO_ENDODONTICO_REALIZADO, SaudeBucalDenteProblemaCondicaoEnum::LESAO_DE_FURCA_TRATADA, ]) ->get(['id', 'nome']), ], [ 'dentes' => [13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33], 'itens' => SaudeBucalDenteProblemaCondicao::orderBy('nome') ->whereIn('id', [ SaudeBucalDenteProblemaCondicaoEnum::AUSENTE_A, SaudeBucalDenteProblemaCondicaoEnum::EXTRAIDO_E, SaudeBucalDenteProblemaCondicaoEnum::HIGIDO_H, SaudeBucalDenteProblemaCondicaoEnum::HIGIDO_SELADO_HS, SaudeBucalDenteProblemaCondicaoEnum::PROTESE_PARCIAL_REMOVIVEL, SaudeBucalDenteProblemaCondicaoEnum::PROTESE_TEMPORARIA, SaudeBucalDenteProblemaCondicaoEnum::INCLUSO_I, SaudeBucalDenteProblemaCondicaoEnum::PROTESE_CORONARIA_UNITARIA, SaudeBucalDenteProblemaCondicaoEnum::COROA_CO, SaudeBucalDenteProblemaCondicaoEnum::IMPLANTE, SaudeBucalDenteProblemaCondicaoEnum::PILAR_P, SaudeBucalDenteProblemaCondicaoEnum::NUCLEO_PINO, SaudeBucalDenteProblemaCondicaoEnum::RESTO_RADICULAR_RR, SaudeBucalDenteProblemaCondicaoEnum::RETRACAO_GENGIVAL_RG, SaudeBucalDenteProblemaCondicaoEnum::CALCULO_DENTAL_CD, SaudeBucalDenteProblemaCondicaoEnum::EXTRACAO_INDICADA_EI, SaudeBucalDenteProblemaCondicaoEnum::SELANTE_INDICADO_SI, SaudeBucalDenteProblemaCondicaoEnum::FRATURA_FR, SaudeBucalDenteProblemaCondicaoEnum::MANCHA_BRANCA_ATIVA_M, SaudeBucalDenteProblemaCondicaoEnum::CARIADO_C, SaudeBucalDenteProblemaCondicaoEnum::RESTAURADO_R, SaudeBucalDenteProblemaCondicaoEnum::CARIE_DA_RAIZ, SaudeBucalDenteProblemaCondicaoEnum::RESTAURADO_COM_CARIE_RC, SaudeBucalDenteProblemaCondicaoEnum::RAIZ_RESTAURADA, SaudeBucalDenteProblemaCondicaoEnum::NECESSITA_DE_TRATAMENTO_ENDODONTICO, SaudeBucalDenteProblemaCondicaoEnum::TRATAMENTO_ENDODONTICO_REALIZADO, ]) ->get(['id', 'nome']), ], [ 'dentes' => [55, 54, 53, 52, 51, 61, 62, 63, 64, 65, 85, 84, 83, 82, 81, 71, 72, 73, 74, 75], 'itens' => SaudeBucalDenteProblemaCondicao::orderBy('nome') ->whereIn('id', [ SaudeBucalDenteProblemaCondicaoEnum::AUSENTE_A, SaudeBucalDenteProblemaCondicaoEnum::EXTRAIDO_E, SaudeBucalDenteProblemaCondicaoEnum::HIGIDO_H, SaudeBucalDenteProblemaCondicaoEnum::HIGIDO_SELADO_HS, SaudeBucalDenteProblemaCondicaoEnum::INCLUSO_I, SaudeBucalDenteProblemaCondicaoEnum::MANTENEDOR_DE_ESPACO_ME, SaudeBucalDenteProblemaCondicaoEnum::RESTO_RADICULAR_RR, SaudeBucalDenteProblemaCondicaoEnum::RETRACAO_GENGIVAL_RG, SaudeBucalDenteProblemaCondicaoEnum::CALCULO_DENTAL_CD, SaudeBucalDenteProblemaCondicaoEnum::EXTRACAO_INDICADA_EI, SaudeBucalDenteProblemaCondicaoEnum::SELANTE_INDICADO_SI, SaudeBucalDenteProblemaCondicaoEnum::FRATURA_FR, SaudeBucalDenteProblemaCondicaoEnum::MANCHA_BRANCA_ATIVA_M, SaudeBucalDenteProblemaCondicaoEnum::CARIADO_C, SaudeBucalDenteProblemaCondicaoEnum::RESTAURADO_R, SaudeBucalDenteProblemaCondicaoEnum::CARIE_DA_RAIZ, SaudeBucalDenteProblemaCondicaoEnum::RESTAURADO_COM_CARIE_RC, SaudeBucalDenteProblemaCondicaoEnum::RAIZ_RESTAURADA, SaudeBucalDenteProblemaCondicaoEnum::NECESSITA_DE_TRATAMENTO_ENDODONTICO, SaudeBucalDenteProblemaCondicaoEnum::TRATAMENTO_ENDODONTICO_REALIZADO, ]) ->get(['id', 'nome']), ], ]; } private static function getOdontogramas($paciente) { $procedimentos = collect(); $odontogramas = AtendimentoSoapOdontograma::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->orderByDesc('created_at') ->get() ->map(function ($odontograma) use ($procedimentos) { $arcadaSuperior = $odontograma->odontogramaArcadas() ->where('arcada_id', ArcadaDentaria::SUPERIOR) ->first(); $arcadaInferior = $odontograma->odontogramaArcadas() ->where('arcada_id', ArcadaDentaria::INFERIOR) ->first(); $getDentesData = function ($arcadaId, $dente) use ($arcadaSuperior, $arcadaInferior) { $arcada = $arcadaId === ArcadaDentaria::SUPERIOR ? $arcadaSuperior : $arcadaInferior; $odontogramaArcadaDente = $arcada->odontogramaArcadaDentes() ->where('dente_id', $dente->id) ->first(); return [ 'numero' => $dente->numero, 'fragmentos' => [ 'esquerda' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_esquerda_tratado], 'cima' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_cima_tratado], 'direita' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_direita_tratado], 'baixo' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_baixo_tratado], 'centro' => ['is_tratado' => $odontogramaArcadaDente->is_fragmento_centro_tratado], ], 'problemas_condicoes' => $odontogramaArcadaDente->problemasCondicoes() ->orderBy('nome') ->pluck('nome'), ]; }; $protesesTotais = collect(); if ($arcadaSuperior->possui_protese_total) { $protesesTotais->push('superior'); } if ($arcadaInferior->possui_protese_total) { $protesesTotais->push('inferior'); } $setProcedimentoData = function ($model, $local) use ($procedimentos) { $data = (object) array_merge(self::getLogData($model), [ 'local' => $local, 'procedimentos' => collect(), 'observacao' => $model->observacao, ]); $model->atendimentoProcedimentos ->each(function ($atendimentoProcedimento) use ($data) { $procedimento = $atendimentoProcedimento->atendimentoProcedimento->procedimento; $codigo = MaskUtil::getProcedimentoMasked($procedimento->codigo); $data->procedimentos->push([ 'descricao' => "{$codigo} - {$procedimento->nome}", 'quantidade' => $atendimentoProcedimento->atendimentoProcedimento->quantidade, ]); }); $procedimentos->push($data); }; $odontograma->odontogramaArcadas ->each(function ($odontogramaArcada) use ($setProcedimentoData) { if ($odontogramaArcada->atendimentoProcedimentos->isNotEmpty()) { $setProcedimentoData( $odontogramaArcada, $odontogramaArcada->arcada_id === ArcadaDentaria::SUPERIOR ? 'Arcada superior' : 'Arcada inferior' ); } $odontogramaArcada->odontogramaArcadaDentes() ->whereHas('atendimentoProcedimentos') ->get() ->each(fn ($odontogramaArcadaDente) => $setProcedimentoData( $odontogramaArcadaDente, "Dente {$odontogramaArcadaDente->dente->numero}" )); }); $odontograma->dentesSupranumerarios->each(fn ($dente) => $setProcedimentoData($dente, $dente->local)); return [ 'id' => $odontograma->id, 'data' => $odontograma->created_at->format('d/m/Y'), 'possui_aparelho' => $odontograma->possui_aparelho, 'possui_contencao' => $odontograma->possui_contencao, 'proteses_totais' => $protesesTotais, 'arcadas' => [ 'superior' => [ 'dentes' => [ 'permanentes' => Dente::where('arcada_id', ArcadaDentaria::SUPERIOR) ->where('is_deciduo', false) ->orderBy('ordem') ->get() ->map(fn ($dente) => $getDentesData(ArcadaDentaria::SUPERIOR, $dente)), 'deciduos' => Dente::where('arcada_id', ArcadaDentaria::SUPERIOR) ->where('is_deciduo', true) ->orderBy('ordem') ->get() ->map(fn ($dente) => $getDentesData(ArcadaDentaria::SUPERIOR, $dente)), ], ], 'inferior' => [ 'dentes' => [ 'permanentes' => Dente::where('arcada_id', ArcadaDentaria::INFERIOR) ->where('is_deciduo', false) ->orderBy('ordem') ->get() ->map(fn ($dente) => $getDentesData(ArcadaDentaria::INFERIOR, $dente)), 'deciduos' => Dente::where('arcada_id', ArcadaDentaria::INFERIOR) ->where('is_deciduo', true) ->orderBy('ordem') ->get() ->map(fn ($dente) => $getDentesData(ArcadaDentaria::INFERIOR, $dente)), ], ], ], ]; }); $procedimentos = $procedimentos->sort()->values(); return compact('procedimentos', 'odontogramas'); } private static function getUnidadesMedida() { return DB::table('cadastro_unidade_medida') ->whereIn('id', [ UnidadeMedidaEnum::MILIGRAMAS, UnidadeMedidaEnum::GRAMAS, UnidadeMedidaEnum::QUILOGRAMAS, UnidadeMedidaEnum::CENTIMETROS, UnidadeMedidaEnum::METROS, UnidadeMedidaEnum::UNIDADES, UnidadeMedidaEnum::NAO_DEFINIDO, UnidadeMedidaEnum::LITROS, UnidadeMedidaEnum::MILILITROS, UnidadeMedidaEnum::UNIDADES_INTERNACIONAIS, UnidadeMedidaEnum::MICROGRAMAS, UnidadeMedidaEnum::DOSE, UnidadeMedidaEnum::COMPRIMIDO, UnidadeMedidaEnum::FRASCO, UnidadeMedidaEnum::AMPOLA, UnidadeMedidaEnum::ADESIVO, UnidadeMedidaEnum::ANEL, UnidadeMedidaEnum::APLICACAO, UnidadeMedidaEnum::BARRA, UnidadeMedidaEnum::BASTAO, UnidadeMedidaEnum::BISNAGA, UnidadeMedidaEnum::BLISTER, UnidadeMedidaEnum::BOLSA, UnidadeMedidaEnum::CAIXA, UnidadeMedidaEnum::CAPSULA, UnidadeMedidaEnum::CAPSULA_INALANTE, UnidadeMedidaEnum::CARPULE, UnidadeMedidaEnum::CARTAO, UnidadeMedidaEnum::CARTELA, UnidadeMedidaEnum::DRAGEA, UnidadeMedidaEnum::EMPLASTRO, UnidadeMedidaEnum::ENVELOPE, UnidadeMedidaEnum::FLACONETE, UnidadeMedidaEnum::FRASCO_AMPOLA, UnidadeMedidaEnum::GLOBULO, UnidadeMedidaEnum::LATA, UnidadeMedidaEnum::OVULO, UnidadeMedidaEnum::PASTILHA, UnidadeMedidaEnum::PILULA, UnidadeMedidaEnum::POTE, UnidadeMedidaEnum::SACHE, UnidadeMedidaEnum::SERINGA, UnidadeMedidaEnum::SUPOSITORIO, UnidadeMedidaEnum::TABLETE, UnidadeMedidaEnum::TUBETE, UnidadeMedidaEnum::TUBO, UnidadeMedidaEnum::GOTAS, UnidadeMedidaEnum::JATO, ]) ->select( 'id', 'nome' ) ->orderBy('nome') ->get(); } private static function getKitsExames() { return KitExame::where('tipo_id', Tipo::LABORATORIAL) ->orderBy('nome') ->get() ->map(fn ($kit) => [ 'id' => $kit->id, 'nome' => $kit->nome, 'exames' => DB::table('parametrizacao_kit_exame_item') ->join( 'parametrizacao_exame', 'parametrizacao_exame.id', 'parametrizacao_kit_exame_item.exame_id' ) ->leftjoin('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) ->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, ]) ->values() ]) ->filter(fn ($kit) => count($kit['exames']) > 0) ->values(); } private static function getEncaminhamentoIntersetorialUnidades() { return Unidade::whereHas('infraestruturas', fn ($q) => $q ->whereHas('ambulatorioParametrizacaoJornadaInfraestrutura') ) ->orderBy('nome_fantasia') ->get(['id', 'nome_fantasia']); } private static function getPrescricoesMedicamentos($paciente, $soapRascunho) { $prescricoesAnterioresIds = collect(); ($soapRascunho->prescricoesMedicamentos ?? collect()) ->each(function ($prescricao) use ($prescricoesAnterioresIds) { $prescricao->itens->each(function ($item) use ($prescricoesAnterioresIds) { if ($item->prescricaoMedicamentoItemAnterior && !$prescricoesAnterioresIds->contains($item->prescricaoMedicamentoItemAnterior->prescricao_medicamento_id) ) { $prescricoesAnterioresIds->push($item->prescricaoMedicamentoItemAnterior->prescricao_medicamento_id); } }); }); return AtendimentoSoapPrescricaoMedicamento::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->get() ->map(fn ($prescricao) => array_merge(self::getLogData($prescricao), [ 'id' => $prescricao->id, 'revalidar' => $prescricoesAnterioresIds->contains($prescricao->id), 'medicamentos' => $prescricao->itens->map(function ($item) { $data = null; if ($item->is_manual) { $data = [ 'id' => $item->id, 'is_manual' => true, 'descricao' => $item->descricao, 'justificativa' => $item->justificativa, 'receita_tipo_id' => $item->receita_tipo_id ]; } else { if ($item->tratamento_interrompido_from_rascunho) { $item->tratamento_interrompido_em = null; $item->tratamento_interrompido_justificativa = null; $item->tratamento_interrompido_soap_id = null; } $data = [ 'id' => $item->id, 'is_manual' => false, 'dose' => $item->dose, 'frequencia_dose' => $item->frequencia_dose, 'frequencia_vezes' => $item->frequencia_vezes, 'turno_id' => $item->turno_id, 'unidade_medida_id' => $item->unidade_medida_id, 'unidade_medida' => $item->unidadeMedida->nome ?? null, 'intervalo' => $item->intervalo, 'intervalo_medida_tempo_id' => $item->intervalo_medida_tempo_id, 'duracao_medida_tempo_id' => $item->duracao_medida_tempo_id, 'material_id' => $item->material->id ?? null, 'material_descricao' => $item->material->descricao ?? null, 'material_via_administracao' => $item->material->viaAdministracao->nome ?? null, 'material_receita_tipo_id' => $item->material->receita_tipo_id ?? null, 'material_quantidade' => $item->material->quantidade ?? null, 'material_apresentacao_nome' => isset($item->material->apresentacao) ? $item->material->apresentacao->nome ?? null : null, 'material_receita_tipo' => isset($item->material->receitaTipo) ? $item->material->receitaTipo->nome ?? null : null, 'is_dose_unica' => $item->is_dose_unica, 'is_uso_continuo' => $item->is_uso_continuo, 'is_imprimir_separado' => $item->is_imprimir_separado, 'is_remover_impressao' => $item->is_remover_impressao, 'posologia' => $item->posologia, 'inicio' => $item->inicio->format('d/m/Y'), 'duracao' => $item->duracao, 'conclusao' => is_null($item->conclusao) ? null : $item->conclusao->format('d/m/Y'), 'tratamento_concluido' => !$item->is_tratamento_interrompido && !is_null($item->conclusao) && $item->conclusao->isBefore(Carbon::today()), 'is_tratamento_concluido' => $item->is_tratamento_concluido, 'is_tratamento_interrompido' => $item->is_tratamento_interrompido, 'tratamento_interrompido_em' => $item->is_tratamento_interrompido ? $item->tratamento_interrompido_em->format('d/m/Y') : null, 'tratamento_interrompido_justificativa' => $item->tratamento_interrompido_justificativa, ]; if (!$item->is_uso_continuo) { $data['duracao_descricao'] = is_null($item->conclusao) ? 'INDETERMINADO' : "{$item->duracao} {$item->duracaoMedidaTempo->nome}"; } } $data['recomendacoes'] = $item->recomendacoes; return $data; }), ])); } private static function getSolicitacaoExamesComuns($paciente) { return AtendimentoSoapSolicitacaoExame::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->where('alto_custo', false) ->get() ->map(fn ($solicitacao) => array_merge(self::getLogData($solicitacao), [ 'origem' => 'ambulatorio', 'cid_descricao' => is_null($solicitacao->cid_id) ? null : "{$solicitacao->cid->codigo} - {$solicitacao->cid->nome}", 'cid' => is_null($solicitacao->cid_id) ? null : [ 'id' => $solicitacao->cid->id, 'codigo' => $solicitacao->cid->codigo, 'nome' => $solicitacao->cid->nome, ], 'ciap_descricao' => is_null($solicitacao->ciap_id) ? null : "{$solicitacao->ciap->codigo} - {$solicitacao->ciap->descricao}", 'classificacao_id' => $solicitacao->classificacao_id, 'classificacao_nome' => $solicitacao->classificacao->nome ?? null, 'justificativa' => $solicitacao->justificativa, 'observacao' => $solicitacao->observacao, 'exames' => $solicitacao->itens->map(fn ($item) => [ 'descricao' => MaskUtil::getProcedimentoMasked($item->exame->codigo) . " - {$item->exame->nome}", ]), ])) ->concat(self::getResultadosExamesLaboratoriaisExameLaboratorial($paciente)); } private static function getHistoricoSolicitacaoExamesComuns($id) { return AtendimentoSoapSolicitacaoExame::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('id', $id) ) ) ->where('alto_custo', false) ->get() ->map(fn ($solicitacao) => ([ 'cid' => is_null($solicitacao->cid_id) ? null : [ 'id' => $solicitacao->cid->id, 'codigo' => $solicitacao->cid->codigo, 'nome' => $solicitacao->cid->nome, ], ])); } private static function getSolicitacaoExamesAltoCusto($paciente) { return AtendimentoSoapSolicitacaoExame::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->where('alto_custo', true) ->get() ->map(fn ($solicitacao) => array_merge(self::getLogData($solicitacao), [ 'origem' => 'ambulatorio', 'cid_descricao' => is_null($solicitacao->cid_id) ? null : "{$solicitacao->cid->codigo} - {$solicitacao->cid->nome}", 'cid' => is_null($solicitacao->cid_id) ? null : [ 'id' => $solicitacao->cid->id, 'codigo' => $solicitacao->cid->codigo, 'nome' => $solicitacao->cid->nome, ], 'ciap_descricao' => is_null($solicitacao->ciap_id) ? null : "{$solicitacao->ciap->codigo} - {$solicitacao->ciap->descricao}", 'justificativa' => $solicitacao->justificativa, 'observacao' => $solicitacao->observacao, 'exames' => $solicitacao->itens->map(fn ($item) => [ 'descricao' => MaskUtil::getProcedimentoMasked($item->exame->codigo) . " - {$item->exame->nome}", ]), ])) ->concat(self::getResultadosExamesLaboratoriaisExameImagem($paciente)); } private static function getSolicitacaoProcedimentosCirurgicos($paciente) { return AtendimentoSoapSolicitacaoProcedimentoCirurgico::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->get() ->map(fn ($solicitacao) => array_merge(self::getLogData($solicitacao), [ 'cid_descricao' => is_null($solicitacao->cid_id) ? null : "{$solicitacao->cid->codigo} - {$solicitacao->cid->nome}", 'ciap_descricao' => is_null($solicitacao->ciap_id) ? null : "{$solicitacao->ciap->codigo} - {$solicitacao->ciap->descricao}", 'justificativa' => $solicitacao->justificativa, 'observacao' => $solicitacao->observacao, 'procedimentos_cirurgicos' => $solicitacao->itens->map(fn ($item) => [ 'descricao' => MaskUtil::getProcedimentoMasked($item->procedimentoCirurgico->procedimento_codigo) . " - {$item->procedimentoCirurgico->nome}", ]), ])); } private static function getHistoricoSolicitacaoExamesAltoCusto($id) { return AtendimentoSoapSolicitacaoExame::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('id', $id) ) ) ->where('alto_custo', true) ->get() ->map(fn ($solicitacao) => ([ 'cid' => is_null($solicitacao->cid_id) ? null : [ 'id' => $solicitacao->cid->id, 'codigo' => $solicitacao->cid->codigo, 'nome' => $solicitacao->cid->nome, ], ])); } private static function getTestesRapidosRealizados($atendimento) { return DB::table('ambulatorio_atendimento_pre_atendimento_teste_rapido as pivot') ->join('ambulatorio_atendimento_pre_atendimento as pre_atendimento', 'pre_atendimento.id', 'pivot.pre_atendimento_id') ->join('ambulatorio_teste_rapido as teste_rapido', 'teste_rapido.id', 'pivot.teste_rapido_id') ->where('pre_atendimento.atendimento_id', $atendimento->id) ->select(DB::raw(" teste_rapido.id, teste_rapido.nome, pivot.resultado ")) ->union(DB::table('ambulatorio_atendimento_soap_teste_rapido as pivot') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'pivot.soap_id') ->join('ambulatorio_teste_rapido as teste_rapido', 'teste_rapido.id', 'pivot.teste_rapido_id') ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select(DB::raw(" teste_rapido.id, teste_rapido.nome, pivot.resultado ")) ) ->orderBy('nome') ->get(); } private static function getExamesAvaliados($atendimento) { return DB::table('ambulatorio_atendimento_soap_exame_avaliado as pivot') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'pivot.soap_id') ->join('atencao_basica_cadastro_exame_solicitado_avaliado as exame_avaliado', 'exame_avaliado.id', 'pivot.exame_solicitado_avaliado_id') ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select(DB::raw(" exame_avaliado.id, exame_avaliado.descricao, pivot.solicitado_em, pivot.realizado_em, pivot.resultado_em, pivot.resultado ")) ->orderBy('descricao') ->get(); } private static function getExameSolicitados($atendimento) { return AtendimentoSoapExameSolicitado::whereHas('soap', function ($q) use ($atendimento) { $q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($solicitacao) { return [ 'cid_descricao' => is_null($solicitacao->cid_id) ? null : "{$solicitacao->cid->codigo} - {$solicitacao->cid->nome}", 'ciap_descricao' => is_null($solicitacao->ciap_id) ? null : "{$solicitacao->ciap->codigo} - {$solicitacao->ciap->descricao}", 'justificativa' => $solicitacao->justificativa, 'observacao' => $solicitacao->observacao, 'exames' => $solicitacao->examesSolicitados->map(function ($item) { return [ 'id' => $item->id, 'descricao' => $item->descricao, ]; }), ]; }); } private static function getTriagemNeonatalSolicitados($atendimento) { return AtendimentoSoapTriagemNeonatalSolicitado::whereHas('soap', function ($q) use ($atendimento) { $q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($solicitacao) { return [ 'cid_descricao' => is_null($solicitacao->cid_id) ? null : "{$solicitacao->cid->codigo} - {$solicitacao->cid->nome}", 'ciap_descricao' => is_null($solicitacao->ciap_id) ? null : "{$solicitacao->ciap->codigo} - {$solicitacao->ciap->descricao}", 'justificativa' => $solicitacao->justificativa, 'observacao' => $solicitacao->observacao, 'exames' => $solicitacao->triagensNeonatalSolicitados->map(function ($item) { return [ 'id' => $item->id, 'descricao' => $item->descricao, ]; }), ]; }); } private static function getExameSolicitadosItens($atendimento) { $ids = []; AtendimentoSoapExameSolicitado::whereHas('soap', function ($q) use ($atendimento) { $q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($solicitacao) use (&$ids) { $solicitacao->examesSolicitados->map(function ($item) use (&$ids) { $ids[] = $item->id; }); }); return $ids; } private static function getTriagemNeonatalSolicitadosItens($atendimento) { $ids = []; AtendimentoSoapTriagemNeonatalSolicitado::whereHas('soap', function ($q) use ($atendimento) { $q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id); }) ->get() ->map(function ($solicitacao) use (&$ids) { $solicitacao->triagensNeonatalSolicitados->map(function ($item) use (&$ids) { $ids[] = $item->id; }); }); return $ids; } private static function getTriagensNeoNatal($atendimento) { return DB::table('ambulatorio_atendimento_soap_triagem_neonatal as pivot') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'pivot.soap_id') ->join('atencao_basica_cadastro_triagem_neonatal as triagem_neonatal', 'triagem_neonatal.id', 'pivot.triagem_neonatal_id') ->where('soap.is_rascunho', false) ->where('soap.atendimento_id', $atendimento->id) ->select(DB::raw(" triagem_neonatal.id, triagem_neonatal.descricao, pivot.solicitado_em, pivot.realizado_em, pivot.resultado_em, pivot.resultado ")) ->orderBy('descricao') ->get(); } private static function getAtestados($paciente) { return AtendimentoSoapAtestado::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->get() ->map(fn ($atestado) => array_merge(self::getLogData($atestado), [ 'modelo_id' => $atestado->modelo_id, 'descricao' => $atestado->descricao, 'is_atestado_acompanhante' => $atestado->is_atestado_acompanhante, 'nome' => $atestado->is_atestado_acompanhante ? $atestado->nome_acompanhante : $paciente->cidadao->nome, 'documento_tipo_id' => $atestado->documento_tipo_id, 'cpf' => MaskUtil::getCpfMasked($atestado->cpf), 'cns' => MaskUtil::getCnsMasked($atestado->cns), 'data' => is_null($atestado->data) ? null : $atestado->data->format('d/m/Y'), 'horario' => is_null($atestado->horario) ? null : $atestado->horario->format('H:i'), 'dias' => $atestado->dias, 'quantidade_horas' => $atestado->quantidade_horas, 'horario_inicial' => is_null($atestado->horario_inicial) ? null : $atestado->horario_inicial->format('H:i'), 'cid' => $atestado->cid ? [ 'id' => $atestado->cid->id, 'codigo' => $atestado->cid->codigo, 'nome' => $atestado->cid->nome, ] : null, ])); } private static function getHistoricoAtestados($id) { return AtendimentoSoapAtestado::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('id', $id) ) ) ->get() ->map(fn ($atestado) => ([ 'cid' => $atestado->cid ? [ 'id' => $atestado->cid->id, 'codigo' => $atestado->cid->codigo, 'nome' => $atestado->cid->nome, ] : null, ])); } private static function getDeclaracoesComparecimento($paciente) { return AtendimentoDeclaracaoComparecimento::whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ->where(fn ($q) => $q ->whereDoesntHave('soap') ->orWhereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ) ) ->get() ->map(fn ($declaracao) => array_merge(self::getLogData($declaracao), [ 'id' => $declaracao->id, 'nome_acompanhante' => $declaracao->nome_acompanhante ?? null, 'motivo_comparecimento' => $declaracao->motivo_comparecimento ?? null, 'turno_nome' => $declaracao->turno->nome ?? null, 'entrada' => is_null($declaracao->entrada) ? null : $declaracao->entrada->format('H:i'), 'saida' => is_null($declaracao->saida) ? null : $declaracao->saida->format('H:i'), ])); } private static function getOrientacoes($paciente) { return AtendimentoSoapOrientacao::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->get() ->map(fn ($orientacao) => array_merge(self::getLogData($orientacao), [ 'descricao' => $orientacao->descricao, ])); } private static function getCartasMedicas($paciente) { return AtendimentoSoapCartaMedica::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->get() ->map(fn ($cartaMedica) => array_merge(self::getLogData($cartaMedica), [ 'descricao' => $cartaMedica->descricao, ])); } private static function getEncaminhamentos($paciente) { return AtendimentoSoapEncaminhamento::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->get() ->map(fn ($orientacao) => array_merge(self::getLogData($orientacao), [ 'tipo_id' => $orientacao->tipo_id, 'tipo_descricao' => $orientacao->tipo->descricao, 'servico_especializado_especialidade_nome' => $orientacao->servicoEspecializadoEspecialidade ->nome ?? null, 'servico_especializado_complemento' => $orientacao->servico_especializado_complemento ?? ' - ', 'servico_especializado_cid_descricao' => is_null($orientacao->servico_especializado_cid_id) ? ' - ' : MaskUtil::getCidMasked($orientacao->servicoEspecializadoCid->codigo) . ' - ' . $orientacao->servicoEspecializadoCid->nome, 'cid' => is_null($orientacao->servicoEspecializadoCid) ? null : [ 'id' => $orientacao->servicoEspecializadoCid->id, 'codigo' => $orientacao->servicoEspecializadoCid->codigo, 'nome' => $orientacao->servicoEspecializadoCid->nome, ], 'servico_especializado_ciap_descricao' => is_null($orientacao->servico_especializado_ciap_id) ? ' - ' : $orientacao->servicoEspecializadoCiap->codigo . ' - ' . $orientacao->servicoEspecializadoCiap->descricao, 'servico_especializado_classificacao_risco_nome' => $orientacao->servicoEspecializadoClassificacaoRisco ->nome ?? null, 'servico_especializado_motivo' => $orientacao->servico_especializado_motivo, 'servico_especializado_observacao' => $orientacao->servico_especializado_observacao, 'intersetorial_unidade_nome_fantasia' => is_null($orientacao->intersetorial_infraestrutura_id) ? null : $orientacao->intersetorialInfraestrutura->unidade->nome_fantasia, 'intersetorial_infraestrutura_nome' => is_null($orientacao->intersetorial_infraestrutura_id) ? null : $orientacao->intersetorialInfraestrutura->nome, ])); } private static function getHistoricoEncaminhamentos($id) { return AtendimentoSoapEncaminhamento::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('id', $id) ) ) ->get() ->map(fn ($orientacao) => ([ 'cid' => is_null($orientacao->servicoEspecializadoCid) ? null : [ 'id' => $orientacao->servicoEspecializadoCid->id, 'codigo' => $orientacao->servicoEspecializadoCid->codigo, 'nome' => $orientacao->servicoEspecializadoCid->nome, ], ])); } private static function getFinalizacaoFormData($atendimento, $fila = null) { $especialidadeId = $atendimento->is_demanda_espontanea ? ($atendimento->especialidade->id ?? null) : null; $demandaEspontaneaObservaVagaAtendimento = self::demandaEspontaneaObservaVagaAtendimento($especialidadeId); $paciente = $atendimento->paciente; $desfechoParams = [ 'paciente_id' => $paciente->id, 'paciente_nao_municipe' => $paciente->classificacao_id !== Classificacao::MUNICIPE, 'infraestrutura_id' => self::getCurrentCentroCusto()->infraestrutura_id, 'data' => Carbon::today(), ]; $usuarios = self::getUsuariosWithJornada((object) $desfechoParams); $ocupacoes = []; if (!is_null($atendimento->usuario)) { $ocupacoes = self::getOcupacoesWithJornada((object) array_merge($desfechoParams, [ 'usuario_id' => $atendimento->usuario->id, ])); } $especialidades = []; if (!is_null($atendimento->ocupacao)) { $especialidades = self::getEspecialidadesWithJornada((object) array_merge($desfechoParams, [ 'usuario_id' => $atendimento->usuario->id, 'ocupacao_id' => $atendimento->ocupacao->id, ])); } $atendimentoTipos = TipoAtendimento::whereIn('id', [ TipoAtendimentoEnum::CONSULTA_AGENDADA_PROGRAMADA, TipoAtendimentoEnum::CONSULTA_AGENDADA, TipoAtendimentoEnum::ESCUTA_INICIAL_ORIENTACAO, TipoAtendimentoEnum::CONSULTA_NO_DIA, TipoAtendimentoEnum::ATENDIMENTO_DE_URGENCIA, ])->orderBy('descricao')->get(['id', 'descricao'])->map(fn ($tipo) => [ 'id' => $tipo->id, 'nome' => $tipo->descricao, 'is_demanda_espontanea' => collect([ TipoAtendimentoEnum::ESCUTA_INICIAL_ORIENTACAO, TipoAtendimentoEnum::CONSULTA_NO_DIA, TipoAtendimentoEnum::ATENDIMENTO_DE_URGENCIA, ])->contains($tipo->id) ]); $jornadas = []; if ($atendimento->is_demanda_espontanea) { if ($demandaEspontaneaObservaVagaAtendimento) { if (!is_null($atendimento->usuario) && !is_null($atendimento->ocupacao)) { $jornadas = self::getJornadas((object) [ 'data' => $atendimento->created_at->format('Y-m-d'), 'usuario_id' => $atendimento->usuario->id, 'ocupacao_id' => $atendimento->ocupacao->id, 'infraestrutura_id' => $desfechoParams['infraestrutura_id'], ]); } } } return [ 'demanda_tipos' => self::getDemandaTipos(), 'atendimento_tipos' => $atendimentoTipos, 'casos_suspeitos' => CasoSuspeito::orderBy('nome')->get()->map(fn ($casoSuspeito) => [ 'id' => $casoSuspeito->id, 'nome' => $casoSuspeito->nome, 'cids' => $casoSuspeito->cids()->pluck('cid_id'), 'gera_impressao' => $casoSuspeito->gera_impressao, ]), 'racionalidades_saude' => RacionalidadeSaude::orderBy('descricao')->get(['id', 'descricao']), 'condutas' => Conduta::whereNotIn('id', [AtendimentoIndividualConduta::AGENDAMENTO_PARA_NASF])->orderBy('descricao')->get(['id', 'descricao', 'codigo_esus']), 'saude_bucal' => [ 'consulta_tipos' => TipoConsulta::orderBy('id')->get(['id', 'descricao']), 'fornecimentos' => SaudeBucalFornecimento::orderBy('nome')->get(['id', 'nome']), ], 'equipes' => self::getEquipesUsuarioLogado(), 'locais_atendimento' => LocalAtendimento::orderBy('descricao')->get(['id', 'descricao']), 'turnos' => Turno::orderBy('id')->get(['id', 'nome']), 'cuidador' => Cuidador::orderBy('id')->get(), 'desfecho' => [ 'usuarios' => $usuarios, 'ocupacoes' => $ocupacoes, 'especialidades' => $especialidades, 'jornadas' => $jornadas, 'opcoes_entrada' => $fila ? OpcaoEntrada::where('id', $fila->opcao_entrada_id)->get(['id', 'nome', 'prioridade_obrigatoria']) : collect(), 'prioridades' => Prioridade::orderBy('nome')->get(['id', 'nome']), 'servicos' => Servico::orderBy('nome') ->whereHas('parametrizacoesInfraestrutura', fn ($q) => $q ->where('infraestrutura_id', self::getCurrentCentroCusto()->infraestrutura_id) ) ->get(['id', 'tipo_id', 'nome']), 'centros_custo_encaminhamento' => self::getCentrosCustoEncaminhamento(), ], 'conduta_desfecho' => CondutaDesfecho::get(), 'modalidades' => ModalidadeAtencaoDomiciliar::whereIn('id', [ Modalidade::AD_1, Modalidade::AD_2, Modalidade::AD_3, ])->get(), 'tipos_atendimento' => TipoAtendimento::whereIn('id', [ AtencaoBasicaTipoAtendimento::ATENDIMENTO_PROGRAMADO, AtencaoBasicaTipoAtendimento::ATENDIMENTO_NAO_PROGRAMADO, ])->get(), 'procedencias' => Procedencia::orderBy('descricao')->get(), 'conclusao' => Conclusao::orderBy('id')->get(), 'elegivel' => JustificativaConclusao::where('elegivel', true)->orderBy('id')->get(), 'inelegivel' => JustificativaConclusao::where('elegivel', false)->orderBy('id')->get(), 'ocis_etapas_clinicas' => [ ['id' => EtapaClinicaEnum::RETORNO, 'nome' => 'Retorno'], ['id' => EtapaClinicaEnum::TRATAMENTO, 'nome' => 'Continuidade do tratamento'], ['id' => EtapaClinicaEnum::REABILITACAO, 'nome' => 'Paciente em reabilitação'], ['id' => EtapaClinicaEnum::ALTA, 'nome' => 'Alta'], ], 'apac_motivos_saida_permanencia' => ApacMotivoSaidaPermanencia::whereIn('id', [ EnumsApacMotivoSaidaPermanencia::ALTA_CURADO, EnumsApacMotivoSaidaPermanencia::ALTA_MELHORADO, EnumsApacMotivoSaidaPermanencia::ALTA_A_PEDIDO, EnumsApacMotivoSaidaPermanencia::ALTA_COM_PREVISAO_DE_RETORNO_PARA_ACOMPANHAMENTO_DO_PACIENTE, ])->orderBy('nome')->get(['id', 'nome']) ]; } private static function getCentrosCustoEncaminhamento($centroCustoId = null) { if (is_null($centroCustoId)) { return ModelPainelSenhaEncaminhamento::where('centro_custo_id_de', self::getCurrentCentroCusto()->id) ->whereHas('centroCustoPara', fn ($q) => $q ->whereHas('setor', fn ($q) => $q ->whereIn('tipo_id', [ SetorTIpo::ENFERMAGEM, SetorTipo::CONSULTORIO ]) ) ) ->get() ->map(fn ($encaminhamento) => [ 'id' => $encaminhamento->centroCustoPara->id, 'setor_tipo_id' => $encaminhamento->centroCustoPara->setor->tipo_id, 'setor_nome' => $encaminhamento->centroCustoPara->setor->nome, ]); } return CentroCusto::where('id', $centroCustoId) ->get() ->map(fn ($centroCusto) => [ 'id' => $centroCusto->id, 'setor_tipo_id' => $centroCusto->setor->tipo_id, 'setor_nome' => $centroCusto->setor->nome, ]); } private static function getEquipesUsuarioLogado() { $lotacao = self::getCurrentLotacao(); return Equipe::where('infraestrutura_id', $lotacao->infraestrutura_id) ->whereHas('usuarios', function ($q) use ($lotacao) { $q->where('cadastro_usuario.id', $lotacao->usuario_id) ->where('atencao_basica_parametrizacao_equipe_usuario.ativo', 1); }) ->get() ->map(fn($equipe) => [ 'id' => $equipe->id, 'descricao' => "INE: {$equipe->area->numero_ine} - Área: {$equipe->area->descricao}" . (is_null($equipe->microarea_id) ? '' : " - Microárea: {$equipe->microarea->descricao}"), ]) ->sortBy('descricao') ->values(); } public static function getHistorico($pacienteId) { $historicoAmbulatorio = AtendimentoHistoricoService::getHistoricoResumido( ['paciente_id' => $pacienteId], ['format_date_time' => false] ); $historicoAmbulatorio->each(function ($atendimento) { $atendimento->origem = 'ambulatorio'; $atendimento->timestamp = $atendimento->data_hora; }); $historicoAtencaoBasicaVisitaDomiciliar = VisitaDomiciliarHistoricoService::getHistoricoResumido( ['paciente_id' => $pacienteId], ['format_date' => false] ); $historicoAtencaoBasicaVisitaDomiciliar->each(function ($atendimento) { $atendimento->origem = 'atencao-basica-visita-domiciliar'; $atendimento->timestamp = $atendimento->data; }); $historicoProntoAtendimento = ProntoAtendimentoHistoricoService::getHistoricoResumido( ['paciente_id' => $pacienteId], ['format_date_time' => false] ); $historicoProntoAtendimento->each(function ($atendimento) { $atendimento->origem = 'pronto-atendimento'; $atendimento->timestamp = $atendimento->data_hora; }); $historico = $historicoAmbulatorio ->concat($historicoAtencaoBasicaVisitaDomiciliar) ->concat($historicoProntoAtendimento) ->sortByDesc('timestamp') ->values(); $historico->each(function ($atendimento) { if ($atendimento->origem === 'ambulatorio' || $atendimento->origem === 'pronto-atendimento') { $atendimento->data_hora = $atendimento->data_hora->format('d/m/Y'); } else if ($atendimento->origem === 'atencao-basica-visita-domiciliar') { $atendimento->data = $atendimento->data->format('d/m/Y'); } $atendimento->selecionado = false; unset($atendimento->timestamp); }); return $historico; } private static function getUsuariosWithJornada($params) { return Usuario::setEagerLoads([]) ->whereHas('lotacoes', fn ($q) => $q ->where('infraestrutura_id', $params->infraestrutura_id) ->whereHas('ambulatorioJornadas', fn ($q) => $q ->whereNotNull('quantidade_consulta') ->whereNull('situacao_id') ->whereDate('data', $params->data) ->whereHas('especialidade', fn ($q) => $q->where('encaminhamento', true) ->where(function ($q) { $q->where(function ($q) { $q->where('is_regulado', true) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('regulacao_parametrizacao_data_desejada_especialidade') ->whereColumn('regulacao_parametrizacao_data_desejada_especialidade.especialidade_id', 'cadastro_especialidade.id') ); }) ->orWhere('is_regulado', false); }) ) ) ) ->get(['id', 'cidadao_id']) ->map(fn ($usuario) => [ 'id' => $usuario->id, 'nome' => $usuario->cidadao()->setEagerLoads([])->first(['nome'])->nome, ]) ->sortBy('nome') ->values(); } private static function getOcupacoesWithJornada($params) { return DB::table('sigtap.ocupacao as ocupacao') ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('cadastro_lotacao as lotacao') ->whereColumn('lotacao.ocupacao_id', 'ocupacao.id') ->where('lotacao.usuario_id', $params->usuario_id) ->where('lotacao.infraestrutura_id', $params->infraestrutura_id) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('ambulatorio_jornada as jornada') ->join( 'cadastro_especialidade as especialidade', 'especialidade.id', 'jornada.especialidade_id' ) ->whereColumn('jornada.lotacao_id', 'lotacao.id') ->whereNotNull('jornada.quantidade_consulta') ->whereNull('jornada.situacao_id') ->whereDate('jornada.data', $params->data) ->where(fn ($query) => self::setCadastroWhereEspecialidadePaciente( $query, $params->paciente_id, 'especialidade' )) ->when($params->paciente_nao_municipe, fn ($q) => $q ->where('especialidade.permite_agendamento_nao_municipe', true) ) ->where('especialidade.encaminhamento', true) ) ) ->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)") ->select(DB::raw(" ocupacao.id, CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) as descricao ")) ->get(); } private static function getEspecialidadesWithJornada($params) { return Especialidade::where(fn ($q) => self::setCadastroWhereEspecialidadePaciente($q, $params->paciente_id)) ->whereHas('ambulatorioJornadas', fn ($q) => $q ->whereNotNull('quantidade_consulta') ->whereNull('situacao_id') ->whereDate('data', $params->data) ->whereHas('lotacao', fn ($q) => $q ->where('infraestrutura_id', $params->infraestrutura_id) ->where('usuario_id', $params->usuario_id) ->where('ocupacao_id', $params->ocupacao_id) ) ) ->when($params->paciente_nao_municipe, fn ($q) => $q ->where('permite_agendamento_nao_municipe', true) ) ->where('encaminhamento', true) ->orderBy('nome') ->get() ->map(fn ($q) => [ 'id' => $q->id, 'nome' => $q->nome, 'demanda_espontanea_observa_vaga_atendimento' => $q->ambulatorioParametrizacoesInfraestruturaEspecialidade() ->whereHas('parametrizacaoInfraestrutura', fn ($q) => $q->where('infraestrutura_id', $params->infraestrutura_id)) ->first()->demanda_espontanea_observa_vaga_atendimento ?? false, ]); } private static function setCadastroWhereEspecialidadePaciente($query, $pacienteId, $tableAlias = '') { if (!empty($tableAlias)) { $tableAlias .= '.'; } $paciente = Paciente::find($pacienteId); $idade = $paciente->cidadao->idade; return $query->where(fn ($q) => $q ->when($idade, fn ($q) => $q ->where(fn ($q) => $q ->whereNull("{$tableAlias}idade_minima") ->orWhere("{$tableAlias}idade_minima", '<=', $idade['anos']) ) ->where(fn ($q) => $q ->whereNull("{$tableAlias}idade_maxima") ->orWhere("{$tableAlias}idade_maxima", '>=', $idade['anos']) ) ) ->where(fn ($q) => $q ->whereNull("{$tableAlias}sexo_id") ->orWhere("{$tableAlias}sexo_id", $paciente->cidadao->sexo_id) ) ); } private static function getModelData($atendimento, $soapRascunho, $fila = null) { return [ 'soap' => [ 'id' => $soapRascunho->id ?? null, 'medicoes' => self::getMedicoesModelData($soapRascunho), 'feridas' => self::getFeridasModelData($atendimento), 'medicamentos_em_uso' => self::getMedicamentosEmUsoModelData($soapRascunho), 'raas' => self::getRaasModelData($atendimento), 'antecedentes' => self::getAntecedentesModelData($atendimento->paciente, $soapRascunho), 'subjetivo' => self::getSubjetivoModelData($soapRascunho), 'objetivo' => self::getObjetivoModelData($atendimento, $soapRascunho), 'avaliacao' => self::getAvaliacaoModelData($atendimento->paciente, $soapRascunho), 'plano' => self::getPlanoModelData($atendimento, $soapRascunho), 'finalizacao' => self::getFinalizacaoModelData($atendimento, $soapRascunho, $fila), 'oci' => self::getOciModelData($atendimento, $soapRascunho), 'perfis_epidemiologicos' => $soapRascunho ? $soapRascunho->perfisEpidemiologicos->pluck('id') : collect(), 'observacao_perfil_epidemiologico' => $soapRascunho->observacao_perfil_epidemiologico ?? null, 'ivcf' => [ 'deseja_preencher' => $soapRascunho && $soapRascunho->ivcf ? true : false, 'estado_saude_geral' => $soapRascunho->ivcf->estado_saude_geral ?? null, 'limitacao_compras' => $soapRascunho->ivcf->limitacao_compras ?? null, 'limitacao_gestao_financeira' => $soapRascunho->ivcf->limitacao_gestao_financeira ?? null, 'limitacao_tarefas_domesticas' => $soapRascunho->ivcf->limitacao_tarefas_domesticas ?? null, 'banho_independencia' => $soapRascunho->ivcf->banho_independencia ?? null, 'relato_esquecimento_por_terceiros' => $soapRascunho->ivcf->relato_esquecimento_por_terceiros ?? null, 'esquecimento_piorando' => $soapRascunho->ivcf->esquecimento_piorando ?? null, 'esquecimento_impacta_atividades' => $soapRascunho->ivcf->esquecimento_impacta_atividades ?? null, 'humor_tristeza_desanimo' => $soapRascunho->ivcf->humor_tristeza_desanimo ?? null, 'perda_interesse_atividades' => $soapRascunho->ivcf->perda_interesse_atividades ?? null, 'limitacao_elevar_bracos' => $soapRascunho->ivcf->limitacao_elevar_bracos ?? null, 'limitacao_motricidade_fina' => $soapRascunho->ivcf->limitacao_motricidade_fina ?? null, 'perda_peso_nao_intencional' => $soapRascunho->ivcf->perda_peso_nao_intencional ?? null, 'imc_abaixo_22' => $soapRascunho->ivcf->imc_abaixo_22 ?? null, 'panturrilha_abaixo_31' => $soapRascunho->ivcf->panturrilha_abaixo_31 ?? null, 'marcha_lenta_4m_maior_5s' => $soapRascunho->ivcf->marcha_lenta_4m_maior_5s ?? null, 'dificuldade_caminhar_impacto_atividades' => $soapRascunho->ivcf->dificuldade_caminhar_impacto_atividades ?? null, 'quedas_recorrentes' => $soapRascunho->ivcf->quedas_recorrentes ?? null, 'incontinencia' => $soapRascunho->ivcf->incontinencia ?? null, 'problema_visao_impacto_atividades' => $soapRascunho->ivcf->problema_visao_impacto_atividades ?? null, 'problema_audicao_impacto_atividades' => $soapRascunho->ivcf->problema_audicao_impacto_atividades ?? null, 'doencas_cronicas_multiplas' => $soapRascunho->ivcf->doencas_cronicas_multiplas ?? null, 'polifarmacia_5_ou_mais_medicamentos' => $soapRascunho->ivcf->polifarmacia_5_ou_mais_medicamentos ?? null, 'internacao_ultimos_6_meses' => $soapRascunho->ivcf->internacao_ultimos_6_meses ?? null, ], 'risco_cardiovascular_framingham' => [ 'colesterol_total' => $soapRascunho->riscoCardiovascularFramingham->colesterol_total ?? null, 'colesterol_hdl' => $soapRascunho->riscoCardiovascularFramingham->colesterol_hdl ?? null, 'toma_remedio_hipertensao' => $soapRascunho->riscoCardiovascularFramingham->toma_remedio_hipertensao ?? false, 'tabagista' => $soapRascunho->riscoCardiovascularFramingham->tabagista ?? false, 'diabetico' => $soapRascunho->riscoCardiovascularFramingham->diabetico ?? false, ], 'tempo_atendimento' => $soapRascunho->tempo_atendimento ?? null ] ]; } private static function getFeridasModelData($atendimento) { $pacienteId = null; if ($atendimento->agendamento_id && $atendimento->agendamento) { $pacienteId = $atendimento->agendamento->paciente_id; } elseif ($atendimento->demanda_espontanea_id && $atendimento->demandaEspontanea) { $pacienteId = $atendimento->demandaEspontanea->paciente_id; } $atendimentos = Atendimento::where(function ($q) use ($pacienteId) { $q->where('paciente_id', $pacienteId); })->pluck('id'); $soaps = AtendimentoSoap::whereIn('atendimento_id', $atendimentos) ->with([ 'feridas', 'feridas.ferida', 'feridas.localAnatomico', 'feridas.localAnatomicoRegiao', 'feridas.exsudato', 'feridas.necrose', 'feridas.procedimentos', 'feridas.procedimentos.atendimentoProcedimento', 'feridas.procedimentos.atendimentoProcedimento.cid', 'feridas.procedimentos.atendimentoProcedimento.procedimento', 'feridas.procedimentos.atendimentoProcedimento.materiais', ])->get(); $feridas = $soaps->flatMap(function ($soap) { return $soap->feridas->map(function ($ferida) { $procedimentos = $ferida->procedimentos->map(function ($item) { $atendimentoProcedimento = $item->atendimentoProcedimento; return [ 'id' => $item->id, 'procedimento_id' => $item->atendimentoProcedimento->procedimento_id, 'cid_id' => $item->atendimentoProcedimento->cid_id ?? null, 'cid' => $item->atendimentoProcedimento->cid ? [ 'id' => $item->atendimentoProcedimento->cid->id, 'codigo' => $item->atendimentoProcedimento->cid->codigo, 'nome' => $item->atendimentoProcedimento->cid->nome, ] : null, 'quantidade' => $item->atendimentoProcedimento->quantidade ?? null, 'procedimento' => [ 'id' => $item->atendimentoProcedimento->procedimento->id ?? null, 'codigo' => $item->atendimentoProcedimento->procedimento->codigo ?? null, 'nome' => $item->atendimentoProcedimento->procedimento->nome ?? null, 'materiais' => $atendimentoProcedimento ? $atendimentoProcedimento->materiais->map(function ($material) { return [ 'id' => $material->almoxarifadoSaidaItem->material->id ?? null, 'descricao_completa' =>$material->almoxarifadoSaidaItem->material->descricaoCompleta ?? null, 'quantidade' => $material->almoxarifadoSaidaItem->quantidade ?? null ]; }) : collect(), ], ]; }); $imagesBase64 = $ferida->images->map(function ($image) { $arquivo = $image->arquivo; $path = Storage::path('ambulatorio' . DIRECTORY_SEPARATOR . 'feridas' . DIRECTORY_SEPARATOR . app('config')->get('database.default') . DIRECTORY_SEPARATOR . $arquivo); if (file_exists($path)) { $type = pathinfo($path, PATHINFO_EXTENSION); $data = file_get_contents($path); $base64 = 'data:image/' . $type . ';base64,' . base64_encode($data); return [ 'id' => $image->id, 'arquivo' => $base64 ]; } return [ 'id' => $image->id, 'arquivo' => null ]; }); return [ 'id' => $ferida->id, 'id_old' => $ferida->id_old, 'soap_id' => $ferida->soap_id ?? null, 'data' => $ferida->data->format('d/m/Y'), 'tipo_descricao' => $ferida->ferida->nome ?? null, 'tipo_id' => $ferida->ferida_id, 'local_anatomico_descricao' => $ferida->localAnatomico->descricao ?? null, 'local_anatomico_id' => $ferida->local_anatomico_id, 'local_anatomico_regiao_descricao' => $ferida->localAnatomicoRegiao->descricao ?? null, 'local_anatomico_regiao_id' => $ferida->local_anatomico_regiao_id, 'exsudato_descricao' => $ferida->exsudato->descricao ?? null, 'exsudato_id' => $ferida->ferida_exsudato_id, 'necrose_descricao' => $ferida->necrose->descricao ?? null, 'necrose_id' => $ferida->ferida_necrose, 'cicatrizada' => $ferida->cicatrizada ? true : false, 'comprimento' => $ferida->comprimento, 'largura' => $ferida->largura, 'profundidade' => $ferida->profundidade, 'dor' => $ferida->dor, 'observacao' => $ferida->observacao, 'procedimentos' => $procedimentos, 'images' => $imagesBase64, ]; }); }); return [ 'feridas' => $feridas ]; } private static function getMedicoesModelData($soapRascunho) { $antropometrias = $soapRascunho ? $soapRascunho->antropometrias()->whereDoesntHave('soapObjetivoAntropometria')->get() : collect(); return [ 'antropometrias' => $antropometrias->map(fn ($antropometria) => [ 'medido_em' => $antropometria->medido_em->format('d/m/Y'), 'peso' => $antropometria->peso, 'altura' => isset($antropometria->altura) ? (int) $antropometria->altura : null, 'imc' => isset($antropometria->peso) && isset($antropometria->altura) ? ImcService::calculate( UnidadeMedidaEnum::QUILOGRAMAS, $antropometria->peso, UnidadeMedidaEnum::CENTIMETROS, $antropometria->altura )['imc'] : null, 'perimetro_cefalico' => isset($antropometria->perimetro_cefalico) ? $antropometria->perimetro_cefalico : null, 'circunferencia_abdominal' => isset($antropometria->circunferencia_abdominal) ? (int) $antropometria->circunferencia_abdominal : null, 'perimetro_panturrilha' => isset($antropometria->perimetro_panturrilha) ? (int) $antropometria->perimetro_panturrilha : null, ]), ]; } private static function getMedicamentosEmUsoModelData($soapRascunho) { return [ 'medicamentos_com_tratamento_interrompido' => ($soapRascunho->prescricaoMedicamentoTratamentosInterrompidos ?? collect()) ->map(fn ($prescricaoItem) => [ 'prescricao_medicamento_item_id' => $prescricaoItem->id, 'justificativa' => $prescricaoItem->tratamento_interrompido_justificativa, ]), ]; } private static function getRaasModelData($atendimento) { return [ 'origem_paciente_id' => $atendimento->raas->origem_paciente_id ?? null, 'destino_paciente_id' => $atendimento->raas->destino_paciente_id ?? null, 'motivo_saida_permanencia_id' => $atendimento->raas->motivo_saida_permanencia_id ?? null, 'carater_atendimento_id' => $atendimento->raas->carater_atendimento_id ?? null, 'numero_autorizacao' => $atendimento->raas->numero_autorizacao ?? null, 'classificacao_id' => $atendimento->raas->classificacao_id ?? null, 'local_realizacao_exame_id' => $atendimento->raas->local_realizacao_exame_id ?? null, ]; } private static function getAntecedentesModelData($paciente, $soapRascunho) { $antecedentes = $soapRascunho->antecedente ?? AtendimentoSoapAntecedente::whereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ) ->orderByDesc('created_at') ->first(); return [ 'descricao' => $antecedentes->descricao ?? null, 'descricao_familiar' => $antecedentes->descricao_familiar ?? null, 'informacoes_obstetricas' => [ 'gestas_previas' => $antecedentes->gestas_previas ?? null, 'abortos' => $antecedentes->abortos ?? null, 'desfecho_gestacao_aconteceu_menos_um_ano' => $antecedentes->desfecho_gestacao_aconteceu_menos_um_ano ?? false, 'partos_realizados' => $antecedentes->partos_realizados ?? null, 'partos_vaginais' => $antecedentes->partos_vaginais ?? null, 'partos_cesareas' => $antecedentes->partos_cesareas ?? null, 'partos_domiciliares' => $antecedentes->partos_domiciliares ?? null, 'nascidos_vivos' => $antecedentes->nascidos_vivos ?? null, 'nascidos_mortos' => $antecedentes->nascidos_mortos ?? null, 'recem_nascidos_com_menos2500_gramas' => $antecedentes->recem_nascidos_com_menos2500_gramas ?? null, 'recem_nascidos_com_mais4500_gramas' => $antecedentes->recem_nascidos_com_mais4500_gramas ?? null, 'nascidos_vivos_vivem' => $antecedentes->nascidos_vivos_vivem ?? null, 'nascidos_vivos_mortos_primeira_semana' => $antecedentes->nascidos_vivos_mortos_primeira_semana ?? null, 'nascidos_vivos_mortos_depois_primeira_semana' => $antecedentes->nascidos_vivos_mortos_depois_primeira_semana ?? null, ], 'puericultura' => self::getPuericulturaAntecedentes($paciente), 'problemas_condicoes' => is_null($antecedentes) ? [] : $antecedentes ->problemasCondicoes() ->get() ->map(fn ($problemaCondicao) => array_merge(self::getLogData($problemaCondicao), [ 'id' => $problemaCondicao->id, 'ciap' => is_null($problemaCondicao->ciap_id) ? null : [ 'id' => $problemaCondicao->ciap->id, 'codigo' => $problemaCondicao->ciap->codigo, 'descricao' => $problemaCondicao->ciap->descricao, ], 'cid' => is_null($problemaCondicao->cid_id) ? null : [ 'id' => $problemaCondicao->cid->id, 'codigo' => $problemaCondicao->cid->codigo, 'nome' => $problemaCondicao->cid->nome, ], 'situacao_id' => $problemaCondicao->situacao_id, 'inicio' => [ 'data' => is_null($problemaCondicao->inicio) ? null : $problemaCondicao->inicio->format('d/m/Y'), ], 'fim' => [ 'data' => is_null($problemaCondicao->fim) ? null : $problemaCondicao->fim->format('d/m/Y'), ], 'observacao' => $problemaCondicao->observacao, ])) ->all(), 'cirurgias_internacoes' => is_null($antecedentes) ? [] : $antecedentes ->cirurgiasInternacoes() ->get() ->map(fn ($cirurgiaInternacao) => array_merge(self::getLogData($cirurgiaInternacao), [ 'id' => $cirurgiaInternacao->id, 'descricao' => $cirurgiaInternacao->descricao, 'realizada_em' => [ 'data' => is_null($cirurgiaInternacao->realizada_em) ? null : $cirurgiaInternacao->realizada_em->format('d/m/Y'), ], 'observacao' => $cirurgiaInternacao->observacao, ])), 'problemas_familiares' => is_null($antecedentes) ? [] : $antecedentes ->problemasFamiliares() ->get() ->map(fn ($problemaFamiliar) => array_merge(self::getLogData($problemaFamiliar), [ 'id' => $problemaFamiliar->id, 'ciap' => [ 'id' => $problemaFamiliar->ciap_id, 'codigo' => $problemaFamiliar->ciap->codigo, 'descricao' => $problemaFamiliar->ciap->descricao, ], 'observacao' => $problemaFamiliar->observacao, ])), ]; } private static function getPuericulturaAntecedentes($paciente) { if (is_null($paciente->cidadao->data_nascimento) || $paciente->cidadao->idade['anos'] > self::IDADE_ANOS_FINAL_ADOLESCENTE ) { return null; } $ultimoSoapPuericultura = self::getUltimoSoapPuericultura($paciente, true); return [ 'gravidez_tipo_id' => $ultimoSoapPuericultura->puericultura_gravidez_tipo_id ?? null, 'parto_tipo_id' => $ultimoSoapPuericultura->puericultura_parto_tipo_id ?? null, 'idade_gestacional_semanas' => $ultimoSoapPuericultura->puericultura_idade_gestacional_semanas ?? null, 'idade_gestacional_dias' => $ultimoSoapPuericultura->puericultura_idade_gestacional_dias ?? null, 'apgar_primeiro_minuto' => $ultimoSoapPuericultura->puericultura_apgar_primeiro_minuto ?? null, 'apgar_quinto_minuto' => $ultimoSoapPuericultura->puericultura_apgar_quinto_minuto ?? null, 'apgar_decimo_minuto' => $ultimoSoapPuericultura->puericultura_apgar_decimo_minuto ?? null, 'peso' => $ultimoSoapPuericultura->puericultura_peso ?? null, 'comprimento' => $ultimoSoapPuericultura->puericultura_comprimento ?? null, 'perimetro_cefalico' => $ultimoSoapPuericultura->puericultura_perimetro_cefalico ?? null, ]; } private static function getSubjetivoModelData($soapRascunho) { return [ 'descricao' => $soapRascunho->subjetivo_descricao ?? null, 'motivos' => ($soapRascunho->motivos ?? collect())->map(fn ($motivo) => [ 'ciap' => $motivo->ciap ? [ 'id' => $motivo->ciap->id, 'codigo' => $motivo->ciap->codigo, 'descricao' => $motivo->ciap->descricao, ] : null, 'cid' => $motivo->cid ? [ 'id' => $motivo->cid->id, 'codigo' => $motivo->cid->codigo, 'nome' => $motivo->cid->nome, ] : null, 'observacao' => $motivo->observacao, ]), ]; } private static function getObjetivoModelData($atendimento, $soapRascunho) { $atendimentosPuericultura = self::getAtendimentosPuericultura($atendimento->paciente); $antropometria = self::getUltimaAntropometriaAtendimento($atendimento); $sinalVital = self::getUltimoSinalVitalAtendimento($atendimento); $glicemiaCapilar = self::getUltimaGlicemiaCapilarAtendimento($atendimento); return [ 'descricao' => $soapRascunho->objetivo_descricao ?? null, 'pre_natal' => self::getPreNatalModelData($atendimento->paciente, $soapRascunho), 'is_atendimento_puericultura' => $soapRascunho->is_atendimento_puericultura ?? false, 'dum' => $soapRascunho ? ($soapRascunho->dum ? $soapRascunho->dum->format('Y-m-d') : null) : ($atendimento->paciente->dum && $atendimento->paciente->dum->data_ultima_menstruacao ? $atendimento->paciente->dum->data_ultima_menstruacao : null ), 'puericultura' => [ 'gravidez_tipo_id' => $soapRascunho->puericultura_gravidez_tipo_id ?? null, 'parto_tipo_id' => $soapRascunho->puericultura_parto_tipo_id ?? null, 'idade_gestacional_semanas' => $soapRascunho->puericultura_idade_gestacional_semanas ?? null, 'idade_gestacional_dias' => $soapRascunho->puericultura_idade_gestacional_dias ?? null, 'apgar_primeiro_minuto' => $soapRascunho->puericultura_apgar_primeiro_minuto ?? null, 'apgar_quinto_minuto' => $soapRascunho->puericultura_apgar_quinto_minuto ?? null, 'apgar_decimo_minuto' => $soapRascunho->puericultura_apgar_decimo_minuto ?? null, 'peso' => $soapRascunho->puericultura_peso ?? null, 'comprimento' => isset($soapRascunho->puericultura_comprimento) ? (int) $soapRascunho->puericultura_comprimento : null, 'perimetro_cefalico' => isset($soapRascunho->puericultura_perimetro_cefalico) ? (int) $soapRascunho->puericultura_perimetro_cefalico : null, 'aleitamento_tipo_id' => $soapRascunho->puericultura_aleitamento_tipo_id ?? null, 'alteracoes_fenotipicas' => self::getPuericulturaAlteracoesFenotipicas($atendimentosPuericultura, $soapRascunho), 'fatores_risco' => self::getPuericulturaFatoresRisco($atendimentosPuericultura, $soapRascunho), 'marcos_desenvolvimento' => self::getPuericulturaMarcosDesenvolvimento($atendimento->paciente, $atendimentosPuericultura, $soapRascunho), 'questionario_m_chat_r' => self::getPuericulturaQuestionarioMChatR($soapRascunho), ], 'antropometria' => [ 'peso' => $soapRascunho ? ($soapRascunho->objetivoAntropometria->atendimentoAntropometria->peso ?? null) : ($antropometria->peso ?? null), 'altura' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->altura) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->altura : null ) : ($antropometria->altura ?? null), 'imc' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->peso) && isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->altura) ? ImcService::calculate( UnidadeMedidaEnum::QUILOGRAMAS, $soapRascunho->objetivoAntropometria->atendimentoAntropometria->peso, UnidadeMedidaEnum::CENTIMETROS, $soapRascunho->objetivoAntropometria->atendimentoAntropometria->altura ) : [ 'imc' => null, 'classificacao' => null, 'grau_obesidade' => null, ] ) : ($antropometria->imc ?? [ 'imc' => null, 'classificacao' => null, 'grau_obesidade' => null, ]), 'perimetro_cefalico' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->perimetro_cefalico) ? $soapRascunho->objetivoAntropometria->atendimentoAntropometria->perimetro_cefalico : null ) : ($antropometria->perimetro_cefalico ?? null), 'circunferencia_abdominal' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->circunferencia_abdominal) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->circunferencia_abdominal : null ) : ($antropometria->circunferencia_abdominal ?? null), 'perimetro_panturrilha' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->perimetro_panturrilha) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->perimetro_panturrilha : null ) : ($antropometria->perimetro_panturrilha ?? null), 'comprimento_pe_direito' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->comprimento_pe_direito) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->comprimento_pe_direito : null ) : ($antropometria->comprimento_pe_direito ?? null), 'largura_pe_direito' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->largura_pe_direito) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->largura_pe_direito : null ) : ($antropometria->largura_pe_direito ?? null), 'circunferencia_pe_direito' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->circunferencia_pe_direito) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->circunferencia_pe_direito : null ) : ($antropometria->circunferencia_pe_direito ?? null), 'comprimento_pe_esquerdo' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->comprimento_pe_esquerdo) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->comprimento_pe_esquerdo : null ) : ($antropometria->comprimento_pe_esquerdo ?? null), 'largura_pe_esquerdo' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->largura_pe_esquerdo) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->largura_pe_esquerdo : null ) : ($antropometria->largura_pe_esquerdo ?? null), 'circunferencia_pe_esquerdo' => $soapRascunho ? (isset($soapRascunho->objetivoAntropometria->atendimentoAntropometria->circunferencia_pe_esquerdo) ? (float) $soapRascunho->objetivoAntropometria->atendimentoAntropometria->circunferencia_pe_esquerdo : null ) : ($antropometria->circunferencia_pe_esquerdo ?? null), ], 'sinal_vital' => [ 'pressao_arterial' => $soapRascunho ? ($soapRascunho->objetivoSinalVital->atendimentoSinalVital->pressao_arterial ?? null) : ($sinalVital->pressao_arterial ?? null), 'frequencia_respiratoria' => $soapRascunho ? ($soapRascunho->objetivoSinalVital->atendimentoSinalVital->frequencia_respiratoria ?? null) : ($sinalVital->frequencia_respiratoria ?? null), 'frequencia_cardiaca' => $soapRascunho ? ($soapRascunho->objetivoSinalVital->atendimentoSinalVital->frequencia_cardiaca ?? null) : ($sinalVital->frequencia_cardiaca ?? null), 'temperatura' => $soapRascunho ? ($soapRascunho->objetivoSinalVital->atendimentoSinalVital->temperatura ?? null) : ($sinalVital->temperatura ?? null), 'saturacao_o2' => $soapRascunho ? ($soapRascunho->objetivoSinalVital->atendimentoSinalVital->saturacao_o2 ?? null) : ($sinalVital->saturacao_o2 ?? null), ], 'glicemia_capilar' => [ 'valor' => $soapRascunho ? ($soapRascunho->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar->valor ?? null) : ($glicemiaCapilar->valor ?? null), 'momento_coleta_id' => $soapRascunho ? ($soapRascunho->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar->momento_coleta_id ?? null) : ($glicemiaCapilar->momento_coleta_id ?? null), ], 'tria' => [ 'alimentos_acabaram' => optional($atendimento->paciente->informacaoSocial)->alimentos_acabaram, 'comeu_alguns_alimentos' => optional($atendimento->paciente->informacaoSocial)->comeu_alguns_alimentos, 'data_atualizacao_tria' => optional($atendimento->paciente->informacaoSocial)->data_atualizacao_tria ? optional($atendimento->paciente->informacaoSocial)->data_atualizacao_tria->toDateString() : optional(optional($atendimento->paciente->cadastroIndividual)->created_at)->toDateString(), 'is_desatualizado' => self::isTriaDesatualizado( optional($atendimento->paciente->informacaoSocial)->data_atualizacao_tria ?? optional($atendimento->paciente->cadastroIndividual)->data_atualizacao_tria ?? optional($atendimento->paciente->cadastroIndividual)->updated_at ), ], 'vacinacao_em_dia' => $soapRascunho->vacinacao_em_dia ?? null, 'paciente_com_necessidade_especial' => $soapRascunho->paciente_com_necessidade_especial ?? false, 'marcador_consumo_alimentar' => [ 'perguntas' => ($soapRascunho->marcadorConsumoAlimentarPerguntasRespostas ?? collect()) ->map(fn ($marcador) => [ 'pergunta_id' => $marcador->pergunta_id, 'respostas' => $soapRascunho->marcadorConsumoAlimentarPerguntasRespostas() ->where('pergunta_id', $marcador->pergunta_id) ->get() ->map(fn ($marcador2) => $marcador2->resposta->descricao) ]) ->unique('pergunta_id') ->values(), 'pergunta_multipla' => [], 'pergunta_unica' => [], ], 'resultados_exames' => ($soapRascunho->resultadosExames ?? collect())->map(fn ($resultado) => [ 'exame' => [ 'id' => $resultado->exame->id, 'codigo' => $resultado->exame->codigo, 'nome' => $resultado->exame->nome, ], 'idade_gestacional_semanas_eco' => $resultado->idade_gestacional_semanas_eco, 'idade_gestacional_dias_eco' => $resultado->idade_gestacional_dias_eco, 'dpp_eco' => $resultado->dpp_eco, 'solicitado_em' => $resultado->solicitado_em ? $resultado->solicitado_em->format('d/m/Y') : null, 'realizado_em' => $resultado->realizado_em->format('d/m/Y'), 'resultado_em' => $resultado->resultado_em ? $resultado->resultado_em->format('d/m/Y') : null, 'percentual' => isset($resultado->percentual) ? (fmod($resultado->percentual, 1) == 0 ? (int) $resultado->percentual : $resultado->percentual) : null, 'resultado_tipo_id' => $resultado->resultado_tipo_id, 'resultado' => $resultado->resultado, ]), 'triagem_neonatal' => ($soapRascunho->triagensNeonatal ?? collect())->map(fn ($triagemNeonatal) => [ 'id' => $triagemNeonatal->id, 'solicitado_em' => $triagemNeonatal->soapTriagemNeonatal->solicitado_em, 'realizado_em' => $triagemNeonatal->soapTriagemNeonatal->realizado_em, 'resultado_em' => $triagemNeonatal->soapTriagemNeonatal->resultado_em, 'resultado' => $triagemNeonatal->soapTriagemNeonatal->resultado, ]), 'exame_avaliado' => ($soapRascunho->examesAvaliados ?? collect())->map(fn ($exameAvaliado) => [ 'id' => $exameAvaliado->id, 'solicitado_em' => $exameAvaliado->soapExameAvaliado->solicitado_em, 'realizado_em' => $exameAvaliado->soapExameAvaliado->realizado_em, 'resultado_em' => $exameAvaliado->soapExameAvaliado->resultado_em, 'resultado' => $exameAvaliado->soapExameAvaliado->resultado, ]), ]; } private static function getAtendimentosPuericultura($paciente) { return AtendimentoSoap::where('is_rascunho', false) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ->where('is_atendimento_puericultura', true) ->orderBy('created_at') ->get(); } private static function getUltimoSoapPuericultura($paciente, $withRascunho = false) { return AtendimentoSoap::when(!$withRascunho, fn ($q) => $q->where('is_rascunho', false)) ->whereHas('atendimento', fn ($q) => $q ->where('paciente_id', $paciente->id) ) ->where('is_atendimento_puericultura', true) ->orderByDesc('created_at') ->first(); } private static function getAvaliacaoModelData($paciente, $soapRascunho) { return [ 'descricao' => $soapRascunho->avaliacao_descricao ?? null, 'condicoes_avaliadas' => $soapRascunho ? $soapRascunho->condicoesAvaliadas()->pluck('id') : [], 'condicoes_emad' => $soapRascunho ? $soapRascunho->condicoesEmad()->pluck('atencao_basica_atendimento_domiciliar_condicao_avaliada.id') : [], 'doencas_transmissiveis' => $soapRascunho ? $soapRascunho->doencasTransmissiveis()->pluck('id') : [], 'rastreamentos' => $soapRascunho ? $soapRascunho->rastreamentos()->pluck('id') : [], 'problemas_condicoes' => ($soapRascunho->problemasCondicoes ?? collect())->map(fn ($problemaCondicao) => [ 'automatico' => $problemaCondicao->automatico, 'id' => $problemaCondicao->problema_condicao_anterior_id, 'ciap' => $problemaCondicao->ciap ? [ 'id' => $problemaCondicao->ciap->id, 'codigo' => $problemaCondicao->ciap->codigo, 'descricao' => $problemaCondicao->ciap->descricao, ] : null, 'cid' => $problemaCondicao->cid ? [ 'id' => $problemaCondicao->cid->id, 'codigo' => $problemaCondicao->cid->codigo, 'nome' => $problemaCondicao->cid->nome, ] : null, 'incluir_lista_paciente' => !is_null($problemaCondicao->situacao_id), 'situacao_id' => $problemaCondicao->situacao_id, 'situacao_nome' => $problemaCondicao->situacao->nome ?? null, 'inicio' => $problemaCondicao->inicio ? [ 'data' => $problemaCondicao->inicio->format('d/m/Y'), 'ano' => null, 'mes' => null, ] : null, 'fim' => $problemaCondicao->fim ? [ 'data' => $problemaCondicao->fim->format('d/m/Y'), 'ano' => null, 'mes' => null, ] : null, 'observacao' => $problemaCondicao->observacao, ]), 'pre_natal' => self::getPreNatalModelData($paciente, $soapRascunho), 'alergias_reacoes_adversas' => self::getAlergias($paciente), 'saude_bucal' => [ 'vigilancias' => $soapRascunho ? $soapRascunho->saudeBucalVigilancias()->pluck('id') : [], 'necessidade_protese_inferior_superior' => $soapRascunho->saude_bucal_necessidade_protese_inferior_superior ?? null, ], ]; } private static function getPreNatalModelData($paciente, $soapRascunho) { $data = [ 'is_rascunho_atendimento_pre_natal' => $soapRascunho ? self::hasProblemaCondicaoGravidezNormal($soapRascunho) : false, 'gravidez_tipo_id' => $soapRascunho->pre_natal_gravidez_tipo_id ?? null, 'altura_uterina' => $soapRascunho->pre_natal_altura_uterina ?? null, 'gravidez_alto_risco' => is_null($soapRascunho) ? false : self::isGravidezAltoRisco($paciente, true), 'edema_id' => $soapRascunho->pre_natal_edema_id ?? null, 'movimentacao_fetal' => $soapRascunho->pre_natal_movimentacao_fetal ?? null, 'gravidez_planejada' => $soapRascunho->pre_natal_gravidez_planejada ?? null, 'batimento_cardiaco_fetal' => $soapRascunho->pre_natal_batimento_cardiaco_fetal ?? null, 'desfecho_em' => $soapRascunho && $soapRascunho->pre_natal_desfecho_em ? $soapRascunho->pre_natal_desfecho_em->format('Y-m-d') : null, ]; if (is_null($soapRascunho)) { $soap = self::getUltimoSoapPreNatalNaoResolvido($paciente); if (!is_null($soap)) { $data['gravidez_tipo_id'] = $soap->pre_natal_gravidez_tipo_id; $data['gravidez_planejada'] = $soap->pre_natal_gravidez_planejada; $data['gravidez_alto_risco'] = self::isGravidezAltoRisco($paciente); } } return $data; } private static function hasProblemaCondicaoGravidezNormal($soap) { return DB::table('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->where('problema_condicao.soap_id', $soap->id) ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('geral_ciap as ciap') ->whereColumn('ciap.id', 'problema_condicao.ciap_id') ->whereIn('ciap.codigo', self::CIAPS_GRAVIDEZ_NORMAL) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('sigtap.cid as cid') ->whereColumn('cid.id', 'problema_condicao.cid_id') ->whereIn('cid.codigo', self::CIDS_GRAVIDEZ_NORMAL) ) ) ->exists(); } public static function getDataInicioGravidezNaoResolvida($paciente) { return DB::table('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'problema_condicao.soap_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->where('soap.is_rascunho', false) ->where('atendimento.paciente_id', $paciente->id) ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('geral_ciap as ciap') ->whereColumn('ciap.id', 'problema_condicao.ciap_id') ->whereIn('ciap.codigo', self::CIAPS_GRAVIDEZ_NORMAL) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('sigtap.cid as cid') ->whereColumn('cid.id', 'problema_condicao.cid_id') ->whereIn('cid.codigo', self::CIDS_GRAVIDEZ_NORMAL) ) ) ->where('problema_condicao.situacao_id', '<>', ProblemaCondicaoSituacaoEnum::RESOLVIDO) ->whereNotExists(fn ($q) => $q ->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao_posterior') ->whereColumn('problema_condicao_posterior.problema_condicao_anterior_id', 'problema_condicao.id') ) ->select( DB::raw("DATE_FORMAT(problema_condicao.inicio, '%d/%m/%Y') as inicio"), ) ->first()->inicio ?? null; } private static function getUltimoSoapPreNatalNaoResolvido($paciente) { return DB::table('ambulatorio_atendimento_soap as soap') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->where('soap.is_rascunho', false) ->where('atendimento.paciente_id', $paciente->id) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->whereColumn('problema_condicao.soap_id', 'soap.id') ->where('problema_condicao.situacao_id', '<>', ProblemaCondicaoSituacaoEnum::RESOLVIDO) ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('geral_ciap as ciap') ->whereColumn('ciap.id', 'problema_condicao.ciap_id') ->whereIn('ciap.codigo', array_merge( self::CIAPS_GRAVIDEZ_NORMAL, self::CIAPS_GRAVIDEZ_ALTO_RISCO, )) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('sigtap.cid as cid') ->whereColumn('cid.id', 'problema_condicao.cid_id') ->whereIn('cid.codigo', array_merge( self::CIDS_GRAVIDEZ_NORMAL, self::CIDS_GRAVIDEZ_ALTO_RISCO, )) ) ) ) ->orderByDesc('soap.created_at') ->select( 'soap.pre_natal_gravidez_tipo_id', 'soap.pre_natal_gravidez_planejada' ) ->first(); } private static function isGravidezAltoRisco($paciente, $withRascunho = false) { $soap = self::getUltimoSoapComDesfechoGravidez($paciente); return DB::table('ambulatorio_atendimento_soap as soap') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->when(!$withRascunho, fn ($q) => $q->where('soap.is_rascunho', false)) ->when(!is_null($soap), fn ($q) => $q->where('soap.id', '>', $soap->id)) ->where('atendimento.paciente_id', $paciente->id) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->whereColumn('problema_condicao.soap_id', 'soap.id') ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('geral_ciap as ciap') ->whereColumn('ciap.id', 'problema_condicao.ciap_id') ->whereIn('ciap.codigo', self::CIAPS_GRAVIDEZ_ALTO_RISCO) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('sigtap.cid as cid') ->whereColumn('cid.id', 'problema_condicao.cid_id') ->whereIn('cid.codigo', self::CIDS_GRAVIDEZ_ALTO_RISCO) ) ) ) ->exists(); } private static function getUltimoSoapComDesfechoGravidez($paciente) { return DB::table('ambulatorio_atendimento_soap as soap') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->where('soap.is_rascunho', false) ->where('atendimento.paciente_id', $paciente->id) ->where(fn ($q) => $q ->whereNotNull('soap.pre_natal_desfecho_em') ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->whereColumn('problema_condicao.soap_id', 'soap.id') ->where('problema_condicao.situacao_id', ProblemaCondicaoSituacaoEnum::RESOLVIDO) ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('geral_ciap as ciap') ->whereColumn('ciap.id', 'problema_condicao.ciap_id') ->whereIn('ciap.codigo', self::CIAPS_GRAVIDEZ_NORMAL) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('sigtap.cid as cid') ->whereColumn('cid.id', 'problema_condicao.cid_id') ->whereIn('cid.codigo', self::CIDS_GRAVIDEZ_NORMAL) ) ) ) ) ->orderByDesc('soap.created_at') ->select('soap.id') ->first(); } private static function getAlergias($paciente) { return $paciente->cidadao->alergias->map(fn ($alergia, $i) => array_merge( self::getLogData($alergia->cidadaoAlergia), [ '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, ] ], ] )); } private static function getPuericulturaAlteracoesFenotipicas($atendimentosPuericultura, $soapRascunho) { $getResposta = function ($alteracaoId) use ($atendimentosPuericultura) { $resposta = (object) ['is_presente' => null, 'status' => null]; $atendimentosPuericultura->each(function ($atendimento) use ($alteracaoId, $resposta) { $alteracao = $atendimento->puericulturaAlteracoesFenotipicas() ->where('alteracao_fenotipica_id', $alteracaoId) ->first(); if (!is_null($alteracao) && $alteracao->is_presente !== $resposta->is_presente) { $resposta->is_presente = $alteracao->is_presente; $resposta->status = is_null($alteracao->is_presente) ? null : (($alteracao->is_presente ? 'Presente em ' : 'Ausente em ') . $alteracao->created_at->format('d/m/Y')); } }); return $resposta; }; return PuericulturaAlteracaoFenotipica::orderBy('id')->get()->map(function ($alteracao) use ($getResposta, $soapRascunho) { $resposta = $getResposta($alteracao->id); if (is_null($resposta->is_presente) && !is_null($soapRascunho)) { $alteracaoRascunho = $soapRascunho->puericulturaAlteracoesFenotipicas() ->where('alteracao_fenotipica_id', $alteracao->id) ->first(); return [ 'id' => $alteracao->id, 'descricao' => $alteracao->descricao, 'is_presente' => $alteracaoRascunho->is_presente ?? null, 'status' => null, 'is_respondido' => false, 'permite_alteracao' => true ]; } return [ 'id' => $alteracao->id, 'descricao' => $alteracao->descricao, 'is_presente' => $resposta->is_presente, 'status' => $resposta->status, 'is_respondido' => !is_null($resposta->is_presente), 'permite_alteracao' => is_null($resposta->is_presente) || !$resposta->is_presente ]; }); } private static function getPuericulturaFatoresRisco($atendimentosPuericultura, $soapRascunho) { $getResposta = function ($fatorId) use ($atendimentosPuericultura) { $resposta = (object) ['is_presente' => null, 'status' => null]; $atendimentosPuericultura->each(function ($atendimento) use ($fatorId, $resposta) { $fator = $atendimento->puericulturaFatoresRisco() ->where('fator_risco_id', $fatorId) ->first(); if (!is_null($fator) && $fator->is_presente !== $resposta->is_presente) { $resposta->is_presente = $fator->is_presente; $resposta->status = is_null($fator->is_presente) ? null : (($fator->is_presente ? 'Presente em ' : 'Ausente em ') . $fator->created_at->format('d/m/Y')); } }); return $resposta; }; return PuericulturaFatorRisco::orderBy('id')->get()->map(function ($fator) use ($getResposta, $soapRascunho) { $resposta = $getResposta($fator->id); if (is_null($resposta->is_presente) && !is_null($soapRascunho)) { $fatorRascunho = $soapRascunho->puericulturaFatoresRisco() ->where('fator_risco_id', $fator->id) ->first(); return [ 'id' => $fator->id, 'descricao' => $fator->descricao, 'is_presente' => $fatorRascunho->is_presente ?? null, 'status' => null, 'is_respondido' => false, ]; } return [ 'id' => $fator->id, 'descricao' => $fator->descricao, 'is_presente' => $resposta->is_presente, 'status' => $resposta->status, 'is_respondido' => !is_null($resposta->is_presente), ]; }); } private static function getPuericulturaMarcosDesenvolvimento($paciente, $atendimentosPuericultura, $soapRascunho) { $dataNascimento = $paciente->cidadao->data_nascimento; if (is_null($dataNascimento)) { return []; } $getResposta = function ($marcoId) use ($atendimentosPuericultura, $dataNascimento) { $resposta = (object) [ 'is_presente' => null, 'status' => null, 'alcancado_com_anos' => null, 'alcancado_com_meses' => null, ]; $atendimentosPuericultura->sortByDesc('id')->take(1)->each(function ($atendimento) use ($marcoId, $resposta, $dataNascimento) { $marco = $atendimento->puericulturaMarcosDesenvolvimento() ->where('marco_desenvolvimento_id', $marcoId) ->first(); if (!is_null($marco)) { if ($marco->is_presente !== $resposta->is_presente) { $resposta->is_presente = $marco->is_presente; if ($marco->is_presente && (!is_null($marco->alcancado_com_anos) || !is_null($marco->alcancado_com_meses)) ) { $resposta->alcancado_com_anos = $marco->alcancado_com_anos; $resposta->alcancado_com_meses = $marco->alcancado_com_meses; $resposta->status = $dataNascimento->copy() ->addYears($resposta->alcancado_com_anos) ->addMonths($resposta->alcancado_com_meses) ->format('d/m/Y'); } else { $resposta->alcancado_com_anos = null; $resposta->alcancado_com_meses = null; $resposta->status = $marco->created_at->format('d/m/Y'); } } else if ($marco->is_presente && $resposta->is_presente && ($marco->alcancado_com_anos !== $resposta->alcancado_com_anos || $marco->alcancado_com_meses !== $resposta->alcancado_com_meses ) ) { $resposta->alcancado_com_anos = $marco->alcancado_com_anos; $resposta->alcancado_com_meses = $marco->alcancado_com_meses; $resposta->status = $dataNascimento->copy() ->addYears($resposta->alcancado_com_anos) ->addMonths($resposta->alcancado_com_meses) ->format('d/m/Y'); } } }); return $resposta; }; $marcos = collect(); $idadeEmMeses = ceil(Carbon::now()->diffInDays($dataNascimento) / 31); PuericulturaMarcoDesenvolvimento::orderBy('faixa_etaria_dias_fim') ->get() ->each(function ($marco) use ($marcos, $idadeEmMeses, $getResposta, $soapRascunho) { $faixaEtariaEmMeses = floor($marco->faixa_etaria_dias_fim / 31); if ($faixaEtariaEmMeses <= $idadeEmMeses) { $marcoFaixaEtaria = $marcos->where('descricao', $marco->faixa_etaria_descricao)->first(); if (is_null($marcoFaixaEtaria)) { $marcoFaixaEtaria = (object) [ 'descricao' => $marco->faixa_etaria_descricao, 'perguntas' => collect(), 'show_alcancado_com' => $marco->faixa_etaria_dias_fim > 15, 'meses_final' => $faixaEtariaEmMeses, ]; $marcos->push($marcoFaixaEtaria); } $resposta = $getResposta($marco->id); if (is_null($resposta->is_presente) && !is_null($soapRascunho)) { $marcoRascunho = $soapRascunho->puericulturaMarcosDesenvolvimento() ->where('marco_desenvolvimento_id', $marco->id) ->first(); $marcoFaixaEtaria->perguntas->push((object) [ 'id' => $marco->id, 'descricao' => $marco->descricao, 'dica' => $marco->dica, 'is_presente' => $marcoRascunho->is_presente ?? null, 'status' => null, 'is_respondido' => false, 'alcancado_com_anos' => $marcoRascunho->alcancado_com_anos ?? null, 'alcancado_com_meses' => $marcoRascunho->alcancado_com_meses ?? null, ]); } else { $marcoFaixaEtaria->perguntas->push((object) [ 'id' => $marco->id, 'descricao' => $marco->descricao, 'dica' => $marco->dica, 'is_presente' => $resposta->is_presente, 'status' => $resposta->status, 'is_respondido' => !is_null($resposta->is_presente), 'alcancado_com_anos' => $resposta->alcancado_com_anos, 'alcancado_com_meses' => $resposta->alcancado_com_meses, ]); } } }); $marcos->each(function ($marco) { $marco->perguntas->each(function ($pergunta) use ($marco) { if ($pergunta->is_respondido) { $meses = ($pergunta->alcancado_com_anos * 12) + $pergunta->alcancado_com_meses; if ($pergunta->is_presente && $marco->meses_final > 0 && $meses > $marco->meses_final ) { $pergunta->status = "Presente com atraso em {$pergunta->status}"; } else { $pergunta->status = ($pergunta->is_presente ? 'Presente em ' : 'Ausente em ') . $pergunta->status; } } }); }); return $marcos; } private static function getUltimaAntropometriaAtendimento($atendimento) { $antropometria = AtendimentoAntropometria::where('atendimento_id', $atendimento->id) ->where(fn ($q) => $q ->whereDoesntHave('soap') ->orWhereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ) ) ->orderByDesc('medido_em') ->first(); if (is_null($antropometria)) { return null; } return (object) [ 'peso' => $antropometria->peso, 'altura' => is_null($antropometria->altura) ? null : (int) $antropometria->altura, 'imc' => isset($antropometria->peso) && isset($antropometria->altura) ? ImcService::calculate( UnidadeMedidaEnum::QUILOGRAMAS, $antropometria->peso, UnidadeMedidaEnum::CENTIMETROS, $antropometria->altura ) : null, 'perimetro_cefalico' => is_null($antropometria->perimetro_cefalico) ? null : $antropometria->perimetro_cefalico, 'circunferencia_abdominal' => is_null($antropometria->circunferencia_abdominal) ? null : (int) $antropometria->circunferencia_abdominal, 'perimetro_panturrilha' => is_null($antropometria->perimetro_panturrilha) ? null : (int) $antropometria->perimetro_panturrilha, 'comprimento_pe_direito' => is_null($antropometria->comprimento_pe_direito) ? null : (int) $antropometria->comprimento_pe_direito, 'largura_pe_direito' => is_null($antropometria->largura_pe_direito) ? null : (int) $antropometria->largura_pe_direito, 'circunferencia_pe_direito' => is_null($antropometria->circunferencia_pe_direito) ? null : (int) $antropometria->circunferencia_pe_direito, 'comprimento_pe_esquerdo' => is_null($antropometria->comprimento_pe_esquerdo) ? null : (int) $antropometria->comprimento_pe_esquerdo, 'largura_pe_esquerdo' => is_null($antropometria->largura_pe_esquerdo) ? null : (int) $antropometria->largura_pe_esquerdo, 'circunferencia_pe_esquerdo' => is_null($antropometria->circunferencia_pe_esquerdo) ? null : (int) $antropometria->circunferencia_pe_esquerdo, ]; } private static function getOrCreateSoapAtendimento(int $atendimentoId) { $soaps = AtendimentoSoap::where('atendimento_id', $atendimentoId) ->where('is_rascunho', false) ->lockForUpdate() ->orderByDesc('updated_at') ->get(); foreach ($soaps as $soap) { if (self::dadosSoap($soap->id)) { return $soap; } } $novoSoap = new AtendimentoSoap(); $novoSoap->atendimento_id = $atendimentoId; return $novoSoap; } private static function dadosSoap(int $soapId): bool { $dadosAntropometria = DB::table('ambulatorio_atendimento_antropometria') ->where('soap_id', $soapId) ->exists(); if ($dadosAntropometria) { return true; } $dadosSinaisVitais = DB::table('ambulatorio_atendimento_sinal_vital') ->where('soap_id', $soapId) ->exists(); return $dadosSinaisVitais; } private static function getUltimoSinalVitalAtendimento($atendimento) { return AtendimentoSinalVital::where('atendimento_id', $atendimento->id) ->where(fn ($q) => $q ->whereDoesntHave('soap') ->orWhereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ) ) ->orderByDesc('created_at') ->first(); } private static function getUltimaGlicemiaCapilarAtendimento($atendimento) { return AtendimentoGlicemiaCapilar::where('atendimento_id', $atendimento->id) ->where(fn ($q) => $q ->whereDoesntHave('soap') ->orWhereHas('soap', fn ($q) => $q ->where('is_rascunho', false) ) ) ->orderByDesc('created_at') ->first(); } private static function getUltimasFeridasAtendimento($atendimento) { $soap = AtendimentoSoap::where('atendimento_id', $atendimento->id) ->where('is_rascunho', false) ->whereHas('feridas') ->orderByDesc('created_at') ->with([ 'feridas.procedimentos.atendimentoProcedimento.procedimento', 'feridas.procedimentos.atendimentoProcedimento.cid' ]) ->first(); return $soap ? $soap->feridas : collect(); } private static function getPlanoModelData($atendimento, $soapRascunho) { $feridaProcedimentosIds = []; $feridas = ($soapRascunho && $soapRascunho->feridas && $soapRascunho->feridas->isNotEmpty()) ? $soapRascunho->feridas : self::getUltimasFeridasAtendimento($atendimento); $procedimentosFeridas = $feridas ->flatMap(function ($ferida) use (&$feridaProcedimentosIds) { return $ferida->procedimentos->map(function ($feridaProcedimento) use (&$feridaProcedimentosIds) { $atendimentoProcedimento = $feridaProcedimento->atendimentoProcedimento; if (!$atendimentoProcedimento) { return null; } $feridaProcedimentosIds[] = $atendimentoProcedimento->id; return [ 'id' => $feridaProcedimento->id, 'procedimento' => [ 'id' => $atendimentoProcedimento->procedimento->id, 'codigo' => $atendimentoProcedimento->procedimento->codigo, 'nome' => $atendimentoProcedimento->procedimento->nome, ], 'cid' => $atendimentoProcedimento->cid ? [ 'id' => $atendimentoProcedimento->cid->id, 'codigo' => $atendimentoProcedimento->cid->codigo, 'nome' => $atendimentoProcedimento->cid->nome, ] : null, 'quantidade' => $atendimentoProcedimento->quantidade, 'automatico' => $atendimentoProcedimento->automatico, ]; })->filter(); }); return [ 'descricao' => $soapRascunho->plano_descricao ?? null, 'intervencoes' => ($soapRascunho->intervencoes ?? collect())->map(fn ($intervencao) => [ 'ciap' => [ 'id' => $intervencao->ciap->id, 'codigo' => $intervencao->ciap->codigo, 'descricao' => $intervencao->ciap->descricao, ], 'observacao' => $intervencao->observacao, ]), 'procedimentos_emad' => $soapRascunho && $soapRascunho->procedimentosEmad ? $soapRascunho->procedimentosEmad->map(function ($item) { return [ 'id' => $item->procedimento->id, 'codigo' => $item->procedimento->codigo, 'nome' => $item->procedimento->nome, ]; }) : collect(), 'procedimentos_clinicos' => ($soapRascunho->procedimentosClinicos ?? collect()) ->filter(fn ($pc) => !in_array($pc->atendimento_procedimento_id, $feridaProcedimentosIds)) ->map(fn ($procedmentoClinico) => [ 'procedimento' => [ 'id' => $procedmentoClinico->atendimentoProcedimento->procedimento->id, 'codigo' => $procedmentoClinico->atendimentoProcedimento->procedimento->codigo, 'nome' => $procedmentoClinico->atendimentoProcedimento->procedimento->nome, 'has_instrumento_registro_raas' => $procedmentoClinico->atendimentoProcedimento->procedimento ->registros() ->whereIn('codigo', [Registro::RAAS_ATENCAO_DOMICILIAR, Registro::RAAS_ATENCAO_PSICOSSOCIAL]) ->exists(), 'has_cid_principal' => $procedmentoClinico->atendimentoProcedimento->procedimento->has_cid_principal, ], 'cid' => $procedmentoClinico->atendimentoProcedimento->cid ? [ 'id' => $procedmentoClinico->atendimentoProcedimento->cid->id, 'codigo' => $procedmentoClinico->atendimentoProcedimento->cid->codigo, 'nome' => $procedmentoClinico->atendimentoProcedimento->cid->nome, ] : null, 'automatico' => $procedmentoClinico->atendimentoProcedimento->automatico, 'quantidade' => $procedmentoClinico->atendimentoProcedimento->quantidade, 'observacao' => $procedmentoClinico->observacao, ])->values(), 'procedimentos_feridas' => $procedimentosFeridas, 'prescricao_medicamentos' => $soapRascunho && $soapRascunho->prescricoesMedicamentos->isNotEmpty() ? $soapRascunho->prescricoesMedicamentos->first()->itens->map(fn ($item) => [ 'old_id' => $item->prescricaoMedicamentoItemAnterior->prescricao_medicamento_id ?? null, 'prescricao_medicamento_item_anterior_id' => $item->prescricao_medicamento_item_anterior_id, 'is_manual' => $item->is_manual, 'manual_id' => $item->is_manual ? $item->id : null, 'receita_tipo_id' => $item->receita_tipo_id, 'descricao' => $item->descricao, 'justificativa' => $item->justificativa, 'material' => $item->material ? [ 'id' => $item->material->id, 'descricao' => $item->material->descricao, 'via_administracao' => $item->material->viaAdministracao->nome ?? null, 'receita_tipo_id' => $item->material->receita_tipo_id, 'quantidade' => $item->material->quantidade, 'apresentacao' => $item->material->apresentacao->nome ?? null, 'receita_tipo' => $item->material->receitaTipo->nome ?? null, 'alto_custo' => $item->material->is_alto_custo ? 'ALTO CUSTO' : '', 'programa_remedio_em_casa' => $item->material->is_programa_remedio_em_casa ? 'PROGRAMA REMÉDIO EM CASA' : '', 'acao_judicial' => $item->material->is_acao_judicial ? 'AÇÃO JUDICIAL' : '', 'remume' => $item->material->is_remume ? 'REMUME' : '', ] : null, 'dose' => $item->dose, 'is_dose_unica' => $item->is_dose_unica, 'frequencia_dose' => $item->frequencia_dose, 'intervalo' => $item->intervalo, 'intervalo_medida_tempo_id' => $item->intervalo_medida_tempo_id, 'frequencia_vezes' => $item->frequencia_vezes, 'turno_id' => $item->turno_id, 'unidade_medida_id' => $item->unidade_medida_id, 'unidade_medida' => $item->unidadeMedida->nome ?? null, 'is_uso_continuo' => $item->is_uso_continuo, 'is_imprimir_separado' => $item->is_imprimir_separado, 'is_remover_impressao' => $item->is_remover_impressao, 'inicio' => $item->inicio ? $item->inicio->format('d/m/Y') : null, 'duracao' => $item->duracao, 'duracao_medida_tempo_id' => $item->duracao_medida_tempo_id ?? 'indeterminado', 'recomendacoes' => $item->recomendacoes, 'posologia' => $item->posologia, 'diagnostico' => 'diagnostico', 'tratamento_previo' => [ 'status' => false, 'relatar' => 'relatar' ] ]) : [], 'prescricao_medicamento_anamnese' => $soapRascunho && $soapRascunho->prescricoesMedicamentos->isNotEmpty() ? $soapRascunho->prescricoesMedicamentos->first()->anamnese : null, 'prescricao_medicamento_diagnostico' => $soapRascunho && $soapRascunho->prescricoesMedicamentos->isNotEmpty() ? $soapRascunho->prescricoesMedicamentos->first()->diagnostico : null, 'prescricao_medicamento_tratamento_previo' => $soapRascunho && $soapRascunho->prescricoesMedicamentos->isNotEmpty() ? [ 'status' => $soapRascunho->prescricoesMedicamentos->first()->tratamento_previo_status, 'relatar' => $soapRascunho->prescricoesMedicamentos->first()->tratamento_previo_relatar ]: [], 'prescricoes_medicamentos_clonados' => [], 'solicitacoes_exames_comuns' => ($soapRascunho ? $soapRascunho->solicitacoesExames()->where('alto_custo', false)->get() : collect() )->map(fn ($solicitacao) => [ 'cid' => $solicitacao->cid ? [ 'id' => $solicitacao->cid->id, 'codigo' => $solicitacao->cid->codigo, 'nome' => $solicitacao->cid->nome, ] : null, 'ciap' => $solicitacao->ciap ? [ 'id' => $solicitacao->ciap->id, 'codigo' => $solicitacao->ciap->codigo, 'descricao' => $solicitacao->ciap->descricao, ] : null, 'classificacao_risco_id' => $solicitacao->classificacao_risco_id, 'classificacao_risco_descricao_encaminhamento' => $solicitacao->classificacaoRisco->descricao_encaminhamento ?? null, 'justificativa' => $solicitacao->justificativa, 'observacao' => $solicitacao->observacao, 'exames' => $solicitacao->itens->map(fn ($item) => [ 'checked' => true, 'id' => $item->exame->id, 'codigo' => $item->exame->codigo, 'nome' => $item->exame->nome, 'tipoId' => $item->exame->tipo_id, ]), ]), 'solicitacoes_exames_alto_custo' => ($soapRascunho ? $soapRascunho->solicitacoesExames()->where('alto_custo', true)->get() : collect() )->map(fn ($solicitacao) => [ 'cid' => $solicitacao->cid ? [ 'id' => $solicitacao->cid->id, 'codigo' => $solicitacao->cid->codigo, 'nome' => $solicitacao->cid->nome, ] : null, 'ciap' => $solicitacao->ciap ? [ 'id' => $solicitacao->ciap->id, 'codigo' => $solicitacao->ciap->codigo, 'descricao' => $solicitacao->ciap->descricao, ] : null, 'classificacao_risco_id' => $solicitacao->classificacao_risco_id, 'classificacao_risco_descricao_encaminhamento' => $solicitacao->classificacaoRisco->descricao_encaminhamento ?? null, 'justificativa' => $solicitacao->justificativa, 'observacao' => $solicitacao->observacao, 'exames' => $solicitacao->itens->map(fn ($item) => [ 'id' => $item->exame->id, 'codigo' => $item->exame->codigo, 'nome' => $item->exame->nome, 'tipoId' => $item->exame->tipo_id, ]), ]), 'solicitacoes_procedimentos_cirurgicos' => ($soapRascunho ? $soapRascunho->solicitacoesProcedimentosCirurgicos()->get() : collect() )->map(fn ($solicitacao) => [ 'cid' => $solicitacao->cid ? [ 'id' => $solicitacao->cid->id, 'codigo' => $solicitacao->cid->codigo, 'nome' => $solicitacao->cid->nome, ] : null, 'ciap' => $solicitacao->ciap ? [ 'id' => $solicitacao->ciap->id, 'codigo' => $solicitacao->ciap->codigo, 'descricao' => $solicitacao->ciap->descricao, ] : null, 'classificacao_risco_id' => $solicitacao->classificacao_risco_id, 'classificacao_risco_descricao_encaminhamento' => $solicitacao->classificacaoRisco->descricao_encaminhamento, 'justificativa' => $solicitacao->justificativa, 'observacao' => $solicitacao->observacao, 'procedimentos_cirurgicos' => $solicitacao->itens->map(fn ($item) => [ 'id' => $item->procedimentoCirurgico->id, 'codigo' => $item->procedimentoCirurgico->procedimento_codigo, 'nome' => $item->procedimentoCirurgico->nome, ]), ]), 'atestados' => ($soapRascunho->atestados ?? collect())->map(fn ($atestado) => [ 'modelo_id' => $atestado->modelo_id, 'nome' => $atestado->nome_acompanhante ?? $atestado->soap->atendimento->paciente->cidadao->nome, 'is_atestado_acompanhante' => $atestado->is_atestado_acompanhante, 'documento_tipo_id' => $atestado->documento_tipo_id, 'cpf' => MaskUtil::getCpfMasked($atestado->cpf), 'cns' => MaskUtil::getCnsMasked($atestado->cns), 'data' => $atestado->data ? $atestado->data->format('d/m/Y') : null, 'horario' => $atestado->horario ? $atestado->horario->format('H:i') : null, 'dias' => $atestado->dias, 'cid' => $atestado->cid ? [ 'id' => $atestado->cid->id, 'codigo' => $atestado->cid->codigo, 'nome' => $atestado->cid->nome, ] : null, 'descricao' => $atestado->descricao, 'usuario' => [ 'id' => $atestado->createdLotacao->usuario->id, 'nome' => $atestado->createdLotacao->usuario->nome, ], ]), 'declaracoes_comparecimento' => ($soapRascunho->declaracoesComparecimento ?? collect()) ->map(fn ($declaracaoComparecimento) => [ 'turno' => $declaracaoComparecimento->turno_id ? [ 'id' => $declaracaoComparecimento->turno->id, 'nome' => $declaracaoComparecimento->turno->nome, ] : null, 'entrada' => $declaracaoComparecimento->entrada ? $declaracaoComparecimento->entrada->format('H:i') : null, 'saida' => $declaracaoComparecimento->saida ? $declaracaoComparecimento->saida->format('H:i') : null, 'nome_acompanhante' => $declaracaoComparecimento->nome_acompanhante, 'motivo_comparecimento' => $declaracaoComparecimento->motivo_comparecimento, ]), 'orientacoes' => ($soapRascunho->orientacoes ?? collect())->map(fn ($orientacao) => [ 'descricao' => $orientacao->descricao ]), 'cartas_medicas' => ($soapRascunho->cartasMedicas ?? collect())->map(fn ($cartaMedica) => [ 'descricao' => $cartaMedica->descricao ]), 'encaminhamentos' => ($soapRascunho->encaminhamentos ?? collect())->map(fn ($encaminhamento) => [ 'tipo' => [ 'id' => $encaminhamento->tipo->id, 'descricao' => $encaminhamento->tipo->descricao, ], 'unidade' => $encaminhamento->intersetorial_infraestrutura_id ? [ 'id' => $encaminhamento->intersetorialInfraestrutura->unidade->id, 'nomeFantasia' => $encaminhamento->intersetorialInfraestrutura->unidade->nome_fantasia ] : null, 'infraestrutura' => $encaminhamento->intersetorial_infraestrutura_id ? [ 'id' => $encaminhamento->intersetorialInfraestrutura->id, 'nome' => $encaminhamento->intersetorialInfraestrutura->nome, ] : null, 'especialidade' => $encaminhamento->servico_especializado_especialidade_id ? [ 'id' => $encaminhamento->servicoEspecializadoEspecialidade->id, 'nome' => $encaminhamento->servicoEspecializadoEspecialidade->nome, 'ocupacao_codigo' => $encaminhamento->servicoEspecializadoEspecialidade->ocupacao->codigo ] : null, 'complemento' => $encaminhamento->servico_especializado_complemento, 'ciap' => $encaminhamento->servico_especializado_ciap_id ? [ 'id' => $encaminhamento->servicoEspecializadoCiap->id, 'codigo' => $encaminhamento->servicoEspecializadoCiap->codigo, 'descricao' => $encaminhamento->servicoEspecializadoCiap->descricao, ] : null, 'cid' => $encaminhamento->servico_especializado_cid_id ? [ 'id' => $encaminhamento->servicoEspecializadoCid->id, 'codigo' => $encaminhamento->servicoEspecializadoCid->codigo, 'nome' => $encaminhamento->servicoEspecializadoCid->nome, ] : null, 'classificacaoRisco' => $encaminhamento->servico_especializado_classificacao_risco_id ? [ 'id' => $encaminhamento->servicoEspecializadoClassificacaoRisco->id, 'nome' => $encaminhamento->servicoEspecializadoClassificacaoRisco->nome, ] : null, 'motivo' => $encaminhamento->servico_especializado_motivo, 'observacao' => $encaminhamento->servico_especializado_observacao, 'internacao_hospitalar' => [ 'cid_principal' => $encaminhamento->internacaoHospitalarCidPrincipal, 'cid_secundario' => $encaminhamento->internacaoHospitalarCidSecundario, 'cid_causas_associadas' => $encaminhamento->internacaoHospitalarCausasAssociadas, 'unidade_solicitante' => $encaminhamento->internacaoHospitalarUnidadeSolicitante, 'principais_sinais_sintomas_clinicos' => $encaminhamento->internacao_hosp_principais_sinais_sintomas_clinicos, 'condicoes_que_justificam_internacao' => $encaminhamento->internacao_hosp_condicoes_que_justificam_internacao, 'principais_resultados_de_provas_diagnosticas' => $encaminhamento->internacao_hosp_principais_resultados_de_provas_diagnosticas, 'procedimento' => [ 'procedimento_solicitado' => $encaminhamento->internacaoHospitalarProcedimentoSolicitado, 'data_solicitacao' => $encaminhamento->internacao_hospitalar_data_solicitacao, 'clinica_id' => $encaminhamento->internacao_hospitalar_clinica_id, 'carater_internacao_id' => $encaminhamento->internacao_hospitalar_carater_internacao_id, 'profissional_solicitante_assistente' => $encaminhamento->internacaoHospitalarProfissionalSolicitanteAssistente ? [ 'id' => $encaminhamento->internacaoHospitalarProfissionalSolicitanteAssistente->id, 'cidadaoNome' => $encaminhamento->internacaoHospitalarProfissionalSolicitanteAssistente->cidadao->nome, 'cidadaoCpf' => $encaminhamento->internacaoHospitalarProfissionalSolicitanteAssistente->cidadao->cpf, 'cidadaoCns' => $encaminhamento->internacaoHospitalarProfissionalSolicitanteAssistente->cidadao->cns, ] : null, 'profissional_solicitante_assistente_documento_tipo_id' => $encaminhamento->internacao_hospitalar_profissional_solicitante_documento_tipo_id, 'profissional_solicitante_assistente_documento_numero' => $encaminhamento->internacao_hospitalar_profissional_solicitante_documento_numero, ], 'causas_externas' => [ 'causa_externa_id' => $encaminhamento->internacao_hospitalar_causa_externa_id, 'cnpj_seguradora' => $encaminhamento->internacao_hospitalar_cnpj_seguradora, 'numero_bilhete' => $encaminhamento->internacao_hospitalar_numero_bilhete, 'serie' => $encaminhamento->internacao_hospitalar_serie, 'cnpj_empresa' => $encaminhamento->internacao_hospitalar_cnpj_empresa, 'cnae_empresa' => $encaminhamento->internacao_hospitalar_cnae_empresa, 'cbor' => $encaminhamento->internacao_hospitalar_cbor, 'vinculo_previdencia_id' => $encaminhamento->internacao_hospitalar_vinculo_previdencia_id, ], 'autorizacao' => [ 'profissional_autorizador' => $encaminhamento->internacaoHospitalarProfissionalAutorizador ? [ 'id' => $encaminhamento->internacaoHospitalarProfissionalAutorizador->id, 'cidadaoNome' => $encaminhamento->internacaoHospitalarProfissionalAutorizador->cidadao->nome, 'cidadaoCpf' => $encaminhamento->internacaoHospitalarProfissionalAutorizador->cidadao->cpf, 'cidadaoCns' => $encaminhamento->internacaoHospitalarProfissionalAutorizador->cidadao->cns, ] : null, 'data_autorizacao' => $encaminhamento->internacao_hospitalar_data_autorizacao, 'codigo_orgao_emissor' => $encaminhamento->internacao_hospitalar_codigo_orgao_emissor, 'profissional_autorizador_documento_tipo_id' => $encaminhamento->internacao_hospitalar_profissional_autorizador_documento_tipo_id, 'profissional_autorizador_documento_numero' => $encaminhamento->internacao_hospitalar_profissional_autorizador_documento_numero, ], ], ]), 'compartilhamentos_cuidado' => ($soapRascunho->compartilhamentosCuidado ?? collect()) ->map(fn ($compartilhamentoCuidado) => [ 'especialidade_id' => $compartilhamentoCuidado->especialidade_id, 'usuario' => [ 'id' => $compartilhamentoCuidado->usuario->id, 'cidadao_nome' => $compartilhamentoCuidado->usuario->cidadao->nome, 'cidadao_cns' => $compartilhamentoCuidado->usuario->cidadao->cns, ], 'ciap' => $compartilhamentoCuidado->ciap ? [ 'id' => $compartilhamentoCuidado->ciap->id, 'codigo' => $compartilhamentoCuidado->ciap->codigo, 'descricao' => $compartilhamentoCuidado->ciap->descricao, ] : null, 'cid' => $compartilhamentoCuidado->cid ? [ 'id' => $compartilhamentoCuidado->cid->id, 'codigo' => $compartilhamentoCuidado->cid->codigo, 'nome' => $compartilhamentoCuidado->cid->nome, ] : null, 'classificacao_risco' => $compartilhamentoCuidado->classificacao_risco_id ? [ 'id' => $compartilhamentoCuidado->classificacaoRisco->id, 'nome' => $compartilhamentoCuidado->classificacaoRisco->nome, ] : null, 'discussao_caso_clinico' => $compartilhamentoCuidado->discussao_caso_clinico, ]), 'testes_rapidos' => ($soapRascunho->testesRapidos ?? collect())->map(fn ($testeRapido) => [ 'id' => $testeRapido->id, 'resultado' => $testeRapido->soapTesteRapido->resultado, ]), 'saude_bucal' => self::getPlanoSaudeBucalModelData($soapRascunho), 'triagem_neonatal' => ($soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->triagensNeonatalSolicitados ?? collect()), 'triagem_neonatal_cid' => $soapRascunho && $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado && $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->cid ? [ 'id' => $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->cid->id, 'codigo' => $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->cid->codigo, 'nome' => $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->cid->nome, ] : null, 'triagem_neonatal_ciap' => $soapRascunho && $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado && $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->ciap ? [ 'id' => $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->ciap->id, 'codigo' => $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->ciap->codigo, 'descricao' => $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->ciap->descricao, ] : null, 'triagem_neonatal_justificativa' => $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->justificativa ?? null, 'triagem_neonatal_observacao' => $soapRascunho->atendimentoSoapTriagemNeonatalSolicitado->observacao ?? null, 'exame_solicitado' => ($soapRascunho->atendimentoSoapExameSolicitado->examesSolicitados ?? collect()), 'exame_solicitado_cid' => $soapRascunho && $soapRascunho->atendimentoSoapExameSolicitado && $soapRascunho->atendimentoSoapExameSolicitado->cid ? [ 'id' => $soapRascunho->atendimentoSoapExameSolicitado->cid->id, 'codigo' => $soapRascunho->atendimentoSoapExameSolicitado->cid->codigo, 'nome' => $soapRascunho->atendimentoSoapExameSolicitado->cid->nome, ] : null, 'exame_solicitado_ciap' => $soapRascunho && $soapRascunho->atendimentoSoapExameSolicitado && $soapRascunho->atendimentoSoapExameSolicitado->ciap ? [ 'id' => $soapRascunho->atendimentoSoapExameSolicitado->ciap->id, 'codigo' => $soapRascunho->atendimentoSoapExameSolicitado->ciap->codigo, 'descricao' => $soapRascunho->atendimentoSoapExameSolicitado->ciap->descricao, ] : null, 'exame_solicitado_justificativa' => $soapRascunho->atendimentoSoapExameSolicitado->justificativa ?? null, 'exame_solicitado_observacao' => $soapRascunho->atendimentoSoapExameSolicitado->observacao ?? null, 'orientacao_individual_em_saude' => $soapRascunho->orientacao_individual_em_saude ?? false, ]; } private static function getPlanoSaudeBucalModelData($soapRascunho) { return [ 'odontograma' => self::getPlanoSaudeBucalOdontogramaModelData($soapRascunho), ]; } private static function getPlanoSaudeBucalOdontogramaModelData($soapRascunho) { $odontograma = $soapRascunho->odontograma ?? null; $getDentesData = function ($dente, $arcada) { $denteData = $arcada ? $arcada->odontogramaArcadaDentes()->where('dente_id', $dente->id)->first() : null; return [ 'id' => $dente->id, 'numero' => $dente->numero, 'fragmentos' => [ 'esquerda' => ['is_tratado' => $denteData->is_fragmento_esquerda_tratado ?? null], 'cima' => ['is_tratado' => $denteData->is_fragmento_cima_tratado ?? null], 'direita' => ['is_tratado' => $denteData->is_fragmento_direita_tratado ?? null], 'baixo' => ['is_tratado' => $denteData->is_fragmento_baixo_tratado ?? null], 'centro' => ['is_tratado' => $denteData->is_fragmento_centro_tratado ?? null], ], 'problemas_condicoes' => ($denteData->problemasCondicoes ?? collect())->pluck('id'), 'procedimentos' => ($denteData->atendimentoProcedimentos ?? collect())->map(fn ($atendimentoProcedimento) => [ 'procedimento' => [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->nome, 'has_cid_principal' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->has_cid_principal, ], 'cid' => $atendimentoProcedimento->atendimentoProcedimento->cid ? [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->cid->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->cid->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->cid->nome, ] : null, 'quantidade' => $atendimentoProcedimento->atendimentoProcedimento->quantidade, ]), 'observacao' => $denteData->observacao ?? null, ]; }; $arcadaSuperior = $odontograma ? $odontograma->odontogramaArcadas() ->where('arcada_id', ArcadaDentaria::SUPERIOR) ->first() : null; $arcadaInferior = $odontograma ? $odontograma->odontogramaArcadas() ->where('arcada_id', ArcadaDentaria::INFERIOR) ->first() : null; $protesesTotais = collect(); if ($arcadaSuperior && $arcadaSuperior->possui_protese_total) { $protesesTotais->push('superior'); } if ($arcadaInferior && $arcadaInferior->possui_protese_total) { $protesesTotais->push('inferior'); } return [ 'id' => null, 'possui_aparelho' => $odontograma->possui_aparelho ?? false, 'possui_contencao' => $odontograma->possui_contencao ?? false, 'proteses_totais' => $protesesTotais, 'mostrar_dentes_deciduos' => $odontograma ? $odontograma->whereHas('odontogramaArcadas', fn ($q) => $q ->whereHas('odontogramaArcadaDentes', fn ($q) => $q ->whereHas('dente', fn ($q) => $q->where('is_deciduo', true)) ) ) ->exists() : false, 'arcadas' => [ 'superior' => [ 'dentes' => [ 'permanentes' => Dente::where('arcada_id', ArcadaDentaria::SUPERIOR) ->where('is_deciduo', false) ->orderBy('ordem') ->get() ->map(fn ($dente) => $getDentesData($dente, $arcadaSuperior)), 'deciduos' => Dente::where('arcada_id', ArcadaDentaria::SUPERIOR) ->where('is_deciduo', true) ->orderBy('ordem') ->get() ->map(fn ($dente) => $getDentesData($dente, $arcadaSuperior)), ], 'procedimentos' => ($arcadaSuperior->atendimentoProcedimentos ?? collect()) ->map(fn ($atendimentoProcedimento) => [ 'procedimento' => [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->nome, 'has_cid_principal' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->has_cid_principal, ], 'cid' => $atendimentoProcedimento->atendimentoProcedimento->cid ? [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->cid->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->cid->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->cid->nome, ] : null, 'quantidade' => $atendimentoProcedimento->atendimentoProcedimento->quantidade, ]), 'observacao' => $arcadaSuperior->observacao ?? null, ], 'inferior' => [ 'dentes' => [ 'permanentes' => Dente::where('arcada_id', ArcadaDentaria::INFERIOR) ->where('is_deciduo', false) ->orderBy('ordem') ->get() ->map(fn ($dente) => $getDentesData($dente, $arcadaInferior)), 'deciduos' => Dente::where('arcada_id', ArcadaDentaria::INFERIOR) ->where('is_deciduo', true) ->orderBy('ordem') ->get() ->map(fn ($dente) => $getDentesData($dente, $arcadaInferior)), ], 'procedimentos' => ($arcadaInferior->atendimentoProcedimentos ?? collect()) ->map(fn ($atendimentoProcedimento) => [ 'procedimento' => [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->nome, 'has_cid_principal' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->has_cid_principal, ], 'cid' => $atendimentoProcedimento->atendimentoProcedimento->cid ? [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->cid->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->cid->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->cid->nome, ] : null, 'quantidade' => $atendimentoProcedimento->atendimentoProcedimento->quantidade, ]), 'observacao' => $arcadaInferior->observacao ?? null, ], ], 'dentes_supranumerarios' => ($odontograma->dentesSupranumerarios ?? collect()) ->map(fn ($denteSupranumerario) => [ 'local' => $denteSupranumerario->local, 'procedimentos' => $denteSupranumerario->atendimentoProcedimentos->map(fn ($atendimentoProcedimento) => [ 'procedimento' => [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->nome, 'has_cid_principal' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->has_cid_principal, ], 'cid' => $atendimentoProcedimento->atendimentoProcedimento->cid ? [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->cid->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->cid->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->cid->nome, ] : null, 'quantidade' => $atendimentoProcedimento->atendimentoProcedimento->quantidade, ]), 'observacao' => $denteSupranumerario->observacao, ]), ]; } private static function getFinalizacaoModelData($atendimento, $soapRascunho, $fila = null) { $lotacaoLogada = self::getCurrentLotacao(); $parametrizacaoOcupacao = ParametrizacaoInfraestruturaOcupacao::whereHas('parametrizacaoInfraestrutura', fn ($q) => $q ->where('infraestrutura_id', $lotacaoLogada->infraestrutura_id) ) ->where('ocupacao_id', $lotacaoLogada->ocupacao_id) ->first(); return [ 'atendimento_id' => $atendimento->id, 'demanda_tipo' => $atendimento->is_demanda_espontanea ? DemandaTipo::ESPONTANEA : DemandaTipo::AGENDADA, 'atendimento_tipo_id' => $soapRascunho->atendimento_tipo_id ?? $atendimento->atendimento_tipo_id, 'atendimento_compartilhado_usuario' => $soapRascunho && isset($soapRascunho->atendimentoCompartilhadoUsuario) ? [ 'id' => $soapRascunho->atendimentoCompartilhadoUsuario->id, 'cidadao_cns' => $soapRascunho->atendimentoCompartilhadoUsuario->cidadao->cns, 'cidadao_nome' => $soapRascunho->atendimentoCompartilhadoUsuario->cidadao->nome, ] : null, 'procedimentos_administrativos' => isset($soapRascunho) ? ($soapRascunho->procedimentosAdministrativos ?? collect()) ->map(fn ($atendimentoProcedimento) => [ 'procedimento' => [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->nome, 'has_instrumento_registro_raas' => $atendimentoProcedimento->atendimentoProcedimento->procedimento ->registros() ->whereIn('codigo', [Registro::RAAS_ATENCAO_DOMICILIAR, Registro::RAAS_ATENCAO_PSICOSSOCIAL]) ->exists(), 'has_cid_principal' => $atendimentoProcedimento->atendimentoProcedimento->procedimento->has_cid_principal, ], 'cid' => $atendimentoProcedimento->atendimentoProcedimento->cid ? [ 'id' => $atendimentoProcedimento->atendimentoProcedimento->cid->id, 'codigo' => $atendimentoProcedimento->atendimentoProcedimento->cid->codigo, 'nome' => $atendimentoProcedimento->atendimentoProcedimento->cid->nome, ] : null, 'quantidade' => $atendimentoProcedimento->atendimentoProcedimento->quantidade, 'automatico' => $atendimentoProcedimento->atendimentoProcedimento->automatico, ]) : self::getProcedimentosPadroes($atendimento), 'caso_suspeito_id' => null, 'casos_suspeitos' => ($soapRascunho->casosSuspeitos ?? collect())->map(fn ($casoSuspeito) => [ 'id' => $casoSuspeito->id, 'nome' => $casoSuspeito->nome, 'gera_impressao' => $casoSuspeito->gera_impressao, ]), 'racionalidade_saude_id' => $soapRascunho->racionalidade_saude_id ?? null, 'condutas' => ($soapRascunho->condutas ?? collect())->pluck('id'), 'saude_bucal' => [ 'consulta_tipo_id' => $soapRascunho->saude_bucal_consulta_tipo_id ?? null, 'fornecimentos' => ($soapRascunho->saudeBucalFornecimentos ?? collect())->pluck('id'), ], 'equipe_id' => $soapRascunho->equipe_id ?? null, 'atencao_basica_local_atendimento_id' => $soapRascunho->atencao_basica_local_atendimento_id ?? (self::criaFichaAtencaoBasica() ? LocalAtendimentoEnum::UBS : null), 'turno_id' => $soapRascunho ? $soapRascunho->turno_id : (self::criaFichaAtencaoBasica() ? self::getTurnoMomento() : null), 'desfecho' => [ 'finalizado' => null, 'ocupacao_id' => $atendimento->ocupacao->id ?? null, 'especialidade_id' => $atendimento->especialidade->id ?? null, 'usuario_id' => $atendimento->usuario->id ?? null, 'jornada_id' => $atendimento->demandaEspontanea->jornada_id ?? null, 'opcao_entrada_id' => $fila->opcao_entrada_id ?? null, 'prioridade_id' => $fila->prioridade_id ?? null, 'centro_custo_encaminhamento_id' => null, 'pos_consulta' => $parametrizacaoOcupacao->pos_consulta ?? false, 'servicos' => $atendimento->servicos->pluck('id'), 'protocolo_fechamento' => null, ], 'is_tratamento_concluido' => $soapRascunho->is_tratamento_concluido ?? null, 'emad_conduta_desfecho_id' => $soapRascunho->emad_conduta_desfecho_id ?? null, 'emad_modalidade_id' => $soapRascunho->emad_modalidade_id ?? null, 'emad_procedencia_id' => $soapRascunho->emad_procedencia_id ?? null, 'emad_conclusao_id' => $soapRascunho->emad_conclusao_id ?? null, 'emad_cid_primario_id' => $soapRascunho && $soapRascunho->emad_cid_primario_id ? [ 'id' => $soapRascunho->emad_cid_primario_id, 'nome' => Cid::where('id', $soapRascunho->emad_cid_primario_id)->first()->nome, 'codigo' => Cid::where('id', $soapRascunho->emad_cid_primario_id)->first()->codigo, ] : null, 'emad_select_cid_primario_id' => $soapRascunho && $soapRascunho->emad_cid_primario_id ? [ 'id' => $soapRascunho->emad_cid_primario_id, 'nome' => Cid::where('id', $soapRascunho->emad_cid_primario_id)->first()->nome, 'codigo' => Cid::where('id', $soapRascunho->emad_cid_primario_id)->first()->codigo, ] : null, 'emad_cuidador_id' => $soapRascunho->emad_cuidador_id ?? EnumCuidador::NAO_POSSUI, 'emad_cns_cuidador' => $soapRascunho->emad_cns_cuidador ?? null, 'emad_cpf_cuidador' => $soapRascunho->emad_cpf_cuidador ?? null, 'emad_tipo_atendimento_id' => $soapRascunho && $soapRascunho->emad_tipo_atendimento_id ? $soapRascunho->emad_tipo_atendimento_id : ($atendimento->is_demanda_espontanea ? TipoAtendimentoEnum::ATENDIMENTO_NAO_PROGRAMADO : TipoAtendimentoEnum::ATENDIMENTO_PROGRAMADO), 'emad_conclusao_justificativa' => $soapRascunho && $soapRascunho->justificativaEmad ? $soapRascunho->justificativaEmad->pluck('id') : collect(), 'oci_desfecho_etapa_clinica_id' => $soapRascunho->oci_desfecho_etapa_clinica_id ?? null, 'apac_motivo_saida_permanencia_id' => $soapRascunho->apac_motivo_saida_permanencia_id ?? null, ]; } private static function getProcedimentosPadroes($atendimento) { if ($atendimento->especialidade) { $procedimentosParametrizados = self::getProcedimentosParametrizados($atendimento); if ($procedimentosParametrizados->isNotEmpty()) { return $procedimentosParametrizados; } else if ($atendimento->especialidade->atencao_basica_procedimento_padrao_codigo) { return collect([ [ 'procedimento' => [ 'id' => $atendimento->especialidade->atencao_basica_procedimento_padrao->id, 'codigo' => $atendimento->especialidade->atencao_basica_procedimento_padrao->codigo, 'nome' => $atendimento->especialidade->atencao_basica_procedimento_padrao->nome, 'has_instrumento_registro_raas' => $atendimento->especialidade->atencao_basica_procedimento_padrao ->registros() ->whereIn('codigo', [Registro::RAAS_ATENCAO_DOMICILIAR, Registro::RAAS_ATENCAO_PSICOSSOCIAL]) ->exists(), 'has_cid_principal' => $atendimento->especialidade->atencao_basica_procedimento_padrao->has_cid_principal, ], 'cid' => null, 'quantidade' => 1, 'automatico' => true, ] ]); } } return collect(); } private static function getProcedimentosParametrizados($atendimento) { return ParametrizacaoInfraestruturaEspecialidadeProcedimento::whereHas( 'parametrizacaoInfraestruturaEspecialidade', fn ($q) => $q ->where('especialidade_id', $atendimento->especialidade->id) ->whereHas('parametrizacaoInfraestrutura', fn ($q) => $q ->where('infraestrutura_id', $atendimento->infraestrutura->id) ) ) ->get() ->map(fn ($parametrizacaoProcedimento) => [ 'procedimento' => [ 'id' => $parametrizacaoProcedimento->procedimento->id, 'codigo' => $parametrizacaoProcedimento->procedimento->codigo, 'nome' => $parametrizacaoProcedimento->procedimento->nome, 'has_instrumento_registro_raas' => $parametrizacaoProcedimento->procedimento ->registros() ->whereIn('codigo', [Registro::RAAS_ATENCAO_DOMICILIAR, Registro::RAAS_ATENCAO_PSICOSSOCIAL]) ->exists(), 'has_cid_principal' => $parametrizacaoProcedimento->procedimento->has_cid_principal, ], 'cid' => null, 'quantidade' => 1, 'automatico' => true, ]); } private static function getTurnoMomento() { $now = Carbon::now(); $isManha = fn () => $now->hour >= 6 && $now->hour <= 11; $isTarde = fn () => $now->hour >= 12 && $now->hour <= 17; if ($isManha()) { return TurnoEnum::MANHA; } else if ($isTarde()) { return TurnoEnum::TARDE; } else { return TurnoEnum::NOITE; } } private static function getExamesRealizadosOci($acompanhamentoOci){ $procedimentosPrimariosOci = DB::table('cadastro_oci_procedimento_primario AS procedimento_primario') ->where('procedimento_primario.oci_id', $acompanhamentoOci->oci_id) ->select('procedimento_primario.procedimento_codigo') ->get() ->pluck('procedimento_codigo') ->all(); $competencias = Competencia::latest()->take(2)->get()->pluck('id'); $procedimentoOciRealizado = false; DB::table('ambulatorio_atendimento_soap_solicitacao_exame_item as solicitacao_exame_item') ->join('parametrizacao_exame as exame', 'exame.id', 'solicitacao_exame_item.exame_id') ->join('sigtap.procedimento as procedimento', fn ($j) => $j ->on('procedimento.codigo', 'exame.codigo') ->whereIn('procedimento.competencia_id', $competencias) ) ->join( 'ambulatorio_atendimento_soap_solicitacao_exame as solicitacao_exame', 'solicitacao_exame.id', 'solicitacao_exame_item.solicitacao_exame_id' ) ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'solicitacao_exame.soap_id') ->where('soap.acompanhamento_oci_id', $acompanhamentoOci->id) ->whereIn('exame.codigo', $procedimentosPrimariosOci) ->select( 'solicitacao_exame_item.id', 'procedimento.id as procedimento_id', 'solicitacao_exame_item.ocupacao_executora_id', 'solicitacao_exame_item.status_id' ) ->get() ->each(function ($solicitacaoExameItem) use (&$procedimentoOciRealizado){ $exameLaboratorial = DB::table('exame_laboratorial_agendamento_exame as agendamento_exame') ->join('exame_laboratorial_agendamento as agendamento', 'agendamento.id', 'agendamento_exame.agendamento_id') ->where('agendamento_exame.soap_solicitacao_exame_item_id', $solicitacaoExameItem->id) ->whereIn('agendamento_exame.status_id', [ StatusAgendamento::REALIZADO, StatusAgendamento::PENDENTE_ASSINATURA, StatusAgendamento::ASSINADO, StatusAgendamento::PENDENTE_ENTREGA, StatusAgendamento::ENTREGUE, ]) ->first(); if (!is_null($exameLaboratorial)) { $procedimentoOciRealizado = true; return; } $exameImagem = DB::table('exame_imagem_agendamento_exame as agendamento_exame') ->join('exame_imagem_fechamento_faturamento as fechamento', 'fechamento.agendamento_exame_id', 'agendamento_exame.id') ->where('agendamento_exame.soap_solicitacao_exame_item_id', $solicitacaoExameItem->id) ->first(); if (!is_null($exameImagem)) { $procedimentoOciRealizado = true; return; } $exameLaboratorialReguladoInterno = DB::table('regulacao_solicitacao_item as solicitacao_item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'solicitacao_item.solicitacao_id') ->join('regulacao_status as status', 'status.id', 'solicitacao.status_id') ->join('exame_laboratorial_agendamento as agendamento', 'agendamento.regulacao_solicitacao_id', 'solicitacao.id') ->join('exame_laboratorial_agendamento_exame as agendamento_exame', fn ($j) => $j ->on('agendamento_exame.agendamento_id', 'agendamento.id') ->whereColumn('agendamento_exame.exame_id', 'solicitacao_item.exame_id') ) ->where('solicitacao_item.soap_solicitacao_item_id', $solicitacaoExameItem->id) ->where('status.tipo_id', RegulacaoStatusTipo::REALIZADO) ->first(); if (!is_null($exameLaboratorialReguladoInterno)) { $procedimentoOciRealizado = true; return; } $exameImagemReguladoInterno = DB::table('regulacao_solicitacao_item as solicitacao_item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'solicitacao_item.solicitacao_id') ->join('regulacao_status as status', 'status.id', 'solicitacao.status_id') ->join('exame_imagem_agendamento as agendamento', 'agendamento.regulacao_solicitacao_id', 'solicitacao.id') ->join('exame_imagem_agendamento_exame as agendamento_exame', fn ($j) => $j ->on('agendamento_exame.agendamento_id', 'agendamento.id') ->whereColumn('agendamento_exame.exame_id', 'solicitacao_item.exame_id') ) ->join('exame_imagem_fechamento_faturamento as fechamento', 'fechamento.agendamento_exame_id', 'agendamento_exame.id') ->where('solicitacao_item.soap_solicitacao_item_id', $solicitacaoExameItem->id) ->where('status.tipo_id', RegulacaoStatusTipo::REALIZADO) ->first(); if (!is_null($exameImagemReguladoInterno)) { $procedimentoOciRealizado = true; return; } $exameReguladoExterno = DB::table('regulacao_solicitacao_item as solicitacao_item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'solicitacao_item.solicitacao_id') ->join('regulacao_status as status', 'status.id', 'solicitacao.status_id') ->where('solicitacao_item.soap_solicitacao_item_id', $solicitacaoExameItem->id) ->where('status.tipo_id', RegulacaoStatusTipo::REALIZADO) ->whereNotNull('solicitacao.prestador_externo_id') ->first(); if ($exameReguladoExterno) { $procedimentoOciRealizado = true; return; } $exameExternoNaoRegulado = DB::table('ambulatorio_atendimento_soap_solicitacao_exame_item') ->select('ambulatorio_atendimento_soap_solicitacao_exame_item.*') ->leftJoin('exame_laboratorial_agendamento_exame as agendamento_exame', 'agendamento_exame.soap_solicitacao_exame_item_id', 'ambulatorio_atendimento_soap_solicitacao_exame_item.id') ->leftJoin('exame_imagem_agendamento_exame as agendamento_exame_imagem', 'agendamento_exame_imagem.soap_solicitacao_exame_item_id', 'ambulatorio_atendimento_soap_solicitacao_exame_item.id') ->leftJoin('regulacao_solicitacao_item as solicitacao_item', 'solicitacao_item.soap_solicitacao_item_id', 'ambulatorio_atendimento_soap_solicitacao_exame_item.id') ->whereNull('agendamento_exame.soap_solicitacao_exame_item_id') ->whereNull('agendamento_exame_imagem.soap_solicitacao_exame_item_id') ->whereNull('solicitacao_item.soap_solicitacao_item_id') ->where('ambulatorio_atendimento_soap_solicitacao_exame_item.id', $solicitacaoExameItem->id) ->where('ambulatorio_atendimento_soap_solicitacao_exame_item.status_id', AtendimentoSoapSolicitacaoExameItemStatus::REALIZADO) ->first(); if (!is_null($exameExternoNaoRegulado)) { $procedimentoOciRealizado = true; return; } }); if (!$procedimentoOciRealizado) { $realizado = true; foreach ($procedimentosPrimariosOci as $procedimentoPrimarioCodigo) { $hasProcedimentoRealizado = DB::table('ambulatorio_acompanhamento_oci_procedimento_realizado as procedimento_realizado') ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'procedimento_realizado.procedimento_id') ->where('procedimento_realizado.acompanhamento_oci_id', $acompanhamentoOci->id) ->where('procedimento.codigo', $procedimentoPrimarioCodigo) ->exists(); if (!$hasProcedimentoRealizado) { $realizado = false; } } $procedimentoOciRealizado = $realizado; } return $procedimentoOciRealizado; } private static function getOciModelData($atendimento, $soapRascunho) { $oci = null; if (!$atendimento->is_demanda_espontanea) { $ociModel = null; $etapaClinicaAtual = null; $etapasConcluidas = null; $prazoValidade = null; $usuarioQueIniciou = null; $procedimentosRealizadosSaved = []; $procedimentoOciRealizado = null; $acompanhamentoOci = AcompanhamentoOci::where('paciente_id', $atendimento->paciente->id) ->where('ocupacao_id', $atendimento->ocupacao->id) ->whereNull('finalizado_em') ->first(); if (!is_null($acompanhamentoOci)) { $ultimaEtapaConcluida = $acompanhamentoOci->etapasClinicasConcluidas()->orderByDesc('id')->first(); $ociModel = $acompanhamentoOci->oci; $prazoValidade = self::getPrazoValidadeOci($acompanhamentoOci)->format('d/m/Y'); $usuarioQueIniciou = $acompanhamentoOci->iniciadoLotacao->usuario->cidadao->nome; $procedimentoOciRealizado = self::getExamesRealizadosOci($acompanhamentoOci); if (($ultimaEtapaConcluida->soap->atendimento_id ?? null) !== $atendimento->id) { $etapaClinicaAtual = $acompanhamentoOci->etapaClinicaAtual; } else { $etapaClinicaAtual = $ultimaEtapaConcluida->etapaClinica; } $procedimentosRealizadosSaved = $acompanhamentoOci->procedimentosRealizados->map(fn ($procedimentoRealizado) => [ 'id' => $procedimentoRealizado->procedimento->id, 'codigo' => $procedimentoRealizado->procedimento->codigo, 'descricao' => MaskUtil::getProcedimentoMasked($procedimentoRealizado->procedimento->codigo) . " - {$procedimentoRealizado->procedimento->nome}", 'is_realizado' => true, 'data_executada' => is_null($procedimentoRealizado->data_executada) ? null : $procedimentoRealizado->data_executada->format('d/m/Y'), 'unidade_executora_id' => $procedimentoRealizado->unidade_executora_id, 'ocupacao_executora' => is_null($procedimentoRealizado->ocupacao_executora_id) ? null : [ 'id' => $procedimentoRealizado->ocupacaoExecutora->id, 'codigo' => $procedimentoRealizado->ocupacaoExecutora->codigo, 'nome' => $procedimentoRealizado->ocupacaoExecutora->nome, ], 'usuario_executor' => $procedimentoRealizado->usuario_executor_nome, ]); $etapasConcluidas = $acompanhamentoOci->etapasClinicasConcluidas() ->orderBy('id') ->get() ->map(fn ($e) => $e->etapaClinica->nome) ->unique() ->values() ->join(', '); } else if (isset($soapRascunho->oci)) { $ociModel = $soapRascunho->oci; $etapaClinicaAtual = EtapaClinica::findOrFail( $ociModel->etapasClinicas()->where('id', EtapaClinicaEnum::ENTRADA_ALTA)->exists() ? EtapaClinicaEnum::ENTRADA_ALTA : EtapaClinicaEnum::ENTRADA ); } if (!is_null($ociModel)) { $oci = [ 'id' => $ociModel->id, 'nome' => $ociModel->nome, 'linha_cuidado' => $ociModel->linha_cuidado, 'etapa_clinica_atual_id' => $etapaClinicaAtual->id ?? null, 'etapa_clinica_atual_nome' => $etapaClinicaAtual->nome ?? null, 'procedimentos_primarios' => $ociModel->procedimentosPrimarios->map(fn ($procedimento) => [ 'id' => $procedimento->procedimento->id, 'codigo' => $procedimento->procedimento_codigo, 'descricao' => MaskUtil::getProcedimentoMasked($procedimento->procedimento->codigo) . " - {$procedimento->procedimento->nome}", ]), 'procedimentos_secundarios' => $ociModel->procedimentosSecundarios ->filter(fn ($p) => !collect([ ProcedimentoEnum::CONSULTA_MEDICA_EM_ATENCAO_ESPECIALIZADA, ProcedimentoEnum::TELECONSULTA_MEDICA_NA_ATENCAO_ESPECIALIZADA, ])->contains($p->procedimento_codigo)) ->map(fn ($procedimento) => [ 'id' => $procedimento->procedimento->id, 'codigo' => $procedimento->procedimento_codigo, 'descricao' => MaskUtil::getProcedimentoMasked($procedimento->procedimento->codigo) . " - {$procedimento->procedimento->nome}", ]) ->values(), 'procedimentos_consulta' => $ociModel->procedimentosSecundarios() ->whereIn('procedimento_codigo', [ ProcedimentoEnum::CONSULTA_MEDICA_EM_ATENCAO_ESPECIALIZADA, ProcedimentoEnum::TELECONSULTA_MEDICA_NA_ATENCAO_ESPECIALIZADA, ]) ->get() ->map(fn ($p) => $p->procedimento_codigo), 'cids' => self::getCidsOci($ociModel), 'etapas_clinicas' => $ociModel->etapasClinicas->map(fn ($ec) => $ec->id), 'etapas_concluidas' => $etapasConcluidas, 'prazo_validade' => $prazoValidade, 'usuario_que_iniciou' => $usuarioQueIniciou, 'exame_oci_realizado' => $procedimentoOciRealizado, 'unidades_executoras' => $ociModel->unidadesExecutoras->map(fn ($unidadeExecutora) => [ 'id' => $unidadeExecutora->unidade->id, 'nome_fantasia' => $unidadeExecutora->unidade->nome_fantasia, ])->sortBy('nome_fantasia')->values(), 'procedimentos_realizados_previamente' => isset($soapRascunho) ? $soapRascunho->ociProcedimentosRealizados->map(fn ($procedimentoRealizado) => [ 'id' => $procedimentoRealizado->procedimento->id, 'codigo' => $procedimentoRealizado->procedimento->codigo, 'is_realizado' => true, 'data_executada' => is_null($procedimentoRealizado->data_executada) ? null : $procedimentoRealizado->data_executada->format('d/m/Y'), 'unidade_executora_id' => $procedimentoRealizado->unidade_executora_id, 'ocupacao_executora_id' => $procedimentoRealizado->ocupacao_executora_id, 'ocupacao_executora' => is_null($procedimentoRealizado->ocupacao_executora_id) ? null : [ 'id' => $procedimentoRealizado->ocupacaoExecutora->id, 'codigo' => $procedimentoRealizado->ocupacaoExecutora->codigo, 'nome' => $procedimentoRealizado->ocupacaoExecutora->nome, ], 'usuario_executor' => $procedimentoRealizado->usuario_executor_nome, ]) : [], 'procedimentos_realizados_previamente_saved' => $procedimentosRealizadosSaved, ]; } } return [ 'oci' => $oci, ]; } public static function getOci($id) { $oci = Oci::findOrFail($id); $etapaClinicaAtual = EtapaClinica::findOrFail( $oci->etapasClinicas()->where('id', EtapaClinicaEnum::ENTRADA_ALTA)->exists() ? EtapaClinicaEnum::ENTRADA_ALTA : EtapaClinicaEnum::ENTRADA ); return [ 'id' => $oci->id, 'nome' => $oci->nome, 'linha_cuidado' => $oci->linha_cuidado, 'etapa_clinica_atual_id' => $etapaClinicaAtual->id, 'etapa_clinica_atual_nome' => $etapaClinicaAtual->nome, 'procedimentos_primarios' => $oci->procedimentosPrimarios->map(fn ($procedimento) => [ 'id' => $procedimento->procedimento->id, 'codigo' => $procedimento->procedimento_codigo, 'descricao' => MaskUtil::getProcedimentoMasked($procedimento->procedimento->codigo) . " - {$procedimento->procedimento->nome}", ]), 'procedimentos_secundarios' => $oci->procedimentosSecundarios ->filter(fn ($p) => !collect([ ProcedimentoEnum::CONSULTA_MEDICA_EM_ATENCAO_ESPECIALIZADA, ProcedimentoEnum::TELECONSULTA_MEDICA_NA_ATENCAO_ESPECIALIZADA, ])->contains($p->procedimento_codigo)) ->map(fn ($procedimento) => [ 'id' => $procedimento->procedimento->id, 'codigo' => $procedimento->procedimento_codigo, 'descricao' => MaskUtil::getProcedimentoMasked($procedimento->procedimento->codigo) . " - {$procedimento->procedimento->nome}", ]) ->values(), 'procedimentos_consulta' => $oci->procedimentosSecundarios() ->whereIn('procedimento_codigo', [ ProcedimentoEnum::CONSULTA_MEDICA_EM_ATENCAO_ESPECIALIZADA, ProcedimentoEnum::TELECONSULTA_MEDICA_NA_ATENCAO_ESPECIALIZADA, ]) ->get() ->map(fn ($p) => $p->procedimento_codigo), 'cids' => self::getCidsOci($oci), 'etapas_clinicas' => $oci->etapasClinicas->map(fn ($ec) => $ec->id), 'etapas_concluidas' => null, 'prazo_validade' => null, 'usuario_que_iniciou' => null, 'unidades_executoras' => $oci->unidadesExecutoras->map(fn ($unidadeExecutora) => [ 'id' => $unidadeExecutora->unidade->id, 'nome_fantasia' => $unidadeExecutora->unidade->nome_fantasia, ])->sortBy('nome_fantasia')->values(), 'procedimentos_realizados_previamente' => [], ]; } private static function getCidsOci($oci) { return DB::table('sigtap.cid AS cid') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('sigtap.procedimento_cid AS procedimento_cid') ->join('sigtap.procedimento AS procedimento', 'procedimento.id', 'procedimento_cid.procedimento_id') ->whereColumn('procedimento_cid.cid_id', 'cid.id') ->where('procedimento_cid.competencia_id', DB::table('sigtap.competencia')->max('id')) ->where('procedimento.codigo', $oci->procedimento_codigo) ) ->select('cid.id') ->get() ->pluck('id'); } private static function getLogData($model) { return [ 'lotacao' => [ 'ocupacao' => [ 'id' => $model->createdLotacao->ocupacao->id ?? null, 'codigo' => $model->createdLotacao->ocupacao->codigo ?? null, 'nome' => $model->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $model->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $model->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $model->created_at->format('d/m/Y \à\s H:i'), ]; } public static function store() { $fila = request()->fila_id ? Fila::find(request()->fila_id) : null; $agendamento = request()->agendamento_id ? Agendamento::find(request()->agendamento_id) : null; $atendimento = $fila->ambulatorioAtendimento ?? $agendamento->atendimento; self::validateStore($fila); if (request()->finalizacao['desfecho']['finalizado']) { $protocoloFechamento = self::getProtocoloFechamento($atendimento->agendamento_id); if (!is_null($protocoloFechamento) && $protocoloFechamento->controla_protocolo_fechamento == 1) { if (request()->finalizacao['desfecho']['protocolo_fechamento'] !== $protocoloFechamento->numero) { throw new ProtocoloFechamentoException(); } } } $soap = DB::transaction(function () use ($fila, $atendimento) { if ($atendimento->demanda_espontanea_id) { $soap = new AtendimentoSoap(); } else if ($atendimento->agendamento_id) { $jornada = $atendimento->agendamento->jornada; $soap = optional(ParametrizacaoIntegracaoAplicativo::first())->habilita_integracao_aplicativo_feridas ? self::getOrCreateSoapAtendimento($atendimento->id) : new AtendimentoSoap(); } self::deleteSoapRascunho($atendimento); self::savePaciente($atendimento); $soap->fill(self::getSoapParams($atendimento)); $isRetroativo = is_null($fila); $isNovoSoap = !$soap->exists(); if ($isRetroativo && $isNovoSoap) { $dataHoraRetroativa = Carbon::create($atendimento->agendamento->jornada->data->format('Y-m-d') . ' ' . $atendimento->agendamento->horario->format('H:i:s')); $soap->created_at = $dataHoraRetroativa; $soap->updated_at = $dataHoraRetroativa; } $soap->save(); $soap->motivos()->createMany(request()->subjetivo['motivos']); $soap->condicoesAvaliadas()->sync(request()->avaliacao['condicoes_avaliadas']); $soap->condicoesEmad()->sync(request()->avaliacao['condicoes_emad']); $soap->doencasTransmissiveis()->sync(request()->avaliacao['doencas_transmissiveis']); $soap->rastreamentos()->sync(request()->avaliacao['rastreamentos']); $soap->intervencoes()->createMany(request()->plano['intervencoes']); $soap->orientacoes()->createMany(request()->plano['orientacoes']); $soap->cartasMedicas()->createMany(request()->plano['cartas_medicas']); $soap->compartilhamentosCuidado()->createMany(request()->plano['compartilhamentos_cuidado']); $soap->casosSuspeitos()->sync(request()->finalizacao['casos_suspeitos']); $soap->condutas()->sync(request()->finalizacao['condutas']); $soap->perfisEpidemiologicos()->sync(request()->perfis_epidemiologicos); self::saveTestesRapidos($soap); self::saveExamesAvaliados($soap); self::saveTriagemNeonatal($soap); self::saveExamesSolicitados($soap); self::saveTriagensNeonatalSolicitados($soap); self::saveOciProcedimentosRealizados($soap); if ($soap->is_atendimento_puericultura) { self::savePuericulturaAlteracoesFenotipicas($soap); self::savePuericulturaFatoresRisco($soap); self::savePuericulturaMarcosDesenvolvimento($soap); self::savePuericulturaQuestionarioMChatR($soap); } if ($soap->is_atendimento_saude_bucal) { $soap->saudeBucalVigilancias()->sync(request()->avaliacao['saude_bucal']['vigilancias']); $soap->saudeBucalFornecimentos()->sync(request()->finalizacao['saude_bucal']['fornecimentos']); self::saveOdontograma($soap); } $procedimentosEmad = array_map(function ($procedimento) { return [ 'codigo_procedimento' => $procedimento['codigo'], ]; }, request()->plano['procedimentos_emad']); $soap->procedimentosEmad()->delete(); $soap->procedimentosEmad()->createMany($procedimentosEmad); $soap->justificativaEmad()->sync(request()->finalizacao['emad_conclusao_justificativa']); self::saveProblemasCondicoes($soap); $acompanhamentoOci = null; if (!self::isRascunho()) { if (!$atendimento->is_demanda_espontanea && !is_null($soap->oci_id) && !request()->ultima_etapa_oci_realizada_mesmo_atendimento) { $acompanhamentoOci = self::saveAcompanhamentoOci($soap); } } if ($acompanhamentoOci || request()->acompanhamento_oci_id) { if (is_null($acompanhamentoOci) && !is_null(request()->acompanhamento_oci_id)) { $acompanhamentoOci = AcompanhamentoOci::findOrFail(request()->acompanhamento_oci_id); } $soap->update(['acompanhamento_oci_id' => $acompanhamentoOci->id]); } $procedimentosOci = is_null($acompanhamentoOci) ? collect() : $acompanhamentoOci->oci->procedimentosPrimarios()->pluck('procedimento_codigo') ->concat($acompanhamentoOci->oci->procedimentosSecundarios()->pluck('procedimento_codigo')); self::saveMedicoes($soap); self::saveFeridas($soap); self::saveMedicamentosEmUsoTratamentosInterrompidos($soap); self::saveAntecedentes($soap); self::saveAntropometria($soap); self::saveSinaisVitais($soap); self::saveGlicemiaCapilar($soap); self::saveTria($soap); self::saveMarcadoresConsumoAlimentar($soap); self::saveResultadosExames($soap); self::saveAlergiasReacoesAdversas($soap); self::savePrescricoesMedicamentos($soap); self::saveSolicitacaoExamesComuns($soap, $acompanhamentoOci, $procedimentosOci); self::saveSolicitacaoExamesAltoCusto($soap, $acompanhamentoOci, $procedimentosOci); self::saveSolicitacaoProcedimentosCirurgicos($soap); self::saveAtestados($soap); self::saveDeclaracoesComparecimento($soap); self::saveEncaminhamentos($soap); self::saveProcedimentos($soap, $acompanhamentoOci, $procedimentosOci); self::saveRaas($soap); self::saveFinalizacao($soap); self::saveIvcf($soap); self::saveTempoAtendimento($soap); if(!empty(request()->risco_cardiovascular_framingham['pontuacao'])){ self::saveRiscoCardiovascularFramingham($soap); } if ($atendimento->demanda_espontanea_id) { $demandaEspontanea = DemandaEspontanea::find($atendimento->demanda_espontanea_id); if ($demandaEspontanea && is_null($demandaEspontanea->usuario_id)) { $lotacaoSoap = $soap->createdLotacao; if ($lotacaoSoap) { $jornada = Jornada::where('lotacao_id', $lotacaoSoap->id) ->whereDate('data', $soap->created_at) ->first(); $demandaEspontanea->update([ 'usuario_id' => $lotacaoSoap->usuario_id, 'ocupacao_id' => $lotacaoSoap->ocupacao_id, 'especialidade_id' => $jornada->especialidade_id ?? null, ]); } } } if (!self::isRascunho()) { $atendimento->update(['atendimento_tipo_id' => request()->finalizacao['atendimento_tipo_id']]); if ($soap->pos_consulta) { $soap->atendimento()->update(['pos_consulta' => $soap->pos_consulta]); } try { SoapAtencaoBasicaFichaService::store($soap, [ 'marcador_consumo_alimentar' => request()->objetivo['marcador_consumo_alimentar'], 'exame_avaliado' => request()->objetivo['exame_avaliado'], 'exame_solicitado' => request()->plano['exame_solicitado'], 'orientacao_individual_em_saude' => request()->plano['orientacao_individual_em_saude'], 'triagem_neonatal' => request()->objetivo['triagem_neonatal'], 'triagem_neonatal_solicitado' => request()->plano['triagem_neonatal'], 'condicoes_emad' => request()->avaliacao['condicoes_emad'], 'procedimentos_emad' => request()->plano['procedimentos_emad'], 'problemas_condicoes' => request()->avaliacao['problemas_condicoes'], 'condicoes_avaliadas' => request()->avaliacao['condicoes_avaliadas'], 'doencas_transmissiveis' => request()->avaliacao['doencas_transmissiveis'], 'rastreamentos' => request()->avaliacao['rastreamentos'], 'emad_conclusao_justificativa' => request()->finalizacao['emad_conclusao_justificativa'], 'ficha_avaliacao' => request()->finalizacao['ficha_avaliacao'], ]); } catch (Exception $e) { throw new NaoPodeCriarFichaAtencaoBasicaException(); } if (!is_null($fila)) { if (request()->finalizacao['desfecho']['centro_custo_encaminhamento_id']) { FilaService::forward($fila->id, request()->finalizacao['desfecho']['centro_custo_encaminhamento_id']); } else { FilaService::dispatch($fila->centro_custo_id); } } } return $soap->fresh(); }); return [ 'atendimentoId' => $atendimento->id, 'id' => $soap->id, ]; } private static function saveTempoAtendimento($soap){ $soap->update([ 'tempo_atendimento' => request()->tempo_atendimento ]); } private static function deleteSoapRascunho($atendimento) { $soapRascunho = $atendimento->soaps()->where('is_atendimento_enfermagem', false)->where('is_rascunho', true)->first(); if (is_null($soapRascunho)) { return; } $solicitacoes = RegulacaoSolicitacao::where('soap_id', $soapRascunho->id)->get(); $soapRascunho->prescricaoMedicamentoTratamentosInterrompidos->each(function ($prescricaoItem) { $prescricaoItem->update([ 'tratamento_interrompido_from_rascunho' => false, 'tratamento_interrompido_em' => null, 'tratamento_interrompido_justificativa' => null, 'tratamento_interrompido_soap_id' => null, ]); }); foreach ($solicitacoes as $solicitacao) { $solicitacao->delete(); } $solicitacoesSoap = AtendimentoSoapSolicitacaoExame::where('soap_id', $soapRascunho->id)->get(); foreach ($solicitacoesSoap as $solicitacao) { $itens = AtendimentoSoapSolicitacaoExameItem::where( 'solicitacao_exame_id', $solicitacao->id )->get(); foreach ($itens as $item) { AgendamentoExame::where('soap_solicitacao_exame_item_id', $item->id)->delete(); AgendamentoExameImagem::where('soap_solicitacao_exame_item_id', $item->id)->delete(); $item->delete(); } $solicitacao->delete(); } $soapRascunho->delete(); } private static function saveAcompanhamentoOci($soap) { $acompanhamentoOci = AcompanhamentoOci::where('oci_id', $soap->oci_id) ->where('paciente_id', $soap->atendimento->paciente->id) ->where('ocupacao_id', $soap->atendimento->ocupacao->id) ->whereNull('finalizado_em') ->first(); if (is_null($acompanhamentoOci)) { if ($soap->oci->etapasClinicas()->where('id', EtapaClinicaEnum::ENTRADA_ALTA)->exists()) { $acompanhamentoOci = AcompanhamentoOci::create([ 'paciente_id' => $soap->atendimento->paciente->id, 'ocupacao_id' => $soap->atendimento->ocupacao->id, 'oci_id' => $soap->oci_id, 'etapa_clinica_atual_id' => EtapaClinicaEnum::ALTA, 'status_id' => AcompanhamentoOciStatus::ENCERRADO_AUTOMATICAMENTE, 'iniciado_em' => Carbon::now(), 'iniciado_lotacao_id' => self::getCurrentLotacao()->id, 'finalizado_em' => Carbon::now(), 'finalizado_lotacao_id' => self::getCurrentLotacao()->id, 'motivo_saida_permanencia_id' => $soap->apac_motivo_saida_permanencia_id, ]); $acompanhamentoOci->etapasClinicasConcluidas()->create([ 'etapa_clinica_id' => EtapaClinicaEnum::ENTRADA, 'soap_id' => $soap->id, ]); $acompanhamentoOci->etapasClinicasConcluidas()->create([ 'etapa_clinica_id' => EtapaClinicaEnum::ALTA, 'soap_id' => $soap->id, ]); self::saveProcedimentoOci($soap, $acompanhamentoOci); } else { $acompanhamentoOci = AcompanhamentoOci::create([ 'paciente_id' => $soap->atendimento->paciente->id, 'ocupacao_id' => $soap->atendimento->ocupacao->id, 'oci_id' => $soap->oci_id, 'etapa_clinica_atual_id' => EtapaClinicaEnum::RETORNO, 'status_id' => AcompanhamentoOciStatus::EM_ANDAMENTO, 'iniciado_em' => Carbon::now(), 'iniciado_lotacao_id' => self::getCurrentLotacao()->id ]); $acompanhamentoOci->etapasClinicasConcluidas()->create([ 'etapa_clinica_id' => EtapaClinicaEnum::ENTRADA, 'soap_id' => $soap->id, ]); } } else { $params = [ 'etapa_clinica_atual_id' => $soap->oci_desfecho_etapa_clinica_id, ]; $acompanhamentoOci->etapasClinicasConcluidas()->create([ 'etapa_clinica_id' => $acompanhamentoOci->etapa_clinica_atual_id, 'soap_id' => $soap->id, ]); if ($soap->oci_desfecho_etapa_clinica_id === EtapaClinicaEnum::ALTA) { $params['finalizado_em'] = Carbon::now(); $params['finalizado_lotacao_id'] = self::getCurrentLotacao()->id; $params['status_id'] = AcompanhamentoOciStatus::ENCERRADO_AUTOMATICAMENTE; $params['motivo_saida_permanencia_id'] = $soap->apac_motivo_saida_permanencia_id; $acompanhamentoOci->etapasClinicasConcluidas()->create([ 'etapa_clinica_id' => EtapaClinicaEnum::ALTA, 'soap_id' => $soap->id, ]); if (Carbon::now() <= self::getPrazoValidadeOci($acompanhamentoOci)) { self::saveProcedimentoOci($soap, $acompanhamentoOci); } } $acompanhamentoOci->update($params); } foreach (request()->oci_procedimentos_realizados_previamente as $procedimento) { $acompanhamentoOci->procedimentosRealizados()->create([ 'soap_id' => $soap->id, 'procedimento_id' => $procedimento['id'], 'data_executada' => is_null($procedimento['data_executada']) ? null : Carbon::createFromFormat('d/m/Y', $procedimento['data_executada']), 'unidade_executora_id' => $procedimento['unidade_executora_id'], 'ocupacao_executora_id' => $procedimento['ocupacao_executora_id'], 'usuario_executor_nome' => $procedimento['usuario_executor'], ]); } return $acompanhamentoOci; } private static function saveProcedimentoOci($soap, $acompanhamentoOci) { $cidsOci = self::getCidsOci($acompanhamentoOci->oci); $soapEntrada = $acompanhamentoOci->etapasClinicasConcluidas() ->where('etapa_clinica_id', EtapaClinicaEnum::ENTRADA) ->first() ->soap; $problemaCondicao = $soapEntrada->problemasCondicoes() ->whereHas('cid', fn ($q) => $q->whereIn('id', $cidsOci)) ->first(); $atendimentoProcedimento = $soap->procedimentos() ->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $acompanhamentoOci->oci->procedimento->id, 'cid_id' => $problemaCondicao->cid_id, 'quantidade' => 1, 'automatico' => true, 'ocupacao_id' => $soap->atendimento->ocupacao->id, 'especialidade_id' => $soap->atendimento->especialidade->id, 'usuario_id' => $soap->atendimento->usuario->id, ]); $soap->procedimentosAdministrativos() ->create(['atendimento_procedimento_id' => $atendimentoProcedimento->id]); } private static function getPrazoValidadeOci($acompanhamentoOci) { return $acompanhamentoOci->iniciado_em->copy()->addMonth()->endOfMonth()->endOfDay(); } private static function prepareStoreRegulacao($data, $soap) { $unidadeSolicitanteId = DB::table('regulacao_parametrizacao_solicitante') ->where('infraestrutura_id', self::getCurrentCentroCusto()->infraestrutura_id) ->value('id'); if ($unidadeSolicitanteId) { $solicitanteRegulador = DB::table('regulacao_parametrizacao_solicitante_regulador') ->where('solicitante_id', $unidadeSolicitanteId) ->pluck('regulador_id', 'id') ->toArray(); } if ($data['origem'] == 'especialidade') { foreach($data['solicitacoes'] as $solicitacao) { if (!empty($solicitanteRegulador)) { $solicitanteEspecialidade = DB::table('regulacao_parametrizacao_solicitante_regulador_especialidade') ->whereIn('solicitante_regulador_id', array_keys($solicitanteRegulador)) ->where('especialidade_id', $solicitacao['procedimentos'][0]['id']) ->first(); $regulador = DB::table('regulacao_parametrizacao_regulador_especialidade') ->where('especialidade_id', $solicitacao['procedimentos'][0]['id']) ->where('ativo', true) ->whereIn('regulador_id', $solicitanteRegulador) ->first(); $reguladorId = $regulador->regulador_id ?? null; $solicitacao['regulador_id'] = $reguladorId; if (!is_null($reguladorId) && !is_null($solicitanteEspecialidade)) { self::storeRegulacao($solicitacao, $soap); } } } } if ($data['origem'] == 'exame_imagem') { $solicitacaoRegulada =[]; foreach($data['solicitacoes'] as $solicitacao) { foreach($solicitacao['procedimentos'] as $procedimento) { if (!empty($solicitanteRegulador)) { $solicitanteExameImagem = DB::table('regulacao_parametrizacao_solicitante_regulador_exame') ->whereIn('solicitante_regulador_id', array_keys($solicitanteRegulador)) ->where('exame_id', $procedimento['id']) ->first(); $regulador = DB::table('regulacao_parametrizacao_regulador_exame') ->where('exame_id', $procedimento['id']) ->where('ativo', true) ->whereIn('regulador_id', $solicitanteRegulador) ->first(); $reguladorId = $regulador->regulador_id ?? null; if(!is_null($reguladorId) && !is_null($solicitanteExameImagem)) { $solicitacaoRegulada[] = [ 'regulador_id' => $reguladorId, 'cid_id' => $solicitacao['cid_id'], 'ciap_id' => $solicitacao['ciap_id'] ?? null, 'observacao' => $solicitacao['observacao'], 'hipotese_diagnostica_justificativa' => $solicitacao['hipotese_diagnostica_justificativa'], 'prioridade_id' => $solicitacao['prioridade_id'], 'acompanhamento_oci_id' => $solicitacao['acompanhamento_oci_id'], 'procedimentos' => [$procedimento] ]; } } } } if(count($solicitacaoRegulada) > 0) { foreach($solicitacaoRegulada as $solicitacao) { self::storeRegulacao($solicitacao, $soap); } } } if ($data['origem'] == 'exame_laboratorio') { foreach($data['solicitacoes'] as $solicitacao) { $solicitacoesPorReguladorTipo = []; foreach ($solicitacao['procedimentos'] as $procedimento) { if (!empty($solicitanteRegulador)) { $solicitanteExameLaboratorial = DB::table('regulacao_parametrizacao_solicitante_regulador_exame') ->whereIn('solicitante_regulador_id', array_keys($solicitanteRegulador)) ->where('exame_id', $procedimento['id']) ->first(); $regulador = DB::table('regulacao_parametrizacao_regulador_exame') ->where('exame_id', $procedimento['id']) ->where('ativo', true) ->whereIn('regulador_id', $solicitanteRegulador) ->first(); $reguladorId = $regulador->regulador_id ?? null; $regulacaoTipoId = Exame::where('id', $procedimento['id']) ->first() ->regulacao_tipo_id; if (!is_null($reguladorId) && !is_null($solicitanteExameLaboratorial)) { $key = $reguladorId . '_' . $regulacaoTipoId; if (!isset($solicitacoesPorReguladorTipo[$key])) { $solicitacoesPorReguladorTipo[$key] = [ 'regulador_id' => $reguladorId, 'regulacao_tipo_id' => $regulacaoTipoId, 'cid_id' => $solicitacao['cid_id'], 'ciap_id' => $solicitacao['ciap_id'] ?? null, 'observacao' => $solicitacao['observacao'], 'hipotese_diagnostica_justificativa' => $solicitacao['hipotese_diagnostica_justificativa'], 'prioridade_id' => $solicitacao['prioridade_id'], 'acompanhamento_oci_id' => $solicitacao['acompanhamento_oci_id'], 'procedimentos' => [] ]; } $solicitacoesPorReguladorTipo[$key]['procedimentos'][] = $procedimento; } } } foreach ($solicitacoesPorReguladorTipo as $solicitacaoDividida) { self::storeRegulacao($solicitacaoDividida, $soap); } } } } private static function storeRegulacao($solicitacaoTratada, $soap) { if (self::isRascunho()) { return; } $solicitacao = new RegulacaoSolicitacao(); $checkAutomatico = RegulacaoParametrizacao::value('solicitacao_automatica_ambulatorio'); $statusId = Status::where('ativo', true)->where('tipo_id', RegulacaoStatusTipo::SOLICITADO)->first()->id ?? null; $solicitacaoTratadaProcedimentos = collect($solicitacaoTratada['procedimentos']); $solicitacaoTratadaProcedimentosFirst = $solicitacaoTratadaProcedimentos->first(); $getPrioridadeId = function ($classificacaoRiscoId) { switch ($classificacaoRiscoId) { case ClassificacaoRiscoEnum::ALTA: { return SolicitacaoPrioridadeEnum::EMERGENCIA; } case ClassificacaoRiscoEnum::INTERMEDIARIA: { return SolicitacaoPrioridadeEnum::URGENCIA; } case ClassificacaoRiscoEnum::BAIXA: { return SolicitacaoPrioridadeEnum::PRIORITARIO; } default: { return SolicitacaoPrioridadeEnum::ELETIVO; } } }; $regulacaoPrioridadeId = $getPrioridadeId($solicitacaoTratada['prioridade_id']); $solicitacaoItemData = (object) [ 'origem' => $solicitacaoTratadaProcedimentosFirst['origem'], 'exame_id' => $solicitacaoTratadaProcedimentosFirst['origem'] === 'exame' ? $solicitacaoTratadaProcedimentosFirst['id'] : null, 'especialidade_id' => $solicitacaoTratadaProcedimentosFirst['origem'] === 'especialidade' ? $solicitacaoTratadaProcedimentosFirst['id'] : null, ]; $posicoes = RegulacaoSolicitacaoService::getProximasPosicoes( $regulacaoPrioridadeId, $solicitacaoTratada['regulador_id'], $solicitacaoItemData ); $posicaoPortal = RegulacaoSolicitacaoService::getProximaPosicaoPortal( $regulacaoPrioridadeId, $solicitacaoItemData ); $solicitacao->fill([ 'numero' => RegulacaoSolicitacaoService::getNovoNumeroSolicitacao(), 'posicao_municipal' => $posicoes->posicao_municipal, 'posicao_regulador' => $posicoes->posicao_regulador, 'posicao_portal' => $posicaoPortal, 'data' => Carbon::today(), 'paciente_id' => $soap->atendimento->agendamento->paciente->id ?? $soap->atendimento->demandaEspontanea->paciente->id, 'status_id' => $statusId, 'infraestrutura_solicitante_id' => self::getCurrentCentroCusto()->infraestrutura_id, 'usuario_solicitante_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, 'usuario_solicitante_especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'data_desejada' => null, 'confirmado_em' => $checkAutomatico ? Carbon::now() : null, 'confirmado_lotacao_id' => $checkAutomatico ? self::getCurrentLotacao()->id : null, 'prioridade_id' => $regulacaoPrioridadeId, 'cid_id' => $solicitacaoTratada['cid_id'], 'ciap_id' => $solicitacaoTratada['ciap_id'] ?? null, 'hipotese_diagnostica_justificativa' => $solicitacaoTratada['hipotese_diagnostica_justificativa'], 'observacao' => $solicitacaoTratada['observacao'], 'peso' => $soap->objetivoAntropometria->atendimentoAntropometria->peso ?? null, 'altura' => $soap->objetivoAntropometria->atendimentoAntropometria->altura ?? null, 'regulador_id' => $solicitacaoTratada['regulador_id'], 'acompanhamento_oci_id' => $solicitacaoTratada['acompanhamento_oci_id'] ?? null, 'soap_id' => $soap->id, 'unidade_usuario_id' => self::getCurrentCentroCusto()->infraestrutura->unidade_id, 'infraestrutura_usuario_id' => self::getCurrentCentroCusto()->infraestrutura_id, 'ocupacao_usuario_id' => self::getCurrentLotacao()->ocupacao_id, 'lotaca_usuario_id' => self::getCurrentLotacao()->id, ]); $solicitacao->save(); $solicitacaoTratadaProcedimentos->each(function ($procedimento) use ($solicitacao) { $solicitacao->itens()->create([ 'exame_id' => $procedimento['origem'] === 'exame' ? $procedimento['id'] : null, 'procedimento_cirurgico_id' => null, 'especialidade_id' => $procedimento['origem'] === 'especialidade' ? $procedimento['id'] : null, 'soap_solicitacao_item_id' => $procedimento['solicitacao_item_id'] ?? null, 'faz_parte_oci' => $procedimento['faz_parte_oci'] ?? false, ]); }); RegulacaoSolicitacaoService::saveHistorico($solicitacao); } private static function savePaciente($atendimento) { if (!is_null(request()->paciente['telefone_principal']['id']) && request()->paciente['telefone_principal']['atualizado']) { CidadaoTelefone::find(request()->paciente['telefone_principal']['id']) ->update(request()->paciente['telefone_principal']); } if (!is_null(request()->objetivo['dum'])) { $atendimento->paciente->dum()->updateOrCreate( ['paciente_id' => $atendimento->paciente->id], ['data_ultima_menstruacao' => Carbon::createFromFormat('d/m/Y', request()->objetivo['dum'])] ); if (self::isAtendimentoPreNatal() && !$atendimento->paciente->cidadao->fatoresRisco->contains(FatorRiscoEnum::GESTANTE)) { $atendimento->paciente->cidadao->fatoresRisco()->attach(FatorRiscoEnum::GESTANTE); } } } private static function getSoapParams($atendimento) { $params = [ 'is_rascunho' => request()->is_rascunho, 'atendimento_id' => $atendimento->id, 'equipe_id' => request()->finalizacao['equipe_id'], 'atencao_basica_local_atendimento_id' => request()->finalizacao['atencao_basica_local_atendimento_id'], 'turno_id' => request()->finalizacao['turno_id'], 'subjetivo_descricao' => request()->subjetivo['descricao'], 'objetivo_descricao' => request()->objetivo['descricao'], 'dum' => is_null(request()->objetivo['dum']) ? null : Carbon::createFromFormat('d/m/Y', request()->objetivo['dum']), 'vacinacao_em_dia' => request()->objetivo['vacinacao_em_dia'], 'avaliacao_descricao' => request()->avaliacao['descricao'], 'plano_descricao' => request()->plano['descricao'], 'orientacao_individual_em_saude' => request()->plano['orientacao_individual_em_saude'], 'atendimento_tipo_id' => request()->finalizacao['atendimento_tipo_id'], 'emad_tipo_atendimento_id' => request()->finalizacao['emad_tipo_atendimento_id'], 'emad_modalidade_id' => request()->finalizacao['emad_modalidade_id'], 'emad_conduta_desfecho_id' => request()->finalizacao['emad_conduta_desfecho_id'], 'emad_cid_primario_id' => request()->finalizacao['emad_cid_primario_id'], 'emad_conclusao_id' => request()->finalizacao['emad_conclusao_id'], 'emad_cuidador_id' => request()->finalizacao['emad_cuidador_id'], 'emad_cns_cuidador' => str_replace(' ', '', request()->finalizacao['emad_cns_cuidador']), 'emad_cpf_cuidador' => str_replace([' ', '.', '-'], '', request()->finalizacao['emad_cpf_cuidador']), 'emad_procedencia_id' => request()->finalizacao['emad_procedencia_id'], 'atendimento_compartilhado_usuario_id' => request()->finalizacao['atendimento_compartilhado_usuario_id'], 'racionalidade_saude_id' => request()->finalizacao['racionalidade_saude_id'], 'paciente_liberado' => request()->finalizacao['desfecho']['finalizado'], 'is_tratamento_concluido' => request()->finalizacao['is_tratamento_concluido'], 'pos_consulta' => is_null(request()->finalizacao['desfecho']['centro_custo_encaminhamento_id']) || CentroCusto::findOrFail(request()->finalizacao['desfecho']['centro_custo_encaminhamento_id'])->setor->tipo_id !== SetorTipo::ENFERMAGEM ? null : request()->finalizacao['desfecho']['pos_consulta'], 'observacao_perfil_epidemiologico' => request()->observacao_perfil_epidemiologico, ]; if (!$atendimento->is_demanda_espontanea && request()->oci_id) { $params['oci_id'] = request()->oci_id; $params['oci_desfecho_etapa_clinica_id'] = request()->finalizacao['oci_desfecho_etapa_clinica_id']; $params['apac_motivo_saida_permanencia_id'] = request()->finalizacao['apac_motivo_saida_permanencia_id']; } self::setParamsPreNatal($atendimento->paciente, $params); if (!is_null($atendimento->paciente->cidadao->idade) && $atendimento->paciente->cidadao->idade['anos'] >= self::IDADE_ANOS_INICIAL_IDOSO ) { $params['is_atendimento_idoso'] = true; } if (request()->objetivo['is_atendimento_puericultura']) { $params['is_atendimento_puericultura'] = true; self::setParamsPuericultura($params); } if (self::isProfissionalSaudeBucal()) { $params['is_atendimento_saude_bucal'] = true; self::setParamsSaudeBucal($params); } return $params; } private static function setParamsPreNatal($paciente, &$params) { if (self::isAtendimentoPreNatal()) { if (self::isPrimeiroAtendimentoPreNatal($paciente)) { $params['pre_natal_gravidez_tipo_id'] = request()->avaliacao['pre_natal']['gravidez_tipo_id']; $params['pre_natal_altura_uterina'] = request()->avaliacao['pre_natal']['altura_uterina']; $params['pre_natal_edema_id'] = request()->avaliacao['pre_natal']['edema_id']; $params['pre_natal_movimentacao_fetal'] = request()->avaliacao['pre_natal']['movimentacao_fetal']; $params['pre_natal_gravidez_planejada'] = request()->avaliacao['pre_natal']['gravidez_planejada']; $params['pre_natal_batimento_cardiaco_fetal'] = request()->avaliacao['pre_natal']['batimento_cardiaco_fetal']; } else { $params['pre_natal_gravidez_tipo_id'] = request()->objetivo['pre_natal']['gravidez_tipo_id']; $params['pre_natal_altura_uterina'] = request()->objetivo['pre_natal']['altura_uterina']; $params['pre_natal_edema_id'] = request()->objetivo['pre_natal']['edema_id']; $params['pre_natal_movimentacao_fetal'] = request()->objetivo['pre_natal']['movimentacao_fetal']; $params['pre_natal_gravidez_planejada'] = request()->objetivo['pre_natal']['gravidez_planejada']; $params['pre_natal_batimento_cardiaco_fetal'] = request()->objetivo['pre_natal']['batimento_cardiaco_fetal']; } $params['is_atendimento_pre_natal'] = true; } else if (self::hasDesfechoGravidez()) { $params['pre_natal_gravidez_tipo_id'] = request()->avaliacao['pre_natal']['gravidez_tipo_id']; $params['pre_natal_desfecho_em'] = Carbon::createFromFormat( 'd/m/Y', request()->avaliacao['pre_natal']['desfecho_em'] ); } } private static function isAtendimentoPreNatal() { $ciaps = collect(array_merge( self::CIAPS_GRAVIDEZ_NORMAL, self::CIAPS_GRAVIDEZ_ALTO_RISCO, )); $cids = collect(array_merge( self::CIDS_GRAVIDEZ_NORMAL, self::CIDS_GRAVIDEZ_ALTO_RISCO, )); foreach (request()->avaliacao['problemas_condicoes'] as $problemaCondicao) { $ciap = Ciap::find($problemaCondicao['ciap_id']); $cid = Cid::find($problemaCondicao['cid_id']); if (($ciaps->contains($ciap->codigo ?? null) || $cids->contains($cid->codigo ?? null)) && $problemaCondicao['situacao_id'] != ProblemaCondicaoSituacaoEnum::RESOLVIDO ) { return true; } } return false; } private static function isPrimeiroAtendimentoPreNatal($paciente) { return is_null(self::getUltimoSoapPreNatalNaoResolvido($paciente)); } private static function hasDesfechoGravidez() { $ciaps = collect(self::CIAPS_DESFECHO_GRAVIDEZ); $cids = collect(self::CIDS_DESFECHO_GRAVIDEZ); foreach (request()->avaliacao['problemas_condicoes'] as $problemaCondicao) { $ciap = Ciap::find($problemaCondicao['ciap_id']); $cid = Cid::find($problemaCondicao['cid_id']); if (($ciaps->contains($ciap->codigo ?? null) || $cids->contains($cid->codigo ?? null)) && is_null($problemaCondicao['id']) ) { return true; } } return false; } private static function setParamsPuericultura(&$params) { $params['puericultura_gravidez_tipo_id'] = request()->objetivo['puericultura']['gravidez_tipo_id']; $params['puericultura_parto_tipo_id'] = request()->objetivo['puericultura']['parto_tipo_id']; $params['puericultura_idade_gestacional_semanas'] = request()->objetivo['puericultura']['idade_gestacional_semanas']; $params['puericultura_idade_gestacional_dias'] = request()->objetivo['puericultura']['idade_gestacional_dias']; $params['puericultura_apgar_primeiro_minuto'] = request()->objetivo['puericultura']['apgar_primeiro_minuto']; $params['puericultura_apgar_quinto_minuto'] = request()->objetivo['puericultura']['apgar_quinto_minuto']; $params['puericultura_apgar_decimo_minuto'] = request()->objetivo['puericultura']['apgar_decimo_minuto']; $params['puericultura_peso'] = request()->objetivo['puericultura']['peso']; $params['puericultura_comprimento'] = request()->objetivo['puericultura']['comprimento']; $params['puericultura_perimetro_cefalico'] = request()->objetivo['puericultura']['perimetro_cefalico']; $params['puericultura_aleitamento_tipo_id'] = request()->objetivo['puericultura']['aleitamento_tipo_id']; } private static function setParamsSaudeBucal(&$params) { $params['paciente_com_necessidade_especial'] = request()->objetivo['paciente_com_necessidade_especial']; $params['saude_bucal_necessidade_protese_inferior_superior'] = request()->avaliacao['saude_bucal']['necessidade_protese_inferior_superior']; $params['saude_bucal_consulta_tipo_id'] = request()->finalizacao['saude_bucal']['consulta_tipo_id']; } private static function saveTestesRapidos($soap) { $testesRapidos = []; foreach (request()->plano['testes_rapidos'] as $testeRapido) { $testesRapidos[$testeRapido['id']] = [ 'resultado' => $testeRapido['resultado'] ]; } $soap->testesRapidos()->sync($testesRapidos); } private static function saveExamesAvaliados($soap) { $examesAvaliados = []; foreach (request()->objetivo['exame_avaliado'] as $exameAvaliado) { $examesAvaliados[$exameAvaliado['id']] = [ 'resultado' => $exameAvaliado['resultado'] ]; if (isset($exameAvaliado['solicitado_em'])) { $examesAvaliados[$exameAvaliado['id']]['solicitado_em'] = Carbon::createFromFormat('d/m/Y', $exameAvaliado['solicitado_em']); } if (isset($exameAvaliado['realizado_em'])) { $examesAvaliados[$exameAvaliado['id']]['realizado_em'] = Carbon::createFromFormat('d/m/Y', $exameAvaliado['realizado_em']); } if (isset($exameAvaliado['resultado_em'])) { $examesAvaliados[$exameAvaliado['id']]['resultado_em'] = Carbon::createFromFormat('d/m/Y', $exameAvaliado['resultado_em']); } } $soap->examesAvaliados()->sync($examesAvaliados); } private static function saveExamesSolicitados($soap) { if (!empty(request()->plano['exame_solicitado']['exames'])) { $examesSolicitados = []; $atendimentoSoapExameSolicitado = $soap->atendimentoSoapExameSolicitado()->create([ 'cid_id' => request()->plano['exame_solicitado']['cid_id'], 'ciap_id' => request()->plano['exame_solicitado']['ciap_id'], 'justificativa' => request()->plano['exame_solicitado']['justificativa'], 'observacao' => request()->plano['exame_solicitado']['observacao'], ]); foreach (request()->plano['exame_solicitado']['exames'] as $exameSolicitado) { $examesSolicitados[] = [ 'exame_solicitado_avaliado_id' => $exameSolicitado['exame_id'], 'soap_exame_solicitado_id' => $atendimentoSoapExameSolicitado->id, ]; } $soap->atendimentoSoapExameSolicitado->examesSolicitados()->sync($examesSolicitados); } } private static function saveTriagensNeonatalSolicitados($soap) { if (!empty(request()->plano['triagem_neonatal']['exames'])) { $examesSolicitados = []; $atendimentoSoapExameSolicitado = $soap->atendimentoSoapTriagemNeonatalSolicitado()->create([ 'cid_id' => request()->plano['triagem_neonatal']['cid_id'], 'ciap_id' => request()->plano['triagem_neonatal']['ciap_id'], 'justificativa' => request()->plano['triagem_neonatal']['justificativa'], 'observacao' => request()->plano['triagem_neonatal']['observacao'], ]); foreach (request()->plano['triagem_neonatal']['exames'] as $exameSolicitado) { $examesSolicitados[] = [ 'triagem_neonatal_id' => $exameSolicitado['exame_id'], 'soap_triagem_neonatal_id' => $atendimentoSoapExameSolicitado->id, ]; } $soap->atendimentoSoapTriagemNeonatalSolicitado->triagensNeonatalSolicitados()->sync($examesSolicitados); } } private static function saveTriagemNeonatal($soap) { $triagensNeonatal = []; foreach (request()->objetivo['triagem_neonatal'] as $triagemNeonatal) { $triagensNeonatal[$triagemNeonatal['id']] = [ 'resultado' => $triagemNeonatal['resultado'] ]; if (isset($triagemNeonatal['solicitado_em'])) { $triagensNeonatal[$triagemNeonatal['id']]['solicitado_em'] = Carbon::createFromFormat('d/m/Y', $triagemNeonatal['solicitado_em']); } if (isset($triagemNeonatal['realizado_em'])) { $triagensNeonatal[$triagemNeonatal['id']]['realizado_em'] = Carbon::createFromFormat('d/m/Y', $triagemNeonatal['realizado_em']); } if (isset($triagemNeonatal['resultado_em'])) { $triagensNeonatal[$triagemNeonatal['id']]['resultado_em'] = Carbon::createFromFormat('d/m/Y', $triagemNeonatal['resultado_em']); } } $soap->triagensNeonatal()->sync($triagensNeonatal); } private static function saveOciProcedimentosRealizados($soap) { foreach (request()->oci_procedimentos_realizados_previamente as $procedimento) { $soap->ociProcedimentosRealizados()->create([ 'procedimento_id' => $procedimento['id'], 'data_executada' => is_null($procedimento['data_executada']) ? null : Carbon::createFromFormat('d/m/Y', $procedimento['data_executada']), 'unidade_executora_id' => $procedimento['unidade_executora_id'], 'ocupacao_executora_id' => $procedimento['ocupacao_executora_id'], 'usuario_executor_nome' => $procedimento['usuario_executor'], ]); } } private static function savePuericulturaAlteracoesFenotipicas($soap) { $alteracoesFenotipicas = collect(request()->objetivo['puericultura']['alteracoes_fenotipicas']) ->filter(fn ($alteracao) => !is_null($alteracao['is_presente'])) ->map(fn ($alteracao) => [ 'alteracao_fenotipica_id' => $alteracao['id'], 'is_presente' => $alteracao['is_presente'], ]); $soap->puericulturaAlteracoesFenotipicas()->createMany($alteracoesFenotipicas); } private static function savePuericulturaFatoresRisco($soap) { $fatoresRisco = collect(request()->objetivo['puericultura']['fatores_risco']) ->filter(fn ($fator) => !is_null($fator['is_presente'])) ->map(fn ($fator) => [ 'fator_risco_id' => $fator['id'], 'is_presente' => $fator['is_presente'], ]); $soap->puericulturaFatoresRisco()->createMany($fatoresRisco); } private static function savePuericulturaMarcosDesenvolvimento($soap) { $marcosDesenvolvimento = collect(request()->objetivo['puericultura']['marcos_desenvolvimento']) ->filter(fn ($marco) => !is_null($marco['is_presente'])) ->map(fn ($marco) => [ 'marco_desenvolvimento_id' => $marco['id'], 'is_presente' => $marco['is_presente'], 'alcancado_com_anos' => $marco['alcancado_com_anos'], 'alcancado_com_meses' => $marco['alcancado_com_meses'], ]); $soap->puericulturaMarcosDesenvolvimento() ->createMany($marcosDesenvolvimento); } private static function saveOdontograma($soap) { $odontograma = $soap->odontograma()->create([ 'possui_aparelho' => request()->plano['saude_bucal']['odontograma']['possui_aparelho'], 'possui_contencao' => request()->plano['saude_bucal']['odontograma']['possui_contencao'], ]); self::saveOdontogramaArcada( $odontograma, ArcadaDentaria::SUPERIOR, request()->plano['saude_bucal']['odontograma']['arcadas']['superior'] ); self::saveOdontogramaArcada( $odontograma, ArcadaDentaria::INFERIOR, request()->plano['saude_bucal']['odontograma']['arcadas']['inferior'] ); self::saveOdontogramaDentesSupranumerarios($odontograma); } private static function saveOdontogramaArcada($odontograma, $arcadaId, $params) { $odontogramaArcada = $odontograma->odontogramaArcadas()->create([ 'arcada_id' => $arcadaId, 'possui_protese_total' => $params['possui_protese_total'], 'observacao' => $params['observacao'], ]); self::saveOdontogramaArcadaProcedimentos($odontogramaArcada, $params['procedimentos']); self::saveOdontogramaArcadaDentes($odontogramaArcada, $params['dentes']); } private static function saveOdontogramaArcadaProcedimentos($odontogramaArcada, $procedimentosParams) { $soap = $odontogramaArcada->odontograma->soap; foreach ($procedimentosParams as $procedimentoParams) { $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimentoParams['procedimento_id'], 'cid_id' => $procedimentoParams['cid_id'], 'quantidade' => $procedimentoParams['quantidade'], 'automatico' => false, 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, ]); $odontogramaArcada->atendimentoProcedimentos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, ]); } } private static function saveOdontogramaArcadaDentes($odontogramaArcada, $dentesParams) { foreach ($dentesParams as $denteParams) { $odontogramaArcadaDente = $odontogramaArcada->odontogramaArcadaDentes()->create([ 'dente_id' => $denteParams['dente_id'], 'is_fragmento_esquerda_tratado' => $denteParams['fragmentos']['esquerda']['is_tratado'], 'is_fragmento_cima_tratado' => $denteParams['fragmentos']['cima']['is_tratado'], 'is_fragmento_direita_tratado' => $denteParams['fragmentos']['direita']['is_tratado'], 'is_fragmento_baixo_tratado' => $denteParams['fragmentos']['baixo']['is_tratado'], 'is_fragmento_centro_tratado' => $denteParams['fragmentos']['centro']['is_tratado'], 'observacao' => $denteParams['observacao'], ]); if ($odontogramaArcada->possui_protese_total && !$odontogramaArcadaDente->dente->is_deciduo) { if (!self::isRascunho()) { $odontogramaArcadaDente->problemasCondicoes()->sync([SaudeBucalDenteProblemaCondicaoEnum::AUSENTE_A]); } } else { $odontogramaArcadaDente->problemasCondicoes()->sync($denteParams['problemas_condicoes']); } self::saveOdontogramaArcadaDentesProcedimentos($odontogramaArcadaDente, $denteParams['procedimentos']); } } private static function saveOdontogramaArcadaDentesProcedimentos($odontogramaArcadaDente, $procedimentosParams) { $soap = $odontogramaArcadaDente->odontogramaArcada->odontograma->soap; foreach ($procedimentosParams as $procedimentoParams) { $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimentoParams['procedimento_id'], 'cid_id' => $procedimentoParams['cid_id'], 'quantidade' => $procedimentoParams['quantidade'], 'automatico' => false, 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, ]); $odontogramaArcadaDente->atendimentoProcedimentos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, ]); } } private static function saveOdontogramaDentesSupranumerarios($odontograma) { foreach (request()->plano['saude_bucal']['odontograma']['dentes_supranumerarios'] as $denteParams) { $denteSupranumerario = $odontograma->dentesSupranumerarios()->create([ 'local' => $denteParams['local'], 'observacao' => $denteParams['observacao'], ]); self::saveOdontogramaDentesSupranumerariosProcedimentos($denteSupranumerario, $denteParams['procedimentos']); } } private static function saveOdontogramaDentesSupranumerariosProcedimentos($denteSupranumerario, $procedimentosParams) { $soap = $denteSupranumerario->odontograma->soap; foreach ($procedimentosParams as $procedimentoParams) { $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimentoParams['procedimento_id'], 'cid_id' => $procedimentoParams['cid_id'], 'quantidade' => $procedimentoParams['quantidade'], 'automatico' => false, 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, ]); $denteSupranumerario->atendimentoProcedimentos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, ]); } } private static function saveMedicoes($soap) { self::saveMedicoesAntropometria($soap); } private static function saveMedicoesAntropometria($soap) { foreach (request()->medicoes['antropometrias'] as $antropometria) { $antropometria['medido_em'] = Carbon::createFromFormat('d/m/Y', $antropometria['medido_em']); $soap->antropometrias()->create(array_merge([ 'atendimento_id' => $soap->atendimento_id, ], $antropometria)); } } private static function saveFeridas($soap) { foreach (request()->feridas as $ferida) { $ferida['data'] = Carbon::createFromFormat('d/m/Y', $ferida['data']); $dados = [ 'ferida_id' => $ferida['tipo_id'] ?? null, 'id_old' => $ferida['id'] ?? null, 'local_anatomico_id' => $ferida['local_anatomico_id'] ?? null, 'local_anatomico_regiao_id' => $ferida['local_anatomico_regiao_id'] ?? null, 'ferida_exsudato_id' => $ferida['exsudato_id'] ?? null, 'ferida_necrose' => $ferida['necrose_id'] ?? null, 'data' => $ferida['data'] ?? null, 'cicatrizada' => $ferida['cicatrizada'] ?? false, 'comprimento' => $ferida['comprimento'] ?? null, 'largura' => $ferida['largura'] ?? null, 'profundidade' => $ferida['profundidade'] ?? null, 'dor' => $ferida['dor'] ?? null, 'observacao' => $ferida['observacao'] ?? null, ]; if (is_numeric($ferida['id'] ?? null)) { $registro = AtendimentoSoapFerida::find($ferida['id']); if ($registro) { $registro->update($dados); if (isset($ferida['procedimentos']) && is_array($ferida['procedimentos'])) { foreach ($ferida['procedimentos'] as $procedimento) { if (isset($procedimento['id']) && is_numeric($procedimento['id'])) { $feridaProcedimento = $registro->procedimentos()->find($procedimento['id']); if ($feridaProcedimento) { $atendimentoProcedimento = $feridaProcedimento->atendimentoProcedimento; if ($atendimentoProcedimento) { $atendimentoProcedimento->update([ 'procedimento_id' => $procedimento['procedimento']['id'], 'cid_id' => $procedimento['cid']['id'] ?? null, 'quantidade' => $procedimento['quantidade'] ?? 1, ]); $soap->procedimentosClinicos() ->where('atendimento_procedimento_id', $atendimentoProcedimento->id) ->update([ 'observacao' => $procedimento['observacao'] ?? null, ]); } } } else { $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimento['procedimento']['id'], 'cid_id' => $procedimento['cid']['id'] ?? null, 'quantidade' => $procedimento['quantidade'] ?? 1, 'automatico' => false, 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, ]); $registro->procedimentos()->create([ 'soap_id' => $soap->id, 'atendimento_procedimento_id' => $atendimentoProcedimento->id, ]); $soap->procedimentosClinicos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, 'observacao' => $procedimento['observacao'] ?? null, ]); if (!empty($procedimento['procedimento']['materiais']) && is_array($procedimento['procedimento']['materiais'])) { foreach ($procedimento['procedimento']['materiais'] as $material) { if (!empty($material['id'])) { $itemData = [ 'material_id' => $material['id'], 'quantidade' => $material['quantidade'], 'escolheu_entrada_item_manualmente' => $material['material_escolheu_entrada_item_manualmente'] ?? false, 'entrada_itens' => $material['material_entrada_itens'] ?? [], ]; $saidaItem = AlmoxarifadoService::saveSaidaDeDispensacaoDoAmbulatorio($itemData); AtendimentoSoapFeridaMaterial::create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, 'material_id' => $material['id'], 'saida_item_id' => $saidaItem->id, ]); } } } } } } } } else { unset($dados['id']); $registro = $soap->feridas()->create($dados); foreach ($ferida['procedimentos'] as $procedimento) { $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimento['procedimento']['id'], 'cid_id' => $procedimento['cid']['id'] ?? null, 'quantidade' => $procedimento['quantidade'] ?? 1, 'automatico' => false, 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, ]); $registro->procedimentos()->create([ 'soap_id' => $soap->id, 'atendimento_procedimento_id' => $atendimentoProcedimento->id, ]); $soap->procedimentosClinicos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, 'observacao' => $procedimento['observacao'] ?? null, ]); if (!empty($procedimento['procedimento']['materiais']) && is_array($procedimento['procedimento']['materiais'])) { foreach ($procedimento['procedimento']['materiais'] as $material) { if (!empty($material['id'])) { $itemData = [ 'material_id' => $material['id'], 'quantidade' => $material['quantidade'], 'escolheu_entrada_item_manualmente' => $material['material_escolheu_entrada_item_manualmente'] ?? false, 'entrada_itens' => $material['material_entrada_itens'] ?? [], ]; $saidaItem = AlmoxarifadoService::saveSaidaDeDispensacaoDoAmbulatorio($itemData); DB::table('ambulatorio_atendimento_soap_ferida_material')->insert([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, 'material_id' => $material['id'], 'saida_item_id' => $saidaItem->id, 'created_at' => now(), 'updated_at' => now(), ]); } } } } } } } private static function saveMedicamentosEmUsoTratamentosInterrompidos($soap) { foreach (request()->medicamentos_em_uso['medicamentos_com_tratamento_interrompido'] as $item) { AtendimentoSoapPrescricaoMedicamentoItem::findOrFail($item['prescricao_medicamento_item_id']) ->update([ 'tratamento_interrompido_from_rascunho' => $soap->is_rascunho, 'tratamento_interrompido_em' => Carbon::now(), 'tratamento_interrompido_justificativa' => $item['justificativa'], 'tratamento_interrompido_soap_id' => $soap->id, ]); } } private static function saveAntecedentes($soap) { $antecedente = $soap->antecedente()->create([ 'descricao' => request()->antecedente['descricao'], 'descricao_familiar' => request()->antecedente['descricao_familiar'], 'gestas_previas' => request()->antecedente['gestas_previas'], 'abortos' => request()->antecedente['abortos'], 'desfecho_gestacao_aconteceu_menos_um_ano' => request()->antecedente['desfecho_gestacao_aconteceu_menos_um_ano'], 'partos_realizados' => request()->antecedente['partos_realizados'], 'partos_vaginais' => request()->antecedente['partos_vaginais'], 'partos_cesareas' => request()->antecedente['partos_cesareas'], 'partos_domiciliares' => request()->antecedente['partos_domiciliares'], 'nascidos_vivos' => request()->antecedente['nascidos_vivos'], 'nascidos_mortos' => request()->antecedente['nascidos_mortos'], 'recem_nascidos_com_menos2500_gramas' => request()->antecedente['recem_nascidos_com_menos2500_gramas'], 'recem_nascidos_com_mais4500_gramas' => request()->antecedente['recem_nascidos_com_mais4500_gramas'], 'nascidos_vivos_vivem' => request()->antecedente['nascidos_vivos_vivem'], 'nascidos_vivos_mortos_primeira_semana' => request()->antecedente['nascidos_vivos_mortos_primeira_semana'], 'nascidos_vivos_mortos_depois_primeira_semana' => request()->antecedente['nascidos_vivos_mortos_depois_primeira_semana'], ]); foreach (request()->antecedente['problemas_condicoes'] as $problemaCondicao) { if (!is_null($problemaCondicao['inicio'])) { $problemaCondicao['inicio'] = Carbon::createFromFormat('d/m/Y', $problemaCondicao['inicio']); } if (!is_null($problemaCondicao['fim'])) { $problemaCondicao['fim'] = Carbon::createFromFormat('d/m/Y', $problemaCondicao['fim']); } $antecedente->problemasCondicoes()->create($problemaCondicao); } foreach (request()->antecedente['cirurgias_internacoes'] as $cirurgiaInternacao) { if (!is_null($cirurgiaInternacao['realizada_em'])) { $cirurgiaInternacao['realizada_em'] = Carbon::createFromFormat( 'd/m/Y', $cirurgiaInternacao['realizada_em'] ); } $antecedente->cirurgiasInternacoes()->create($cirurgiaInternacao); } $antecedente->problemasFamiliares()->createMany(request()->antecedente['problemas_familiares']); } private static function saveAntropometria($soap) { $payload = (array) (request()->objetivo['antropometria'] ?? []); if (empty($payload)) { return; } $medidoEm = $payload['medido_em'] ?? now()->toDateString(); $payload['medido_em'] = $medidoEm; $camposPermitidos = [ 'medido_em', 'peso', 'altura', 'perimetro_cefalico', 'circunferencia_abdominal', 'perimetro_panturrilha', 'comprimento_pe_direito', 'largura_pe_direito', 'circunferencia_pe_direito', 'comprimento_pe_esquerdo', 'largura_pe_esquerdo', 'circunferencia_pe_esquerdo', ]; $dados = ['atendimento_id' => $soap->atendimento_id]; foreach($camposPermitidos as $campo) { if (array_key_exists($campo, $payload)) { $dados[$campo] = $payload[$campo]; } } $antropometria = $soap->antropometrias() ->where('medido_em', $medidoEm) ->first(); if ($antropometria) { $antropometria->fill($dados); $antropometria->updated_at = now(); $antropometria->save(); } else { $antropometria = $soap->antropometrias() ->create(array_merge($dados, [ 'created_at' => now(), ])); } $soap->objetivoAntropometria()->updateOrCreate( ['atendimento_antropometria_id' => $antropometria->id], ); } private static function saveSinaisVitais($soap): void { $payload = (array) (request()->objetivo['sinal_vital'] ?? []); if (empty($payload)) { return; } $camposPermitidos = [ 'pressao_arterial', 'frequencia_respiratoria', 'frequencia_cardiaca', 'temperatura', 'saturacao_o2', ]; $dados = [ 'atendimento_id' => $soap->atendimento_id, ]; foreach ($camposPermitidos as $campo) { if (array_key_exists($campo, $payload)) { $dados[$campo] = $payload[$campo]; } } $sinaisVitais = $soap->sinaisVitais() ->first(); if ($sinaisVitais) { $sinaisVitais->fill($dados); $sinaisVitais->updated_at = now(); $sinaisVitais->save(); } else { $insert = array_merge($dados, [ 'created_at' => now(), 'updated_at' => now(), ]); $sinaisVitais = $soap->sinaisVitais()->create($insert); } $soap->objetivoSinalVital()->updateOrCreate( ['atendimento_sinal_vital_id' => $sinaisVitais->id], ); } private static function saveGlicemiaCapilar($soap) { if (self::hasData(collect(request()->objetivo['glicemia_capilar']))) { $atendimentoGlicemiaCapilar = $soap->glicemiasCapilares()->create(array_merge([ 'atendimento_id' => $soap->atendimento_id, ], request()->objetivo['glicemia_capilar'])); $soap->objetivoGlicemiaCapilar()->create([ 'atendimento_glicemia_capilar_id' => $atendimentoGlicemiaCapilar->id ]); } } private static function saveTria($soap) { $paciente = optional($soap->atendimento)->paciente; $pacienteId = optional($paciente)->id; $hasCadastroIndividual = CadastroIndividual::where('paciente_id', $pacienteId)->exists(); $informacaoSocialAnterior = optional($paciente)->informacaoSocial; $alimentosAtual = optional($informacaoSocialAnterior)->alimentos_acabaram; $comeuAtual = optional($informacaoSocialAnterior)->comeu_alguns_alimentos; $alimentosNovo = request()->input('objetivo.tria.alimentos_acabaram'); $comeuNovo = request()->input('objetivo.tria.comeu_alguns_alimentos'); $houveMudanca = self::houveMudancaInformacaoSocioeconomica($alimentosAtual,$comeuAtual,$alimentosNovo,$comeuNovo); if (!$houveMudanca && !$hasCadastroIndividual) { return; } $dataAtualizacaoTria = now(); $dados = [ 'alimentos_acabaram' => $alimentosNovo, 'comeu_alguns_alimentos' => $comeuNovo, 'data_atualizacao_tria' => $dataAtualizacaoTria, ]; DB::transaction(function () use ($pacienteId, $dados, $soap, $houveMudanca) { PacienteInformacaoSocial::where('paciente_id', $pacienteId) ->update($dados); CadastroIndividual::where('paciente_id', $pacienteId) ->update($dados); if ($houveMudanca && !self::isRascunho()) { self::saveTriaHistorio($soap, $dados); } }); if ($houveMudanca && !self::isRascunho()) { self::saveProcedimentoTria($soap, $pacienteId); } } private static function saveTriaHistorio($soap, $dados) { AtendimentoSoapTriaHistorio::create([ 'soap_id' => $soap->id, 'alimentos_acabaram' => $dados['alimentos_acabaram'], 'comeu_alguns_alimentos' => $dados['comeu_alguns_alimentos'], 'data_atualizacao_tria' => $dados['data_atualizacao_tria'], ]); } private static function isTriaDesatualizado($dataAtualizacaoTria) { $data = Carbon::make($dataAtualizacaoTria); if (is_null($data)) { return false; } return $data->lt(Carbon::today()->subMonths(3)); } private static function saveProcedimentoTria($soap, $pacienteId) { if (self::hasProcedimentoTriaNoDia($pacienteId)) { return; } $procedimentoId = self::getProcedimentoId(ProcedimentoEnum::PROCEDIMENTO_TRIA_CODIGO); $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimentoId, 'quantidade' => 1, 'automatico' => true, 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, ]); $soap->procedimentosClinicos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, ]); } private static function hasProcedimentoTriaNoDia($pacienteId) { return DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento') ->join('sigtap.procedimento as procedimento', 'procedimento.id', 'atendimento_procedimento.procedimento_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'atendimento_procedimento.atendimento_id') ->where('atendimento.paciente_id', $pacienteId) ->where('procedimento.codigo', ProcedimentoEnum::PROCEDIMENTO_TRIA_CODIGO) ->whereDate('atendimento_procedimento.created_at', Carbon::today()) ->exists(); } private static function hasData($items) { $has = false; $items->each(function ($value) use (&$has) { if (!is_null($value)) { $has = true; return false; } }); return $has; } private static function saveMarcadoresConsumoAlimentar($soap) { $marcadorConsumoAlimentar = request()->objetivo['marcador_consumo_alimentar']; $respostaUnica = array_filter($marcadorConsumoAlimentar['pergunta_unica'], fn ($valor) => $valor !== null); $respostaMultipla = array_filter($marcadorConsumoAlimentar['pergunta_multipla'], fn ($valor) => $valor !== null); if (!empty($respostaUnica)) { $marcadorConsumoAlimentarPerguntaUnica = []; foreach ($respostaUnica as $pergunta => $resposta) { $marcadorConsumoAlimentarPerguntaUnica[] = [ 'pergunta_id' => $pergunta, 'resposta_id' => MarcadorConsumoAlimentarResposta::where('descricao', $resposta)->select('id')->value('id') ]; } $soap->marcadorConsumoAlimentarPerguntasRespostas()->createMany($marcadorConsumoAlimentarPerguntaUnica); } if (!empty($respostaMultipla)) { $marcadorConsumoAlimentarPerguntaMultipla = []; $pergunta = MarcadorConsumoAlimentarPergunta::join( 'atencao_basica_marcador_consumo_alimentar_respostas', 'atencao_basica_marcador_consumo_alimentar_perguntas.grupo_resposta', '=', 'atencao_basica_marcador_consumo_alimentar_respostas.codigo_grupo' ) ->where('atencao_basica_marcador_consumo_alimentar_respostas.descricao', '=', $respostaMultipla[0]) ->select('atencao_basica_marcador_consumo_alimentar_perguntas.id') ->first(); foreach ($respostaMultipla as $resposta) { $marcadorConsumoAlimentarPerguntaMultipla[] = [ 'pergunta_id' => $pergunta->id, 'resposta_id' => MarcadorConsumoAlimentarResposta::where('descricao', $resposta)->select('id')->value('id') ]; } $soap->marcadorConsumoAlimentarPerguntasRespostas()->createMany($marcadorConsumoAlimentarPerguntaMultipla); } } private static function saveResultadosExames($soap) { $examesEco = collect([ ProcedimentoEnum::ULTRASSONOGRAFIA_DOPPLER_DE_FLUXO_OBSTETRICO, ProcedimentoEnum::ULTRASSONOGRAFIA_OBSTETRICA_C_DOPPLER_COLORIDO_E_PULSADO, ProcedimentoEnum::ULTRASSONOGRAFIA_OBSTETRICA, ]); $examesPercentual = collect([ ProcedimentoEnum::DOSAGEM_DE_HEMOGLOBINA_GLICOSILADA, ]); $examesResultadoTipo = collect([ ProcedimentoEnum::EMISSOES_OTOACUSTICAS_EVOCADAS_PARA_TRIAGEM_AUDITIVA_TESTE_DA_ORELHINHA, ProcedimentoEnum::FUNDOSCOPIA, ProcedimentoEnum::POTENCIAL_EVOCADO_AUDITIVO_PARA_TRIAGEM_AUDITIVA_TESTE_DA_ORELHINHA, ProcedimentoEnum::RESSONANCIA_MAGNETICA_DE_CRANIO, ProcedimentoEnum::TOMOGRAFIA_COMPUTADORIZADA_DO_CRANIO, ProcedimentoEnum::ULTRASSONOGRAFIA_TRANSFONTANELA, ]); foreach ((request()->objetivo['resultados_exames'] ?? []) as $resultadoExame) { $exame = Exame::find($resultadoExame['exame_id']); $resultadoExame['percentual'] = $examesPercentual->contains($exame->codigo) ? $resultadoExame['percentual'] : null; if ($examesEco->contains($exame->codigo)) { $resultadoExame['idade_gestacional_semanas_eco'] = $resultadoExame['idade_gestacional_semanas_eco']; $resultadoExame['idade_gestacional_dias_eco'] = $resultadoExame['idade_gestacional_dias_eco']; $resultadoExame['dpp_eco'] = is_null($resultadoExame['dpp_eco']) ? null : Carbon::createFromFormat('d/m/Y', $resultadoExame['dpp_eco']); } else { $resultadoExame['idade_gestacional_semanas_eco'] = null; $resultadoExame['idade_gestacional_dias_eco'] = null; $resultadoExame['dpp_eco'] = null; } $resultado['resultado_tipo_id'] = $examesResultadoTipo->contains($exame->codigo) ? $resultadoExame['resultado_tipo_id'] : null; if (isset($resultadoExame['solicitado_em'])) { $resultadoExame['solicitado_em'] = Carbon::createFromFormat('d/m/Y', $resultadoExame['solicitado_em']); } if (isset($resultadoExame['realizado_em'])) { $resultadoExame['realizado_em'] = Carbon::createFromFormat('d/m/Y', $resultadoExame['realizado_em']); } if (isset($resultadoExame['resultado_em'])) { $resultadoExame['resultado_em'] = Carbon::createFromFormat('d/m/Y', $resultadoExame['resultado_em']); } $soap->resultadosExames()->create($resultadoExame); } } private static function saveProblemasCondicoes($soap) { foreach (request()->avaliacao['problemas_condicoes'] as $problemaCondicao) { $problemaCondicaoAutomatico = isset($problemaCondicao['automatico']) ? $problemaCondicao['automatico'] : false; $problemaCondicaoId = isset($problemaCondicao['id']) ? $problemaCondicao['id'] : null; $problemaCondicaoCiapId = isset($problemaCondicao['ciap_id']) ? $problemaCondicao['ciap_id'] : null; $problemaCondicaoCidId = isset($problemaCondicao['cid_id']) ? $problemaCondicao['cid_id'] : null; $problemaCondicaoSituacaoId = isset($problemaCondicao['situacao_id']) ? $problemaCondicao['situacao_id'] : null; $problemaCondicaoInicio = isset($problemaCondicao['inicio']) ? $problemaCondicao['inicio'] : null; $problemaCondicaoFim = isset($problemaCondicao['fim']) ? $problemaCondicao['fim'] : null; $problemaCondicaoObservacao = isset($problemaCondicao['observacao']) ? $problemaCondicao['observacao'] : null; $ciap = is_null($problemaCondicaoCiapId) ? null : Ciap::find($problemaCondicaoCiapId); $cid = is_null($problemaCondicaoCidId) ? null : Cid::find($problemaCondicaoCidId); $isGravidezNormal = collect(self::CIAPS_GRAVIDEZ_NORMAL)->contains($ciap->codigo ?? null) || collect(self::CIDS_GRAVIDEZ_NORMAL)->contains($cid->codigo ?? null); $problemaCondicaoAnterior = is_null($problemaCondicaoId) ? null : AtendimentoSoapProblemaCondicao::find($problemaCondicaoId); $data = [ 'automatico' => $problemaCondicaoAutomatico, 'ciap_id' => $problemaCondicaoCiapId, 'cid_id' => $problemaCondicaoCidId, 'situacao_id' => $problemaCondicaoSituacaoId, ]; if (!is_null($problemaCondicaoSituacaoId)) { $data['inicio'] = is_null($problemaCondicaoInicio) ? null : Carbon::createFromFormat('d/m/Y', $problemaCondicaoInicio); $data['fim'] = is_null($problemaCondicaoFim) ? null : Carbon::createFromFormat('d/m/Y', $problemaCondicaoFim); $data['observacao'] = $problemaCondicaoObservacao; $data['problema_condicao_anterior_id'] = $problemaCondicaoId; } if (!self::isRascunho() && $isGravidezNormal) { if (is_null($problemaCondicaoAnterior)) { $data['paciente_gestacao_id'] = PacienteGestacao::create([ 'paciente_id' => $soap->atendimento->paciente->id, 'inicio' => $data['inicio'] ?? Carbon::today(), 'fim' => $data['fim'] ?? null, ])->id; } else { PacienteGestacao::where('id', $problemaCondicaoAnterior->paciente_gestacao_id)->update([ 'inicio' => $data['inicio'] ?? Carbon::today(), 'fim' => $data['fim'] ?? null, ]); $data['paciente_gestacao_id'] = $problemaCondicaoAnterior->paciente_gestacao_id; } } $soap->problemasCondicoes()->create($data); } if (!self::isRascunho() && !is_null($soap->pre_natal_desfecho_em)) { $problemaCondicao = self::getProblemaCondicaoGravidezNormalNaoResolvido($soap->atendimento->paciente); if (!is_null($problemaCondicao)) { $ciap = is_null($problemaCondicao->ciap_id) ? null : Ciap::find($problemaCondicao->ciap_id); $cid = is_null($problemaCondicao->cid_id) ? null : Cid::find($problemaCondicao->cid_id); $isGravidezNormal = collect(self::CIAPS_GRAVIDEZ_NORMAL)->contains($ciap->codigo ?? null) || collect(self::CIDS_GRAVIDEZ_NORMAL)->contains($cid->codigo ?? null); if ($isGravidezNormal) { PacienteGestacao::where('id', $problemaCondicao->paciente_gestacao_id)->update([ 'fim' => $soap->pre_natal_desfecho_em, ]); } $soap->problemasCondicoes()->create([ 'ciap_id' => $problemaCondicao->ciap_id, 'cid_id' => $problemaCondicao->cid_id, 'situacao_id' => ProblemaCondicaoSituacaoEnum::RESOLVIDO, 'inicio' => $problemaCondicao->inicio, 'fim' => $soap->pre_natal_desfecho_em, 'observacao' => $problemaCondicao->observacao, 'problema_condicao_anterior_id' => $problemaCondicao->id, 'resolvido_automaticamente' => true, ]); } } } private static function getProblemaCondicaoGravidezNormalNaoResolvido($paciente) { return DB::table('ambulatorio_atendimento_soap_problema_condicao as problema_condicao') ->join('ambulatorio_atendimento_soap as soap', 'soap.id', 'problema_condicao.soap_id') ->join('ambulatorio_atendimento as atendimento', 'atendimento.id', 'soap.atendimento_id') ->where('soap.is_rascunho', false) ->where('atendimento.paciente_id', $paciente->id) ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('geral_ciap as ciap') ->whereColumn('ciap.id', 'problema_condicao.ciap_id') ->whereIn('ciap.codigo', self::CIAPS_GRAVIDEZ_NORMAL) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('sigtap.cid as cid') ->whereColumn('cid.id', 'problema_condicao.cid_id') ->whereIn('cid.codigo', self::CIDS_GRAVIDEZ_NORMAL) ) ) ->where('problema_condicao.situacao_id', '<>', ProblemaCondicaoSituacaoEnum::RESOLVIDO) ->whereNotExists(fn ($q) => $q ->select(DB::raw(1)) ->from('ambulatorio_atendimento_soap_problema_condicao as problema_condicao_posterior') ->whereColumn('problema_condicao_posterior.problema_condicao_anterior_id', 'problema_condicao.id') ) ->select( 'problema_condicao.id', 'problema_condicao.ciap_id', 'problema_condicao.cid_id', 'problema_condicao.inicio', 'problema_condicao.fim', 'problema_condicao.observacao', 'problema_condicao.paciente_gestacao_id' ) ->first(); } private static function saveAlergiasReacoesAdversas($soap) { $alergias = []; foreach (request()->avaliacao['alergias_reacoes_adversas'] as $alergia) { $alergias[$alergia['alergia_id']] = [ 'criticidade_id' => $alergia['criticidade_id'], 'reacoes_observacoes' => $alergia['reacoes_observacoes'] ?? null, ]; $alergiaCidadao = $soap->atendimento->paciente->cidadao->alergias() ->where('id', $alergia['alergia_id']) ->first(); if (is_null($alergiaCidadao) || ( $alergiaCidadao->cidadaoAlergia->criticidade_id != $alergia['criticidade_id'] || $alergiaCidadao->cidadaoAlergia->reacoes_observacoes != $alergia['reacoes_observacoes'] )) { $soap->alergias()->create($alergia); } } $soap->atendimento->paciente->cidadao->alergias()->sync($alergias); } private static function savePrescricoesMedicamentos($soap) { foreach (request()->plano['prescricoes_medicamentos'] as $prescricaoParams) { $dataPrincipal = [ 'unidade_usuario_id' => self::getCurrentLotacao()->unidade_id, 'infraestrutura_usuario_id' => self::getCurrentLotacao()->infraestrutura_id, 'ocupacao_usuario_id' => self::getCurrentLotacao()->ocupacao_id, 'lotaca_usuario_id' => self::getCurrentLotacao()->id, 'anamnese' => request()->plano['prescricao_medicamento']['anamnese'], 'diagnostico' => request()->plano['prescricao_medicamento']['diagnostico'], 'tratamento_previo_status' => request()->plano['prescricao_medicamento']['tratamento_previo_status'] ?? false, 'tratamento_previo_relatar' => request()->plano['prescricao_medicamento']['tratamento_previo_relatar'] ?? null, ]; $prescricao = $soap->prescricoesMedicamentos()->create($dataPrincipal); foreach ($prescricaoParams['medicamentos'] as $medicamento) { $dataItem = [ 'prescricao_id' => $prescricao->id, 'recomendacoes' => $medicamento['recomendacoes'], 'is_dose_unica' => $medicamento['is_dose_unica'] ?? false, 'is_uso_continuo' => $medicamento['is_uso_continuo'] ?? false, 'is_imprimir_separado' => $medicamento['is_imprimir_separado'] ?? false, 'is_remover_impressao' => $medicamento['is_remover_impressao'] ?? false, 'prescricao_medicamento_item_anterior_id' => $medicamento['prescricao_medicamento_item_anterior_id'] ?? null, ]; if ($medicamento['is_manual']) { $dataItem['receita_tipo_id'] = $medicamento['receita_tipo_id'] ?? null; $dataItem['descricao'] = $medicamento['descricao'] ?? null; $dataItem['justificativa'] = $medicamento['justificativa'] ?? null; } else { $dataItem['material_id'] = $medicamento['material_id']; $dataItem['dose'] = $medicamento['dose']; $dataItem['unidade_medida_id'] = $medicamento['unidade_medida_id']; $dataItem['inicio'] = Carbon::createFromFormat('d/m/Y', $medicamento['inicio']); if (!$medicamento['is_dose_unica']) { if ($medicamento['frequencia_dose'] == PrescricaoFrequenciaDose::FREQUENCIA) { $dataItem['frequencia_vezes'] = $medicamento['frequencia_vezes']; } else if ($medicamento['frequencia_dose'] == PrescricaoFrequenciaDose::TURNO) { $dataItem['turno_id'] = $medicamento['turno_id']; } $dataItem['intervalo'] = $medicamento['intervalo']; $dataItem['intervalo_medida_tempo_id'] = $medicamento['intervalo_medida_tempo_id']; } if ($medicamento['is_dose_unica']) { $dataItem['duracao'] = 1; $dataItem['duracao_medida_tempo_id'] = MedidaTempoEnum::DIAS; } else if (!$medicamento['is_uso_continuo']) { $dataItem['duracao'] = $medicamento['duracao']; $dataItem['duracao_medida_tempo_id'] = $medicamento['duracao_medida_tempo_id']; } } $prescricao->itens()->create($dataItem); } } } private static function saveSolicitacaoExamesComuns($soap, $acompanhamentoOci, $procedimentosOci) { $examesRegulados = [ 'origem' => 'exame_laboratorio', 'solicitacoes' => [], ]; foreach (request()->plano['solicitacoes_exames_comuns'] as $solicitacaoData) { $solicitacaoRegulada = [ 'cid_id' => $solicitacaoData['cid_id'] ?? Cid::where('codigo', CidEnum::EXAME_MEDICO_GERAL)->first()->id, 'ciap_id' => $solicitacaoData['ciap_id'] ?? null, 'observacao' => $solicitacaoData['observacao'], 'hipotese_diagnostica_justificativa' => $solicitacaoData['justificativa'], 'prioridade_id' => $solicitacaoData['classificacao_risco_id'], 'acompanhamento_oci_id' => $acompanhamentoOci->id ?? null, 'procedimentos' => [] ]; $solicitacaoData['alto_custo'] = false; $solicitacaoData['unidade_usuario_id'] = self::getCurrentLotacao()->unidade_id; $solicitacaoData['infraestrutura_usuario_id'] = self::getCurrentLotacao()->infraestrutura_id; $solicitacaoData['ocupacao_usuario_id'] = self::getCurrentLotacao()->ocupacao_id; $solicitacaoData['lotaca_usuario_id'] = self::getCurrentLotacao()->id; $solicitacao = $soap->solicitacoesExames()->create($solicitacaoData); foreach ($solicitacaoData['exames'] as $exame) { $exameModel = Exame::select('regulacao_tipo_id', 'codigo') ->where('id', $exame['exame_id']) ->first(); $exame['status_id'] = AtendimentoSoapSolicitacaoExameItemStatus::SOLICITADO; $exame['faz_parte_oci'] = $procedimentosOci->contains($exameModel->codigo); $solicitacaoItem = $solicitacao->itens()->create($exame); if ($exameModel->is_regulado) { $solicitacaoRegulada['procedimentos'][] = [ 'origem' => 'exame', 'id' => $exame['exame_id'], 'solicitacao_item_id' => $solicitacaoItem->id, 'faz_parte_oci' => $exame['faz_parte_oci'] ]; } } if (count($solicitacaoRegulada['procedimentos']) > 0) { $examesRegulados['solicitacoes'][] = $solicitacaoRegulada; } } if (count($examesRegulados['solicitacoes']) > 0) { self::prepareStoreRegulacao($examesRegulados, $soap); } } private static function saveSolicitacaoExamesAltoCusto($soap, $acompanhamentoOci, $procedimentosOci) { $examesRegulados = [ 'origem' => 'exame_imagem', 'solicitacoes' => [], ]; foreach (request()->plano['solicitacoes_exames_alto_custo'] as $solicitacaoData) { $solicitacaoRegulada = [ 'cid_id' => $solicitacaoData['cid_id'], 'ciap_id' => $solicitacaoData['ciap_id'], 'observacao' => $solicitacaoData['observacao'], 'hipotese_diagnostica_justificativa' => $solicitacaoData['justificativa'], 'prioridade_id' => $solicitacaoData['classificacao_risco_id'], 'acompanhamento_oci_id' => $acompanhamentoOci->id ?? null, 'procedimentos' => [] ]; $solicitacaoData['alto_custo'] = true; $solicitacaoData['unidade_usuario_id'] = self::getCurrentLotacao()->unidade_id; $solicitacaoData['infraestrutura_usuario_id'] = self::getCurrentLotacao()->infraestrutura_id; $solicitacaoData['ocupacao_usuario_id'] = self::getCurrentLotacao()->ocupacao_id; $solicitacaoData['lotaca_usuario_id'] = self::getCurrentLotacao()->id; $solicitacao = $soap->solicitacoesExames()->create($solicitacaoData); foreach ($solicitacaoData['exames'] as $exame) { $exameModel = Exame::select('regulacao_tipo_id', 'codigo') ->where('id', $exame['exame_id']) ->first(); $exame['status_id'] = AtendimentoSoapSolicitacaoExameItemStatus::SOLICITADO; $exame['faz_parte_oci'] = $procedimentosOci->contains($exameModel->codigo); $solicitacaoItem = $solicitacao->itens()->create($exame); if ($exameModel->is_regulado) { $solicitacaoRegulada['procedimentos'][] = [ 'origem' => 'exame', 'id' => $exame['exame_id'], 'solicitacao_item_id' => $solicitacaoItem->id, 'faz_parte_oci' => $exame['faz_parte_oci'] ]; } } if (count($solicitacaoRegulada['procedimentos']) > 0) { $examesRegulados['solicitacoes'][] = $solicitacaoRegulada; } } if (count($examesRegulados['solicitacoes']) > 0) { self::prepareStoreRegulacao($examesRegulados, $soap); } } private static function saveSolicitacaoProcedimentosCirurgicos($soap) { foreach (request()->plano['solicitacoes_procedimentos_cirurgicos'] as $solicitacaoData) { $solicitacao = $soap->solicitacoesProcedimentosCirurgicos()->create($solicitacaoData); $solicitacao->itens()->createMany($solicitacaoData['procedimentos_cirurgicos']); } } private static function saveAtestados($soap) { foreach (request()->plano['atestados'] as $atestado) { $modeloId = (int) $atestado['modelo_id']; $data = [ 'modelo_id' => $modeloId, ]; if ($modeloId === AtestadoModeloEnum::EM_BRANCO) { $data['descricao'] = $atestado['descricao']; } elseif (in_array($modeloId, [ AtestadoModeloEnum::PERIODO_MANHA, AtestadoModeloEnum::PERIODO_TARDE, AtestadoModeloEnum::PERIODO_NOITE, ], true)) { $data['nome_acompanhante'] = $atestado['nome_acompanhante']; $data['documento_tipo_id'] = $atestado['documento_tipo_id']; $data['cpf'] = $atestado['documento_tipo_id'] == DocumentoTipoEnum::CPF ? $atestado['cpf'] : null; $data['cns'] = $atestado['documento_tipo_id'] == DocumentoTipoEnum::CNS ? $atestado['cns'] : null; $data['data'] = Carbon::createFromFormat('d/m/Y', $atestado['data']); $data['cid_id'] = $atestado['cid_id']; } elseif ($modeloId === AtestadoModeloEnum::QUANTIDADE_HORAS) { $data['nome_acompanhante'] = $atestado['nome_acompanhante']; $data['documento_tipo_id'] = $atestado['documento_tipo_id']; $data['cpf'] = $atestado['documento_tipo_id'] == DocumentoTipoEnum::CPF ? $atestado['cpf'] : null; $data['cns'] = $atestado['documento_tipo_id'] == DocumentoTipoEnum::CNS ? $atestado['cns'] : null; $data['data'] = Carbon::createFromFormat('d/m/Y', $atestado['data']); $data['horario_inicial'] = !empty($atestado['horario_inicial']) ? $atestado['horario_inicial'] : null; $data['quantidade_horas'] = !empty($atestado['quantidade_horas']) ? intval($atestado['quantidade_horas']) : null; $data['cid_id'] = $atestado['cid_id']; } else { $data['nome_acompanhante'] = $atestado['nome_acompanhante']; $data['documento_tipo_id'] = $atestado['documento_tipo_id']; $data['cpf'] = $atestado['documento_tipo_id'] == DocumentoTipoEnum::CPF ? $atestado['cpf'] : null; $data['cns'] = $atestado['documento_tipo_id'] == DocumentoTipoEnum::CNS ? $atestado['cns'] : null; $data['data'] = Carbon::createFromFormat('d/m/Y', $atestado['data']); $data['horario'] = $atestado['horario']; $data['dias'] = $atestado['dias']; $data['cid_id'] = $atestado['cid_id']; } $soap->atestados()->create($data); } } private static function saveDeclaracoesComparecimento($soap) { foreach (request()->plano['declaracoes_comparecimento'] as $declaracaoComparecimento) { $data = [ 'atendimento_id' => $soap->atendimento_id, 'nome_acompanhante' => $declaracaoComparecimento['nome_acompanhante'], 'motivo_comparecimento' => $declaracaoComparecimento['motivo_comparecimento'], ]; if (is_null($declaracaoComparecimento['turno_id'])) { $data['entrada'] = $declaracaoComparecimento['entrada']; $data['saida'] = $declaracaoComparecimento['saida']; } else { $data['turno_id'] = $declaracaoComparecimento['turno_id']; } $soap->declaracoesComparecimento()->create($data); } } private static function saveEncaminhamentos($soap) { $especialidadesReguladas = [ 'origem' => 'especialidade', 'solicitacoes' => [], ]; foreach (request()->plano['encaminhamentos'] as $encaminhamento) { $data = [ 'tipo_id' => $encaminhamento['tipo_id'], ]; if ($encaminhamento['tipo_id'] == EncaminhamentoEnum::ENCAMINHAMENTO_PARA_SERVICO_ESPECIALIZADO) { $especialidadeRegulada = Especialidade::select('is_regulado') ->where('id', $encaminhamento['servico_especializado_especialidade_id']) ->get(); if ($especialidadeRegulada->first()->is_regulado) { $solicitacao = [ 'cid_id' => $encaminhamento['servico_especializado_cid_id'], 'observacao' => $encaminhamento['servico_especializado_observacao'], 'hipotese_diagnostica_justificativa' => $encaminhamento['servico_especializado_motivo'], 'prioridade_id' => $encaminhamento['servico_especializado_classificacao_risco_id'], ]; $solicitacao['procedimentos'][] = [ 'origem' => 'especialidade', 'id' => $encaminhamento['servico_especializado_especialidade_id'], ]; $especialidadesReguladas['solicitacoes'][] = $solicitacao; } $data['servico_especializado_especialidade_id'] = $encaminhamento['servico_especializado_especialidade_id']; $data['servico_especializado_complemento'] = $encaminhamento['servico_especializado_complemento']; $data['servico_especializado_cid_id'] = $encaminhamento['servico_especializado_cid_id']; $data['servico_especializado_ciap_id'] = $encaminhamento['servico_especializado_ciap_id']; $data['servico_especializado_classificacao_risco_id'] = $encaminhamento['servico_especializado_classificacao_risco_id']; $data['servico_especializado_motivo'] = $encaminhamento['servico_especializado_motivo']; $data['servico_especializado_observacao'] = $encaminhamento['servico_especializado_observacao']; } else if ($encaminhamento['tipo_id'] == EncaminhamentoEnum::ENCAMINHAMENTO_INTERSETORIAL) { $data['intersetorial_infraestrutura_id'] = $encaminhamento['intersetorial_infraestrutura_id']; } else if ($encaminhamento['tipo_id'] == EncaminhamentoEnum::ENCAMINHAMENTO_PARA_CAPS) { $data['servico_especializado_motivo'] = $encaminhamento['servico_especializado_motivo']; } else if($encaminhamento['tipo_id'] == EncaminhamentoEnum::ENCAMINHAMENTO_PARA_INTERNACAO_HOSPITALAR){ $dataSolicitacao = isset($encaminhamento['internacao_hospitalar_data_solicitacao']) ? Carbon::parse($encaminhamento['internacao_hospitalar_data_solicitacao'])->format('Y-m-d') : null; $dataAutorizacao = isset($encaminhamento['internacao_hospitalar_data_autorizacao']) ? Carbon::parse($encaminhamento['internacao_hospitalar_data_autorizacao'])->format('Y-m-d') : null; $data['internacao_hospitalar_cid_principal_id'] = $encaminhamento['internacao_hospitalar_cid_principal_id']; $data['internacao_hospitalar_cid_secundario_id'] = $encaminhamento['internacao_hospitalar_cid_secundario_id'] ?? null; $data['internacao_hospitalar_cid_causas_associadas_id'] = $encaminhamento['internacao_hospitalar_cid_causas_associadas_id'] ?? null; $data['internacao_hospitalar_unidade_solicitante_id'] = $encaminhamento['internacao_hospitalar_unidade_solicitante_id']; $data['internacao_hosp_principais_resultados_de_provas_diagnosticas'] = $encaminhamento['internacao_hosp_principais_resultados_de_provas_diagnosticas']; $data['internacao_hosp_condicoes_que_justificam_internacao'] = $encaminhamento['internacao_hosp_condicoes_que_justificam_internacao']; $data['internacao_hosp_principais_sinais_sintomas_clinicos'] = $encaminhamento['internacao_hosp_principais_sinais_sintomas_clinicos']; $data['internacao_hospitalar_procedimento_solicitado_id'] = $encaminhamento['internacao_hospitalar_procedimento_solicitado_id']; $data['internacao_hospitalar_data_solicitacao'] = $dataSolicitacao; $data['internacao_hospitalar_clinica_id'] = $encaminhamento['internacao_hospitalar_clinica_id']; $data['internacao_hospitalar_carater_internacao_id'] = $encaminhamento['internacao_hospitalar_carater_internacao_id']; $data['internacao_hospitalar_profissional_solicitante_assistente_id'] = $encaminhamento['internacao_hospitalar_profissional_solicitante_assistente_id']; $data['internacao_hospitalar_profissional_solicitante_documento_tipo_id'] = $encaminhamento['internacao_hospitalar_profissional_solicitante_documento_tipo_id']; $data['internacao_hospitalar_profissional_solicitante_documento_numero'] = $encaminhamento['internacao_hospitalar_profissional_solicitante_documento_numero']; $data['internacao_hospitalar_causa_externa_id'] = $encaminhamento['internacao_hospitalar_causa_externa_id'] ?? null; $data['internacao_hospitalar_cnpj_seguradora'] = $encaminhamento['internacao_hospitalar_cnpj_seguradora'] ?? null; $data['internacao_hospitalar_numero_bilhete'] = $encaminhamento['internacao_hospitalar_numero_bilhete'] ?? null; $data['internacao_hospitalar_serie'] = $encaminhamento['internacao_hospitalar_serie'] ?? null; $data['internacao_hospitalar_cnpj_empresa'] = $encaminhamento['internacao_hospitalar_cnpj_empresa'] ?? null; $data['internacao_hospitalar_cnae_empresa'] = $encaminhamento['internacao_hospitalar_cnae_empresa'] ?? null; $data['internacao_hospitalar_cbor'] = $encaminhamento['internacao_hospitalar_cbor'] ?? null; $data['internacao_hospitalar_vinculo_previdencia_id'] = $encaminhamento['internacao_hospitalar_vinculo_previdencia_id'] ?? null; $data['internacao_hospitalar_profissional_autorizador_id'] = $encaminhamento['internacao_hospitalar_profissional_autorizador_id'] ?? null; $data['internacao_hospitalar_data_autorizacao'] = $dataAutorizacao; $data['internacao_hospitalar_codigo_orgao_emissor'] = $encaminhamento['internacao_hospitalar_codigo_orgao_emissor'] ?? null; $data['internacao_hospitalar_profissional_autorizador_documento_tipo_id'] = $encaminhamento['internacao_hospitalar_profissional_autorizador_documento_tipo_id'] ?? null; $data['internacao_hospitalar_profissional_autorizador_documento_numero'] = $encaminhamento['internacao_hospitalar_profissional_autorizador_documento_numero'] ?? null; } $data['servico_especializado_cid_id'] = $encaminhamento['servico_especializado_cid_id']; $data['servico_especializado_ciap_id'] = $encaminhamento['servico_especializado_ciap_id']; $data['unidade_usuario_id'] = self::getCurrentLotacao()->unidade_id; $data['infraestrutura_usuario_id'] = self::getCurrentLotacao()->infraestrutura_id; $data['ocupacao_usuario_id'] = self::getCurrentLotacao()->ocupacao_id; $data['lotaca_usuario_id'] = self::getCurrentLotacao()->id; $soap->encaminhamentos()->create($data); } count($especialidadesReguladas['solicitacoes']) > 0 ? self::prepareStoreRegulacao($especialidadesReguladas, $soap) : null; } private static function saveProcedimentos($soap, $acompanhamentoOci, $procedimentosOci) { self::saveProcedimentosClinicos($soap, $acompanhamentoOci, $procedimentosOci); self::saveProcedimentosAdministrativos($soap, $acompanhamentoOci, $procedimentosOci); } private static function saveProcedimentosClinicos($soap, $acompanhamentoOci, $procedimentosOci) { foreach (request()->plano['procedimentos_clinicos'] as $procedimento) { $procedimentoModel = DB::table('sigtap.procedimento')->where('id', $procedimento['procedimento_id'])->select('codigo')->first(); $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimento['procedimento_id'], 'cid_id' => $procedimento['cid_id'], 'quantidade' => $procedimento['quantidade'], 'automatico' => $procedimento['automatico'], 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, 'acompanhamento_oci_id' => $procedimentosOci->contains($procedimentoModel->codigo) ? $acompanhamentoOci->id : null ]); $soap->procedimentosClinicos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, 'observacao' => $procedimento['observacao'], ]); if (!empty($procedimento['materiais']) && is_array($procedimento['materiais'])) { foreach ($procedimento['materiais'] as $material) { if (!empty($material['material_id'])) { $itemData = [ 'material_id' => $material['material_id'], 'quantidade' => $material['material_quantidade'], 'escolheu_entrada_item_manualmente' => $material['material_escolheu_entrada_item_manualmente'] ?? false, 'entrada_itens' => $material['material_entrada_itens'] ?? [], ]; $saidaItem = AlmoxarifadoService::saveSaidaDeDispensacaoDoAmbulatorio($itemData); DB::table('ambulatorio_procedimento_material')->insert([ 'ambulatorio_atendimento_procedimento_id' => $atendimentoProcedimento->id, 'saida_item_id' => $saidaItem->id, 'created_at' => now(), 'updated_at' => now(), ]); } } } } if (!self::isRascunho()) { self::getAutomaticProcedimentosClinicos($soap)->each(function ($id) use ($soap) { $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $id, 'quantidade' => 1, 'automatico' => true, 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, ]); $soap->procedimentosClinicos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, ]); }); } } private static function getAutomaticProcedimentosClinicos($soap) { $procedimentos = collect(); if (!is_null($soap->objetivoAntropometria)) { $antropometria = $soap->objetivoAntropometria->atendimentoAntropometria; if (!is_null($antropometria->peso) && !is_null($antropometria->altura)) { $procedimentos->push(self::getProcedimentoId(ProcedimentoEnum::AVALIACAO_ANTROPOMETRICA)); } else if (!is_null($antropometria->peso)) { $procedimentos->push(self::getProcedimentoId(ProcedimentoEnum::MEDICAO_DE_PESO)); } else if (!is_null($antropometria->altura)) { $procedimentos->push(self::getProcedimentoId(ProcedimentoEnum::MEDICAO_DE_ALTURA)); } } if (!is_null($soap->objetivoSinalVital)) { $sinalVital = $soap->objetivoSinalVital->atendimentoSinalVital; if (!is_null($sinalVital->pressao_arterial)) { $procedimentos->push(self::getProcedimentoId(ProcedimentoEnum::AFERICAO_PRESSAO_ARTERIAL)); } if (!is_null($sinalVital->temperatura)) { $procedimentos->push(self::getProcedimentoId(ProcedimentoEnum::AFERICAO_DE_TEMPERATURA)); } } if (!is_null($soap->objetivoGlicemiaCapilar)) { $glicemiaCapilar = $soap->objetivoGlicemiaCapilar->atendimentoGlicemiaCapilar; if (!is_null($glicemiaCapilar->valor)) { $procedimentos->push(self::getProcedimentoId(ProcedimentoEnum::GLICEMIA_CAPILAR)); } } if ($soap->is_atendimento_puericultura) { $procedimentos->push(self::getProcedimentoId(ProcedimentoEnum::AVALIACAO_DO_DESENVOLVIMENTO_DA_CRIANCA_NA_PUERICULTURA)); } if ($soap->riscoCardiovascularFramingham()->exists()) { $procedimentos->push(self::getProcedimentoId(ProcedimentoEnum::ESTRATIFICACAO_DO_RISCO_CARDIOVASCULAR)); } return $procedimentos; } public static function isPacienteGestante($soap) { $hasGravidez = false; self::getProblemasCondicoesAtivosOuLatentes($soap->atendimento->paciente) ->each(function ($problemaCondicao) use (&$hasGravidez) { if (collect(self::CIAPS_GRAVIDEZ_NORMAL)->contains($problemaCondicao['ciap']['codigo']) || collect(self::CIDS_GRAVIDEZ_NORMAL)->contains($problemaCondicao['cid']['codigo']) ) { $hasGravidez = true; return false; } }); return $hasGravidez; } private static function saveProcedimentosAdministrativos($soap, $acompanhamentoOci, $procedimentosOci) { foreach (request()->finalizacao['procedimentos_administrativos'] as $procedimento) { $procedimentoModel = DB::table('sigtap.procedimento')->where('id', $procedimento['procedimento_id'])->select('codigo')->first(); $atendimentoProcedimento = $soap->procedimentos() ->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimento['procedimento_id'], 'cid_id' => $procedimento['cid_id'], 'quantidade' => $procedimento['quantidade'], 'automatico' => $procedimento['automatico'], 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, 'acompanhamento_oci_id' => $procedimentosOci->contains($procedimentoModel->codigo) ? $acompanhamentoOci->id : null ]); $soap->procedimentosAdministrativos() ->create(['atendimento_procedimento_id' => $atendimentoProcedimento->id]); } } private static function getProcedimentoId($codigo) { return Procedimento::where('codigo', $codigo)->orderByDesc('competencia_id')->first('id')->id; } private static function saveFinalizacao($soap) { if (request()->finalizacao['desfecho']['finalizado']) { $soap->atendimento->update([ 'finalizado_em' => Carbon::now(), 'finalizado_lotacao_id' => self::getCurrentLotacao()->id, ]); if ($soap->atendimento->fila) { $soap->atendimento->fila->update(['finalizado' => true]); } if (!$soap->atendimento->is_demanda_espontanea) { $soap->atendimento->agendamento->update(['status_id' => AgendamentoStatus::REALIZADO]); if (!is_null($soap->atendimento->agendamento->regulacao_solicitacao_id)) { RegulacaoSolicitacaoService::updateStatus( $soap->atendimento->agendamento->regulacao_solicitacao_id, RegulacaoStatusTipo::REALIZADO ); } } } else { if ($soap->atendimento->is_demanda_espontanea) { $soap->atendimento->demandaEspontanea()->update([ 'ocupacao_id' => request()->finalizacao['desfecho']['ocupacao_id'], 'especialidade_id' => request()->finalizacao['desfecho']['especialidade_id'], 'usuario_id' => request()->finalizacao['desfecho']['usuario_id'], ]); } $soap->atendimento->update([ 'responsavel_atual_ocupacao_id' => request()->finalizacao['desfecho']['ocupacao_id'], 'responsavel_atual_especialidade_id' => request()->finalizacao['desfecho']['especialidade_id'], 'responsavel_atual_usuario_id' => request()->finalizacao['desfecho']['usuario_id'], 'responsavel_encaminhamento_atual_lotacao_id' => is_null(request()->finalizacao['desfecho']['usuario_id']) ? null : $soap->created_lotacao_id, ]); if ($soap->atendimento->fila) { $filaUpdateParams = [ 'prioridade_id' => request()->finalizacao['desfecho']['prioridade_id'] ]; if (!self::isRascunho()) { $filaUpdateParams['status_id'] = PainelSenhaStatus::EM_ESPERA; } $soap->atendimento->fila->update($filaUpdateParams); } $soap->atendimento->servicos()->sync(request()->finalizacao['desfecho']['servicos']); } } private static function saveRaas($soap) { if (!self::hasProcedimentoRaas($soap->atendimento, true)) { return; } AtendimentoRaas::updateOrCreate( ['atendimento_id' => $soap->atendimento->id], [ 'origem_paciente_id' => request()->raas['origem_paciente_id'], 'destino_paciente_id' => request()->raas['destino_paciente_id'], 'motivo_saida_permanencia_id' => request()->raas['motivo_saida_permanencia_id'], 'carater_atendimento_id' => request()->raas['carater_atendimento_id'], 'numero_autorizacao' => self::hasProcedimentoRaasQuePrecisaDeAutorizacao($soap->atendimento, true) ? request()->raas['numero_autorizacao'] : null, 'classificacao_id' => self::hasProcedimentoRaasQuePrecisaDeClassificacao($soap->atendimento, true) ? request()->raas['classificacao_id'] : null, 'local_realizacao_exame_id' => request()->raas['local_realizacao_exame_id'], ] ); } private static function validateStore($fila = null) { request()->validate(array_merge( [ 'is_rascunho' => [ 'required', 'boolean', ], 'fila_id' => [ 'nullable', 'required_without:agendamento_id', 'integer', Rule::exists(Fila::class, 'id'), ], 'agendamento_id' => [ 'nullable', 'required_without:fila_id', 'integer', Rule::exists(Agendamento::class, 'id'), ], 'ultima_etapa_oci_realizada_mesmo_atendimento' => [ 'nullable', 'required_with:oci_id', 'boolean' ], 'oci_id' => [ 'nullable', 'integer', Rule::exists(Oci::class, 'id'), ], 'acompanhamento_oci_id' => [ 'nullable', 'integer', Rule::exists(AcompanhamentoOci::class, 'id'), ], 'observacao_perfil_epidemiologico' => [ 'nullable', 'max:500', ], ], self::getOciProcedimentosRealizadosValidations(), self::getPacienteValidations(), self::getMedicoesValidations(), self::getMedicamentosEmUsoValidations(), self::getAntecedenteValidations(), self::getSubjetivoValidations(), self::getObjetivoValidations(), self::getAvaliacaoValidations(), self::getPlanoValidations(), self::getRaasValidations(), self::getFinalizacaoValidations($fila), self::getPerfisEpidemiologicosValidations(), )); } private static function getOciProcedimentosRealizadosValidations() { return [ 'oci_procedimentos_realizados_previamente' => [ 'present', 'array' ], 'oci_procedimentos_realizados_previamente.*.id' => [ 'required', 'integer', ], 'oci_procedimentos_realizados_previamente.*.data_executada' => [ 'nullable', 'date_format:d/m/Y', ], 'oci_procedimentos_realizados_previamente.*.unidade_executora_id' => [ 'nullable', 'integer', ], 'oci_procedimentos_realizados_previamente.*.ocupacao_executora_id' => [ 'nullable', 'integer', ], 'oci_procedimentos_realizados_previamente.*.usuarioExecutor' => [ 'nullable', 'string', 'max:100' ], ]; } private static function getPacienteValidations() { return [ 'paciente.telefone_principal.id' => [ 'bail', 'nullable', 'integer', 'exclude_if:paciente.telefone_principal.atualizado,false', Rule::exists(CidadaoTelefone::class, 'id'), ], 'paciente.telefone_principal.numero' => [ 'bail', 'nullable', 'required_with:paciente.telefone_principal.id', 'exclude_if:paciente.telefone_principal.atualizado,false', 'digits_between:10,11', ], 'paciente.telefone_principal.autoriza_sms' => [ 'bail', 'nullable', 'required_with:paciente.telefone_principal.id', 'exclude_if:paciente.telefone_principal.atualizado,false', 'boolean', ], ]; } private static function getMedicoesValidations() { return self::getMedicoesAntropomeriaValidations(); } private static function getMedicoesAntropomeriaValidations() { return [ 'medicoes.antropometrias' => [ 'present', 'array', ], 'medicoes.antropometrias.*.medido_em' => [ 'required', 'date_format:d/m/Y', ], 'medicoes.antropometrias.*.peso' => [ 'nullable', 'numeric', 'between:0.5,500', ], 'medicoes.antropometrias.*.altura' => [ 'nullable', 'numeric', 'between:20,250', ], 'medicoes.antropometrias.*.perimetro_cefalico' => [ 'nullable', 'numeric', 'between:10,200', ], 'medicoes.antropometrias.*.circunferencia_abdominal' => [ 'nullable', 'numeric', 'max:999', ], 'medicoes.antropometrias.*.perimetro_panturrilha' => [ 'nullable', 'numeric', 'between:10,99', ], ]; } private static function getMedicamentosEmUsoValidations() { return [ 'medicamentos_em_uso.medicamentos_com_tratamento_interrompido' => [ 'present', 'array', ], 'medicamentos_em_uso.medicamentos_com_tratamento_interrompido.*.prescricao_medicamento_item_id' => [ 'required', 'integer', Rule::exists(AtendimentoSoapPrescricaoMedicamentoItem::class, 'id'), ], 'medicamentos_em_uso.medicamentos_com_tratamento_interrompido.*.justificativa' => [ 'required', 'string', 'max:500', ], ]; } private static function getAntecedenteValidations() { return array_merge( [ 'antecedente.descricao' => [ 'nullable', 'string', 'max:5000' ], 'antecedente.descricao_familiar' => [ 'nullable', 'string', 'max:5000' ], 'antecedente.gestas_previas' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.abortos' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.desfecho_gestacao_aconteceu_menos_um_ano' => [ 'nullable', 'boolean', ], 'antecedente.partos_realizados' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.partos_vaginais' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.partos_cesareas' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.partos_domiciliares' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.nascidos_vivos' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.nascidos_mortos' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.recem_nascidos_com_menos2500_gramas' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.recem_nascidos_com_mais4500_gramas' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.nascidos_vivos_vivem' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.nascidos_vivos_mortos_primeira_semana' => [ 'nullable', 'integer', 'max:99' ], 'antecedente.nascidos_vivos_mortos_depois_primeira_semana' => [ 'nullable', 'integer', 'max:99' ], ], self::getAntecedenteProblemasCondicoesValidations(), self::getAntecedenteCirurgiasInternacoesValidations(), self::getAntecedenteProblemaFamiliarValidations() ); } private static function getAntecedenteProblemasCondicoesValidations() { $rules = [ 'antecedente.problemas_condicoes' => [ 'present', 'array', ], ]; foreach ((request()->antecedente['problemas_condicoes'] ?? []) as $i => $problemaCondicao) { $rules["antecedente.problemas_condicoes.{$i}.ciap_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($problemaCondicao['cid_id'])), 'integer', Rule::exists(Ciap::class, 'id'), ]; $rules["antecedente.problemas_condicoes.{$i}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($problemaCondicao['ciap_id'])), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["antecedente.problemas_condicoes.{$i}.situacao_id"] = [ 'required', 'integer', Rule::exists(ProblemaCondicaoSituacao::class, 'id'), ]; $rules["antecedente.problemas_condicoes.{$i}.inicio"] = [ 'nullable', 'date_format:d/m/Y', ]; if (isset($problemaCondicao['fim'])) { $rules["antecedente.problemas_condicoes.{$i}.inicio"][] = 'before_or_equal:' . $problemaCondicao['fim']; } $rules["antecedente.problemas_condicoes.{$i}.fim"] = [ 'nullable', 'date_format:d/m/Y', ]; if (isset($problemaCondicao['inicio'])) { $rules["antecedente.problemas_condicoes.{$i}.fim"][] = 'after_or_equal:' . $problemaCondicao['inicio']; } $rules["antecedente.problemas_condicoes.{$i}.observacao"] = [ 'nullable', 'string', 'max:5000', ]; } return $rules; } private static function getAntecedenteCirurgiasInternacoesValidations() { return [ 'antecedente.cirurgias_internacoes' => [ 'present', 'array', ], 'antecedente.cirurgias_internacoes.*.descricao' => [ 'required', 'string', 'max:100' ], 'antecedente.cirurgias_internacoes.*.realizada_em' => [ 'nullable', 'date_format:d/m/Y', ], 'antecedente.cirurgias_internacoes.*.observacao' => [ 'nullable', 'string', 'max:500', ], ]; } private static function getAntecedenteProblemaFamiliarValidations() { return [ 'antecedente.problemas_familiares' => [ 'present', 'array', ], 'antecedente.problemas_familiares.*.ciap_id' => [ 'required', 'integer', 'distinct', Rule::exists(Ciap::class, 'id'), ], 'antecedente.problemas_familiares.*.observacao' => [ 'nullable', 'string', 'max:500', ], ]; } private static function getSubjetivoValidations() { return array_merge( [ 'subjetivo.descricao' => [ 'nullable', 'string', 'max:5000', ], ], self::getSubjetivoMotivosValidations() ); } private static function getSubjetivoMotivosValidations() { $rules = [ 'subjetivo.motivos' => [ 'present', 'array', ], ]; foreach ((request()->subjetivo['motivos'] ?? []) as $i => $motivo) { $rules["subjetivo.motivos.{$i}.ciap_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($motivo['cid_id'])), 'integer', Rule::exists(Ciap::class, 'id'), ]; $rules["subjetivo.motivos.{$i}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($motivo['ciap_id'])), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["subjetivo.motivos.{$i}.observacao"] = [ 'nullable', 'string', 'max:500', ]; } return $rules; } private static function getObjetivoValidations() { return array_merge( [ 'objetivo.descricao' => [ 'nullable', 'string', 'max:5000', ], 'objetivo.is_atendimento_puericultura' => [ 'required', 'boolean', ], 'objetivo.dum' => [ 'nullable', 'date_format:d/m/Y', 'before_or_equal:now', ], 'objetivo.vacinacao_em_dia' => [ 'nullable', 'boolean', ], 'objetivo.paciente_com_necessidade_especial' => [ 'nullable', 'boolean', ], ], self::getObjetivoPreNatalValidations(), self::getObjetivoPuericulturaValidations(), self::getObjetivoAntropometriaValidations(), self::getObjetivoSinalVitalValidations(), self::getObjetivoGlicemiaCapilarValidations(), self::getObjetivoResultadosExamesValidations(), self::getObjetivoExameAvaliadoValidations(), ); } private static function getObjetivoPreNatalValidations() { return self::getPreNatalValidations('objetivo'); } private static function getObjetivoPuericulturaValidations() { return array_merge( [ 'objetivo.puericultura.gravidez_tipo_id' => [ 'nullable', 'integer', Rule::exists(GravidezTipo::class, 'id'), ], 'objetivo.puericultura.parto_tipo_id' => [ 'nullable', 'integer', Rule::exists(PartoTipo::class, 'id'), ], 'objetivo.puericultura.idade_gestacional_semanas' => [ 'nullable', 'integer', 'between:20,42', ], 'objetivo.puericultura.idade_gestacional_dias' => [ 'nullable', 'integer', 'max:6', ], 'objetivo.puericultura.apgar_primeiro_minuto' => [ 'nullable', 'integer', 'max:10', ], 'objetivo.puericultura.apgar_quinto_minuto' => [ 'nullable', 'integer', 'max:10', ], 'objetivo.puericultura.apgar_decimo_minuto' => [ 'nullable', 'integer', 'max:10', ], 'objetivo.puericultura.peso' => [ 'nullable', 'numeric', 'between:0.5,500', ], 'objetivo.puericultura.comprimento' => [ 'nullable', 'numeric', 'between:20,250', ], 'objetivo.puericultura.perimetro_cefalico' => [ 'nullable', 'numeric', 'between:10,200', ], 'objetivo.puericultura.aleitamento_tipo_id' => [ 'nullable', 'integer', Rule::exists(AleitamentoMaterno::class, 'id'), ], ], self::getObjetivoPuericulturaAlteracoesFenotipicasValidations(), self::getObjetivoPuericulturaFatoresRiscoValidations(), self::getObjetivoPuericulturaMarcosDesenvolvimentoValidations(), ); } private static function getObjetivoPuericulturaAlteracoesFenotipicasValidations() { return [ 'objetivo.puericultura.alteracoes_fenotipicas' => [ 'present', 'array', ], 'objetivo.puericultura.alteracoes_fenotipicas.*.id' => [ 'required', 'integer', Rule::exists(PuericulturaAlteracaoFenotipica::class, 'id'), ], 'objetivo.puericultura.alteracoes_fenotipicas.*.is_presente' => [ 'nullable', 'boolean', ], ]; } private static function getObjetivoPuericulturaFatoresRiscoValidations() { return [ 'objetivo.puericultura.fatores_risco' => [ 'present', 'array', ], 'objetivo.puericultura.fatores_risco.*.id' => [ 'required', 'integer', Rule::exists(PuericulturaFatorRisco::class, 'id'), ], 'objetivo.puericultura.fatores_risco.*.is_presente' => [ 'nullable', 'boolean', ], ]; } private static function getObjetivoPuericulturaMarcosDesenvolvimentoValidations() { return [ 'objetivo.puericultura.marcos_desenvolvimento' => [ 'present', 'array', ], 'objetivo.puericultura.marcos_desenvolvimento.*.id' => [ 'required', 'integer', Rule::exists(PuericulturaMarcoDesenvolvimento::class, 'id'), ], 'objetivo.puericultura.marcos_desenvolvimento.*.is_presente' => [ 'nullable', 'boolean', ], 'objetivo.puericultura.marcos_desenvolvimento.*.alcancado_com_anos' => [ 'nullable', 'integer', ], 'objetivo.puericultura.marcos_desenvolvimento.*.alcancado_com_meses' => [ 'nullable', 'integer', ], ]; } private static function getObjetivoAntropometriaValidations() { return [ 'objetivo.antropometria.peso' => [ 'nullable', 'numeric', 'between:0.5,500', ], 'objetivo.antropometria.altura' => [ 'nullable', 'numeric', 'between:20,250', ], 'objetivo.antropometria.perimetro_cefalico' => [ 'nullable', 'numeric', 'between:10,200', ], 'objetivo.antropometria.circunferencia_abdominal' => [ 'nullable', 'numeric', 'max:999', ], 'objetivo.antropometria.perimetro_panturrilha' => [ 'nullable', 'numeric', 'between:10,99', ], ]; } private static function getObjetivoSinalVitalValidations() { return [ 'objetivo.sinal_vital.pressao_arterial' => [ 'nullable', 'string', 'max:7', ], 'objetivo.sinal_vital.frequencia_respiratoria' => [ 'nullable', 'numeric', 'max:200', ], 'objetivo.sinal_vital.frequencia_cardiaca' => [ 'nullable', 'numeric', 'max:999', ], 'objetivo.sinal_vital.temperatura' => [ 'nullable', 'numeric', 'between:20,45', ], 'objetivo.sinal_vital.saturacao_o2' => [ 'nullable', 'numeric', 'max:100', ], ]; } private static function getObjetivoGlicemiaCapilarValidations() { return [ 'objetivo.glicemia_capilar.valor' => [ 'nullable', 'numeric', 'max:800', ], 'objetivo.glicemia_capilar.momento_coleta_id' => [ 'nullable', 'required_with:glicemia_capilar.valor', 'integer', Rule::exists(GlicemiaCapilarMomentoColeta::class, 'id'), ], ]; } private static function getObjetivoResultadosExamesValidations() { return [ 'objetivo.resultados_exames' => [ 'present', 'array', ], 'objetivo.resultados_exames.*.exame_id' => [ 'required', 'integer', Rule::exists(Exame::class, 'id'), ], 'objetivo.resultados_exames.*.solicitado_em' => [ 'nullable', 'date_format:d/m/Y', ], 'objetivo.resultados_exames.*.realizado_em' => [ 'required', 'date_format:d/m/Y', ], 'objetivo.resultados_exames.*.resultado_em' => [ 'nullable', 'date_format:d/m/Y', ], 'objetivo.resultados_exames.*.resultado' => [ 'required', 'string', 'max:5000', ], 'objetivo.resultados_exames.*.percentual' => [ 'nullable', 'numeric', 'max:100', ], 'objetivo.resultados_exames.*.idade_gestacional_semanas_eco' => [ 'nullable', 'integer', 'max:42', ], 'objetivo.resultados_exames.*.idade_gestacional_dias_eco' => [ 'nullable', 'integer', 'max:6', ], 'objetivo.resultados_exames.*.dpp_eco' => [ 'nullable', 'date_format:d/m/Y', ], 'objetivo.resultados_exames.*.resultado_tipo_id' => [ 'nullable', 'integer', Rule::exists(ExameResultadoTipo::class, 'id'), ], ]; } private static function getObjetivoExameAvaliadoValidations() { return [ 'objetivo.exame_avaliado' => [ 'present', 'array', ], 'objetivo.exame_avaliado.*.id' => [ 'required', 'integer', 'distinct', Rule::exists(ExameSolicitadoAvaliado::class, 'id'), ], 'objetivo.exame_avaliado.*.solicitado_em' => [ 'nullable', 'date_format:d/m/Y', ], 'objetivo.exame_avaliado.*.realizado_em' => [ 'required', 'date_format:d/m/Y', ], 'objetivo.exame_avaliado.*.resultado_em' => [ 'nullable', 'date_format:d/m/Y', ], 'objetivo.exame_avaliado.*.resultado' => [ 'required', 'string', 'max:5000', ], ]; } private static function getAvaliacaoValidations() { return array_merge( [ 'avaliacao.descricao' => [ 'nullable', 'string', 'max:5000', ], ], self::getAvaliacaoCondicoesAvaliadasValidations(), self::getAvaliacaoDoencasTransmissiveisValidations(), self::getAvaliacaoRastreamentosValidations(), self::getAvaliacaoProblemasCondicoesValidations(), self::getAvaliacaoPreNatalValidations(), self::getAvaliacaoAlergiasReacoesAdversasValidations(), self::getAvaliacaoSaudeBucalValidations() ); } private static function getAvaliacaoCondicoesAvaliadasValidations() { return [ 'avaliacao.condicoes_avaliadas' => [ 'present', 'array', ], 'avaliacao.condicoes_avaliadas.*' => [ 'required', 'integer', 'distinct', Rule::exists(CondicaoAvaliada::class, 'id'), ], ]; } private static function getAvaliacaoDoencasTransmissiveisValidations() { return [ 'avaliacao.doencas_transmissiveis' => [ 'present', 'array', ], 'avaliacao.doencas_transmissiveis.*' => [ 'required', 'integer', 'distinct', Rule::exists(DoencaTransmissivel::class, 'id'), ], ]; } private static function getAvaliacaoRastreamentosValidations() { return [ 'avaliacao.rastreamentos' => [ 'present', 'array', ], 'avaliacao.rastreamentos.*' => [ 'required', 'integer', 'distinct', Rule::exists(Rastreamento::class, 'id'), ], ]; } private static function getAvaliacaoProblemasCondicoesValidations() { $rules = [ 'avaliacao.problemas_condicoes' => [ 'present', 'array', ], ]; foreach ((request()->avaliacao['problemas_condicoes'] ?? []) as $i => $problemaCondicao) { $rules["avaliacao.problemas_condicoes.{$i}.id"] = [ 'nullable', 'integer', Rule::exists(AtendimentoSoapProblemaCondicao::class, 'id'), ]; $rules["avaliacao.problemas_condicoes.{$i}.automatico"] = [ 'nullable', 'boolean', ]; $rules["avaliacao.problemas_condicoes.{$i}.ciap_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($problemaCondicao['cid_id'])), 'integer', Rule::exists(Ciap::class, 'id'), ]; $rules["avaliacao.problemas_condicoes.{$i}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($problemaCondicao['ciap_id'])), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["avaliacao.problemas_condicoes.{$i}.situacao_id"] = [ 'nullable', Rule::requiredIf(fn () => isset($problemaCondicao['id'])), 'integer', Rule::exists(ProblemaCondicaoSituacao::class, 'id'), ]; $rules["avaliacao.problemas_condicoes.{$i}.observacao"] = [ 'nullable', 'string', 'max:5000', ]; if (!isset($problemaCondicao['situacao_id'])) { continue; } $rules["avaliacao.problemas_condicoes.{$i}.inicio"] = [ 'nullable', 'date_format:d/m/Y', ]; if (isset($problemaCondicao['fim'])) { $rules["avaliacao.problemas_condicoes.{$i}.inicio"][] = 'before_or_equal:' . $problemaCondicao['fim']; } $rules["avaliacao.problemas_condicoes.{$i}.fim"] = [ 'nullable', 'date_format:d/m/Y', ]; if (isset($problemaCondicao['inicio'])) { $rules["avaliacao.problemas_condicoes.{$i}.fim"][] = 'after_or_equal:' . $problemaCondicao['inicio']; } } return $rules; } private static function getAvaliacaoPreNatalValidations() { return array_merge(self::getPreNatalValidations('avaliacao'), [ 'avaliacao.pre_natal.desfecho_em' => [ 'nullable', 'date_format:d/m/Y' ], ]); } private static function getPreNatalValidations($prefix) { return [ "{$prefix}.pre_natal.gravidez_tipo_id" => [ 'nullable', 'integer', Rule::exists(GravidezTipo::class, 'id'), ], "{$prefix}.pre_natal.altura_uterina" => [ 'nullable', 'integer', 'max:99', ], "{$prefix}.pre_natal.edema_id" => [ 'nullable', 'integer', Rule::exists(GravidezEdema::class, 'id'), ], "{$prefix}.pre_natal.movimentacao_fetal" => [ 'nullable', 'boolean', ], "{$prefix}.pre_natal.gravidez_planejada" => [ 'nullable', 'boolean', ], "{$prefix}.pre_natal.batimento_cardiaco_fetal" => [ 'nullable', 'integer', 'max:999', ], ]; } private static function getAvaliacaoAlergiasReacoesAdversasValidations() { return [ 'avaliacao.alergias_reacoes_adversas' => [ 'present', 'array', ], 'avaliacao.alergias_reacoes_adversas.*.alergia_id' => [ 'required', 'integer', 'distinct', Rule::exists(Alergia::class, 'id'), ], 'avaliacao.alergias_reacoes_adversas.*.criticidade_id' => [ 'required', 'integer', Rule::exists(AlergiaCriticidade::class, 'id'), ], 'avaliacao.alergias_reacoes_adversas.*.reacoes_observacoes' => [ 'nullable', 'string', 'between:3,100', ], ]; } private static function getAvaliacaoSaudeBucalValidations() { return array_merge( [ 'avaliacao.saude_bucal.necessidade_protese_inferior_superior' => [ 'nullable', 'boolean', ], ], self::getAvaliacaoSaudeBucalVigilanciasValidations() ); } private static function getAvaliacaoSaudeBucalVigilanciasValidations() { return [ 'avaliacao.saude_bucal.vigilancias' => [ 'present', 'array', ], 'avaliacao.saude_bucal.vigilancias.*' => [ 'required', 'integer', 'distinct', Rule::exists(SaudeBucalVigilancia::class, 'id'), ], ]; } private static function getPlanoValidations() { return array_merge( [ 'plano.descricao' => [ 'nullable', 'string', 'max:5000', ], ], self::getPlanoIntervencoesValidations(), self::getPlanoProcedimentosClinicosValidations(), self::getPlanoSaudeBucalValidations(), self::getPlanoPrescricoesMedicamentosValidations(), self::getPlanoSolicitacaoExamesComunsValidations(), self::getPlanoExamesSolicitadosValidations(), self::getPlanoTriagensNeonatalSolicitadosValidations(), self::getPlanoSolicitacaoExamesAltoCustoValidations(), self::getPlanoSolicitacaoProcedimentosCirurgicosValidations(), self::getPlanoTestesRapidoValidations(), self::getPlanoAtestadosValidations(), self::getPlanoDeclaracoesComparecimentoValidations(), self::getPlanoOrientacoesValidations(), self::getPlanoCartasMedicasValidations(), self::getPlanoEncaminhamentosValidations(), self::getPlanoCompartilhamentosCuidadoValidations() ); } private static function getPlanoIntervencoesValidations() { return [ 'plano.intervencoes' => [ 'present', 'array', ], 'plano.intervencoes.*.ciap_id' => [ 'required', 'integer', 'distinct', Rule::exists(Ciap::class, 'id'), ], 'plano.intervencoes.*.observacao' => [ 'nullable', 'string', 'max:500', ], ]; } private static function getPlanoProcedimentosClinicosValidations() { $rules = [ 'plano.procedimentos_clinicos' => [ 'present', 'array', ], ]; foreach ((request()->plano['procedimentos_clinicos'] ?? []) as $i => $procedimento) { $rules["plano.procedimentos_clinicos.{$i}.procedimento_id"] = [ 'required', 'integer', 'distinct', Rule::exists(Procedimento::class, 'id'), ]; $rules["plano.procedimentos_clinicos.{$i}.cid_id"] = [ function ($attribute, $value, $fail) use ($procedimento) { $procedimentoModel = Procedimento::find($procedimento['procedimento_id']); $hasCidPrincipal = $procedimentoModel->has_cid_principal ?? false; if (!$hasCidPrincipal) { return; } if (empty($value)) { $fail("O CID é obrigatório para o procedimento {$procedimentoModel->nome}."); return; } if (!filter_var($value, FILTER_VALIDATE_INT)) { $fail("O CID informado para o procedimento {$procedimentoModel->nome} deve ser um número inteiro."); return; } if (!Cid::where('id', $value)->exists()) { $fail("O CID informado para o procedimento {$procedimentoModel->nome} não existe."); } }, ]; $rules["plano.procedimentos_clinicos.{$i}.automatico"] = [ 'required', 'boolean', ]; $rules["plano.procedimentos_clinicos.{$i}.quantidade"] = [ 'required', 'integer', new QuantidadeIsValidForProcedimento($procedimento['procedimento_id']), ]; $rules["plano.procedimentos_clinicos.{$i}.observacao"] = [ 'nullable', 'string', 'max:500', ]; } return $rules; } private static function getPlanoSaudeBucalValidations() { $isProfissionalSaudeBucal = self::isProfissionalSaudeBucal(); return array_merge( self::getPlanoSaudeBucalOdontogramaValidations($isProfissionalSaudeBucal) ); } private static function getPlanoSaudeBucalOdontogramaValidations($isProfissionalSaudeBucal) { return array_merge( [ 'plano.saude_bucal.odontograma.possui_aparelho' => [ 'nullable', Rule::requiredIf(fn () => $isProfissionalSaudeBucal), 'boolean', ], 'plano.saude_bucal.odontograma.possui_contencao' => [ 'nullable', Rule::requiredIf(fn () => $isProfissionalSaudeBucal), 'boolean', ], ], self::getPlanoSaudeBucalOdontogramaArcadasValidations($isProfissionalSaudeBucal, 'superior'), self::getPlanoSaudeBucalOdontogramaArcadasValidations($isProfissionalSaudeBucal, 'inferior'), self::getPlanoSaudeBucalOdontogramaDentesSupranumerariosValidations($isProfissionalSaudeBucal) ); } private static function getPlanoSaudeBucalOdontogramaArcadasValidations($isProfissionalSaudeBucal, $posicao) { return array_merge( [ "plano.saude_bucal.odontograma.arcadas.{$posicao}.possui_protese_total" => [ 'nullable', Rule::requiredIf(fn () => $isProfissionalSaudeBucal), 'boolean', ], "plano.saude_bucal.odontograma.arcadas.{$posicao}.observacao" => [ 'nullable', 'string', 'max:5000', ], ], self::getPlanoSaudeBucalOdontogramaArcadasProcedimentosValidations($posicao), self::getPlanoSaudeBucalOdontogramaArcadasDentesValidations($posicao), ); } private static function getPlanoSaudeBucalOdontogramaArcadasProcedimentosValidations($posicao) { $rules = [ "plano.saude_bucal.odontograma.arcadas.{$posicao}.procedimentos" => [ 'present', 'array', ], ]; $procedimentos = request()->plano['saude_bucal']['odontograma']['arcadas'][$posicao]['procedimentos'] ?? []; foreach ($procedimentos as $i => $procedimento) { $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.procedimentos.{$i}.procedimento_id"] = [ 'required', 'integer', Rule::exists(Procedimento::class, 'id'), ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.procedimentos.{$i}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => Procedimento::find($procedimento['procedimento_id'])->has_cid_principal ?? false), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.procedimentos.{$i}.quantidade"] = [ 'required', 'integer', new QuantidadeIsValidForProcedimento($procedimento['procedimento_id']), ]; } return $rules; } private static function getPlanoSaudeBucalOdontogramaArcadasDentesValidations($posicao) { $rules = [ "plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes" => [ 'present', 'array', ], ]; $dentes = request()->plano['saude_bucal']['odontograma']['arcadas'][$posicao]['dentes'] ?? []; foreach ($dentes as $i => $dente) { $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.dente_id"] = [ 'required', 'integer', Rule::exists(Dente::class, 'id'), ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.fragmentos.esquerda.is_tratado"] = [ 'nullable', 'boolean', ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.fragmentos.cima.is_tratado"] = [ 'nullable', 'boolean', ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.fragmentos.direita.is_tratado"] = [ 'nullable', 'boolean', ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.fragmentos.baixo.is_tratado"] = [ 'nullable', 'boolean', ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.fragmentos.centro.is_tratado"] = [ 'nullable', 'boolean', ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.problemas_condicoes"] = [ 'present', 'array', ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.problemas_condicoes.*"] = [ 'required', 'integer', Rule::exists(SaudeBucalDenteProblemaCondicao::class, 'id'), ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.observacao"] = [ 'nullable', 'string', 'max:5000', ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.procedimentos"] = [ 'present', 'array', ]; $procedimentos = $dente['procedimentos'] ?? []; foreach ($procedimentos as $j => $procedimento) { $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.procedimentos.{$j}.procedimento_id"] = [ 'required', 'integer', Rule::exists(Procedimento::class, 'id'), ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.procedimentos.{$j}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => Procedimento::find($procedimento['procedimento_id'])->has_cid_principal ?? false), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["plano.saude_bucal.odontograma.arcadas.{$posicao}.dentes.{$i}.procedimentos.{$j}.quantidade"] = [ 'required', 'integer', new QuantidadeIsValidForProcedimento($procedimento['procedimento_id']), ]; } } return $rules; } private static function getPlanoSaudeBucalOdontogramaDentesSupranumerariosValidations($isProfissionalSaudeBucal) { $rules = [ 'plano.saude_bucal.odontograma.dentes_supranumerarios' => [ 'present', 'array', ], 'plano.saude_bucal.odontograma.dentes_supranumerarios.*.local' => [ 'required', 'string', 'max:100', ], 'plano.saude_bucal.odontograma.dentes_supranumerarios.*.procedimentos' => [ 'required', 'array', ], 'plano.saude_bucal.odontograma.dentes_supranumerarios.*.observacao' => [ 'nullable', 'string', 'max:5000', ], ]; $procedimentos = request()->plano['saude_bucal']['odontograma']['dentes_supranumerarios']['procedimentos'] ?? []; foreach ($procedimentos as $i => $procedimento) { $rules["plano.saude_bucal.odontograma.dentes_supranumerarios.procedimentos.{$i}.procedimento_id"] = [ 'required', 'integer', Rule::exists(Procedimento::class, 'id'), ]; $rules["plano.saude_bucal.odontograma.dentes_supranumerarios.procedimentos.{$i}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => Procedimento::find($procedimento['procedimento_id'])->has_cid_principal ?? false), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["plano.saude_bucal.odontograma.dentes_supranumerarios.procedimentos.{$i}.quantidade"] = [ 'required', 'integer', new QuantidadeIsValidForProcedimento($procedimento['procedimento_id']), ]; } return $rules; } private static function getPlanoPrescricoesMedicamentosValidations() { $rules = [ 'plano.prescricoes_medicamentos' => [ 'present', 'array', ], ]; foreach ((request()->plano['prescricoes_medicamentos'] ?? []) as $i => $prescricao) { $rules["plano.prescricoes_medicamentos.{$i}.medicamentos"] = [ 'required', 'array', ]; foreach (($prescricao['medicamentos'] ?? []) as $j => $medicamento) { $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.is_manual"] = [ 'required', 'boolean', ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.recomendacoes"] = [ 'nullable', 'string', ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.prescricao_medicamento_item_anterior_id"] = [ 'nullable', 'integer', Rule::exists(AtendimentoSoapPrescricaoMedicamentoItem::class, 'id') ]; if (!isset($medicamento['is_manual'])) { continue; } if ($medicamento['is_manual']) { $parametrizacao = ParametrizacaoAtendimento::first(); $receitaNaoPadronizadaJustificativaObrigatoria = $parametrizacao && $parametrizacao->receita_nao_padronizada_justificativa_obrigatoria ? true : false; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.descricao"] = [ 'required', 'string', 'max:5000', ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.justificativa"] = [ 'nullable', Rule::requiredIf(fn () => $receitaNaoPadronizadaJustificativaObrigatoria), 'string', 'max:300', ]; } else { $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.material_id"] = [ 'required', 'integer', 'distinct', Rule::exists(Material::class, 'id'), ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.unidade_medida_id"] = [ 'required', 'integer', Rule::exists(UnidadeMedida::class, 'id'), ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.dose"] = [ 'required', 'string', 'max:50', ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.is_dose_unica"] = [ 'required', 'boolean', ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.is_uso_continuo"] = [ 'required', 'boolean', ]; if (!isset($medicamento['is_dose_unica']) || !isset($medicamento['is_uso_continuo']) ) { continue; } if ($medicamento['is_dose_unica'] && $medicamento['is_uso_continuo']) { $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.is_dose_unica"][] = "different:plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.is_uso_continuo"; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.is_uso_continuo"][] = "different:plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.is_dose_unica"; } else { $frequenciaDose = $medicamento['frequencia_dose'] ?? null; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.frequencia_dose"] = [ 'nullable', Rule::requiredIf(fn () => !$medicamento['is_dose_unica']), Rule::in([ PrescricaoFrequenciaDose::INTERVALO, PrescricaoFrequenciaDose::FREQUENCIA, PrescricaoFrequenciaDose::TURNO, ]), ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.frequencia_vezes"] = [ 'nullable', Rule::requiredIf(fn() => $frequenciaDose === PrescricaoFrequenciaDose::FREQUENCIA && !$medicamento['is_dose_unica']), 'integer', 'max:99' ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.turno_id"] = [ 'nullable', Rule::requiredIf(fn () => $frequenciaDose === PrescricaoFrequenciaDose::TURNO && !$medicamento['is_dose_unica']), 'integer', Rule::exists(Turno::class, 'id'), ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.intervalo"] = [ 'nullable', Rule::requiredIf(fn () => !$medicamento['is_dose_unica']), 'integer', 'max:99', ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.intervalo_medida_tempo_id"] = [ 'nullable', Rule::requiredIf(fn () => !$medicamento['is_dose_unica']), 'integer', Rule::exists(MedidaTempo::class, 'id'), ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.inicio"] = [ 'required', 'date_format:d/m/Y', ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.duracao"] = [ 'nullable', 'integer', 'max:999', ]; $rules["plano.prescricoes_medicamentos.{$i}.medicamentos.{$j}.duracao_medida_tempo_id"] = [ 'nullable', Rule::requiredIf(fn () => isset($medicamento['duracao'])), 'integer', Rule::exists(MedidaTempo::class, 'id'), ]; } } } } return $rules; } private static function getPlanoSolicitacaoExamesComunsValidations() { return [ 'plano.solicitacoes_exames_comuns' => [ 'present', 'array', ], 'plano.solicitacoes_exames_comuns.*.cid_id' => [ 'nullable', 'integer', Rule::exists(Cid::class, 'id'), ], 'plano.solicitacoes_exames_comuns.*.ciap_id' => [ 'nullable', 'integer', Rule::exists(Ciap::class, 'id'), ], 'plano.solicitacoes_exames_comuns.*.classificacao_risco_id' => [ 'required', 'integer', Rule::exists(ClassificacaoRisco::class, 'id'), ], 'plano.solicitacoes_exames_comuns.*.justificativa' => [ 'required', 'string', 'max:5000', ], 'plano.solicitacoes_exames_comuns.*.observacao' => [ 'nullable', 'string', 'max:500', ], 'plano.solicitacoes_exames_comuns.*.exames' => [ 'required', 'array', ], 'plano.solicitacoes_exames_comuns.*.exames.*.exame_id' => [ 'required', 'integer', Rule::exists(Exame::class, 'id'), ], ]; } private static function getPlanoExamesSolicitadosValidations() { return [ 'plano.exame_solicitado' => [ 'present', 'array', ], 'plano.exame_solicitado.cid_id' => [ 'nullable', 'integer', Rule::exists(Cid::class, 'id'), ], 'plano.exame_solicitado.ciap_id' => [ 'nullable', 'integer', Rule::exists(Ciap::class, 'id'), ], 'plano.exame_solicitado.justificativa' => [ 'nullable', 'string', 'max:500', ], 'plano.exame_solicitado.observacao' => [ 'nullable', 'string', 'max:500', ], 'plano.exame_solicitado.exames' => [ 'nullable', 'array', ], 'plano.exame_solicitado.exames.*.exame_id' => [ 'nullable', 'integer', Rule::exists(Exame::class, 'id'), ], ]; } private static function getPlanoTriagensNeonatalSolicitadosValidations() { return [ 'plano.triagem_neonatal' => [ 'present', 'array', ], 'plano.triagem_neonatal.cid_id' => [ 'nullable', 'integer', Rule::exists(Cid::class, 'id'), ], 'plano.triagem_neonatal.ciap_id' => [ 'nullable', 'integer', Rule::exists(Ciap::class, 'id'), ], 'plano.triagem_neonatal.justificativa' => [ 'nullable', 'string', 'max:500', ], 'plano.triagem_neonatal.observacao' => [ 'nullable', 'string', 'max:500', ], 'plano.triagem_neonatal.exames' => [ 'nullable', 'array', ], 'plano.triagem_neonatal.exames.*.exame_id' => [ 'nullable', 'integer', Rule::exists(Exame::class, 'id'), ], ]; } private static function getPlanoSolicitacaoExamesAltoCustoValidations() { $rules = [ 'plano.solicitacoes_exames_alto_custo' => [ 'present', 'array', ], ]; foreach ((request()->plano['solicitacoes_exames_alto_custo'] ?? []) as $i => $solicitacao) { $rules["plano.solicitacoes_exames_alto_custo.{$i}.ciap_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($solicitacao['cid_id'])), 'integer', Rule::exists(Ciap::class, 'id'), ]; $rules["plano.solicitacoes_exames_alto_custo.{$i}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($solicitacao['ciap_id'])), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["plano.solicitacoes_exames_alto_custo.{$i}.classificacao_risco_id"] = [ 'required', 'integer', Rule::exists(ClassificacaoRisco::class, 'id'), ]; $rules["plano.solicitacoes_exames_alto_custo.{$i}.justificativa"] = [ 'nullable', 'string', 'max:5000', ]; $rules["plano.solicitacoes_exames_alto_custo.{$i}.observacao"] = [ 'nullable', 'string', 'max:1500', ]; $rules["plano.solicitacoes_exames_alto_custo.{$i}.exames"] = [ 'required', 'array', ]; $rules["plano.solicitacoes_exames_alto_custo.{$i}.exames.*.exame_id"] = [ 'required', 'integer', Rule::exists(Exame::class, 'id'), ]; } return $rules; } private static function getPlanoSolicitacaoProcedimentosCirurgicosValidations() { $rules = [ 'plano.solicitacoes_procedimentos_cirurgicos' => [ 'present', 'array', ], ]; foreach ((request()->plano['solicitacoes_procedimentos_cirurgicos'] ?? []) as $i => $solicitacao) { $rules["plano.solicitacoes_procedimentos_cirurgicos.{$i}.ciap_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($solicitacao['cid_id'])), 'integer', Rule::exists(Ciap::class, 'id'), ]; $rules["plano.solicitacoes_procedimentos_cirurgicos.{$i}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($solicitacao['ciap_id'])), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["plano.solicitacoes_procedimentos_cirurgicos.{$i}.classificacao_risco_id"] = [ 'required', 'integer', Rule::exists(ClassificacaoRisco::class, 'id'), ]; $rules["plano.solicitacoes_procedimentos_cirurgicos.{$i}.justificativa"] = [ 'nullable', 'string', 'max:5000', ]; $rules["plano.solicitacoes_procedimentos_cirurgicos.{$i}.observacao"] = [ 'nullable', 'string', 'max:1500', ]; $rules["plano.solicitacoes_procedimentos_cirurgicos.{$i}.procedimentos_cirurgicos"] = [ 'required', 'array', ]; $rules["plano.solicitacoes_procedimentos_cirurgicos.{$i}.procedimentos_cirurgicos.*.procedimento_cirurgico_id"] = [ 'required', 'integer', Rule::exists(ProcedimentoCirurgico::class, 'id'), ]; } return $rules; } private static function getPlanoTestesRapidoValidations() { return [ 'plano.testes_rapidos' => [ 'present', 'array', ], 'plano.testes_rapidos.*.id' => [ 'required', 'integer', 'distinct', Rule::exists(TesteRapido::class, 'id'), ], 'plano.testes_rapidos.*.resultado' => [ 'nullable', 'string', 'max:500', ], ]; } private static function getPlanoAtestadosValidations() { return [ 'plano.atestados' => [ 'present', 'array', ], 'plano.atestados.*.modelo_id' => [ 'required', 'integer', Rule::exists(AtestadoModelo::class, 'id'), ], 'plano.atestados.*.descricao' => [ 'nullable', 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::EM_BRANCO, 'string', 'max:5000', ], 'plano.atestados.*.nome_acompanhante' => [ 'nullable', 'string', 'max:150', ], 'plano.atestados.*.documento_tipo_id' => [ 'nullable', 'integer', Rule::exists(DocumentoTipo::class, 'id'), ], 'plano.atestados.*.cpf' => [ 'nullable', 'required_if:atestados.*.documento_tipo_id,' . DocumentoTipoEnum::CPF, new Cpf, ], 'plano.atestados.*.cns' => [ 'nullable', 'required_if:atestados.*.documento_tipo_id,' . DocumentoTipoEnum::CNS, new Cns, ], 'plano.atestados.*.data' => [ 'nullable', 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::PADRAO, 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::PERIODO_MANHA, 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::PERIODO_TARDE, 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::PERIODO_NOITE, 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::QUANTIDADE_HORAS, 'date_format:d/m/Y' ], 'plano.atestados.*.horario' => [ 'nullable', 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::PADRAO, 'date_format:H:i' ], 'plano.atestados.*.dias' => [ 'nullable', 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::PADRAO, 'integer', 'max:999' ], 'plano.atestados.*.horario_inicial' => [ 'nullable', 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::QUANTIDADE_HORAS, 'date_format:H:i' ], 'plano.atestados.*.quantidade_horas' => [ 'nullable', 'required_if:atestados.*.modelo_id,' . AtestadoModeloEnum::QUANTIDADE_HORAS, 'integer', 'min:1', 'max:23' ], 'plano.atestados.*.cid_id' => [ 'nullable', 'integer', Rule::exists(Cid::class, 'id') ], ]; } private static function getPlanoDeclaracoesComparecimentoValidations() { return [ 'plano.declaracoes_comparecimento' => [ 'present', 'array', ], 'plano.declaracoes_comparecimento.*.nome_acompanhante' => [ 'nullable', 'string', 'max:150', ], 'plano.declaracoes_comparecimento.*.motivo_comparecimento' => [ 'nullable', 'string', 'max:1500', ], 'plano.declaracoes_comparecimento.*.turno_id' => [ 'nullable', 'integer', Rule::exists(Turno::class, 'id'), ], 'plano.declaracoes_comparecimento.*.entrada' => [ 'nullable', 'required_without:plano.declaracoes_comparecimento.*.turno_id', 'date_format:H:i', ], 'plano.declaracoes_comparecimento.*.saida' => [ 'nullable', 'required_without:plano.declaracoes_comparecimento.*.turno_id', 'date_format:H:i', ], ]; } private static function getPlanoOrientacoesValidations() { return [ 'plano.orientacoes' => [ 'present', 'array', ], 'plano.orientacoes.*.descricao' => [ 'required', 'string', 'max:5000', ], ]; } private static function getPlanoCartasMedicasValidations() { return [ 'plano.cartas_medicas' => [ 'present', 'array', ], 'plano.cartas_medicas.*.descricao' => [ 'required', 'string', 'max:5000', ], ]; } private static function getPlanoEncaminhamentosValidations() { $rules = [ 'plano.encaminhamentos' => [ 'present', 'array', ], ]; foreach ((request()->plano['encaminhamentos'] ?? []) as $i => $encaminhamento) { $rules["plano.encaminhamentos.{$i}.servico_especializado_ciap_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($encaminhamento['servico_especializado_cid_id']) && $encaminhamento['tipo_id'] === EncaminhamentoEnum::ENCAMINHAMENTO_PARA_SERVICO_ESPECIALIZADO), 'integer', Rule::exists(Ciap::class, 'id'), ]; $rules["plano.encaminhamentos.{$i}.servico_especializado_cid_id"] = [ 'nullable', Rule::requiredIf(fn () => !isset($encaminhamento['servico_especializado_ciap_id']) && $encaminhamento['tipo_id'] === EncaminhamentoEnum::ENCAMINHAMENTO_PARA_SERVICO_ESPECIALIZADO), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["plano.encaminhamentos.{$i}.tipo_id"] = [ 'required', 'integer', Rule::exists(Encaminhamento::class, 'id'), ]; $rules["plano.encaminhamentos.{$i}.servico_especializado_especialidade_id"] = [ 'nullable', Rule::requiredIf(fn () => $encaminhamento['tipo_id'] === EncaminhamentoEnum::ENCAMINHAMENTO_PARA_SERVICO_ESPECIALIZADO), 'integer', Rule::exists(Especialidade::class, 'id'), ]; $rules["plano.encaminhamentos.{$i}.servico_especializado_complemento"] = [ 'nullable', 'string', 'max:100', ]; $rules["plano.encaminhamentos.{$i}.servico_especializado_classificacao_risco_id"] = [ 'nullable', Rule::requiredIf(fn () => $encaminhamento['tipo_id'] === EncaminhamentoEnum::ENCAMINHAMENTO_PARA_SERVICO_ESPECIALIZADO), 'integer', Rule::exists(ClassificacaoRisco::class, 'id'), ]; $rules["plano.encaminhamentos.{$i}.servico_especializado_motivo"] = [ 'nullable', 'string', 'max:5000', ]; $rules["plano.encaminhamentos.{$i}.servico_especializado_observacao"] = [ 'nullable', 'string', 'max:500', ]; $rules["plano.encaminhamentos.{$i}.intersetorial_infraestrutura_id"] = [ 'nullable', Rule::requiredIf(fn () => $encaminhamento['tipo_id'] === EncaminhamentoEnum::ENCAMINHAMENTO_INTERSETORIAL), 'integer', Rule::exists(Infraestrutura::class, 'id'), ]; } return $rules; } private static function getPlanoCompartilhamentosCuidadoValidations() { return [ 'plano.compartilhamentos_cuidado' => [ 'present', 'array', ], 'plano.compartilhamentos_cuidado.*.especialidade_id' => [ 'nullable', 'integer', Rule::exists(Especialidade::class, 'id'), ], 'plano.compartilhamentos_cuidado.*.usuario_id' => [ 'required', 'integer', Rule::exists(Usuario::class, 'id'), ], 'plano.compartilhamentos_cuidado.*.ciap_id' => [ 'nullable', 'required_without:plano.compartilhamentos_cuidado.*.cid_id', 'integer', Rule::exists(Ciap::class, 'id'), ], 'plano.compartilhamentos_cuidado.*.cid_id' => [ 'nullable', 'required_without:plano.compartilhamentos_cuidado.*.ciap_id', 'integer', Rule::exists(Cid::class, 'id'), ], 'plano.compartilhamentos_cuidado.*.classificacao_risco_id' => [ 'required', 'integer', Rule::exists(ClassificacaoRisco::class, 'id'), ], 'plano.compartilhamentos_cuidado.*.discussao_caso_clinico' => [ 'required', 'string', 'max:500', ], ]; } private static function getRaasValidations() { return [ 'raas' => [ 'present', 'array' ], 'raas.origem_paciente_id' => [ 'nullable', 'integer', Rule::exists(OrigemPaciente::class, 'id'), ], 'raas.destino_paciente_id' => [ 'nullable', 'integer', Rule::exists(DestinoPaciente::class, 'id'), ], 'raas.motivo_saida_permanencia_id' => [ 'nullable', 'integer', Rule::exists(MotivoSaidaPermanencia::class, 'id'), ], 'raas.carater_atendimento_id' => [ 'nullable', 'integer', Rule::exists(CaraterAtendimento::class, 'id'), ], 'raas.numero_autorizacao' => [ 'nullable', 'digits_between:1,13', ], 'raas.classificacao_id' => [ 'nullable', 'integer', Rule::exists(SigtapClassificacao::class, 'id'), ], 'raas.local_realizacao_exame_id' => [ 'nullable', 'integer', Rule::exists(LocalRealizacaoExame::class, 'id'), ], ]; } private static function getFinalizacaoValidations($fila = null) { return array_merge( [ 'finalizacao.atendimento_tipo_id' => [ 'required', 'integer', Rule::exists(TipoAtendimento::class, 'id'), ], 'finalizacao.atendimento_compartilhado_usuario_id' => [ 'nullable', 'integer', Rule::exists(Usuario::class, 'id'), ], 'finalizacao.racionalidade_saude_id' => [ 'nullable', 'integer', Rule::exists(RacionalidadeSaude::class, 'id'), ], 'finalizacao.equipe_id' => [ 'nullable', 'integer', Rule::exists(Equipe::class, 'id'), ], 'finalizacao.atencao_basica_local_atendimento_id' => [ 'nullable', 'required_with:finalizacao.equipe_id', 'integer', Rule::exists(LocalAtendimento::class, 'id'), ], 'finalizacao.turno_id' => [ 'nullable', 'required_with:finalizacao.equipe_id', 'integer', Rule::exists(Turno::class, 'id'), ], 'finalizacao.oci_desfecho_etapa_clinica_id' => [ 'nullable', 'integer', Rule::exists(EtapaClinica::class, 'id'), ], 'finalizacao.apac_motivo_saida_permanencia_id' => [ 'nullable', Rule::requiredIf(fn () => request()->finalizacao['oci_desfecho_etapa_clinica_id'] === EtapaClinicaEnum::ALTA), 'integer', Rule::exists(ApacMotivoSaidaPermanencia::class, 'id'), ], ], self::getFinalizacaoProcedimentosAdministrativosValidations(), self::getFinalizacaoCasosSuspeitosValidations(), self::getFinalizacaoCondutasValidations(), self::getFinalizacaoSaudeBucalValidations(), self::getFinalizacaoDesfechoValidations($fila), ); } private static function getFinalizacaoProcedimentosAdministrativosValidations() { $rules = [ 'finalizacao.procedimentos_administrativos' => [ 'present', 'array', ], ]; foreach ((request()->finalizacao['procedimentos_administrativos'] ?? null) as $i => $procedimento) { $rules["finalizacao.procedimentos_administrativos.{$i}.procedimento_id"] = [ 'required', 'integer', 'distinct', Rule::exists(Procedimento::class, 'id'), ]; $rules["finalizacao.procedimentos_administrativos.{$i}.cid_id"] = [ 'nullable', Rule::requiredIf(fn () => Procedimento::find($procedimento['procedimento_id'])->has_cid_principal ?? false), 'integer', Rule::exists(Cid::class, 'id'), ]; $rules["finalizacao.procedimentos_administrativos.{$i}.automatico"] = [ 'required', 'boolean', ]; $rules["finalizacao.procedimentos_administrativos.{$i}.quantidade"] = [ 'required', 'integer', new QuantidadeIsValidForProcedimento($procedimento['procedimento_id']), ]; } return $rules; } private static function getFinalizacaoCasosSuspeitosValidations() { return [ 'finalizacao.casos_suspeitos' => [ 'present', 'array', ], 'finalizacao.casos_suspeitos.*' => [ 'required', 'integer', 'distinct', Rule::exists(CasoSuspeito::class, 'id'), ], ]; } private static function getFinalizacaoCondutasValidations() { return [ 'finalizacao.condutas' => [ 'present', 'array', ], 'finalizacao.condutas.*' => [ 'required', 'integer', 'distinct', Rule::exists(Conduta::class, 'id'), ], ]; } private static function getFinalizacaoSaudeBucalValidations() { $isProfissionalSaudeBucal = self::isProfissionalSaudeBucal(); return array_merge( [ 'finalizacao.saude_bucal.consulta_tipo_id' => [ 'nullable', Rule::requiredIf(fn () => $isProfissionalSaudeBucal && !self::isRascunho()), 'integer', Rule::exists(TipoConsulta::class, 'id'), ], ], self::getFinalizacaoSaudeBucalFornecimentosValidations() ); } private static function getFinalizacaoSaudeBucalFornecimentosValidations() { return [ 'finalizacao.saude_bucal.fornecimentos' => [ 'present', 'array' ], 'finalizacao.saude_bucal.fornecimentos.*' => [ 'required', 'integer', 'distinct', Rule::exists(SaudeBucalFornecimento::class, 'id'), ], ]; } private static function getFinalizacaoDesfechoValidations($fila = null) { return array_merge( [ 'finalizacao.desfecho.finalizado' => [ 'nullable', Rule::requiredIf(fn () => !self::isRascunho()), 'boolean', ], 'finalizacao.desfecho.usuario_id' => [ 'nullable', 'required_with:finalizacao.desfecho.ocupacao_id', 'integer', Rule::exists(Usuario::class, 'id'), ], 'finalizacao.desfecho.ocupacao_id' => [ 'nullable', 'required_with:finalizacao.desfecho.especialidade_id', 'integer', Rule::exists(Ocupacao::class, 'id'), ], 'finalizacao.desfecho.especialidade_id' => [ 'nullable', 'integer', Rule::exists(Especialidade::class, 'id'), ], 'finalizacao.desfecho.prioridade_id' => [ 'nullable', Rule::requiredIf(fn () => $fila->opcaoEntrada->prioridade_obrigatoria ?? false), Rule::exists(Prioridade::class, 'id'), ], 'finalizacao.desfecho.pos_consulta' => [ 'nullable', 'required_with:finalizacao.desfecho.centro_custo_encaminhamento_id', 'boolean', ], ], self::getFinalizacaoDesfechoServicosValidations(), ); } private static function getFinalizacaoDesfechoServicosValidations() { return [ 'finalizacao.desfecho.servicos' => [ 'present', 'array' ], 'finalizacao.desfecho.servicos.*' => [ 'required', 'integer', 'distinct', Rule::exists(Servico::class, 'id'), ], ]; } private static function isRascunho() { return request()->is_rascunho === true; } private static function isProfissionalSaudeBucal() { return Str::startsWith(self::getCurrentLotacao()->ocupacao->codigo, '2232'); } private static function faturaProcedimentoRaas() { return ParametrizacaoInfraestrutura::where('infraestrutura_id', self::getCurrentCentroCusto()->infraestrutura_id) ->pluck('fatura_procedimento_raas') ->first(); } private static function getProtocoloFechamento($agendamentoId) { return DB::table('ambulatorio_agendamento') ->select([ 'regulacao_parametrizacao_prestador_interno.controla_protocolo_fechamento', 'regulacao_solicitacao.numero', ]) ->join('regulacao_solicitacao', 'regulacao_solicitacao.id', 'ambulatorio_agendamento.regulacao_solicitacao_id') ->join('regulacao_parametrizacao_prestador_interno', 'regulacao_parametrizacao_prestador_interno.id', 'regulacao_solicitacao.prestador_interno_id') ->where('ambulatorio_agendamento.id', $agendamentoId) ->where('regulacao_parametrizacao_prestador_interno.infraestrutura_id', self::getCurrentCentroCusto()->infraestrutura_id) ->first(); } private static function precisaInformarConclusaoTratamento($atendimento) { return self::isProfissionalSaudeBucal() && ($atendimento->especialidade->precisa_informar_conclusao_tratamento ?? false); } public static function saveLogImpressao($atendimentoId, $impressaoTipoId) { return AtendimentoImpressaoLog::create([ 'atendimento_id' => $atendimentoId, 'impressao_tipo_id' => $impressaoTipoId, 'lotacao_id' => self::getCurrentLotacao()->id, 'impresso_em' => Carbon::now(), ]); } private static function criaFichaAtencaoBasica() { $isOocupacaoParametrizadaMarcadorConsumoAlimentar = OutrosPermissaoOcupacao::where( 'ocupacao', self::getCurrentLotacao()->ocupacao->codigo ) ->where('permissao_id', AtencaoBasicaPermissao::MARCADORES_DE_CONSUMO_ALIMENTAR) ->exists(); return (self::isProfissionalSaudeBucal() ? self::criaFicha('atendimento-odontologico') : self::criaFicha('atendimento-individual')) || self::criaFicha('atendimento-domiciliar') || self::criaFicha('avaliacao') || (self::criaFicha('marcador-consumo-alimentar') && $isOocupacaoParametrizadaMarcadorConsumoAlimentar); } public static function storeFeridaProcedimento() { $soapId = request()->soap_id; $feridaData = request()->ferida; $procedimentoData = request()->procedimento; $soap = AtendimentoSoap::findOrFail($soapId); return DB::transaction(function () use ($soap, $feridaData, $procedimentoData) { $dadosFerida = []; if (isset($feridaData['data'])) { $feridaData['data'] = Carbon::createFromFormat('d/m/Y', $feridaData['data']); $dadosFerida['data'] = $feridaData['data']; } if (array_key_exists('tipo_id', $feridaData)) $dadosFerida['ferida_id'] = $feridaData['tipo_id']; if (array_key_exists('local_anatomico_id', $feridaData)) $dadosFerida['local_anatomico_id'] = $feridaData['local_anatomico_id']; if (array_key_exists('local_anatomico_regiao_id', $feridaData)) $dadosFerida['local_anatomico_regiao_id'] = $feridaData['local_anatomico_regiao_id']; if (array_key_exists('exsudato_id', $feridaData)) $dadosFerida['ferida_exsudato_id'] = $feridaData['exsudato_id']; if (array_key_exists('necrose_id', $feridaData)) $dadosFerida['ferida_necrose'] = $feridaData['necrose_id']; if (array_key_exists('cicatrizada', $feridaData)) $dadosFerida['cicatrizada'] = $feridaData['cicatrizada']; if (array_key_exists('comprimento', $feridaData)) $dadosFerida['comprimento'] = $feridaData['comprimento']; if (array_key_exists('largura', $feridaData)) $dadosFerida['largura'] = $feridaData['largura']; if (array_key_exists('profundidade', $feridaData)) $dadosFerida['profundidade'] = $feridaData['profundidade']; if (array_key_exists('dor', $feridaData)) $dadosFerida['dor'] = $feridaData['dor']; if (array_key_exists('observacao', $feridaData)) $dadosFerida['observacao'] = $feridaData['observacao']; $ferida = null; if (isset($feridaData['id']) && is_numeric($feridaData['id'])) { $ferida = AtendimentoSoapFerida::find($feridaData['id']); if ($ferida && !empty($dadosFerida)) { $ferida->update($dadosFerida); } } if (!$ferida) { $ferida = $soap->feridas()->create($dadosFerida); } $feridaProcedimento = null; $feridaProcedimentoId = request()->id; if ($feridaProcedimentoId) { $feridaProcedimento = AtendimentoSoapFeridaProcedimento::find($feridaProcedimentoId); } if ($feridaProcedimento) { $atendimentoProcedimento = $feridaProcedimento->atendimentoProcedimento; if ($atendimentoProcedimento) { $atendimentoProcedimento->update([ 'procedimento_id' => $procedimentoData['procedimento']['id'], 'cid_id' => data_get($procedimentoData, 'cid.id'), 'quantidade' => $procedimentoData['quantidade'] ?? null, ]); } $procedimentoClinico = $soap->procedimentosClinicos() ->where('atendimento_procedimento_id', $atendimentoProcedimento->id) ->first(); if ($procedimentoClinico) { $procedimentoClinico->update([ 'observacao' => $procedimentoData['observacao'] ?? null, ]); } else { $soap->procedimentosClinicos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, 'observacao' => $procedimentoData['observacao'] ?? null, ]); } } else { $ocupacaoId = $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id; if (!ProcedimentoIsValidForOcupacao::isValid($ocupacaoId, $procedimentoData['procedimento']['id'])) { throw ValidationException::withMessages([ 'procedimento' => ['O procedimento não é permitido para o CBO do profissional.'] ]); } $atendimentoProcedimento = $soap->procedimentos()->create([ 'atendimento_id' => $soap->atendimento_id, 'procedimento_id' => $procedimentoData['procedimento']['id'], 'cid_id' => $procedimentoData['cid']['id'] ?? null, 'quantidade' => $procedimentoData['quantidade'] ?? null, 'automatico' => false, 'ocupacao_id' => $soap->atendimento->ocupacao->id ?? $soap->createdLotacao->ocupacao_id, 'especialidade_id' => $soap->atendimento->especialidade->id ?? null, 'usuario_id' => $soap->atendimento->usuario->id ?? $soap->createdLotacao->usuario_id, ]); $feridaProcedimento = $ferida->procedimentos()->create([ 'soap_id' => $soap->id, 'atendimento_procedimento_id' => $atendimentoProcedimento->id, ]); $soap->procedimentosClinicos()->create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, 'observacao' => $procedimentoData['observacao'] ?? null, ]); } if (!empty($procedimentoData['procedimento']['materiais']) && is_array($procedimentoData['procedimento']['materiais'])) { foreach ($procedimentoData['procedimento']['materiais'] as $material) { if (!empty($material['id'])) { $itemData = [ 'material_id' => $material['id'], 'quantidade' => $material['quantidade'], 'escolheu_entrada_item_manualmente' => $material['material_escolheu_entrada_item_manualmente'] ?? false, 'entrada_itens' => $material['material_entrada_itens'] ?? [], ]; $saidaItem = AlmoxarifadoService::saveSaidaDeDispensacaoDoAmbulatorio($itemData); AtendimentoSoapFeridaMaterial::create([ 'atendimento_procedimento_id' => $atendimentoProcedimento->id, 'material_id' => $material['id'], 'saida_item_id' => $saidaItem->id, ]); } } } return [ 'ferida_id' => $ferida->id, 'procedimento' => [ 'id' => $feridaProcedimento->id, 'procedimento' => $procedimentoData['procedimento'], 'cid' => $procedimentoData['cid'] ?? null, 'quantidade' => $procedimentoData['quantidade'] ?? null, 'automatico' => false ] ]; }); } public static function validarProcedimentosCbo() { $procedimentoIds = request()->procedimento_ids; $ocupacaoId = self::getCurrentLotacao()->ocupacao_id; return collect($procedimentoIds)->filter(function ($id) use ($ocupacaoId) { return ProcedimentoIsValidForOcupacao::isValid($ocupacaoId, $id); })->values(); } public static function destroyFeridaProcedimento($id) { return DB::transaction(function () use ($id) { $feridaProcedimento = AtendimentoSoapFeridaProcedimento::find($id); if (!$feridaProcedimento) { return true; } $atendimentoProcedimentoId = $feridaProcedimento->atendimento_procedimento_id; $feridaProcedimento->delete(); AtendimentoSoapFeridaMaterial::where('atendimento_procedimento_id', $atendimentoProcedimentoId)->delete(); AtendimentoSoapProcedimentoClinico::where('atendimento_procedimento_id', $atendimentoProcedimentoId) ->delete(); AtendimentoProcedimento::where('id', $atendimentoProcedimentoId) ->delete(); return true; }); } private static function getPerfisEpidemiologicosValidations() { return [ 'perfis_epidemiologicos' => [ 'present', 'array', ], 'perfis_epidemiologicos.*' => [ 'required', 'integer', 'distinct', Rule::exists(CadastroPerfilEpidemiologico::class, 'id'), ], ]; } private static function getPuericulturaQuestionarioMChatR($soapRascunho) { return PuericulturaQuestionarioMChatR::orderBy('id')->get()->map(function ($query) use ($soapRascunho) { if (!is_null($soapRascunho)) { $questionarioMChatRRascunho = $soapRascunho->puericulturaQuestionarioMChatR() ->where('questionario_m_chat_r_id', $query->id) ->first(); return [ 'id' => $query->id, 'descricao' => $query->descricao, 'valor_resposta_sim' => $query->valor_resposta_sim, 'valor_resposta_nao' => $query->valor_resposta_nao, 'resposta' => $questionarioMChatRRascunho->resposta ?? null, ]; } return [ 'id' => $query->id, 'descricao' => $query->descricao, 'valor_resposta_sim' => $query->valor_resposta_sim, 'valor_resposta_nao' => $query->valor_resposta_nao, 'resposta' => null, ]; }); } private static function savePuericulturaQuestionarioMChatR($soap) { $questionarioMChatR = collect(request()->objetivo['puericultura']['questionario_mchat_r']) ->filter(fn ($questionario) => !is_null($questionario['resposta'])) ->map(fn ($questionario) => [ 'questionario_m_chat_r_id' => $questionario['id'], 'resposta' => $questionario['resposta'], ]); $soap->puericulturaQuestionarioMChatR()->createMany($questionarioMChatR); } private static function getSoapsByPaciente($pacienteId) { return AtendimentoSoap::where('is_rascunho', false) ->whereHas('atendimento', function ($query) use ($pacienteId) { $query->where('paciente_id', $pacienteId); }) ->get(); } private static function saveIvcf($soap) { if (request()->ivcf && request()->ivcf['deseja_preencher'] === true) { $soap->ivcf()->create([ 'estado_saude_geral' => request()->ivcf['estado_saude_geral'], 'limitacao_compras' => request()->ivcf['limitacao_compras'], 'limitacao_gestao_financeira' => request()->ivcf['limitacao_gestao_financeira'], 'limitacao_tarefas_domesticas' => request()->ivcf['limitacao_tarefas_domesticas'], 'banho_independencia' => request()->ivcf['banho_independencia'], 'relato_esquecimento_por_terceiros' => request()->ivcf['relato_esquecimento_por_terceiros'], 'esquecimento_piorando' => request()->ivcf['esquecimento_piorando'], 'esquecimento_impacta_atividades' => request()->ivcf['esquecimento_impacta_atividades'], 'humor_tristeza_desanimo' => request()->ivcf['humor_tristeza_desanimo'], 'perda_interesse_atividades' => request()->ivcf['perda_interesse_atividades'], 'limitacao_elevar_bracos' => request()->ivcf['limitacao_elevar_bracos'], 'limitacao_motricidade_fina' => request()->ivcf['limitacao_motricidade_fina'], 'perda_peso_nao_intencional' => request()->ivcf['perda_peso_nao_intencional'], 'imc_abaixo_22' => request()->ivcf['imc_abaixo_22'], 'panturrilha_abaixo_31' => request()->ivcf['panturrilha_abaixo_31'], 'marcha_lenta_4m_maior_5s' => request()->ivcf['marcha_lenta_4m_maior_5s'], 'dificuldade_caminhar_impacto_atividades' => request()->ivcf['dificuldade_caminhar_impacto_atividades'], 'quedas_recorrentes' => request()->ivcf['quedas_recorrentes'], 'incontinencia' => request()->ivcf['incontinencia'], 'problema_visao_impacto_atividades' => request()->ivcf['problema_visao_impacto_atividades'], 'problema_audicao_impacto_atividades' => request()->ivcf['problema_audicao_impacto_atividades'], 'doencas_cronicas_multiplas' => request()->ivcf['doencas_cronicas_multiplas'], 'polifarmacia_5_ou_mais_medicamentos' => request()->ivcf['polifarmacia_5_ou_mais_medicamentos'], 'internacao_ultimos_6_meses' => request()->ivcf['internacao_ultimos_6_meses'], ]); } else { $soap->ivcf()->delete(); } } private static function saveRiscoCardiovascularFramingham($soap) { if (request()->risco_cardiovascular_framingham && request()->risco_cardiovascular_framingham['colesterol_total']) { $soap->riscoCardiovascularFramingham()->create([ 'colesterol_total' => request()->risco_cardiovascular_framingham['colesterol_total'], 'colesterol_hdl' => request()->risco_cardiovascular_framingham['colesterol_hdl'], 'toma_remedio_hipertensao' => request()->risco_cardiovascular_framingham['toma_remedio_hipertensao'], 'tabagista' => request()->risco_cardiovascular_framingham['tabagista'], 'diabetico' => request()->risco_cardiovascular_framingham['diabetico'], ]); } } private static function getHistoricoRiscoCardiovascularFraminghamFormData($atendimento) { $sexoId = $atendimento->paciente->cidadao->sexo->id ?? null; return $atendimento->soaps() ->where('is_rascunho', false) ->whereHas('riscoCardiovascularFramingham') ->with(['riscoCardiovascularFramingham']) ->get() ->map(function ($soap) use ($sexoId) { $idade = $soap->created_at->diffInYears($soap->atendimento->paciente->cidadao->data_nascimento); $riscoCardiovascularFramingham = $soap->riscoCardiovascularFramingham; $pressaoArterial = $soap->objetivoSinalVital->atendimentoSinalVital->pressao_arterial ?? null; $resultadoRiscoCardiovascularFramingham = self::getResultaRiscoCardiovascularFramingham( $sexoId, $idade, $riscoCardiovascularFramingham->colesterol_total, $riscoCardiovascularFramingham->colesterol_hdl, $pressaoArterial, $riscoCardiovascularFramingham->toma_remedio_hipertensao, $riscoCardiovascularFramingham->tabagista, $riscoCardiovascularFramingham->diabetico, ); return [ 'id' => $soap->id, 'data_hora_atendimento' => $soap->created_at->format('d/m/Y \à\s H:i'), 'usuario_nome' => $soap->createdLotacao->usuario->cidadao->nome ?? null, 'pontuacao' => $resultadoRiscoCardiovascularFramingham['pontuacao'], 'classificacao' => $resultadoRiscoCardiovascularFramingham['classificacao'], 'porcentagem' => $resultadoRiscoCardiovascularFramingham['porcentagem'], ]; }); } private static function getResultaRiscoCardiovascularFramingham($sexoId, $idade, $colesterolTotal, $colesterolHdl, $pressaoArterial, $tomaRemedioHipertensao, $tabagista, $diabetico) { $pontuacao = 0; $pontuacao += self::getPontuacaoIdadeRiscoCardiovascularFramingham($sexoId, $idade); $pontuacao += self::getPontuacaoColesterolTotalRiscoCardiovascularFramingham($sexoId, $idade, $colesterolTotal); $pontuacao += self::getPontuacaoColesterolHdlRiscoCardiovascularFramingham($colesterolHdl); $pontuacao += self::getPontuacaoPressaoArterialRiscoCardiovascularFramingham($sexoId, $pressaoArterial, $tomaRemedioHipertensao); $pontuacao += self::getPontuacaoTabagismoRiscoCardiovascularFramingham($sexoId, $idade, $tabagista); $pontuacao += self::getPontuacaoDiabetesRiscoCardiovascularFramingham($sexoId, $diabetico); $porcentagem = self::getPorcentagemRiscoCardiovascularFramingham($sexoId, $pontuacao); if ($porcentagem < 10) { $classificacao = 'Baixo risco'; } elseif ($porcentagem < 20) { $classificacao = 'Risco intermediário'; } else { $classificacao = 'Alto risco'; } return [ 'pontuacao' => $pontuacao, 'classificacao' => $classificacao, 'porcentagem' => $porcentagem, ]; } private static function getPontuacaoIdadeRiscoCardiovascularFramingham($sexoId, $idade) { if ($sexoId === Sexo::MASCULINO) { if ($idade >= 20 && $idade <= 34) return -9; if ($idade >= 35 && $idade <= 39) return -4; if ($idade >= 40 && $idade <= 44) return 0; if ($idade >= 45 && $idade <= 49) return 3; if ($idade >= 50 && $idade <= 54) return 6; if ($idade >= 55 && $idade <= 59) return 8; if ($idade >= 60 && $idade <= 64) return 10; if ($idade >= 65 && $idade <= 69) return 11; if ($idade >= 70 && $idade <= 74) return 12; if ($idade >= 75) return 13; } else { if ($idade >= 20 && $idade <= 34) return -7; if ($idade >= 35 && $idade <= 39) return -3; if ($idade >= 40 && $idade <= 44) return 0; if ($idade >= 45 && $idade <= 49) return 3; if ($idade >= 50 && $idade <= 54) return 6; if ($idade >= 55 && $idade <= 59) return 8; if ($idade >= 60 && $idade <= 64) return 10; if ($idade >= 65 && $idade <= 69) return 12; if ($idade >= 70 && $idade <= 74) return 14; if ($idade >= 75) return 16; } return 0; } private static function getPontuacaoColesterolTotalRiscoCardiovascularFramingham($sexoId, $idade, $colesterolTotal) { if ($colesterolTotal < 160) return 0; if ($sexoId === Sexo::MASCULINO) { if ($idade >= 20 && $idade <= 39) { if ($colesterolTotal <= 199) return 4; if ($colesterolTotal <= 239) return 7; if ($colesterolTotal <= 279) return 9; return 11; } elseif ($idade >= 40 && $idade <= 49) { if ($colesterolTotal <= 199) return 3; if ($colesterolTotal <= 239) return 5; if ($colesterolTotal <= 279) return 6; return 8; } elseif ($idade >= 50 && $idade <= 59) { if ($colesterolTotal <= 199) return 2; if ($colesterolTotal <= 239) return 3; if ($colesterolTotal <= 279) return 4; return 5; } elseif ($idade >= 60 && $idade <= 69) { if ($colesterolTotal <= 199) return 1; if ($colesterolTotal <= 239) return 1; if ($colesterolTotal <= 279) return 2; return 3; } else { if ($colesterolTotal <= 199) return 0; elseif ($colesterolTotal <= 239) return 1; elseif ($colesterolTotal <= 279) return 1; return 1; } } else { if ($idade >= 20 && $idade <= 39) { if ($colesterolTotal <= 199) return 4; if ($colesterolTotal <= 239) return 8; if ($colesterolTotal <= 279) return 11; return 13; } elseif ($idade >= 40 && $idade <= 49) { if ($colesterolTotal <= 199) return 3; if ($colesterolTotal <= 239) return 6; if ($colesterolTotal <= 279) return 8; return 10; } elseif ($idade >= 50 && $idade <= 59) { if ($colesterolTotal <= 199) return 2; if ($colesterolTotal <= 239) return 4; if ($colesterolTotal <= 279) return 5; return 7; } elseif ($idade >= 60 && $idade <= 69) { if ($colesterolTotal <= 199) return 1; if ($colesterolTotal <= 239) return 2; if ($colesterolTotal <= 279) return 3; return 4; } else { if ($colesterolTotal <= 199) return 1; if ($colesterolTotal <= 239) return 1; if ($colesterolTotal <= 279) return 2; return 2; } } } private static function getPontuacaoColesterolHdlRiscoCardiovascularFramingham($colesterolHdl) { if ($colesterolHdl >= 60) return -1; if ($colesterolHdl >= 50) return 0; if ($colesterolHdl >= 40) return 1; return 2; } private static function getPontuacaoPressaoArterialRiscoCardiovascularFramingham($sexoId, $pressaoArterial, $tomaRemedioHipertensao) { if (!$pressaoArterial) { return 0; } $partes = explode('/', $pressaoArterial); $sistolica = (int) ($partes[0] ?? 0); if ($sexoId === Sexo::MASCULINO) { if ($tomaRemedioHipertensao) { if ($sistolica < 120) return 0; if ($sistolica <= 129) return 1; if ($sistolica <= 139) return 2; if ($sistolica <= 159) return 2; return 3; } else { if ($sistolica < 120) return 0; if ($sistolica <= 129) return 0; if ($sistolica <= 139) return 1; if ($sistolica <= 159) return 1; return 2; } } else { if ($tomaRemedioHipertensao) { if ($sistolica < 120) return 0; if ($sistolica <= 129) return 3; if ($sistolica <= 139) return 4; if ($sistolica <= 159) return 5; return 6; } else { if ($sistolica < 120) return 0; if ($sistolica <= 129) return 1; if ($sistolica <= 139) return 2; if ($sistolica <= 159) return 3; return 4; } } } private static function getPontuacaoTabagismoRiscoCardiovascularFramingham($sexoId, $idade, $tabagista) { if (!$tabagista) { return 0; } if ($sexoId === Sexo::MASCULINO) { if ($idade >= 20 && $idade <= 39) return 8; if ($idade >= 40 && $idade <= 49) return 5; if ($idade >= 50 && $idade <= 59) return 3; if ($idade >= 60 && $idade <= 69) return 1; return 1; } else { if ($idade >= 20 && $idade <= 39) return 9; if ($idade >= 40 && $idade <= 49) return 7; if ($idade >= 50 && $idade <= 59) return 4; if ($idade >= 60 && $idade <= 69) return 2; return 1; } } private static function getPontuacaoDiabetesRiscoCardiovascularFramingham($sexoId, $diabetico) { if (!$diabetico) { return 0; } return $sexoId === Sexo::MASCULINO ? 2 : 4; } private static function getPorcentagemRiscoCardiovascularFramingham($sexoId, $pontuacao) { if ($sexoId === Sexo::MASCULINO) { if ($pontuacao <= 4) return 1; if ($pontuacao <= 6) return 2; if ($pontuacao === 7) return 3; if ($pontuacao === 8) return 4; if ($pontuacao === 9) return 5; if ($pontuacao === 10) return 6; if ($pontuacao === 11) return 8; if ($pontuacao === 12) return 10; if ($pontuacao === 13) return 12; if ($pontuacao === 14) return 16; if ($pontuacao === 15) return 20; if ($pontuacao === 16) return 25; return 30; } else { if ($pontuacao <= 12) return 1; if ($pontuacao <= 14) return 2; if ($pontuacao === 15) return 3; if ($pontuacao === 16) return 4; if ($pontuacao === 17) return 5; if ($pontuacao === 18) return 6; if ($pontuacao === 19) return 8; if ($pontuacao === 20) return 11; if ($pontuacao === 21) return 14; if ($pontuacao === 22) return 17; if ($pontuacao === 23) return 22; if ($pontuacao === 24) return 27; return 30; } } private static function demandaEspontaneaObservaVagaAtendimento($especialidadeId) { $response = false; if (isset($especialidadeId)) { $currentCentroCusto = self::getCurrentCentroCusto(); $response = ParametrizacaoInfraestruturaEspecialidade::where('especialidade_id', $especialidadeId) ->whereHas('parametrizacaoInfraestrutura', fn ($q) => $q->where('infraestrutura_id', $currentCentroCusto->infraestrutura_id)) ->first()->demanda_espontanea_observa_vaga_atendimento ?? false; } return $response; } private static function getStatusLiberamHorario() { return [ AgendamentoStatus::REAGENDADO_PELO_PACIENTE, AgendamentoStatus::REAGENDADO_PELO_MEDICO, AgendamentoStatus::CANCELADO_PELO_PACIENTE, AgendamentoStatus::CANCELADO_PELO_MEDICO, ]; } private static function getJornadas($params) { return Jornada::setEagerLoads([]) ->whereHas('lotacao', fn ($q) => $q ->where('usuario_id', $params->usuario_id) ->where('ocupacao_id', $params->ocupacao_id) ->where('infraestrutura_id', $params->infraestrutura_id) ) ->whereNotNull('quantidade_consulta') ->whereNull('situacao_id') ->whereDate('data', $params->data) ->orderBy('inicio') ->get() ->map(function ($jornada) { $quantidadeAgendamentos = $jornada->agendamentos() ->whereNotIn('status_id', self::getStatusLiberamHorario()) ->where('tipo_id', AgendamentoTipo::CONSULTA) ->count(); $quantidadeDemandasEspontaneas = $jornada->demandasEspontaneas()->count(); $quantidadeUtilizada = $quantidadeAgendamentos + $quantidadeDemandasEspontaneas; $quantidadeConsulta = $jornada->quantidade_consulta; return [ 'id' => $jornada->id, 'quantidade_utilizada' => $quantidadeUtilizada, 'quantidade_consulta' => $quantidadeConsulta, 'inicio' => $jornada->inicio->format('H:i'), 'fim' => $jornada->fim->format('H:i'), 'descricao' => $jornada->inicio->format('d/m/Y H:i') . ' - ' . $quantidadeUtilizada . '/' . $quantidadeConsulta, ]; }); } private static function houveMudancaInformacaoSocioeconomica($alimentosAtual, $comeuAtual, $alimentosNovo, $comeuNovo) { return $alimentosAtual !== $alimentosNovo || $comeuAtual !== $comeuNovo; } private static function getDemandaTipos() { return [ ['value' => DemandaTipo::AGENDADA, 'text' => 'Demanda agendada'], ['value' => DemandaTipo::ESPONTANEA, 'text' => 'Demanda espontânea'], ]; } }