Files
rkm-conectasus-ci-sandbox/api/app/Services/AtencaoBasica/VisitaDomiciliar/VisitaDomiciliarService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

1240 lines
60 KiB
PHP

<?php
namespace App\Services\AtencaoBasica\VisitaDomiciliar;
use App\Enums\AtencaoBasica\AtendimentoIndividual\LocalAtendimento as EnumsLocalAtendimento;
use App\Enums\AtencaoBasica\CadastroDomiciliar\ImovelTipo as EnumsImovelTipo;
use App\Enums\AtencaoBasica\Parametrizacao\Permissao;
use App\Enums\AtencaoBasica\VisitaDomiciliar\Desfecho as EnumsDesfecho;
use App\Enums\AtencaoBasica\VisitaDomiciliar\Limite;
use App\Enums\AtencaoBasica\VisitaDomiciliar\MotivoVisita as EnumsMotivoVisita;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\Ambulatorio\ProblemaCondicaoSituacao as ProblemaCondicaoSituacaoEnum;
use App\Enums\Sigtap\Cid as CidEnum;
use App\Enums\Geral\Ciap as CiapEnum;
use App\Exceptions\AtencaoBasica\AcompanhamentoException;
use App\Exceptions\AtencaoBasica\AcompanhamentoTipoImovelException;
use App\Exceptions\AtencaoBasica\BuscaAtivaException;
use App\Exceptions\AtencaoBasica\DesfechoException;
use App\Exceptions\AtencaoBasica\OutroMotivoException;
use App\Exceptions\AtencaoBasica\TipoVisitaException;
use App\Exceptions\AtencaoBasica\VisitaDuplicadaException;
use App\Models\AtencaoBasica\CadastroDomiciliar\ImovelTipo;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\AtencaoBasica\Parametrizacao\Equipe;
use App\Models\AtencaoBasica\Parametrizacao\OutrosPermissaoOcupacao;
use App\Models\AtencaoBasica\VisitaDomiciliar\Desfecho;
use App\Models\AtencaoBasica\VisitaDomiciliar\MomentoColeta;
use App\Models\AtencaoBasica\VisitaDomiciliar\MotivoVisita;
use App\Models\AtencaoBasica\VisitaDomiciliar\VisitaDomiciliar;
use App\Models\AtencaoBasica\VisitaDomiciliar\VisitaDomiciliarIvcf;
use App\Models\AtencaoBasica\VisitaDomiciliar\VisitaDomiciliarMotivoVisita;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Parametrizacao\Parametrizacao as CadastroParametrizacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Cns\TermoInvalido;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Services\Integracao\CnsService;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class VisitaDomiciliarService extends Service
{
public static function index()
{
return [];
}
public static function getAtendimentos()
{
$paciente = self::getPaciente(request()->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;
}
}