cadastro_paciente_desatualizado_quantidade_dias ?? 0; $provisorioBloqueado = $parametrizacao->cadastro_paciente_provisorio_bloqueado ?? false; $provisorioQuantidadeDias = $parametrizacao->cadastro_paciente_provisorio_quantidade_dias ?? 0; $pacientes = DB::table('cadastro_paciente') ->leftJoin('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->leftJoin( 'cadastro_carteira_identidade', function ($leftJoin) { $leftJoin->on('cadastro_carteira_identidade.cidadao_id', 'cadastro_cidadao.id') ->whereNull('cadastro_carteira_identidade.deleted_at') ->whereRaw('cadastro_carteira_identidade.id = ( SELECT id FROM cadastro_carteira_identidade WHERE cadastro_carteira_identidade.cidadao_id = cadastro_cidadao.id ORDER BY cadastro_carteira_identidade.id LIMIT 1 )'); } ) ->leftJoin('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao.domicilio_id') ->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id') ->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id') ->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id') ->leftJoin('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id') ->leftJoin('cadastro_obito', function ($join) { $join->on('cadastro_cidadao.id', '=', 'cadastro_obito.cidadao_id') ->whereNull('cadastro_obito.deleted_at'); }) ->whereNull('cadastro_paciente.deleted_at') ->whereNull('cadastro_paciente.sequencial_desconhecido_em') ->select( 'cadastro_paciente.id', 'cadastro_paciente.bloqueado', 'cadastro_paciente.classificacao_id', 'cadastro_paciente.subclassificacao_id', 'cadastro_cidadao.nome', 'cadastro_cidadao.nome_social', 'cadastro_cidadao.preferencia_nome_id', 'cadastro_cidadao.data_nascimento', 'cadastro_cidadao.nome_mae', 'cadastro_cidadao.cpf', 'cadastro_cidadao.cns', 'cadastro_cidadao.dnv', 'cadastro_carteira_identidade.numero AS rg', 'cadastro_obito.obito_em', DB::raw('LPAD(cadastro_paciente.prontuario,7,0) as prontuario'), 'cadastro_municipio.nome as municipio_nome', 'cadastro_estado.uf as uf', DB::raw('GREATEST(cadastro_paciente.updated_at, cadastro_cidadao.updated_at) AS updated_at'), DB::raw(' CASE WHEN cadastro_paciente.updated_at IS NULL AND cadastro_cidadao.updated_at IS NULL THEN 1 WHEN cadastro_paciente.updated_at IS NOT NULL AND (cadastro_cidadao.updated_at IS NULL OR cadastro_paciente.updated_at > cadastro_cidadao.updated_at) THEN CASE WHEN ' . ($quantidadeDias > 0 ? 'DATE_ADD(cadastro_paciente.updated_at, INTERVAL ' . $quantidadeDias . ' DAY) < NOW()' : 'false') . ' THEN DATEDIFF(NOW(), DATE_ADD(cadastro_paciente.updated_at, INTERVAL ' . $quantidadeDias . ' DAY)) ELSE 0 END WHEN cadastro_cidadao.updated_at IS NOT NULL AND (cadastro_paciente.updated_at IS NULL OR cadastro_cidadao.updated_at > cadastro_paciente.updated_at) THEN CASE WHEN ' . ($quantidadeDias > 0 ? 'DATE_ADD(cadastro_cidadao.updated_at, INTERVAL ' . $quantidadeDias . ' DAY) < NOW()' : 'false') . ' THEN DATEDIFF(NOW(), DATE_ADD(cadastro_cidadao.updated_at, INTERVAL ' . $quantidadeDias . ' DAY)) ELSE 0 END ELSE 0 END as dias_cadastro_desatualizado '), DB::Raw(" ( SELECT cadastro_cidadao_telefone.numero FROM cadastro_cidadao_telefone WHERE cadastro_cidadao_telefone.cidadao_id = cadastro_cidadao.id AND cadastro_cidadao_telefone.principal = TRUE AND cadastro_cidadao_telefone.deleted_at IS NULL ORDER BY cadastro_cidadao_telefone.id DESC LIMIT 1 ) AS telefone_numero "), DB::Raw(" ( SELECT cadastro_carteira_identidade.numero FROM cadastro_carteira_identidade WHERE cadastro_carteira_identidade.cidadao_id = cadastro_cidadao.id AND cadastro_carteira_identidade.deleted_at IS NULL ORDER BY cadastro_carteira_identidade.id DESC LIMIT 1 ) AS carteira_identidade_numero "), DB::raw("DATE_FORMAT(GREATEST(cadastro_paciente.updated_at, cadastro_cidadao.updated_at), '%d/%m/%Y %H:%i:%s') AS data_hora_ultima_atualizacao"), DB::raw(" ( SELECT atencao_basica_cadastro_individual.responsavel FROM atencao_basica_cadastro_individual WHERE atencao_basica_cadastro_individual.paciente_id = cadastro_paciente.id ORDER BY atencao_basica_cadastro_individual.id DESC LIMIT 1 ) AS paciente_responsavel_familiar "), 'cadastro_cidadao.deficiencia_id', ); if (DataUtil::isStringTrue(request()->with_prontuario_unidade)) { $pacientes->addSelect([ 'prontuario_unidade' => function ($query) { $query->select('cadastro_prontuario_unidade.prontuario') ->from('cadastro_prontuario_unidade') ->whereColumn('cadastro_prontuario_unidade.paciente_id', 'cadastro_paciente.id') ->where( 'cadastro_prontuario_unidade.unidade_id', self::getCurrentCentroCusto()->infraestrutura->unidade_id ) ->whereNull('deleted_at') ->groupBy('cadastro_prontuario_unidade.paciente_id'); } ]); } if (!DataUtil::isStringTrue(request()->with_paciente_bloqueado)) { $pacientes->where(function ($query) { $query ->where('cadastro_paciente.bloqueado', false) ->orWhereNull('cadastro_paciente.bloqueado'); }); } if (!DataUtil::isStringTrue(request()->with_paciente_provisorio) && $provisorioBloqueado) { $pacientes->where(function ($query) use ($provisorioQuantidadeDias) { $query->where('cadastro_paciente.subclassificacao_id', '!=', Subclassificacao::TEMPORARIO) ->orWhere(function ($query) use ($provisorioQuantidadeDias) { $query->where('cadastro_paciente.subclassificacao_id', Subclassificacao::TEMPORARIO) ->where(function ($query) use ($provisorioQuantidadeDias) { $query->where(function ($query) { $query->whereNull('cadastro_paciente.validade_inicio') ->orWhereDate('cadastro_paciente.validade_inicio', '<=', Carbon::now()->format('Y-m-d')); }); $query->where(function ($query) use ($provisorioQuantidadeDias) { $query->whereNull('cadastro_paciente.validade_fim') ->orWhere(function ($query) use ($provisorioQuantidadeDias) { if (!is_null($provisorioQuantidadeDias) && $provisorioQuantidadeDias > 0) { $query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d')) ->orWhereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->subDays($provisorioQuantidadeDias)->format('Y-m-d')); } else { $query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d')); } }); }); }); }) ->orWhereNull('cadastro_paciente.subclassificacao_id'); }); } return datatables() ->of($pacientes) ->filterColumn('cadastro_paciente.prontuario', function ($query, $keyword) { $query->whereRaw('LPAD(cadastro_paciente.prontuario,7,0) like ?', ["%{$keyword}%"]); }) ->filterColumn('cadastro_prontuario_unidade.prontuario', function ($query, $keyword) { $query->whereRaw('EXISTS ( SELECT 1 FROM cadastro_prontuario_unidade WHERE cadastro_prontuario_unidade.paciente_id = cadastro_paciente.id AND cadastro_prontuario_unidade.unidade_id = ? AND cadastro_prontuario_unidade.prontuario LIKE ? AND cadastro_prontuario_unidade.deleted_at IS NULL )', [self::getCurrentCentroCusto()->infraestrutura->unidade_id, "%{$keyword}%"]); }) ->filterColumn('cadastro_cidadao.cpf', function ($query, $keyword) { $query ->whereRaw("cadastro_cidadao.cpf like ?", ["%{$keyword}%"]) ->orWhereRaw( "CONCAT( SUBSTR(cadastro_cidadao.cpf,1,3), '.', SUBSTR(cadastro_cidadao.cpf,4,3), '.', SUBSTR(cadastro_cidadao.cpf,7,3), '-', SUBSTR(cadastro_cidadao.cpf,10,2) ) like ?", ["%{$keyword}%"] ); }) ->filterColumn('cadastro_cidadao.dnv', function ($query, $keyword) { $query ->whereRaw("cadastro_cidadao.dnv like ?", ["%{$keyword}%"]) ->orWhereRaw( "CONCAT( SUBSTR(cadastro_cidadao.dnv,1,2), '-', SUBSTR(cadastro_cidadao.dnv,3,8), '-', SUBSTR(cadastro_cidadao.dnv,11,1) ) like ?", ["%{$keyword}%"] ); }) ->filterColumn('cadastro_cidadao.data_nascimento', function ($query, $keyword) { $query ->whereRaw("DATE_FORMAT(cadastro_cidadao.data_nascimento, '%d/%m/%Y') like ?", ["%{$keyword}%"]) ->orWhereRaw( "CONCAT( SUBSTR(cadastro_cidadao.data_nascimento,9,2), SUBSTR(cadastro_cidadao.data_nascimento,6,2), SUBSTR(cadastro_cidadao.data_nascimento,1,4) ) like ?", ["%{$keyword}%"] ); }) ->filterColumn('telefone_numero', function ($query, $keyword) { $query->whereRaw( " ( SELECT cadastro_cidadao_telefone.numero FROM cadastro_cidadao_telefone WHERE cadastro_cidadao_telefone.cidadao_id = cadastro_cidadao.id AND cadastro_cidadao_telefone.principal = TRUE ORDER BY cadastro_cidadao_telefone.id DESC LIMIT 1 ) like ? ", ["%{$keyword}%"] ); }) ->filterColumn('carteira_identidade_numero', function ($query, $keyword) { $query->whereRaw( " ( SELECT cadastro_carteira_identidade.numero FROM cadastro_carteira_identidade WHERE cadastro_carteira_identidade.cidadao_id = cadastro_cidadao.id AND cadastro_carteira_identidade.deleted_at IS NULL ORDER BY cadastro_carteira_identidade.id DESC LIMIT 1 ) like ? ", ["%{$keyword}%"] ); }) ->filterColumn('data_hora_ultima_atualizacao', function ($query, $keyword) { $query->whereRaw("DATE_FORMAT(GREATEST(cadastro_paciente.updated_at, cadastro_cidadao.updated_at), '%d/%m/%Y %H:%i:%s')", ["%{$keyword}%"]); }) ->skipTotalRecords() ->toJson(); } public function index() { $this->auth(__FUNCTION__); $pacientes = $this->get(Paciente::class) ->whereNull('sequencial_desconhecido_em') ->doesntHave('cidadao.obito') ->get(); return response()->json($pacientes, Response::HTTP_OK); } public function validCNS() { $paciente = Paciente::findOrFail(request()->paciente_id); $parametrizacao = Parametrizacao::first(); return [ 'additionals' => [ 'cns_valido' => Cns::isValid($paciente->cidadao->cns), 'avisa_cns_temporario_invalido' => $parametrizacao->exibe_alerta_paciente_cns_temporario_invalido ?? false, 'cns_provisorio' => self::avisaCnsProvisorio($paciente), ] ]; } private static function avisaCnsProvisorio($paciente) { return Str::startsWith($paciente->cidadao->cns, [5, 7, 8, 9]); } public function list() { $this->auth(__FUNCTION__); $lotacao = $this->getCurrentLotacao(); $isPermissaoEndereco = ParametrizacaoPermissaoOcupacao::where('ocupacao_id', $lotacao->ocupacao_id)->first(); $count = ParametrizacaoPermissaoOcupacao::count(); $permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $lotacao->usuario_id) ->where('infraestrutura_id', $lotacao->infraestrutura_id) ->first(); $countUsuario = ParametrizacaoPermissaoUsuario::count(); $classificacoes = $permissaoUsuario ? PacienteClassificacao::orderBy('descricao') ->get() ->filter(function ($classificacao) use ($permissaoUsuario) { $exibe = false; switch ($classificacao->id) { case Classificacao::MUNICIPE: $exibe = $permissaoUsuario->municipe; break; case Classificacao::PROVISORIO: $exibe = $permissaoUsuario->provisorio; break; case Classificacao::OUTRO_MUNICIPIO: $exibe = $permissaoUsuario->outro_municipio; break; } return $exibe ? [ 'id' => $classificacao->id, 'descricao' => $classificacao->descricao ] : null; }) ->values() : []; return response()->json( [ 'form' => [ 'classificacoes' => $classificacoes, 'is_permissao_cadastro' => $countUsuario === 0 ? true : false, 'is_permissao_endereco' => $isPermissaoEndereco || $count === 0 ? true : false, 'is_permissao_bloquear' => $permissaoUsuario && $permissaoUsuario->desbloquear_usuario || $countUsuario === 0 ? true : false, ], ], Response::HTTP_OK ); } public function create() { $this->auth(__FUNCTION__); $parametrizacao = Parametrizacao::first(); return response()->json( [ 'form' => $this->getFormData(), 'additionals' => [ 'exige_cpf_paciente' => $parametrizacao->exige_cpf_paciente ?? true, 'exige_cns_paciente' => $parametrizacao->exige_cns_paciente ?? true, ], 'model' => [ 'responsavel_data' => Carbon::now()->format('Y-m-d'), ], ], Response::HTTP_OK ); } public function show($id) { $this->auth(__FUNCTION__); return $this->getAdditionalsFormModelData($id, false); } public function store(PacienteRequest $request) { $this->auth(__FUNCTION__); return $this->saveStore($request->all()); } public function saveStore($params, $paciente = null) { $paciente = $this->save($params, $paciente); self::saveHistorico($paciente->id); $paciente->has_cadastro_individual = $paciente->cadastroIndividual && $paciente->cadastroIndividual->id ? true : false; $paciente->has_cadastro_domiciliar = optional($paciente->cidadao->domicilio)->cadastroDomiciliar ? true : false; if (isset($params['origem']) && $params['origem'] == 'mobile') { return $paciente->id; } return response()->json($paciente, Response::HTTP_CREATED); } public function edit($id) { $this->auth(__FUNCTION__); return $this->getAdditionalsFormModelData($id); } private static function getSistema() { $cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail(); return [ 'ramo_atividade' => $cliente->sistema->ramoAtividade->nome ?? null, 'nome_sistema' => $cliente->sistema->nome ?? null, 'versao' => $cliente->sistema->versao ?? null, ]; } public static function getResidentes($id) { $residentes = DB::table('cadastro_cidadao') ->select([ 'cadastro_cidadao.id AS id', 'cadastro_cidadao.nome AS nome', 'cadastro_cidadao.nome_social AS nome_social', 'cadastro_cidadao.cns', 'cadastro_paciente.id as paciente_id', 'cadastro_paciente_informacao_social.responsavel as is_responsavel', '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'), ]) ->join('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id') ->leftJoin(DB::raw(' ( SELECT abi1.* FROM atencao_basica_cadastro_individual abi1 WHERE abi1.id = ( SELECT MAX(abi2.id) FROM atencao_basica_cadastro_individual abi2 WHERE abi2.paciente_id = abi1.paciente_id ) ) AS 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') ->leftJoin(DB::raw(' ( SELECT pis1.* FROM cadastro_paciente_informacao_social pis1 WHERE pis1.id = ( SELECT MAX(pis2.id) FROM cadastro_paciente_informacao_social pis2 WHERE pis2.paciente_id = pis1.paciente_id ) ) AS cadastro_paciente_informacao_social '), 'cadastro_paciente_informacao_social.paciente_id', '=', 'cadastro_paciente.id') ->where('cadastro_cidadao.domicilio_id', $id) ->whereNull('cadastro_paciente.deleted_at') ->whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('cadastro_obito') ->whereColumn('cadastro_obito.cidadao_id', 'cadastro_cidadao.id') ->whereNull('cadastro_obito.deleted_at'); }) ->get(); $nomeResponsavelFamiliar = optional($residentes->firstWhere('is_responsavel', true))->nome ?? '-'; return $residentes->map(function ($residente) use ($nomeResponsavelFamiliar) { $residente->responsavel_familiar = $residente->is_responsavel ? '-' : $nomeResponsavelFamiliar; return $residente; }); } public static function getMicroareas(){ return DB::table('atencao_basica_parametrizacao_area') ->select([ 'atencao_basica_parametrizacao_microarea.id AS id', 'atencao_basica_parametrizacao_microarea.descricao AS descricao_micro', DB::raw("CONCAT( 'INE: ', CASE WHEN atencao_basica_parametrizacao_area.numero_ine THEN LPAD(atencao_basica_parametrizacao_area.numero_ine, 10, '0') ELSE '' END, CASE WHEN atencao_basica_parametrizacao_area.descricao THEN CONCAT(' - Área: ', atencao_basica_parametrizacao_area.descricao) ELSE '' END, ' - Microárea: ', atencao_basica_parametrizacao_microarea.descricao ) AS descricao") ]) ->join('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.area_id', 'atencao_basica_parametrizacao_area.id') ->groupBy('descricao') ->orderBy('descricao_micro') ->get(); } private function checkPermissaoCadastro($classificacaoId) { $lotacao = $this->getCurrentLotacao(); $permissaoUsuario = ParametrizacaoPermissaoUsuario::where([ 'usuario_id' => $lotacao->usuario_id, 'infraestrutura_id' => $lotacao->infraestrutura_id ])->first(); if (ParametrizacaoPermissaoUsuario::count() === 0) { return true; } if (!$permissaoUsuario) { return false; } if (!$classificacaoId && ($permissaoUsuario->municipe || $permissaoUsuario->provisorio || $permissaoUsuario->outro_municipio)) { return true; } switch ($classificacaoId) { case Classificacao::MUNICIPE: return $permissaoUsuario->municipe; case Classificacao::PROVISORIO: return $permissaoUsuario->provisorio; case Classificacao::OUTRO_MUNICIPIO: return $permissaoUsuario->outro_municipio; default: return false; } } private function getFormData($unidadeReferenciaId = null, $isEdit = null) { $unidadesReferencia = Unidade::where('unidade_referencia', true); if ($unidadeReferenciaId) { $unidadesReferencia->orWhere('id', $unidadeReferenciaId); } $lotacao = $this->getCurrentLotacao(); $isPermissaoEndereco = ParametrizacaoPermissaoOcupacao::where('ocupacao_id', $lotacao->ocupacao_id)->first(); $count = ParametrizacaoPermissaoOcupacao::count(); $permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $lotacao->usuario_id) ->where('infraestrutura_id', $lotacao->infraestrutura_id) ->first(); $countUsuario = ParametrizacaoPermissaoUsuario::count(); $classificacoes = self::getClassificacoes($permissaoUsuario, $countUsuario); return [ 'is_permissao_endereco' => $isEdit ? (($isPermissaoEndereco && $isEdit) || $count === 0 ? true : false) : true, 'is_permissao_bloquear' => $permissaoUsuario && $permissaoUsuario->desbloquear_usuario || $countUsuario === 0 ? true : false, 'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao), 'data_atual' => Carbon::now()->format('d/m/Y'), 'classificacoes' => $classificacoes, 'subclassificacoes' => PacienteSubclassificacao::orderBy('descricao')->get() ->map(fn ($subclassificacao) => [ 'id' => $subclassificacao->id, 'descricao' => $subclassificacao->descricao ]), 'unidades_referencia' => $unidadesReferencia->orderBy('nome_fantasia')->get() ->map(fn ($unidades) => [ 'id' => $unidades->id, 'nome_fantasia' => $unidades->cnes ? $unidades->cnes . ' - ' . $unidades->nome_fantasia : $unidades->nome_fantasia ]), 'bloqueado' => [ [ 'value' => true, 'text' => 'SIM'], [ 'value' => false, 'text' => 'NÃO'] ], 'acompanhamento_infantil' => AcompanhamentoInfantil::orderBy('descricao')->get(), 'curso' => Curso::orderBy('descricao')->get(), 'mercado_trabalho' => SituacaoMercadoTrabalho::orderBy('descricao')->get(), 'saida_cidadao' => SaidaCidadao::orderBy('descricao')->get(), 'sistema' => self::getSistema(), 'deficiencia' => DeficienciaBase::orderBy('descricao')->get()->each(function ($item) { $item->descricao = $item->id == Deficiencia::TEA ? $item->descricao : ucfirst(strtolower($item->descricao)); }), 'orientacao_sexual' => OrientacaoSexual::orderBy('descricao')->get(), 'imovel_tipo' => ImovelTipo::orderBy('descricao')->get(), 'situacao_domicilio' => SituacaoDomicilio::orderBy('descricao')->get(), 'domicilio_tipo' => DomicilioTipo::orderBy('descricao')->get(), 'situacao_rural' => SituacaoRural::orderBy('descricao')->get(), 'zonas' => Zona::orderBy('descricao')->get()->map(fn ($zona) => [ 'id' => $zona->id, 'descricao' => $zona->descricao ]), 'domicilio_tipo_acesso' => DomicilioTipoAcesso::orderBy('descricao')->get(), 'material_predominante' => MaterialPredominante::orderBy('descricao')->get(), 'abastecimento' => Abastecimento::orderBy('descricao')->get(), 'tratamento' => Tratamento::whereNotIn('id', [enumsTratamento::FILTRADA])->orderBy('descricao')->get(), 'destino_lixo' => DestinoLixo::whereNotin('id', [enumsDestinoLixo::QUEIMADO_ENTERRADO])->orderBy('descricao')->get(), 'forma_escoamento' => FormaEscoamento::orderBy('descricao')->get(), 'higiene_residencial' => HigieneResidencial::orderBy('descricao')->get(), 'animais' => Animal::orderBy('descricao')->get(), 'escalaCoelho' => EscalaCoelho::orderBy('id')->get(), 'lazer' => Lazer::orderBy('descricao')->get(), 'microareas' => self::getMicroareas(), 'parentesco' => Parentesco::orderBy('descricao')->get(), 'peso' => Peso::orderBy('descricao')->get(), 'doencas_cardiacas' => DoencaCardiaca::orderBy('descricao')->get(), 'problemas_rins' => ProblemasRins::orderBy('descricao')->get(), 'doencas_respiratorias' => DoencaRespiratoria::orderBy('descricao')->get(), ]; } private static function getResponsaveis($paciente) { return DB::table('cadastro_cidadao') ->select([ 'cadastro_cidadao.id AS id', 'cadastro_cidadao.nome AS nome', ]) ->join('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id') ->join('cadastro_paciente_informacao_social', 'cadastro_paciente_informacao_social.paciente_id', 'cadastro_paciente.id') ->where('cadastro_cidadao.domicilio_id', $paciente->cidadao->domicilio_id) ->where('cadastro_paciente_informacao_social.responsavel', true) ->whereNotIn('cadastro_paciente.id', [$paciente->id]) ->get(); } private static function getClassificacoes($permissaoUsuario, $countUsuario) { if ($countUsuario === 0) { return PacienteClassificacao::orderBy('descricao')->get(); } else { return $permissaoUsuario ? PacienteClassificacao::orderBy('descricao') ->get() ->filter(function ($classificacao) use ($permissaoUsuario) { $exibe = false; switch ($classificacao->id) { case Classificacao::MUNICIPE: $exibe = $permissaoUsuario->municipe; break; case Classificacao::PROVISORIO: $exibe = $permissaoUsuario->provisorio; break; case Classificacao::OUTRO_MUNICIPIO: $exibe = $permissaoUsuario->outro_municipio; break; } return $exibe ? [ 'id' => $classificacao->id, 'descricao' => $classificacao->descricao ] : null; }) ->values() : []; } } public function update(PacienteRequest $request, int $id) { $this->auth(__FUNCTION__); $paciente = Paciente::findOrFail($id); $cidadao = $paciente->cidadao ?? null; if (!self::checkPermissaoCadastro($paciente->classificacao_id)) { throw new AlteracaoCadastroPacienteNaoPermitidoException(); } $paciente = $this->save($request->all(), $paciente); if (($paciente && $paciente->wasChanged('updated_at')) || ($cidadao->updated_at != $paciente->cidadao->updated_at) || ($paciente->responsavel && $paciente->responsavel->updated_at != $paciente->updated_at)) { self::saveHistorico($paciente->id); } $paciente->has_cadastro_individual = $paciente->cadastroIndividual && $paciente->cadastroIndividual->id ? true : false; $paciente->has_cadastro_domiciliar = optional(optional($paciente->cidadao)->domicilio)->cadastroDomiciliar ?? false; return response()->json($paciente, Response::HTTP_OK); } private static function saveHistorico($pacienteId) { $paciente = Paciente::findOrFail($pacienteId); $equipeId = $paciente->responsavel && $paciente->responsavel->equipe ? $paciente->responsavel->equipe->id : null; $historico = new PacienteHistorico; $historico->paciente_id = $pacienteId; $historico->equipe_id = $equipeId; $historico->save(); } private function save($params, $paciente = null) { $pacienteSaved = null; DB::transaction(function () use (&$pacienteSaved, $params, $paciente) { $domicilioIdAntigo = optional(optional($paciente)->cidadao)->domicilio_id; $params['cidadao']['origem'] = isset($params['origem']) && $params['origem'] == 'mobile' ? 'mobile' : 'paciente'; $cidadao = CidadaoService::save($params['cidadao']); self::registrarMudancaDomicilio($cidadao, $domicilioIdAntigo); $data = $this->getPreparedData($params); $data['cidadao_id'] = $cidadao->id; if (!is_null($paciente) && $paciente->classificacao_id !== $data['classificacao_id']) { $paciente->historicoClassificacoes()->create([ 'classificacao_id' => $data['classificacao_id'] ]); } $pacienteSaved = Paciente::updateOrCreate( ['id' => $paciente->id ?? null], $data ); if (!isset($params['origem']) || (isset($params['origem']) && $params['origem'] !== 'mobile')) { self::saveProntuarioUnidade( $pacienteSaved->id, isset($params['centro_custo_id']) && (int) $params['centro_custo_id'] > 0 ? CentroCusto::findOrFail($params['centro_custo_id'])->infraestrutura->unidade_id : $this->getCurrentCentroCusto()->infraestrutura->unidade_id, $data['prontuario_unidade'] ); } if (isset($params['origem']) && ($params['origem'] === 'cadastroPaciente' || $params['origem'] === 'mobile')) { $eraResponsavelFamiliar = optional($pacienteSaved->informacaoSocial)->responsavel ?? false; self::saveResponsavel($pacienteSaved, $data); self::saveDum($pacienteSaved, $data); self::saveCondicaoSaude($pacienteSaved, $data); self::saveInformacaoResidencial($pacienteSaved, $data); self::saveInformacaoSocial($pacienteSaved, $data); self::saveDomicilioInformacaoResidencial($pacienteSaved, $data); self::saveResponsavelFamiliar($pacienteSaved, $data, $eraResponsavelFamiliar); self::saveAtencaoBasica($pacienteSaved, $data); self::sincronizarUnidadeReferenciaResponsavelNucleo($pacienteSaved, $data); } IntegracaoCidadaoService::integrar($cidadao->id); if (isset($params['altera_responsavel']) && $params['altera_responsavel'] === true) { if (!empty($params['domicilio_id_old'])) { $residentes = Cidadao::where('domicilio_id', $params['domicilio_id_old'])->get(); foreach ($residentes as $residente) { $residente->update(['domicilio_id' => $cidadao->domicilio_id]); if($residente->paciente->cadastroIndividual) { $residente->paciente->cadastroIndividual->update([ 'usuario_id' => $data['responsavel_usuario_id'], 'responsavel_equipe_id' => $data['responsavel_equipe_id'], 'responsavel_ocupacao_id' => $data['responsavel_ocupacao_id'], ]); } IntegracaoCidadaoService::integrar($residente->id); self::saveHistorico($residente->paciente->id); self::saveResponsavel($paciente, $data); } } } }); return $pacienteSaved; } public static function saveProntuarioUnidade($pacienteId, $unidadeId, $prontuario) { if (is_null($prontuario)) { $prontuarioUnidade = ProntuarioUnidade::where('paciente_id', $pacienteId) ->where('unidade_id', $unidadeId) ->first(); if (!is_null($prontuarioUnidade)) { $prontuarioUnidade->delete(); } } else { ProntuarioUnidade::updateOrCreate( [ 'paciente_id' => $pacienteId, 'unidade_id' => $unidadeId, ], ['prontuario' => mb_strtoupper((string) $prontuario)] ); } } private function saveAtencaoBasica($paciente, $data) { self::saveAtencaoBasicaCadastroDomiciliar($paciente, $data); self::saveAtencaoBasicaCadastroIndividual($paciente, $data); } private function saveResponsavelFamiliar($paciente, $data, $eraResponsavelFamiliar = false) { if ($data['responsavel_cidadao_id']) { $cidadaoResponsavel = Cidadao::where('id', $data['responsavel_cidadao_id'])->first(); if ($cidadaoResponsavel) { PacienteInformacaoSocial::updateOrCreate( [ 'paciente_id' => $cidadaoResponsavel->paciente->id, ], [ 'responsavel' => true, 'responsavel_cidadao_id' => null, ] ); PacienteInformacaoSocial::where('responsavel_cidadao_id', $paciente->cidadao->id) ->update(['responsavel_cidadao_id' => $cidadaoResponsavel->id]); CadastroIndividual::where('paciente_id', $cidadaoResponsavel->id) ->update(['responsavel' => true, 'responsavel_cidadao_id' => null ]); CadastroIndividual::where('responsavel_cidadao_id', $paciente->cidadao->id) ->update(['responsavel_cidadao_id' => $cidadaoResponsavel->id]); } } if ($data['responsavel'] === true && !$eraResponsavelFamiliar) { self::atualizarResponsavelFamiliarNucleo($paciente); } } private static function atualizarResponsavelFamiliarNucleo($paciente) { $domicilioId = optional($paciente->cidadao)->domicilio_id; if (!$domicilioId) { return; } $cidadaoId = $paciente->cidadao->id; $outrosCidadaoIds = Cidadao::where('domicilio_id', $domicilioId) ->where('id', '!=', $cidadaoId) ->pluck('id'); $outrosPacienteIds = Paciente::whereIn('cidadao_id', $outrosCidadaoIds)->pluck('id'); if ($outrosPacienteIds->isEmpty()) { return; } PacienteInformacaoSocial::whereIn('paciente_id', $outrosPacienteIds) ->update([ 'responsavel' => false, 'responsavel_cidadao_id' => $cidadaoId, 'parentesco_responsavel_id' => null, ]); CadastroIndividual::whereIn('paciente_id', $outrosPacienteIds) ->update([ 'responsavel' => false, 'responsavel_cidadao_id' => $cidadaoId, 'parentesco_responsavel_id' => null, ]); } private static function sincronizarUnidadeReferenciaResponsavelNucleo($paciente, $data) { $domicilioId = $paciente->cidadao->domicilio_id; if (!$domicilioId) { return; } $outrosCidadaoIds = Cidadao::where('domicilio_id', $domicilioId) ->where('id', '!=', $paciente->cidadao->id) ->pluck('id'); $outrosPacientes = Paciente::whereIn('cidadao_id', $outrosCidadaoIds)->get(); if ($outrosPacientes->isEmpty()) { return; } foreach ($outrosPacientes as $outroPaciente) { $outroPaciente->update(['unidade_id' => $data['unidade_id']]); PacienteResponsavel::updateOrCreate( ['paciente_id' => $outroPaciente->id], [ 'responsavel_usuario_id' => $data['responsavel_usuario_id'], 'responsavel_equipe_id' => $data['responsavel_equipe_id'], 'responsavel_ocupacao_id' => $data['responsavel_ocupacao_id'], 'responsavel_data' => Carbon::now(), ] ); CadastroIndividual::where('paciente_id', $outroPaciente->id) ->update([ 'usuario_id' => $data['responsavel_usuario_id'], 'equipe_id' => $data['responsavel_equipe_id'], 'usuario_ocupacao_id' => $data['responsavel_ocupacao_id'], 'data_usuario_responsavel' => $data['responsavel_data'], ]); } } private function saveDum($paciente, $data) { PacienteDum::updateOrCreate( [ 'paciente_id' => $paciente->id, ], [ 'data_ultima_menstruacao' => $data['data_ultima_menstruacao'], 'idade_gestacional_semanas' => $data['idade_gestacional_semanas'], 'idade_gestacional_dias' => $data['idade_gestacional_dias'], 'data_possivel_parto' => $data['data_possivel_parto'], 'gravidez_planejada' => $data['gravidez_planejada'], 'gestacao_previa' => $data['gestacao_previa'], 'parto' => $data['parto'], ] ); } private function saveResponsavel($paciente, $data) { PacienteResponsavel::updateOrCreate( [ 'paciente_id' => $paciente->id, ], [ 'responsavel_usuario_id' => $data['responsavel_usuario_id'], 'responsavel_equipe_id' => $data['responsavel_equipe_id'], 'responsavel_ocupacao_id' => $data['responsavel_ocupacao_id'], 'responsavel_data' => Carbon::now(), ] ); } private function saveCondicaoSaude($paciente, $data) { PacienteCondicaoSaude::updateOrCreate( [ 'paciente_id' => $paciente->id, ], [ 'peso_id' => $data['peso_id'], 'internacao' => $data['internacao'], 'internacao_motivo' => $data['internacao_motivo'], 'internacao_data' => $data['internacao_data'], 'doenca_cardiaca' => $data['doenca_cardiaca'], 'problemas_rins' => $data['problemas_rins'], 'doenca_respiratoria' => $data['doenca_respiratoria'], 'tratamento_saude_mental' => $data['tratamento_saude_mental'], 'tratamento_saude_mental_internacao_data' => $data['tratamento_saude_mental_internacao_data'], 'tratamento_saude_mental_alta_data' => $data['tratamento_saude_mental_alta_data'], 'acamado' => $data['acamado'], 'domiciliado' => $data['domiciliado'], 'plantas_medicinais' => $data['plantas_medicinais'], 'plantas_medicinais_quais' => $data['plantas_medicinais_quais'], 'praticas_integrativas' => $data['praticas_integrativas'], 'outras_condicoes_primaria' => $data['outras_condicoes_primaria'], 'outras_condicoes_secundaria' => $data['outras_condicoes_secundaria'], 'outras_condicoes_terciaria' => $data['outras_condicoes_terciaria'], ] ); if ($paciente->condicaoSaude) { $paciente->condicaoSaude->doencaCardiaca()->sync($data['doenca_cardiaca_quais']); $paciente->condicaoSaude->doencaRespiratoria()->sync($data['doenca_respiratoria_quais']); $paciente->condicaoSaude->problemasRins()->sync($data['problemas_rins_quais']); } } private function saveInformacaoSocial($paciente, $data) { $dadosInformacaoSocialAnterior = optional($paciente)->informacaoSocial; $alimentosAtual = optional($dadosInformacaoSocialAnterior)->alimentos_acabaram; $comeuAtual = optional($dadosInformacaoSocialAnterior)->comeu_alguns_alimentos; $alimentosNovo = $data['alimentos_acabaram'] ?? null; $comeuNovo = $data['comeu_alguns_alimentos'] ?? null; $dataAtualizacaoTriaAnterior = optional($dadosInformacaoSocialAnterior)->data_atualizacao_tria; $atualizaDataTrita = self::houveMudancaInformacaoSocioeconomica($alimentosAtual, $comeuAtual, $alimentosNovo, $comeuNovo); PacienteInformacaoSocial::updateOrCreate( [ 'paciente_id' => $paciente->id, ], [ 'responsavel' => $data['responsavel'], 'responsavel_cidadao_id' => $data['responsavel'] ? null : $data['responsavel_cidadao_id'], 'parentesco_responsavel_id' => $data['responsavel'] ? null : $data['parentesco_responsavel_id'], 'curso_id' => $data['curso_id'], 'orientacao_sexual' => $data['orientacao_sexual'], 'orientacao_sexual_id' => $data['orientacao_sexual_id'], 'deficiente' => $data['deficiente'], 'frequenta_escola_creche' => $data['frequenta_escola_creche'], 'situacao_mercado_trabalho_id' => $data['situacao_mercado_trabalho_id'], 'frequenta_cuidador_tradicional' => $data['frequenta_cuidador_tradicional'], 'participa_grupo_comunitario' => $data['participa_grupo_comunitario'], 'plano_saude' => $data['plano_saude'], 'comunidade_tradicional' => $data['comunidade_tradicional'], 'comunidade_tradicional_id' => $data['comunidade_tradicional_id'], 'saida_cidadao_id' => $data['saida_cidadao_id'], 'motivo_saida_data' => $data['motivo_saida_data'], 'recusa_cadastro' => $data['informacao_social_recusa_cadastro'], 'alimentos_acabaram' => $data['alimentos_acabaram'], 'comeu_alguns_alimentos' => $data['comeu_alguns_alimentos'], 'data_atualizacao_tria' => $atualizaDataTrita ? Carbon::now() : $dataAtualizacaoTriaAnterior, ] ); if ($paciente->informacaoSocial) { $paciente->informacaoSocial->acompanhamentoInfantil()->sync($data['acompanhamento_infantil']); $paciente->informacaoSocial->deficiencia()->sync($data['deficiencias']); if (!$paciente->informacaoSocial->deficiencia->pluck('id')->contains(Deficiencia::TEA) && $paciente->cidadao->fatoresRisco->pluck('id')->contains(FatorRisco::TEA)) { $paciente->cidadao->fatoresRisco()->detach(FatorRisco::TEA); } } if ($data['saida_cidadao_id'] == EnumSaidaCidadao::OBITO) { $currentLotacao = self::getCurrentLotacao(); $obitoService = new ObitoService($paciente->cidadao); if (is_null($obitoService->get())) { $obitoService->save( Carbon::createFromFormat('d/m/Y H:i:s', $data['obito_em']), $data['obito_declaracao'] ?? '', $data['obito_causa'] ?? '', $data['obito_cid_id'] ?? null, $currentLotacao->usuario->id ); } } if ($data['saida_cidadao_id'] == EnumSaidaCidadao::MUDANCA_DE_TERRITORIO) { Cidadao::findOrFail($paciente->cidadao->id)->update(['domicilio_id' => null]); Paciente::findOrFail($paciente->id)->update(['classificacao_id' => Classificacao::PROVISORIO]); } } private function saveInformacaoResidencial($paciente, $data) { PacienteInformacaoResidencial::updateOrCreate( [ 'paciente_id' => $paciente->id, ], [ 'recusa_cadastro' => $data['informacao_residencial_recusa_cadastro'], 'renda_mensal' => $data['renda_mensal'], 'ocupacao_id' => $data['ocupacao_id'], 'renda_total_familiar' => $data['renda_total_familiar'], 'possui_veiculo_proprio' => $data['possui_veiculo_proprio'], 'possui_financiamento' => $data['possui_financiamento'], 'possui_emprestimo' => $data['possui_emprestimo'], ] ); if ($paciente->informacaoResidencial) { if ($data['veiculos'] != null) { $paciente->informacaoResidencial->veiculo()->delete(); $veiculosData = array_map(function($veiculo) use ($paciente) { return [ 'paciente_informacao_residencial_id' => $paciente->informacaoResidencial->id, 'modelo' => $veiculo['modelo'], 'ano' => $veiculo['ano'], ]; }, $data['veiculos']); PacienteInformacaoResidencialVeiculo::insert($veiculosData); } if ($data['financiamentos'] != null) { $paciente->informacaoResidencial->financiamento()->delete(); $financiamentosData = array_map(function($financiamento) use ($paciente) { $financiamento['valor_parcela'] = str_replace('.', '', $financiamento['valor_parcela']); $financiamento['valor_parcela'] = str_replace(',', '.', $financiamento['valor_parcela']); return [ 'paciente_informacao_residencial_id' => $paciente->informacaoResidencial->id, 'tipo' => $financiamento['tipo'], 'valor_parcela' => $financiamento['valor_parcela'], 'quantidade_parcela' => $financiamento['quantidade_parcela'], ]; }, $data['financiamentos']); PacienteInformacaoResidencialFinanciamento::insert($financiamentosData); } if ($data['emprestimos'] != null) { $paciente->informacaoResidencial->emprestimo()->delete(); $emprestimosData = array_map(function($emprestimo) use ($paciente) { $emprestimo['valor_parcela'] = str_replace('.', '', $emprestimo['valor_parcela']); $emprestimo['valor_parcela'] = str_replace(',', '.', $emprestimo['valor_parcela']); return [ 'paciente_informacao_residencial_id' => $paciente->informacaoResidencial->id, 'tipo' => $emprestimo['tipo'], 'valor_parcela' => $emprestimo['valor_parcela'], 'quantidade_parcela' => $emprestimo['quantidade_parcela'], ]; }, $data['emprestimos']); PacienteInformacaoResidencialEmprestimo::insert($emprestimosData); } } } private function saveDomicilioInformacaoResidencial($paciente, $data) { if($paciente->cidadao->domicilio){ DomicilioInformacaoResidencial::updateOrCreate( [ 'domicilio_id' => $paciente->cidadao->domicilio->id, ], [ 'microarea_id' => $data['microarea_id'], 'fora_area' => $data['fora_area'], 'instituicao_nome' => $data['instituicao_nome'], 'instituicao_outros_profissionais' => $data['instituicao_outros_profissionais'], 'instituicao_nome_responsavel_tecnico' => $data['instituicao_nome_responsavel_tecnico'], 'instituicao_cns_responsavel_tecnico' => $data['instituicao_cns_responsavel_tecnico'], 'instituicao_cargo_responsavel_tecnico' => $data['instituicao_cargo_responsavel_tecnico'], 'instituicao_telefone_responsavel_tecnico' => $data['instituicao_telefone_responsavel_tecnico'], 'imovel_tipo_id' => $data['imovel_tipo_id'], 'situacao_domicilio_id' => $data['situacao_domicilio_id'], 'domicilio_tipo_id' => $data['domicilio_tipo_id'], 'quantidade_comodos' => $data['quantidade_comodos'], 'situacao_rural_id' => $data['situacao_rural_id'], 'domicilio_zona_id' => $data['domicilio_zona_id'], 'domicilio_tipo_acesso_id' => $data['domicilio_tipo_acesso_id'], 'material_predominante_id' => $data['material_predominante_id'], 'abastecimento_id' => $data['abastecimento_id'], 'tratamento_id' => $data['tratamento_id'], 'destino_lixo_id' => $data['destino_lixo_id'], 'forma_escoamento_id' => $data['forma_escoamento_id'], 'possui_animais' => $data['possui_animais'], 'quantidade_animais' => $data['quantidade_animais'], 'energia_eletrica' => $data['energia_eletrica'], 'higiene_residencial_id' => $data['higiene_residencial_id'], 'bolsa_familia' => $data['bolsa_familia'], 'vale_gas' => $data['vale_gas'], 'bolsa_escola' => $data['bolsa_escola'], 'bpc' => $data['bpc'], 'escala_coelho_id' => $data['escala_coelho_id'], ] ); if ($paciente->cidadao->domicilio->informacaoResidencial) { $paciente->cidadao->domicilio->informacaoResidencial->lazer()->sync($data['lazer']); $paciente->cidadao->domicilio->informacaoResidencial->animal()->sync($data['animal']); } } } private function saveAtencaoBasicaCadastroDomiciliar($paciente, $data) { if (is_null($data['microarea_id'] && !$data['fora_area']) || is_null($data['imovel_tipo_id'])) { return false; } if ($data['responsavel_ocupacao_id']) { $permissao = OutrosPermissaoOcupacao::where('permissao_id', Permissao::CADASTRO_DOMICILIAR)->get(); $codigos = $permissao->pluck('ocupacao'); $ocupacao = Ocupacao::find($data['responsavel_ocupacao_id']); $hasPermissao = $codigos->contains($ocupacao->codigo); } else { $hasPermissao = false; } if (!$hasPermissao && !($data['saida_cidadao_id'] != null)) { throw new ParametrizacaoAtendimentoCboException; } $domicilioId = $paciente->cidadao->domicilio_id; $cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $domicilioId)->first(); $dados = [ 'id' => null, 'endereco' => [ 'microarea_id' => $data['microarea_id'], 'fora_area' => $data['fora_area'], ], 'cadastro' => [ 'usuario_id' => $hasPermissao ? $data['responsavel_usuario_id'] : ($cadastroDomiciliar['usuario_id'] ?? null), 'equipe_id' => $hasPermissao ? $data['responsavel_equipe_id'] : ($cadastroDomiciliar['equipe_id'] ?? null), 'ocupacao_id' => $hasPermissao ? $data['responsavel_ocupacao_id'] : ($cadastroDomiciliar['usuario_ocupacao_id'] ?? null), 'data_usuario_responsavel' => $hasPermissao ? $data['responsavel_data'] : ($cadastroDomiciliar['data_usuario_responsavel'] ?? null), ], 'instituicao' => [ 'nome' => $data['instituicao_nome'], 'outros_profissionais' => $data['instituicao_outros_profissionais'], 'nome_responsavel_tecnico' => $data['instituicao_nome_responsavel_tecnico'], 'cns_responsavel_tecnico' => $data['instituicao_cns_responsavel_tecnico'], 'cargo_responsavel_tecnico' => $data['instituicao_cargo_responsavel_tecnico'], 'telefone_responsavel_tecnico' => $data['instituicao_telefone_responsavel_tecnico'], ], 'residencia' => [ 'imovel_tipo_id' => $data['imovel_tipo_id'], 'situacao_domicilio_id' => $data['situacao_domicilio_id'], 'domicilio_tipo_id' => $data['domicilio_tipo_id'], 'quantidade_comodos' => $data['quantidade_comodos'], 'situacao_rural_id' => $data['situacao_rural_id'], 'domicilio_zona_id' => $data['domicilio_zona_id'], 'domicilio_tipo_acesso_id' => $data['domicilio_tipo_acesso_id'], 'material_predominante_id' => $data['material_predominante_id'], 'abastecimento_id' => $data['abastecimento_id'], 'tratamento_id' => $data['tratamento_id'], 'destino_lixo_id' => $data['destino_lixo_id'], 'forma_escoamento_id' => $data['forma_escoamento_id'], 'possui_animais' => $data['possui_animais'], 'quantidade_animais' => $data['quantidade_animais'], 'energia_eletrica' => $data['energia_eletrica'], 'animal' => $data['animal'], ], 'informacao' => [ 'higiene_residencial_id' => $data['higiene_residencial_id'], 'bolsa_familia' => $data['bolsa_familia'], 'vale_gas' => $data['vale_gas'], 'bolsa_escola' => $data['bolsa_escola'], 'bpc' => $data['bpc'], 'escala_coelho_id' => $data['escala_coelho_id'], 'lazer' => $data['lazer'], ], 'renda_mensal' => $data['renda_mensal'], 'ocupacao_id' => $data['ocupacao_id'], 'renda_total_familiar' => $data['renda_total_familiar'], 'recusa_cadastro' => $data['informacao_residencial_recusa_cadastro'], 'domicilio_id' => $domicilioId, 'origem' => 'cadastroPaciente', ]; if ($hasPermissao && $domicilioId || $cadastroDomiciliar) { CadastroDomiciliarService::saveStore($dados); return true; } return false; } private function saveAtencaoBasicaCadastroIndividual($paciente, $data) { if ($data['responsavel_ocupacao_id']) { $permissao = OutrosPermissaoOcupacao::where('permissao_id', Permissao::CADASTRO_INDIVIDUAL)->get(); $codigos = $permissao->pluck('ocupacao'); $ocupacao = Ocupacao::find($data['responsavel_ocupacao_id']); $hasPermissao = $codigos->contains($ocupacao->codigo); } else { $hasPermissao = false; } $cadastroIndividual = CadastroIndividual::where('paciente_id', $paciente->id)->first(); $fatoresRisco = $paciente->cidadao->fatoresRisco->pluck('id'); $dataUsuarioResponsavel = $hasPermissao ? $data['responsavel_data'] : ($cadastroIndividual->data_usuario_responsavel ?? null); if (isset($data['saida_cidadao_id']) && ($data['saida_cidadao_id'] == EnumSaidaCidadao::MUDANCA_DE_TERRITORIO || $data['saida_cidadao_id'] == EnumSaidaCidadao::OBITO) && $cadastroIndividual && $hasPermissao) { $cadastroIndividual->update([ 'usuario_id' => null, 'usuario_ocupacao_id' => null, 'equipe_id' => null, ]); $dataUsuarioResponsavel = Carbon::now()->format('Y-m-d'); } $dados = [ 'id' => null, 'paciente_id' => $paciente->id, 'endereco' => [ 'microarea_id' => $data['microarea_id'], 'fora_area' => $data['fora_area'], ], 'cadastro' => [ 'usuario_id' => $hasPermissao ? $data['responsavel_usuario_id'] : ($cadastroIndividual->usuario_id ?? null), 'equipe_id' => $hasPermissao ? $data['responsavel_equipe_id'] : ($cadastroIndividual->equipe_id ?? null), 'ocupacao_id' => $hasPermissao ? $data['responsavel_ocupacao_id'] : ($cadastroIndividual->usuario_ocupacao_id ?? null), 'data_usuario_responsavel' => $dataUsuarioResponsavel, 'supervisor_id' => $cadastroIndividual ? $cadastroIndividual->supervisor_id : null, ], 'condicao' => [ 'peso_id' => $data['peso_id'], 'internacao' => $data['internacao'], 'internacao_motivo' => $data['internacao_motivo'], 'doenca_cardiaca' => $data['doenca_cardiaca'], 'problemas_rins' => $data['problemas_rins'], 'doenca_respiratoria' => $data['doenca_respiratoria'], 'tratamento_saude_mental' => $data['tratamento_saude_mental'], 'acamado' => $data['acamado'], 'domiciliado' => $data['domiciliado'], 'plantas_medicinais' => $data['plantas_medicinais'], 'plantas_medicinais_quais' => $data['plantas_medicinais_quais'], 'doenca_cardiaca_quais' => $data['doenca_cardiaca_quais'], 'problemas_rins_quais' => $data['problemas_rins_quais'], 'doenca_respiratoria_quais' => $data['doenca_respiratoria_quais'], 'outras_condicoes_primaria' => $data['outras_condicoes_primaria'], 'outras_condicoes_secundaria' => $data['outras_condicoes_secundaria'], 'outras_condicoes_terciaria' => $data['outras_condicoes_terciaria'], 'avc_derrame' => $fatoresRisco->contains(FatorRisco::AVC) ? true : false, 'cancer' => $fatoresRisco->contains(FatorRisco::CANCERO) ? true : false, 'diabetes' => $fatoresRisco->contains(FatorRisco::DIABETES) ? true : false, 'fibromialgia' => $fatoresRisco->contains(FatorRisco::FIBROMIALGIA) ? true : false, 'fumante' => $fatoresRisco->contains(FatorRisco::TABAGISMO) ? true : false, 'gestante' => $fatoresRisco->contains(FatorRisco::GESTANTE) ? true : false, 'hanseniase' => $fatoresRisco->contains(FatorRisco::HANSENIASE) ? true : false, 'hipertensao' => $fatoresRisco->contains(FatorRisco::HIPERTENSAO) ? true : false, 'infarto' => $fatoresRisco->contains(FatorRisco::INFARTO) ? true : false, 'outras_drogas' => $fatoresRisco->contains(FatorRisco::OUTRAS_DROGAS) ? true : false, 'transtorno_espectro_autista' => $fatoresRisco->contains(FatorRisco::TEA) ? true : false, 'tuberculose' => $fatoresRisco->contains(FatorRisco::TUBERCULOSE) ? true : false, 'usa_alcool' => $fatoresRisco->contains(FatorRisco::USA_ALCOOL) ? true : false, 'maternidade_referencia' => $data['maternidade_referencia'], 'praticas_integrativas' => $data['praticas_integrativas'], ], 'informacao' => [ 'responsavel' => $data['responsavel'], 'responsavel_cidadao_id' => $data['responsavel_cidadao_id'], 'parentesco_responsavel_id' => $data['parentesco_responsavel_id'], 'curso_id' => $data['curso_id'], 'frequenta_escola_creche' => $data['frequenta_escola_creche'], 'situacao_mercado_trabalho_id' => $data['situacao_mercado_trabalho_id'], 'frequenta_cuidador_tradicional' => $data['frequenta_cuidador_tradicional'], 'participa_grupo_comunitario' => $data['participa_grupo_comunitario'], 'plano_saude' => $data['plano_saude'], 'comunidade_tradicional' => $data['comunidade_tradicional'], 'comunidade_tradicional_id' => $data['comunidade_tradicional_id'], 'saida_cidadao_id' => $data['saida_cidadao_id'], 'motivo_saida_data' => $data['motivo_saida_data'], 'ocupacao_id' => $data['ocupacao_id'], 'acompanhamento_infantil' => $data['acompanhamento_infantil'], 'deficiente' => $data['deficiente'], 'deficiencias' => $data['deficiencias'], 'identidade_genero' => $paciente->cidadao->identidade_genero_id ? true : false, 'identidade_genero_id' => $paciente->cidadao->identidade_genero_id, 'orientacao_sexual' => $data['orientacao_sexual'], 'orientacao_sexual_id' => $data['orientacao_sexual_id'], 'obito' => $data['obito'], 'obito_em' => $data['obito_em'], 'obito_declaracao' => $data['obito_declaracao'], 'obito_causa' => $data['obito_causa'], 'obito_cid_id' => $data['obito_cid_id'], ], 'informacao_socioeconomica' => [ 'alimentos_acabaram' => $data['alimentos_acabaram'], 'comeu_alguns_alimentos' => $data['comeu_alguns_alimentos'], 'data_atualizacao_tria' => $data['data_atualizacao_tria'] ?? null, ], 'cidadao' => [ 'ativo' => true, 'responsavel' => $data['responsavel'], 'ocupacao_id' => $data['ocupacao_id'], 'responsavel_cidadao_id' => $data['responsavel_cidadao_id'], 'parentesco_responsavel_id' => $data['parentesco_responsavel_id'], 'renda_mensal' => $data['renda_mensal'], ], 'situacao_rua' => [ 'alimentacao_diaria_id' => $data['alimentacao_diaria_id'] ? $data['alimentacao_diaria_id'] : null, 'higiene_pessoal' => $data['higiene_pessoal'] ? $data['higiene_pessoal'] : null, 'outra_instituicao' => $data['outra_instituicao'] ? $data['outra_instituicao'] : null, 'outra_instituicao_quais' => $data['outra_instituicao_quais'] ? $data['outra_instituicao_quais'] : null, 'parentesco' => $data['parentesco'] ? $data['parentesco'] : null, 'recebe_beneficio' => $data['recebe_beneficio'] ? $data['recebe_beneficio'] : null, 'referencia_familiar' => $data['referencia_familiar'] ? $data['referencia_familiar'] : null, 'situacao_rua_id' => $data['situacao_rua_id'] ? $data['situacao_rua_id'] : null, 'visita_familiar' => $data['visita_familiar'] ? $data['visita_familiar'] : null, 'origem_alimentacao' => $data['origem_alimentacao'] ? $data['origem_alimentacao'] : null, 'higiene_pessoal_quais' => $data['higiene_pessoal_quais'] ? $data['higiene_pessoal_quais'] : null, ], 'recusa_cadastro' => $data['informacao_social_recusa_cadastro'], 'origem' => 'cadastroPaciente', ]; if (isset($data['created_lotacao_id'])) { $dados['created_lotacao_id'] = $data['created_lotacao_id']; } if (isset($data['created_centro_custo_id'])) { $dados['created_centro_custo_id'] = $data['created_centro_custo_id']; } if (isset($data['updated_lotacao_id'])) { $dados['updated_lotacao_id'] = $data['updated_lotacao_id']; } if (isset($data['updated_centro_custo_id'])) { $dados['updated_centro_custo_id'] = $data['updated_centro_custo_id']; } if ($hasPermissao || $cadastroIndividual) { CadastroIndividualService::saveStore($dados); return true; } return false; } public static function saveResidente() { $cidadao = Cidadao::where('id', request()->cidadao_id)->first(); $cidadao->update(['domicilio_id' => request()->domicilio_id]); $cidadao->paciente->update([ 'unidade_id' => request()->unidade_id, 'classificacao_id' => request()->classificacao_id, 'responsavel_usuario_id' => request()->responsavel_usuario_id, 'responsavel_ocupacao_id' => request()->responsavel_ocupacao_id, 'responsavel_equipe_id' => request()->responsavel_equipe_id, 'responsavel_data' => Carbon::now()->format('Y-m-d'), ]); self::registrarEntradaDomicilio($cidadao->id, request()->domicilio_id); IntegracaoCidadaoService::integrar($cidadao->id); return PacienteController::getResidentes(request()->domicilio_id); } private static function registrarMudancaDomicilio($cidadao, $domicilioIdAntigo) { $domicilioIdNovo = $cidadao->domicilio_id; if ($domicilioIdAntigo == $domicilioIdNovo) { return; } if ($domicilioIdAntigo) { self::registrarSaidaDomicilio($cidadao->id, $domicilioIdAntigo); } if ($domicilioIdNovo) { self::registrarEntradaDomicilio($cidadao->id, $domicilioIdNovo); } } private static function registrarEntradaDomicilio($cidadaoId, $domicilioId) { CidadaoDomicilioHistorico::updateOrCreate( [ 'cidadao_id' => $cidadaoId, 'domicilio_id' => $domicilioId, 'data_saida' => null, ], [ 'data_entrada' => Carbon::now()->format('Y-m-d'), ] ); } private static function registrarSaidaDomicilio($cidadaoId, $domicilioId) { if (!$domicilioId) { return; } CidadaoDomicilioHistorico::where('cidadao_id', $cidadaoId) ->where('domicilio_id', $domicilioId) ->whereNull('data_saida') ->update(['data_saida' => Carbon::now()->format('Y-m-d')]); } public static function getResidentesAnteriores($domicilioId) { return DB::table('cadastro_cidadao_domicilio_historico') ->select([ 'cadastro_cidadao_domicilio_historico.id', 'cadastro_cidadao.nome AS nome', 'cadastro_sexo.descricao AS sexo', DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'), 'cadastro_cidadao_domicilio_historico.data_entrada', 'cadastro_cidadao_domicilio_historico.data_saida', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_cidadao_domicilio_historico.cidadao_id') ->leftJoin('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id') ->leftJoin('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id') ->where('cadastro_cidadao_domicilio_historico.domicilio_id', $domicilioId) ->whereNotNull('cadastro_cidadao_domicilio_historico.data_saida') ->orderByDesc('cadastro_cidadao_domicilio_historico.data_saida') ->get() ->map(function ($residente) { $residente->tempo_moradia = self::getTempoMoradia($residente->data_entrada, $residente->data_saida); $residente->data_entrada = (new Carbon($residente->data_entrada))->format('d/m/Y'); $residente->data_saida = (new Carbon($residente->data_saida))->format('d/m/Y'); return $residente; }); } private static function getTempoMoradia($dataEntrada, $dataSaida) { $inicio = Carbon::parse($dataEntrada); $fim = Carbon::parse($dataSaida); $anos = $inicio->diffInYears($fim); $inicio->addYears($anos); $meses = $inicio->diffInMonths($fim); $inicio->addMonths($meses); $dias = $inicio->diffInDays($fim); $partes = []; if ($anos > 0) { $partes[] = $anos . ($anos == 1 ? ' ano' : ' anos'); } if ($meses > 0) { $partes[] = $meses . ($meses == 1 ? ' mês' : ' meses'); } if (empty($partes) || $dias > 0) { $partes[] = $dias . ($dias == 1 ? ' dia' : ' dias'); } return implode(' e ', $partes); } public static function removeResidente($cidadaoId) { $cidadao = Cidadao::where('id', $cidadaoId)->first(); $domicilioId = $cidadao->domicilio_id; $cidadao->update(['domicilio_id' => null]); $cidadao->paciente->update([ 'classificacao_id' => Classificacao::PROVISORIO, ]); if ($cidadao->paciente->responsavel) { $cidadao->paciente->responsavel->delete(); } if($cidadao->paciente->cadastroIndividual) { $cidadao->paciente->cadastroIndividual->update([ 'usuario_id' => null, 'equipe_id' => null, 'usuario_ocupacao_id' => null, 'data_usuario_responsavel' => null, 'responsavel' => false, ]); } self::registrarSaidaDomicilio($cidadao->id, $domicilioId); IntegracaoCidadaoService::integrar($cidadao->id); self::saveHistorico($cidadao->paciente->id); if (isset(request()->remove_familia) && request()->remove_familia == true) { $residentes = Cidadao::where('domicilio_id', $domicilioId)->get(); foreach ($residentes as $residente) { $residente->update(['domicilio_id' => null]); $residente->paciente->update([ 'classificacao_id' => Classificacao::PROVISORIO, ]); if ($residente->paciente->responsavel) { $residente->paciente->responsavel->delete(); } if($residente->paciente->cadastroIndividual) { $residente->paciente->cadastroIndividual->update([ 'usuario_id' => null, 'equipe_id' => null, 'usuario_ocupacao_id' => null, 'data_usuario_responsavel' => null, 'responsavel' => false, ]); } self::registrarSaidaDomicilio($residente->id, $domicilioId); IntegracaoCidadaoService::integrar($residente->id); self::saveHistorico($residente->paciente->id); } } return [ 'residentes' => $domicilioId ? self::getResidentes($domicilioId) : [], 'residentes_anteriores' => $domicilioId ? self::getResidentesAnteriores($domicilioId) : [], ]; } public static function getDomicilio() { $informacaoResidencial = null; $domicilio = null; $endereco = Endereco::where('logradouro_id', request()->logradouro_id) ->where('numero', request()->numero) ->where('complemento', request()->complemento) ->first(); if ($endereco) { $domicilio = $endereco->domicilios->first(); if ($domicilio) { $informacaoResidencial = $domicilio->informacaoResidencial; if ($informacaoResidencial && $informacaoResidencial->lazer) { $informacaoResidencial->new_lazer = $informacaoResidencial->lazer->pluck('id')->toArray(); } if ($informacaoResidencial && $informacaoResidencial->animal) { $informacaoResidencial->new_animal = $informacaoResidencial->animal->pluck('id')->toArray(); } } } return [ 'informacaoResidencial' => $informacaoResidencial, 'residentes' => $domicilio ? self::getResidentes($domicilio->id) : [], ]; } private function getPreparedData($params) { $data = [ 'email' => $params['email'] ?? null, 'classificacao_id' => $params['classificacao_id'], 'subclassificacao_id' => $params['subclassificacao_id'] ?? null, 'validade_inicio' => $params['validade_inicio'] ?? null, 'validade_fim' => $params['validade_fim'] ?? null, 'prontuario_unidade' => $params['prontuario_unidade'] ?? null, 'unidade_id' => $params['unidade_id'], 'bloqueado' => $params['bloqueado'] ?? false, 'sem_documentos_em' => $params['sem_documentos_em'] ?? null, 'sequencial_desconhecido' => null, 'sequencial_desconhecido_em' => null, 'responsavel_usuario_id' => isset($params['responsavel_usuario']) ? $params['responsavel_usuario']['id'] : null, 'responsavel_equipe_id' => $params['responsavel_equipe_id'] ?? null, 'responsavel_ocupacao_id' => $params['responsavel_ocupacao_id'] ?? null, 'responsavel_data' => $params['responsavel_data'] ?? null, 'peso_id' => $params['peso_id'] ?? null, 'internacao' => $params['internacao'] ?? null, 'internacao_motivo' => $params['internacao_motivo'] ?? null, 'internacao_data' => $params['internacao_data'] ?? null, 'doenca_cardiaca' => $params['doenca_cardiaca'] ?? null, 'doenca_cardiaca_quais' => $params['doenca_cardiaca_quais'] ?? null, 'problemas_rins' => $params['problemas_rins'] ?? null, 'problemas_rins_quais' => $params['problemas_rins_quais'] ?? null, 'doenca_respiratoria' => $params['doenca_respiratoria'] ?? null, 'doenca_respiratoria_quais' => $params['doenca_respiratoria_quais'] ?? null, 'tratamento_saude_mental' => $params['tratamento_saude_mental'] ?? null, 'tratamento_saude_mental_internacao_data' => $params['tratamento_saude_mental_internacao_data'] ?? null, 'tratamento_saude_mental_alta_data' => $params['tratamento_saude_mental_alta_data'] ?? null, 'acamado' => $params['acamado'] ?? null, 'domiciliado' => $params['domiciliado'] ?? null, 'deficiente' => $params['deficiente'] ?? null, 'plantas_medicinais' => $params['plantas_medicinais'] ?? null, 'plantas_medicinais_quais' => $params['plantas_medicinais_quais'] ?? null, 'praticas_integrativas' => $params['praticas_integrativas'] ?? null, 'outras_condicoes_primaria' => $params['outras_condicoes_primaria'] ?? null, 'outras_condicoes_secundaria' => $params['outras_condicoes_secundaria'] ?? null, 'outras_condicoes_terciaria' => $params['outras_condicoes_terciaria'] ?? null, 'data_ultima_menstruacao' => $params['data_ultima_menstruacao'] ?? null, 'idade_gestacional_semanas' => $params['idade_gestacional_semanas'] ?? null, 'idade_gestacional_dias' => $params['idade_gestacional_dias'] ?? null, 'data_possivel_parto' => $params['data_possivel_parto'] ?? null, 'gravidez_planejada' => $params['gravidez_planejada'] ?? null, 'gestacao_previa' => $params['gestacao_previa'] ?? null, 'parto' => $params['parto'] ?? null, 'responsavel' => $params['responsavel'] ?? null, 'responsavel_cidadao_id' => $params['responsavel_cidadao_id'] ?? null, 'parentesco_responsavel_id' => $params['parentesco_responsavel_id'] ?? null, 'curso_id' => $params['curso_id'] ?? null, 'orientacao_sexual' => $params['orientacao_sexual'] ?? null, 'orientacao_sexual_id' => $params['orientacao_sexual_id'] ?? null, 'frequenta_escola_creche' => $params['frequenta_escola_creche'] ?? null, 'situacao_mercado_trabalho_id' => $params['situacao_mercado_trabalho_id'] ?? null, 'frequenta_cuidador_tradicional' => $params['frequenta_cuidador_tradicional'] ?? null, 'participa_grupo_comunitario' => $params['participa_grupo_comunitario'] ?? null, 'plano_saude' => $params['plano_saude'] ?? null, 'comunidade_tradicional' => $params['comunidade_tradicional'] ?? null, 'comunidade_tradicional_id' => $params['comunidade_tradicional_id'] ?? null, 'saida_cidadao_id' => $params['saida_cidadao_id'] ?? null, 'motivo_saida_data' => $params['motivo_saida_data'] ?? null, 'alimentos_acabaram' => isset($params['alimentos_acabaram']) ? $params['alimentos_acabaram'] : null, 'comeu_alguns_alimentos' => isset($params['comeu_alguns_alimentos']) ? $params['comeu_alguns_alimentos'] : null, 'data_atualizacao_tria' => $params['data_atualizacao_tria'] ?? null, 'informacao_social_recusa_cadastro' => $params['informacao_social_recusa_cadastro'] ?? null, 'acompanhamento_infantil' => $params['acompanhamento_infantil'] ?? null, 'deficiencias' => $params['deficiencias'] ?? null, 'obito' => $params['obito'] ?? null, 'obito_em' => $params['obito_em'] ?? null, 'obito_declaracao' => $params['obito_declaracao'] ?? null, 'obito_causa' => $params['obito_causa'] ?? null, 'obito_cid_id' => $params['obito_cid_id'] ?? null, 'microarea_id' => $params['microarea_id'] ?? null, 'fora_area' => $params['fora_area'] ?? null, 'instituicao_nome' => $params['instituicao_nome'] ?? null, 'instituicao_outros_profissionais' => $params['instituicao_outros_profissionais'] ?? null, 'instituicao_nome_responsavel_tecnico' => $params['instituicao_nome_responsavel_tecnico'] ?? null, 'instituicao_cns_responsavel_tecnico' => $params['instituicao_cns_responsavel_tecnico'] ?? null, 'instituicao_cargo_responsavel_tecnico' => $params['instituicao_cargo_responsavel_tecnico'] ?? null, 'instituicao_telefone_responsavel_tecnico' => $params['instituicao_telefone_responsavel_tecnico'] ?? null, 'imovel_tipo_id' => $params['imovel_tipo_id'] ?? null, 'situacao_domicilio_id' => $params['situacao_domicilio_id'] ?? null, 'domicilio_tipo_id' => $params['domicilio_tipo_id'] ?? null, 'quantidade_comodos' => $params['quantidade_comodos'] ?? null, 'situacao_rural_id' => $params['situacao_rural_id'] ?? null, 'domicilio_zona_id' => $params['domicilio_zona_id'] ?? null, 'domicilio_tipo_acesso_id' => $params['domicilio_tipo_acesso_id'] ?? null, 'material_predominante_id' => $params['material_predominante_id'] ?? null, 'abastecimento_id' => $params['abastecimento_id'] ?? null, 'tratamento_id' => $params['tratamento_id'] ?? null, 'destino_lixo_id' => $params['destino_lixo_id'] ?? null, 'forma_escoamento_id' => $params['forma_escoamento_id'] ?? null, 'possui_animais' => $params['possui_animais'] ?? null, 'quantidade_animais' => $params['quantidade_animais'] ?? null, 'energia_eletrica' => $params['energia_eletrica'] ?? null, 'higiene_residencial_id' => $params['higiene_residencial_id'] ?? null, 'bolsa_familia' => $params['bolsa_familia'] ?? null, 'vale_gas' => $params['vale_gas'] ?? null, 'bolsa_escola' => $params['bolsa_escola'] ?? null, 'bpc' => $params['bpc'] ?? null, 'informacao_residencial_recusa_cadastro' => $params['informacao_residencial_recusa_cadastro'] ?? null, 'escala_coelho_id' => $params['escala_coelho_id'] ?? null, 'renda_mensal' => $params['renda_mensal'] ?? null, 'ocupacao_id' => $params['ocupacao_id'] ?? null, 'renda_total_familiar' => $params['renda_total_familiar'] ?? null, 'possui_veiculo_proprio' => $params['possui_veiculo_proprio'] ?? false, 'possui_financiamento' => $params['possui_financiamento'] ?? false, 'possui_emprestimo' => $params['possui_emprestimo'] ?? false, 'animal' => $params['animal'] ?? null, 'lazer' => $params['lazer'] ?? null, 'veiculos' => $params['veiculos'] ?? null, 'financiamentos' => $params['financiamentos'] ?? null, 'emprestimos' => $params['emprestimos'] ?? null, 'protocolo_cross' => $params['cidadao']['documentos']['outro']['protocolo_cross'] ?? null, 'alimentacao_diaria_id' => $params['alimentacao_diaria_id'] ?? null, 'higiene_pessoal' => $params['higiene_pessoal'] ?? null, 'outra_instituicao' => $params['outra_instituicao'] ?? null, 'outra_instituicao_quais' => $params['outra_instituicao_quais'] ?? null, 'parentesco' => $params['parentesco'] ?? null, 'recebe_beneficio' => $params['recebe_beneficio'] ?? null, 'referencia_familiar' => $params['referencia_familiar'] ?? null, 'situacao_rua_id' => $params['situacao_rua_id'] ?? null, 'visita_familiar' => $params['visita_familiar'] ?? null, 'origem_alimentacao' => $params['origem_alimentacao'] ?? null, 'higiene_pessoal_quais' => $params['higiene_pessoal_quais'] ?? null, 'maternidade_referencia' => $params['maternidade_referencia'] ?? null, 'gestante' => $params['gestante'] ?? null, ]; if (is_string($data['prontuario_unidade'])) { $data['prontuario_unidade'] = mb_strtoupper($data['prontuario_unidade']); } if (isset($params['origem']) && $params['origem'] == 'mobile') { $data['created_lotacao_id'] = $params['cidadao']['created_lotacao_id']; $data['created_centro_custo_id'] = $params['cidadao']['created_centro_custo_id']; $data['updated_lotacao_id'] = $params['cidadao']['updated_lotacao_id']; $data['updated_centro_custo_id'] = $params['cidadao']['updated_centro_custo_id']; } return $data; } public function destroy(int $id) { $this->auth(__FUNCTION__); Paciente::findOrFail($id)->delete(); return response()->json(null, Response::HTTP_NO_CONTENT); } public function bloquear($id) { $this->auth(__FUNCTION__); $paciente = Paciente::findOrFail($id); $paciente->update(['bloqueado' => true]); return response()->json($paciente->fresh(), Response::HTTP_OK); } public function desbloquear($id) { $this->auth(__FUNCTION__); $paciente = Paciente::findOrFail($id); $paciente->update(['bloqueado' => false]); return response()->json($paciente->fresh(), Response::HTTP_OK); } public function autocomplete() { $parametrizacao = Parametrizacao::first(); $provisorioBloqueado = $parametrizacao->cadastro_paciente_provisorio_bloqueado ?? false; $provisorioQuantidadeDias = $parametrizacao->cadastro_paciente_provisorio_quantidade_dias ?? 0; $search = request()->query('search')['value'] ?? null; $pacientes = Paciente::query() ->join('cadastro_cidadao','cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->with(['cidadao', 'cidadao.sexo', 'cidadao.nacionalidade', 'cidadao.racaCor', 'cidadao.etniaIndigena']) ->select('cadastro_paciente.*', 'cadastro_cidadao.nome'); if (DataUtil::isStringBoolean(request()->query('imunizacao_aplicacao_campanha'))) { if (self::getImunizcaoParametrizacao()->perfil_campanha) { $campanha = CadastroCampanhaService::show(request()->query('campanha_id')); $campanha->populacoes->each(function ($populacao) use ($pacientes) { if ($populacao->idade_inicial_medida_tempo_id === MedidaTempo::DIAS) { $pacientes->orWhereHas('cidadao', function ($query) use ($populacao) { $query ->whereRaw("TIMESTAMPDIFF(DAY, data_nascimento, CURRENT_DATE) >= $populacao->idade_inicial") ->whereRaw("TIMESTAMPDIFF(DAY, data_nascimento, CURRENT_DATE) <= $populacao->idade_final"); if ($populacao->sexo_id === Sexo::FEMININO) { $query->where('sexo_id', Sexo::FEMININO); } elseif ($populacao->sexo_id === Sexo::MASCULINO) { $query->where('sexo_id', Sexo::MASCULINO); } }); } elseif ($populacao->idade_inicial_medida_tempo_id === MedidaTempo::MESES) { $pacientes->orWhereHas('cidadao', function ($query) use ($populacao) { $query ->whereRaw("TIMESTAMPDIFF(MONTH, data_nascimento, CURRENT_DATE) >= $populacao->idade_inicial") ->whereRaw("TIMESTAMPDIFF(MONTH, data_nascimento, CURRENT_DATE) <= $populacao->idade_final"); if ($populacao->sexo_id === Sexo::FEMININO) { $query->where('sexo_id', Sexo::FEMININO); } elseif ($populacao->sexo_id === Sexo::MASCULINO) { $query->where('sexo_id', Sexo::MASCULINO); } }); } elseif ($populacao->idade_inicial_medida_tempo_id === MedidaTempo::ANOS) { $pacientes->orWhereHas('cidadao', function ($query) use ($populacao) { $query ->whereRaw("TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE) >= $populacao->idade_inicial") ->whereRaw("TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE) <= $populacao->idade_final"); if ($populacao->sexo_id === Sexo::FEMININO) { $query->where('sexo_id', Sexo::FEMININO); } elseif ($populacao->sexo_id === Sexo::MASCULINO) { $query->where('sexo_id', Sexo::MASCULINO); } }); } }); } } $pacientes->where(function ($query) { $query ->where('cadastro_paciente.bloqueado', false) ->orWhereNull('cadastro_paciente.bloqueado'); }); if ($provisorioBloqueado) { $pacientes->where(function ($query) use ($provisorioQuantidadeDias) { $query->where('cadastro_paciente.subclassificacao_id', '!=', Subclassificacao::TEMPORARIO) ->orWhere(function ($query) use ($provisorioQuantidadeDias) { $query->where('cadastro_paciente.subclassificacao_id', Subclassificacao::TEMPORARIO) ->where(function ($query) use ($provisorioQuantidadeDias) { $query->where(function ($query) { $query->whereNull('cadastro_paciente.validade_inicio') ->orWhereDate('cadastro_paciente.validade_inicio', '<=', Carbon::now()->format('Y-m-d')); }); $query->where(function ($query) use ($provisorioQuantidadeDias) { $query->whereNull('cadastro_paciente.validade_fim') ->orWhere(function ($query) use ($provisorioQuantidadeDias) { if (!is_null($provisorioQuantidadeDias) && $provisorioQuantidadeDias > 0) { $query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d')) ->orWhereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->subDays($provisorioQuantidadeDias)->format('Y-m-d')); } else { $query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d')); } }); }); }); }) ->orWhereNull('cadastro_paciente.subclassificacao_id'); }); } if (DataUtil::isStringBoolean(request()->query('not_cidadao_obito'))) { $pacientes->whereDoesntHave('cidadao.obito', function ($query) { $query->whereNull('cadastro_obito.deleted_at'); }); } if($search){ $pacientes->orderByRaw(" CASE WHEN cadastro_cidadao.nome = ? then 0 WHEN cadastro_cidadao.nome LIKE ? then 1 WHEN cadastro_cidadao.nome LIKE ? then 2 ELSE 3 END ",[ $search, "$search%", "%$search" ]); } return datatables() ->of($pacientes) ->filterColumn('prontuario', function ($query, $keyword) { $query->whereRaw('LPAD(prontuario,7,0) like ?', ["%{$keyword}%"]); }) ->filterColumn('cidadao.cpf', function ($query, $keyword) { $query->whereHas('cidadao', function ($query) use ($keyword) { $query ->whereRaw("cpf like ?", ["%{$keyword}%"]) ->orWhereRaw( "CONCAT( SUBSTR(cpf,1,3), '.', SUBSTR(cpf,4,3), '.', SUBSTR(cpf,7,3), '-', SUBSTR(cpf,10,2) ) like ?", ["%{$keyword}%"] ); }); }) ->filterColumn('cidadao.data_nascimento', function ($query, $keyword) { $query->whereHas('cidadao', function ($query) use ($keyword) { $query ->whereRaw("DATE_FORMAT(data_nascimento, '%d/%m/%Y') like ?", ["%{$keyword}%"]) ->orWhereRaw( "CONCAT( SUBSTR(data_nascimento,9,2), SUBSTR(data_nascimento,6,2), SUBSTR(data_nascimento,1,4) ) like ?", ["%{$keyword}%"] ); }); }) ->toJson(); } private static function getImunizcaoParametrizacao() { return DB::table('imunizacao_parametrizacao') ->select([ 'perfil_campanha', ]) ->first(); } public static function isCadastroPacienteVencido($pacienteId) { $paciente = Paciente::findOrFail($pacienteId); if (is_null($paciente->validade_fim)) { return false; } return Carbon::today() > $paciente->validade_fim; } private 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; } public function getPaciente($id = null) { if (is_null($id)) { return null; } return Paciente::find($id); } public static function obterFichaPacientePorCpf($cpf) { $cidadao = Cidadao::with('paciente')->where('cpf', $cpf)->first(); if (is_null($cidadao)) { return null; } if (is_null($cidadao->paciente)) { return null; } return $cidadao->paciente->id; } public function getAdditionalsFormModelData($id, $checarPermissaoCadastro = true) { $paciente = Paciente::findOrFail($id); if ($checarPermissaoCadastro) { if (!self::checkPermissaoCadastro($paciente->classificacao_id)) { throw new AlteracaoCadastroPacienteNaoPermitidoException(); } } $prontuarioUnidade = $paciente->prontuariosUnidade() ->where('unidade_id', $this->getCurrentCentroCusto()->infraestrutura->unidade_id) ->first(); $parametrizacao = Parametrizacao::first(); $quantidadeDias = $parametrizacao->cadastro_paciente_desatualizado_quantidade_dias ?? 0; $exigeCpfPaciente = $parametrizacao->exige_cpf_paciente ?? true; $exigeCnsPaciente = $parametrizacao->exige_cns_paciente ?? true; $updatedAt = $paciente->updated_at > $paciente->cidadao->updated_at ? $paciente->updated_at : $paciente->cidadao->updated_at; if ($updatedAt) { $updatedAtCarbon = Carbon::createFromFormat('Y-m-d H:i:s', $updatedAt); $updatedAtCarbon->addDays($quantidadeDias); $currentDateTime = Carbon::now(); if ($updatedAtCarbon->lessThan($currentDateTime)) { $diasAtrasados = $updatedAtCarbon->diffInDays($currentDateTime); $diasAtrasados = str_pad($diasAtrasados, 2, '0', STR_PAD_LEFT); } else { $diasAtrasados = null; } } else { $diasAtrasados = null; } $cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $paciente->cidadao->domicilio_id)->first(); $cadastroIndividual = CadastroIndividual::where('paciente_id', $paciente->id)->first(); $hasCadastroIndividual = CadastroIndividual::where('paciente_id', $paciente->id)->first() ? false : true; $hasCadastroDomiciliar = $cadastroDomiciliar ? false : true; $informacaoResidencial = $paciente->cidadao->domicilio && $paciente->cidadao->domicilio->informacaoResidencial ? $paciente->cidadao->domicilio->informacaoResidencial : null; $internacaoData = $paciente->condicaoSaude->internacao_data ?? null; if ($internacaoData && Carbon::parse($internacaoData)->lt(Carbon::now()->subYear())) { $internacao = null; $internacaoMotivo = null; $internacaoData = null; } else { $internacao = $paciente->condicaoSaude->internacao ?? null; $internacaoMotivo = $paciente->condicaoSaude->internacao_motivo ?? null; $internacaoData = $internacaoData; } $isPacienteResponsavel = $paciente->informacaoSocial && $paciente->informacaoSocial->responsavel === true; $responsaveis = self::getResponsaveis($paciente); $isResponsavel = (count($responsaveis) === 0 && !$isPacienteResponsavel) ? false : $isPacienteResponsavel; $responsavelCidadaoId = $paciente->informacaoSocial->responsavel_cidadao_id ?? null; if (!$isResponsavel && is_null($responsavelCidadaoId) && $responsaveis->count() === 1) { $responsavelCidadaoId = $responsaveis->first()->id; } $fatoresRisco = $paciente->cidadao->fatoresRisco->pluck('id'); $transtornoEspectroAutista = $fatoresRisco->contains(FatorRisco::TEA) ? true : false; $deficiencias = $paciente && $paciente->informacaoSocial ? $paciente->informacaoSocial->deficiencia->pluck('id') : collect(); $deficiente = $paciente->informacaoSocial->deficiente ?? null; if ($transtornoEspectroAutista) { $deficiente = true; if (!$deficiencias->contains(Deficiencia::TEA)) { $deficiencias->push(Deficiencia::TEA); } } if ($deficiencias->contains(Deficiencia::TEA) && !$fatoresRisco->contains(FatorRisco::TEA)) { $paciente->cidadao->fatoresRisco()->attach(FatorRisco::TEA); } return response()->json( [ 'additionals' => [ 'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(), 'exige_cpf_paciente' => $exigeCpfPaciente, 'exige_cns_paciente' => $exigeCnsPaciente, ], 'form' => array_merge( [ 'cidadao' => CidadaoService::edit($paciente->cidadao_id)['form'], 'prontuario' => $paciente->prontuario, 'is_unidade_referencia' => $paciente->unidade && $paciente->unidade->unidade_referencia === true, 'is_responsavel' => $isResponsavel, 'atualizacao' => $updatedAt ? (new Carbon($updatedAt))->format('d/m/Y H:i') : null, 'dias_atrasados' => $quantidadeDias && $quantidadeDias > 0 ? $diasAtrasados : null, 'historico' => PacienteHistorico::where('paciente_id', $paciente->id) ->orderBy('created_at') ->get() ->map(fn ($historico) => [ 'data' => $historico->is_integrado == 1 || $historico->lotacao != null ? (new Carbon($historico->created_at))->format('d/m/Y H:i') : null, 'usuario' => $historico->is_integrado == 1 ? 'INTEGRAÇÃO' :($historico->lotacao ? $historico->lotacao->usuario->cidadao->nome : null), 'equipe' => $historico->equipe && $historico->equipe->microarea_id ? ($historico->equipe->microarea->descricao ? 'INE: ' . str_pad($historico->equipe->microarea->area->numero_ine, 10, '0', STR_PAD_LEFT) . ' - ÁREA: ' . $historico->equipe->microarea->area->descricao . ' - MICROÁREA: ' . $historico->equipe->microarea->descricao : 'INE: ' . str_pad($historico->equipe->microarea->area->numero_ine, 10, '0', STR_PAD_LEFT) . ' - ÁREA: ' . $historico->equipe->microarea->area->descricao) : '-', ])->filter(), 'impressoes' => [ ['value' => 'cadastroIndividual', 'text' => 'Cadastro individual', 'disabled' => $hasCadastroIndividual], ['value' => 'cadastroDomiciliar', 'text' => 'Cadastro domiciliar', 'disabled' => $hasCadastroDomiciliar], ['value' => 'termoRecusaCadastro', 'text' => 'Termo de recusa do cadastro', 'disabled' => false], ['value' => 'etiquetaConectasus', 'text' => 'Etiqueta do prontuário', 'disabled' => false], ['value' => 'residentes', 'text' => 'Residentes', 'disabled' => false], ['value' => 'folhaRosto', 'text' => 'Folha de rosto', 'disabled' => false], ['value' => 'cartaoNacionalSaude', 'text' => 'Cartão nacional de saúde', 'disabled' => false], ], 'residentes' => $paciente && $paciente->cidadao->domicilio_id ? self::getResidentes($paciente->cidadao->domicilio_id) : [], 'residentes_anteriores' => $paciente && $paciente->cidadao->domicilio_id ? self::getResidentesAnteriores($paciente->cidadao->domicilio_id) : [], 'domicilio_id' => $paciente ? $paciente->cidadao->domicilio_id : null, 'cadastro_domiciliar_id' => $cadastroDomiciliar ? $cadastroDomiciliar->id : null, 'responsaveis' => $responsaveis, ], $this->getFormData($paciente->unidade_id, true) ), 'model' => [ 'email' => $paciente->email, 'classificacao_id' => $paciente->classificacao_id, 'subclassificacao_id' => $paciente->subclassificacao_id, 'validade_inicio' => $paciente->validade_inicio, 'validade_fim' => $paciente->validade_fim, 'prontuario_unidade' => $prontuarioUnidade->prontuario ?? null, 'protocolo_cross' => $paciente->protocolo_cross ?? null, 'unidade_id' => $paciente->unidade_id, 'infraestrutura_id' => $paciente->infraestrutura_id, 'altera_responsavel' => false, 'domicilio_id_old' => $paciente->cidadao->domicilio_id ?? null, 'responsavel_usuario' => [ 'id' => $paciente->responsavel && $paciente->responsavel->usuario ? $paciente->responsavel->usuario->id : null, 'cidadao_nome' => $paciente->responsavel && $paciente->responsavel->usuario ? $paciente->responsavel->usuario->cidadao->nome : null, ], 'responsavel_unidade_id' => $paciente->responsavel && $paciente->responsavel->equipe ? $paciente->responsavel->equipe->unidade_id : null, 'responsavel_infraestrutura_id' => $paciente->responsavel && $paciente->responsavel->equipe ? $paciente->responsavel->equipe->infraestrutura_id : null, 'responsavel_equipe_id' => $paciente->responsavel ? $paciente->responsavel->responsavel_equipe_id : null, 'responsavel_ocupacao_id' => $paciente->responsavel ? $paciente->responsavel->responsavel_ocupacao_id : null, 'responsavel_data' => $paciente->responsavel && $paciente->responsavel->responsavel_data ? $paciente->responsavel->responsavel_data : Carbon::now()->format('Y-m-d'), 'prontuarios_unidades' => $paciente->prontuariosUnidade, 'bloqueado' => $paciente->bloqueado ? true : false, 'cidadao' => array_merge([ 'id' => $paciente->cidadao_id, ], CidadaoService::edit($paciente->cidadao_id)['model']), 'impressoes' => [], 'curso_id' => $paciente ? $paciente->curso_id : null, 'frequenta_escola_creche' => $paciente ? $paciente->frequenta_escola_creche : null, 'situacao_mercado_trabalho_id' => $paciente ? $paciente->situacao_mercado_trabalho_id : null, 'frequenta_cuidador_tradicional' => $paciente ? $paciente->frequenta_cuidador_tradicional : null, 'participa_grupo_comunitario' => $paciente ? $paciente->participa_grupo_comunitario : null, 'acompanhamento_infantil' => $paciente && $paciente->informacaoSocial ? $paciente->informacaoSocial->acompanhamentoInfantil->pluck('id') : [], 'deficiencias' => $deficiencias, 'plano_saude' => $paciente ? $paciente->cidadao->conveniosMedico->isEmpty() ? $paciente->plano_saude : true : null, 'convenio_medico' => $paciente->cidadao->conveniosMedico ?? null, 'comunidade_tradicional' => $paciente ? $paciente->comunidade_tradicional : null, 'comunidade_tradicional_qual' => $paciente && $paciente->comunidade_tradicional ? [ 'id' => $paciente->comunidadeTradicionalQual->id, 'codigo_esus' => $paciente->comunidadeTradicionalQual->codigo_esus, 'descricao' => $paciente->comunidadeTradicionalQual->descricao, ] : null, 'saida_cidadao_id' => optional($paciente->informacaoSocial)->saida_cidadao_id, 'motivo_saida_data' => optional($paciente->informacaoSocial)->motivo_saida_data, 'obito' => $paciente->cidadao->obito ? true : false, 'obito_em' => $paciente->cidadao->obito ? (new Carbon($paciente->cidadao->obito->obito_em))->format('Y-m-d') : null, 'hora_obito' => $paciente->cidadao->obito ? (new Carbon($paciente->cidadao->obito->obito_em))->format('H:i:s') : null, 'obito_declaracao' => $paciente->cidadao->obito->declaracao ?? null, 'obito_causa' => $paciente->cidadao->obito->causa ?? null, 'obito_cid' => [ 'id' => $paciente->cidadao->obito->cid->id ?? null, 'nome' => $paciente->cidadao->obito->cid->nome ?? null, ], 'fora_area' => $informacaoResidencial ? $informacaoResidencial->fora_area : false, 'microarea_id' => $informacaoResidencial ? $informacaoResidencial->microarea_id : null, 'imovel_tipo_id' => $informacaoResidencial ? $informacaoResidencial->imovel_tipo_id : null, 'situacao_domicilio_id' => $informacaoResidencial ? $informacaoResidencial->situacao_domicilio_id : null, 'domicilio_tipo_id' => $informacaoResidencial ? $informacaoResidencial->domicilio_tipo_id : null, 'quantidade_comodos' => $informacaoResidencial ? $informacaoResidencial->quantidade_comodos : null, 'situacao_rural_id' => $informacaoResidencial ? $informacaoResidencial->situacao_rural_id : null, 'domicilio_zona_id' => $informacaoResidencial ? $informacaoResidencial->domicilio_zona_id : null, 'domicilio_tipo_acesso_id' => $informacaoResidencial ? $informacaoResidencial->domicilio_tipo_acesso_id : null, 'material_predominante_id' => $informacaoResidencial ? $informacaoResidencial->material_predominante_id : null, 'abastecimento_id' => $informacaoResidencial ? $informacaoResidencial->abastecimento_id : null, 'tratamento_id' => $informacaoResidencial ? $informacaoResidencial->tratamento_id : null, 'destino_lixo_id' => $informacaoResidencial ? $informacaoResidencial->destino_lixo_id : null, 'forma_escoamento_id' => $informacaoResidencial ? $informacaoResidencial->forma_escoamento_id : null, 'possui_animais' => $informacaoResidencial ? $informacaoResidencial->possui_animais : false, 'energia_eletrica' => $informacaoResidencial ? $informacaoResidencial->energia_eletrica : false, 'quantidade_animais' => $informacaoResidencial ? $informacaoResidencial->quantidade_animais : null, 'animal' => $informacaoResidencial && $informacaoResidencial->animal ? $informacaoResidencial->animal->pluck('id') : [], 'escala_coelho_id' => $informacaoResidencial ? $informacaoResidencial->escala_coelho_id : null, 'higiene_residencial_id' => $informacaoResidencial ? $informacaoResidencial->higiene_residencial_id : null, 'bolsa_familia' => $informacaoResidencial ? $informacaoResidencial->bolsa_familia : false, 'vale_gas' => $informacaoResidencial ? $informacaoResidencial->vale_gas : false, 'bolsa_escola' => $informacaoResidencial ? $informacaoResidencial->bolsa_escola : false, 'lazer' => $informacaoResidencial && $informacaoResidencial->lazer ? $informacaoResidencial->lazer->pluck('id') : [], 'bpc' => $informacaoResidencial ? $informacaoResidencial->bpc : false, 'renda_mensal' => $paciente->informacaoResidencial && $paciente->informacaoResidencial->renda_mensal ? number_format($paciente->informacaoResidencial->renda_mensal, 2, ',', '.') : '0,00', 'ocupacao_id' => $paciente->informacaoResidencial->ocupacao_id ?? null, 'ocupacao' => $paciente && $paciente->informacaoResidencial && $paciente->informacaoResidencial->ocupacao ? [ 'id' => $paciente->informacaoResidencial->ocupacao->id, 'codigo' => $paciente->informacaoResidencial->ocupacao->codigo, 'nome' => $paciente->informacaoResidencial->ocupacao->nome, ] : null, 'renda_total_familiar' => $paciente->informacaoResidencial && $paciente->informacaoResidencial->renda_total_familiar ? number_format($paciente->informacaoResidencial->renda_total_familiar, 2, ',', '.') : '0,00', 'informacao_residencial_recusa_cadastro' => $paciente->informacaoResidencial->recusa_cadastro ?? false, 'possui_veiculo_proprio' => $paciente->informacaoResidencial->possui_veiculo_proprio ?? false, 'possui_financiamento' => $paciente->informacaoResidencial->possui_financiamento ?? false, 'possui_emprestimo' => $paciente->informacaoResidencial->possui_emprestimo ?? false, 'instituicao_nome' => $paciente->informacaoResidencial->instituicao_nome ?? null, 'instituicao_outros_profissionais' => $paciente->cidadao->domicilio->informacaoResidencial->instituicao_outros_profissionais ?? false, 'instituicao_nome_responsavel_tecnico' => $paciente->cidadao->domicilio->informacaoResidencial->instituicao_nome_responsavel_tecnico ?? null, 'instituicao_cns_responsavel_tecnico' => isset($paciente->cidadao) && isset($paciente->cidadao->domicilio) && isset($paciente->cidadao->domicilio->informacaoResidencial) && isset($paciente->cidadao->domicilio->informacaoResidencial->instituicao_cns_responsavel_tecnico) ? MaskUtil::getCnsMasked($paciente->cidadao->domicilio->informacaoResidencial->instituicao_cns_responsavel_tecnico) : null, 'instituicao_cargo_responsavel_tecnico' => $paciente->cidadao->domicilio->informacaoResidencial->instituicao_cargo_responsavel_tecnico ?? null, 'instituicao_telefone_responsavel_tecnico' => isset($paciente->cidadao) && isset($paciente->cidadao->domicilio) && isset($paciente->cidadao->domicilio->informacaoResidencial) && isset($paciente->cidadao->domicilio->informacaoResidencial->instituicao_telefone_responsavel_tecnico) ? MaskUtil::getPhoneMasked($paciente->cidadao->domicilio->informacaoResidencial->instituicao_telefone_responsavel_tecnico) : null, 'parentesco_id' => $paciente->parentesco_id ?? null, 'peso_id' => $paciente->condicaoSaude->peso_id ?? null, 'internacao' => $internacao, 'internacao_motivo' => $internacaoMotivo, 'internacao_data' => $internacaoData, 'doenca_cardiaca' => $paciente->condicaoSaude->doenca_cardiaca ?? null, 'doenca_cardiaca_quais' => $paciente && $paciente->condicaoSaude ? $paciente->condicaoSaude->doencaCardiaca->pluck('id') : [], 'problemas_rins' => $paciente->condicaoSaude->problemas_rins ?? null, 'problemas_rins_quais' => $paciente && $paciente->condicaoSaude ? $paciente->condicaoSaude->problemasRins->pluck('id') : [], 'doenca_respiratoria' => $paciente->condicaoSaude->doenca_respiratoria ?? null, 'doenca_respiratoria_quais' => $paciente && $paciente->condicaoSaude ? $paciente->condicaoSaude->doencaRespiratoria->pluck('id') : [], 'tratamento_saude_mental' => $paciente->condicaoSaude->tratamento_saude_mental ?? null, 'tratamento_saude_mental_internacao_data' => $paciente->condicaoSaude->tratamento_saude_mental_internacao_data ?? null, 'tratamento_saude_mental_alta_data' => $paciente->condicaoSaude->tratamento_saude_mental_alta_data ?? null, 'acamado' => $paciente->condicaoSaude->acamado ?? null, 'domiciliado' => $paciente->condicaoSaude->domiciliado ?? null, 'plantas_medicinais' => $paciente->condicaoSaude->plantas_medicinais ?? null, 'plantas_medicinais_quais' => $paciente->condicaoSaude->plantas_medicinais_quais ?? null, 'praticas_integrativas' => $paciente->condicaoSaude->praticas_integrativas ?? null, 'outras_condicoes_primaria' => $paciente->condicaoSaude->outras_condicoes_primaria ?? null, 'outras_condicoes_secundaria' => $paciente->condicaoSaude->outras_condicoes_secundaria ?? null, 'outras_condicoes_terciaria' => $paciente->condicaoSaude->outras_condicoes_terciaria ?? null, 'recusa_cadastro' => $paciente->recusa_cadastro ?? false, 'data_ultima_menstruacao' => $paciente->dum->data_ultima_menstruacao ?? null, 'idade_gestacional_semanas' => $paciente->dum->idade_gestacional_semanas ?? null, 'idade_gestacional_dias' => $paciente->dum->idade_gestacional_dias ?? null, 'data_possivel_parto' => $paciente->dum->data_possivel_parto ?? null, 'gravidez_planejada' => $paciente->dum->gravidez_planejada ?? null, 'gestacao_previa' => $paciente->dum->gestacao_previa ?? null, 'parto' => $paciente->dum->parto ?? null, 'responsavel' => $isResponsavel, 'responsavel_cidadao_id' => $responsavelCidadaoId, 'parentesco_responsavel_id' => $paciente->informacaoSocial->parentesco_responsavel_id ?? null, 'curso_id' => $paciente->informacaoSocial->curso_id ?? null, 'orientacao_sexual' => $paciente->informacaoSocial->orientacao_sexual ?? null, 'orientacao_sexual_id' => $paciente->informacaoSocial->orientacao_sexual_id ?? null, 'identidade_genero' => !is_null($paciente->cidadao->identidade_genero_id), 'deficiente' => $deficiente, 'frequenta_escola_creche' => $paciente->informacaoSocial->frequenta_escola_creche ?? null, 'situacao_mercado_trabalho_id' => $paciente->informacaoSocial->situacao_mercado_trabalho_id ?? null, 'frequenta_cuidador_tradicional' => $paciente->informacaoSocial->frequenta_cuidador_tradicional ?? null, 'participa_grupo_comunitario' => $paciente->informacaoSocial->participa_grupo_comunitario ?? null, 'plano_saude' => $paciente->informacaoSocial->plano_saude ?? null, 'comunidade_tradicional' => $paciente->informacaoSocial->comunidade_tradicional ?? null, 'comunidade_tradicional_qual' => $paciente->informacaoSocial && $paciente->informacaoSocial->comunidadeTradicionalQual ? [ 'id' => $paciente->informacaoSocial->comunidadeTradicionalQual->id, 'codigo_esus' => $paciente->informacaoSocial->comunidadeTradicionalQual->codigo_esus, 'descricao' => $paciente->informacaoSocial->comunidadeTradicionalQual->descricao, ] : null, 'saida_cidadao_id' => $paciente->informacaoSocial->saida_cidadao_id ?? null, 'motivo_saida_data' => $paciente->informacaoSocial->motivo_saida_data ?? null, 'informacao_social_recusa_cadastro' => $paciente->informacaoSocial->recusa_cadastro ?? null, 'alimentos_acabaram' => $paciente->informacaoSocial->alimentos_acabaram ?? null, 'comeu_alguns_alimentos' => $paciente->informacaoSocial->comeu_alguns_alimentos ?? null, 'data_atualizacao_tria' => optional($paciente->informacaoSocial)->data_atualizacao_tria ? optional($paciente->informacaoSocial)->data_atualizacao_tria : optional($cadastroIndividual)->created_at, 'veiculos' => $paciente->informacaoResidencial->veiculo ?? [], 'financiamentos' => $paciente->informacaoResidencial && $paciente->informacaoResidencial->financiamento ? $paciente->informacaoResidencial->financiamento->map(fn($financiamento) => [ 'id' => $financiamento->id ?? null, 'tipo' => $financiamento->tipo ?? null, 'valor_parcela' => $financiamento->valor_parcela ? number_format($financiamento->valor_parcela, 2, ',', '.') : null, 'quantidade_parcela' => $financiamento->quantidade_parcela ?? null, ]) : [], 'emprestimos' => $paciente->informacaoResidencial && $paciente->informacaoResidencial->emprestimo ? $paciente->informacaoResidencial->emprestimo->map(fn($emprestimo) => [ 'id' => $emprestimo->id ?? null, 'tipo' => $emprestimo->tipo ?? null, 'valor_parcela' => $emprestimo->valor_parcela ? number_format($emprestimo->valor_parcela, 2, ',', '.') : null, 'quantidade_parcela' => $emprestimo->quantidade_parcela ?? null, ]) : [], ], ], Response::HTTP_OK ); } public function getPrintFormModelData($id) { $paciente = Paciente::findOrFail($id); $cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $paciente->cidadao->domicilio_id)->first(); $cadastroIndividual = CadastroIndividual::where('paciente_id', $paciente->id)->first(); $unidadesReferencia = Unidade::where('unidade_referencia', true) ->where('id', $paciente->unidade_id) ->orderBy('nome_fantasia') ->get(); return [ 'form' => [ 'prontuario' => $paciente->prontuario, 'unidades_referencia' => $unidadesReferencia->map(fn ($unidades) => [ 'id' => $unidades->id, 'nome_fantasia' => $unidades->cnes ? $unidades->cnes . ' - ' . $unidades->nome_fantasia : $unidades->nome_fantasia ]), 'impressoes' => [ ['value' => 'cadastroIndividual', 'text' => 'Cadastro individual', 'disabled' => $cadastroIndividual ? false: true], ['value' => 'cadastroDomiciliar', 'text' => 'Cadastro domiciliar', 'disabled' => $cadastroDomiciliar ? false : true], ['value' => 'termoRecusaCadastro', 'text' => 'Termo de recusa do cadastro', 'disabled' => false], ['value' => 'etiquetaConectasus', 'text' => 'Etiqueta do prontuário', 'disabled' => false], ['value' => 'residentes', 'text' => 'Residentes', 'disabled' => false], ['value' => 'folhaRosto', 'text' => 'Folha de rosto', 'disabled' => false], ['value' => 'cartaoNacionalSaude', 'text' => 'Cartão nacional de saúde', 'disabled' => false], ], ], 'model' => [ 'id' => $paciente->id, 'domicilio_id' => $paciente ? $paciente->cidadao->domicilio_id : null, 'cadastro_domiciliar_id' => $cadastroDomiciliar ? $cadastroDomiciliar->id : null, 'cidadao' => $paciente->cidadao, 'impressoes' => [], ], ]; } private static function houveMudancaInformacaoSocioeconomica($alimentosAtual, $comeuAtual, $alimentosNovo, $comeuNovo) { return $alimentosAtual !== $alimentosNovo || $comeuAtual !== $comeuNovo; } }