Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Key

Chave

Ticket Movidesk

Summary

Documentation

Resumo

Documentação

TECD-

1983

Reiniciar sequencial dos objetos.

  • Incluído botão que possibilita o reset do sequencial dos objetos
    Unable to render embedded object: File (image-20240419-192716.png) not found.

  • É necessário que o usuario logado esteja na lista de usuários que podem realizar esta alteração:

    • Esta configuração é informada no arquivo mestre.config, entrada UsuariosAdmin

TECD-1827

Melhorias no VsMenuShowForm do VsScripter

  • O método VsMenuShowForm faz a chamada respeitando os acessos do usuario, sendo assim uma tela a qual o usuário não tenha acesso, não será aberta, por exemplo;

  • Foi alterado o método VsMenuShowForm de forma que o mesmo possa receber novos parametros sendo eles: o nome da Engine que deseja abrir e um array contendo os campos chaves. Exemplo:

    Code Block
    begin     
      VsMenuShowForm('ac_NFCab','NOTA', ['ESTAB', 1, 'NRONOTA', 5]);
    end;  

TECD-2367

Orion

Mensagem de retorno no login do Orion em caso de falha de comunicação com o Viasell

  1. Objetivo

Aprimorar a rotina de reset do serviço ResetServiceImpl do sistema Orion para garantir que, em caso de falha de comunicação com os serviços da Viasell, seja exibida uma mensagem informativa ao usuário.

  1. Alterações Implementadas

2.1. Refatoração do Método realizaReset

  • Motivo: Melhorar a legibilidade e manutenção do código, separando responsabilidades distintas.

  • Alteração: O método realizaReset foi refatorado para encapsular a lógica de formatação da série e a tentativa de reset em URLs separadas. A lógica de formatação foi movida para o método formatSeries, e a lógica de tentativa de reset com tratamento de exceções foi movida para o método makeRequestWithExceptionHandling.

Code Block
private Reset realizaReset(String series, String mac) {
    String clientSeries = formatSeries(series);
    try {
        return makeRequestWithExceptionHandling(url, clientSeries, mac);
    } catch (Exception e) {
        logger.error("Erro na primeira tentativa:", e);
        return makeRequestWithExceptionHandling(url2, clientSeries, mac);
    }
}

private String formatSeries(String series) {
    if (NumberUtil.isInteger(series)) {
        return String.valueOf(Integer.parseInt(series));
    }
    return series;
}

private Reset makeRequestWithExceptionHandling(String url, String series, String mac) {
    try {
        return restTemplate.getForObject(url, Reset.class, series, mac);
    } catch (ResourceAccessException | HttpClientErrorException | HttpServerErrorException e) {
        throw e;
    } catch (Exception e) {
        logger.error("Erro na segunda tentativa:", e);
        throw e;
    }
}

2.2. Adição do Método handleValidationAndResponse

  • Motivo: Garantir que em caso de falha de comunicação com a Viasell, uma mensagem informativa seja retornada ao usuário.

  • Alteração: Implementação do método handleValidationAndResponse que encapsula a lógica de reset e validação, e captura exceções para retornar uma resposta padronizada.

Code Block
public ResetSerieMacTOResponse handleValidationAndResponse(SerieMacTO to) {
    try {
        reset();
        boolean isValid = valid();
        logger.info("Orion liberado");
        return createResponse(isValid, "Orion liberado");
    } catch (Exception e) {
        return handleException(e);
    }
}

2.3. Métodos de Tratamento de Exceções e Criação de Respostas

  • Motivo: Centralizar e padronizar o tratamento de exceções e a criação de respostas, garantindo consistência e clareza nas mensagens retornadas.

  • Alteração: Implementação dos métodos createResponse e handleException para criar respostas padronizadas e tratar exceções utilizando a classe ResetExceptionHandler.

Code Block
private ResetSerieMacTOResponse createResponse(boolean hasSuccess, String message) {
    return ResetSerieMacTOResponse.builder()
            .hasSuccess(hasSuccess)
            .message(message)
            .build();
}

private ResetSerieMacTOResponse handleException(Exception e) {
    ResetExceptionHandler resetExceptionHandler = new ResetExceptionHandler(e);
    String logMessage = resetExceptionHandler.getLogMessage();
    logger.error(logMessage + ": " + e.getMessage());
    return createResponse(false, logMessage);
}

2.4. Introdução da Classe ResetExceptionHandler

  • Motivo: Categorizar e gerar mensagens de log específicas para diferentes tipos de exceções, facilitando a identificação e resolução de problemas.

  • Alteração: Implementação da classe ResetExceptionHandler para lidar com diferentes tipos de exceções e retornar mensagens de log apropriadas.

Code Block
public class ResetExceptionHandler {
    private final Exception exception;

    public ResetExceptionHandler(Exception exception) {
        this.exception = exception;
    }

    public String getLogMessage() {
        if (exception instanceof HttpClientErrorException) {
            return "Erro de comunicação com o cliente HTTP";
        } else if (exception instanceof HttpServerErrorException) {
            return "Erro de comunicação com o servidor HTTP";
        } else if (exception instanceof ResourceAccessException) {
            return "Erro de acesso ao recurso";
        } else if (exception instanceof IllegalArgumentException) {
            return "Argumento inválido fornecido";
        } else if (exception instanceof IllegalStateException) {
            return "Estado inválido encontrado";
        } else if (exception instanceof ResetException) {
            return "Erro no reset";
        } else {
            return "Erro geral";
        }
    }
}

2.5. Padronização da Resposta com a Classe ResetSerieMacTOResponse

  • Motivo: Padronizar a resposta da API para incluir um booleano indicando sucesso ou falha, além de uma mensagem informativa.

  • Alteração: Implementação da classe ResetSerieMacTOResponse para encapsular a resposta, contendo um booleano hasSuccess e uma mensagem message.

Code Block
@Data
@Builder
public class ResetSerieMacTOResponse {
    private Boolean hasSuccess;
    private String message;
}

2.6. Ajuste no Controller para Utilizar a Resposta Padronizada

  • Motivo: Garantir que o controller utilize a nova resposta padronizada, fornecendo mensagens informativas em caso de erro.

  • Alteração: O método save no controller foi ajustado para retornar ResetSerieMacTOResponse ao invés de um booleano.

Code Block
@PostMapping
public ResetSerieMacTOResponse save(@RequestBody SerieMacTO to) {
    configuracaoService.save(Configuracao.builder().chave(ConfiguracaoChave.SERIE).valor("\"" + to.getSerie() + "\"").build());
    configuracaoService.save(Configuracao.builder().chave(ConfiguracaoChave.MAC).valor("\"" + to.getMac() + "\"").build());

    return resetService.handleValidationAndResponse(to);
}

Estas alterações visam melhorar a clareza e a especificidade na detecção de erros, fornecer feedback útil ao usuário final, e assegurar que o processo de reset seja robusto e de fácil manutenção, além de padronizar a resposta da API.

TECD-2039

Disparo Manual - Alterar a Lógica

1.Menu

Client Assistente

2.Objetivo

Alterar a lógica do disparo manual existente dentro da plataforma

3.Alteração

Agora o disparo manual funciona de forma síncrona, ao executar ele, o processamento acontece no mesmo momento e é devolvida a resposta dentro da aplicação.

Code Block
     @SneakyThrows
    @PostMapping(value = "/manual", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public ResponseEntity<String> byManual(@RequestBody DisparoManualMeta disparoManualMeta) {
        Gson gson = new Gson();

        Config config = configRepository.getOne(configRepository.getLastId());
        String result = disparoAutomaticoService.executeManual(disparoManualMeta.id, disparoManualMeta.pdf).generateJson();
        JsonObject jsonObject = webhookService.sendMessageToWebhook(
                config.getMeta_webhook_url(),
                result,
                true
        );

        if (jsonObject == null) {
            JsonObject errorJson = new JsonObject();
            errorJson.addProperty("message", "error");
            return new ResponseEntity<>(gson.toJson(errorJson), HttpStatus.OK);
        }

        String json = gson.toJson(jsonObject);

        return new ResponseEntity<>(json, HttpStatus.OK);
    } 

Dessa forma o método requer um id (ID do menu a ser executado) e se é um disparo com arquivo PDF ou Imagem

TECD-2279

0

Orion - Migrar parte de logs dentro do Orion para o MySQL

1.Menu

Orion → Banco de Dados

2.Objetivo

Criar feature que grava os logs do Orion no banco MySQL

3.Alteração

O Orion utiliza o log4j2 para geração de logs, e todos os apontamentos e códigos estão sendo feitos para o banco h2, sendo tudo fixo nessa parte.

Logo o que teve que ser feito foi a refatoração do log4j2.xml para um formato que consiga atender tanto os logs no h2 como no mysql, ai entra as peculiaridades de cada banco em si.

Dessa forma teve que criar dois métodos o getDatabase e o getDatabaseLogs, pelo fato dos logs ter a possibilidade de funcionar no banco MySQL além do H2.

Code Block
 <ConnectionFactory class="br.com.viasoft.orion.security.LogFactory" method="getDatabaseConnectionLogs" /> 

Um fato importante a se destacar que o Orion vai utilizar MySQL se ele encontrar as seguintes variáveis de ambiente

  • MYSQL_DB_URL

  • MYSQL_DB_USER

  • MYSQL_DB_PASSWORD

Após ele encontrar as variáveis ele vai tentar fazer um test-connection, caso encontre sucesso vai utilizar o MySQL para armazenar os logs, caso contrário vai utilizar o banco H2 para tudo.

Code Block
 // Exemplo da iniciação da base
Connection conn = LogFactory.getDatabaseConnectionLogs();
                StringBuilder sql = null;
                try {
                    boolean isH2 = true;
                    if (conn != null) {
                        if (conn.getMetaData() != null) {
                            if (conn.getMetaData().getDatabaseProductName() != null) {
                                isH2 = !conn.getMetaData().getDatabaseProductName().equals("MySQL");
                            }
                        }
                    }

                    logger.info("Iniciando com base: " + (isH2 ? "H2" : "MySQL"));
                    sql = isH2 ? sqlBuildH2() : sqlBuildMySQL(); 

Houveram diversas mudanças dentro do código, mas cabe ressaltar que todas tiveram o requisito principal em deixar os dois bancos funcionando ao mesmo tempo.

Aqui é um guia descrito durante a tarefa para dar as instruções de como conectar os logs pelo MySQL no Orion,

/wiki/spaces/TD/pages/3699769371

TECD-2195

Analise de migração do banco Orion para Mysql

1.Menu

Orion → Banco de Dados

2.Objetivo

Realizar analise das difcildades para realizar a migração do banco H2 para MySQL

3.Alteração

A analise foi feita seguindo duas princiapais vertentes:

Primeira, foi analisada a migração que foi cancelada pela NextAge, através da branch/tarefa

Jira Legacy
serverSystem Jira
serverIda5c9f197-a7aa-3a3e-91c5-85e0279c94e6
keyOR-776
, pode se dizer que foi realizado bastante alterações no código já visando essa mudança de banco, foi coloado até migradores de dados dentro do orion-api, porém o projeto não foi para a frente, teve tarefa para correção de +20 erros, e muito na época não foi para a frente por causa do custo e de dificildades de migração e testes no projeto. Hoje a migração que foi feita na época não seria compativel com o código que temos no Orion hoje, pelo fato de muitos arquivos já estar dando coflito.

Segunda, fiz uma analise pensando na grandiosidade no projeto do Orion e na confiabilidade e que os dados precisam ter, nesse sentido preciamos ter inúmeros testes de Checksum e de contas de números de registros antes de realizar qualquer migração. Visto isso seria necessário implementar classes que tenham função só de testar para verificar se o banco foi migrado 100% correto. Além disso temos alguns pontos principais também:

  • A versão do marketplace será atualizada?

  • Os bancos MySQL serão mantidos no mesmo container ou serão na nuvem?

  • Classes de testes unitários, chechsum, count, e validação de SQL serão fundamentais

  • Parte de Logs terá que ser alterada para alguma ferramenta no MySQL, pois essa parte era armazenada pelo H2

  • Qual a melhor forma de realizar a migração dos dados? Serviço, .sh, .bat?

  • Documentações teram que ser feitas para realizar a migração em massa

Todos esses pontos serão discutidos juntamente com o relator da tarefa Luciano César Ascari .

Exemplificação gráfica:

image-20240524-120656.pngImage Removed

TECD-2281

0

Orion - Estudar forma de manter retrocompatibilidade entre banco H2 e MySQL

1.Menu

Orion → Banco de Dados

2.Objetivo

Verificar se é possível deixar os dois bancos funcionando ao mesmo tempo

3.Alteração
Após uma análise detalhada, verificou-se que é viável manter um único projeto do Orion funcionando em dois diferentes bancos de dados (H2 e MySQL). Mas a ressalvas:

A solução para permitir que o Orion funcione com H2 ou MySQL envolve a configuração de uma flag que determine qual banco de dados será utilizado, detalhe que essa funcionalidade já foi utilizada para migrar os logs para o MySQL.

Pelos estudos não vai precisar manter em .war diferentes, pelo fato de que não vamos ter informações fixas dentro do código-fonte do Orion, ele vai buscar as informações direto das variáveis de ambiente do sistema para verificar qual banco deverá usar. A principal dificuldade encontrada está nos repositórios e serviços que possuem SQL fixos. Para resolver isso, é necessário adaptar o código para que seja mais genérico, ou então, utilizar a API do Hibernate para evitar SQL nativo. Em casos onde o SQL nativo for inevitável, podemos parametrizar o banco de dados utilizado, exemplo:

Code Block
 @Query(value = "SELECT * FROM ${tableName} WHERE id = :id", nativeQuery = true)
Optional<Entity> findById(@Param("tableName") String tableName, @Param("id") Long id); 

Agora a análise de forma separada

Code Block
# Model
Os models no projeto Orion representam as entidades do banco de dados.
Como o Spring Data JPA abstrai grande parte das diferenças entre bancos de dados,
o impacto nos models é mínimo, independentemente de você usar H2 ou MySQL.

# Repository
Os repositories são responsáveis por interagir com o banco de dados.
A maioria das operações de CRUD são diretamente suportadas pelo Spring Data JPA,
independentemente do banco subjacente.
No entanto, desafios podem surgir ao usar queries SQL nativas,
que podem diferenciar entre H2 e MySQL.

# Controller
Os controllers no Spring Boot geralmente não são afetados pelo tipo de banco de dados
utilizado, uma vez que eles lidam principalmente com a lógica e encaminham solicitações
para os serviços e repositórios.

TECD-2003

Orion - Bug de Filtro de Data Inicial e Final (Busca de dados lixo de outras fonte de dados com o parâmetro do mesmo nome)

1.Menu

Orion → Dashboards → Filtro

2.Objetivo

Analisar Bug que está acontecendo dentro das fonte de dados setando sempre a mesma data padrão não importa o que mudar

3.Alteração

Primeiramente foi realizado uma atualização no cliente deixando o mesmo na última versão possível conforme a data vigente. Após isso comecei a depurar para verificar se realmente havia algum bug, e realmente não importava o valor que era colocado dentro do input ele sempre iria manter o valor inicial, isso tanto analisando atarvés de resultados de SQL, como parametros que o front enviava para o back.

Então foi verificado que o cliente utiliza uma forma de elaborar relatórios que fugia dos padrões, afinal ele possuia filtros de valores variavies (Data atual, Primeira Data do Mês e etc) sendo assim os valores que o parametro enviava eram sempre os padrões pois no Orion não é possível fitlrar um filtro através de algum parametro não fixo.

image-20240514-190159.pngImage Removed

Conforme o esquema acima podemos verificar que o ID (DTIN, DTFI) no caso são os mesmos dentro dos filtros principais do que os filtros do filtro de Marca. Ou seja nesse caso acontecia o seguinte, por mais que era alterado os filtros do dash principal o Orion ia analisar todos e obter uma reposta padrão, e como não conseguia obter um simples resultado, ele pegava o valor padrão do parametro.

Então a solução nesse caso foi tirar o filtro de data dentro do filtro de Marca, mas o que poderia ser feito também seria alterar o nome dos parametros dentro do filtro do filtro para outro valor que não fosse DTIN e DTFI e colocar um valor fixo.

TECD-2226

Orion - Bug ao colocar fonte de dados vinculado a "ASSUNTO" nos Agendamentos

1.Menu

Orion → Excel → Agendamento → Fonte de Dados por E-mail

2.Objetivo

Verificar qual parte da Rotina está gerando erro e ajustar

3.Alteração

Foi verificado que dentro do front o caminho estava tudo certo, as informações estavam sendo mantidas no banco:

image-20240611-175644.pngImage Removed

Porém o erro estava acontecendo na hora em que ele tentava buscar se a fonte de dados utilizado pelo relatório excel era a mesma que seria utilizada para gerar o parametro. Porém ele tentava fazer essa buscar, mas a informação da fonte de dados como assunto nunca era injetada, ou seja, sempre fazia uma comparação de algum ID comparando com null.

Code Block
 private void setarAssuntoEmail(Excel excel, AgendamentoTarefa agendamentoTarefa) {
        agendamentoTarefa.setAssuntoEmail("");
        if(agendamentoTarefa.getCampoParametroAssuntoEmail().equals("campo")) {
            List<FonteDadosResult> results = new ArrayList<>();
            for (ExcelFonteDados fonteDados : excel.getDados()) {
                var res = fonteDadosService.executeAndReturn(fonteDados.getFonteDados());
                if (res != null  && !res.getList().isEmpty()){
                    // Adicionado fonte de dados em casos em que ela não retorna - TECD-2226
                    if (res.getFonteDados() == null &&  fonteDados.getFonteDados() != null) {
                        res.setFonteDados(fonteDados.getFonteDados());
                    }
                    results.add(res);
                }
            }
            this.setAssuntoEmailCampo(results, excel, agendamentoTarefa);
        } else {
            this.setAssuntoEmailParametro(excel, agendamentoTarefa);
        }
    } 

Além disso também foi retirado uma parte do código que fazia um replace de qualquer tipo de espaço que tivesse no assunto, pois foi visto que não era necessário e funcionaria normalmente sem aquilo.

TECD-2131

Fluxo de Caixa - Problemas em Functions ao utilizar via Docker

1.Menu

Orion → Fluxo de Caixa

2.Objetivo

Verificar motivo e ajustar o porquê as functions não estão funcionando corretamente

3.Alteração

Foi verificado que anteriormente as versões do Oracle não necessariamente precisam do ; no final da function/procedure para funcionar pois consideravam o end-of-file já suficiente, porém nas versões Oracle que estão sendo implementadas nos servidores da Cloud 1.0 e 2.0 precisam necessariamente da pontuação.

Logo foi conferido todas as functions/procedures que não possuíam o ; após o END da procedure, e as que não possuíam eram a seguintes:

DIAS_UTEIS_FLUXO_CAIXA

ULTVALORMOEDA

E ambas foram corrigidas e agora apresentam funcionando normal.

TECD-1515

0

ORION: Item duplicado usando Lazy Load

1.Menu

Orion → Fonte de Dados → Filtro

2.Objetivo

Verificar se a situação que está ocorrendo no cliente se trata de um bug, e se caso, sim, deverá ser ajustada

3.Alteração

Foi verificado que as configurações de “Limite” e “Limite de dados mostrados em tela” estava configurado muito errado conforme o número de dados que o filtro de itens exigia. O limite estava configurado em 500 (que não se trata nem de 100% da quantidade de itens que o cliente possuía) e no limite de dados mostrados em tela estava em 20, sendo assim ocasionava uma duplicidade de fatores dentro do filtro.

Configuração realizada:

image-20240716-201007.pngImage Removed

Resultado do filtro após configurações:

image-20240716-201417.pngImage Removed

Da forma como que estava, como ele tem mais de 800 registros, ele gerava duas vezes até 500 (que era o limite estabelecido) ficando assim os registros duplicados, pois carregava duas vezes.

TECD-2167

API - Criar forma de mensagens serem formatas para se encaixar nas regras do Meta

1.Menu

Orion → Plugin Assistente

2.Objetivo

Analisar quais as principais regras dentro dos message_templates que podem impactar e serem tratadas pelo própio Assistente

3.Alteração

Tudo foi baseado na seguinte documentação: https://developers.facebook.com/docs/whatsapp/business-management-api/message-templates/

As principais regras encontradas foram as seguintes.

  • Limite de 1024 caracteres

  • Não pode ter mais de 4 espaços em sequência

  • Não pode haver separador de tabelas como o | (pipe)

  • Não pode haver quebra de linha em conteúdo de variaveis dentro de uma Message Template

Logo foi realizado alguns tratamentos iniciais para validar se já funcionaria como o esperado e parava de dar os erros mais comuns, os tratamentos inicias foram a retirada do caractere pipe, os espaços em sequência e a quebra de linha:

Code Block
   public String inMetaRules(String input) {
    //Remove quebras de linha
    String withoutNewLines = input.replaceAll("\\n", " ");
        
    //Remove mais de 3 espaços consecutivos
    String withoutConsecutiveSpaces = withoutNewLines.replaceAll("\\s{4,}", " ");
        
    //Substitua o caractere pipe por um espaço
    String withoutPipes = withoutConsecutiveSpaces.replaceAll("\\|", " ");

    return withoutPipes;
} 

Esse método acima será acionado como tratamento antes de enviar qualquer mensagem de template.

TECD-2133

API - Criar tabela de referência de modelo (Modelo -> Template) para casos que pode haver banimento

1.Menu

Orion → Plugin Assistente

2.Objetivo

Criar tabela de referência de templates conforme os nomes dentro do Meta

3.Alteração

Conforme aconteceu durante os testes, nem sempre é possível utilizar nomes padrões para os templates padrões, anteriormente tínhamos essa referência abaixo, mas foi verificado que caso um desses templates seja banido leva 4 semanas para que o mesmo nome do template possa ser criado novamente, ou seja é necessário que os nome dos templates não seja fixos ao código.

Code Block
Tipo do Template      |     Nome do Template

Texto                 |     default
Imagem                |     default_imagem
Documento             |     default_document
image-20240509-120627.pngImage Removed

Por isso foi criado essa opção dentro da pagina inicial do assistente aonde o usuário pode configurar o nome do template para cada tipo de disparo (texto, imagem e documento). Lembrando que todos vem com o valor padrão que são os valores da tabela de referência acima, mas podem ser alterados a qualquer momento.

image-20240509-120708.pngImage Removed

TECD-2411

0

Plugins - Correção do plugin Ficha Cadastral Cliente (TURIM)

1.Menu

Orion → Plugin Ficha Cadastral → Personalizações

2.Objetivo

Criar 3 novas branchs do projeto Ficha Cadastral, incluindo as personalizações feitas apenas em arquivos locais no cliente

3.Alteração

Na branchs tiveram que ser corrigido alguns SQL que estavam com coalesce que eram aceitos no banco firebird, mas no oracle gerava erro:

Code Block
 -- Exemplo de um caso
-- Antes
COALESCE(CONTAMOVATIVECON.A6HAPLANT, '') AS CULTIVADO,
COALESCE(CONTAMOVATIVECON.A6PRODANUALSC, '') AS PRODUTIVIDADE,
COALESCE(CONTAMOVATIVECON.A5FATBRUTOANUAL, '') AS VALOR

-- Depois
COALESCE(CONTAMOVATIVECON.A6HAPLANT, '') AS CULTIVADO,
COALESCE(CONTAMOVATIVECON.A6PRODANUALSC, '') AS PRODUTIVIDADE,
COALESCE(CONTAMOVATIVECON.A5FATBRUTOANUAL, '') AS VALOR 

Como o projeto foi migrado do 0 para o Linux, tivemos que adicionar vários endpoints que retornavam o stacktrace para saber o que está dando de errado dentro dos plugins, logo foi adicionado o seguinte código:

Code Block
 // Apenas um trecho de uma exception mais genérica que o código pegava
// Pegando o stacktrace inserindo em uma string e jogando para o navegador a resposta
} catch (Exception e) {
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  String stackTrace = sw.toString();
  throw new Exception("Erro desconhecido ao gerar relatório: " + caminho + "\n" + stackTrace, e); 
image-20240718-170648.pngImage Removed

Além de sql, teve que ser alterado algumas formas de caminhos, que são fixas dentro do projeto, como o cliente mudou de servidor de Windows para Linux teve que ser feitas algumas mudanças nesse sentido.

Code Block
 // Antes
report = "/reports/ficha_cadastral/FichaCadastral.jasper";
// Depois
report = "/opt/Orion/webapps/ficha_cadastralothers/WEB-INF/classes/reports/ficha_cadastral/FichaCadastral.jasper"; 

Foi realizado também a mudanças das imagens dentro do template jasper, pois em todos os templates as imagens estavam com diretórios fixos do servidor Windows do cliente, sendo assim os arquivos .jrxml e .jasper tiveram que ser alterados.

A parte do bower_components também não estava sendo extraída dentro do servidor Linux, pelo fato de não estar com o npm instalado, então foi inserido todo o bower_components dentro do próprio .war, sendo que o bower_components foi gerado na minha máquina, para evitar de instalar npm no cliente.

Uma das mudanças também foi a mudança de forma de buscar arquivos pois o getResourceAsStream não estava funcionando como esperado, e logo foi trocado para o FileInputStream.

Code Block
 // Essa parte do código também estava completamente errada, pois quando um arquivo não é encontrado ele gera um erro
// E dessa forma que estava ele validava se era null
// Lembrando que esse in se refere ao FileInputStream
if (in == null) {
  throw new Exception("Arquivo do relatorio nao encontrado: " + caminho);
} 

Houve também mudanças no sentido do objdc6 para o ojdbc8, e também a inclusão da nova lib que libera os plugins para se conectarem a https.

Essas mudanças foram genericas e aplicadas em ambas as branchs, agora o que geralmente mudava de uma branch para a outra era os templates .jasper, e todos os arquivos que geravam de alguma forma o path que ela iria ser extraida dentro do sistema (Todos os arquivos estão descritos na Descrição)

TECD-2035

Correções das rotas do VsObjectStorage (Limite de 50mb)

1.Menu

Orion → Viadecisor

2.Objetivo

Corrigir a rota de upload que não está funcionando e implementar método para verificar tamanho do arquivo

3.Alteração

Para corrigir foi utilizado para o form data as seguintes medidas:

Code Block
 // Para utilizar o form-date no body:
MultiValueMap<String, Object>

// Setando configurando fixa nos headers
headers.setContentType(MediaType.MULTIPART_FORM_DATA); 

Método verificador:

Code Block
 private boolean canUpload(String filePath) {
        File file = new File(filePath);

        if (!file.exists()) {
            return false;
        }

        long fileSizeInBytes = file.length();
        long fileSizeInMB = fileSizeInBytes / (1024 * 1024);


        return fileSizeInMB <= 50;
    } 

TECD-2271

Assistente Melhorias Orginalização do Disparo Automático

1.Menu

Orion → Viadecisor (API Versão API Oficial)

2.Objetivo

3.Alteração

3.1 -

3.2 -

3.3 -

3.4 -

TECD-2269

0

Assistente Melhoria Enquete Disparo Automatico(API META)

1.Menu

Orion → Viadecisor (API Versão API Oficial)

2.Objetivo

Criar Enquete dentro do Assistente Meta

3.Alteração

Foi criado uma nova rotina no assistente utilizando o WhatsApp Flows https://developers.facebook.com/docs/whatsapp/flows/ . Aonde dispara uma enquete para o usuário vinculado a disparo automático de texto, podendo ter qualquer texto dentro da mensagem desde que esteja dentro das regras da Meta, o template criado é um padrão que está dentro das documentações .

Enquetes Assistente Meta

Dentro do assistente foi criado um modal para verificar o resultado das pesquisas, e caso necessário todos os resultados estarão na tabela SURVEY_AUDIT

image-20240823-175926.pngImage Removed

TECD-2255

Assistente Melhorias(API META)

1.Menu

Orion → Viadecisor (API Versão API Oficial)

2.Objetivo

Criação de algumas melhorias na nova API Meta WhatsApp solicitadas por clientes e analisadas internamente 

3.Alteração

3.1 - Atualmente dentro do Asssitente todos os templates padrões são os relacioandos a marketing pelo fato de que são muito mais abragentes em questão do que pode ser enviado sem causar nenhum banimento ou má qualidade de algum modelo em especifico. Mas pelo fato de ser algo relacionado a Marketing ele tem um custo mais elevado em questão dos demais. Por isso foi criado uma rotina dentro do Assistente aonde poderá ser utilizado templates utilitários que reduzem o custo do disparo de U$ 0,0625 para U$ 0,035.

Mas o contexto do conteúdo do disparo estar dentro desse contexto:

Permitem acompanhar ações ou solicitações do usuário. Os exemplos incluem confirmação de aceitação, gerenciamento de pedidos/entregas (por exemplo, atualização de entrega), atualizações ou alertas de conta (por exemplo, lembrete de pagamento) ou pesquisas de feedback.

Para implementar basta executar esse diagrama no banco:

Code Block
 ALTER TABLE MENU ADD META_TEMPLATE VARCHAR(255);
COMMIT; 

Agora já dentro do assisnte é necessário configurar o nome do template criado através das rotinas da Meta no campo “Meta - Template de Utilidade”.

image-20240612-143121.pngImage Removed

Para a parte do Meta e até dentro do Assistente foi criada uma documentação completa para auxiliar em todos os casos de integração com templates de utilidade:

Criação de Templates - Assistente Meta

3.2 - Essa funcionalidade já existia dentro da api antiga, aonde dentro do launcher tinha uma opção que desativava totalmente qualquer tipo de interação com o usuário que não fosse através de disparo automático.

Também havia essa funcionalidade dentro da api, mas ela enviava uma mensagem caso o usuário mandasse alguma interação:

image-20240612-144337.pngImage Removed

Frase enviada:

Esse assistente tem a finalidade de envios automáticos, para deixar de receber envios deste canal, favor entrar em contato com a empresa.

Porém conversando com o Marcos Antonio De Santi Boneti ele deu ideia de utilizarmos essa mesma funcionalidade para o que já tinhamos no launcher da api antiga, que ele bloqueia todas as requisições de chat e conversasão que não seja através de disparo automático. Pois não há nenhum cliente que hoje envia essa frase, eles sempre desligam totalmente ou deixam totalmente habilitado, não existe meio termo nesse caso. Logo foi feito a migração, quando essa opção estiver ativa ele vai sempre enviar BAD_REQUEST para qualquer requisição vinda por Webhook para interação via chat.

Exemplo de um dos tratamentos realizados:

Code Block
 if (config.getEnvioaut_only() == 1) {
  return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
} 

TECD-2250

Assistente Correções (API META)

1.Menu

Orion → Viadecisor (API Versão API Oficial)

2.Objetivo

Ajustar bugs que estão acotnecendo com alguns clientes nessa fase de validação do Assistente Meta

3.Alteração

3.1 - Nesse primeiro caso teve que ser realizada uma migração, anteiormente para o encerramento das sessões era utilizada a rotina de disparos automáticos (na api antiga), pois todo e qualquer tipo de agendamento gerava mensagens automáticas. Porém agora como todo disparo automático gera um custo elevador por mensagem para cliente, foi verificado a possibilidade de gerar e enviar essas mengens sem utilizar os model messages da Meta API.

Ele funciona através de um cron que executada a cada minuto no segundo 0, pega a configuração atual, se caso verificar se não é pra deixar a api ligada ou até mesmo o cliente utiliza apenas disparo automático ele não vai fazer nada. Caso ele ignore essas duas condicionais ele irá verificar todos os clientes que estão há mais de 15 minutos com a sessão sem nenhuma interação e enviar a seguinte mensagem (finalizando a sessão). Vale ressaltar que agora essa mensagem não utiliza nenhum message template.

“Por questões de segurança, encerrarei sua sessão agora. Para acessar o menu novamente, basta enviar um Oi."

Além de enviar a frase, internamente ele vai fazer um update no banco, setando o cliente na etapa 5 (etapa para validar senha) e menu -1 (que seria o menu antes de todos).

Code Block
     @Scheduled(cron = "0 * * * * *")
    @Transactional
    public void closeSessionsAfter15() throws Exception {
        Gson gson = new Gson();
        Config config = configRepository.getOne(configRepository.getLastId());

        if (config.getEnvioaut_only() == 1) {
            return;
        }

        if (config.getMeta_online() == 0 || config.getMeta_online() == null) {
            return;
        }

        MessageContainer messageContainer = new MessageContainer(config, messageAuditRepository, templateMessageRepository, false);

        if (config.getMeta_online() == 1) {
            messageContainer = chatService.sendWarningCloseSession(messageContainer);

            JsonObject jsonObject = webhookService.sendMessageToWebhook(
                    config.getMeta_webhook_url(),
                    messageContainer.generateJson(),
                    false,
                    false
            );

            if (jsonObject == null) {
                System.out.println("API OFF");
            }
        }
    } 

3.2 - Através de testes, foi verificado que ele sempre mantinha a última imagem, pelo fato de não querer repetir a mesma frase durante todas as imagens do disparo, mas isso foi visto que era algo necessário.

Code Block
Formato Antigo:

--------     --------     --------
Imagem 1     Imagem 2     Imagem 3

Texto
--------     --------     --------

Formato Após correção:

--------     --------     --------
Imagem 1     Imagem 2     Imagem 3

Texto        Texto        Texto
--------     --------     --------

Único detalhe que validando muito bem essa parte após diversos testes, a meta não respeita muito bem uma ordem de envios conforme a ordem que é enviado para eles, dessa forma pode acabar desconfigurando a ordem de chegada das mensagens para o cliente, (sendo bem comum). Por esse motivo e outros relacionados a custo, seria muito mais vantojoso e melhor organizado seria utilizar o uso do template de documento invés de imagem.

A comunicação com a Meta Cloud Api ela é de forma assincrona, sendo assim, todas as requisições que enviamos para eles é respondida com algum retorno de sucesso antes mesmo que qualquer mensagem seja enviada para qualquer que seja o destinatario.

3.3 - Sobre esse caso, ele já foi ajustado através da

Jira Legacy
serverSystem Jira
serverIda5c9f197-a7aa-3a3e-91c5-85e0279c94e6
keyTECD-1034

O cliente não deve estar com os últimos diagramas atualizados (código abaixo retirado direto dos diagramas do projeto):

Code Block
 /*
    Alterações 12/07/2023
*/

/* Antes de executar verificar e editar todos os decisores que estão cadastrados com 9 extra e modificar */
ALTER TABLE DECISOR MODIFY NUMERO VARCHAR2(10);

COMMIT; 

TECD-2220

Assistente Bug (API META)

1.Menu

Orion → Viadecisor (API Versão API Oficial)

2.Objetivo

Verificar se todos os problemas apresentados são bugs reais, ou se são bugs que acontece pelo fato do sistema ser Firebird, e se caso for encontrado algum bug deverá ser arrumado

3.Alteração

3.1 - Sobre os menu diretores, realmente havia um problema que não deixar o mesmo acessar nenhum menu, afinal a lógica ainda contia algumas especialidades que eram da api antiga, sendo assim todo número era cortardo os dois primeiros, mas nessa nossa api não precisa.

Code Block
Exemplo (554299822852):

Tentava encontrar um decisor com o seguinte número: 99822852

Após novos tratamentos: 4299822852

3.2 - Realmente estava gerando um erro interno após o jasper não ser gerado, pois ele tentava enviar um arquivo não existente para o VsObjectStorage, aonde gerava um erro interno e não gerava nenhum resposta.

Logo foi feito um tratamento para caso não houvesse dados ele não faz nenhuma comunicação VsObjectStorage e já devolve diretamente para o Webhook.

3.3 - Nesse caso parece ser uma peculiaridade do própria base firebird, pois em testes feitos com a base Oracle, o contato não cria nenhum registro caso não ache ele no banco, sendo assim necessário em debug maior no caso e verificar se deverá ser dado o suporte a bases firebird.

3.4 - Foi feito tratamentos nesse caso para que se caso não encontre a pessoa via SQL principal irá simplesmente abandonar qualquer decisão futura ao tentar gerar algum tipo de menu.

TECD-2218

API - Criar forma de não precisar criar as tabelas na mão, e tudo ser feito automático

1.Menu

Orion → Viadecisor → Criação de Tabelas

2.Objetivo

Analisar formas de todos os diagramas serem criados de forma automática

3.Alteração

Foi verificado como era feita a criação das tabelas em plugins como planejamento de safra e fluxo de caixa, e foi adptado para um que funcionasse para o viadeicsor.

Dentro da classe ViaDecisorConfig na parte de Configuration foi importado uma lógica que verificar sql um por um para verificar se o script será executado:

Code Block
 sqlTest = "SELECT * FROM ETAPA";
sql = "CREATE TABLE ETAPA (\n" +
  " ID INT NOT NULL,\n" +
  " TITULO VARCHAR(45) NOT NULL,\n" +
  " CONSTRAINT PK_ETAPA PRIMARY KEY (ID))";

if (verifyIfShouldExecute(sqlTest, jdbcTemplate))
  executeSql(stmt, sql); 

Exemplo de lógica implantanda, mas temos vários INSERTS, MODIFY aonde somaram mais de 700 linhas de diagramas/testes.

TECD-2216

API - Alguns relatórios não estão sendo enviados através do agendamento e apenas disparo manual

1.Menu

Orion → Viadecisor → Disparo automático

2.Objetivo

Verificar motivo da inconsistência estar acontecendo dentro dos agendamentos

3.Alteração

O cliente relatou, e foi comprado via testes que o o mesmo disparo automático estava sendo disparado corretamente via disparo manual, mas quando ele estava agendado para algum horário especifico ele não era enviado.

E através de debug no projeto foi verificado que todos os relatórios que não estavam com a tag “MULTIPLO” no banco habilitado, que significado que entraria para o sistema de fila não estavam funcionando corretamente. Isso se deu pela migração da ferramenta ser feita para duas api consumidoras diferentes: whatsapp-web-js e Meta.

Logo foi implementado nova lógica entre os repositórios de disparo automático para que tenha métodos inpedentes para cada api, para que a lógica de um não possa influenciar de jeito nenhuma lógica do outro.

image-20240528-184814.pngImage Removed

O campo é o que está grifado em amarelo.

TECD-2326

0

VsIA Api - Conferir Vector Store

1.Menu

VsApi → Elasticserach → Vetorização de contextos

2.Objetivo

Verificar as documentações e usar também a comunidade para verificar o que devemos implementar no nosso projeto com base nas vetorizações de contextos

3.Documentação

Se entrarmos das documentações do ElasticVectorSearch https://api.python.langchain.com/en/latest/vectorstores/langchain_community.vectorstores.elastic_vector_search.ElasticVectorSearch.html é possível ver de cara uma mensagem de decaprated:

image-20240626-180540.pngImage Removed

Ele foi migrado para a ElasticsearchStore, aonde ficou muito mais completo agora, pois faz parte de um projeto langchain_elasticsearch invés de langchain_community. Sendo adicionado diversas funcionalidades como strategy, vector_query_field, query_field, distance_strategy. Mas de longe a melhor melhoria foi escolher a estratégia. Qual estratégia escolher?

ApproxRetrievalStrategy (padrão) - Ela usa o algoritmo HNSW para realizar uma pesquisa aproximada do vizinho mais próximo. Esta é a estratégia mais rápida e eficiente em termos de memória.

ExactRetrievalStrategy - Esta estratégia é usada para realizar uma pesquisa de força bruta / vizinho mais próximo exato via script_score (É uma funcionalidade do Elasticsearch que permite modificar a pontuação (score) de documentos durante uma pesquisa, usando um script personalizado. O script pode usar qualquer campo do documento para calcular a nova pontuação. Isso é útil quando você deseja personalizar a relevância de seus resultados de pesquisa com base em critérios específicos do seu aplicativo)

SparseRetrievalStrategy - Esta estratégia é usada para realizar uma pesquisa de vetor esparsa via text_expansion (refere a técnicas usadas para expandir uma consulta de pesquisa com sinônimos, termos relacionados ou variações de um termo para melhorar a precisão e a abrangência dos resultados da pesquisa).

Mas algumas coisas mudaram no sentido de busca de documentos, por padrão o ElasticsearchStore não da mais opção de colocar quantos números de documentos você deseja buscar, ou até mesmo o score que os documentos teriam que ter para aparecer dentro das buscas de indices, isso é feito automaticamente, mas se caso for necessário é possível utilizar o SelfQueryRetriever, que se trata de um auxiliador nesse sentido, mas nos meus testes não achei necessidade para usar o tal método.

O próprio langchain não aconselha utilizar essa parte, resposta do próprio langchain.

In your provided code, the documents are retrieved and processed in the create_history_aware_retriever and create_retrieval_chain functions. These functions are part of the LangChain library and handle the retrieval of documents from your ElasticsearchStore. If you want to manually retrieve a specific number of documents and use them in your context, you would need to modify these functions or create new ones. However, this would require a deep understanding of the LangChain library and might not be the recommended way to use the library.

Criação da POC:

Code Block
 elastic_vector_search = ElasticsearchStore(
        es_connection=es_client,
        index_name=index,
        embedding=embedding
    )

    llm = ChatOpenAI(openai_api_key=openai_api_key, temperature=0.5)

    chat_prompt = hub.pull("langchain-ai/chat-langchain-rephrase")

    history_aware_retriever = create_history_aware_retriever(
        llm, elastic_vector_search.as_retriever(), chat_prompt
    ) 

TECD-2327

0

VsIA Api - Conferir engenharia de prompt

1.Menu

VsAPI → Langchain → Prompt

2.Objetivo

Verificar qual a estratégia de prompt está sendo mais utilizada nesse momento, considerando a latest do langchain

3.Alteração

Anteriormente o prompt era gerado de uma forma bem manual, aonde através de uma string formatada era possível colocar algumas variáveis que mais para frente seriam preenchidas pelo langchain, exemplo: context, chat_history e input. E logo após isso chamávamos o PromptTemplate e indicavamos de forma manual quais foram as variáveis adicionadas e qual a variável de prompt utilizada.

Forma que era utilizada:

Code Block
 prompt_template = "Prompt: " + prompt + """

        Context: {context}

        Chat History: {chat_history}

        User Input: {question}"""


FINAL_PROMPT = PromptTemplate(
  input_variables=["context", "question", "chat_history"], template=prompt_template
) 

Atualmente o PromptTemplate já foi descontinuado, mas ainda há algumas semelhanças, pois usamos um método que seria o ChatPromptTemplate, mas nesse método ele já reconhece naturalmente todas as variáveis setadas automaticamente.

Code Block
 # https://api.python.langchain.com/en/latest/prompts/langchain_core.prompts.chat.ChatPromptTemplate.html
real_prompt = ChatPromptTemplate.from_messages([
        ("system", f"{prompt}"),
        MessagesPlaceholder("chat_history"),
        ("assistant", "{context}"),
        ("human", "{input}")
]) 

Além disso, nessa nova forma, nós conseguimos configurar de onde está vindo cada uma das mensagens, ou seja, o contexto vem sempre do “assistant”, o prompt vem sempre do “system” e o “human” que vai perguntar alguma coisa entra como a última interação.

Esse modelo de prompt é muito mais completo pelo fato que pode ser adicionada infinitas varáveis e diversas interações até a última ação, a qual seria a do próprio cliente, além de tudo isso o “chat_history” não entra categorizado nem como “assistant” e nem como “system” ele próprio faz esse controle.

Além desse novo prompt é importante que ressaltar que agora temos um prompt que tem a função de auxiliar o retriever para gerar perguntas e respostas para ele mesmo.

O chat_prompt é um prompt que é usado para gerar a consulta de pesquisa para o retriever. No código que você forneceu, o chat_prompt é obtido a partir do hub LangChain usando o comando hub.pull("langchain-ai/chat-langchain-rephrase").

E vendo através das documentações é possível construir um prompt, ou também podemos utilizar alguns que o próprio langhcian disponibiliza.

Code Block
 def get_history_aware_retriever(llm: ChatOpenAI, vector: ElasticsearchStore):
    # Conforme as documentações do langhcain https://smith.langchain.com/hub/langchain-ai/chat-langchain-rephrase
    chat_prompt = hub.pull("langchain-ai/chat-langchain-rephrase")

    history_aware_retriever = create_history_aware_retriever(
        llm, vector.as_retriever(), chat_prompt
    )

    return history_aware_retriever 

TECD-2325

0

VsIA Api - Verificar como pode ser resolvido LangChainDeprecationWarning

1.Menu

VsApi → Novas implementações considerando langchain 0.2.5

2.Objetivo

Verificar todas as partes que estavam com o deprecated e transferir para as novas versões

3.Alteração

Para executar o projeto antigo do VsApi ele já dava 3 erros de decrepeciado logo de cara o qual são os:

Code Block
1. LangChainDeprecationWarning: The class `OpenAIEmbeddings` was deprecated in LangChain 0.0.9 and will be removed in 0.3.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import OpenAIEmbeddings`. ✅

2.LangChainPendingDeprecationWarning: The class `ElasticVectorSearch` will be deprecated in a future version. Use Use ElasticsearchStore class in langchain-elasticsearch package instead. ✅
 
3. UserWarning: ElasticVectorSearch will be removed in a future release. SeeElasticsearch integration docs on how to upgrade. ✅

3.1 - Para instanciar um vector do Elastic sempre é necessário anexar uma estratégia de embedidgs que ele irá executar para analisar as documentações e responder conforme elas, e no nosso caso sempre era passado a OpenAIEmbeddings porém faz um bom tempo que o langchain os seus pacotes, agora temos langchain_openai, langchain_elasticsearch, langchain_community…

E por isso foi alterado a lógica do Embedding, aonde ele faz parte de um pacote especifico da OpenAI, a sua implementação no geral não foi alterado e até deu suporte a passar a chave da openai_api_key como parâmetro (aonde antes não era possível).

Code Block
 from langchain_openai import OpenAIEmbeddings

# Por default usa o modelo de embedding: text-embedding-ada-002
# Por default o tamanho da chunck é 1000 (O qual é usado hoje nas estratégias de embedding)
embedding = OpenAIEmbeddings(openai_api_key=openai_api_key)

# ... 

3.2 e 3.3 - O mesmo aconteceu com o ElasticVectorSearch, ele saiu do pacote inicial do elastic, aonde antes uma única lib do elastic dava suporte a toda estrutura, e agora é divida em submódulos, no geral essa refatoração teve mudanças em seus principais métodos e estrategias, mas ainda mantém sua função principal como vector.

Code Block
  from langchain_elasticsearch import ElasticsearchStore
 import elasticsearch
 
 # Outra coisa que foi alterada nesse sentido foi que agora instanciamos uma conexão do elasticsearch de forma convencional
 # E só depois passamos para o vetor como parametro
 # Anteriormente o próprio vetor cuidava da conexão
 es_client= elasticsearch.Elasticsearch(
        hosts=elastic_full_url
)

# Aqui em si ele mantém a mesma lógica no geral, recebendo um index de contexto, estratégia de embedding
# Mas o seu uso mudou muito daqui para frente
# https://api.python.langchain.com/en/latest/vectorstores/langchain_community.vectorstores.elasticsearch.ElasticsearchStore.html
# Por padrão utiliza a estratégia ApproxRetrievalStrategy
# Mas pode ser alterada para ExactRetrievalStrategy, ApproxRetrievalStrategy, or SparseRetrievalStrategy.
elastic_vector_search = ElasticsearchStore(
        es_connection=es_client,
        index_name=index,
        embedding=embedding
) 

E uma principal mudança no ElasticserachStore, foi que agora após instanciar ele é possível fazer os embeddings utilizando ele mesmo através do método add_documents}}ou {{aadd_documents, aonde a única diferença entre eles é que um trabalha de forma síncrona e outro de forma assíncrona. Após essa implementação do langchain podemos utilizar o ElasticsearchStore para auxiliar na criação dos embeddings facilmente. Aqui está um exemplo aonde peguei um arquivo de texto e fiz o embedding em um índice específico utilizando as novas documentações.

Code Block
 from langchain_text_splitters import CharacterTextSplitter
import elasticsearch
from langchain_openai import OpenAIEmbeddings
from langchain_elasticsearch import ElasticsearchStore

with open("windows.txt", encoding="utf-8") as f:
    windows_manual = f.read()

text_splitter = CharacterTextSplitter(
    separator="\n\n",
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
    is_separator_regex=False,
)

metadatas = [{"document": "windows.pdf"}]

docs = text_splitter.create_documents([windows_manual], metadatas=metadatas)


es_client = elasticsearch.Elasticsearch(
    hosts=elastic
)

embedding = OpenAIEmbeddings(openai_api_key=openai_api_key)

elastic_vector_search = ElasticsearchStore(
    es_connection=es_client,
    index_name=index,
    embedding=embedding
)

elastic_vector_search.add_documents(docs)

# Em poucas linhas uma estratégia de embedding muito útil 

TECD-2305

0

Mudar segurança das API's VsEmbedding VsApi

1.Menu

VsAPI → Segurança

2.Objetivo

Alterar parte de segurança da API

3.Alteração

Foi retirado todo e qualquer tipo de autenticação que havia dentro da api

TECD-2324

VsIA Api - Criar sistema de memória interno dentro do langchain com elasticsearch

1.Menu

VsIA Api → Histórico de Mensagens

2.Objetivo

Criar um fork de uma biblioteca que já faz integração com histórico de chats com langchain e elasticsearch

3.Alteração

Nesse sentido foi verficado que a biblioteca do elasticsearch atendia parcialmente nossas demandas, logo foi realizada uma adptação e refatoração do código deles para conseguir servir a nossa demanda. O langchain possui o método ElasticsearchChatMessageHistory que se trata de uma classe que faz a criação de uma conexão com o elasticsearch e além disso é possível adicionar mensagens e visualizar as mensagens no histórico.

Mas para o nosso uso nós precisávamos conseguir odernar as mensagens, além disso limitar a quantidade delas. Por isso foi criado realizado as modicações no ElasticsearchChatMessageHistory e agora ele é o VsApiChatMessageHistory.

Métodos:

Code Block
 def teste():
    # Para instaciar o método preciamos inserir algumas informações
    # Nesse caso temos que colocar a url, username, password do servidor do elastic
    # E também temos que passar o index (Indice que irá armazenar o histórico) 
    # e o session_id (que se trata da memoria do usuario naquela especifica sessão/chat)
    history = VsApiChatMessageHistory(
        es_url=url,
        es_user=username,
        es_password=password,
        index=index,
        session_id=session_id
    )

    # Também podemos adicionar uma mensagem humana, que no caso seria o input do usuario
    history.add_human_message("Olá me chamo Lucca")

    # E também podemos adicionar uma mensagem de IA, que seria a resposta do bot
    history.add_ia_message("Olá Lucca, como posso te ajudar?")

    # Através desse método conseguimos descrever se queremos a ordem das mensagens de forma
    # crescente ou decrescente, e também podemos limitar a quantidade de mensagens que queremos
    # deve ser usar desc para ordem decrescente e asc para ordem crescente
    last_four_messages = history.messagesLimitedBy('desc', 4)

    # E temos um método que retorna as mensagens de forma alternada
    # Dessa forma sempre teremos human, ia, human, ia, human, ia...
    order_messages = history.alternate_messages(last_four_messages) 

TECD-2329

0

VsIA Api - Confeir as versoes do OpenAI considerando as versões compatíveis com o langchain

1.Menu

VsIA Api → OpenAI

2.Objetivo

Verificar versão da OpenIA

3.Alteração

Anteriormente nas versões do langchain tínhamos que fazer um combinado entre a versão do langchain com a versão da OpenIA para que as bibliotecas pudessem funcionar corretamente em conjunto.

Mas parece que dentro dessas novas versões do langchain o próprio langchain criou um pacote nele mesmo para fazer a gestão das versões e chamadas com a OpenIA.

Code Block
>> langchain==0.2.5
>> langchain-openai==0.1.9

No caso ao baixar através do pip install langchain ele já puxara a latest da openai juntamente com ele, ou seja não precisa de implementações e grande pesquisa para funcionar.

TECD-2480

0

Problema ao Criar Varios Filtros e Separa em Guias no Vsrel

1.Menu

VsRel - Gerador de relatórios

2.Objetivo
Ajustar o tamanho do formulário de filtros, quando o mesmo possui várias guias de filtros.

3.Alteração
Realizada a correção na lógica que calcula o tamanho da tela em função da quantidade de filtros. Agora o sistema irá identificar a guia que contém mais filtros para saber calcular o tamanho correto do formulário

TECD-2077

Webhook - Criação da comunicação reversa Webhook -> Cliente

1.Menu

Webhook Assistente Meta

2.Objetivo

Criação de rotas para o caminho reverso Webhook → Client

3.Alteração

A rota POST no /webhook foi criada com o intuito dessa comunicação recebendo um objeto chamado "mesages" que deve ser processado dentro do Assistente:

Code Block
 @api.post("/webhook")
async def whatsapp_webhook(request: Request):
    try:
        body = await request.json()

        # https://developers.facebook.com/docs/whatsapp/cloud-api/webhooks/payload-examples#text-messages
        if 'entry' in body and isinstance(body['entry'], list) and body['entry']:
            if 'changes' in body['entry'][0] and isinstance(body['entry'][0]['changes'], list) and body['entry'][0]['changes']:
                if 'value' in body['entry'][0]['changes'][0] and 'messages' in body['entry'][0]['changes'][0]['value'] and isinstance(body['entry'][0]['changes'][0]['value']['messages'], list) and body['entry'][0]['changes'][0]['value']['messages']:
                    if 'metadata' in body['entry'][0]['changes'][0]['value'] and 'phone_number_id' in body['entry'][0]['changes'][0]['value']['metadata']:
                        phone_number_id = body['entry'][0]['changes'][0]['value']['metadata']['phone_number_id']
                        from_number = body['entry'][0]['changes'][0]['value']['messages'][0]['from']
                        message_body = body['entry'][0]['changes'][0]['value']['messages'][0]['text']['body']
                        res = await verify_message_owner(phone_number_id, from_number, message_body)

    except Exception as e:
        print(e)

    return JSONResponse(content="", status_code=200) 

Ele faz uma verificação para ver a mensagem é uma mensagem de texto que se encaixa dentro das mensagens de payload-examples da própria documentação da meta e logo após isso faz a seguinte rota:

→ Requisição dentro do Redis para verificar o pertencente do phone_number_id

→ Login no Orion para pegar o access_token

→ Requisição para o Assistente para verificar se tem alguma resposta válida para o número solicitante

→ Assistente irá enviar uma requisição direta para o webhook para continuar o fluxo comum

Além disso é necessário que seja feito uma configuração de resposta dentro do plataforma Meta:

image-20240503-121130.pngImage Removed

Configurar uma URL de retorno de chamada e um token verificador, além disso também é necessário configurar os campos do Webhook nas versão v19.0

TECD-2136

Verificar motivo no conversation de estar recebendo respostas em dobro

1.Menu

Webhook Assistente Meta

2.Objetivo

Verificar motivo do Assistente estar repetindo mensagens

3.Alteração

Foi verificado que o Assistente de Personalizações estava repetindo todas as mensagens conforme o print abaixo:

image-20240509-140450.pngImage Removed

E como foi verificado na

Jira Legacy
serverSystem Jira
serverIda5c9f197-a7aa-3a3e-91c5-85e0279c94e6
keyTECD-2135
a meta sempre irá enviar a requisição para todos os webhooks configurados não importando o aplicativo. E acontecia o seguinte cenário:

image-20240509-141441.pngImage Removed

Como as duas API, tanto a Blue como a Red estavam configuradas no mesmo link de webhook as duas batiam e eram respondidas já que ambas eram direcionadas a aplicações igual (Orion).

Logo a solução será o seguinte, quando tivermos mais de um número dentro de uma mesma conta meta elas deverão utilizar links diferentes, nesse caso uma está configurada no /webhook e outro no /webhook2

image-20240509-141812.pngImage Removed

TECD-2135

Verificar motivo de sempre estar recebendo POST de outros números cadastrados na mesma conta VIASOFT

1.Menu

Webhook Assistente Meta

2.Objetivo

Verificar motivo de estar recebendo POST de outros aplicativos dentro do meta

3.Alteração

Foi verificado que isso se trata de um comportamento padrão da Meta, todo número cadastrado dentro da plataforma está ligada a todos os aplicativos os quais tem permissão (mesmo que não seja necessariamente o número principal do aplicativo).

Fonte: https://stackoverflow.com/questions/77766798/meta-cloud-api-is-triggering-every-webhook-for-multiple-apps

Esboço de forma de funcionamento:

image-20240509-113421.pngImage Removed

TECD-2038

Analisar e Implementar Banco de Dados e Cache para Webhook

1.Menu

Webhook Assistente Meta API

2.Objetivo

Implementar banco de dados de cache para poupar tempo entre requisições e manter salvo a url para responder parte da conversation

3.Alteração

Para implementar de banco de dados foi utilizado o Redis, pelo fato da sua fácil instalação, utilização e a praticidade que traz um banco NoSQL. No caso do webhook temos uma classe que funciona como um gerenciador do Redis, apresentando métodos de update (com possível tempo de expiração), get, delete e etc.

A sua utilização se dá pelo fato do fato de termos que mandar update de resposta para a api do Assistente que ficará dentro do Orion, e para isso precisamos fazer login dentro da platafaorma e precisamos de dados como: URL do Orion, Usuário Administrador e Senha do Administrador. Essas informações ficaram salvas após a primeira a requisição e serão atualizadas caso necessário. Além disso como é necessário fazer o login no Orion sempre a cada update necessário, foi desenvolvido métodos que armazenam o access_token do Orion por um tempo de validadade dentro das diretrizes do OAuth , e tempo as senhas são armazenadas dentro da criptografia que o Orion utiliza.

Guia de documentação do Redis utilizado: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-windows/

Code Block
 # Schema NoSQL
'''
    phone_number_id -> orion_url||admin||senha

    webhook||phone_number_id -> webhook_url

Usando double pipe como separador
''' 

TECD-2134

Forma de cadastro da API já saber o endereço caso seja apenas conversation

1.Menu

Webhook e Viasoft Assistente

2.Objeitvo

Criar Rotas para comunicar inicialmente antes de qualquer interação possível para que o webhook saiba qual rota deve responder

3.Alteração

Foi criado primeiramente uma rota dentro do Webhook para que ela faça o salvamento das informações inciais e já validar se a conexão com o Orion vai funcionar corretamente.

POST /assistente/configuration

Body:

Code Block
 {
  "config": {
    "phone_number_id": "string",
    "token": "string",
    "webhook_url": "string",
    "verify_token": "string",
    "orion_url": "string",
    "orion_user": "string",
    "orion_pass": "string"
  }
} 

E requer uma authorization basic fixa que está dentro de ambos projetos, Webhook e Assistente Meta.

E dentro do Assistente, foi criado um botão dentro do modal de configurações, aonde quando apertado faz uma request sincrona, aonde já devolve ali mesmo um alerta se a configuração foi feita com sucesso ou se ocorreu algum erro interno, ou até mesmo algum erro de configuração. Lembrando que é importante preencher todos os campos antes de apertar o botão. E o botão pode ser apertado quantas vezes for necessário, afinal não cria registros novos apenas atualiza os já existentes.

image-20240514-195135.pngImage Removed

TECD-2036

Estudo de quais rotas utilizar no Webhook considerando a api da meta, versão da api e outros parâmetros

1.Menu

Webhook WhatsApp Meta API

2.Objetivo

Verificar melhor versão de api para utilizar e quais rotas de mais fácil utilização

3.Alteração

Para integração foi utilizado a mais nova versão atualmente da api v19.0

https://developers.facebook.com/docs/whatsapp/cloud-api/reference/messages#mensagens-de-texto

Exemplos de body ja formatos em python que estão sendo utilizados na API:

Code Block
 ## Body para imagens
return {
            "messaging_product": "whatsapp",
            "recipient_type": "individual",
            "to": f"{from_number}",
            "type": "template",
            "template": {
                    "name": f"{type.replace('-', '_')}",
                    "language": {
                        "code": "en"
                    },
                "components": [
                    {
                        "type": "header",
                        "parameters": [
                                {
                                    "type": "image",
                                    "image": {
                                        "link": f"{unquote(file_link)}"
                                    }
                                }
                            ]
                    },
                    {
                        "type": "body",
                        "parameters": [
                            {
                                "type": "text",
                                "text": f"{content}"
                            }
                        ]
                    }
                ]
            }
        } 

Além disso foi criados métodos que leem o objeto MessageContainer vindo do Java e divide as informações entre body, link e headers para serem enviado para a Cloud Meta API.

TECD-2037

Continuar o tratamentos de sucesso/erro no Webhook

1.Menu

Webhook → Assistente Meta Api

2.Objetivo

Criação de padrão de resposta para erros e respostas coerentes vindo da api meta e outros possíveis erros de comunicação

3.Alteração

Primeiramente foi criado um código que analisa o comportamento da resposta vindo da api da meta conforme a tabela oficial de erro de deles, dessa forma é pego o código do erro e o erro que vem em Inglês e bate no código e traz uma resposta em português do erro, formas de solução e tudo mais.

Caso também a resposta for positiva ela passa por uma analise para verificar se realmente foi positiva e retorna.
Documentação: https://developers.facebook.com/docs/whatsapp/cloud-api/support/error-codes/

A resposta se baseia em duas principais formas, aonde ambas mostram a resposta individual por id de todas as mensagens enviadas pelo array dentro do body, e além disso caso aconteça outro erro de comunicação no redis, orion ou na api da meta.

O status é como é definido se o disparo deu certo (accepted ou rejected), exemplo:

Code Block
 {
    "1": [
        {
            "status": "accepted",
            "meta_response": {
                "messaging_product": "whatsapp",
                "contacts": [
                    {
                        "input": "42999611684",
                        "wa_id": "554299611684"
                    }
                ],
                "messages": [
                    {
                        "id": "wamid.HBgMNTU0Mjk5NjExNjg0FQIAERgSOUU3MzdDRThGMUIwMzMxNkUzAA=="
                    }
                ]
            }
        }
    ],
    "2": [
        {
            "status": "accepted",
            "meta_response": {
                "messaging_product": "whatsapp",
                "contacts": [
                    {
                        "input": "42999611684",
                        "wa_id": "554299611684"
                    }
                ],
                "messages": [
                    {
                        "id": "wamid.HBgMNTU0Mjk5NjExNjg0FQIAERgSMDg5QkQ5RkE5RTQ5OTJBN0NDAA=="
                    }
                ]
            }
        }
    ]
} 

TECD-2104

Fintech - Avaliar endpoints que envolvem geração de boleto para que retornem as inconsistencias para o consumidor

1.Menu
API fintech para emissão de boletos.

  1. Objetivo

Atualmente quando a tecnospeed rejeita o boleto não está retornando no corpo da requisição a mensagem adequada para que o integrador saiba o motivo do qual o boleto não foi gerado.

3.Alteração
Realizado ajuste no micro serviço fintech-pix-service na classe TecnospeedApi.java para realizar a leitura e tratamento correto do retono de falhas gerados pela TecnoSpeed.

TECD-2094

Erro validação IntegradorKey do VsHub PRCompensados

1.Menu
Assistente Launcher

2.Objetivo
Realizar atualização para a última versão da API wwebjs que o Assistente do Orion utiliza.

3.Alteração
Realizada correção no serviço ServerTEC OKE para validar corretamente o IntegradorKey

TECD-2259

Gravar o log dos registros de exclusões na Auditoria ElasticSearch e Consultar Conteúdo Antigo 2

1.Menu
Auditoria

2.Objetivo
Permitir auditar os valores dos registros que foram excluídos, e também gravar o valor anterior dos registros que foram alterados.

3.Alteração
Alteramos a API do assistente para a última versão lançada e estável.

TECD-2105

Campo Data nos registros de auditoria gerados pelo TMS está sendo enviado para fila vazio

1.Menu
Auditoria

2.Objetivo
Realizar correção para que os softwares viasoft enviem o campo data no json enviado para auditar, com isso caso registros sejam auditados no dia seguinte devido algum problema na auditoria, a data da ação realizada pelo usuário será gravada corretamente.

3.Alteração
Realizada correção nos sistemas TMS para enviar corretamente a data e hora da ação que está sendo auditada para o ActiveMQ.

TECD-2100

WebChat no ERP novas melhorias.

1.Menu
Barra de botões do menu principal.

2.Objetivo
Melhorias visuais no comportamento do chat bot.

3.Alteração

  • Alterado a imagem do ícone do chat bot quando está ativo para um tom de verde.

  • Implementado para que a janela do chat quando nimizada fique totalmente oculta para o usuário, sendo assim o mesmo precisa utilizar novamente o botão do chat bot para restaurar a janela.

TECD-2296

NAOTEM

Novo controle de cache para dicionário de dados e redução de consumo de API's do server

1.Menu
Cache de dicionário de dados para aplicações TMS

2.Objetivo
Realizar a revisão da implementação feita pelo time do construshow, bem como realizar correções e melhorias.

3.Alteração
Realizada revisão, correções e melhorias no cache do dicionário. Também foram removidas as diretivas VsCache e substituído por XDATA, o seja, toda aplicação XDATA por padrão irá utilizar o novo cache.

TECD-2157

WebChat adequações para liberação a clientes.

1.Menu
Chatbot de atendimento com IA

2.Objetivo
Melhorias de usabilidade.

3.Alteração

  • Implementado novo parâmetro no serverTec para definirmos se o ChatBot será apresentado para todos os usuários ou apenas supervisores. Inicialmente o padrão ficou definido para apresentar apenas para supervisores.

  • Implementado para que o chatbot encaminhe algumas variáveis de contexto para o chatbot, como por exemplo: (tenantId, Nome da empresa, Estabelecimento Logado, Nome do Estabelecimento, CNPJ do estabelecimento, Nome Usuário, UserId, e-mail do usuário, Tipo do Usuário, Auditoria Ativa, Módulo).

  • Implementado uma validação manual da existência da DLL WebView2Loader_x86, caso a mesma não exista no ambiente do usuário, será apresentada uma mensagem amigável.

  • Implementado uma validação da verificação da instalação do WebView, caso o mesmo não esteja instalado será apresentado uma mensagem amigável, bem como uma documentação para que o usuário consiga instalar a ferramenta, melhorando sua experiência com o uso do ChatBot.

  • Implementado para que o chatbot salve o histórico de conversa salvando os dados em cookies.

TECD-2210

Estudar possibilidade de substituir Sentry por Elastic com Kibana

1.Menu
Coleta de erros Sentry.

2.Objetivo
Encontrar uma alternativa ao uso do Sentry para coleta de logs de erro que não tenha custo.

3.Alteração

  1. Realizada implementação de um novo service que será responsável pelo envio dos logs de erro em um novo índice do ElasticSearch.

  2. Criado um novo Model estruturado e padronizado para gravar os logs.

  3. Criado um novo painel de filtros no Kibana para visualização e filtro dos erros.

TECD-2507

0

Inconsistência » Comportamento indevido ao trabalhar com Nested Dataset na arquitetura TMS

1.Menu
Core TMS

2.Objetivo
Atender uma demanda específica do Agrotitan onde utiliza-se nested dataset com auto relacionamento (mesma tabela).

3.Alteração

  1. Realizada correção para que em casos onde existe NestedDataSet e não tem nome do provider, que seja utilizado o nome da Query como base para tentar encontrar o nome do provider no qual foi registrado o SQL.

  2. Criado o método TDeltaService.RegistrarNestedTableName('qrTeste', 'PDUPPAGA') para permitir registrar um nome de tabela específico para um determinado nome de Field do tipo TDataSetField utilizado quando usa-se NestedDataSet.

TECD-2342

0

Melhoria nas mensagens usando RemoteDB no TMS

1.Menu
DmConexao.CDSApplyUpdates do RemoteDB

2.Objetivo
Corrigir para quando usar o método DmConexao.CDSApplyUpdates para gravação de dados, caso ocorra alguma erro no banco que este erro seja apresentado corretamente para o usuário. Atualmente é apresentado apenas uma mensagem genérica de erro.

3.Alteração
Após analise, descoberto que o problema está no uso do Middleware de logging, conforme sugestão do suporte TMS é necessário setar a propriedade LogExceptions para False.

TECD-2083

Fintech - Refatorar chamadas de "gerarBoleto" para que não precisem parâmetros na url

1.Menu
fintech-pix-service = micro serviço para geração de boletos.

2.Objetivo
Atualmente algumas APIs para geração de boleto/cobrança necessitam que seja enviado dois parâmetros (IntegradorType e Direct). A ideia é que não seja mais necessário os mesmos, pois a inteligência do micro serviço deve possibilitar que este controle não fique na mão de quem esteja integrando com a Fintech.

3.Alteração
Criado uma nova tabela chamada assignor_bank_slip_mode, nesta tabela o time da fintech pode definir entre utilizar a tecnospeed ou alguma outra integração direta com o banco no momento de gerar boletos. Como a mesma não está alimentada no momento, o padrão sempre será utilizar a tecnospeed. Mas futuramente será possível definir alguns cedentes específico para uso de outro tipo de integração.

TECD-2231

Criar dashboard de estatísticas de bugs no kibana

1.Menu
Kibana

  1. Objetivo

Possuir um painel para visualização de algumas estatísticas dos logs de erros dos ERPs.
  1. Alteração

Criado dashboard no kibana com algumas estatísticas de logs de erro como:.
  • Top erros.

  • Top clientes com erros.

  • Gráfico de percentual de erros por versão.

TECD-2621

654373

Erro de RemoteDB ao tentar salvar um consulta personalizada no Person

1.Menu
Menu Tabela >> Consultas Personalizadas

2.Objetivo
Realizar correção do problema que está ocorrendo ao tentar alterar uma vsconsulta qualquer.

3.Alteração
Realizada correção do erro de SQL que apresenta na descrição da tarefa ao tentar alterar uma VsConsulta personalizada.

TECD-2080

Fintech - Implementar microserviço de "migration" para Fintech semelhante a "database" do Filt e CRM

1.Menu
microserviços fintech.

2.Objetivo
Criar microserviço responsável pelo controle de versionamento do banco de dados.

3.Alteração

  • Criado novo microserviço chamado fintech-database que está disponível no repositório git (https://bitbucket.org/viasoftnimitz/fintech-database/src/main/ ).

  • Este microserviço trabalha atualmente com dois profiles (fintech e consignado), de acordo com o profile ativo será utilizado para identificar quais scripts de banco serão aplicados.

  • Nos resources do microserviço contém uma pasta para cada profile, onde devem ser adicionados os respectivos scripts de alterações do banco, conforme imagem.

image-20240426-191622.pngImage Removed

TECD-2400

0

Aumentar complexidade de criptografia definida em TECD-2297

1.Menu
Nova criptografia de senhas

2.Objetivo
Utilizar uma senha mais forte para gerar um MD5 que não seja capaz de ser descriptografados utilizando sites com esta funcionalidade.

3.Alteração

  • criado o novo fonte uMD5EncryptViasoft.pas, neste fonte possui o método MD5Senha que agora é usado para criptografar a senha que será armazenada no banco.

  • Recompilado os projetos da tecnologia na branch feature/TECD-2297.

  • Revisado todos os fontes que antes estavam usando a funcao MD5Xe para agora usar a função MD5Senha

  • OBSERVAÇÕES: Com esta alteração os clientes em TMS que fazem integração serão afetados, atualmente os clientes enviam a senha criptografada com MD5, a partir de agora deverão enviar a senha sem criptografar em MD5.

TECD-2180

Melhorias novo licenciamento

1.Menu
Novo Licenciamento

2.Objetivo
Melhorias no processo migração do novo licenciamento e melhorias no horário de sincronização com a base central.

3.Alteração

  • Implementado no script inno do serviço de licenciamento uma validação para evitar que o mesmo seja instalado em um local diferente da instalação do serviço desenvolvido pela Korp, isso se faz necessário para que em uma atualização utilize as mesmas configurações definidas no arquivo .json do antigo licenciamento.

  • Melhorias no horário de sincronização, atualmente estava desenvolvido para sincronizar diariamente às 08:00. Foi ajustado para que a sincronização continue após às 08:00 porém em minutos randomicos, evitando que todos os clientes sobrecarreguem o nosso serviço back-end.

  • Realizadas implementações no script Inno de testes do RH para que o próprio atualizador do RH atualize automaticamente o licenciamento Korp pelo licenciamento Viasoft.

TECD-2223

Melhorias novo licenciamento debatidas em reunião com Cesar e Sérgio

1.Menu
Novo licenciamento desenvolvido pela Viasoft.

2.Objetivo
Realizar implementações sugeridas em reunião com equipe interna.

3.Alteração

image-20240531-124233.pngImage Removed
  1. Implementado um novo controle adicional quando o sistema está próximo do vencimento, porém por algum motivo o serviço de licenciamento não está sincronizando com a central da Viasoft. Quando ocorrer esta situação, será adicionado sete dias na validade original do sistema, e também será apresentada uma mensagem diferente ao usuário, deixando o mesmo ciente de que além de estar próximo do vencimento, o serviço de licenciamento não está sincronizando com a cetral.

  2. Implementado um novo Alerta de monitoramento via Jenkis + discord que verificará a data/hora de última sincronização do cliente HomePage. Caso esta hora seja superior a 12 horas será gerado um novo alerta no discord, pois possívelmente tivemos falha na sincronização.

  3. Implementado na listagem de usuários conectados (apenas para novo licenciamento esta função irá funcionar) para verificar a origem do último consumo de licença.

  4. Implementado controle de auditoria na tela de gerenciamento de licenças, caso o usuário supervisor realize alterações, serão gravadas as auditorias na central da Viasoft.

TECD-2081

Fintech - Refator classes "service" que possam estar gerando erros simplesmente pela forma que foram implementados semelahnte a TECD-2048

1.Menu
projetos fintech e consignado

2.Objetivo
Realizar revisão e refatoração nos projetos fintech e consignado para encontrar situações onde os services armazenam estado com variáveis private. Como o padrão do spring é utilizar Services do tipo Singleton isso pode gerar problemas sérios no uso de vários clients concorrentes.

3.Alteração
Revisado os Services, no projeto fintech não foram encontrados ajustes a serem realizados, já no projeto consignado foram necessárias algumas refatorações

TECD-2198

Erros em tabelas inexistentes

1.Menu
Refatoração de fontes

2.Objetivo
Evitar problemas para algumas verticais devido a não utilização de algumas tabelas.

3.Alteração

  • Removido o método DoGetSistemaHoraTrab da uSistemaControle.pas pois nenhuma vertical faz uso.

  • Refatorado na Viasoft.Server.Data.BaseDao.pas o método RetornarDataHoraCorrigidaFuso para evitar gerar erro em sistemas que não tem a tabela PEMPRESA.

  • Também foi criada a possibilidade das verticais parametrizar a tabela de fuso horário por estabelecimento para que o código da tecnologia seja genérico para qualquer vertical.

TECD-2632

0

Replicar commit de correção de carregar fundo do sistema para 2024.06

1.Menu
Replicação de commit solicitado

2.Objetivo
Replicação de commit solicitado

3.Alteração
Replicação de commit solicitado

TECD-2199

Version Manager - Implementar validação por data de liberação.

1.Menu
Servidor Rest da tecnologia

2.Objetivo
Permitir programar o lançamento de versões, e que estas versões somente sejam disponibilizadas aos usuários quando chegar na data de lançamento.

3.Alteração
Implementado na API /tecnologia/VersaoService/PesquisaVersoesDisponiveis para retornar apenas versões com data de lançamento infeior ou igual a data atual.

TECD-2391

629862

Sincronização Inteligente parou de funcionar

1.Menu
Sincronização inteligente

2.Objetivo
Corrigir erro de conexão com o a base postgres que fica hospedada na cloud, pois esse é o motivo da falha na sincronização dos dados.

3.Alteração
Realizada correção adicionando uses do driver dbExpress postgres

TECD-2127

Não consumir licença no método de listagem de usuários utilizando licença

1.Menu
Tela de login

2.Objetivo
Permitir utilizar a tela de listagem de usuários consumindo licenciamento seja utilizada sem necessidade de consumir novas licenças.

3.Alteração
Atualmente na tela de login existe uma opção para permitir fazer a listagem dos usuários que estão consumindo licenciamento, porém para isso o sistema irá consumir uma licença. Então foi alterado para que esta funcionalidade não consuma licença.

TECD-2024

Melhorias monitor de conectividade

1.Menu
Tela de Login >> Outras Opções >> Teste de Conectividade

2.Objetivo
Melhorar os logs informativos para o usuário, dando dicas de onde pode estar o possível problema.

3.Alteração
Realizada alterações na tela de testes de conectividade, com dicas ao usuário caso algum dos testes apresente falha.

TECD-2430

633483

Relatório de Direitos de Acesso listando informações de módulos não filtrados.

1.Menu
Viasof >> Configurações>> Direito de Acesso >> Relatório de direito de acesso

2.Objetivo
Realizar a correção para filtrar por módulo a listagem dos acessos dos menus

3.Alteração
Realizada correção para respeitar o filtro por módulo na listagem dos acessos ao menus

TECD-2264

Alterar logs do Nginx no NGINX-1 e NGINX-2 da Cloud 2.0 para gravar por dia avaliar se pode ser configurada regra de contenção

1.Menu
VMs nginx cloud 2.0

2.Objetivo
Permitir armazenar logs diários e excluir o log atual.

3.Alteração
Realizado ajuste e configuração no logrotate do linux para realizar o trabalho de rotação de logs do nginx

TECD-2230

Separar campos dos logs enviados de erros do ERP no Elastic

1.Menu
VsAuditoriaConsumer

2.Objetivo
Criar novas colunas ao armazenar os logs de erros para facilitar a filtragem dos dados.

3.Alteração

Criado novos campos na Entity LogErro. Estes campos serão alimentados com base em alguns padrões de tags que já são enviados no JSON gerado pelo MadExcept

Code Block
    private String usuario;
    private String empresa;
    private String empresaCnpj;
    private String tenantId;
    private String nomeExecutavel;
    private String ip;
    private String nomeComputador;

TECD-2233

VsNews não consumir licenciamento

1.Menu
VsNews - controle de notícias exibidas no topo do menu dos sistemas em Delphi.

2.Objetivo
Não consumir licenças de usuário caso o sistema esteja aberto sem utilização pelo usuário.

3.Alteração
Realizadas implementações nos fontes de controle do VsNews e nos fontes de gravação e leitura de registros no banco (BibRegDB). Agora estes fontes não realizam o consumo de licenças ao acionarem o servidor de aplicação para realizar consultas/gravações

TECD-2116

Instanciar vs-object-storage para CRM

Sobre o bucket de armazenamento

Foi criado na OCI no compartimento CRM um bucket específico para armazenamento de informações do CRM. A imagem abaixo exibe o bucket criado:

image-20240429-131956.pngImage Removed

Atenção: Ao bucket foi criada uma regra de ciclo de vida para que a cada 30 dias o arquivo armazenado ele seja excluído. Caso esse prazo precise ser maior ou menor, favor informar para que adaptemos conforme a necessidade. Caso seja necessário não ter controle de tempo é possível excluir a regra e os arquivos ficarão armazenados até que seja executado comando específico pedindo a deleção.

Sobre a instância do vs-object-storage

No OKE da tecnologia na OCI foi configurado e iniciado um novo pod e service específico para o CRM chamado vs-object-storage-crm.

Foi incluída uma nova entrada de DNS com a definição vs-object-storage-crm.viasoft.com.br apontando para o ip 144.22.218.121 para uso específico do CRM.

Dessa forma já está disponível o acesso ao bucket via object storage.

Segue aqui o arquivo json de collection do Postman para facilitar a compreensão e uso:

vs-object-storage-crm.postman_collection.json

Image Removed

Sobre segurança na comunicação.

Alguns EndPoints foram definidos com necessidade de passar um token do tipo “Bearer Token”. Para esses casos ficou fixo o token: XMTiZSz7hW7UHvJqBXjeEzxWBU1RMvN0URhwByPDf44Ytpv662f7ddd665c3

São os endpoints que precisam de token:

  • getUrl

  • uploadFile

  • deleteFile

  • afterScan

Explicando um pouco sobre os endpoints envolvidos:

  • POST /uploadFile: Sobe um novo arquivo para o bucket.
    Os parâmetros são definidos no Body como “form-data”.

São parâmetros necessários: “file” que seria o arquivo em si e “folder” que seria a estrutura no bucket que deseja que seja criado para esse arquivo. Por exemplo, se quiser pode ser definido uma estrutura de pastas com o identificador do cliente para separar arquivos por cliente.

No retorno do endpoint vem dois parametros a “url” que é temporária, para uso imediato, em alguns minutos ela fica inválida. E o “path” que é uma chave criada para futura consulta e baixa do arquivo. Esse “path” que deve ser armazenado para futura busca ou baixa do arquivo.
E ainda, o retorno do “mimeType” que pode ser utilizado caso seja útil em alguma situação.

Para exemplo, a sugestão é utilizar o collection do Postman em anexo.

  • GET /getUrl: Retorna uma nova “url” para baixa do arquivo conforme o “path” informado, essa “url” é temporária, funciona por alguns minutos.

O parâmetro necessário é o “path”.

  • GET /afterScan: Realiza o download do arquivo. Precisa que seja informado como parâmetro o “path” do arquivo.

  • DELETE deleteFile: Apaga o arquivo no bucket, sem permitir futura recuperação. Precisa que seja informado como parâmetro o “path” do arquivo.

TECD-2647

0

Ajustes no envio em massa de convites e Patrocínio de Ideia

.

TECD-2611

0

Oportunidades de Saving - Ações

.

TECD-2604

0

Custo TSPLUS

.

TECD-2603

0

Revisão das Tags, Item Recorrente

.

TECD-2602

0

Documentação do Padrão de Tags

.

TECD-2570

0

Apresentação Tech Talk

.

TECD-2569

0

Desenvolvimento do Boletim FinOPS

.

TECD-2568

0

Planilha de Custo Mensal - Agosto

.

TECD-2536

0

Criação de Paineis no Cost Gov

.

TECD-2535

0

Validação de Tags

.

TECD-2531

0

Controle de uso SKUs

.

TECD-2501

0

Padronização - Avaliar lint para Python

.

TECD-2498

0

Relatório Cost Gov

.

TECD-2489

0

Backup automatizado do MySQL-nimitz

.

TECD-2478

0

Criação de Cluster Kubernetes Gerenciado para o Ambiente Dev

.

TECD-2477

0

VPN do Ambiente Dev do CRM

.

TECD-2475

0

Oportunidades de Saving - Ações

.

TECD-2474

0

Custo Rateado

.

TECD-2467

0

Finalização do Boletim

.

TECD-2458

635592

Cloud Guard

.

TECD-2457

0

Relatório de Consumo APCL

.

TECD-2456

0

RevTelas - Aplicação das novas telas no projeto Agro3c - Parte 4

.

TECD-2451

635592

Oportunidades de Saving - Ações

.

TECD-2439

0

Desenvolvimento do Boletim FinOPS

.

TECD-2438

0

Planilha de Custo Mensal - Julho

.

TECD-2436

0

Relatório de Consumo TURIM

.

TECD-2427

0

Apresentação Padrão de Tags

.

TECD-2426

0

Validação Novo Padrão de Tags

.

TECD-2416

.

Atendimentos Dev Sprint 38

.

TECD-2408

 635592

Planilha Controle de Utilização

.

TECD-2405

0

Validação Novo Padrão de Tags

.

TECD-2404

0

Análise Redução de Usuários

.

TECD-2403

0

Fatura OCI

.

TECD-2401

0

Apresentação do Padrão de Tags

.

TECD-2397

0

FOLHA: Erro ao consultar a auditoria.

.

TECD-2388

572345

Custo Cliente

.

TECD-2385

0

Autenticação para cluster da VSIA

.

TECD-2382

0

Vs-object-storage para novo cluster da VSIA

.

TECD-2381

0

IA - Acompanhar e auxiliar desenvolvimento das requisições do Analytics para o serviço de Insights

.

TECD-2372

0

App H1 Fintech - Melhorar lógica para encontrar a chave PIX sendo ela válida como CPF e telefone

.

TECD-2370

0

Documentação do Padrão de Tags (Confluence e Alterações)

.

TECD-2363

0

Planilha de Custo Mensal - Junho

.

TECD-2362

0

Desenvolvimento do Boletim FinOPS

.

TECD-2361

.

Atendimentos Sprint 37

.

TECD-2358

0

Implementar Cluster Redis na OCI

.

TECD-2357

0

Implementar serviço de monitoramento e controle de acessos a API

.

TECD-2356

0

VSIA - Realizar testes e adequação do VSAPI

.

TECD-2355

0

Acompanhamento POC Zenvia - Parte 7

.

TECD-2354

0

IA - Desenvolver Serviço de Geração de Insights com Ia

.

TECD-2352

0

Atualização e compilação dos projetos do agro (continuação da TECD-2140)

.

TECD-2351

0

RevTelas - Aplicação das novas telas no projeto Agro3c - Parte 2

.

TECD-2350

0

Estruturas de Equipes e Organização de Tarefas em FinOps

.

TECD-2344

0

Atualizações do Faturamento em Cloud

.

TECD-2332

0

VsEmbedding - Dividir em serviços de uma rota de cosumo - Implementar serviço vsembedding-create-index

.

TECD-2318

Erro no applyUpdates usando servidor Datasnap do Agrotitan

.

TECD-2315

0

Promover Cultura FinOps

.

TECD-2313

0

Monitoramento de Custos

.

TECD-2311

Ajustes de compilação versão 2024.03

.

TECD-2309

Atendimentos Sprint 36

.

TECD-2306

Acompanhamento POC Zenvia - Parte 6

.

TECD-2303

0

IA - Analytics com insighs

.

TECD-2302

Gateway para IA (VsApi e VsEmbedding)

.

TECD-2301

Oke - Criar estrutura para IA (VsApi e VsEmbedding)

.

TECD-2300

Oke - Criar estrutura para PortalDoc

.

TECD-2298

0

Fintech - Subir nova versão do apk Android e iOS com a nova versão do extrato

.

TECD-2297

0

Mudar lógica de criptografia da senha dos usuários no ERP

.

TECD-2292

614950

Rotina Fluxo de Caixa não carrega adequadamente os filtros salvos

.

TECD-2276

Atendimentos Sprint 35

.

TECD-2275

Implantação Orion Turim na Cloud 2.0

.

TECD-2273

0

Carregar fundo dinâmico do ERP conforme TECD-2177

.

TECD-2272

Criar ambiente da Aplicação Satélite Construshow Portal do Cliente

.

TECD-2267

Inconsistência no sequencial ao copiar e colar cabeçalho de cobrança no sistema

.

TECD-2266

Remover bloqueio de data atrelado a data de validade do sistema

.

TECD-2263

Oportunidades de Saving - Ações

.

TECD-2262

Serialização de campos do tipo data, se comportando de forma diferente entre as arquiteturas TMS e DataSnap

.

TECD-2256

Implementar chamada para disparar processo de cópia dos direitos de acesso por vertical

.

TECD-2254

0

Documentação do Padrão de Tags

.

TECD-2253

Mapeamento de Tags na OCI Cloud

.

TECD-2252

Sinonimos das tabelas RBITEMHIST e VSCONSULTAHIST - Não foram criados

.

TECD-2249

Planilha de Custo Mensal - Maio

.

TECD-2246

IA - Criar um protótipo no Whatsapp para conversar com os dados do Analytics

.

TECD-2242

IA - Autopilot - Adicionar indicador de tickets com Desenvolvimento ao Painel

.

TECD-2241

Testes e ajustes novo licenciamento

.

TECD-2240

Acompanhamento POC Zenvia - Parte 5

.

TECD-2238

Adequar retenção dos logs no elastic, automatizando retenção de 7 a 15 dias no máximo usando Ansible

.

TECD-2237

Revisar todos containers para enviar logs no filebeat

.

TECD-2235

Revisar e detalhar containers que ainda não tenham opção de reinicio para passar a possibilitar reiniciar

.

TECD-2234

Ver como podemos tratar o acesso ao kibana via VPN

.

TECD-2232

0

Conta Digital - Exportar extrato em PDF

.

TECD-2228

FinAgro3C » Mismatch Datapatch em campo personalizado.

.

TECD-2227

Após atualização está modificando permissões de usuários.

.

TECD-2224

0

Compatiblizar VsScripter com Dev Express 23

.

TECD-2221

Auditoria pegando nome da tabela de forma errada

.

TECD-2211

Vs-object-storage permitir subir arquivo com nome pré-definido

.

TECD-2209

Erro envio do Certificado Digital - Portal de Docs

.

TECD-2204

Desenvolvimento do Boletim FinOPS

.

TECD-2203

ACPL - Controle de Custo

.

TECD-2201

Erro no tentar criar tabela personalizada pelo PERSON

.

TECD-2196

Desenvolver executável do para testar e as verticais utilizarem de exemplo de uso do PIX da H1 Fintech pelo componente ACBR

.

TECD-2194

Criar automação de deploy do JetPDV na Cloud 2.0

.

TECD-2193

Inconsistências na Rotina de Pesquisa Rápida

.

TECD-2192

Acompanhamento POC Zenvia - Parte 4

.

TECD-2191

Melhorias na Atualização com Versões Anteriores

.

TECD-2190

IA - Analisar e arquitetar a conexão com os bancos de dados MariaDB dos clientes que usam o analytics

.

TECD-2189

IA - Realizar o treinamento da Base usando os dados do Analytics

.

TECD-2188

Logs de containers do Orion, Analytics, CRM Agro e demais aplicativos satélites do Agrotitan disponíveis no Stream do Kibana

.

TECD-2184

0

Incompatibilidade na Abertura de Telas Entre Delphi XE7 e Berlin

.

TECD-2183

Automação da criação do ambiente Construshow Coletor

.

TECD-2178

Verificar a possibilidade de fazer Filter utilizando o campo personalizado no cds padrão da tela

.

TECD-2177

Mudar fundo dos ERP´s principalmente quanto a parte de redes sociais

.

TECD-2172

Revisar tag DEMO

.

TECD-2171

Atualização da Planilha Tags Tratadas

.

TECD-2170

Custo FORLOG

.

TECD-2169

Filt: Erro na criação de base de dados no microserviço gestao-empresa

.

TECD-2165

Mapear Custo

.

TECD-2163

Identificação da Tag X e Correção

.

TECD-2162

Erro ao solicitar proposta

.

TECD-2158

Melhorias FinOps

.

TECD-2155

Avaliar o Custo das Tags MC

.

TECD-2153

Indisponibilidade no ambiente de Homologação do Filt

.

TECD-2152

Custo 24/04

.

TECD-2151

Mapear o custo dos clientes rescindidos

.

TECD-2148

Logs de containers do DOCKERCONSTRU-01, dockerpetroshow-01, sl-vslb-integracaofiscal e integrafiscalgru-01 disponíveis no Stream do Kibana

.

TECD-2140

Atualizar commons DEV do Agrotitan para versão mais recente da tecnologia

.

TECD-2139

Acompanhamento POC Zenvia - Parte 3

.

TECD-2138

Opsgenie primeiros recursos da tecnologia com avisos de monitoramento

.

TECD-2137

Geração automática da imagem docker do Construshow Mobile

.

TECD-2132

VSREL: Erro ao emitir relatórios por dentro do módulo Folha.

.

TECD-2130

Manual para clientes de cadastros necessários na Meta para funcionamento da API do Whatsapp

.

TECD-2126

Construshow - Avaliar servidor de aplicação que acusa ameaça de vírus ao tentar fazer o download do arquivo pelo google drive

.

TECD-2125

Implementação VsMenuBaseDX como aplicação MDI

.

TECD-2124

CI/CD Filt - Verificar indisponibilidade dos pods nas atualizações

.

TECD-2120

Subir ambiente vsWhatsMeta

.

TECD-2114

Upgrade de memória no servidor oriongru-01 (Orion 1 - Cloud 2.0)

.

TECD-2110

PersonX - Salvando consulta personalizada com TIPO = U

.

TECD-2098

Ajustar AtClienFB para atualização de DDL automático

.

TECD-2095

VsObjectStorage carregando arquivos conforme formato

.

TECD-2089

Fintech - CI/CD conforme ambientes criados em TECD-2088

.

TECD-2088

Fintech - Implementar ambiente de Dev, Produção e Sandbox conforme adequação da TECD-2087

.

TECD-2079

Fintech - Alterar hospedagem de banco de dados oficial para um MySql autogerenciado com backup

.

TECD-2078

Estudo de micro-serviço Gateway - Parte 2

.

TECD-2075

Acompanhamento POC Zenvia - Parte 2

.

TECD-2073

Análise de metodologia e ferramenta de "insights com IA" por dentro do ERP - Parte 2

.

TECD-2070

Engenharia de Prompt para Padronização de Texto das Features (Gherkin e BDD)

.

TECD-2069

Implementação de Aplicação para Transcrição de Vídeo para Texto

.

TECD-2068

Após cadastrar certificado digital no VIASOFTX retorna KEY VIOLATION

.

TECD-2063

Conta Digital - Extrato

.

TECD-2060

Estudo de micro-serviço Gateway

.

TECD-2059

Passar a solicitar a senha do banco de dados e usar ela na criação do container de roteirizador na cloud 2.0

.

TECD-2055

Autenticação Usuário no Windows - Cadastro de Usuários

.

TECD-2053

Deploy do AgroMonitor na cloud 2.0 não está gerando o DNS corretamente

.

TECD-2052

O Sistema esta fechando ao abrir um Relatório, selecionar para enviar e-mail e posterior para realizar a impressão desse relatório. 

.

TECD-2050

Realizar correções na integração com da Matera

.

TECD-2045

582893,583344

BUSCA CEP NO CADASTRO DA PESSOA DANDO ERRO AO BUSCAR PELOS CORREIOS OU DEMAIS OPÇÕES QUE NÃO SEJA ‘VIACEP’

.

TECD-2032

Automatização da criação de imagens produtos web/mobile Construshow/Petroshow

.

TECD-2030

Estudar microserviços e o que temos na Fintech

.

TECD-2029

Estudar microserviços e o que temos na Fintech

.

TECD-2027

Bot para Implantação

.

TECD-2026

Acompanhamento POC Zenvia

.

TECD-2023

Estudar integração Zabbix com Opsgenie

.

TECD-2017

Erro ao Utilizar Funcionalidade de Sub-Consultas nas Consultas Padrões do Sistema

.

TECD-1990

IA - Autopilot - Disponibilizar interface para atendimento realizar manutenção em instruções de primeiro contato do cliente

.

TECD-1989

Análise de metodologia e ferramenta de "insights com IA" por dentro do ERP

.

TECD-1979

FOLHA: Melhoria nas auditorias.

.

TECD-1964

13/03/2024 - Viasoft_3C - Relatório de direito de acesso apresentando informações incorretas

.

TECD-1961

Configuração do certificado SSL na VM do CRM

.

TECD-1913

Limpar cache de vsconsulta após atualização de banco

.

TECD-1885

Conta Digital - Novas telas de extrato da conta PIX

.

TECD-1883

RevTelas - Aplicação das novas telas no projeto Agro3c

.

TECD-1839

Implementar o FieldName, o DataSet e a Chave do Grid no Ctrl + Shift + F7

.

TECD-1835

Avaliar mensagem de erro enviada ao Sentry se é algo a ser considerado como erro ou que deveria ser mais uma informação de log

.

TECD-1776

Criar parâmetros de login e senha para os executáveis Viasoft.

.

TECD-1699

Vulnerabilidade Segurança Produtos Delphi

1.Menu
Não se aplica
2.Objetivo
Como medida de segurança, nos ambiente de Oracle Cloud e TSPlus o sistema não irá realizar as chamadas de abertura de endereços da internet bem como a chamada ao envio de email (mailto) caso não exista um programa instalado e configurado para tal evitando assim a abertura de navegador da internet;
3.Alteração
Todos os executaveis clientes da Viasoft (não é necessários alterar os servidores), deverão incluir a unit uViasoftSecurityHandler no fonte do projeto e esta unit deve estar posicionada antes de qualquer outras unit da viasoft. Preferencialmente logo apos a unit ShareMem ou FastMM;
Exemplo:

image-20240503-171110.pngImage Removed

TECD-2012

Portal Documentos » Gravar o XML de todos os NSU devolvidos pelo SEFAZ

1.Menu
Não se aplica
2.Objetivo
Oferecer uma forma alternativa de busca de documentos no portal doc utilizando-se o NSU como base da consulta;
3.Alteração

Code Block
 {
    "Cnpj":"00000000000000", // CNPJ da empresa
    "Tipo":"NFE", // NFE ou CTE
    "Filtro": 0, // 0 - Os ultimos N NSU (usa o "valor"); 1 - Todos os NSU maior ou igual a "valor"; 2 - Apenas o nsu igual a "valor"; 3 - Chave igual a "valor"
    "Valor": "10",
    "Restric1":"540950960760950660860140750360750660460350550350250650860560960040450650550550960160750350850640450860", // Numero de Serie do certificado, criptografado
    "Restric2":"000250450950140350250910" // Senha do certificado, criptografado
} 

TECD-2056

VsScripter - Fornecer mais recursos do CxGrid parte 1

1.Menu
Não se aplica;
2.Objetivo
Disponibilizar no VsScript a possibilidade de acessar e alterar as propriedades relativas a cada tipo de coluna criada dinamicamente usando o TcxGridColuna;
3.Alteração
Utilizando se as units relacionadas a cadas tipo, será possível acessar as propriedades de cada tipo:

  • Unit : cxCheckBox para tipos Logicos(Boolean), tipo da propriedade TcxCheckBoxProperties;

  • Unit : cxTextEdit para tipos Texto(String), tipo da propriedade TcxTextEditProperties;

  • Unit : cxCalc para tipos Inteiro(Integer) e Numero (Float,Double), tipo da propriedade TcxCalcEditProperties;

  • Unit : cxCalendarpara tipos DataHora e Data, tipo da propriedade TcxDateEditProperties;

  • Unit : cxMaskEdittipos Hora, tipo da propriedade TcxMaskEditProperties;

  • Unit : cxButtonEdit para tipos ButtonEdit, tipo da propriedade TcxButtonEditProperties;

  • Unit : cxDropDownEdit para tipos Combo(Lista), tipo da propriedade TcxComboBoxProperties;

Segue exemplo de código:

Code Block
Uses
   Graphics, Controls, StdCtrls, CxGridCol, Menus, DB, 
   cxTextEdit, 
   cxCheckBox,
   cxCalc, 
   cxCalendar, 
   cxMaskEdit,
   cxButtonEdit,
   cxDropDownEdit;
                                                                           
var                            
   Coluna1   : TcxGridColuna;
   Coluna2   : TcxGridColuna; 
   Coluna3   : TcxGridColuna;
   Coluna4   : TcxGridColuna;
   Coluna5   : TcxGridColuna;
   Coluna6   : TcxGridColuna;                
   Coluna7   : TcxGridColuna;
   
   CheckProp      : TcxCheckBoxProperties;
   EditProp       : TcxTextEditProperties;                    
   CalEditProp    : TcxCalcEditProperties;                                           
   DateEditProp   : TcxDateEditProperties;
   MaskEditProp   : TcxMaskEditProperties;   
   ButtonEditProp : TcxButtonEditProperties;    
   ComboBoxProp   : TcxComboBoxProperties;
                                                                   
begin                                                  
   Coluna1 := TcxGridColuna.Create(FCustoParcela.ViewFormaPagamento, 'Boolean', 'Boolean', 0, 'FormaPgto');
   CheckProp := TcxCheckBoxProperties(Coluna1.Coluna.Properties);
                        
   Coluna2 := TcxGridColuna.Create(FCustoParcela.ViewFormaPagamento, 'Texto', 'Texto', 5, 'FormaPgto');
   EditProp := TcxTextEditProperties(Coluna2.Coluna.Properties);
                                                                   
   Coluna3 := TcxGridColuna.Create(FCustoParcela.ViewFormaPagamento, 'Inteiro', 'Inteiro', 5, 'FormaPgto');
   CalEditProp := TcxCalcEditProperties(Coluna3.Coluna.Properties);
                                    
   Coluna4 := TcxGridColuna.Create(FCustoParcela.ViewFormaPagamento, 'DataHora', 'DATAHORA', 5, 'FormaPgto');
   DateEditProp := TcxDateEditProperties(Coluna4.Coluna.Properties);
   
   Coluna5 := TcxGridColuna.Create(FCustoParcela.ViewFormaPagamento, 'Hora', 'HORA', 5, 'FormaPgto');
   MaskEditProp := TcxMaskEditProperties(Coluna5.Coluna.Properties);
   
   Coluna6 := TcxGridColuna.Create(FCustoParcela.ViewFormaPagamento, 'EditBotao', 'BUTTONEDIT', 5, 'FormaPgto');
   ButtonEditProp := TcxButtonEditProperties(Coluna6.Coluna.Properties);
     
   Coluna7 := TcxGridColuna.Create(FCustoParcela.ViewFormaPagamento, 'Combo', 'COMBO', 5, 'FormaPgto');
   ComboBoxProp := TcxComboBoxProperties(Coluna7.Coluna.Properties);
   
   // Exemplo de outras propriedasdes que podem ser acessadas
   Coluna7.Coluna.HeaderHint := 'Mouse sobre a coluna';   
   Coluna7.Coluna.VisibleForCustomization := False;
   Coluna7.Coluna.Options.Moving := False;
   
end;                                                                   

Link da documentação no Confluence:

Acessando as Properties de uma Coluna de grid

TECD-2096

Atalho F12 não está verificando a senha do usuário VIASOFT no AD.

1.Menu
Tecla F12
2.Objetivo
Permitir que o bloqueio do sistema efetuado ao acionar a tecla F12 também aceite o novo formado de login do usuario VIASOFT;
3.Alteração
Realizado o tratamento para que a tela de bloqueio aceite a combinação email|senha quando utilizado o usuario VIASOFT;

TECD-2168

Melhorias na fila de envio para o Sentry

1.Menu
Auditoria , VsAuditoriaConsumer e envio direto Sentry pelas aplicações Delphi

2.Objetivo
Não enviar erros duplicados para o Sentry devido ao limite de erros mensais que temos em nossa licença.

3.Alteração

  • Nas aplicações em java como VsAuditoria e VsAuditoriaConsumir foram criados estes novos parâmetros de configuração para permitir ativar o controle de duplicidade de erros.

Code Block
exception.validar-duplicados=true
exception.max-duplicados=15
  • Para as aplicações Delphi que enviam direto para o Sentry o recurso foi ativado de forma padrão. Mas pode ser desativada configurado desta forma o arquivo .conf.

Code Block
MaxErrosDuplicados = 0;

TECD-2143

VsScripter - Fornecer mais recursos do CxGrid parte 2

testes_grd.zip

Image Removed

Código:

uPrinc

Code Block
uses
  Unit1;
  
var
  F : TForm1;
begin                                    
  try
    F := TForm1.Create(nil);  
    F.Criar(F);
    F.ShowModal;
  finally
    F.Free
  end       
end;                      

Unit1

Code Block
{$FORM TForm1, Unit1.sfm}

uses                               
  DB, DBClient, uVsClientDataset,
  Classes, Graphics, Controls, Forms,                   
  Dialogs, 
  
  cxGrid, dxCore, cxGridDBTableView, cxGridLevel, cxStyles, cxData, cxCustomData, cxGridPopupMenu,
                                                 
    Classes, Graphics, Controls, Forms, Dialogs, DB, DBClient , Bib, Windows,
    UProcRapidaCds, Grids, VsDBGrid, DBCtrls, StdCtrls, DBGrids, ExtCtrls,
    SysUtils, System, CxGridCol;                                 
 
procedure BuscarTabela; 
begin                    
  cds.Data := dmConexao3c.QueryPegaData('SEL_PESQUISAFILTRO' 
    , '*'           
    , [ '?', '1:s', 'PESSOA'                  
      , '?', '2:s', 'IDPESSOA<1000'   
      , 'P', 'ID' , 1]                             
    , [ftString, ftString, ftInteger]
    , [8, 20, 0]);  
end;                                                   
                                             
procedure Criar(AForm : TForm);
var                                   
  Grid: TcxGrid;                                          
  Level: TcxGridLevel;                               
  View: TcxGridDBTableView;     
  Style: TcxStyle;       
  pm: TcxGridPopupMenu;
begin   
  BuscarTabela;   
  // Cria o Grid
  Grid := TcxGrid.Create(AForm);
  Grid.Parent := AForm;                        
  Grid.Align := alClient;
  // Cria um Level                             
  Level := Grid.Levels.Add;     
  Level.Name := 'SomeLevelName';
  // Cria a View                            
  View := Grid.CreateView(TcxGridDBTableView) as TcxGridDBTableView;
  View.Name := 'SomeViewName';
  View.FilterRow.Visible := True; 
  View.OptionsView.Footer := True;
  // ... Ligacoes 
  Level.GridView := View;
  View.DataController.DataSource := ds;
  // ... Cria todas as colunas 
  View.DataController.CreateAllItems;
      
  View.Columns[0].Caption := 'Código'; 
  View.Columns[1].Caption := 'Nome';        
  View.Columns[2].Caption := 'CNPJ/CPF';   
                                        
  View.Columns[0].Summary.FooterKind := skMax;               
                                            
  Style:= TcxStyle.Create(AForm);   
//  Style.Color := $00FEF3CF;
  Style.TextColor := clRed;     
                                        
  View.Columns[0].PropertiesClassName := 'TcxComboBoxProperties'; 
  
  View.Styles.ContentEven := Style;
  
  pm := TcxGridPopupMenu.Create(AForm);
  pm.Grid := Grid;
  pm.AlwaysFireOnPopup := True;
                                       
end;

TECD-2142

Fintech - Gerar manual de integração com Pix da Fintech

https://nimitz.atlassian.net/wiki/spaces/TD/pages/edit-v2/3514335259

TECD-1736

0

Consignado - Incluir campo de propostas canceladas

Adição de uma nova coluna com as propostas canceladas pelo colaborador na tela das propostas do admin.

TECD-2197

Consignado - Permitir a empresa nao possuir parceiro

Alteracao no front end do consignado. Permitindo possuir parceiro, remover o parceiro e ordenando o parceiro por ordem alfabetica no dropbox da empressa.

TECD-2009

Consignado - Usuario administrador precisa ver os anexos dos colaboradores

Alteração da tela dos colaboradores, alteração necessária apensa no frontend Angular. Componente fdic-colaboradores sofreu alterações na tabela.

TECD-2345

0

Fintech - Alterar dados Boleto Sicredi

Alteração do código beneficiário no momento do cadastro do convenio, pois a conta é cadastrada antes do convenio. Tarefa finalizada porém alguma contas Sicredi sofrerão ajustes manuais e serão validadas.

TECD-2147

Inconsistencia ao colaborador trocar de empresa

Alterações na trigger ‘trg_colab_empresa’_au do banco de homologação e de produção.

TECD-2064

CONSIGNADO - Inclusão de campos nos pedidos de recusa

Campos adicionados no banco de dados de producao e homologacao

TECD-2406

0

Consignado - Enviar email de proposta para o RH

Como definido na tarefa estão sendo enviados e-mails para o Admin e RH, porém pela urgência e característica da demanda esta tarefa será dividida em duas partes. Essa primeira parte está sendo enviado o email para os destinatários desejados, na segunda parte será criada uma página HTML definido um novo layout de envio de e-mails, visto que a biblioteca usada no Consignado precisa que seja criada uma página HTML para envio de e-mail. Neste momento está sendo usada uma página genérica para Admin e RH a segunda parte da tarefa comtempla criar páginas HTML distintas para cada destinatário.

TECD-1758

Consignado - Incluir responsavel pelo credenciamento

Criação de um combox nos detalhes da empresa para adicionar quem é o parceiro responsavel pelo credenciamento desta.

TECD-1762

0

Consignado - Validar data de admissão.

Criação de uma classe estatica chamada de ConversorUtil, dessa forma não sendo necessario injetar na classe SimuladorFormDirective, e deixando essa classe e o método diferencaDiasEntreTipoDate disponíveis para serem usados em outras partes do código.

TECD-1727

Consignado - Criar campo de Comissão de parceiro/indicação

Criação no back end do controller/service/repository do parceiro.

TECD-2307

Atendimento

Dados nao localizados sendo necessário executar requisições na api da tecnospeed para preenchimento do código de barra e nosso numero impressão.

TECD-2316

Filt - Boletos

Dados obtidos com sucesso via api Tecnospeed.

TECD-2008

Validacao conta Sicredi para novos clientes do Filt

Erro retornado pela api da Tecnospeed TituloNumeroDocumento - Tamanho máximo do campo é 10 caracteres

TECD-2376

0

Consignado - Inconsistência nos dados do RH

Foi criado a branch

Jira Legacy
serverSystem Jira
serverIda5c9f197-a7aa-3a3e-91c5-85e0279c94e6
keyTECD-2376
diretamente pela IDE. O método do backend estava com problemas de escopo na variavel.

TECD-2091

Corrigir Relatório Mensal Parcelas

Foi necessario atualizar os base64 que estavam no banco de producao com os novos templates para gerar relatorios.

TECD-2270

Fintech - Boletos

Foram necessarias alteracoes na Fintech e no Filt.

TECD-2245

IA - Autopilot - Classificador de criticidade dos atendimentos

Documentação de Implantação do Microserviço vs-urgency-classifier

Passos para Implantação

1. Clonar o Repositório

Primeiro, clone o repositório do Bitbucket:

Code Block
 git clone <https://bitbucket.org/viasoftnimitz/vs-urgency-classifier> 

2. Configurar Variáveis de Ambiente

Renomeie o arquivo .env-exemplo para .env e edite as variáveis conforme necessário:

Code Block
 mv .env-exemplo .env
nano .env 

Certifique-se de preencher todas as variáveis necessárias no arquivo .env, incluindo as configurações para conexão com o PostgreSQL.

3. Configurar Banco de Dados PostgreSQL

Garanta que você tenha um banco de dados PostgreSQL disponível e configure as seguintes variáveis no arquivo .env:

  • POSTGRES_DB

  • POSTGRES_USER

  • POSTGRES_PASSWORD

  • POSTGRES_HOST

  • POSTGRES_PORT

4. Implantar no Docker

Para implantar o serviço usando Docker, execute o seguinte comando, apontando para a porta 5005:

Code Block
 docker build -t vs-urgency-classifier .
docker run -d -p 5005:5005 --env-file .env vs-urgency-classifier 

5. Configurar o Nginx

Configure o Nginx para apontar para o servidor onde o microserviço está rodando. Adicione uma configuração no seu arquivo de configuração do Nginx, semelhante ao exemplo abaixo:

Code Block
server {
    listen 80;
    server_name seu_dominio.com;

    location / {
        proxy_pass <http://localhost:5005;>
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Reinicie o Nginx para aplicar as novas configurações:

Code Block
 sudo systemctl restart nginx 

6. Configurar Gatilho no Movidesk

Acesse o Movidesk e navegue até as configurações de gatilho:

  1. Vá para Configurações > Gatilho.

  2. Edite um gatilho existente ou crie um novo.

  3. Configure o gatilho para apontar para o domínio do servidor onde o microserviço está rodando, como mostrado na imagem:

image-20240625-170157.pngImage Removed

7. Manutenção de Prompt

Caso seja necessário atualizar alguma coisa no prompt, edite o arquivo classifier_langchain.py.

8. Atualizar Token do Movidesk

Se for necessário alterar o token do Movidesk, edite o arquivo .env e atualize o valor da variável correspondente ao token.

TECD-2343

0

Implementar um aplicativo para realizar o papel de producer de filas da OCI (OCI Queues)

Informações do projeto

Objetivo

Fornecer uma interface entre receber uma mensagem Json via Rest e armazenar ela em uma OCI Queue. Esse aplicativo é um produtor de mensagens em uma Queue.

Parametros necessários

Configurar no application.properties:

oci.config.path= oci.config.endpoint= oci.config.queue-ocid=

O path é o caminho onde o arquivo config está armazenado (arquivo semelhante ao do resource .oci/config).

Endpoint e queue-ocid são informações que são obtidas na criação das queues.

Métodos a serem utilizados

/ e /ping

são métodos GET servem só para teste se a API subiu.

/api/send

método POST cujo valor do body será armazenado como mensagem na Queue.

Atenção

Como trata-se de um recurso da OCI atentar-se com um uso de chave privada com direitos de acesso de usuário como serviço para execução.

TECD-1728

Consignado - Desenvolver Layout de tela para o Vendedor Executivo

Inclusao do parceiro para receber comissoes das empresas.

TECD-2336

0

Fintech - Boletos - Nome arquivo de remessa

Modificação no metodo que gera a remessa na api da Fintech.

TECD-1731

0

Consignado - Criar módulo para admin de Central de cobrança para o Consignado

Na reunião de tecnologia do dia 16/07/2024 verificou-se que esta tarefa não será desenvolvida, pois já existe uma planilha que resolve de forma ágil a questão solicitada.

TECD-1739

0

Consignado - Mostrar apenas propostas aprovadas pelo admim ao RH

Necessário alterações na classe EmpresaOperacoesComponent, para no momento das buscas das propostas aprovadas verifique a situação das propostas em relação ao Admin, assim como nas propostas reprovadas.

TECD-2366

0

Fintech - Alterar campo registration_number

Necessário corrigir os endpoints de criação e alteração de convenios na Fintech, também foram pedidos ajustes nas variaveis do Filt para enviar valores com 0 a esquerda.

TECD-2025

Teste problema conexão lenta, nova versão UniDac

Realizado testes e a sugestão é atualziar a versao do UniDac

TECD-1766

Consignado - Observações no CPF após a aprovação

Realizados testes para verificar a funcionalidade, sendo aprovado pela equipe comercial. Funcionalidade foi desenvolvida no antigo quadro Trello da Fintech.

TECD-2065

App Fintech - Saldo no extrato

Refatoracao da classe HomePage para que o saldo seja buscado na inicializacao do app.

TECD-2219

Boleto Híbrido Compartilhado - Banco do Brasil, Sicreed, Itaú e Santander

Será documentado individualmente por cada vertical

TECD-2175

Filt - Erro ao salvar a conta Fintech no Filt

Tarefa concluida e enviada diretamente para a branch master, em homologacao nao apresentava o mesmo comportamento.

TECD-1744

0

Consignado - Criar campo para devolução de propostas.

Tarefa já foi desenvolvida no Trello que veio da Fintech para Tecnologia.

TECD-1742

0

Consignado - Mostrar empresa mesmo quando estiver em fase de simulação.

Tarefa já foi desenvolvida no Trello que veio da Fintech para Tecnologia.

TECD-2186

Consignado - Nao permitir ao colaborador alterar alguns campos apos enviar a simulacao

Testado e validado com a equipe comercial da Fintech.

TECD-2517

0

Configurando os deploys do CRM Dev

TESTE

TECD-1735

Consignado - Incluir PIX no campo dados de pagamento

Validado e implementado. No momento foi definido pelo comercial que nao ha necessidade de validacoes na chave pix ou maiores implementacoes, somente cadastrando essa no banco de dados, junto aos dados bancarios.

...

2269

Assistente Melhoria Enquete Disparo Automatico(API META)

1.Menu

Orion → Viasoft Assistente

2.Objetivo

Criar integração Assistente com WhatsApp Flows

3.Alteração

Novo recurso no Viasoft Assistente utilizando o WhatsApp Flows. O WhatsApp Flows é uma ferramenta que permite a criação de interações estruturadas para mensagens comerciais. Por meio do Flows, as empresas têm a capacidade de definir, configurar e personalizar mensagens com interações enriquecidas, oferecendo aos clientes maior organização na forma como se comunicam.

O Flows pode ser utilizado para diversas finalidades, como a geração de leads, recomendação de produtos, aquisição de novos contatos de vendas, ou qualquer outra situação em que uma comunicação estruturada proporcione maior naturalidade e conforto para seus clientes.

É possível disparar uma enquete para o usuário, vinculada ao disparo automático de texto, permitindo a inclusão de qualquer conteúdo na mensagem, desde que esteja em conformidade com as diretrizes da Meta. O template criado segue um formato padrão descrito nas documentações.

Para informações mais detalhadas sobre como usar as Enquetes, acesse:

Enquetes Assistente Meta

TECD-2255

Assistente Melhorias(API META)

1.Menu

Orion → Viadecisor (API Versão API Oficial)

2.Objetivo

Criação de algumas melhorias na nova API Meta WhatsApp solicitadas por clientes e analisadas internamente 

3.Alteração

Foi implementada uma nova funcionalidade no Assistente para reduzir os custos de disparo de mensagens, utilizando templates utilitários. Estes templates permitem acompanhar ações ou solicitações do usuário, como confirmações, atualizações de pedidos e alertas de conta, reduzindo o custo por disparo de U$ 0,0625 para U$ 0,035. Para habilitar essa função, foi necessário ajustar o banco de dados e configurar os templates no Assistente. Além disso, foi realizada uma migração de funcionalidade para bloquear interações manuais via chat, mantendo apenas os disparos automáticos.

Criação de Templates - Assistente Meta

TECD-2250

Assistente Correções (API META)

1.Menu

Orion → Viadecisor (API Versão API Oficial)

2.Objetivo

Ajustar bugs que estão acotnecendo com alguns clientes nessa fase de validação do Assistente Meta

3.Alteração

Foi realizada uma migração no processo de encerramento de sessões automáticas. Antes, esse encerramento era feito utilizando rotinas de disparos automáticos da API antiga, que geravam mensagens automáticas para cada agendamento. No entanto, devido ao alto custo das mensagens automáticas, foi implementado um cron job que, a cada minuto, verifica sessões inativas há mais de 15 minutos e encerra a sessão sem utilizar templates da Meta API, enviando uma mensagem padrão.

Além disso, foi feita uma correção no envio de imagens com texto repetido, sendo agora configurado para que cada imagem tenha seu respectivo texto. Por questões de custo e organização, é recomendado o uso de templates de documento em vez de imagens.

TECD-2167

API - Criar forma de mensagens serem formatas para se encaixar nas regras do Meta

1.Menu

Orion → Plugin Assistente

2.Objetivo

Analisar quais as principais regras dentro dos message_templates que podem impactar e serem tratadas pelo própio Assistente

3.Alteração

Foi implementado um tratamento nas mensagens de template do WhatsApp para atender às regras da API da Meta, conforme especificado na https://developers.facebook.com/docs/whatsapp/business-management-api/message-templates/ . As principais regras abordadas incluem:

  • Limite de 1024 caracteres

  • Proibição de mais de 4 espaços consecutivos

  • Restrição ao uso do caractere pipe | como separador

  • Proibição de quebras de linha dentro de variáveis em templates de mensagem

TECD-2133

API - Criar tabela de referência de modelo (Modelo -> Template) para casos que pode haver banimento

1.Menu

Orion → Plugin Assistente

2.Objetivo

Criar tabela de referência de templates conforme os nomes dentro do Meta

3.Alteração

Durante os testes, foi constatado que nem sempre é possível utilizar nomes padrão para os templates de mensagens. Anteriormente, utilizávamos nomes fixos para cada tipo de template, conforme a tabela abaixo:

Tipo do TemplateNome do TemplateTextodefaultImagemdefault_imagemDocumentodefault_document

No entanto, se um template for banido pela Meta, leva cerca de 4 semanas para que o mesmo nome possa ser reutilizado. Para evitar esse problema, foi implementada uma funcionalidade que permite ao usuário configurar os nomes dos templates diretamente na página inicial do assistente.

Agora, os nomes dos templates para cada tipo de disparo (texto, imagem e documento) podem ser ajustados conforme necessário. Por padrão, os valores seguem os da tabela de referência, mas podem ser alterados a qualquer momento, conforme a necessidade do cliente.