id); return [ 'additionals' => [ 'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(), 'data_atual' => Carbon::now()->format('Y-m-d'), 'acompanhamento_saude' => self::getAcompanhamentosSaude($paciente['paciente_id']), ], 'atendimentos' => VisitaDomiciliar::where('paciente_id', request()->id) ->get() ->map(function ($query) { return [ 'id' => $query->id, 'data' => $query->data_usuario_responsavel, 'paciente' => $query->paciente->cidadao->nome, 'turno' => $query->turno->nome ?? null, 'turnoId' => $query->turno->id ?? null, 'imovel_tipo' => $query->imovelTipo->descricao ?? null, 'profissional' => $query->usuario->cidadao->nome ?? null, 'profissionalId' => $query->usuario->id ?? null, 'data_exportacao' => $query->data_hora_exportacao ? (new Carbon($query->data_hora_exportacao))->format('d/m/Y') . ' às ' . (new Carbon($query->data_hora_exportacao))->format('H:i') : null, 'profissional_exportacao' => $query->usuarioExportacao->cidadao->nome ?? null, ]; }), 'visitas_domiciliar' => $paciente['cidadao_domicilio_id'] ? VisitaDomiciliar::whereHas('paciente.cidadao', function ($q) use ($paciente) { $q->where('domicilio_id', $paciente['cidadao_domicilio_id']); }) ->whereNotIn('paciente_id', [request()->id]) ->get() ->map(function ($query) { return [ 'id' => $query->id, 'data' => $query->data_usuario_responsavel, 'paciente' => $query->paciente->cidadao->nome, 'turno' => $query->turno->nome ?? null, 'turnoId' => $query->turno->id ?? null, 'imovel_tipo' => $query->imovelTipo->descricao ?? null, 'profissional' => $query->usuario->cidadao->nome ?? null, 'profissionalId' => $query->usuario->id ?? null, 'data_exportacao' => $query->data_hora_exportacao ? (new Carbon($query->data_hora_exportacao))->format('d/m/Y') . ' às ' . (new Carbon($query->data_hora_exportacao))->format('H:i') : null, 'profissional_exportacao' => $query->usuarioExportacao->cidadao->nome ?? null, ]; }) : [], 'cidadao' => [ 'paciente_id' => $paciente['paciente_id'] ?? null, 'nome' => $paciente['cidadao_nome'] ?? null, 'nome_social' => $paciente['cidadao_nome_social'] ?? null, 'sexo_id' => $paciente['sexo_id'] ?? null, 'sexo_descricao' => $paciente['sexo_descricao'] ?? null, 'nome_mae' => $paciente['cidadao_nome_mae'] ?? null, 'cns' => $paciente ? MaskUtil::getCnsMasked($paciente['cidadao_cns']) : null, 'cpf' => $paciente ? MaskUtil::getCpfMasked($paciente['cidadao_cpf']) : null, 'prontuario' => $paciente['paciente_prontuario'], 'data_nascimento' => $paciente['cidadao_data_nascimento'], 'idade' => [ 'anos' => $paciente['cidadao_idade_anos'], 'meses' => $paciente['cidadao_idade_meses'], 'dias' => $paciente['cidadao_idade_dias'], ], 'telefones' => $paciente['cidadao_telefones'], 'has_cadastro_individual' => $paciente['has_cadastro_individual'] ?? false, 'dias_cadastro_individual_desatualizado' => $paciente['dias_cadastro_individual_desatualizado'] ?? 0, 'classificacao_id' => $paciente['paciente_classificacao_id'], 'cidadao_id' => $paciente['cidadao_id'], 'cidadao_domicilio_id' => $paciente['cidadao_domicilio_id'], ], ]; } public static function getResidentes() { $paciente = Paciente::findOrFail(request()->paciente_id); $domicilioId = $paciente->cidadao->domicilio_id; if (!$domicilioId) { return []; } return DB::table('cadastro_cidadao') ->select([ 'cadastro_paciente.id AS id', 'cadastro_cidadao.nome AS nome', 'cadastro_cidadao.nome_social AS nome_social', 'cadastro_cidadao.cns', 'atencao_basica_cadastro_parentesco_responsavel.descricao AS parentesco', DB::raw(' ( CASE WHEN cadastro_cidadao.nome_mae IS NULL THEN "Não informado" ELSE cadastro_cidadao.nome_mae END ) AS nome_mae' ), DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'), DB::raw('IF (cadastro_cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y")) AS data_nascimento'), DB::raw('COALESCE(atencao_basica_cadastro_parentesco_responsavel.descricao, "-") AS parentesco'), DB::raw('( SELECT COALESCE(DATE_FORMAT(MAX(v.data_usuario_responsavel), "%d/%m/%Y"), "-") FROM atencao_basica_visita_domiciliar v WHERE v.paciente_id = cadastro_paciente.id ) AS ultima_visita') ]) ->join('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id') ->leftJoin('atencao_basica_cadastro_individual', 'atencao_basica_cadastro_individual.paciente_id', 'cadastro_paciente.id') ->leftJoin('atencao_basica_cadastro_parentesco_responsavel', 'atencao_basica_cadastro_parentesco_responsavel.id', 'atencao_basica_cadastro_individual.parentesco_responsavel_id') ->where('cadastro_cidadao.domicilio_id', $domicilioId) ->where('cadastro_paciente.id', '<>', request()->paciente_id) ->whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('cadastro_obito') ->whereColumn('cadastro_obito.cidadao_id', 'cadastro_cidadao.id'); }) ->get(); } public static function getEquipes(){ return DB::table('atencao_basica_parametrizacao_equipe_usuario') ->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::VISITA_DOMICILIAR)->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'); } private static function getFormData() { return [ 'data_atual' => Carbon::now()->format('d/m/Y'), 'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao), 'turnos' => Turno::orderBy('id')->get(), 'imovel_tipo' => ImovelTipo::orderBy('descricao')->get(), 'local_atendimento' => LocalAtendimento::whereNotIn('id', [ EnumsLocalAtendimento::HOSPITAL, EnumsLocalAtendimento::UNIDADE_PRONTO_ATENDIMENTO, EnumsLocalAtendimento::CACON_UNACON, ]) ->orderBy('descricao') ->get(), 'tipo_visita' => MotivoVisita::whereIn('id', [ EnumsMotivoVisita::CADASTRAMENTO_ATUALIZACAO, EnumsMotivoVisita::VISITA_PERIODICA, ]) ->orderBy('descricao') ->get(), 'busca_ativa' => MotivoVisita::whereIn('id', [ EnumsMotivoVisita::CONSULTA, EnumsMotivoVisita::EXAME, EnumsMotivoVisita::VACINA, EnumsMotivoVisita::CONDICIONALIDADES_DO_BOLSA_FAMILIA, ]) ->orderBy('descricao') ->get(), 'controle_ambiental_vetorial' => MotivoVisita::whereIn('id', [ EnumsMotivoVisita::ACAO_EDUCATIVA, EnumsMotivoVisita::IMOVEL_COM_FOCO, EnumsMotivoVisita::ACAO_MECANICA, EnumsMotivoVisita::TRATAMENTO_FOCAL, ]) ->orderBy('descricao') ->get(), 'acompanhamento' => MotivoVisita::whereIn('id', [ EnumsMotivoVisita::GESTANTE, EnumsMotivoVisita::PUERPERA, EnumsMotivoVisita::RECEM_NASCIDO, EnumsMotivoVisita::CRIANCA, EnumsMotivoVisita::PESSOA_COM_DESNUTRICAO, EnumsMotivoVisita::PESSOA_EM_REABILITACAO_OU_COM_DEFICIENCIA, EnumsMotivoVisita::PESSOA_COM_HIPERTENSAO, EnumsMotivoVisita::PESSOA_COM_DIABETES, EnumsMotivoVisita::PESSOA_COM_ASMA, EnumsMotivoVisita::PESSOA_COM_DPOC_ENFISEMA, EnumsMotivoVisita::PESSOA_COM_CANCER, EnumsMotivoVisita::PESSOA_COM_OUTRAS_DOENCAS_CRONICAS, EnumsMotivoVisita::PESSOA_COM_HANSENIASE, EnumsMotivoVisita::PESSOA_COM_TUBERCULOSE, EnumsMotivoVisita::SINTOMATICOS_RESPIRATORIOS, EnumsMotivoVisita::TABAGISTA, EnumsMotivoVisita::DOMICILIADOS_ACAMADOS, EnumsMotivoVisita::CONDICOES_DE_VULNERABILIDADE_SOCIAL, EnumsMotivoVisita::ACOMPANHAMENTO_CONDICIONALIDADES_DO_BOLSA_FAMILIA, EnumsMotivoVisita::SAUDE_MENTAL, EnumsMotivoVisita::USUARIO_DE_ALCOOL, EnumsMotivoVisita::USUARIO_DE_OUTRAS_DROGAS, EnumsMotivoVisita::PESSOA_IDOSA, ]) ->orderBy('descricao') ->get(), 'outros_motivos' => MotivoVisita::whereIn('id', [ EnumsMotivoVisita::EGRESSO_DE_INTERNACAO, EnumsMotivoVisita::CONVITE_PARA_ATIVIDADES_COLETIVAS_CAMPANHA_DE_SAUDE, EnumsMotivoVisita::ORIENTACAO_PREVENCAO, EnumsMotivoVisita::OUTROS, ]) ->orderBy('descricao') ->get(), 'desfecho' => Desfecho::orderBy('descricao')->get(), 'momento_coleta' => MomentoColeta::orderBy('descricao')->get(), ]; } private static function getModelData($atendimento = null, $paciente = 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->usuario_ocupacao_id ?? null, 'data_usuario_responsavel' => $atendimento->data_usuario_responsavel ?? Carbon::now()->format('Y-m-d'), ], 'cidadao' => [ 'paciente_id' => $paciente['paciente_id'] ?? null, 'nome' => $paciente['cidadao_nome'] ?? null, 'nome_social' => $paciente['cidadao_nome_social'] ?? null, 'sexo_id' => $paciente['sexo_id'] ?? null, 'sexo' => $paciente['sexo_descricao'] ?? null, 'cns' => $paciente ? MaskUtil::getCnsMasked($paciente['cidadao_cns']) : null, 'cpf' => $paciente ? MaskUtil::getCpfMasked($paciente['cidadao_cpf']) : null, 'data_nascimento' => $paciente['cidadao_data_nascimento'], '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['paciente_classificacao_id'], 'cidadao_id' => $paciente['cidadao_id'], 'idade_anos' => $paciente['cidadao_idade_anos'], 'idade_meses' => $paciente['cidadao_idade_meses'], ], 'atendimento' => [ 'id' => $atendimento ? $atendimento->id : null, 'turno_id' => $atendimento ? $atendimento->turno_id : null, 'imovel_tipo_id' => $atendimento ? $atendimento->imovel_tipo_id : null, 'latitude' => $atendimento ? $atendimento->latitude : null, 'longitude' => $atendimento ? $atendimento->longitude : null, 'visita_compartilhada' => $atendimento ? $atendimento->visita_compartilhada : null, 'peso' => $atendimento ? $atendimento->peso : null, 'altura' => $atendimento ? $atendimento->altura : null, 'afericao_pa' => $atendimento ? $atendimento->afericao_pa : null, 'temperatura' => $atendimento ? $atendimento->temperatura : null, 'glicemia' => $atendimento ? $atendimento->glicemia : null, 'momento_coleta_id' => $atendimento ? $atendimento->momento_coleta_id : null, 'desfecho_id' => $atendimento ? $atendimento->desfecho_id : [], 'ivcf' => [ 'deseja_preencher' => $atendimento && $atendimento->ivcf ? true : false, 'estado_saude_geral' => $atendimento->ivcf->estado_saude_geral ?? null, 'limitacao_compras' => $atendimento->ivcf->limitacao_compras ?? null, 'limitacao_gestao_financeira' => $atendimento->ivcf->limitacao_gestao_financeira ?? null, 'limitacao_tarefas_domesticas' => $atendimento->ivcf->limitacao_tarefas_domesticas ?? null, 'banho_independencia' => $atendimento->ivcf->banho_independencia ?? null, 'relato_esquecimento_por_terceiros' => $atendimento->ivcf->relato_esquecimento_por_terceiros ?? null, 'esquecimento_piorando' => $atendimento->ivcf->esquecimento_piorando ?? null, 'esquecimento_impacta_atividades' => $atendimento->ivcf->esquecimento_impacta_atividades ?? null, 'humor_tristeza_desanimo' => $atendimento->ivcf->humor_tristeza_desanimo ?? null, 'perda_interesse_atividades' => $atendimento->ivcf->perda_interesse_atividades ?? null, 'limitacao_elevar_bracos' => $atendimento->ivcf->limitacao_elevar_bracos ?? null, 'limitacao_motricidade_fina' => $atendimento->ivcf->limitacao_motricidade_fina ?? null, 'perda_peso_nao_intencional' => $atendimento->ivcf->perda_peso_nao_intencional ?? null, 'imc_abaixo_22' => $atendimento->ivcf->imc_abaixo_22 ?? null, 'panturrilha_abaixo_31' => $atendimento->ivcf->panturrilha_abaixo_31 ?? null, 'marcha_lenta_4m_maior_5s' => $atendimento->ivcf->marcha_lenta_4m_maior_5s ?? null, 'dificuldade_caminhar_impacto_atividades' => $atendimento->ivcf->dificuldade_caminhar_impacto_atividades ?? null, 'quedas_recorrentes' => $atendimento->ivcf->quedas_recorrentes ?? null, 'incontinencia' => $atendimento->ivcf->incontinencia ?? null, 'problema_visao_impacto_atividades' => $atendimento->ivcf->problema_visao_impacto_atividades ?? null, 'problema_audicao_impacto_atividades' => $atendimento->ivcf->problema_audicao_impacto_atividades ?? null, 'doencas_cronicas_multiplas' => $atendimento->ivcf->doencas_cronicas_multiplas ?? null, 'polifarmacia_5_ou_mais_medicamentos' => $atendimento->ivcf->polifarmacia_5_ou_mais_medicamentos ?? null, 'internacao_ultimos_6_meses' => $atendimento->ivcf->internacao_ultimos_6_meses ?? null, ], ], 'motivo' => [ 'tipo_visita' => $atendimento ? VisitaDomiciliarMotivoVisita::where('visita_domiciliar_id', $atendimento->id) ->whereIn('motivo_visita_id', [ EnumsMotivoVisita::CADASTRAMENTO_ATUALIZACAO, EnumsMotivoVisita::VISITA_PERIODICA, ]) ->get() ->map(function ($query) { return $query->motivo_visita_id; }) : [], 'busca_ativa' => $atendimento ? VisitaDomiciliarMotivoVisita::where('visita_domiciliar_id', $atendimento->id) ->whereIn('motivo_visita_id', [ EnumsMotivoVisita::CONSULTA, EnumsMotivoVisita::EXAME, EnumsMotivoVisita::VACINA, EnumsMotivoVisita::CONDICIONALIDADES_DO_BOLSA_FAMILIA, ]) ->get() ->map(function ($query) { return $query->motivo_visita_id; }) : [], 'controle_ambiental_vetorial' => $atendimento ? VisitaDomiciliarMotivoVisita::where('visita_domiciliar_id', $atendimento->id) ->whereIn('motivo_visita_id', [ EnumsMotivoVisita::ACAO_EDUCATIVA, EnumsMotivoVisita::IMOVEL_COM_FOCO, EnumsMotivoVisita::ACAO_MECANICA, EnumsMotivoVisita::TRATAMENTO_FOCAL, ]) ->get() ->map(function ($query) { return $query->motivo_visita_id; }) : [], 'acompanhamento' => $atendimento ? VisitaDomiciliarMotivoVisita::where('visita_domiciliar_id', $atendimento->id) ->whereIn('motivo_visita_id', [ EnumsMotivoVisita::GESTANTE, EnumsMotivoVisita::PUERPERA, EnumsMotivoVisita::RECEM_NASCIDO, EnumsMotivoVisita::CRIANCA, EnumsMotivoVisita::PESSOA_COM_DESNUTRICAO, EnumsMotivoVisita::PESSOA_EM_REABILITACAO_OU_COM_DEFICIENCIA, EnumsMotivoVisita::PESSOA_COM_HIPERTENSAO, EnumsMotivoVisita::PESSOA_COM_DIABETES, EnumsMotivoVisita::PESSOA_COM_ASMA, EnumsMotivoVisita::PESSOA_COM_DPOC_ENFISEMA, EnumsMotivoVisita::PESSOA_COM_CANCER, EnumsMotivoVisita::PESSOA_COM_OUTRAS_DOENCAS_CRONICAS, EnumsMotivoVisita::PESSOA_COM_HANSENIASE, EnumsMotivoVisita::PESSOA_COM_TUBERCULOSE, EnumsMotivoVisita::SINTOMATICOS_RESPIRATORIOS, EnumsMotivoVisita::TABAGISTA, EnumsMotivoVisita::DOMICILIADOS_ACAMADOS, EnumsMotivoVisita::CONDICOES_DE_VULNERABILIDADE_SOCIAL, EnumsMotivoVisita::ACOMPANHAMENTO_CONDICIONALIDADES_DO_BOLSA_FAMILIA, EnumsMotivoVisita::SAUDE_MENTAL, EnumsMotivoVisita::USUARIO_DE_ALCOOL, EnumsMotivoVisita::USUARIO_DE_OUTRAS_DROGAS, EnumsMotivoVisita::PESSOA_IDOSA ]) ->get() ->map(function ($query) { return $query->motivo_visita_id; }) : [], 'outro_motivo' => $atendimento ? VisitaDomiciliarMotivoVisita::where('visita_domiciliar_id', $atendimento->id) ->whereIn('motivo_visita_id', [ EnumsMotivoVisita::EGRESSO_DE_INTERNACAO, EnumsMotivoVisita::CONVITE_PARA_ATIVIDADES_COLETIVAS_CAMPANHA_DE_SAUDE, EnumsMotivoVisita::ORIENTACAO_PREVENCAO, EnumsMotivoVisita::OUTROS, ]) ->get() ->map(function ($query) { return $query->motivo_visita_id; }) : [], ], 'complemento' => $atendimento ? $atendimento->complemento : null, ]; } public static function showAtendimento($id) { return VisitaDomiciliar::findOrFail($id); } public static function edit($id) { $atendimento = self::showAtendimento($id); $paciente = self::getPaciente($atendimento->paciente->id); return [ 'additionals' => [ 'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(), ], 'form' => self::getFormData(), 'model' => self::getModelData($atendimento, $paciente), ]; } public static function show($id) { $atendimento = null; $paciente = self::getPaciente($id); $ultimaVisitaDomiciliar = self::getUltimaVisitaDomiciliar($id); return [ 'additionals' => [ 'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(), 'is_recem_nascido_crianca' => $paciente ? self::isRecemNascidoCrianca($paciente) : false, 'is_gestante_puerpera' => $paciente ? self::isGestantePuerpera($paciente) : false, 'is_diabetico' => $paciente ? self::isDiabetico($paciente) : false, 'is_hipertenso' => $paciente ? self::isHipertenso($paciente) : false, 'is_idoso' => $paciente ? self::isIdoso($paciente) : false, ], 'form' => self::getFormData(), 'model' => self::getModelData($atendimento, $paciente), ]; } private static function getPaciente($id) { $parametrizacao = CadastroParametrizacao::first(); $quantidadeDias = $parametrizacao->cadastro_paciente_desatualizado_quantidade_dias ?? 0; $paciente = DB::table('cadastro_paciente') ->select([ 'cadastro_paciente.id AS paciente_id', 'cadastro_cidadao.nome AS cidadao_nome', 'cadastro_cidadao.cns AS cidadao_cns', 'cadastro_cidadao.cpf AS cidadao_cpf', 'cadastro_sexo.id AS sexo_id', 'cadastro_sexo.descricao AS sexo_descricao', 'cadastro_cidadao.data_nascimento AS cidadao_data_nascimento', 'cadastro_cidadao.nome_mae AS cidadao_nome_mae', DB::raw('LPAD(cadastro_paciente.prontuario,6,0) AS paciente_prontuario'), 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', 'cadastro_cidadao.nome_social AS cidadao_nome_social', 'cadastro_cidadao.domicilio_id AS cidadao_domicilio_id', 'cadastro_cidadao.preferencia_nome_id AS cidadao_preferencia_nome_id', 'cadastro_paciente_classificacao.descricao AS paciente_classificacao_descricao', 'cadastro_paciente_classificacao.id AS paciente_classificacao_id', DB::raw('GROUP_CONCAT(DISTINCT cadastro_cidadao_telefone.numero) as cidadao_telefones'), DB::raw('MAX(cadastro_individual.id) AS cadastro_individual_id'), DB::raw('MAX(cadastro_individual.updated_at) AS cadastro_individual_updated_at'), DB::raw('CASE WHEN MAX(cadastro_individual.id) IS NULL THEN 0 ELSE 1 END AS has_cadastro_individual'), DB::raw('CASE WHEN MAX(cadastro_individual.id) IS NULL THEN 0 WHEN ' . ($quantidadeDias > 0 ? 'DATE_ADD(MAX(cadastro_individual.updated_at), INTERVAL ' . $quantidadeDias . ' DAY) < NOW()' : 'false') . ' THEN DATEDIFF(NOW(), DATE_ADD(MAX(cadastro_individual.updated_at), INTERVAL ' . $quantidadeDias . ' DAY)) ELSE 0 END AS dias_cadastro_individual_desatualizado'), 'cadastro_paciente.cidadao_id', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id') ->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id') ->leftJoin('atencao_basica_cadastro_individual as cadastro_individual', 'cadastro_individual.paciente_id', 'cadastro_paciente.id') ->leftJoin('cadastro_cidadao_telefone', function ($join) { $join->on('cadastro_cidadao.id', '=', 'cadastro_cidadao_telefone.cidadao_id') ->whereNull('cadastro_cidadao_telefone.deleted_at'); }) ->leftJoin('cadastro_paciente_classificacao', 'cadastro_paciente_classificacao.id', 'cadastro_paciente.classificacao_id') ->whereNull('cadastro_paciente.deleted_at') ->where('cadastro_paciente.id', $id) ->first(); return [ 'paciente_id' => $paciente->paciente_id, 'cidadao_nome' => $paciente->cidadao_nome, 'cidadao_nome_social' => $paciente->cidadao_nome_social, 'cidadao_preferencia_nome_id' => $paciente->cidadao_preferencia_nome_id, 'cidadao_cns' => $paciente->cidadao_cns, 'cidadao_cpf' => $paciente->cidadao_cpf, 'sexo_id' => $paciente->sexo_id, 'sexo_descricao' => $paciente->sexo_descricao, 'cidadao_data_nascimento' => $paciente->cidadao_data_nascimento ? (new Carbon($paciente->cidadao_data_nascimento))->format('Y-m-d') : '', 'cidadao_idade' => Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%ya, %mm e %dd'), 'cidadao_idade_anos' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%y'), 'cidadao_idade_meses' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%m'), 'cidadao_idade_dias' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%d'), 'cidadao_nome_mae' => $paciente->cidadao_nome_mae, 'unidade_nome_fantasia' => $paciente->unidade_nome_fantasia, 'paciente_prontuario' => $paciente->paciente_prontuario, 'paciente_classificacao_id' => $paciente->paciente_classificacao_id, 'cidadao_telefones' => self::formatPhone($paciente->cidadao_telefones), 'has_cadastro_individual' => (bool) $paciente->has_cadastro_individual, 'dias_cadastro_individual_desatualizado' => (int) $paciente->dias_cadastro_individual_desatualizado, 'cidadao_id' => $paciente->cidadao_id, 'cidadao_domicilio_id' => $paciente->cidadao_domicilio_id, ]; } private static function formatPhone($telefones) { $telefones = explode(',', $telefones); $telefonesComMascara = ''; foreach ($telefones as $telefone) { $telefonesComMascara .= MaskUtil::getPhoneMasked($telefone) . ', '; } $telefonesComMascara = rtrim($telefonesComMascara, ', '); return $telefonesComMascara; } public static function store() { return self::saveStore(request()->all()); } public static function saveStore($params) { self::validate($params); $params = (object) $params; $motivos = $params->motivo; $atendimento = $params->atendimento; self::exceptionAcompanhamento($motivos['acompanhamento'], $atendimento['imovel_tipo_id'], $params->paciente_id); self::exceptionTipoVisita($motivos['tipo_visita'], $atendimento['imovel_tipo_id']); self::exceptionBuscaAtiva($motivos['busca_ativa'], $atendimento['imovel_tipo_id']); self::exceptionOutroMotivo($motivos['outro_motivo'], $atendimento['imovel_tipo_id']); self::exceptionDesfecho($motivos, $atendimento); self::exceptionLimite($motivos); self::exceptionVisitaDuplicada($params->paciente_id, $params->cadastro, $atendimento); $visitaDomiciliar = $atendimento['id'] ? VisitaDomiciliar::findOrFail($atendimento['id']) : new VisitaDomiciliar(); $visitaDomiciliar->paciente_id = $params->paciente_id; $cadastro = $params->cadastro; $visitaDomiciliar->data_usuario_responsavel = $cadastro['data_usuario_responsavel']; $visitaDomiciliar->usuario_id = $cadastro['usuario_id']; $visitaDomiciliar->equipe_id = $cadastro['equipe_id']; $visitaDomiciliar->usuario_ocupacao_id = $cadastro['ocupacao_id']; $visitaDomiciliar->turno_id = $atendimento['turno_id']; $visitaDomiciliar->imovel_tipo_id = $atendimento['imovel_tipo_id']; $visitaDomiciliar->latitude = $atendimento['latitude']; $visitaDomiciliar->longitude = $atendimento['longitude']; $visitaDomiciliar->visita_compartilhada = $atendimento['visita_compartilhada']; $visitaDomiciliar->peso = $atendimento['peso']; $visitaDomiciliar->altura = $atendimento['altura']; $visitaDomiciliar->temperatura = $atendimento['temperatura']; $visitaDomiciliar->afericao_pa = $atendimento['afericao_pa']; $visitaDomiciliar->glicemia = $atendimento['glicemia']; $visitaDomiciliar->momento_coleta_id = $atendimento['momento_coleta_id']; $visitaDomiciliar->desfecho_id = $atendimento['desfecho_id']; $visitaDomiciliar->complemento = $params->complemento; $visitaDomiciliar->save(); VisitaDomiciliarMotivoVisita::where('visita_domiciliar_id', $visitaDomiciliar->id)->delete(); self::saveMotivosVisita($visitaDomiciliar->id, $motivos); if (isset($atendimento['ivcf']['deseja_preencher']) && $atendimento['ivcf']['deseja_preencher'] === true) { VisitaDomiciliarIvcf::updateOrCreate( [ 'visita_domiciliar_id' => $visitaDomiciliar->id ], [ 'visita_domiciliar_id' => $visitaDomiciliar->id, 'estado_saude_geral' => $atendimento['ivcf']['estado_saude_geral'], 'limitacao_compras' => $atendimento['ivcf']['limitacao_compras'], 'limitacao_gestao_financeira' => $atendimento['ivcf']['limitacao_gestao_financeira'], 'limitacao_tarefas_domesticas' => $atendimento['ivcf']['limitacao_tarefas_domesticas'], 'banho_independencia' => $atendimento['ivcf']['banho_independencia'], 'relato_esquecimento_por_terceiros' => $atendimento['ivcf']['relato_esquecimento_por_terceiros'], 'esquecimento_piorando' => $atendimento['ivcf']['esquecimento_piorando'], 'esquecimento_impacta_atividades' => $atendimento['ivcf']['esquecimento_impacta_atividades'], 'humor_tristeza_desanimo' => $atendimento['ivcf']['humor_tristeza_desanimo'], 'perda_interesse_atividades' => $atendimento['ivcf']['perda_interesse_atividades'], 'limitacao_elevar_bracos' => $atendimento['ivcf']['limitacao_elevar_bracos'], 'limitacao_motricidade_fina' => $atendimento['ivcf']['limitacao_motricidade_fina'], 'perda_peso_nao_intencional' => $atendimento['ivcf']['perda_peso_nao_intencional'], 'imc_abaixo_22' => $atendimento['ivcf']['imc_abaixo22'], 'panturrilha_abaixo_31' => $atendimento['ivcf']['panturrilha_abaixo31'], 'marcha_lenta_4m_maior_5s' => $atendimento['ivcf']['marcha_lenta4m_maior5s'], 'dificuldade_caminhar_impacto_atividades' => $atendimento['ivcf']['dificuldade_caminhar_impacto_atividades'], 'quedas_recorrentes' => $atendimento['ivcf']['quedas_recorrentes'], 'incontinencia' => $atendimento['ivcf']['incontinencia'], 'problema_visao_impacto_atividades' => $atendimento['ivcf']['problema_visao_impacto_atividades'], 'problema_audicao_impacto_atividades' => $atendimento['ivcf']['problema_audicao_impacto_atividades'], 'doencas_cronicas_multiplas' => $atendimento['ivcf']['doencas_cronicas_multiplas'], 'polifarmacia_5_ou_mais_medicamentos' => $atendimento['ivcf']['polifarmacia5_ou_mais_medicamentos'], 'internacao_ultimos_6_meses' => $atendimento['ivcf']['internacao_ultimos6_meses'], ] ); } else { VisitaDomiciliarIvcf::where('visita_domiciliar_id', $visitaDomiciliar->id)->delete(); } } private static function saveMotivosVisita($id, $motivos) { foreach ($motivos['acompanhamento'] as $acompanhamento) { $visitaDomiciliarMotivoVisita = new VisitaDomiciliarMotivoVisita(); $visitaDomiciliarMotivoVisita->motivo_visita_id = $acompanhamento; $visitaDomiciliarMotivoVisita->visita_domiciliar_id = $id; $visitaDomiciliarMotivoVisita->save(); } foreach ($motivos['busca_ativa'] as $buscaAtiva) { $visitaDomiciliarMotivoVisita = new VisitaDomiciliarMotivoVisita(); $visitaDomiciliarMotivoVisita->motivo_visita_id = $buscaAtiva; $visitaDomiciliarMotivoVisita->visita_domiciliar_id = $id; $visitaDomiciliarMotivoVisita->save(); } foreach ($motivos['controle_ambiental_vetorial'] as $controleAmbientalVetorial) { $visitaDomiciliarMotivoVisita = new VisitaDomiciliarMotivoVisita(); $visitaDomiciliarMotivoVisita->motivo_visita_id = $controleAmbientalVetorial; $visitaDomiciliarMotivoVisita->visita_domiciliar_id = $id; $visitaDomiciliarMotivoVisita->save(); } foreach ($motivos['outro_motivo'] as $outroMotivo) { $visitaDomiciliarMotivoVisita = new VisitaDomiciliarMotivoVisita(); $visitaDomiciliarMotivoVisita->motivo_visita_id = $outroMotivo; $visitaDomiciliarMotivoVisita->visita_domiciliar_id = $id; $visitaDomiciliarMotivoVisita->save(); } foreach ($motivos['tipo_visita'] as $tipoVisita) { $visitaDomiciliarMotivoVisita = new VisitaDomiciliarMotivoVisita(); $visitaDomiciliarMotivoVisita->motivo_visita_id = $tipoVisita; $visitaDomiciliarMotivoVisita->visita_domiciliar_id = $id; $visitaDomiciliarMotivoVisita->save(); } } private static function exceptionTipoVisita($tiposVisita, $imovelTipoId) { foreach ($tiposVisita as $tipoVisita) { $tipoIncompativel = $imovelTipoId == EnumsImovelTipo::COMERCIO || $imovelTipoId == EnumsImovelTipo::TERRENO_BALDIO || $imovelTipoId == EnumsImovelTipo::PONTO_ESTRATEGICO || $imovelTipoId == EnumsImovelTipo::ESCOLA || $imovelTipoId == EnumsImovelTipo::CRECHE || $imovelTipoId == EnumsImovelTipo::ESTABELECIMENTO_RELIGIOSO; if ($tipoVisita == EnumsMotivoVisita::VISITA_PERIODICA && $tipoIncompativel) { $descriao = MotivoVisita::findOrFail($tipoVisita)->descricao; throw new TipoVisitaException(json_encode($descriao)); } } } private static function exceptionBuscaAtiva($buscaAtiva, $imovelTipoId) { $tipoIncompativel = $imovelTipoId == EnumsImovelTipo::COMERCIO || $imovelTipoId == EnumsImovelTipo::TERRENO_BALDIO || $imovelTipoId == EnumsImovelTipo::PONTO_ESTRATEGICO || $imovelTipoId == EnumsImovelTipo::ESCOLA || $imovelTipoId == EnumsImovelTipo::CRECHE || $imovelTipoId == EnumsImovelTipo::ESTABELECIMENTO_RELIGIOSO; if (!empty($buscaAtiva) && $tipoIncompativel) { throw new BuscaAtivaException(); } } private static function exceptionDesfecho($motivos, $atendimento) { $motivoPreenchido = !empty($motivos['acompanhamento']) || !empty($motivos['busca_ativa']) || !empty($motivos['controle_ambiental_vetorial']) || !empty($motivos['outro_motivo']) || !empty($motivos['tipo_visita']); $atendimentoPreenchido = !empty($atendimento['peso']) || !empty($atendimento['altura']) || !empty($atendimento['temperatura']) || !empty($atendimento['afericao_pa']) || !empty($atendimento['glicemia']) || !empty($atendimento['momento_coleta_id']); $visitaAusenteRecusada = $atendimento['desfecho_id'] == EnumsDesfecho::AUSENTE || $atendimento['desfecho_id'] == EnumsDesfecho::VISITA_RECUSADA; if (($motivoPreenchido && $visitaAusenteRecusada) || ($atendimentoPreenchido && $visitaAusenteRecusada)) { throw new DesfechoException(); } } private static function exceptionLimite($motivos) { $quantidadeMotivos = count($motivos['acompanhamento']) + count($motivos['busca_ativa']) + count($motivos['controle_ambiental_vetorial']) + count($motivos['outro_motivo']) + count($motivos['tipo_visita']); if ($quantidadeMotivos > Limite::MAXIMO) { throw new DesfechoException(); } } private static function exceptionAcompanhamento($acompanhamentos, $imovelTipoId, $pacienteId) { $paciente = Paciente::findOrFail($pacienteId); foreach ($acompanhamentos as $acompanhamento) { if (($acompanhamento == EnumsMotivoVisita::GESTANTE || $acompanhamento == EnumsMotivoVisita::PUERPERA) && $paciente->cidadao->sexo_id === Sexo::MASCULINO) { $descriao = MotivoVisita::findOrFail($acompanhamento)->descricao; throw new AcompanhamentoException(json_encode($descriao)); } } $tipoIncompativel = $imovelTipoId == EnumsImovelTipo::COMERCIO || $imovelTipoId == EnumsImovelTipo::TERRENO_BALDIO || $imovelTipoId == EnumsImovelTipo::PONTO_ESTRATEGICO || $imovelTipoId == EnumsImovelTipo::ESCOLA || $imovelTipoId == EnumsImovelTipo::CRECHE || $imovelTipoId == EnumsImovelTipo::ESTABELECIMENTO_RELIGIOSO; if (!empty($acompanhamentos) && $tipoIncompativel) { throw new AcompanhamentoTipoImovelException(); } } private static function exceptionVisitaDuplicada($pacienteId, $cadastro, $atendimento) { $visitaDuplicada = VisitaDomiciliar::where('paciente_id', $pacienteId) ->whereDate('data_usuario_responsavel', Carbon::parse($cadastro['data_usuario_responsavel'])->format('Y-m-d')) ->where('turno_id', $atendimento['turno_id']) ->where('usuario_id', $cadastro['usuario_id']) ->when($atendimento['id'], function ($query) use ($atendimento) { $query->where('id', '<>', $atendimento['id']); }) ->exists(); if ($visitaDuplicada) { throw new VisitaDuplicadaException(); } } private static function exceptionOutroMotivo($outrosMotivo, $imovelTipoId) { foreach ($outrosMotivo as $outroMotivo) { $tipoIncompativel = $imovelTipoId == EnumsImovelTipo::COMERCIO || $imovelTipoId == EnumsImovelTipo::TERRENO_BALDIO || $imovelTipoId == EnumsImovelTipo::PONTO_ESTRATEGICO || $imovelTipoId == EnumsImovelTipo::ESCOLA || $imovelTipoId == EnumsImovelTipo::CRECHE || $imovelTipoId == EnumsImovelTipo::ESTABELECIMENTO_RELIGIOSO; if ($outroMotivo == EnumsMotivoVisita::EGRESSO_DE_INTERNACAO && $tipoIncompativel) { $descriao = MotivoVisita::findOrFail($outroMotivo)->descricao; throw new OutroMotivoException(json_encode($descriao)); } } } public static function destroy($id) { $visitaDomiciliar = VisitaDomiciliar::findOrFail($id); VisitaDomiciliarMotivoVisita::where('visita_domiciliar_id', $id)->delete(); $existeInconsistencia = DB::table('integracao_esus_inconsistencia_visita_domiciliar') ->where('visita_domiciliar_id', $id) ->exists(); if ($existeInconsistencia) { DB::table('integracao_esus_inconsistencia_visita_domiciliar') ->where('visita_domiciliar_id', $id) ->delete(); } $visitaDomiciliar->delete(); } private static function validate($params) { return Validator::make($params, [ 'cadastro.usuario_id' => [ 'required', 'integer', Rule::exists(Usuario::class, 'id'), ], 'cadastro.unidade_id' => [ 'required', 'integer', Rule::exists(Unidade::class, 'id'), ], 'cadastro.equipe_id' => [ 'required', 'integer', Rule::exists(Equipe::class, 'id'), ], 'cadastro.ocupacao_id' => [ 'required', 'integer', Rule::exists(Ocupacao::class, 'id'), ], 'cadastro.data_usuario_responsavel' => [ 'required', 'date', ], 'atendimento.turno_id' => [ 'required', 'integer', Rule::exists(Turno::class, 'id'), ], 'atendimento.imovel_tipo_id' => [ 'required', 'integer', Rule::exists(ImovelTipo::class, 'id'), ], 'atendimento.latitude' => [ 'nullable', 'numeric', 'min:-90', 'max:90', ], 'atendimento.longitude' => [ 'nullable', 'numeric', 'min:-180', 'max:180', ], 'motivo.acompanhamento' => [ 'nullable', 'array', Rule::exists(MotivoVisita::class, 'id'), ], 'motivo.busca_ativa' => [ 'nullable', 'array', Rule::exists(MotivoVisita::class, 'id'), ], 'motivo.controle_ambiental_vetorial' => [ 'nullable', 'array', Rule::exists(MotivoVisita::class, 'id'), ], 'motivo.outro_motivo' => [ 'nullable', 'array', Rule::exists(MotivoVisita::class, 'id'), ], 'motivo.tipo_visita' => [ 'nullable', 'array', Rule::exists(MotivoVisita::class, 'id'), ], 'atendimento.peso' => [ 'nullable', 'numeric', 'min:0.5', 'max:500', ], 'atendimento.altura' => [ 'nullable', 'numeric', 'min:20', 'max:250', ], 'atendimento.afericaoPa' => [ 'nullable', 'regex:regex:/^[0-9]{1,2}\/+[0-9]{1,2}$/', ], 'atendimento.temperatura' => [ 'nullable', 'numeric', 'min:20', 'max:45', ], 'atendimento.glicemia' => [ 'nullable', 'required_if:atendimento.momento_coleta_id, !=, null', 'numeric', 'max:800', ], 'atendimento.momento_coleta_id' => [ 'nullable', 'required_if:atendimento.glicemia, !=, null', 'integer', Rule::exists(MomentoColeta::class, 'id'), ], 'atendimento.desfecho_id' => [ 'nullable', 'integer', Rule::exists(Desfecho::class, 'id'), ], 'complemento' => [ 'nullable', 'max:1000', ], ])->validate(); } 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; } private static function getAcompanhamentosSaude($pacienteId) { $acompanhamentos = collect(); $paciente = Paciente::findOrFail($pacienteId); $idade = $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 && $paciente->cidadao->sexo_id === Sexo::FEMININO && self::hasProblemaCondicaoGravidezAtivoOuLatente($paciente) ) { $acompanhamentos->push(['sequencia' => 2, 'value' => 'gestante', 'text' => 'GESTANTE']); } if ($idade['anos'] >= 20) { if (self::hasProblemaCondicaoHipertensaoAtivoOuLatente($paciente)) { $acompanhamentos->push(['sequencia' => 3, 'value' => 'hipertenso', 'text' => 'HIPERTENSO']); } if (self::hasProblemaCondicaoDiabeteAtivoOuLatente($paciente)) { $acompanhamentos->push(['sequencia' => 4, 'value' => 'diabetico', 'text' => 'DIABÉTICO']); } } if ($idade['anos'] >= 60) { $acompanhamentos->push(['sequencia' => 1, 'value' => 'idoso', 'text' => 'IDOSO']); } if ($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('atencao_basica_atendimento_individual_problema_condicao') ->join('geral_ciap as ciap', 'ciap.id', 'atencao_basica_atendimento_individual_problema_condicao.ciap_id') ->join('atencao_basica_atendimento_individual as atendimento_individual', 'atendimento_individual.id', 'atencao_basica_atendimento_individual_problema_condicao.atendimento_individual_id') ->whereIn('atencao_basica_atendimento_individual_problema_condicao.situacao_id', [ ProblemaCondicaoSituacaoEnum::ATIVO, ProblemaCondicaoSituacaoEnum::LATENTE, ]) ->where('ciap.codigo', CiapEnum::GRAVIDEZ) ->where('atendimento_individual.paciente_id', $paciente->id) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_problema_condicao as problema_condicao_posterior') ->join('atencao_basica_atendimento_individual as atendimento_individual_posterior', 'atendimento_individual_posterior.id', 'problema_condicao_posterior.atendimento_individual_id') ->whereColumn('problema_condicao_posterior.problema_condicao_anterior_id', 'atencao_basica_atendimento_individual_problema_condicao.id') ) ->exists(); } private static function hasProblemaCondicaoHipertensaoAtivoOuLatente($paciente) { return DB::table('atencao_basica_atendimento_individual_problema_condicao') ->join('sigtap.cid as cid', 'cid.id', 'atencao_basica_atendimento_individual_problema_condicao.cid_id') ->join('atencao_basica_atendimento_individual as atendimento_individual', 'atendimento_individual.id', 'atencao_basica_atendimento_individual_problema_condicao.atendimento_individual_id') ->whereIn('atencao_basica_atendimento_individual_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('atendimento_individual.paciente_id', $paciente->id) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_problema_condicao as problema_condicao_posterior') ->join('atencao_basica_atendimento_individual as atendimento_individual_posterior', 'atendimento_individual_posterior.id', 'problema_condicao_posterior.atendimento_individual_id') ->whereColumn('problema_condicao_posterior.problema_condicao_anterior_id', 'atencao_basica_atendimento_individual_problema_condicao.id') ) ->exists(); } private static function hasProblemaCondicaoDiabeteAtivoOuLatente($paciente) { return DB::table('atencao_basica_atendimento_individual_problema_condicao') ->join('sigtap.cid as cid', 'cid.id', 'atencao_basica_atendimento_individual_problema_condicao.cid_id') ->join('atencao_basica_atendimento_individual as atendimento_individual', 'atendimento_individual.id', 'atencao_basica_atendimento_individual_problema_condicao.atendimento_individual_id') ->whereIn('atencao_basica_atendimento_individual_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('atendimento_individual.paciente_id', $paciente->id) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_problema_condicao as problema_condicao_posterior') ->join('atencao_basica_atendimento_individual as atendimento_individual_posterior', 'atendimento_individual_posterior.id', 'problema_condicao_posterior.atendimento_individual_id') ->whereColumn('problema_condicao_posterior.problema_condicao_anterior_id', 'atencao_basica_atendimento_individual_problema_condicao.id') ) ->exists(); } private static function getUltimaVisitaDomiciliar($pacienteId) { return DB::table('atencao_basica_visita_domiciliar') ->select(['atencao_basica_visita_domiciliar.id']) ->where('atencao_basica_visita_domiciliar.paciente_id', $pacienteId) ->orderByDesc('atencao_basica_visita_domiciliar.id') ->first(); } private static function isRecemNascidoCrianca($paciente) { return $paciente['cidadao_idade_anos'] < 2; } private static function isGestantePuerpera($paciente) { return DB::table('atencao_basica_cadastro_individual') ->where('atencao_basica_cadastro_individual.paciente_id', $paciente['paciente_id']) ->where('gestante', true) ->exists(); } private static function isDiabetico($paciente) { return DB::table('atencao_basica_cadastro_individual') ->where('atencao_basica_cadastro_individual.paciente_id', $paciente['paciente_id']) ->where('diabetes', true) ->exists(); } private static function isHipertenso($paciente) { return DB::table('atencao_basica_cadastro_individual') ->where('atencao_basica_cadastro_individual.paciente_id', $paciente['paciente_id']) ->where('hipertensao', true) ->exists(); } private static function isIdoso($paciente) { return $paciente['cidadao_idade_anos'] >= 60; } }