select([ 'atencao_basica_parametrizacao_equipe.id AS id', DB::raw(" CONCAT( CASE WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine) ELSE '' END, CASE WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_area.descricao, ''), CASE WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_microarea.descricao, '') ) AS descricao ") ]) ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id') ->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id') ->where('atencao_basica_parametrizacao_equipe_usuario.ativo', true) ->when(request()->usuario_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe_usuario.usuario_id', $id)) ->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $id)) ->get(); } public static function getUnidades() { return DB::table('atencao_basica_parametrizacao_equipe_usuario') ->select([ 'cadastro_unidade.id AS id', DB::raw("CONCAT(TRIM(cadastro_unidade.cnes), ' - ', cadastro_unidade.nome_fantasia ) AS nome_fantasia"), ]) ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->where('atencao_basica_parametrizacao_equipe_usuario.ativo', true) ->when(request()->usuario_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe_usuario.usuario_id', $id)) ->distinct() ->orderBy('cadastro_unidade.cnes') ->get(); } public static function getInfraestruturas() { return DB::table('atencao_basica_parametrizacao_equipe_usuario') ->select([ 'cadastro_infraestrutura.id AS id', DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome'), ]) ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->where('atencao_basica_parametrizacao_equipe_usuario.ativo', true) ->when(request()->usuario_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe_usuario.usuario_id', $id)) ->when(request()->unidade_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $id)) ->distinct() ->orderBy('nome') ->get(); } public static function getOcupacoes() { $usuario = Usuario::findOrFail(request()->usuario_id); $permissao = OutrosPermissaoOcupacao::where('permissao_id', Permissao::ATENDIMENTO_ODONTOLOGICO)->get(); $codigos = $permissao->pluck('ocupacao'); return $usuario->lotacoes ->filter(function ($lotacao) use ($codigos) { return $lotacao->infraestrutura->id == request()->infraestrutura_id && $codigos->contains($lotacao->ocupacao->codigo); }) ->pluck('ocupacao'); } public static function getOcupacoesAuxiliar() { $usuario = Usuario::findOrFail(request()->usuario_id); return $usuario->lotacoes ->filter(function ($lotacao) { return $lotacao->infraestrutura->id == request()->infraestrutura_id; }) ->pluck('ocupacao'); } public static function create($id) { $paciente = Paciente::findOrFail($id); return [ 'additionals' => [ 'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(), ], 'form' => self::getFormData(), 'model' => self::getModelData($paciente), ]; } public static function edit($id) { $atendimento = AtendimentoOdontologico::findOrFail($id); $paciente = Paciente::findOrFail($atendimento->paciente_id); return [ 'additionals' => [ 'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(), ], 'form' => self::getFormData(), 'model' => self::getModelData($paciente, $atendimento) ]; } public static function show($id) { return AtendimentoOdontologico::where('paciente_id', $id)->first(); } private static function getFormData() { return [ 'data_atual' => Carbon::now()->format('d/m/Y'), 'turno' => Turno::orderBy('id')->get(), 'local_atendimento' => LocalAtendimento::whereIn('id', [ EnumsLocalAtendimento::UBS, EnumsLocalAtendimento::UNIDADE_MOVEL, EnumsLocalAtendimento::RUA, EnumsLocalAtendimento::DOMICILIO, EnumsLocalAtendimento::ESCOLA_CRECHE, EnumsLocalAtendimento::OUTROS, EnumsLocalAtendimento::POLO, EnumsLocalAtendimento::INSTITUICAO, EnumsLocalAtendimento::UNIDADE_PRISIONAL_CONGENERES, EnumsLocalAtendimento::UNIDADE_SOCIOEDUCATIVA ])->orderBy('descricao')->get(), 'tipo_atendimento' => TipoAtendimento::whereIn('id', [ EnumsTipoAtendimento::CONSULTA_AGENDADA, EnumsTipoAtendimento::ESCUTA_INICIAL_ORIENTACAO, EnumsTipoAtendimento::CONSULTA_NO_DIA, EnumsTipoAtendimento::ATENDIMENTO_DE_URGENCIA ])->orderBy('descricao')->get(), 'tipo_consulta' => TipoConsulta::orderBy('descricao')->get(), 'momentos_coleta' => GlicemiaCapilarMomentoColeta::orderBy('id')->get(['id', 'nome']), 'procedimentos' => SigtapProcedimento::whereIn('codigo', [ EnumSigtapProcedimento::MEDICAO_PESO, EnumSigtapProcedimento::MEDICAO_ALTURA, EnumSigtapProcedimento::AFERICAO_TEMPERATURA, EnumSigtapProcedimento::AFERICAO_PRESSAO_ARTERIAL, EnumSigtapProcedimento::AVALIACAO_ANTROPOMETRICA, ]) ->where('competencia_id', function ($query) { $query->select('sigtap.competencia.id') ->from('sigtap.competencia') ->orderByDesc('sigtap.competencia.valor') ->limit(1); }) ->groupBy('codigo') ->get(), 'condicao_avaliada' => CondicaoAvaliada::orderBy('descricao')->get(), 'doenca_transmissivel' => DoencaTransmissivel::orderBy('descricao')->get(), 'rastreamento' => Rastreamento::orderBy('descricao')->get(), 'exames' => ExameSolicitadoAvaliado::orderBy('descricao') ->get(['id', 'codigo_esus', 'codigo_procedimento', 'descricao']), ]; } private static function getModelData($paciente, $atendimento = null) { $cadastro = CadastroIndividual::where('paciente_id', $paciente->id)->first(); if ($atendimento) { $ivcf = AtendimentoOdontologicoIvcf::where('atendimento_odontologico_id', $atendimento->id)->first(); } else { $ivcf = null; } return [ 'cadastro' => [ 'usuario' => [ 'id' => $atendimento->usuario->id ?? null, 'cidadao_nome' => $atendimento->usuario->cidadao->nome ?? null, ], 'unidade_id' => $atendimento->equipe->unidade_id ?? null, 'infraestrutura_id' => $atendimento->equipe->infraestrutura_id ?? null, 'equipe_id' => $atendimento->equipe_id ?? null, 'ocupacao_id' => $atendimento->ocupacao_id ?? null, 'data_atendimento' => $atendimento->data_atendimento ?? Carbon::now()->format('Y-m-d'), 'usuario_auxiliar' => [ 'id' => $atendimento->usuario_auxiliar_id ?? null, 'cidadao_nome' => $atendimento->usuario_auxiliar->cidadao->nome ?? null, ], 'unidade_auxiliar_id' => $atendimento->equipe->unidade_auxiliar_id ?? null, 'infraestrutura_auxiliar_id' => $atendimento->equipe->infraestrutura_auxiliar_id ?? null, 'equipe_auxiliar_id' => $atendimento->equipe_auxiliar_id ?? null, 'ocupacao_auxiliar_id' => $atendimento->usuario_auxiliar->ocupacao_id ?? null, ], 'cidadao' => [ 'paciente_id' => $paciente->id ?? null, 'nome' => $paciente->cidadao->nome ?? null, 'nome_social' => $paciente->cidadao->nome_social ?? null, 'sexo_id' => $paciente->cidadao->sexo_id ?? null, 'sexo' => $paciente->cidadao->sexo->descricao ?? null, 'cns' => $paciente ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : null, 'data_nascimento' => $paciente->cidadao->data_nascimento->format('Y-m-d') ?? null, 'idade' => $paciente->cidadao->data_nascimento ? "{$paciente->cidadao->idade['anos']} ano(s), " . "{$paciente->cidadao->idade['meses']} mês(es) e " . "{$paciente->cidadao->idade['dias']} dia(s) " : 'NÃO INFORMADA', 'classificacao_id' => $paciente->classificacao_id, 'cidadao_id' => $paciente->cidadao_id, 'idade_anos' => $paciente->cidadao->idade['anos'] ?? null, ], 'atendimento' => [ 'turno_id' => $atendimento->turno_id ?? null, 'local_atendimento_id' => $atendimento->local_atendimento_id ?? null, 'tipo_atendimento_id' => $atendimento->tipo_atendimento_id ?? null, 'tipo_consulta_id' => $atendimento->tipo_consulta_id ?? null, 'necessidades_especiais' => $atendimento->necessidades_especiais ?? false, 'gestante' => $cadastro ? ($cadastro->gestante !== null ? $cadastro->gestante : false) : ($atendimento->gestante ?? false) ], 'condicao_avaliada' => $atendimento ? $atendimento->condicaoAvaliada->pluck('id') : [], 'doenca_transmissivel' => $atendimento ? $atendimento->doencaTransmissivel->pluck('id') : [], 'rastreamento' => $atendimento ? $atendimento->rastreamento->pluck('id') : [], 'vigilancia' => $atendimento && $atendimento->vigilancia ? $atendimento->vigilancia->pluck('vigilancia_bucal_id') : [], 'problemas_condicoes' => $atendimento ? self::getProblemasCondicoes($atendimento) : [], 'procedimentos_quantidade' => [ 'acesso_polpa_dentaria' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::ACESSO_POLPA_DENTARIA)->quantidade ?? '' : '', 'adaptacao_protese_dentaria' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::ADAPTACAO_PROTESE)->quantidade ?? '' : '', 'aplicacao_cariostatico' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::APLICACAO_CARIOSTATICO)->quantidade ?? '' : '', 'aplicacao_selante' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::APLICACAO_SELANTE)->quantidade ?? '' : '', 'aplicacao_topica_fluor' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::APLICACAO_TOPICA_FLUOR)->quantidade ?? '' : '', 'capeamento_pulpar' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::CAPEAMENTO_PULPAR)->quantidade ?? '' : '', 'cimentacao_protese' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::CIMENTACAO_PROTESE_DENTARIA)->quantidade ?? '' : '', 'curativo_demora' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::CURATIVO_DEMORA)->quantidade ?? '' : '', 'drenagem_abscesso' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::DRENAGEM_ABSCESSO)->quantidade ?? '' : '', 'evidenciacao_placa_bacteriana' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::EVIDENCIACAO_PLACA_BACTERIANA)->quantidade ?? '' : '', 'exodontia_dente_deciduo' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::EXODONTIA_DENTE_DECIDUO)->quantidade ?? '' : '', 'exodontia_dente_permanente' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::EXODONTIA_DENTE_PERMANENTE)->quantidade ?? '' : '', 'instalacao_protese_dentaria' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::INSTALACAO_PROTESE_DENTARIA)->quantidade ?? '' : '', 'moldagem_protese_dentaria' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::MOLDAGEM_PROTESE_DENTARIA)->quantidade ?? '' : '', 'orientacao_higiene_bucal' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::ORIENTACAO_HIGIENE_BUCAL)->quantidade ?? '' : '', 'orientacao_individual_em_saude' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::ORIENTACAO_INDIVIDUAL_EM_SAUDE)->quantidade ?? '' : '', 'remocao_placa_bacteriana' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::REMOCAO_PLACA_BACTERIANA)->quantidade ?? '' : '', 'pulpotomia_dentaria' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::PULPOTOMIA_DENTARIA)->quantidade ?? '' : '', 'raspagem_supragengivais' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::RASPAGEM_SUPRAGENGIVAIS)->quantidade ?? '' : '', 'raspagem_subgengivais' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::RASPAGEM_SUBGENGIVAIS)->quantidade ?? '' : '', 'restauracao_dente_permanente_anterior' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::RESTAURACAO_DENTE_PERMANENTE_ANTERIOR)->quantidade ?? '' : '', 'selamento_provisorio_cavidade_dentaria' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::SELAMENTO_PROVISORIO_CAVIDADE_DENTARIA)->quantidade ?? '' : '', 'tratamento_alveolite' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::TRATAMENTO_ALVEOLITE)->quantidade ?? '' : '', 'ulotomia_ulectomia' => $atendimento && $atendimento->procedimento ? $atendimento->procedimento->firstWhere('codigo_procedimento', EnumProcedimento::ULOTOMIA_ULECTOMIA)->quantidade ?? '' : '' ], 'procedimentos' => $atendimento ? DB::table('atencao_basica_atendimento_odontologico_procedimento as atendimento_procedimento') ->select( 'atendimento_procedimento.quantidade', 'procedimento.codigo', 'procedimento.nome' ) ->join(DB::raw(" ( SELECT procedimento_principal.* FROM sigtap.procedimento AS procedimento_principal INNER JOIN ( SELECT codigo, MAX(competencia_id) AS competencia_id FROM sigtap.procedimento GROUP BY codigo ) AS procedimento_ultima_competencia ON procedimento_principal.codigo = procedimento_ultima_competencia.codigo AND procedimento_principal.competencia_id = procedimento_ultima_competencia.competencia_id ) AS procedimento "), 'atendimento_procedimento.codigo_procedimento', '=', 'procedimento.codigo') ->where('atendimento_procedimento.atendimento_odontologico_id', $atendimento->id) ->whereNotIn( 'atendimento_procedimento.codigo_procedimento', array_values(EnumProcedimento::getConstants()) ) ->orderBy('procedimento.nome') ->get() : [], 'fornecimento' => [ 'escova_dental' => $atendimento && $atendimento->fornecimento->firstWhere('fornecimento_id', EnumFornecimento::ESCOVA_DENTAL) ? true : false, 'creme_dental' => $atendimento && $atendimento->fornecimento->firstWhere('fornecimento_id', EnumFornecimento::CREME_DENTAL) ? true : false, 'fio_dental' => $atendimento && $atendimento->fornecimento->firstWhere('fornecimento_id', EnumFornecimento::FIO_DENTAL) ? true : false, ], 'medicoes' => [ 'perimetro_cefalico' => $atendimento ? $atendimento->perimetro_cefalico : null, 'glicemia' => $atendimento ? $atendimento->glicemia : null, 'momento_coleta_id' => $atendimento ? $atendimento->momento_coleta_id : null, 'saturacao_o2' => $atendimento ? $atendimento->saturacao_o2 : null, 'circunferencia_abdominal' => $atendimento ? $atendimento->circunferencia_abdominal : null, 'perimetro_panturrilha' => $atendimento ? $atendimento->perimetro_panturrilha : null, 'frequencia_cardiaca' => $atendimento ? $atendimento->frequencia_cardiaca : null, 'frequencia_respiratoria' => $atendimento ? $atendimento->frequencia_respiratoria : null, 'pressao_arterial' => $atendimento ? $atendimento->pressao_arterial : null, 'peso' => $atendimento ? $atendimento->peso : null, 'altura' => $atendimento ? $atendimento->altura : null, 'temperatura' => $atendimento ? $atendimento->temperatura : null, ], 'conduta_encaminhamento' => $atendimento && $atendimento->condutaEncaminhamento ? $atendimento->condutaEncaminhamento->pluck('conduta_encaminhamento_id') : [], 'search_by_apelido' => false, 'exportacao' => $atendimento->exportacao ?? null, 'quantidade' => '1', 'procedimento' => null, 'exames' => $atendimento ? self::getExames($atendimento) : [], 'ivcf' => [ 'deseja_preencher' => $ivcf ? true : false, 'estado_saude_geral' => $ivcf->estado_saude_geral ?? null, 'limitacao_compras' => $ivcf->limitacao_compras ?? null, 'limitacao_gestao_financeira' => $ivcf->limitacao_gestao_financeira ?? null, 'limitacao_tarefas_domesticas' => $ivcf->limitacao_tarefas_domesticas ?? null, 'banho_independencia' => $ivcf->banho_independencia ?? null, 'relato_esquecimento_por_terceiros' => $ivcf->relato_esquecimento_por_terceiros ?? null, 'esquecimento_piorando' => $ivcf->esquecimento_piorando ?? null, 'esquecimento_impacta_atividades' => $ivcf->esquecimento_impacta_atividades ?? null, 'humor_tristeza_desanimo' => $ivcf->humor_tristeza_desanimo ?? null, 'perda_interesse_atividades' => $ivcf->perda_interesse_atividades ?? null, 'limitacao_elevar_bracos' => $ivcf->limitacao_elevar_bracos ?? null, 'limitacao_motricidade_fina' => $ivcf->limitacao_motricidade_fina ?? null, 'perda_peso_nao_intencional' => $ivcf->perda_peso_nao_intencional ?? null, 'imc_abaixo_22' => $ivcf->imc_abaixo_22 ?? null, 'panturrilha_abaixo_31' => $ivcf->panturrilha_abaixo_31 ?? null, 'marcha_lenta_4m_maior_5s' => $ivcf->marcha_lenta_4m_maior_5s ?? null, 'dificuldade_caminhar_impacto_atividades' => $ivcf->dificuldade_caminhar_impacto_atividades ?? null, 'quedas_recorrentes' => $ivcf->quedas_recorrentes ?? null, 'incontinencia' => $ivcf->incontinencia ?? null, 'problema_visao_impacto_atividades' => $ivcf->problema_visao_impacto_atividades ?? null, 'problema_audicao_impacto_atividades' => $ivcf->problema_audicao_impacto_atividades ?? null, 'doencas_cronicas_multiplas' => $ivcf->doencas_cronicas_multiplas ?? null, 'polifarmacia_5_ou_mais_medicamentos' => $ivcf->polifarmacia_5_ou_mais_medicamentos ?? null, 'internacao_ultimos_6_meses' => $ivcf->internacao_ultimos_6_meses ?? null, ], ]; } public static function getAtendimentos($id) { return DB::table('atencao_basica_atendimento_odontologico as atendimento') ->select( 'atendimento.id as id', 'atendimento.data_atendimento as data', 'turno.nome as turno', 'local.descricao as local', 'cidadao.nome as profissional', 'cidadao_exportacao.nome as profissional_exportacao', 'atendimento.exportacao', DB::raw("DATE_FORMAT(exportacao.created_at, '%d/%m/%Y') AS data_exportacao"), DB::raw("DATE_FORMAT(exportacao.created_at, '%H:%i') AS horario_exportacao") ) ->join('geral_turno as turno', 'atendimento.turno_id', 'turno.id') ->join('atencao_basica_local_atendimento as local', 'atendimento.local_atendimento_id', 'local.id') ->join('cadastro_usuario as usuario', 'atendimento.usuario_id', 'usuario.id') ->join('cadastro_cidadao as cidadao', 'usuario.cidadao_id', 'cidadao.id') ->leftJoin('cadastro_usuario as usuario_exportacao', 'usuario_exportacao.id', 'atendimento.usuario_exportacao_id') ->leftJoin('cadastro_cidadao as cidadao_exportacao', 'cidadao_exportacao.id', 'usuario_exportacao.cidadao_id') ->leftJoin('atencao_basica_exportacao as exportacao', 'exportacao.id', 'atendimento.exportacao_id') ->where('paciente_id', $id) ->orderBy('data') ->get(); } public static function store() { self::saveStore(request()->all()); } public static function saveStore($params) { self::validate($params); $params = (object) $params; $atendimento = new AtendimentoOdontologico(); $atendimento->soap_id = $params->soap_id ?? null; $atendimento->paciente_id = $params->paciente_id; $atendimento->usuario_id = $params->usuario_id; $atendimento->ocupacao_id = $params->ocupacao_id; $atendimento->usuario_auxiliar_id = request()->usuario_auxiliar_id; $atendimento->ocupacao_auxiliar_id = request()->ocupacao_auxiliar_id; $atendimento->data_atendimento = $params->data_atendimento; $atendimento->turno_id = $params->turno_id; $atendimento->local_atendimento_id = $params->local_atendimento_id; $atendimento->tipo_atendimento_id = $params->tipo_atendimento_id; $atendimento->tipo_consulta_id = $params->tipo_consulta_id; $atendimento->necessidades_especiais = $params->necessidades_especiais; $atendimento->gestante = $params->gestante ?? false; $atendimento->unidade_id = $params->unidade_id; $atendimento->equipe_id = $params->equipe_id; $atendimento->equipe_auxiliar_id = $params->equipe_auxiliar_id ?? null; $atendimento->altura = $params->medicoes['altura'] ?? null; $atendimento->circunferencia_abdominal = $params->medicoes['circunferencia_abdominal'] ?? null; $atendimento->frequencia_cardiaca = $params->medicoes['frequencia_cardiaca'] ?? null; $atendimento->frequencia_respiratoria = $params->medicoes['frequencia_respiratoria'] ?? null; $atendimento->glicemia = $params->medicoes['glicemia'] ?? null; $atendimento->momento_coleta_id = $params->medicoes['momento_coleta_id'] ?? null; $atendimento->perimetro_cefalico = $params->medicoes['perimetro_cefalico'] ?? null; $atendimento->perimetro_panturrilha = $params->medicoes['perimetro_panturrilha'] ?? null; $atendimento->peso = $params->medicoes['peso'] ?? null; $atendimento->pressao_arterial = $params->medicoes['pressao_arterial'] ?? null; $atendimento->saturacao_o2 = $params->medicoes['saturacao_o2'] ?? null; $atendimento->temperatura = $params->medicoes['temperatura'] ?? null; $atendimento->save(); self::saveProblemasCondicoes($atendimento, $params->problemas_condicoes); if (isset($params->exames)) { self::saveExames($atendimento, $params->exames); } $atendimento->condicaoAvaliada()->sync($params->condicao_avaliada); $atendimento->doencaTransmissivel()->sync($params->doenca_transmissivel); $atendimento->rastreamento()->sync($params->rastreamento); if($params->escova_dental) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::ESCOVA_DENTAL ]); } if($params->creme_dental) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::CREME_DENTAL ]); } if($params->fio_dental) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::FIO_DENTAL ]); } foreach($params->vigilancia as $vigilancia_id) { VigilanciaBucal::create([ 'atendimento_odontologico_id' => $atendimento->id, 'vigilancia_bucal_id' => $vigilancia_id ]); } if (!empty($params->conduta_encaminhamento)) { $condutaEncaminhamentos = collect($params->conduta_encaminhamento)->toArray(); foreach($condutaEncaminhamentos as $conduta_encaminhamento_id) { CondutaEncaminhamento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'conduta_encaminhamento_id' => $conduta_encaminhamento_id ]); } } if($params->procedimentos) { foreach($params->procedimentos as $procedimento) { Procedimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'codigo_procedimento' => $procedimento['codigo'], 'quantidade' => array_key_exists('quantidade', $procedimento) ? $procedimento['quantidade'] : 1 ]); } } if (isset($params->ivcf['deseja_preencher']) && $params->ivcf['deseja_preencher'] === true) { AtendimentoOdontologicoIvcf::updateOrCreate( [ 'atendimento_odontologico_id' => $atendimento->id ], [ 'atendimento_individual_id' => $atendimento->id, 'estado_saude_geral' => $params->ivcf['estado_saude_geral'], 'limitacao_compras' => $params->ivcf['limitacao_compras'], 'limitacao_gestao_financeira' => $params->ivcf['limitacao_gestao_financeira'], 'limitacao_tarefas_domesticas' => $params->ivcf['limitacao_tarefas_domesticas'], 'banho_independencia' => $params->ivcf['banho_independencia'], 'relato_esquecimento_por_terceiros' => $params->ivcf['relato_esquecimento_por_terceiros'], 'esquecimento_piorando' => $params->ivcf['esquecimento_piorando'], 'esquecimento_impacta_atividades' => $params->ivcf['esquecimento_impacta_atividades'], 'humor_tristeza_desanimo' => $params->ivcf['humor_tristeza_desanimo'], 'perda_interesse_atividades' => $params->ivcf['perda_interesse_atividades'], 'limitacao_elevar_bracos' => $params->ivcf['limitacao_elevar_bracos'], 'limitacao_motricidade_fina' => $params->ivcf['limitacao_motricidade_fina'], 'perda_peso_nao_intencional' => $params->ivcf['perda_peso_nao_intencional'], 'imc_abaixo_22' => $params->ivcf['imc_abaixo_22'], 'panturrilha_abaixo_31' => $params->ivcf['panturrilha_abaixo_31'], 'marcha_lenta_4m_maior_5s' => $params->ivcf['marcha_lenta_4m_maior_5s'], 'dificuldade_caminhar_impacto_atividades' => $params->ivcf['dificuldade_caminhar_impacto_atividades'], 'quedas_recorrentes' => $params->ivcf['quedas_recorrentes'], 'incontinencia' => $params->ivcf['incontinencia'], 'problema_visao_impacto_atividades' => $params->ivcf['problema_visao_impacto_atividades'], 'problema_audicao_impacto_atividades' => $params->ivcf['problema_audicao_impacto_atividades'], 'doencas_cronicas_multiplas' => $params->ivcf['doencas_cronicas_multiplas'], 'polifarmacia_5_ou_mais_medicamentos' => $params->ivcf['polifarmacia_5_ou_mais_medicamentos'], 'internacao_ultimos_6_meses' => $params->ivcf['internacao_ultimos_6_meses'], ] ); } else { AtendimentoOdontologicoIvcf::where('atendimento_odontologico_id', $atendimento->id)->delete(); } } public static function update($id, $params = null) { if(!$params['soap_id']){ self::validate(request()->all()); $atendimento = AtendimentoOdontologico::find($id); $atendimento->paciente_id = request()->paciente_id; $atendimento->usuario_id = request()->usuario_id; $atendimento->ocupacao_id = request()->ocupacao_id; $atendimento->usuario_auxiliar_id = request()->usuario_auxiliar_id; $atendimento->ocupacao_auxiliar_id = request()->ocupacao_auxiliar_id; $atendimento->data_atendimento = request()->data_atendimento; $atendimento->turno_id = request()->turno_id; $atendimento->local_atendimento_id = request()->local_atendimento_id; $atendimento->tipo_atendimento_id = request()->tipo_atendimento_id; $atendimento->tipo_consulta_id = request()->tipo_consulta_id; $atendimento->necessidades_especiais = request()->necessidades_especiais; $atendimento->gestante = request()->gestante ?? false; $atendimento->unidade_id = request()->unidade_id; $atendimento->equipe_id = request()->equipe_id; $atendimento->altura = request()->medicoes['altura'] ?? null; $atendimento->circunferencia_abdominal = request()->medicoes['circunferencia_abdominal'] ?? null; $atendimento->frequencia_cardiaca = request()->medicoes['frequencia_cardiaca'] ?? null; $atendimento->frequencia_respiratoria = request()->medicoes['frequencia_respiratoria'] ?? null; $atendimento->glicemia = request()->medicoes['glicemia'] ?? null; $atendimento->momento_coleta_id = request()->medicoes['momento_coleta_id'] ?? null; $atendimento->perimetro_cefalico = request()->medicoes['perimetro_cefalico'] ?? null; $atendimento->perimetro_panturrilha = request()->medicoes['perimetro_panturrilha'] ?? null; $atendimento->peso = request()->medicoes['peso'] ?? null; $atendimento->pressao_arterial = request()->medicoes['pressao_arterial'] ?? null; $atendimento->saturacao_o2 = request()->medicoes['saturacao_o2'] ?? null; $atendimento->temperatura = request()->medicoes['temperatura'] ?? null; $atendimento->save(); self::saveProblemasCondicoes($atendimento, request()->problemas_condicoes); self::saveExames($atendimento, $params->exames); $atendimento->condicaoAvaliada()->sync(request()->condicao_avaliada); $atendimento->doencaTransmissivel()->sync(request()->doenca_transmissivel); $atendimento->rastreamento()->sync(request()->rastreamento); Fornecimento::where('atendimento_odontologico_id', $id)->delete(); if(request()->escova_dental) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::ESCOVA_DENTAL ]); } if(request()->creme_dental) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::CREME_DENTAL ]); } if(request()->fio_dental) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::FIO_DENTAL ]); } VigilanciaBucal::where('atendimento_odontologico_id', $id)->delete(); foreach(request()->vigilancia as $vigilancia_id) { VigilanciaBucal::create([ 'atendimento_odontologico_id' => $atendimento->id, 'vigilancia_bucal_id' => $vigilancia_id ]); } CondutaEncaminhamento::where('atendimento_odontologico_id', $id)->delete(); foreach(request()->conduta_encaminhamento as $conduta_encaminhamento_id) { CondutaEncaminhamento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'conduta_encaminhamento_id' => $conduta_encaminhamento_id ]); } Procedimento::where('atendimento_odontologico_id', $id)->delete(); if(request()->procedimentos) { foreach(request()->procedimentos as $procedimento) { Procedimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'codigo_procedimento' => $procedimento['codigo'], 'quantidade' => $procedimento['quantidade'] ]); } } if (isset($params->ivcf['deseja_preencher']) && $params->ivcf['deseja_preencher'] === true) { AtendimentoOdontologicoIvcf::updateOrCreate( [ 'atendimento_odontologico_id' => $atendimento->id ], [ 'atendimento_odontologico_id' => $atendimento->id, 'estado_saude_geral' => $params->ivcf['estado_saude_geral'], 'limitacao_compras' => $params->ivcf['limitacao_compras'], 'limitacao_gestao_financeira' => $params->ivcf['limitacao_gestao_financeira'], 'limitacao_tarefas_domesticas' => $params->ivcf['limitacao_tarefas_domesticas'], 'banho_independencia' => $params->ivcf['banho_independencia'], 'relato_esquecimento_por_terceiros' => $params->ivcf['relato_esquecimento_por_terceiros'], 'esquecimento_piorando' => $params->ivcf['esquecimento_piorando'], 'esquecimento_impacta_atividades' => $params->ivcf['esquecimento_impacta_atividades'], 'humor_tristeza_desanimo' => $params->ivcf['humor_tristeza_desanimo'], 'perda_interesse_atividades' => $params->ivcf['perda_interesse_atividades'], 'limitacao_elevar_bracos' => $params->ivcf['limitacao_elevar_bracos'], 'limitacao_motricidade_fina' => $params->ivcf['limitacao_motricidade_fina'], 'perda_peso_nao_intencional' => $params->ivcf['perda_peso_nao_intencional'], 'imc_abaixo_22' => $params->ivcf['imc_abaixo_22'], 'panturrilha_abaixo_31' => $params->ivcf['panturrilha_abaixo_31'], 'marcha_lenta_4m_maior_5s' => $params->ivcf['marcha_lenta_4m_maior_5s'], 'dificuldade_caminhar_impacto_atividades' => $params->ivcf['dificuldade_caminhar_impacto_atividades'], 'quedas_recorrentes' => $params->ivcf['quedas_recorrentes'], 'incontinencia' => $params->ivcf['incontinencia'], 'problema_visao_impacto_atividades' => $params->ivcf['problema_visao_impacto_atividades'], 'problema_audicao_impacto_atividades' => $params->ivcf['problema_audicao_impacto_atividades'], 'doencas_cronicas_multiplas' => $params->ivcf['doencas_cronicas_multiplas'], 'polifarmacia_5_ou_mais_medicamentos' => $params->ivcf['polifarmacia_5_ou_mais_medicamentos'], 'internacao_ultimos_6_meses' => $params->ivcf['internacao_ultimos_6_meses'], ] ); } else { AtendimentoOdontologicoIvcf::where('atendimento_odontologico_id', $atendimento->id)->delete(); } } else{ self::validate($params); $atendimento = AtendimentoOdontologico::find($params['id']); $atendimento->paciente_id = $params['paciente_id']; $atendimento->usuario_id = $params['usuario_id']; $atendimento->ocupacao_id = $params['ocupacao_id']; $atendimento->usuario_auxiliar_id = $params['usuario_auxiliar_id']; $atendimento->ocupacao_auxiliar_id = $params['ocupacao_auxiliar_id']; $atendimento->data_atendimento = $params['data_atendimento']; $atendimento->turno_id = $params['turno_id']; $atendimento->local_atendimento_id = $params['local_atendimento_id']; $atendimento->tipo_atendimento_id = $params['tipo_atendimento_id']; $atendimento->tipo_consulta_id = $params['tipo_consulta_id']; $atendimento->necessidades_especiais = $params['necessidades_especiais']; $atendimento->gestante = $params['gestante'] ?? false; $atendimento->unidade_id = $params['unidade_id']; $atendimento->equipe_id = $params['equipe_id']; $atendimento->altura = $params['altura'] ?? null; $atendimento->circunferencia_abdominal = $params['circunferencia_abdominal'] ?? null; $atendimento->frequencia_cardiaca = $params['frequencia_cardiaca'] ?? null; $atendimento->frequencia_respiratoria = $params['frequencia_respiratoria'] ?? null; $atendimento->glicemia = $params['glicemia'] ?? null; $atendimento->momento_coleta_id = $params['momento_coleta_id'] ?? null; $atendimento->perimetro_cefalico = $params['perimetro_cefalico'] ?? null; $atendimento->perimetro_panturrilha = $params['perimetro_panturrilha'] ?? null; $atendimento->peso = $params['peso'] ?? null; $atendimento->pressao_arterial = $params['pressao_arterial'] ?? null; $atendimento->saturacao_o2 = $params['saturacao_o2'] ?? null; $atendimento->temperatura = $params['temperatura'] ?? null; $atendimento->save(); self::saveProblemasCondicoes($atendimento, $params['problemas_condicoes']); $atendimento->condicaoAvaliada()->sync($params['condicao_avaliada']); $atendimento->doencaTransmissivel()->sync($params['doenca_transmissivel']); $atendimento->rastreamento()->sync($params['rastreamento']); Fornecimento::where('atendimento_odontologico_id', $id)->delete(); if($params['escova_dental']) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::ESCOVA_DENTAL ]); } if($params['creme_dental']) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::CREME_DENTAL ]); } if($params['fio_dental']) { Fornecimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'fornecimento_id' => EnumFornecimento::FIO_DENTAL ]); } VigilanciaBucal::where('atendimento_odontologico_id', $id)->delete(); foreach($params['vigilancia'] as $vigilancia_id) { VigilanciaBucal::create([ 'atendimento_odontologico_id' => $atendimento->id, 'vigilancia_bucal_id' => $vigilancia_id ]); } CondutaEncaminhamento::where('atendimento_odontologico_id', $id)->delete(); foreach($params['conduta_encaminhamento'] as $conduta_encaminhamento_id) { CondutaEncaminhamento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'conduta_encaminhamento_id' => $conduta_encaminhamento_id ]); } Procedimento::where('atendimento_odontologico_id', $id)->delete(); if($params['procedimentos']) { foreach($params['procedimentos'] as $procedimento) { Procedimento::create([ 'atendimento_odontologico_id' => $atendimento->id, 'codigo_procedimento' => $procedimento['codigo'], 'quantidade' => $procedimento['quantidade'] ]); } } } } private static function getProblemasCondicoes($atendimento) { return AtendimentoOdontologicoProblemaCondicao::where('atendimento_odontologico_id', $atendimento->id) ->get() ->map(fn ($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, ], ]) ->all(); } private static function getExames($atendimento) { return DB::table('atencao_basica_atendimento_odontologico_exame') ->select( 'atencao_basica_cadastro_exame_solicitado_avaliado.id AS exame_id', 'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_esus AS exame_codigo_esus', 'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_procedimento AS exame_codigo_procedimento', 'atencao_basica_cadastro_exame_solicitado_avaliado.descricao AS exame_descricao', 'atencao_basica_atendimento_odontologico_exame.solicitado', 'atencao_basica_atendimento_odontologico_exame.avaliado', ) ->join('atencao_basica_cadastro_exame_solicitado_avaliado', 'atencao_basica_cadastro_exame_solicitado_avaliado.id', 'atencao_basica_atendimento_odontologico_exame.exame_id') ->where('atencao_basica_atendimento_odontologico_exame.atendimento_odontologico_id', $atendimento->id) ->get() ->map(fn ($q) => [ 'exame' => [ 'id' => $q->exame_id, 'codigo_esus' => $q->exame_codigo_esus, 'codigo_procedimento' => $q->exame_codigo_procedimento, 'descricao' => $q->exame_descricao, ], 'solicitado' => $q->solicitado, 'avaliado' => $q->avaliado, ]); } private static function saveProblemasCondicoes($atendimento, $problemasCondicoes) { $ids = collect($problemasCondicoes)->pluck('id')->filter()->toArray(); $atendimento->problemasCondicoes()->whereNotIn('id', $ids)->delete(); if (!$problemasCondicoes) { return false; } foreach ($problemasCondicoes as $problemaCondicao) { $problemaCondicaoCiapId = isset($problemaCondicao['ciap']['id']) ? $problemaCondicao['ciap']['id'] : null; $problemaCondicaoCidId = isset($problemaCondicao['cid']['id']) ? $problemaCondicao['cid']['id'] : null; $data = [ 'ciap_id' => $problemaCondicaoCiapId, 'cid_id' => $problemaCondicaoCidId, ]; $atendimento->problemasCondicoes()->updateOrCreate( ['id' => $problemaCondicao['id'] ?? null], $data ); } } private static function saveExames($atendimento, $exames) { AtendimentoOdontologicoExame::where('atendimento_odontologico_id', $atendimento->id)->delete(); foreach ($exames as $exame) { AtendimentoOdontologicoExame::create([ 'atendimento_odontologico_id' => $atendimento->id, 'exame_id' => $exame['exame_id'], 'solicitado' => $exame['solicitado'], 'avaliado' => $exame['avaliado'], ]); } } private static function validate($params) { return Validator::make($params, [ 'usuario_id' => [ 'required', 'integer', Rule::exists(Usuario::class, 'id'), ], 'paciente_id' => [ 'required', 'integer', Rule::exists(Paciente::class, 'id'), ], 'data_atendimento' => [ 'required', 'date', ], 'turno_id' => [ 'required', 'integer', Rule::exists(Turno::class, 'id'), ], 'local_atendimento_id' => [ 'required', 'integer', Rule::exists(LocalAtendimento::class, 'id'), ], 'tipo_atendimento_id' => [ 'required', 'integer', Rule::exists(TipoAtendimento::class, 'id'), ], 'tipo_consulta_id' => [ 'nullable', 'integer', Rule::exists(TipoConsulta::class, 'id'), ], 'necessidades_especiais' => [ 'boolean', ], 'gestante' => [ 'boolean', ], 'equipe_id' => [ 'required', 'integer', Rule::exists(Equipe::class, 'id'), ], ])->validate(); } public static function destroy($id) { $atendimento = AtendimentoOdontologico::find($id); if($atendimento->exportado || $atendimento->usuarioExportacao) { throw new ExportedException; } if($atendimento->problemasCondicoes) { throw new FichaGeradaException; } else { if($atendimento->fornecimento) { Fornecimento::where('atendimento_odontologico_id', $id)->delete(); } if($atendimento->vigilancia) { VigilanciaBucal::where('atendimento_odontologico_id', $id)->delete(); } if($atendimento->condutaEncaminhamento) { CondutaEncaminhamento::where('atendimento_odontologico_id', $id)->delete(); } if($atendimento->procedimento) { Procedimento::where('atendimento_odontologico_id', $id)->delete(); } AtendimentoOdontologico::where('id', $id)->delete(); } } private static function getPermissoesAtualizacaoCadastroPaciente() { $parametrizacao = CnsService::getParametrizacao(); if (!is_null($parametrizacao)) { $lotacao = self::getCurrentLotacao(); return DB::table('cadastro_parametrizacao_permissao_usuario') ->select([ 'municipe', 'provisorio', 'outro_municipio', ]) ->where('infraestrutura_id', $lotacao->infraestrutura_id) ->where('usuario_id', $lotacao->usuario_id) ->get() ->first(); } return null; } }