Files
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

951 lines
51 KiB
PHP

<?php
namespace App\Services\AtencaoBasica\AtendimentoDomiciliar;
use App\Enums\AtencaoBasica\AtendimentoDomiciliar\Modalidade;
use App\Enums\AtencaoBasica\AtendimentoDomiciliar\Procedimento as EnumAtendimentoDomiciliarProcedimento;
use App\Enums\AtencaoBasica\Parametrizacao\Permissao;
use App\Enums\AtencaoBasica\TipoAtendimento as AtencaoBasicaTipoAtendimento;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliar;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarAtendimento;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarAtendimentoIvcf;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarAtendProblemaCondicao;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarCondicao;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarCondicaoAvaliada;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarProcedimento;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\CondutaDesfecho;
use App\Models\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
use App\Models\AtencaoBasica\AtendimentoIndividual\DoencaTransmissivel;
use App\Models\AtencaoBasica\AtendimentoIndividual\ModalidadeAtencaoDomiciliar;
use App\Models\AtencaoBasica\AtendimentoIndividual\Rastreamento;
use App\Models\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
use App\Models\AtencaoBasica\CadastroPerfilEpidemiologico;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\AtencaoBasica\Parametrizacao\Equipe;
use App\Models\AtencaoBasica\Parametrizacao\OutrosPermissaoOcupacao;
use App\Models\AtencaoBasica\Procedimento\Procedimento as AtencaoBasicaProcedimento;
use App\Models\AtencaoBasica\Procedimento\ProcedimentoAtendimento;
use App\Models\AtencaoBasica\Procedimento\ProcedimentoAtendimentoProcedimento;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Geral\Ciap;
use App\Models\Geral\Turno;
use App\Models\Integracao\Esus\Inconsistencia;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class AtendimentoDomiciliarService extends Service
{
public static function index()
{
return [
'form' => [
'unidades' => [],
],
'model' => [
'periodo' => [
'start' => null,
'end' => null
],
'usuario' => null,
'unidade_id' => null
]
];
}
public static function list()
{
return AtendimentoDomiciliar::with('usuario')
->where('data', '>=', request()->data_inicial)
->where('data', '<=', request()->data_final)
->when(request()->usuario_id, function($query) {
$query->where('usuario_id', request()->usuario_id);
})
->when(request()->unidade_id, function($query) {
$query->where('unidade_id', request()->unidade_id);
})
->get()
->map(function($query){
return [
'id' => $query->id,
'data' => $query->data,
'profissional' => $query->usuario->nome,
'cns' => $query->usuario->cidadao->cns,
'unidade' => $query->equipe->unidade->nome_fantasia,
'exportacao' => $query->exportacao,
'data_exportacao' => $query->exportacao_id
? (new Carbon($query->exportado->created_at))->format('d/m/Y') . ' às '
. (new Carbon($query->exportado->created_at))->format('H:i')
: null,
'profissional_exportacao' => $query->usuarioExportacao->cidadao->nome ?? null,
];
});
}
public static function create()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData()
];
}
public static function getUnidades()
{
if(isset(request()->data_inicial) && isset(request()->data_final)) {
return DB::table('atencao_basica_atendimento_domiciliar as atendimento_domiciliar')
->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 as equipe', 'atendimento_domiciliar.equipe_id', 'equipe.id')
->join('cadastro_unidade', 'equipe.unidade_id', 'cadastro_unidade.id')
->where('atendimento_domiciliar.data', '>=', request()->data_inicial)
->where('atendimento_domiciliar.data', '<=', request()->data_final)
->when(request()->usuario_id, fn ($q, $id) => $q->where('atendimento_domiciliar.usuario_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id))
->distinct()
->orderBy('cadastro_unidade.cnes')
->get();
}
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 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 getOcupacoes()
{
$usuario = Usuario::findOrFail(request()->usuario_id);
$permissao = OutrosPermissaoOcupacao::where('permissao_id', Permissao::ATENDIMENTO_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');
}
public static function store()
{
return self::saveStore(request()->all());
}
public static function saveStore($params)
{
self::validate($params);
$params = (object) $params;
$atendimento_domiciliar = AtendimentoDomiciliar::where([
'usuario_id' => $params->usuario_id,
'equipe_id' => $params->equipe_id,
'ocupacao_id' => $params->ocupacao_id,
'usuario_auxiliar_id' => $params->usuario_auxiliar_id ?? null,
'equipe_auxiliar_id' => $params->equipe_auxiliar_id,
'ocupacao_auxiliar_id' => $params->ocupacao_auxiliar_id,
'data' => $params->data
])->whereHas('atendimentos', function ($query) {
$query->havingRaw('COUNT(*) < 99');
})->first();
if (!$atendimento_domiciliar) {
$atendimento_domiciliar = AtendimentoDomiciliar::create([
'usuario_id' => $params->usuario_id,
'equipe_id' => $params->equipe_id,
'ocupacao_id' => $params->ocupacao_id,
'usuario_auxiliar_id' => $params->usuario_auxiliar_id ?? null,
'equipe_auxiliar_id' => $params->equipe_auxiliar_id,
'ocupacao_auxiliar_id' => $params->ocupacao_auxiliar_id,
'data' => $params->data,
])->fresh();
}
$atencao_basica_procedimento = AtencaoBasicaProcedimento::where([
'usuario_id' => $atendimento_domiciliar->usuario_id,
'equipe_id' => $atendimento_domiciliar->equipe_id,
'ocupacao_id' => $atendimento_domiciliar->ocupacao_id,
'data_usuario_responsavel' => $atendimento_domiciliar->data,
'atendimento_domiciliar_id' => $atendimento_domiciliar->id
])->whereHas('procedimentoAtendimentos', function ($query) {
$query->havingRaw('COUNT(*) < 99');
})->first();
if (!$atencao_basica_procedimento) {
$atencao_basica_procedimento = AtencaoBasicaProcedimento::create([
'usuario_id' => $atendimento_domiciliar->usuario_id,
'equipe_id' => $atendimento_domiciliar->equipe_id,
'ocupacao_id' => $atendimento_domiciliar->ocupacao_id,
'data_usuario_responsavel' => $atendimento_domiciliar->data,
'atendimento_domiciliar_id' => $atendimento_domiciliar->id
])->fresh();
}
foreach($params->atendimentos as $atendimento)
{
$atendimento_domiciliar_atendimento = AtendimentoDomiciliarAtendimento::create([
'atendimento_domiciliar_id' => $atendimento_domiciliar->id,
'paciente_id' => $atendimento['paciente_id'],
'local_atendimento_id' => $atendimento['local_atendimento_id'],
'tipo_atendimento_id' => $atendimento['tipo_atendimento_id'],
'modalidade_id' => $atendimento['modalidade_id'],
'turno_id' => $atendimento['turno_id'],
'conduta_desfecho_id' => $atendimento['conduta_desfecho_id'],
'codigo_cid' => $atendimento['cid'] ?? null,
'codigo_ciap' => $atendimento['ciap'] ?? null,
'latitude' => $atendimento['latitude'] ?? null,
'longitude' => $atendimento['longitude'] ?? null,
'observacao_perfil_epidemiologico' => $atendimento['observacao_perfil_epidemiologico'] ?? null,
])->fresh();
if (!empty($atendimento['procedimentos'])) {
if (in_array($atendimento_domiciliar_atendimento->local_atendimento_id, [11, 12, 13])) {
$atendimento_domiciliar_atendimento->local_atendimento_id = 6;
}
$procedimento_atendimento = ProcedimentoAtendimento::create([
'paciente_id' => $atendimento_domiciliar_atendimento->paciente_id,
'procedimento_id' => $atencao_basica_procedimento->id,
'turno_id' => $atendimento_domiciliar_atendimento->turno_id,
'local_atendimento_id' => $atendimento_domiciliar_atendimento->local_atendimento_id,
'atendimento_domiciliar_id' => $atendimento_domiciliar_atendimento->id
])->fresh();
}
if (isset($atendimento['perfis_epidemiologicos'])) {
$atendimento_domiciliar_atendimento->perfisEpidemiologicos()->sync($atendimento['perfis_epidemiologicos']);
}
foreach($atendimento['condicoes'] as $condicao)
{
AtendimentoDomiciliarCondicao::create([
'atendimento_id' => $atendimento_domiciliar_atendimento->id,
'condicao_id' => $condicao
]);
}
foreach($atendimento['procedimentos'] as $procedimento)
{
AtendimentoDomiciliarProcedimento::create([
'atendimento_id' => $atendimento_domiciliar_atendimento->id,
'codigo_procedimento' => $procedimento['codigo']
]);
ProcedimentoAtendimentoProcedimento::create([
'procedimento_id' => $procedimento['id'],
'procedimento_atendimento_id' => $procedimento_atendimento->id
]);
}
self::saveProblemasCondicoes($atendimento_domiciliar_atendimento, $atendimento['problemas_condicoes']);
$atendimento_domiciliar_atendimento->condicaoAvaliada()->sync($atendimento['condicao_avaliada']);
$atendimento_domiciliar_atendimento->doencaTransmissivel()->sync($atendimento['doenca_transmissivel']);
$atendimento_domiciliar_atendimento->rastreamento()->sync($atendimento['rastreamento']);
if (isset($atendimento['ivcf']['deseja_preencher']) && $atendimento['ivcf']['deseja_preencher'] === true) {
AtendimentoDomiciliarAtendimentoIvcf::updateOrCreate(
[
'atendimento_domiciliar_atendimento_id' => $atendimento_domiciliar_atendimento->id
],
[
'atendimento_domiciliar_atendimento_id' => $atendimento_domiciliar_atendimento->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_abaixo_22'],
'panturrilha_abaixo_31' => $atendimento['ivcf']['panturrilha_abaixo_31'],
'marcha_lenta_4m_maior_5s' => $atendimento['ivcf']['marcha_lenta_4m_maior_5s'],
'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']['polifarmacia_5_ou_mais_medicamentos'],
'internacao_ultimos_6_meses' => $atendimento['ivcf']['internacao_ultimos_6_meses'],
]
);
} else {
AtendimentoDomiciliarAtendimentoIvcf::where('atendimento_domiciliar_atendimento_id', $atendimento_domiciliar_atendimento->id)->delete();
}
}
if ($atencao_basica_procedimento && !$atencao_basica_procedimento->procedimentoAtendimentos()->exists()) {
$atencao_basica_procedimento->delete();
}
}
private static function validate($params)
{
return Validator::make($params, [
'usuario_id' => [
'required',
'integer',
Rule::exists(Usuario::class, 'id')
],
'equipe_id' => [
'required',
'integer',
Rule::exists(Equipe::class, 'id')
],
'ocupacao_id' => [
'required',
'integer',
Rule::exists(Ocupacao::class, 'id')
],
'usuario_auxiliar_id' => [
'nullable',
'integer',
Rule::exists(Usuario::class, 'id')
],
'equipe_auxiliar_id' => [
'nullable',
'integer',
Rule::exists(Equipe::class, 'id')
],
'ocupacao_auxiliar_id' => [
'nullable',
'integer',
Rule::exists(Ocupacao::class, 'id')
],
'data' => [
'required',
'date',
],
'atendimentos' => [
'array',
],
'atendimentos.*.paciente_id' => [
'required'
],
'atendimentos.*.local_atendimento_id' => [
'required'
],
'atendimentos.*.tipo_atendimento_id' => [
'required'
],
'atendimentos.*.modalidade_id' => [
'nullable',
],
'atendimentos.*.turno_id' => [
'required'
],
'atendimentos.*.conduta_desfecho_id' => [
'required'
],
])->validate();
}
private static function getModelData($id = null)
{
$atendimento_domiciliar = AtendimentoDomiciliar::with(['atendimentos.paciente'])->find($id);
return [
'id' => $atendimento_domiciliar->id ?? null,
'usuario' => $atendimento_domiciliar ? [
'id' => $atendimento_domiciliar->usuario->id,
'cidadao_nome' => $atendimento_domiciliar->usuario->nome,
'cidadao_cns' => $atendimento_domiciliar->usuario->cidadao->cns
] : null,
'usuario_auxiliar' => $atendimento_domiciliar && $atendimento_domiciliar->usuario_auxiliar_id ? [
'id' => $atendimento_domiciliar->usuarioAuxiliar->id,
'cidadao_nome' => $atendimento_domiciliar->usuarioAuxiliar->nome,
'cidadao_cns' => $atendimento_domiciliar->usuarioAuxiliar->cidadao->cns
] : null,
'unidade_id' => $atendimento_domiciliar ? $atendimento_domiciliar->equipe->unidade_id : null,
'infraestrutura_id' => $atendimento_domiciliar ? $atendimento_domiciliar->equipe->infraestrutura_id : null,
'equipe_id' => $atendimento_domiciliar->equipe_id ?? null,
'ocupacao_id' => $atendimento_domiciliar->ocupacao_id ?? null,
'unidade_auxiliar_id' => $atendimento_domiciliar && $atendimento_domiciliar->usuario_auxiliar_id ? $atendimento_domiciliar->equipeAuxiliar->unidade_id : null,
'infraestrutura_auxiliar_id' => $atendimento_domiciliar && $atendimento_domiciliar->usuario_auxiliar_id ? $atendimento_domiciliar->equipeAuxiliar->infraestrutura_id : null,
'equipe_auxiliar_id' => $atendimento_domiciliar->equipe_auxiliar_id ?? null,
'ocupacao_auxiliar_id' => $atendimento_domiciliar->ocupacao_auxiliar_id ?? null,
'data' => $atendimento_domiciliar->data ?? null,
'atendimentos' => $atendimento_domiciliar ? $atendimento_domiciliar->atendimentos->map(function($atendimento) {
$atendimento->paciente_nome = $atendimento->paciente->cidadao->nome;
$atendimento->cns = $atendimento->paciente->cidadao->cns;
$atendimento->data_nascimento = Carbon::parse($atendimento->paciente->cidadao->data_nascimento)->format('d/m/Y');
$atendimento->paciente_idade_anos = $atendimento->paciente->cidadao->idade['anos'] ?? null;
$atendimento->paciente_idade_meses = $atendimento->paciente->cidadao->idade['meses'] ?? null;
$atendimento->condicoes->transform(fn($condicao) => $condicao->condicao_id);
$ciap = Ciap::where('codigo', $atendimento->codigo_ciap)->first();
$atendimento->codigo_ciap = $ciap ? [
'codigo' => $ciap->codigo,
'descricao' => $ciap->descricao
] : null;
$cid = Cid::where('codigo', $atendimento->codigo_cid)->first();
$atendimento->codigo_cid = $cid ? [
'codigo' => $cid->codigo,
'nome' => $cid->nome
] : null;
$atendimento->procedimentos->transform(function($procedimento) {
$procedimento_sigtap = Procedimento::where('codigo', $procedimento->codigo_procedimento)->first();
return [
'id' => $procedimento_sigtap->id,
'nome' => $procedimento_sigtap->nome,
'codigo' => $procedimento->codigo_procedimento
];
});
$atendimento->condicao_avaliada = $atendimento->condicaoAvaliada()->pluck('id');
$atendimento->doenca_transmissivel = $atendimento->doencaTransmissivel()->pluck('id');
$atendimento->rastreamento = $atendimento->rastreamento()->pluck('id');
$atendimento->problemas_condicoes = self::getProblemasCondicoes($atendimento);
$ivcf = AtendimentoDomiciliarAtendimentoIvcf::where('atendimento_domiciliar_atendimento_id', $atendimento->id)->first();
$atendimento->ivcf = [
'deseja_preencher' => $ivcf ? true : false,
'estado_saude_geral' => $ivcf->estado_saude_geral ?? null,
'limitacao_compras' => $ivcf->limitacao_compras ?? null,
'limitacao_gestao_financeira' => $ivcf->limitacao_gestao_financeira ?? null,
'limitacao_tarefas_domesticas' => $ivcf->limitacao_tarefas_domesticas ?? null,
'banho_independencia' => $ivcf->banho_independencia ?? null,
'relato_esquecimento_por_terceiros' => $ivcf->relato_esquecimento_por_terceiros ?? null,
'esquecimento_piorando' => $ivcf->esquecimento_piorando ?? null,
'esquecimento_impacta_atividades' => $ivcf->esquecimento_impacta_atividades ?? null,
'humor_tristeza_desanimo' => $ivcf->humor_tristeza_desanimo ?? null,
'perda_interesse_atividades' => $ivcf->perda_interesse_atividades ?? null,
'limitacao_elevar_bracos' => $ivcf->limitacao_elevar_bracos ?? null,
'limitacao_motricidade_fina' => $ivcf->limitacao_motricidade_fina ?? null,
'perda_peso_nao_intencional' => $ivcf->perda_peso_nao_intencional ?? null,
'imc_abaixo_22' => $ivcf->imc_abaixo_22 ?? null,
'panturrilha_abaixo_31' => $ivcf->panturrilha_abaixo_31 ?? null,
'marcha_lenta_4m_maior_5s' => $ivcf->marcha_lenta_4m_maior_5s ?? null,
'dificuldade_caminhar_impacto_atividades' => $ivcf->dificuldade_caminhar_impacto_atividades ?? null,
'quedas_recorrentes' => $ivcf->quedas_recorrentes ?? null,
'incontinencia' => $ivcf->incontinencia ?? null,
'problema_visao_impacto_atividades' => $ivcf->problema_visao_impacto_atividades ?? null,
'problema_audicao_impacto_atividades' => $ivcf->problema_audicao_impacto_atividades ?? null,
'doencas_cronicas_multiplas' => $ivcf->doencas_cronicas_multiplas ?? null,
'polifarmacia_5_ou_mais_medicamentos' => $ivcf->polifarmacia_5_ou_mais_medicamentos ?? null,
'internacao_ultimos_6_meses' => $ivcf->internacao_ultimos_6_meses ?? null,
];
$atendimento->perfis_epidemiologicos = $atendimento->perfisEpidemiologicos()->pluck('id');
$atendimento->observacao_perfil_epidemiologico = $atendimento->observacao_perfil_epidemiologico ?? null;
return $atendimento;
}) : [],
'paciente' => null,
'local_atendimento_id' => null,
'tipo_atendimento_id' => null,
'modalidade_id' => null,
'turno_id' => null,
'condicoes' => [],
'cid' => null,
'ciap' => null,
'procedimentos' => [],
'conduta_desfecho_id' => null,
'exportacao' => $atendimento_domiciliar->exportacao ?? false,
'condicao_avaliada' => [],
'doenca_transmissivel' => [],
'rastreamento' => [],
'problemas_condicoes' => [],
'ivcf' => [
'deseja_preencher' => false,
'estado_saude_geral' => null,
'limitacao_compras' => null,
'limitacao_gestao_financeira' => null,
'limitacao_tarefas_domesticas' => null,
'banho_independencia' => null,
'relato_esquecimento_por_terceiros' => null,
'esquecimento_piorando' => null,
'esquecimento_impacta_atividades' => null,
'humor_tristeza_desanimo' => null,
'perda_interesse_atividades' => null,
'limitacao_elevar_bracos' => null,
'limitacao_motricidade_fina' => null,
'perda_peso_nao_intencional' => null,
'imc_abaixo_22' => null,
'panturrilha_abaixo_31' => null,
'marcha_lenta_4m_maior_5s' => null,
'dificuldade_caminhar_impacto_atividades' => null,
'quedas_recorrentes' => null,
'incontinencia' => null,
'problema_visao_impacto_atividades' => null,
'problema_audicao_impacto_atividades' => null,
'doencas_cronicas_multiplas' => null,
'polifarmacia_5_ou_mais_medicamentos' => null,
'internacao_ultimos_6_meses' => null,
],
'perfis_epidemiologicos' => [],
'observacao_perfil_epidemiologico' => null,
];
}
private static function getFormData()
{
return [
'unidades' => [],
'infraestruturas' => [],
'equipes' => [],
'ocupacoes' => [],
'unidadesAuxiliar' => [],
'infraestruturasAuxiliar' => [],
'equipesAuxiliar' => [],
'ocupacoesAuxiliar' => [],
'locais_atendimento' => LocalAtendimento::get(),
'tipos_atendimento' => TipoAtendimento::whereIn('id', [
AtencaoBasicaTipoAtendimento::ATENDIMENTO_PROGRAMADO,
AtencaoBasicaTipoAtendimento::ATENDIMENTO_NAO_PROGRAMADO,
AtencaoBasicaTipoAtendimento::VISITA_DOMICILIAR_POS_OBITO,
])->get(),
'modalidades' => ModalidadeAtencaoDomiciliar::whereIn('id', [
Modalidade::AD_1,
Modalidade::AD_2,
Modalidade::AD_3,
])->get(),
'turnos' => Turno::get(),
'condicoes' => AtendimentoDomiciliarCondicaoAvaliada::get()
->map(function($query) {
return [
'nome' => $query->nome,
'codigo' => $query->codigo
];
}),
'procedimentos' => Procedimento::whereIn('codigo', [
EnumAtendimentoDomiciliarProcedimento::ACOMPANHAMENTO_PACIENTE_REABILITACAO_COMUNICACAO,
EnumAtendimentoDomiciliarProcedimento::ANTIBIOTICOTERAPIA_PARENTERAL,
EnumAtendimentoDomiciliarProcedimento::ATENDIMENTO_ACOMPANHAMENTO_PACIENTE_REABILITACAO_DESENVOLVIMENTO_MOTOR,
EnumAtendimentoDomiciliarProcedimento::ATENDIMENTO_FISIOTERAPEUTICO_PACIENTE_TRANSTORNO_RESPIRATORIO_SEM_COMPLICACOES_SISTEMICAS,
EnumAtendimentoDomiciliarProcedimento::ATEMDIMENTO_MEDICO_FINALIDADE_ATESTAR_OBITO,
EnumAtendimentoDomiciliarProcedimento::ATENDIMENTO_ACOMPANHAMENTO_REABILITACAO_MULTIPLAS_DEFICIENCIAS,
EnumAtendimentoDomiciliarProcedimento::CATETERISMO_VESICAL_ALIVIO,
EnumAtendimentoDomiciliarProcedimento::CATETERISMO_VESICAL_DEMORA,
EnumAtendimentoDomiciliarProcedimento::COLETA_MATERIAL_EXAME_LABORATORIAL,
EnumAtendimentoDomiciliarProcedimento::CUIDADOS_ESTOMAS,
EnumAtendimentoDomiciliarProcedimento::CUIDADOS_TRAQUEOSTOMIA,
EnumAtendimentoDomiciliarProcedimento::ENEMA,
EnumAtendimentoDomiciliarProcedimento::OXIGENOTERAPIA,
EnumAtendimentoDomiciliarProcedimento::RETIRADAS_PONTOS_CIRURGIAS_BASICAS,
EnumAtendimentoDomiciliarProcedimento::SONDAGEM_GASTRICA,
EnumAtendimentoDomiciliarProcedimento::TERAPIA_REIDRATACAO_ORAL,
EnumAtendimentoDomiciliarProcedimento::TERAPIA_REIDRATACAO_PARENTERAL,
EnumAtendimentoDomiciliarProcedimento::TERAPIA_FONOAUDIOLOGICA_INDIVIDUAL,
EnumAtendimentoDomiciliarProcedimento::TRATAMENTO_TRAUMATISMO,
EnumAtendimentoDomiciliarProcedimento::TRATAMENTO_REABILITACAO,
EnumAtendimentoDomiciliarProcedimento::TRAQUEOSTOMIA,
])
->groupBy('codigo')
->get()
->map(function($query){
return [
'id' => $query->id,
'nome' => $query->nome,
'codigo' => $query->codigo
];
}),
'condutaDesfecho' => CondutaDesfecho::get(),
'condicao_avaliada' => CondicaoAvaliada::orderBy('descricao')->get(),
'doenca_transmissivel' => DoencaTransmissivel::orderBy('descricao')->get(),
'rastreamento' => Rastreamento::orderBy('descricao')->get(),
'perfis_epidemiologicos' => CadastroPerfilEpidemiologico::orderBy('id')
->get(['id', 'descricao']),
];
}
public static function edit()
{
return [
'model' => self::getModelData(request()->id),
'form' => self::getFormData()
];
}
public static function update()
{
return self::saveUpdate(request()->all());
}
public static function saveUpdate($params)
{
self::validate($params);
$params = (object) $params;
$atendimento_domiciliar = AtendimentoDomiciliar::find($params->id);
$atendimento_domiciliar->usuario_id = $params->usuario_id;
$atendimento_domiciliar->equipe_id = $params->equipe_id;
$atendimento_domiciliar->ocupacao_id = $params->ocupacao_id;
$atendimento_domiciliar->usuario_auxiliar_id = $params->usuario_auxiliar_id ?? null;
$atendimento_domiciliar->equipe_auxiliar_id = $params->equipe_auxiliar_id ?? null;
$atendimento_domiciliar->ocupacao_auxiliar_id = $params->ocupacao_auxiliar_id ?? null;
$atendimento_domiciliar->data = $params->data;
$atendimento_domiciliar->save();
$atencaoBasicaProcedimento = AtencaoBasicaProcedimento::where('atendimento_domiciliar_id', $atendimento_domiciliar->id)->first();
foreach ($params->atendimentos as $atendimento) {
$atendimento_domiciliar_atendimento = AtendimentoDomiciliarAtendimento::find($atendimento['id']);
if (!$atendimento_domiciliar_atendimento) {
$atendimento_domiciliar_atendimento = AtendimentoDomiciliarAtendimento::create([
'atendimento_domiciliar_id' => $atendimento_domiciliar->id,
'paciente_id' => $atendimento['paciente_id'],
'local_atendimento_id' => $atendimento['local_atendimento_id'],
'tipo_atendimento_id' => $atendimento['tipo_atendimento_id'],
'modalidade_id' => $atendimento['modalidade_id'],
'turno_id' => $atendimento['turno_id'],
'conduta_desfecho_id' => $atendimento['conduta_desfecho_id'],
'codigo_cid' => $atendimento['cid'] ?? null,
'codigo_ciap' => $atendimento['ciap'] ?? null
])->fresh();
if (in_array($atendimento['local_atendimento_id'], [11, 12, 13])) {
$atendimento['local_atendimento_id'] = 6;
}
$procedimento_atendimento = ProcedimentoAtendimento::create([
'paciente_id' => $atendimento['paciente_id'],
'procedimento_id' => $atencaoBasicaProcedimento->id,
'turno_id' => $atendimento['turno_id'],
'local_atendimento_id' => $atendimento['local_atendimento_id'],
'atendimento_domiciliar_id' => $atendimento_domiciliar_atendimento->id
])->fresh();
} else {
$atendimento_domiciliar_atendimento->paciente_id = $atendimento['paciente_id'];
$atendimento_domiciliar_atendimento->local_atendimento_id = $atendimento['local_atendimento_id'];
$atendimento_domiciliar_atendimento->tipo_atendimento_id = $atendimento['tipo_atendimento_id'];
$atendimento_domiciliar_atendimento->modalidade_id = $atendimento['modalidade_id'];
$atendimento_domiciliar_atendimento->turno_id = $atendimento['turno_id'];
$atendimento_domiciliar_atendimento->conduta_desfecho_id = $atendimento['conduta_desfecho_id'];
$atendimento_domiciliar_atendimento->codigo_cid = $atendimento['cid'] ?? null;
$atendimento_domiciliar_atendimento->codigo_ciap = $atendimento['ciap'] ?? null;
$atendimento_domiciliar_atendimento->save();
$procedimento_atendimento = ProcedimentoAtendimento::where('atendimento_domiciliar_id', $atendimento['id'])->first();
if ($procedimento_atendimento) {
$procedimento_atendimento->paciente_id = $atendimento['paciente_id'];
$procedimento_atendimento->turno_id = $atendimento['turno_id'];
$procedimento_atendimento->local_atendimento_id = $atendimento['local_atendimento_id'];
$procedimento_atendimento->save();
} else {
if (!empty($atendimento['procedimentos'])) {
$procedimento_atendimento = ProcedimentoAtendimento::create([
'paciente_id' => $atendimento['paciente_id'],
'procedimento_id' => $atendimento_domiciliar->procedimento->id,
'turno_id' => $atendimento['turno_id'],
'local_atendimento_id' => $atendimento['local_atendimento_id'],
'atendimento_domiciliar_id' => $atendimento_domiciliar_atendimento->id
])->fresh();
}
}
}
$condicoes = AtendimentoDomiciliarCondicao::where('atendimento_id', $atendimento_domiciliar_atendimento->id)->get();
$condicaoIds = $condicoes->pluck('condicao_id')->toArray();
foreach ($atendimento['condicoes'] as $condicao) {
if (!in_array($condicao, $condicaoIds)) {
AtendimentoDomiciliarCondicao::create([
'atendimento_id' => $atendimento_domiciliar_atendimento->id,
'condicao_id' => $condicao
])->fresh();
}
}
$procedimentos = AtendimentoDomiciliarProcedimento::where('atendimento_id', $atendimento_domiciliar_atendimento->id)->get();
$atendimento_procedimentos = $atendimento['procedimentos'];
$procedimentos->each(function ($procedimento) use ($atendimento_procedimentos) {
if (!in_array($procedimento->codigo_procedimento, array_column($atendimento_procedimentos, 'codigo'))) {
$procedimento->delete();
}
});
$procedimento_atendimento = ProcedimentoAtendimento::where('atendimento_domiciliar_id', $atendimento_domiciliar_atendimento->id)->first();
if ($procedimento_atendimento) {
ProcedimentoAtendimentoProcedimento::where('procedimento_atendimento_id', $procedimento_atendimento->id)
->get()
->each(function ($procedimento) use ($atendimento_procedimentos) {
if (!in_array($procedimento->procedimento_id, array_column($atendimento_procedimentos, 'id'))) {
$procedimento->delete();
}
});
$procedimentos_ficha_procedimentos = ProcedimentoAtendimentoProcedimento::where('procedimento_atendimento_id', $procedimento_atendimento->id)
->get();
foreach ($atendimento['procedimentos'] as $procedimento) {
if (!in_array($procedimento['codigo'], $procedimentos->pluck('codigo_procedimento')->toArray())) {
AtendimentoDomiciliarProcedimento::create([
'atendimento_id' => $atendimento_domiciliar_atendimento->id,
'codigo_procedimento' => $procedimento['codigo']
])->fresh();
}
if (!in_array($procedimento['id'], $procedimentos_ficha_procedimentos->pluck('procedimento_id')->toArray())) {
ProcedimentoAtendimentoProcedimento::create([
'procedimento_id' => $procedimento['id'],
'procedimento_atendimento_id' => $procedimento_atendimento->id
]);
}
}
}
self::saveProblemasCondicoes($atendimento_domiciliar_atendimento, $atendimento['problemas_condicoes']);
$atendimento_domiciliar_atendimento->condicaoAvaliada()->sync($atendimento['condicao_avaliada']);
$atendimento_domiciliar_atendimento->doencaTransmissivel()->sync($atendimento['doenca_transmissivel']);
$atendimento_domiciliar_atendimento->rastreamento()->sync($atendimento['rastreamento']);
if (isset($atendimento['ivcf']['deseja_preencher']) && $atendimento['ivcf']['deseja_preencher'] === true) {
AtendimentoDomiciliarAtendimentoIvcf::updateOrCreate(
[
'atendimento_domiciliar_atendimento_id' => $atendimento_domiciliar_atendimento->id
],
[
'atendimento_domiciliar_atendimento_id' => $atendimento_domiciliar_atendimento->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_abaixo_22'],
'panturrilha_abaixo_31' => $atendimento['ivcf']['panturrilha_abaixo_31'],
'marcha_lenta_4m_maior_5s' => $atendimento['ivcf']['marcha_lenta_4m_maior_5s'],
'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']['polifarmacia_5_ou_mais_medicamentos'],
'internacao_ultimos_6_meses' => $atendimento['ivcf']['internacao_ultimos_6_meses'],
]
);
} else {
AtendimentoDomiciliarAtendimentoIvcf::where('atendimento_domiciliar_atendimento_id', $atendimento_domiciliar_atendimento->id)->delete();
}
}
AtendimentoDomiciliarAtendimento::whereNotIn('id', array_column($params->atendimentos, 'id'))
->where('atendimento_domiciliar_id', $atendimento_domiciliar->id)
->get()
->each(function ($atendimento) {
DB::transaction(function () use ($atendimento) {
AtendimentoDomiciliarCondicao::where('atendimento_id', $atendimento->id)->delete();
AtendimentoDomiciliarProcedimento::where('atendimento_id', $atendimento->id)->delete();
$atendimento->condicaoAvaliada()->sync([]);
$atendimento->problemasCondicoes()->delete();
if ($procedimento = ProcedimentoAtendimento::where('atendimento_domiciliar_id', $atendimento->id)->first()) {
ProcedimentoAtendimentoProcedimento::where('procedimento_atendimento_id', $procedimento->id)->delete();
$procedimento->delete();
}
DB::transaction(function () use ($atendimento) {
$cliente = config('database.default');
$inconsistenciaIds = DB::table('integracao_esus_inconsistencia_atendimento_domiciliar_atend')
->where('atendimento_domiciliar_atendimento_id', $atendimento->id)
->pluck('inconsistencia_id');
foreach ($inconsistenciaIds as $inconsistenciaId) {
$xmlPath = 'integracao' . DIRECTORY_SEPARATOR
. 'esus' . DIRECTORY_SEPARATOR
. 'inconsistencia' . DIRECTORY_SEPARATOR
. 'xml-envio' . DIRECTORY_SEPARATOR
. $cliente . DIRECTORY_SEPARATOR
. $inconsistenciaId . '.xml';
Storage::disk('local')->delete($xmlPath);
}
DB::table('integracao_esus_inconsistencia')
->whereIn('id', $inconsistenciaIds)
->delete();
$atendimento->delete();
});
});
});
}
public static function destroy($id)
{
DB::transaction(function() use ($id) {
$atendimento_domiciliar = AtendimentoDomiciliar::find($id);
$atendimento_domiciliar->atendimentos->each(function($atendimento) {
AtendimentoDomiciliarCondicao::where('atendimento_id', $atendimento->id)->delete();
AtendimentoDomiciliarProcedimento::where('atendimento_id', $atendimento->id)->delete();
$procedimento_atendimento = ProcedimentoAtendimento::where('atendimento_domiciliar_id', $atendimento->id)->first();
if($procedimento_atendimento) {
ProcedimentoAtendimentoProcedimento::where('procedimento_atendimento_id', $procedimento_atendimento->id)->get()->each(function($procedimento) {
$procedimento->delete();
});
$procedimento_atendimento->delete();
}
DB::table('atencao_basica_atendimento_domiciliar_atend_condicao_avaliada')->where('atendimento_domiciliar_atendimento_id', $atendimento->id)->delete();
DB::table('atencao_basica_atendimento_domiciliar_atend_problema_condicao')->where('atendimento_domiciliar_atendimento_id', $atendimento->id)->delete();
DB::table('atencao_basica_atendimento_domiciliar_atend_rastreamento')->where('atendimento_domiciliar_atendimento_id', $atendimento->id)->delete();
$atendimento->delete();
});
AtencaoBasicaProcedimento::where('atendimento_domiciliar_id', $id)->delete();
$atendimento_domiciliar->delete();
});
}
public static function getArea()
{
$paciente = Paciente::find(request()->paciente_id);
if($paciente && $paciente->cidadao->domicilio_id) {
$cadastro_domiciliar = CadastroDomiciliar::where('domicilio_id', $paciente->cidadao->domicilio_id)->first();
if($cadastro_domiciliar) {
return 'Área: ' . ($cadastro_domiciliar->microarea->descricao ?? '-') .
' - Microárea: ' . ($cadastro_domiciliar->microarea->area->descricao ?? '-');
}
}
return '';
}
private static function getProblemasCondicoes($atendimento)
{
return AtendimentoDomiciliarAtendProblemaCondicao::where('atendimento_domiciliar_atendimento_id', $atendimento->id)
->get()
->map(fn ($problemaCondicao) => [
'id' => $problemaCondicao->id,
'ciap' => is_null($problemaCondicao->ciap_id) ? null : [
'id' => $problemaCondicao->ciap->id,
'codigo' => $problemaCondicao->ciap->codigo,
'descricao' => $problemaCondicao->ciap->descricao,
],
'cid' => is_null($problemaCondicao->cid_id) ? null : [
'id' => $problemaCondicao->cid->id,
'codigo' => $problemaCondicao->cid->codigo,
'nome' => $problemaCondicao->cid->nome,
],
])
->all();
}
private static function saveProblemasCondicoes($atendimento, $problemasCondicoes)
{
$ids = collect($problemasCondicoes)->pluck('id')->filter()->toArray();
$atendimento->problemasCondicoes()->whereNotIn('id', $ids)->delete();
if (!$problemasCondicoes) {
return false;
}
foreach ($problemasCondicoes as $problemaCondicao) {
$problemaCondicaoCiapId = isset($problemaCondicao['ciap']['id']) ? $problemaCondicao['ciap']['id'] : null;
$problemaCondicaoCidId = isset($problemaCondicao['cid']['id']) ? $problemaCondicao['cid']['id'] : null;
$data = [
'ciap_id' => $problemaCondicaoCiapId,
'cid_id' => $problemaCondicaoCidId,
];
$atendimento->problemasCondicoes()->updateOrCreate(
['id' => $problemaCondicao['id'] ?? null],
$data
);
}
}
}