[ '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 ); } } }