Ir para o conteúdo principal

Estudo Técnico sobre a Integração do e-Estado com o Sistema Governa. Aba Informação

Data de elaboração 28/06/2023
Responsável pelo estudo

Ádrian Rabelo Mendes (Assessor)
Diego Gonçalves de Almeida (Assessor)
Jônatas Legal (Assessor)
Rodrigo Stefano Sales Nascimento (Assessor)

Equipe do estudo CAOS

Alvo

Sistema Governa

Origem
  • Objetivo estratégico: Realizar levantamento de integração assíncrona do cadastro de servidor, entre os sistemas e-Estado e Governa.
Objetivo para que seja possível realizar a inserção de informações recebidas pelo e-Estado e integre com o governa, reduzindo o retrabalho e informações desiguais nos sistemas
Glossário

AMQP - Advanced Message Queuing Protocol
RabbitMQ - É um servidor de mensageria de código aberto
Acknowledgment – Confirmação de entrega de mensagem
QoS – Quality of Service

1. Introdução

O presente estudo técnico tem como propósito analisar e apresentar propostas para a integração da tela "Novo Servidor" do e-Estado com a tela "Servidor -> Cadastro de Servidor -> Novo - Aba "Informação" do Governa. No momento, essas duas telas operam de maneira independente, o que requer a inserção repetida de informações e pode resultar em inconsistências nos dados. O objetivo é realizar uma integração eficiente entre as informações dos sistemas, eliminando a redundância e aprimorando a qualidade dos dados registrados no Governa.

O estudo também aborda a utilização do protocolo AMQP em conjunto com o RabbitMQ. O RabbitMQ é um sistema de mensageria de código aberto que implementa o protocolo AMQP, permitindo a troca eficiente de mensagens entre diferentes sistemas e componentes.

2. Desenvolvimento

2.1 Protocolo AMQP

O protocolo AMQP (Advanced Message Queuing Protocol) é um protocolo de mensagens assíncronas, utilizado para comunicação entre sistemas distribuídos. Ele foi desenvolvido para facilitar a troca de mensagens entre aplicativos e serviços de forma eficiente e confiável.

O AMQP foi projetado para ser independente de plataforma, permitindo a comunicação entre diferentes sistemas e linguagens de programação. Ele define um conjunto de regras e formatos para enviar, rotear e receber mensagens, garantindo que elas sejam entregues de maneira ordenada e confiável.

Uma das principais características do AMQP é a utilização de filas de mensagens. As mensagens são publicadas em filas e podem ser consumidas por um ou mais consumidores, de acordo com um modelo de pub/sub (publicação/assinatura). Isso permite que os aplicativos enviem e recebam mensagens de forma assíncrona, desacoplando o produtor da mensagem do consumidor.

Além das filas, o AMQP também define trocas (exchanges) e vinculações (bindings) para rotear as mensagens para as filas corretas. As trocas recebem mensagens dos produtores e as encaminham para as filas com base em regras de roteamento específicas. As vinculações são utilizadas para definir a relação entre as trocas e as filas.

O AMQP suporta diferentes modelos de entrega de mensagens, como confirmação de entrega (acknowledgment), que garante que as mensagens sejam entregues com sucesso, e qualidade de serviço (QoS), que permite definir níveis de prioridade para as mensagens.

O protocolo AMQP é amplamente utilizado em sistemas distribuídos e arquiteturas orientadas a mensagens, como em aplicações de mensageria, Internet das Coisas (IoT), sistemas financeiros e sistemas de notificação em tempo real.

Em resumo, o protocolo AMQP é um protocolo de mensagens assíncronas que facilita a comunicação entre sistemas distribuídos, oferecendo confiabilidade, flexibilidade e escalabilidade. Ele utiliza filas, trocas e vinculações para rotear as mensagens de forma eficiente e suporta diferentes modelos de entrega e qualidade de serviço.

Figura 1: Protocolo AMQP

2.2 RabbitMQ

O RabbitMQ é um software de mensagem assíncrona de código aberto, que implementa o protocolo AMQP (Advanced Message Queuing Protocol). Ele é amplamente utilizado como um intermediário de mensagens entre diferentes sistemas e serviços distribuídos.

O RabbitMQ fornece uma plataforma robusta para a troca de mensagens, permitindo que aplicativos e serviços se comuniquem de maneira eficiente e confiável. Ele utiliza filas de mensagens para armazenar e entregar as mensagens entre os produtores e consumidores, garantindo a entrega ordenada e controlada.

2.3 Telas em questão

image.png

image.png

2.4 Objeto JSON 

O objeto JSON recebido pelo serviço de mensageria RabbitMQ é proveniente de ações realizadas na entidade "Servidor" no sistema e-Estado. Dentre as ações inclui-se: criação, atualização de dados e exclusão.

O objeto JSON contém diversos campos que representam os dados do servidor, como identificação, matrícula, tipo de vínculo, data de admissão, entre outros. Essas informações são cruciais para acompanhar e registrar o histórico dos servidores no sistema. Abaixo pode-se conferir o objeto de retorno do serviço rabbitMQ.

{
    "id": 215349,
    "matricula": 600003369,
    "tipo_vinculo_id": 7,
    "data_admissao": "15/12/2022",
    "concurso_id": null,
    "numero_decreto": null,
    "data_decreto": null,
    "numero_diario_oficial": null,
    "data_diario_oficial": null,
    "data_posse": null,
    "data_efetivo_exercicio": null,
    "cargo_efetivo_id": null,
    "cargo_cds_id": null,
    "funcao_id": null,
    "unidade_vinculo_id": 2,
    "previdencia_id": null,
    "vinculo_original_id": null,
    "estado_id": null,
    "municipio_id": null,
    "poder_id": null,
    "regime_id": null,
    "conta_fgts": null,
    "unidade_pagamento_id": null,
    "conta_pagamento_id": null,
    "padrao_id": null,
    "horas_semanais": null,
    "horas_extras": null,
    "registro_ponto_id": null,
    "pessoa_id": 1758202,
    "plantonista": null,
    "habilidade_cargo_efetivo_id": null,
    "inscricao_concurso": null,
    "nota_final_concurso": null,
    "classificacao_concurso": null,
    "pcd": null,
    "negro": null,
    "processo_judicial": null,
    "ocupa_cargo_publico": null,
    "processo_sei": null,
    "oficio_apresentacao": null,
    "municipio_concurso_lotacao_id": null,
    "data_desligamento": null,
    "siape": null,
    "atividade_privativa_cargo": null,
    "matricula_antiga": null,
    "matricula_nome": "600003369 - Lucas Teste",
    "estado": null,
    "municipio": null,
    "departamento_id": "",
    "cargo_efetivo": null,
    "cargo_cds": null,
    "concurso": null,
    "funcao": null,
    "padrao": null,
    "pessoa": {
      "id": 1758202,
      "nome": "Lucas Teste",
      "data": "2023-06-23T08:34:21.500402"
    },
    "pessoa_fisica": {
      "pessoa_id": 1758202,
      "estado_civil_id": 2,
      "sexo_id": 1,
      "escolaridade_id": null,
      "tipo_sanguineo_id": null,
      "cpf": "22794276050"22******50",
      "data_nascimento": "2003-05-10",
      "falecimento": null,
      "raca": null,
      "pcd": null,
      "tipo_nacionalidade": null,
      "nacionalidade": null,
      "pais": null,
      "estado": null,
      "naturalidade": null,
      "data_entrada": "2003-05-10",
      "pis_pasep": null,
      "email": "sorkazekna@gufum.sor*****@g****.com",
      "doador_de_sangue": null,
      "raca_id": 5,
      "tipo_nacionalidade_id": 2,
      "pais_id": 1,
      "nacionalidade_id": 1,
      "estado_id": 21,
      "naturalidade_id": 5582
    },
    "poder": null,
    "previdencia": null,
    "regime": null,
    "registro_ponto": null,
    "tipo_vinculo": {
      "id": 7,
      "nome": "Estagiário",
      "grupo": null
    },
    "unidade_vinculo": {
      "id": 2,
      "instituicao_id": 1,
      "unidade_id": null,
      "responsavel_id": 1744688,
      "nome": "Superintendência Estadual de Tecnologia da Informação e Comunicação",
      "sigla": "SETIC",
      "gestora": 1,
      "orcamentaria": 1,
      "administrativa": 1,
      "cnpj": "17.900.001/0001-95"*****/******",
      "id_departamento_sinvrea": null,
      "tipo_normatizacao_id": 2,
      "numero_normatizacao": "27.577",
      "staff": null,
      "colegiada": null,
      "codigo_orcamentario": "110007",
      "data_normatizacao": "2022-11-04",
      "extincao_organograma_id": null,
      "endereco_id": 49685,
      "departamento_id": null,
      "orgao_sei_id": 73,
      "unidade_sei_id": null,
      "data_criacao": null
    },
    "unidade_pagamento": null,
    "vinculo_original": null,
    "nome": "Lucas Teste" }


}

2.4 Campos Integrados

Os seguintes campos podem refletir-se em ambos os sistemas:

Tabela Governa Campo Governa e-Estado

Obs

rh.servidor Matrícula matricula matricula  
-- Data de Admissão
admissao
objeto servidor.data_admissao  
-- Data do Efetivo Exercício
data_efetivo_exercicio
objeto servidor.data_efetivo_exercicio  
-- Data de Progressão
data_progressao
não existe campo que possa ser utilizado no objeto de retorno  
-- Tipo de Admissão
tipo_admissao
[Admissão primeiro emprego,
Admissão com emprego anterior,
Transf. com ônus para cedente,
Transf. sem ônus para cedente,
Outros]
não existe campo que possa ser utilizado no objeto de retorno  
-- tempo de serviço Federal
tempo_anterior_federal
 não existe campo que possa ser utilizado no objeto de retorno  
-- tempo de serviço Estadual
tempo_anterior_estadual
 não existe campo que possa ser utilizado no objeto de retorno  
-- tempo de serviço Municipal
tempo_anterior_municipal
 não existe campo que possa ser utilizado no objeto de retorno  
-- tempo de serviço Afastamento
tempo_anterior_afastamento
 não existe campo que possa ser utilizado no objeto de retorno  
rh.servidor_desligamento Data do Desligamento data_desligamento objeto servidor.data_desligamento  
rh.lotacao_mensal Lotação de Contratação
 (id, descricao)
descricao  objeto servidor.municipio_concurso_lotacao_id  
admin.pessoa_fisica Pessoa
(id, nome)
nome objeto servidor.pessoa
campos pessoa.id e pessoa.nome
propriedade nome = Protected - Precisa usar getNome(id) ou setNome(nome)
-- CPF cpf objeto servidor.pessoa_fisica.cpf  
-- RG rg não existe campo que possa ser utilizado no objeto de retorno  
-- data de Nascimento data_nascimento objeto servidor.pessoa_fisica.data_nascimento  
3. Possíveis Soluções

Para os campos que não existem no objeto JSON de retorno do serviço RabbitMQ, a seguinte solução pode ser considerada:

  • Verificar se os campos existem no banco do e-Estado e adicioná-los ao objeto JSON caso existam
4. Conclusão

Neste estudo, analisamos a integração entre os sistemas e-Estado e Governa, focando nos dados da entidade "Servidor" e suas correspondências em ambos os sistemas. Através dessa análise, chegamos a algumas conclusões:

A integração entre os sistemas e-Estado e Governa requer a associação correta dos campos compartilhados entre eles, como matrícula, data de admissão, data do efetivo exercício, data do desligamento, lotação de contratação, nome e CPF.

Alguns campos importantes não possuem correspondência direta nos sistemas, como data de progressão, tipo de admissão e tempos de serviço (federal, estadual, municipal e afastamento). Esses campos requerem uma avaliação mais aprofundada e possíveis soluções, como adição de campos, consultas adicionais a outras fontes confiáveis ou mapeamento de dados existentes.

A existência de campos protegidos, como o nome na entidade "pessoa" em Governa, exige o uso de métodos getters ou setters para acessar os valores desses campos.

A integração bem-sucedida entre os sistemas e-Estado e Governa depende da identificação precisa dos campos relevantes, do alinhamento entre os sistemas e da implementação adequada das soluções necessárias para garantir a sincronização e a consistência dos dados.

5. Referências 

Como Disponibilizar o RabbitMQ para múltiplos consumos:

https://documentos.sistemas.ro.gov.br/books/spikes-estudos-tecnicos/page/como-disponibilizar-o-rabbitmq-para-multiplos-consumos.

 

AMQP - Documentação oficial:

https://www.amqp.org/

 

RabbitMQ - Documentação oficial:

https://www.rabbitmq.com/documentation.html