Ir para o conteúdo principal

Impactos na migração dos atos do sistema CECAANE para o formato de ocorrências no sistema E-estado

Data de elaboração

26/01/22

Responsável pelo estudo

Alexandre Freire (Assessor)

Equipe do estudo Caveiras
Alvo CECAANE e E-Estado
Origem

Verificar os possíveis impactos na migração dos atos do CECAANE para o E-Estado

Objetivo Realizar um estudo técnico sobre os problemas que podem ocorrer na migração dos atos como ocorrências no e-estado.
Observações serão listados de forma detalhada as situações que necessitam de atenção. Um ponto que chama muita atenção, e que também causa grande impacto em termos de inconsistência de dados é que quando o funcionário possui o vínculo funcional “sem vínculo” o Cecaane não solicita cadastro de matrícula, logo no banco a matrícula de alguns os funcionários sem vínculo estão setados como 1000, mesmo estes possuindo matrícula válida ativa no E-estado.


1. INTRODUÇÃO

Atualmente o Sistema de Nomeação e Exoneração (SISNE) está chegando em sua fase final de desenvolvimento. No entanto, a nova plataforma SISNE não irá se comunicar com o atual sistema que realiza a mesma função (Cecaane). 

O principal motivo por trás da decisão de não haver comunicação direta entre SISNE e Cecaane é a alta complexidade de manter uma comunicação que garanta consistência nas informações apresentadas, outro fator importante também é a previsão de alta complexidade em futuras manutenções no SISNE, caso existisse uma comunicação direta com Cecaane.

Portanto dado esta situação foi definido pela equipe envolvida que atos do Cecaane iriam ser migrados para a plataforma E-estado/RH, a qual o SISNE possui uma comunicação ativa e consistente. Essa decisão decorreu através de um estudo técnico realizado previamente o qual abordou diversos pontos importantes e definiu essa como sendo a melhor opção. Clique aqui para ver mais detalhes sobre o Estudo técnico “Migração de dados do Cecaane para o SISNE”.

O E-estado entre suas diversas funcionalidades possui uma funcionalidade em especifica que registra ocorrências relacionadas aos servidores públicos, suportando inclusive a ocorrência que identifica uma nomeação ou exoneração. Entretanto deve ser levado em consideração que são sistemas distintos, apesar de possuírem funcionalidade em comum.

Sendo assim foi realizado um estudo técnico visando definir uma estratégia para tratar e manter a consistência das informações no processo de migração. Clique aqui para ver mais detalhes sobre o Estudo Técnico - “Estratégia para migração de dados do CECAANE para o E-estado”.

Após o término do estudo foi definido como seria tratado as informações do Cecaane para se encaixar como uma ocorrência no E-estado. Todavia, logo após iniciar um processo migração contendo algumas amostras de teste, surgiram situações relacionadas a matrículas dos servidores que não haviam sido detectadas anteriormente. 

Atualmente quando o servidor muda de matrícula essa mudança geralmente não é refletida no Cecaane, sendo esse um fator que pode gerar inconsistência quanto ao vínculo dos registros dos servidores em suas reais matrículas ativas durante o processo de migração.

Portanto o objetivo desse estudo é explanar de forma detalhada essa situação, além de identificar novas possibilidades que possam vir a ocorrer durante o processo de migração, e mostrar quais serão os impactos causados. 

2. DESENVOLVIMENTO

Abaixo está o script resumido da migração, os tópicos importantes estão destacados para fácil compreensão.

public async Task Executar()
{
    // busca os funcionários do Cecaane 
    var funcionariosDecaane = await persistenciaDaDecaane.BuscarFuncionarios();

    foreach (var funcionarioDecaane in funcionariosDecaane)
    {
        var cpfServidor = funcionarioDecaane.Cpf;
        var servidorMatriculas = await servidorApiClient.ObterServidoresCpf(cpfServidor);

        // filtrar matrículas ativas
        var servidorMatriculasAtivas = ObterMatriculasAtivas(servidorMatriculas.Servidores);
        var possuiDecretoVinculadoEmAlgumaMatriculaNoDecaane = false;

        // varrer matrículas e localizar os últimos decretos
        foreach (var servidor in servidorMatriculasAtivas)
        {
            var ultimoDecreto = await persistenciaDaDecaane.BuscarUltimoDecretoPublicado(cpfServidor, servidor.Matricula);

            if (ultimoDecreto != null)
            {
                possuiDecretoVinculadoEmAlgumaMatriculaNoDecaane = true;
                var decreto = await persistenciaDaDecaane.BuscarDecretoPublicadoPorId(ultimoDecreto.DecretoId);
                var decretoExisteNoEestado = await DecretoJaExisteNoEestado(servidor.Matricula, decreto);
              
              //se não existir no E-estado sera enviado nesse momento
                if (!decretoExisteNoEestado)
                    await CriarOcorrenciaNoEestado(decreto);
                }
            }

            //caso não existir matricula vinculada a algum decreto no Cecaane será realizado uma tentativa de buscar por CPF/matricula = 1000 
            if (!possuiDecretoVinculadoEmAlgumaMatriculaNoDecaane)
            {
                var ultimoDecretoMatricula1000 = await persistenciaDaDecaane.BuscarUltimoDecretoPublicado(cpfServidor, "1000");
                var matriculaAtiva = servidorMatriculasAtivas.FirstOrDefault();
               
              	if (ultimoDecretoMatricula1000 != null && matriculaAtiva != null)
                {
                    var decreto = await persistenciaDaDecaane.BuscarDecretoPublicadoPorId(ultimoDecretoMatricula1000.DecretoId);
                    decreto.Matricula = matriculaAtiva.Matricula;
                    var decretoExisteNoEestado = await DecretoJaExisteNoEestado(matriculaAtiva.Matricula, decreto);

                    if (!decretoExisteNoEestado)
                        await CriarOcorrenciaNoEestado(decreto);
                }
            }
        }
    }
}

Trecho de código que realiza conversão de dados do Cecaane para E-estado

var tipoOcorrenciaEestado = ConverterTipoOcorrenciaDecaaneParaEestado(decretoDecaane.TipoDoAto);
var dataDoDecretoDecaane = decretoDecaane?.DataDoDecreto.ToString("yyyy-MM-dd");
var dataDoEfeitoDoAtoDecaane = decretoDecaane?.DataEfeitoDoAto.ToString("yyyy-MM-dd");

// Caso não estiver preenchido é passado um valor vazio conforme definido pela equipe

var dataFimAtoDecaane = decretoDecaane.DataFimDoAto.HasValue ? decretoDecaane?.DataFimDoAto.Value.ToString("yyyy-MM-dd") : null;

 // Preparando uma ocorrencia para o E-estado;

var novaOcorrenciaEestado = new CriarOcorrenciaDto();

novaOcorrenciaEestado.TipoOcorrenciaId = tipoOcorrenciaEestado;
novaOcorrenciaEestado.DataAto = dataDoDecretoDecaane;
novaOcorrenciaEestado.Diario = decretoDecaane?.Diario;
novaOcorrenciaEestado.DataDePublicacaoDiario = decretoDecaane?.DataDePublicacaoDiario.ToString("yyyy-MM-dd");

 // Analisa campos que são obrigatórios

if (VerificarSeOcorrenciaRequerDataInicial(tipoOcorrenciaEestado))
   
novaOcorrenciaEestado.DataInicial = dataDoEfeitoDoAtoDecaane;

if (VerificarSeOcorrenciaRequerDataFinal(tipoOcorrenciaEestado))
   
novaOcorrenciaEestado.DataFinal = dataFimAtoDecaane; 
novaOcorrenciaEestado.TipoAtoId = (int) TiposAtoEstado.Decreto; // Tipo de ato é por padrão Decreto
novaOcorrenciaEestado.NumeroAto = decretoDecaane.NumeroDecreto.ToString();
novaOcorrenciaEestado.Observacao = $"MIGRADO DO DECAANE: DECRETO Nº...

Estes são os principais pontos, agora falando em termos de código o script já está  maior do que o previsto, principalmente devido às constantes exceções que estão surgindo e sendo implementadas, além disso novas regras virão a partir de problemas encontrados e descritos aqui neste documento.

Por este motivo, logo após o término do fluxo de migração e o tratamento de suas exceções, será necessário realizar uma nova refatoração, a fim de otimizar e criar tratamentos em possíveis falhas na comunicação com serviços externos, por exemplo. 

IMPACTOS DA MIGRAÇÃO

Aqui serão listados de forma detalhada as situações que necessitam de atenção. Um ponto que chama muita atenção, e que também causa grande impacto em termos de inconsistência de dados é que quando o funcionário possui o vínculo funcional “sem vínculo” o Cecaane não solicita cadastro de matrícula, logo no banco a matrícula de alguns os funcionários sem vínculo estão setados como 1000, mesmo estes possuindo matrícula válida ativa no E-estado.

Provavelmente essa situação de não solicitar matrícula está definindo valor 1000. Um claro exemplo dessa incoerência de informações é quando o servidor já possui outros decretos anteriormente publicados, antes de terem sua matrícula definida com o valor 1000. Isso decorre pelo seguinte fato descrito neste exemplo: 

O servidor possui matrícula número 1, 2, 3 e 4 no E-estado. A matrícula ativa atualmente é a 4. Porém no Cecaane sua matrícula é 1000, no entanto o parâmetro utilizado na migração é CPF/MATRICULA, logo se aplicarmos essa regra não haverá resultados encontrados no Cecaane. Sendo assim foi definido a seguinte regra, pesquisar por CPF/MATRICULA = 1000, em seguida pegar o registro e mandar para a atual matrícula ativa no E-estado. 

Porém neste cenário não existe garantia de que esse registro pertence realmente a atual matrícula ativa, gerando inconsistência das duas formas, pois na primeira tentativa não será localizado registros e na segunda existirá grandes chances de ser um dado incoerente, pois o decreto importado pode muito bem pertencer a matrícula 3 por exemplo, porém o mesmo foi enviado para a 4.

Logo abaixo temos um exemplo real que reflete essa situação descrita anteriormente.

CASO 1

O servidor possui um total de 3 matrículas no E-estado, será anexado prints reais exibindo como está acontecendo o fluxo no script de migração e as informações que chegam.

  • Matrículas retornadas do E-estado referentes ao servidor André:

  • Matrícula ativa do E-estado. O script entende matricula ativa como sendo aquela que possui DataDeDesligamento vazio não preenchido:

  • Esse próximo trecho de código em anexo é acionado em situações onde existe matrícula ativa no E-estado, porém não foram encontrados decretos no Cecaane vinculados a mesma:

Nessas situações o script vai pesquisar por matrículas com o valor 1000 vinculadas ao CPF. Nesse exemplo foi encontrado um decreto, o mesmo foi tratado e será enviado pelo script para o E-estado da seguinte forma:

{
  "data_inicial": "2021-05-07",
  "data_final": null,
  "data_ato": "2021-05-27",
  "numero_ato": "73162",
  "observacao": "MIGRADO DO DECAANE: DECRETO Nº 73162/2021; CARGO: Assessor Técnico de Projetos Especiais de Tecnologia da Informação e Comunicação; CDS: CDS-09 (R$ 4.782,53); SECRETARIA: SETIC",
  "tipo_ocorrencia_id": 218,
  "tipo_ato_id": 3,
  "diofdata_ocorrencia": "2021-06-01",
  "diof_ocorrencia": "111"
}

Matricula Servidor: 300172236
CPF Servidor: 983XXXXXXXX
Ocorrencia: 73162

Novamente neste cenário não existe garantia de que esse registro pertence realmente à atual matrícula ativa além da grande chance de ser um dado incoerente, pois o decreto importado pode muito bem pertencer a uma matrícula que não necessariamente seja a ativa.

CASO 2

O Servidor CPF 113XXXXXXXX possui um decreto no Decaane, no entanto esse decreto está vinculado a uma matrícula inativa no E-estado, sendo assim ignorado pelo script de migração. 

A matrícula atual é 300147555. E o decreto 71764/2021 está vinculado à matrícula 300033703. 


  • Matrículas retornadas do E-estado:

  • Matrícula ativa do E-estado

Em resumo, quando o funcionário possui o vínculo funcional “sem vínculo” o Cecaane não solicita cadastro de matrícula, porém no banco a matrícula de alguns os funcionários sem vínculo estão como 1000. MARIA DE LOURDES possui matrícula no Cecaane é a efetiva, seu último decreto é da SETIC que possui matrícula diferente no E-estado.

CASO 3

O registro válido é de nomeação, porém foi migrado o de exoneração, atualmente a ordenação é via data efeito ato, no entanto os registros possuem as mesmas datas. Uma possível solução seria adicionar outra condição no ordenamento pela data do decreto, no entanto ainda pode ocorrer de existir datas parecidas.

CASO 4

Servidor cadastrado no Cecaane como não efetivo, ou seja, no Cecaane o mesmo não possui matrícula cadastrada. Existem casos também de servidor com várias movimentações(matrícula) no E-estado e uma ativa.

Exemplo: CPF 526xxxxxxxx;

700000254 (externo)
300150409 (Estatutário em Comissão)
300138962 (Estatutário Efetivo)
300167316 (Estatutário efetivo – não tem data de rescisão)

CONSIDERAÇÕES FINAIS

As informações relatadas têm como principal intuito mostrar os problemas atuais e encontrar soluções para solucionar os mesmos. Dessa forma mantendo todos cientes e garantindo a maior integridade possível dos dados migrados. 

Atualmente são 67.395 o número total de funcionários e 215.030 o total de decretos publicados, com base em uma pequena amostra foram detectados as situações descritas. 

Alguns ajustes foram realizados no E-estado também, a fim de comportar novos dados e permitir valores vazios em alguns campos, já que alguns decretos do Cecaane possuem campos em branco, por essa situação já ter sido resolvida não foi detalhado nos casos mencionados anteriormente.

Portanto após essas questões relatadas terem suas soluções desenvolvidas, será realizado uma nova simulação de migração a fim de encontrar novas situações que possam vir a gerar inconsistência, e caso tudo estiver correto será realizado a migração real de todas as informações.


GLOSSÁRIO
  1. Product Owner: O Product Owner representa os interesses de todos os envolvidos, define as funcionalidades do produto e prioriza os itens de Product Backlog. Fonte: (https://www.trt9.jus.br/pds/Scrum/roles/product_owner_10E7BD3.html).

  1. Product Backlog: É uma lista priorizada, contendo breves descrições de todas as funcionalidades desejadas para o produto. Fonte: (https://www.culturaagil.com.br/product-backlog-o-que-e/).

  1. Scrum Master: O Scrum Master é o membro do time que detém, em geral, maior conhecimento sobre o Scrum (“framework que ajuda as equipes a trabalharem juntas”). Logo, ele é responsável por potencializar o trabalho da equipe. Fonte: (https://www.voitto.com.br/blog/artigo/scrum-master) (https://www.atlassian.com/agile/scrum).

  1. Framework: Estrutura é feita para resolver um problema específico. Fonte: (https://www.lewagon.com/pt-BR/blog/o-que-e-framework).

  2. Script: É um texto com uma série de instruções escritas para serem seguidas, ou por pessoas em peças teatrais ou programas televisivos, ou executadas por um programa de computador. Fonte: (https://www.significados.com.br/script/).