Escolhendo um valor específico no bloco dinâmico

Boa tarde, pessoal. Queria compartilhar com vocês uma solução que implementamos aqui, espero que ajude!

Nossa situação era a seguinte: precisávamos selecionar um periodo específico para gerar o boleto do cliente onde o conteúdo, ou seja, as informações dos boletos em aberto, vem do retorno da nossa API onde as informações são geradas e apresentadas para o cliente através de um bloco dinâmico. Porém estávamos limitados ao cliente digitar o período, o que causava certa confusão. Por exemplo, se o cliente possuísse 5 boletos nos períodos:
1 - 202101
2 - 202102

5 - 202105

Ele não poderia digitar, por exemplo, 1 para escolher o periodo 202101. Ou ele digitaria o período ou clicava sobre a opção desejada (sendo que no WhatsApp não tem esta opção).

Para gerar o bloco dinâmico, usamos o seguinte código:

function run(response, responseStatus) {
            let boletosObj = {};
             if(responseStatus == 400){
                return boletosObj["options"] = 0;
            }
            var json_data = JSON.parse(response);
            
            let parc = {};
            if(!json_data.PARCELA){
                return 'Por favor verifique os dados informados!';
            }
            let parcelas = json_data.PARCELA;
        
            boletosObj["text"] = "Digite o período desejado. Por exemplo: 202101 "
            let parcelasObj = [];
             let k = 1;
            let j = 0;
            for(let i = 0; i < parcelas.length; i++) {
                let parcela = {};
                parcela['text'] = k + ' - Período: ' + parcelas[i];
                parcela['type'] = 'application/json';
                parcela['value'] = {};
                parcela['value'][k] = parcelas[i];
                
                
                parcelasObj.push(parcela);
                k++;
                j++;
            }

            boletosObj["options"] = parcelasObj;
            return boletosObj;
        }

Colocamos o retorno dentro de um bloco dinâmico/conteúdo dinâmico.

Após isto, é gerado para nós, dentro do bloco, a quantidade de parcelas que o cliente tiver em aberto (passando algumas informações já solicitadas anteriormente para ele e após consultar na API utilizando estas informações).

Depois que o cliente tem o resultado das parcelas, ele pode tanto digitar o valor do periodo (no exemplo acima, 202101), digitar o valor 1 e também clicar (caso seja possível) para selecionar o período desejado.

Para tratar estas informações, criamos um script que contém o seguinte código:

function run(escolherParc, boletosObj) {
          boletosObj = JSON.parse(boletosObj);
          for(let i = 0; i < boletosObj['options'].length; i++){
              if(boletosObj['options'][i]['value'][escolherParc]){
                  var parsed = parseInt(boletosObj['options'][i]['value'][escolherParc]);
                  return parsed;
              }
          }
          var containCharacter = escolherParc.includes('{');
          if(containCharacter){
            const parcEscolhida = escolherParc.split(/[:{},"]/);
          
            var filtered = parcEscolhida.filter(function (el) {
              return el != "";
            });

            if(filtered[1] != "t"){
              var parsed = parseInt(filtered[1]);
              return parsed;
            }else{
              return String(filtered[1]);  
            }
          }else{
            var parsed = parseInt(escolherParc);
            return parsed;
          }
        }

Onde: escolherParc é a parcela/período escolhido pelo cliente e boletosObj é a mesma variável retornada no código de geração do conteúdo dinâmico.

Com este código conseguimos tratar o valor de entrada do cliente para as 3 situações acima citadas.

Caso queiram algo mais detalhado, é só comentar ai que estamos dispostos a ajudar! :rocket: :grin:

8 Curtidas

Gente, que perfeição! Logo na primeira publicação aqui o @Gabriel_Aquino já manda uma dessas! :scream: Tenho certeza que vai ajudar muita gente. :smiling_face_with_three_hearts:

Super feliz por você ter vindo compartilhar com a Comunidade, Gabriel. E seja muito bem-vindo!

2 Curtidas

Com certeza tem muita gente precisando dessa solução! Valeu demais, @Gabriel_Aquino :clap:

2 Curtidas

Pensamos um pouco em como desenvolver isso e deu certo!!! A animação aqui foi grande! kkkkkk

Nosso próximo desafio é tentar colocar para o cliente conseguir obter todas de uma vez escolhendo uma opção. Por exemplo, dentro do bloco dinâmico, colocar a opção de “Todas” e já disponibilizar todos os boletos em aberto.

2 Curtidas

Sim! Esperamos conseguir ajudar o máximo possível a comunidade Blip! :rocket: :clap:

2 Curtidas

ALA GENTE EU QUE CHAMEI ESSA FERA PRO FÓRUM IRRAAA que bom que deu certo, sucesso uhuull

3 Curtidas

Valeu, Pedro! :rocket: :rocket: :clap: :clap: :partying_face:

2 Curtidas

Wow! Muito bom o post, vai ajudar demais

2 Curtidas

Vocês arrasaram! :tada:

Boooa! Vou marcar o @Bruno porque ele pode te ajudar nisso.

3 Curtidas

Gabriel, primeiramente valeu por compartilhar com a gente! :100:

Sobre seu próximo passo: Enviar vários arquivos de uma vez só pode ser um problema, pois se não me engano, o WhatsApp não está aceitando Collection* como deveria. Temos algumas soluções:

  1. Enviar várias mensagens, via API, cada uma contendo um arquivo.
  2. Encontrar uma maneira de agrupar esses arquivos em um único arquivo, talvez até mesmo na sua própria API ou usando uma API de Merge de PDF
  3. Criar um looping no seu bot para ir enviando os arquivos (isso pode não ser aceito pelo Blip, dependendo de como for feito, por causa do risco de looping infinito)

* Collection é um tipo de conteúdo que permite enviar um grupo de mensagens em lote.

2 Curtidas

Opa, Bruno! Muito obrigado pelas dicas! Assim que iniciarmos a implementação dessa parte eu tentarei aplicar elas. Valeu!!!

2 Curtidas

Olá a todos,

@Gabriel_Aquino você conseguiu disponibilizar vários arquivos PDF ao mesmo tempo?

Estamos tentando desenvolver essa solução e por enquanto as opções que encontramos não deu certo.
Gostaríamos de fazer dentro do Blip (Sem utilizar a API externa).

1 Curtida

Opa Luan, beleza?

Cara, ainda não focamos nessa questão devido a demanda alta pro nosso setor de tecnologia.

Contudo, uma solução prévia que fizemos foi fazer o cliente escolher se deseja voltar para o fluxo e solicitar outro.

Ex: ele entrou no fluxo e trouxe 3 opções: 1 - 202101, 2 - 202102 e 3 - 202103.
Quando ele escolher, por exemplo, a opção 1, irá trazer o arquivo pdf correspondente e logo em seguida perguntará se ele deseja retornar ao fluxo, permitindo assim que ele escolha outro (ou o mesmo, visto que apenas irá retornar o fluxo) ou passe a diante.

Futuramente, quando implementarmos essa questão, publicarei aqui atualizando.
Segue print de exemplo:

1 Curtida

Inclusive, fizemos essa modificação de substituir o período pelo nome pois estava gerando muita confusão por parte dos nossos clientes esses últimos dias. Estarei colocando o código atualizado abaixo:

 function run(response, responseStatus) {
            const monthNames = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho",
            "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
            ];
            let boletosObj = {};
             if(responseStatus == 400){
                return boletosObj["options"] = 0;
            }
            var json_data = JSON.parse(response);

            let parc = {};
            if(!json_data.PARCELA){
                return 'Por favor verifique os dados informados!';
            }
            let parcelas = json_data.PARCELA;
        
            boletosObj["text"] = "Digite a opção [1,2,3..] do mês desejado. Exemplo: 1"
            let parcelasObj = [];
             let k = 1;
        
            for(let i = 0; i < parcelas.length; i++) {
                let arrayPeriod = parcelas[i].toString();
                arrayPeriod = arrayPeriod.match(/.{1,4}/g);
                let datePeriod = arrayPeriod[1] + '/01/' + arrayPeriod[0];
                let monthPeriod = new Date(datePeriod);
                monthPeriod = monthNames[monthPeriod.getMonth()];
                let parcela = {};
                parcela['text'] = k + ' - ' + monthPeriod + ' ' + arrayPeriod[0];
                parcela['type'] = 'application/json';
                parcela['value'] = {};
                parcela['value'][k] = parcelas[i];
                
                
                parcelasObj.push(parcela);
                k++;
            }
         
            boletosObj["options"] = parcelasObj;
            return boletosObj;
        }
1 Curtida

No nosso caso gostaríamos que ele recebesse todos os boletos de uma vez, não que ele precisasse ficar interagindo a cada novo arquivo.

Vamos continuar tentando encontrar a solução.

Mesmo assim, obrigado @Gabriel_Aquino

1 Curtida

Entendi.

Não conheço se no blip há essa possibilidade de enviar vários arquivos. Mas de acordo com o que o Bruno falou, eu também acredito que a melhor opção seria fazer este tratamento na API mesmo, o que não se encaixaria no seu caso. Ou tentar fazer um loop com os blocos de acordo com o tamanho do array/retorno (no meu caso, retorno das parcelas em aberto) de opções que é enviado para a escolha pela API, é algo que pensei agora mas não sei dizer se pode dar certo ou não. Creio que seja válido tentar criar algo nesse sentido.

1 Curtida