1240 lines
60 KiB
PHP
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;
|
|
}
|
|
}
|