self::getFormData(), ]; } public static function edit($id): array { $cidadao = Cidadao::findOrFail($id); return [ 'form' => self::getFormData($cidadao), 'model' => [ 'cns' => $cidadao->cns ? MaskUtil::getCnsMasked($cidadao->cns) : null, 'cpf' => $cidadao->cpf ? MaskUtil::getCpfMasked($cidadao->cpf) : null, 'dnv' => $cidadao->dnv ? MaskUtil::getDnvMasked($cidadao->dnv) : null, 'cpf_nao_pertence_ao_cidadao' => $cidadao->cpf_nao_pertence_ao_cidadao, 'motivo_duplicidade_cpf_id' => $cidadao->motivo_duplicidade_cpf_id, 'motivo_duplicidade_cpf_outro' => $cidadao->motivo_duplicidade_cpf_outro ?? '', 'nome' => $cidadao->nome, 'nome_social' => $cidadao->nome_social ?? '', 'preferencia_nome_id' => $cidadao->preferencia_nome_id, 'data_nascimento' => $cidadao->data_nascimento ? $cidadao->data_nascimento->format('Y-m-d') : null, 'idade' => $cidadao->idade['anos'] ?? null, 'data_obito' => $cidadao->obito->obito_em ?? null, 'sexo_id' => $cidadao->sexo_id, 'identidade_genero_id' => $cidadao->identidade_genero_id, 'estado_civil_id' => $cidadao->estado_civil_id, 'conjuge' => $cidadao->conjuge ?? '', 'situacao_familiar_conjugal_id' => $cidadao->situacao_familiar_conjugal_id, 'raca_cor_id' => $cidadao->raca_cor_id && $cidadao->raca_cor_id != SujeitoAtencaoRacaCor::SEM_INFORMACAO ? $cidadao->raca_cor_id : null, 'etnia_indigena_id' => $cidadao->etnia_indigena_id, 'tipo_sanguineo_id' => $cidadao->tipo_sanguineo_id, 'deficiencia_id' => $cidadao->deficiencia_id, 'deficiencia_outro' => $cidadao->deficiencia_outro ?? '', 'mobilidade_reduzida_id' => $cidadao->mobilidade_reduzida_id, 'desconhece_nome_mae' => $cidadao->desconhece_nome_mae, 'desconhece_nome_pai' => $cidadao->desconhece_nome_pai, 'nome_mae' => $cidadao->nome_mae ?? '', 'nome_pai' => $cidadao->nome_pai ?? '', 'local_nascimento_id' => $cidadao->local_nascimento_id, 'pais_nascimento_id' => $cidadao->pais_nascimento_id, 'nacionalidade_id' => $cidadao->nacionalidade_id, 'data_naturalizacao' => $cidadao->data_naturalizacao, 'portaria_naturalizacao' => $cidadao->portaria_naturalizacao, 'estado_nascimento_id' => $cidadao->estado_nascimento_id, 'municipio_nascimento' => $cidadao->municipioNascimento, 'frequenta_escola' => $cidadao->frequenta_escola, 'escolaridade_id' => $cidadao->escolaridade_id, 'telefones' => $cidadao->telefones->map(fn ($telefone) => [ 'id' => $telefone->id, 'numero' => MaskUtil::getPhoneMasked($telefone->numero), 'observacao' => $telefone->observacao ?? '', 'autoriza_sms' => $telefone->autoriza_sms, 'principal' => $telefone->principal, ]), 'convenios_medicos' => $cidadao->conveniosMedico->map(fn ($convenio) => [ 'id' => $convenio->id, 'nome' => $convenio->nome, ]), 'fatores_risco' => $cidadao->fatoresRisco->pluck('id'), 'fator_risco_outro' => $cidadao->fator_risco_outro ?? '', 'alergias' => $cidadao->alergias->map(fn ($alergia) => [ 'alergia' => [ 'agente_substancia_especifica' => $alergia->agente_substancia_especifica, 'criticidade' => [ 'id' => $alergia->cidadaoAlergia->criticidade->id, 'nome' => $alergia->cidadaoAlergia->criticidade->nome, ], 'id' => $alergia->cidadaoAlergia->alergia_id, 'reacoes_observacoes' => $alergia->cidadaoAlergia->reacoes_observacoes, 'tipo' => [ 'id' => $alergia->tipo->id, 'descricao' => $alergia->tipo->descricao, ], 'cid' => [ 'id' => $alergia->cidadaoAlergia->cid->id ?? null, 'nome' => $alergia->cidadaoAlergia->cid->nome ?? null, 'codigo' => $alergia->cidadaoAlergia->cid->codigo ?? null, 'codigo_nome' => $alergia->cidadaoAlergia->cid ? $alergia->cidadaoAlergia->cid->codigo . ' - ' . $alergia->cidadaoAlergia->cid->nome : null, ] ], ]), 'medicamentos_uso_continuo' => $cidadao->medicamentosUsoContinuo->map(fn ($medicamento) => [ 'medicamento' => [ 'nome' => $medicamento->nome, 'id' => $medicamento->CidadaoMedicamentoUsoContinuo->medicamento_id, ], 'lotacao' => [ 'ocupacao' => [ 'id' => $medicamento->CidadaoMedicamentoUsoContinuo->createdLotacao->ocupacao->id ?? null, 'codigo' => $medicamento->CidadaoMedicamentoUsoContinuo->createdLotacao->ocupacao->codigo ?? null, 'nome' => $medicamento->CidadaoMedicamentoUsoContinuo->createdLotacao->ocupacao->nome ?? null, ], 'profissional' => [ 'nome' => $medicamento->CidadaoMedicamentoUsoContinuo->createdLotacao->usuario->cidadao->nome ?? null, ], ], 'centro_custo' => [ 'setor' => [ 'nome' => $medicamento->CidadaoMedicamentoUsoContinuo->createdCentroCusto->setor->nome ?? null, ], ], 'data_hora' => $medicamento->CidadaoMedicamentoUsoContinuo->created_at->format('d/m/Y H:i:s') ?? null, ]), 'data_entrada_domicilio' => $cidadao->data_entrada_domicilio, 'ocupacao_id' => $cidadao->ocupacao_id, 'domicilio_id' => $cidadao->domicilio_id ?? null, 'domicilio' => [ 'endereco' => [ 'logradouro' => $cidadao->domicilio->endereco->logradouro ?? null, 'numero' => $cidadao->domicilio->endereco->numero ?? null, 'complemento' => $cidadao->domicilio->endereco->complemento ?? '', 'referencia' => $cidadao->domicilio->endereco->referencia ?? '', 'loteamento' => $cidadao->domicilio->endereco->loteamento ?? null, 'zona_id' => $cidadao->domicilio->endereco->zona_id ?? null, 'latitude' => $cidadao->domicilio->endereco->latitude ?? '', 'longitude' => $cidadao->domicilio->endereco->longitude ?? '', ], ], 'documentos' => [ 'carteira_identidade' => [ 'id' => $cidadao->carteiraIdentidade->id ?? null, 'numero' => $cidadao->carteiraIdentidade->numero ?? '', 'estado_id' => $cidadao->carteiraIdentidade->estado_id ?? null, 'orgao_emissor' => $cidadao->carteiraIdentidade->orgao_emissor ?? '', 'data_emissao' => $cidadao->carteiraIdentidade->data_emissao ?? null, ], 'carteira_nacional_habilitacao' => [ 'id' => $cidadao->carteiraHabilitacao->id ?? null, 'numero' => $cidadao->carteiraHabilitacao->numero ?? '', 'data_emissao' => $cidadao->carteiraHabilitacao->data_emissao ?? null, 'data_validade' => $cidadao->carteiraHabilitacao->data_validade ?? null, 'estado_id' => $cidadao->carteiraHabilitacao->estado_id ?? null, 'categoria_id' => $cidadao->carteiraHabilitacao->categoria_id ?? null, ], 'carteira_trabalho' => [ 'id' => $cidadao->carteiraTrabalho->id ?? null, 'numero' => $cidadao->carteiraTrabalho->numero ?? '', 'serie' => $cidadao->carteiraTrabalho->serie ?? '', 'data_emissao' => $cidadao->carteiraTrabalho->data_emissao ?? null, 'estado_id' => $cidadao->carteiraTrabalho->estado_id ?? null, 'nis_pis_pasep' => $cidadao->carteiraTrabalho->nis_pis_pasep ?? '', ], 'estrangeiro_entrada_brasil' => [ 'id' => $cidadao->estrangeiroEntradaBrasil->id ?? null, 'rne' => $cidadao->estrangeiroEntradaBrasil->rne ?? '', 'data_entrada' => $cidadao->estrangeiroEntradaBrasil->data_entrada ?? null, ], 'titulo_eleitor' => [ 'id' => $cidadao->tituloEleitor->id ?? null, 'numero' => $cidadao->tituloEleitor->numero ?? '', 'zona' => $cidadao->tituloEleitor->zona ?? '', 'secao' => $cidadao->tituloEleitor->secao ?? '', ], 'certidao' => [ 'id' => $cidadao->certidao->id ?? null, 'tipo_id' => $cidadao->certidao->tipo_id ?? null, 'modelo_id' => $cidadao->certidao->modelo_id ?? null, 'numero' => ($cidadao->certidao->modelo_id ?? null) === ModeloCertidao::NOVO ? MaskUtil::getNumeroCertidaoMasked($cidadao->certidao->numero) : ($cidadao->certidao->numero ?? ''), 'cartorio_nome' => $cidadao->certidao->cartorio_nome ?? '', 'livro' => $cidadao->certidao->livro ?? '', 'folha' => $cidadao->certidao->folha ?? '', 'data_emissao' => $cidadao->certidao->data_emissao ?? null, 'municipio' => $cidadao->certidao->municipio ?? null, 'cartorio_codigo' => $cidadao->certidao->cartorio_codigo ?? '', ], 'outro' => [ 'protocolo_cross' => $cidadao->paciente->protocolo_cross ?? null, ], ], 'sexo' => $cidadao->sexo, ], ]; } private static function getFormData($cidadao = null): array { return [ 'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao), 'data_atual' => Carbon::now()->format('d/m/Y'), 'identificacao' => [ 'has_dnv' => isset($cidadao->dnv), 'motivos_duplicidade_cpf' => MotivoDuplicidadeCpf::orderBy('descricao')->get()->map(fn ($motivo) => [ 'id' => $motivo->id, 'descricao' => $motivo->descricao ]), 'preferencias_nome' => PreferenciaNome::orderBy('descricao')->get()->map(fn ($preferencia) => [ 'id' => $preferencia->id, 'descricao' => $preferencia->descricao ]), 'sexos' => Sexo::orderBy('descricao')->get()->map(fn ($sexo) => [ 'id' => $sexo->id, 'descricao' => $sexo->descricao ]), 'identidades_genero' => IdentidadeGenero::orderBy('descricao')->get()->map(fn ($identidade) => [ 'id' => $identidade->id, 'descricao' => $identidade->descricao ]), 'estados_civis' => EstadoCivil::orderBy('descricao')->get()->map(fn ($estadoCivil) => [ 'id' => $estadoCivil->id, 'descricao' => $estadoCivil->descricao ]), 'situacoes_familiares_conjugais' => SituacaoFamiliarConjugal::orderBy('descricao')->get()->map( fn ($situacao) => [ 'id' => $situacao->id, 'descricao' => $situacao->descricao ] ), 'racas_cores' => RacaCor::whereNotIn('id', [SujeitoAtencaoRacaCor::SEM_INFORMACAO])->orderBy('descricao')->get()->map(fn ($racaCor) => [ 'id' => $racaCor->id, 'descricao' => $racaCor->descricao ]), 'etnias_indigenas' => EtniaIndigena::orderBy('descricao')->get()->map(fn ($etnia) => [ 'id' => $etnia->id, 'descricao' => $etnia->descricao ]), 'tipos_sanguineo' => TipoSanguineo::orderBy('descricao')->get()->map(fn ($tipo) => [ 'id' => $tipo->id, 'descricao' => $tipo->descricao ]), 'deficiencias' => Deficiencia::orderBy('descricao')->get()->map(fn ($deficiencia) => [ 'id' => $deficiencia->id, 'descricao' => $deficiencia->descricao ]), 'mobilidades_reduzidas' => MobilidadeReduzida::orderBy('descricao')->get()->map(fn ($mobilidade) => [ 'id' => $mobilidade->id, 'descricao' => $mobilidade->descricao ]), 'locais_nascimento' => LocalNascimento::orderBy('descricao')->get()->map(fn ($local) => [ 'id' => $local->id, 'descricao' => $local->descricao ]), 'paises' => Pais::orderBy('nome')->get()->map(fn ($pais) => [ 'id' => $pais->id, 'nome' => $pais->nome ]), 'nacionalidades' => Nacionalidade::orderBy('descricao')->get()->map(fn ($nacionalidade) => [ 'id' => $nacionalidade->id, 'descricao' => $nacionalidade->descricao ]), 'escolaridades' => Escolaridade::orderBy('descricao')->get()->map(fn ($escolaridade) => [ 'id' => $escolaridade->id, 'descricao' => $escolaridade->descricao ]), ], 'endereco' => [ 'cep' => ($cidadao->domicilio ?? null) ? MaskUtil::getCepMasked($cidadao->domicilio->endereco->logradouro->cep) : '', 'sem_numero' => $cidadao->domicilio->endereco->sem_numero ?? false, 'zonas' => Zona::orderBy('descricao')->get()->map(fn ($zona) => [ 'id' => $zona->id, 'descricao' => $zona->descricao ]), ], 'documentos' => [ 'estados' => Estado::orderBy('nome')->get()->map(fn ($estado) => [ 'id' => $estado->id, 'uf' => $estado->uf ]), 'carteira_nacional_habilitacao' => [ 'categorias' => CarteiraHabilitacaoCategoria::orderBy('letra')->get()->map(fn ($categoria) => [ 'id' => $categoria->id, 'letra' => $categoria->letra ]), ], 'certidao' => [ 'tipos' => CertidaoTipo::orderBy('descricao')->get()->map(fn ($tipo) => [ 'id' => $tipo->id, 'descricao' => $tipo->descricao ]), 'modelos' => CertidaoModelo::orderBy('id')->get()->map(fn ($tipo) => [ 'id' => $tipo->id, 'nome' => $tipo->nome ]), 'estado_id' => $cidadao->certidao->municipio->estado_id ?? null, ], ], 'questionario_saude' => [ 'alergia_tipos' => AlergiaTipo::orderBy('descricao')->get()->map(fn ($tipo) => [ 'id' => $tipo->id, 'descricao' => $tipo->descricao, ]), 'alergia_criticidades' => AlergiaCriticidade::orderBy('nome')->get()->map(fn ($criticidade) => [ 'id' => $criticidade->id, 'nome' => $criticidade->nome, ]), 'fatores_risco' => FatorRisco::orderBy('id')->where('id', '<>', FatorRiscoEnum::GESTANTE)->get()->map(fn ($fatorRisco) => [ 'id' => $fatorRisco->id, 'nome' => $fatorRisco->nome, ]), 'fatores_risco_gestante' => FatorRisco::orderBy('nome')->get()->map(fn ($fatorRisco) => [ 'id' => $fatorRisco->id, 'nome' => $fatorRisco->nome, ]), ], 'acompanhamento_infantil' => AcompanhamentoInfantil::orderBy('descricao')->get(), 'curso' => Curso::orderBy('descricao')->get(), 'mercado_trabalho' => SituacaoMercadoTrabalho::orderBy('descricao')->get(), 'deficiencia' => DeficienciaBase::orderBy('descricao')->get()->each(function ($item) { $item->descricao = ucfirst(strtolower($item->descricao)); }), ]; } public static function save(array $params): Cidadao { self::prepareData($params); if (!empty($params['id']) && strtolower($params['origem']) == 'paciente' && self::hasException($params)) { throw new AlteracaoEnderecoNaoPermitidaException(); } $params['domicilio_id'] = ($params['domicilio']['endereco']['logradouro_id'] ?? null) ? DomicilioService::save($params['domicilio'])->id : null; $cidadao = Cidadao::updateOrCreate( ['id' => $params['id']], $params, ); $cidadao->conveniosMedico()->sync($params['convenios_medicos']); $cidadao->fatoresRisco()->sync($params['fatores_risco']); $cidadao->alergias()->sync($params['alergias']); $cidadao->medicamentosUsoContinuo()->sync($params['medicamentos_uso_continuo']); self::deleteTelefonesNotPresent($cidadao, $params['telefones']); self::saveTelefones($cidadao, $params['telefones']); self::saveDocumentos($cidadao, $params['documentos']); return $cidadao->fresh(); } private static function hasException($params) { if (!self::hasPermission($params['lotacao_id'] ?? null)) { $cidadao = Cidadao::where('id', $params['id'])->first(); if (!$cidadao->domicilio && $params['domicilio']['endereco']['logradouro_id']) { return true; } $endereco = $cidadao->domicilio->endereco; $paramsEndereco = $params['domicilio']['endereco']; $fields = [ 'logradouro_id', 'latitude', 'complemento', 'longitude', 'loteamento_id', 'numero', 'referencia', 'zona_id' ]; foreach ($fields as $field) { if ($endereco->$field !== $paramsEndereco[$field]) { return true; } } } return false; } public static function hasPermission($idLotacao = null) { $lotacao = Lotacao::findOrFail($idLotacao ?? auth()->payload()->get('lotacao_id')); $count = ParametrizacaoPermissaoOcupacao::count(); return ParametrizacaoPermissaoOcupacao::where('ocupacao_id', $lotacao->ocupacao_id)->exists() || $count === 0; } private static function prepareData(&$params) { $params['id'] = $params['id'] ?? null; $params['origem'] = $params['origem'] ?? null; $params['telefones'] = $params['telefones'] ?? []; $params['convenios_medicos'] = $params['convenios_medicos'] ?? []; $params['fatores_risco'] = $params['fatores_risco'] ?? []; $params['domicilio'] = ['endereco' => $params['domicilio']['endereco'] ?? []]; $params['documentos'] = $params['documentos'] ?? []; if (!$params['cpf_nao_pertence_ao_cidadao']) { $params['motivo_duplicidade_cpf_id'] = null; } if (!isset($params['domicilio']['endereco']['logradouro_id'])) { $params['data_entrada_domicilio'] = null; } if ($params['pais_nascimento_id'] === LocalizacaoPais::BRASIL) { $params['documentos']['estrangeiro_entrada_brasil']['rne'] = null; } if (!in_array(FatorRiscoEnum::OUTRO, $params['fatores_risco'])) { $params['fator_risco_outro'] = null; } $alergias = []; foreach (($params['alergias'] ?? []) as $alergia) { $alergias[$alergia['alergia_id']] = [ 'criticidade_id' => $alergia['criticidade_id'], 'reacoes_observacoes' => $alergia['reacoes_observacoes'] ?? null, 'cid_id' => $alergia['cid_id'] ?? null, ]; } $params['alergias'] = $alergias; $medicamentos = []; foreach (($params['medicamentos_uso_continuo'] ?? []) as $medicamento) { $medicamentos[] = $medicamento['medicamento_id']; } $params['medicamentos_uso_continuo'] = $medicamentos; array_walk_recursive($params, function (&$item) { if (is_string($item)) { $item = mb_strtoupper($item); } }); unset($item); } public static function deleteTelefonesNotPresent($cidadao, $telefones) { $ids = collect($telefones)->pluck('id')->filter(fn ($id) => !is_null($id))->toArray(); CidadaoTelefone::destroy($cidadao->telefones()->whereNotIn('id', $ids)->pluck('id')); } public static function saveTelefones($cidadao, $telefones) { foreach ($telefones as $telefone) { $cidadao->telefones()->updateOrCreate( ['id' => $telefone['id'] ?? null], $telefone ); } } private static function saveDocumentos($cidadao, $documentos) { if (is_null($documentos['carteira_identidade']['numero'] ?? null)) { if ($cidadao->carteiraIdentidade) { $cidadao->carteiraIdentidade()->delete(); } } else { $cidadao->carteiraIdentidade()->updateOrCreate( ['id' => $documentos['carteira_identidade']['id'] ?? null], $documentos['carteira_identidade'], ); } if (is_null($documentos['carteira_nacional_habilitacao']['numero'] ?? null)) { if ($cidadao->carteiraHabilitacao) { $cidadao->carteiraHabilitacao()->delete(); } } else { $cidadao->carteiraHabilitacao()->updateOrCreate( ['id' => $documentos['carteira_nacional_habilitacao']['id'] ?? null], $documentos['carteira_nacional_habilitacao'], ); } if (is_null($documentos['carteira_trabalho']['numero'] ?? null) && is_null($documentos['carteira_trabalho']['nis_pis_pasep'] ?? null)) { if ($cidadao->carteiraTrabalho) { $cidadao->carteiraTrabalho()->delete(); } } else { $cidadao->carteiraTrabalho()->updateOrCreate( ['id' => $documentos['carteira_trabalho']['id'] ?? null], $documentos['carteira_trabalho'], ); } if (is_null($documentos['estrangeiro_entrada_brasil']['rne'] ?? null)) { if ($cidadao->estrangeiroEntradaBrasil) { $cidadao->estrangeiroEntradaBrasil()->delete(); } } else { $cidadao->estrangeiroEntradaBrasil()->updateOrCreate( ['id' => $documentos['estrangeiro_entrada_brasil']['id'] ?? null], $documentos['estrangeiro_entrada_brasil'], ); } if (is_null($documentos['titulo_eleitor']['numero'] ?? null)) { if ($cidadao->tituloEleitor) { $cidadao->tituloEleitor()->delete(); } } else { $cidadao->tituloEleitor()->updateOrCreate( ['id' => $documentos['titulo_eleitor']['id'] ?? null], [ 'numero' => Str::padLeft($documentos['titulo_eleitor']['numero'], 13, '0'), 'zona' => Str::padLeft($documentos['titulo_eleitor']['zona'], 3, '0'), 'secao' => Str::padLeft($documentos['titulo_eleitor']['secao'], 4, '0'), ], ); } if (is_null($documentos['certidao']['numero'] ?? null)) { if ($cidadao->certidao) { $cidadao->certidao()->delete(); } } else { $cidadao->certidao()->updateOrCreate( ['id' => $documentos['certidao']['id'] ?? null], $documentos['certidao'], ); } } }