| Data de elaboração | 25/11/2024 |
| Responsável pelo estudo | Rodrigo Stefano Sales Nascimento (Assessor) |
| Equipe do estudo | TROPA DE ELITE |
| Alvo | Sistema Governa |
| Origem | Realizar um levantamento de onde no sistema Governa utiliza as informações da tabela de CBO |
| Objetivo | Identificar no sistema Governa onde CBO é utilizado |
O objetivo deste estudo é identificar todos os pontos no sistema Governa onde a tabela de CBO (Classificação Brasileira de Ocupações) é utilizada. Essa análise é necessária porque foi constatado que a tabela possui registros duplicados, o que pode causar inconsistências no sistema. O levantamento permitirá mapear as referências no código que utilizam o ID do CBO ou outros dados da tabela, para que possamos:
No sistema Governa, a tabela CBO armazena informações relacionadas à Classificação Brasileira de Ocupações. Ocorre que, o cliente revelou que existem registros duplicados, apresentando o mesmo código ou descrição, o que pode causar:
Para identificar duplicidades e entender como a tabela CBO é utilizada no sistema, foram realizadas consultas específicas no banco de dados Governa. As buscas foram divididas em três etapas: duplicidade no código CBO, duplicidade na descrição, e identificação de tabelas que fazem referência à tabela CBO.
A duplicidade no campo cbo foi verificada utilizando a consulta abaixo. A lógica considera valores normalizados (removendo espaços em excesso e ignorando diferenças entre maiúsculas e minúsculas):
SELECT
UPPER(LTRIM(RTRIM(cbo))) AS cbo_repetido,
COUNT(*) AS quantidade
FROM
[Governa].rh.cbo
GROUP BY
UPPER(LTRIM(RTRIM(cbo)))
HAVING
COUNT(*) > 1
ORDER BY
quantidade DESC, cbo_repetido;
Resultado:
cbo conforme observa-se no print abaixo:
Para verificar duplicidade no campo descricao, foi utilizada a seguinte consulta:
SELECT
UPPER(LTRIM(RTRIM(descricao))) AS descricao_normalizada,
COUNT(*) AS quantidade
FROM
[Governa].rh.cbo
GROUP BY
UPPER(LTRIM(RTRIM(descricao)))
HAVING
COUNT(*) > 1
ORDER BY
quantidade DESC, descricao_normalizada;
Resultado:
descricao conforme observa-se no print abaixo:
Para identificar todas as tabelas no banco de dados Governa que fazem referência à tabela CBO (via chaves estrangeiras), a consulta abaixo foi utilizada:
SELECT
fk.name AS foreign_key_name,
tp.name AS tabela_referenciada,
cp.name AS coluna_referenciada,
tr.name AS tabela_que_referencia,
cr.name AS coluna_que_referencia
FROM
[Governa].sys.foreign_keys AS fk
INNER JOIN
[Governa].sys.foreign_key_columns AS fkc ON fk.object_id = fkc.constraint_object_id
INNER JOIN
[Governa].sys.tables AS tp ON fkc.referenced_object_id = tp.object_id
INNER JOIN
[Governa].sys.columns AS cp ON fkc.referenced_object_id = cp.object_id AND fkc.referenced_column_id = cp.column_id
INNER JOIN
[Governa].sys.tables AS tr ON fkc.parent_object_id = tr.object_id
INNER JOIN
[Governa].sys.columns AS cr ON fkc.parent_object_id = cr.object_id AND fkc.parent_column_id = cr.column_id
WHERE
tp.name = 'cbo' AND SCHEMA_NAME(tp.schema_id) = 'rh'
ORDER BY
tabela_que_referencia, coluna_que_referencia;
Resultado:
cargo_mensal utiliza registros da tabela cbo por meio da coluna id_cbo conforme observa-se no print abaixo:
Para identificar todas as classes que utilizam a tabela CBO no sistema Governa, foi adotada uma abordagem sistemática para análise do código-fonte. O objetivo é mapear os pontos de acesso à entidade Cbo, garantindo que todas as dependências sejam identificadas para avaliação de impactos.
Busca por Referências Diretas:
Cbo (nome da entidade) e cbo (caso de consultas SQL ou referências específicas no código).Análise de Classes Envolvidas:
Abaixo, estão as classes identificadas durante o estudo, que possuem relação com CBO:
manterContribuinteIndividual.xhtml
src/main/webapp/usuario/cadastro/manterContribuinteIndividual.xhtml.cargoMensalMB.listaCbo, que busca os registros da tabela CBO.p:selectOneMenu):
cargoMensalMB.listaCbo.cbo) e a descrição do CBO (descricao).gov:botaoIconeAtualizar):
cargoMensalMB.carregarListaCbo() para recarregar dinamicamente a lista de CBOs na interface.gov:botaoIconeLink):
CargoMensalMB
src/main/java/br/com/governa/rh/comum/negocio/managedbean/CargoMensalMB.java.carregarListaCbo(), responsável por buscar todos os registros da tabela CBO através de cboBO.buscarTodos() e armazená-los na lista listaCbo.initialize() após a inicialização do bean.cboBO: Classe que implementa a lógica do método buscarTodos() para recuperar registros de CBO.CargoMensalBO
Caminho: src/main/java/br/com/governa/rh/negocio/bo/CargoMensalBO.java.
Uso: Implementa a lógica de negócios para a entidade CargoMensal, incluindo validações, salvamento, exclusão e consultas de registros relacionados.
Referência à Tabela CBO:
Métodos Relevantes:
salvar(CargoMensal cargoMensal):
cargoMensal.getCbo() é nulo ou inválido.validarCamposObrigatorios(CargoMensal cargoMensal):
Impacto no Estudo:
ICboBO
src/main/java/br/com/governa/rh/comum/negocio/interfaces/ICboBO.java.buscarTodos(): Recupera todos os registros da tabela CBO.salvar(Cbo cbo): Persiste novos registros na tabela.excluir(Cbo cbo): Exclui um registro, considerando as regras de integridade.CboBO
src/main/java/br/com/governa/rh/negocio/bo/CboBO.java.ICboBO e fornece a lógica de negócio para manipulação da tabela CBObuscarTodos(): Utiliza o repositório cboPersist para buscar todos os registros ordenados por descrição.salvar(Cbo cbo): Verifica duplicidade antes de salvar um registro. Contém validação para não permitir duplicidade no campo cbo.excluir(Cbo cbo): Exclui um registro, garantindo integridade de dados.buscar(long id): Busca um registro específico por ID.buscarTodos(Cbo cbo): Realiza uma busca com filtros, utilizando descrição e código.cboPersist: Repositório responsável por realizar operações diretas com o banco de dados para a tabela CBO.ICboRepositorio
src/main/java/br/com/governa/rh/comum/negocio/interfaces/ICboBO.java.buscarTodos(): Recupera todos os registros da tabela CBO.salvar(Cbo cbo): Persiste novos registros na tabela.excluir(Cbo cbo): Exclui um registro, considerando as regras de integridade.ICboRepositorio
src/main/java/br/com/governa/rh/persistencia/repositorio/ICboRepositorio.java.findByCbo(String cbo): Busca registros com o valor exato de cbo (ignora maiúsculas e minúsculas) e os ordena pelo campo cbo.findAllOrderByDescricao(): Retorna todos os registros ordenados pelo campo descricao.findByDescricaoLikeAndCboOrderByDescricao(String descricao, String cbo): Realiza buscas filtradas por descricao e cbo usando LIKE, ordenando os resultados pela descrição.findUltimoCodigo(): Obtém o maior valor de id na tabela CBO.CboBuilder
src/main/java/br/com/governa/rh/teste/builder/CboBuilder.java.Cbo, provavelmente em cenários de teste ou construção dinâmica de objetos.construir():
Cbo com valores gerados dinamicamente:
descricao): "Descricao CBO " + time (timestamp atual concatenado).cbo): "Cod " + substring do timestamp.CboMB
Caminho: src/main/java/br/com/governa/rh/web/managedbean/CboMB.java.
Uso: Gerencia a interação com a tabela CBO na interface do sistema, permitindo a criação, edição, visualização, pesquisa e exclusão de registros relacionados ao CBO.
Métodos Relevantes:
carregarListaCbo():
cboFiltro usando o método cboBO.buscarTodos(Cbo cbo).abrirVisualizar(Cbo cbo):
abrirNovo():
abrirEditar(Cbo cbo):
cboBO.buscar(id).salvar():
cboBO.salvar(cbo), tratando exceções de duplicidade, permissões ou campos obrigatórios ausentes.excluir():
cboBO.excluir(cbo), tratando exceções de integridade de dados e permissões.Dependências:
ICboBO: Interface que define os contratos para as operações de manipulação de registros da tabela CBO.listaCbo: Armazena a lista de CBOs carregados para exibição ou manipulação.cboFiltro: Objeto usado para definir os critérios de pesquisa de CBOs.Impacto no Estudo:
ISefipViewRepositorio
Caminho: src/main/java/br/com/governa/rh/persistencia/repositorio/ISefipViewRepositorio.java.
Uso: Repositório para acessar os registros da visão SefipView, incluindo informações detalhadas de funcionários e dados relacionados.
Referência à Tabela CBO:
buscarRegistrosSefipView inclui o campo sefip.cbo na seleção dos dados. Este campo é utilizado para obter o código CBO associado a um funcionário, permitindo que ele seja exibido ou processado em relatórios.Método Relevante:
buscarRegistrosSefipView(...):
mesReferencia, empresaId, idAdministracao, e listas de classificação e vínculos.Impacto no Estudo:
RaisVisaoBuilder
Caminho: src/main/java/br/com/governa/rh/teste/visao/builder/RaisVisaoBuilder.java.
Uso: Classe utilitária para construção de objetos da visão RaisVisao, provavelmente usada em testes ou geração de dados fictícios para validação.
Referência à Tabela CBO:
O campo CBO é atribuído como parte da construção de objetos da entidade RaisServidorDetalheVisao.
Código do trecho relevante:
servidor.setCbo(("" + new Random().nextInt()).replace(".", ""));
cbo, simulando dados fictícios.Métodos Relevantes:
construir():
RaisVisao com cabeçalhos, servidores, e rodapés. No corpo do método, a lista de servidores é preenchida com objetos de RaisServidorDetalheVisao, incluindo valores simulados para o campo cbo.construirLista(int i):
RaisServidorDetalheVisao com valores aleatórios, incluindo para o campo CBO.Impacto no Estudo:
A presença de registros duplicados na tabela CBO afeta diretamente a tabela dependente cargo_mensal, que utiliza a chave estrangeira fk_cargo_mensal_cbo para referenciar o campo id da tabela CBO.
Confusão nas Listagens:
descricao podem gerar opções redundantes em interfaces como menus de seleção ou relatórios, dificultando a escolha correta do registro.Problemas em Tabelas Dependentes:
Registros duplicados em CBO podem causar ambiguidade na tabela cargo_mensal, já que diferentes registros podem referenciar códigos CBO duplicados.
A exclusão de registros duplicados na tabela CBO exige atualização cuidadosa da tabela cargo_mensal, para evitar referências inválidas.
Correção de Dados:
cargo_mensal é um processo trabalhoso e suscetível a erros.Integridade dos Dados:
Para resolver os problemas de duplicidade na tabela CBO e garantir a consistência dos dados no sistema Governa, propomos as seguintes soluções:
Utilizar as consultas de duplicidade (código CBO, descrição, e combinação) para identificar registros duplicados.
Solicitar ao cliente que escolha qual registro será mantido.
Adição de Restrições de Unicidade no Banco de Dados:
Atualização da Entidade CBO:
Refinamento do Método salvar(Cbo cbo) na Classe CboBO:
| História - O quê | Eu, dev, preciso identificar e corrigir duplicidades nos registros da tabela CBO. |
| Por quê? | Para garantir que os dados da tabela CBO sejam consistentes e para evitar ambiguidades na tabela cargo_mensal. |
| Regras e Validações | * Identificar registros duplicados nos campos cbo e descricao por meio de consultas no banco de dados. * Atualizar as referências na tabela cargo_mensal para apontarem para o registro correto antes de excluir os registros duplicados. |
| História - O quê | Eu, dev, preciso implementar restrições de unicidade para os campos cbo e descricao na tabela CBO no banco de dados. |
| Por quê? | Para garantir que novos registros duplicados não sejam inseridos, mantendo a consistência dos dados. |
| Regras e Validações | * O banco de dados deve rejeitar a inserção ou atualização de registros com valores duplicados nos campos cbo ou descricao. * A restrição deve ser aplicada após a deduplicação dos registros existentes. |
| História - O quê | Eu, dev, preciso garantir que os campos cbo e descricao sejam únicos na entidade Cbo.java. |
| Por quê? | Para alinhar o modelo da aplicação às restrições do banco e reforçar a prevenção de duplicidades. |
| Regras e Validações | * Adicionar restrições de unicidade para os campos cbo e descricao na classe Cbo.java. * As alterações na entidade devem refletir as regras de unicidade já configuradas no banco. |
| História - O quê | Eu, dev, preciso aprimorar o método salvar da classe CboBO para validar duplicidades antes de salvar ou atualizar registros. |
| Por quê? | Para garantir que nenhuma duplicidade seja inserida no banco. |
| Regras e Validações | * O método deve verificar, antes de salvar ou atualizar, se já existem registros com o mesmo valor nos campos cbo ou descricao. * Caso seja identificada uma duplicidade, o sistema deve bloquear a operação e exibir uma mensagem de erro clara. |