01. Visão Geral

Este documento visa fornecer uma visão abrangente sobre a estrutura e funcionalidades do Protheus Insights, detalhando tanto a modelagem de dados quanto a infraestrutura backend, front-end, pipelines carol e data models carol. Seu propósito é esclarecer a arquitetura atual e sugerir melhorias para otimizar o processamento de mensagens de insights, aumentar a resiliência do sistema e facilitar o desenvolvimento de novas funcionalidades.


Estrutura e Componentes

A estrutura atual do Protheus Insights é composta por diversas tabelas que gerenciam alertas e insights. Embora funcional, essa estrutura foi inicialmente projetada como um protótipo e apresenta limitações significativas, como falta de visibilidade no recebimento de mensagens e travamentos no processamento. Este documento propõe uma nova estrutura mais eficiente, detalhando as novas tabelas (I19, I20, I21) e suas funções específicas para melhorar o controle, processamento e monitoramento de mensagens de insights. Além disso, descreve as atualizações necessárias no backend TOTVSApps e ADVPL, e sugere melhorias para o front-end, incluindo a implementação de uma nova biblioteca de serviços REST para suportar insights online de maneira mais eficiente.

02. Modelagem de Dados Protheus Insights

Estrutura Atual

A atual estrutura do Protheus Insights é constituída das seguintes tabelas:

Apesar desta estrutura estar funcional, ela foi criada como protótipo e apresenta diversas limitações no controle de recebimento e processamento de mensagens de insight provenientes do Smartlink e será descontinuada com a implementação da estrutura sugerida mais abaixo.

Algumas destas limitações são:

Estrutura Sugerida

Para a nova estrutura sugerida serão implementadas as seguintes tabelas: 


Nesta nova estrutura, existirá a possibilidade de monitorar o recebimento de mensagens e seu conteúdo real através da tabela I19, onde as mensagens serão armazenadas para análise e posterior processamento/re-processamento, liberando assim a thread do consumer do Smartlink para posteriores recebimentos, solicitando baixa quantidade de recurso e tempo de execução para o simples recebimento de mensagens de insights.


CampoTipoTamanhoTítuloDescrição
I19_FILIALCaracter8FilialFilial do Sistema
I19_UIDMSGCaracter36Message UUIDID da Mensagem (UUID)
I19_TIDMSGCaracter36Transact. IDID da Transação da Mensagem
I19_TENANTCaracter36Tenant UUIDID do Rac Tenant
I19_INSIGTCaracter30Tipo InsightTipo de Insight
I19_PAYLODMemoXXPayload MensConteúdo da Mensagem
I19_DTRECVCaracter30Dt. Recebim.Data de Recebimento
I19_STRECVCaracter3Status Rece.Status do Recebimento
I19_DTSCHDCaracter30Dt. Agend.Data do Último Agendamento
I19_DTPROCCaracter30Dt. Process.Data do Último Processamento
I19_STPROCCaracter3Status Proc.Status do Último Processamento
I19_LSTPRVCaracter6Ult. Vers. PÚltima Versão da Configuração de Processamento
I19_LSTPRMMemoXXUlt. Pr. MsgMensagens de Processamento

Com a criação da tabela I20, poderão ser armazenados os tipos de Insights que serão processados pelo cliente Protheus e suas respectivas classes de processamento das Regras de Negócio, as quais deverão ser desenvolvidas em ADVPL/TLPP e adicionadas ao repositório, facilitando assim o desenvolvimento de novos insights. Estas configurações podem ser controladas também por um versionamento, o que facilita o rastreio de alterações no decorrer do tempo para cada tipo de Insight.


CampoTipoTamanhoTítuloDescrição
I20_FILIALCaracter8FilialFilial do sistema
I20_INSIGTCaracter30InsightTipo de Insight
I20_VERSAOCaracter6Versao InsigVersão da Configuração
I20_CLSPRCCaracter254Classe Proc.Classe de Processamento da Regra de Negócio
I20_PRIORILógico1PrioritarioIndica se Insight é Prioritário
I20_HASKEYLógico1Calc. ChaveIndica se Insight Calcula Chave de Busca
I20_HASFILLógico1Calc. FiltroIndica se Insight Calcula Filtro de Pesquisa
I20_STATUSCaracter1Status Conf.Status da Configuração
I20_DTCREACaracter30Dt. CriacaoData de Criação da Configuração
I20_DTALTCaracter30Dt. Altera.Data de Alteração da Configuração
I20_TABLESCaracter254Aliases UtilTabelas para abertura de ambiente, referente a Regra de Negócio (ex. SA1,SB1)

A tabela I21 é uma implementação de tabela unificada de Processamento de Insights, ela poderá ser adotada pelas classes de Regras de Negócio para armazenamento do produto resultante do processamento aplicado a uma mensagem de Insight. Esta tabela suporta o armazenamento de dados diversos formatos através de um campo MEMO (inclusive JSON) e possui campos  facilitadores de busca e filtro bem como campos para data inicial e final (todos usados de forma opcional na utilização da classe de regra de negócio).


CampoTipoTamanhoTítuloDescrição
I21_FILIALCaracter8FilialFilial do Sistema
I21_BRANCHCaracter8Filial InsigCampo de controle de Filiais abrangidas pelo Insight (não controlada pelo sistema)
I21_UIDINSCaracter36Id. InsightID da linha de Insight
I21_UIDMSGCaracter36Id MensagemID da mensagem de origem do Insight (I19)
I21_INSIGTCaracter30InsightTipo de Insight
I21_MODULOCaracter20Modulo InsigModulo do Insight
I21_PAYLODMemoXXPayload Ins.Conteúdo do Insight
I21_KEYCaracter240Chave BuscaCampo de Chave unica de busca a ser gerada pelo processamento da Regra de Negócios referente ao Insight (opcional)
I21_FILTERCaracter240FiltroCampo de Valor de Filtro de busca a ser preenchido pelo processamento da Regra de Negócios referente ao Insight (opcional)
I21_DTDEData8Data DeCampo de Valor de Data Inicial de busca a ser preenchido pelo processamento da Regra de Negócios referente ao Insight (opcional)
I21_DTATEData8Data AteCampo de Valor de Data Final de busca a ser preenchido pelo processamento da Regra de Negócios referente ao Insight (opcional)
I21_DTPROCCaracter30Dt. Process.Data do último processamento
I21_VSPROCCaracter6Vers. Proce.Última versão de configuração de processamento (I20)
I21_STATUSCaracter3StatusStatus do último processamento
I21_DESCSTCaracter50Desc. StatusDescrição do status de último processamento
I21_DTREPRCaracter30Dt. Reproce.Data do último re-processamento
I21_VSREPRCaracter6Vers. Repro.Versão do último re-processamento


Vantagens da Estrutura Sugerida:

03. Backend TOTVSApps

Estrutura Atual

A atual infra-estrutura do Protheus Insights Totvs Apps pode ser apresentada pelo seguinte diagrama:

A atual estrutura do Protheus Insights Totvs Apps provou ser uma estrutura resiliente porém, com algumas limitações, as quais serão minimizadas na estrutura proposta mais abaixo.
Algumas destas limitações são listadas a seguir:

Estrutura Proposta

A estrutura proposta para o Totvs Apps Protheus Insights visa melhorar a atual estrutura, adicionando novos recursos para aumentar sua resiliência a falhas de disponibilidade e segurança. Esta estrutura contará com a implementação de um banco de dados com a separação de schemas por Tenants, novos meios de autenticação de clientes e novas APIs que suportarão também o uso de Insights Online.

As vantagens apresentadas a seguir estarão efetivamente em funcionamento no momento de sua implementação:

04. Backend ADVPL

Estrutura Atual


Esta atual estrutura de Insights desenvolvida para o cliente Protheus, tem se provado pouco eficiente no tratamento de mensagens on-line e pouco resiliente no tratamento de exceções quando o processamento de mensagens de Insights.

Um outro ponto de atenção é o desempenho no recebimento de mensagens e a execução do processamento da Regra de Negócio do Insight na mesma Thread de recebimento da mensagem, o que impossibilita o Smartlink de processar novas mensagens enquanto as Regras para a atual ainda estiver processando, causando um congestionamento na liberação da fila em momentos de muita demanda.

A seguir serão apresentados alguns pontos que fez parte do aprendizado com a implementação desta estrutura:


Estrutura Proposta

A estrutura proposta visa implementar um sistema mais eficiente no recebimento de mensagens de Insights, mais resiliente a falhas e transparente durante o processo desde o início até sua conclusão.

A seguir será apresentado um resumo do funcionamento desta estrutura:


Recebimento e Agendamento de Processamento de Mensagens


Durante o recebimento de uma nova mensagem de insight (InsightModel), o processo "InsightModels Message Consumer" será responsável por fazer uma breve validação estrutural da mensagem e gravar o recebimento de nova mensagem, ou atualização de antiga mensagem na tabela I19 e, em seguida, delegará para o "Agendador de Processamento de Insight" a responsabilidade de direcionar para o local de execução desta mensagem, utilizando o tipo de Modelo de Insight recebido será adquirida a configuração de Insight (tabela I20) para o tipo de Modelo e última versão ativa.

Esta configuração define se o Insight possui prioridade comum de execução ou trata-se de um insight prioritário:

Prioridade Comum: Insights de prioridade comum serão agendados utilizando a ferramenta de "Gerenciamento de Tarefas" disponibilizada pelo Totvs Framework e o processo do Agendador será finalizado;

Insight Prioritário: Insights Prioritários devem ser executados no momento de seu recebimento, o "Agendador de Processamento de Insight" não agendará este insight do modo convencional, ele executará uma nova thread delegando para o "Executor de Mensagens de Insights" a execução. Como esta chamada de uma nova thread não depende de uma resposta de retorno, o processo do Agendador pode ser finalizado;

Após a finalização desta decisão, o processamento da mensagem será concluído, retornando assim um reconhecimento de recebimento da mensagem para o SmartLink, removendo a mensagem da fila e disponibilizando o Consumer para recebimento da próxima mensagem.

Execução de Mensagens de Insight

Quando solicitada a execução de uma mensagem de Insight, o ID da mensagem (tabela I19), bem como sua configuração (tabela I20) deverão ser informados para o "Executor de Mensagens de Insight".

Este então será o responsável por instanciar a classe de Regra de Negócios informada na configuração do tipo de modelo de Insight (tabela I20) e iniciar o processamento chamando as funções definidas pela classe de interface que toda classe de Regra de Negócios de Insights deve implementar.

Recomenda-se a utilização de uma rotina em TLPP para desenvolvimento da classe de Regra de Negócio e a utilização do NAMESPACE "totvs.protheus.backoffice.ba.insights" para então implementar a interface InsightsProcess.

Os métodos a serem implementados deverão ser os seguintes:


Public Method ProcessInsight(oInsightMessage As Object) As Logical
Public Method GetKey() As Character
Public Method GetFilter() As Character
Public Method GetDateFrom() As Date
Public Method GetDateTo() As Date


Um exemplo simples de implementação de uma classe de Regra de Negócios de Insights utilizando a tabela de Insights Unificada (I21)

#INCLUDE "tlpp-core.th"
#include 'totvs.ch'

NAMESPACE defina.seu.namespace
USING NAMESPACE totvs.protheus.backoffice.ba.insights

Class SimpleInsightProcess From InsightsProcess
    
    Public Data oJsonPayload       As Object

    Public Method New() Constructor

    // Overrides
    Public Method ProcessInsight(oInsightMessage As Object) As Logical
    Public Method GetKey() As Character
    Public Method GetFilter() As Character
    Public Method GetDateFrom() As Date
    Public Method GetDateTo() As Date

EndClass

Method New() Class PermissionAlertsProcess
    _Super:New()
Return Self

Method ProcessInsight(oInsightMessage As Object) As Logical Class PermissionAlertsProcess

    Local lProcessOk        As Logical
    Local oException        As Object
    Local oInsightEntry     As Object
    Local xJsonParse        As Variant
    Local lReprocess        As Logical

    _Super:ProcessInsight(oInsightMessage)

    Try
        // Extrai o payload da mensagem e aloca o atributo oJsonPayload
        // para futura utilizacao em outras funcoes que serao executadas
        ::oJsonPayload := JsonObject():New()
        xJsonParse := ::oJsonPayload:FromJson(oInsightMessage:cMsgPayload)

       	// Atualiza mensagem de insight (tabela I19) com a informação de início de processamento
		oInsightMessage:UpdateProc("Processamneto de insight iniciado", .T., ::oInsightConfig:cVersao)

        // Inicia uma nova linha de insight (tabela I21)
        oInsightEntry := InsightEntry():New()
        
        oInsightEntry:cMsgUuid := ::oInsightMessage:cMsgUuid
        oInsightEntry:cInsightName:= ::oInsightMessage:cMsgInsight
        oInsightEntry:cModulo := cModulo
        oInsightEntry:cPayload := ::oJsonPayload:toJson()
        oInsightEntry:cDtProcess := FWTIMESTAMP(5)
        oInsightEntry:cVersaoProcess := ::oInsightConfig:cVersao

        // Calcula o campo key (I21_KEY) - Opcional
        If ::oInsightConfig:lCalcKey
            oInsightEntry:cKey := ::GetKey()
        EndIf

        // Calcula o campo key (I21_FILTER) - Opcional
        If ::oInsightConfig:lCalcFilter
            oInsightEntry:cFilter := ::GetFilter()
        EndIf

        // Retorna as datas referente aos campos I21_DTDE e I21_DTATE - Opcional
        oInsightEntry:dDataDe   := ::GetDateFrom()
        oInsightEntry:dDataAte  := ::GetDateTo()
        
        // Insere a linha da I21 na tabela
        oInsightEntry:Insert(lReprocess)
        oInsightMessage:UpdateProc("Processamneto de insight finalizado", .T., ::oInsightConfig:cVersao)
        lProcessOk := .T.
    Catch oException
        lProcessOk := .F.
		// Caso exista alguma excecao no processamento, informa na tabela I19 o erro de processamento
        oInsightMessage:UpdateProc("Processamneto de insight finalizado com erro: " + oException:description, .F., ::oInsightConfig:cVersao)
        Throw oException
    Finally
        FreeObj(oInsightEntry)
    EndTry

Return lProcessOk

Method GetKey() As Character Class PermissionAlertsProcess
	// Retorna um valor caracter que pode ser utilizado para pesquisar o registro por SQL na tabela I21 campo I21_KEY
    Local cKey As Character
    cKey := ::oJsonPayload["key"]
Return cKey

Method GetFilter() As Character Class PermissionAlertsProcess
	// Retorna um valor caracter que pode ser utilizado para filtrar o registro por SQL na tabela I21 campo I21_FILTER 
	Local cFilter As Character
	cFilter := ::oJsonPayload["key"] + ::oJsonPayload["filter"]
Return cFilter

Method GetDateFrom() As Date Class PermissionAlertsProcess
	// Retorna um valor do tipo data que pode ser utilizado para pesquisar o registro por SQL na tabela I21 campo I21_DTDE
Return dDataBase

Method GetDateTo() As Date Class PermissionAlertsProcess
	// Retorna um valor do tipo data que pode ser utilizado para pesquisar o registro por SQL na tabela I21 campo I21_DTATE
Return StoD(::oJsonPayload["dataAte"])

Os objetos oInsightMessage e oInsightConfig são providos pelo "Executor de Mensagens de Insight" e referentes a Mensagem de Insight (tabela I19) e Configuração de Insight (tabela I20) referentes a mensagem a ser processada.

A utilização da Tabela de Insights Unificada (I21) é opcional e vai de acordo com a necessidade de cada Regra de Negócio em particular.

Execução de Processamentos Agendados

A execução do processamento de Insights deverá ocorrer de acordo com a ferramenta de "Gerenciamento de Tarefas" e esta iniciará o processamento do Insight em seu tempo seguindo os mesmos passos da Execução de Mensagens de Insight

Insights On-Line

A requisição de um Insight On-Line deve partir da rotina que foi executada durante a utilização do usuário e deve ser realizada através da biblioteca de Insights disponiblizada pela equipe de BA.

Esta solicitação então será encaminhada para a fila do SmartLink que será processada pelo Protheus Insights Totvs Apps e será retornada e processada pela rotina de Recebimento e Agendamento

O Insight On-Line deve ter a configuração como Insight Prioritário na tabela de Configurações de Insight (I20)


05. Front-End


A estrutura de execução de um aplicativo de Front-End do Protheus Insights será remodelada e terá a adição de uma biblioteca de serviços REST que farão parte da biblioteca de Insights (ADVPL) disponibilizada pela equipe de BA.

Estas alterações visam remover a limitação imposta pela utilização do WebChannel como meio de comunicação e bem como habilitando a utilização de Insights On-Line de uma forma simples.

Uma biblioteca desenvolvida para o framework Angular será implementada para intermediar a comunicação com os serviços disponibilizados pelo back-end Protheus de uma forma modular e simples.

06. Pipelines Carol

Esta seção está em desenvolvimento e será atualizada em breve.

07. Data Models Carol

Esta seção está em desenvolvimento e será atualizada em breve.