[Em análise] Erro no horário de atendimento e direcionamento de blocos

Na última semana tenho tido bugs no bot, erros que nunca aconteceram como:

  • Identificação errada do horário de trabalho. Assim envia mensagem de ausência do Suporte antes do horário.
  • Não direcionado a card, deixando o usuário no limbo

Revisamos todo o fluxo, que funcionava normalmente.

Conseguem me ajduar?

1 Curtida

Aqui tem acontecido constantemente também o não reconhecimento do horário de atendimento em alguns blocos. E a maluquice é essa, tudo funcionando bem (ontem estava), e hoje, sem mexer em nada no fluxo, já não reconhece novamente. E em outros blocos ele reconhece normalmente. Não tem explicação.

O problema de vocês foi resolvido?

@Alessandra_Oliveira @George_Oliveira

Ainda não, Bruno. Aqui persiste.

Eu vou explicar melhor o problema, embora estejamos no post da Alessandra, mas talvez a sua luz sobre o caso possa ajudar a ela e outros também.

No nosso fluxo, quando a pessoa manda uma imagem (input.content@type Valor: image) ou um PDF (input.content@type Valor:application/pdf), existe um bloco dedicado a reconhecer o horário de atendimento (assim como do padrão do de verificação de horário de atendimento de vocês, utilizando na condição de saída a variável IsWorkTime) para direcionar a pessoa para um atendente (caso esteja no horário de atendimento) ou para dar outra instrução (caso não esteja no horário de atendimento). Esse bloco, por alguma razão estranha, tem funcionamento intermitente, mas o mais comum é direcionar como se não estivesse no horário de atendimento, mesmo que estejamos. Como no restante dos blocos esse direcionamento de horário funciona bem, eu acredito que possa estar acontecendo algum erro de comunicação somente quando há o envio dos referidos arquivos. O que me intriga é que muito raramente ele reconhece, mas na maioria das vezes, sem nenhuma alteração no fluxo, ele para de reconhecer.

@Bcamarda ainda não foi resolvido, abri um ticket também, mas ainda sem retorno.

No meu caso, diferente do @George_Oliveira, o bloco apenas verifica o horário de atendimento para enviar para o Suporte ou então para informação que não estamos disponíveis, então não envia um arquivo.

E quando o erro aconteceu, foram em todos os blocos. Tentei ajustar, mas não tive sucesso. Ou seja, informava que não estávamos em atendimento em horário que atendemos.
Tive que ficar retirando e adicionando na mão, pois ele deveria de fato aparecer no final de semana.

Pessoal (@Alessandra_Oliveira, @George_Oliveira), por favor, confiram se o problema ainda persiste. Nosso time encontrou um possível bug com os horários nos servidores, mas já deve ter sido corrigido.

Bruno, no meu caso havia um script faltando nas ações de entrada. Ontem foi corrigido junto com o suporte. Ainda me causa estranheza pois, mesmo sem o script, ele funcionava as vezes. Mas agora parece redondo. Problema solucionado. Obrigado!

1 Curtida

@Bcamarda o bug persiste, agora também está errando os dias de antedimento :frowning:
Consegue me ajudar? O ticket sobre a situação foi aberto a vocês no dia 24/03.

@Alessandra_Oliveira

O problema foi resolvido?
Vocês estão utilizando o script de verificação sem nenhuma modificação? Acontece para todos os usuários ou só para alguns?

Conversei com o time do Suporte sexta, mas ainda não está 100%.

Olá pessoal, @Alessandra_Oliveira, @George_Oliveira,

O script de verificação de horário de atendimento em questão necessita ser alterado para contemplar alguns casos. Por gentileza, atualize no seu chatbot caso utilize o script do template de atendimento:

// Receive the variables as parameters
function run(offset, start, end, workDays) {

    offset = parseInt(offset);

    let today = nowUTC(offset);


    let startDate = utcDate(start, offset);
    let endDate = utcDate(end, offset);

    
    return ((today - startDate) > 0) && ((endDate - today) > 0) && isWorkDay(today, workDays);
}

//Get now UTC Date
function nowUTC(offset) {
    let now = new Date;
    let utc_timestamp = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),
        now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());

    return new Date(utc_timestamp + offset * 3600 * 1000);
}

//Get UTC Date
function utcDate(timeString, offset) {
    let now = new Date;

    let hour = getValueByString('hour', timeString);
    let minutes = getValueByString('minutes', timeString);
    let utc_timestamp = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),
        hour, minutes, 0, 0);
    return new Date(utc_timestamp);
}

//Get hour/minute by string with pattern HH:mm
function getValueByString(type, timeString) {

    if (type === 'hour') {
        return parseInt(timeString.substring(0, timeString.indexOf(':')));
    }

    else if (type === 'minutes') {
        return parseInt(timeString.substring(timeString.indexOf(':') + 1, timeString.length));
    }

    return 0;
}

//Get if today is a work day
function isWorkDay(today, workDays) {
    workDays = workDays.split(',');

    return workDays.indexOf(today.getDay().toString()) >= 0;
}

Caso já tenha alterado o script do template de atendimento, siga os passos abaixo para contemplar os casos:

  1. Substitua a função utcDate padrão pela alterada:
  • Função padrão
function utcDate(timeString, offset) {
    let now = new Date;

    let hour = getValueByString('hour', timeString);
    let minutes = getValueByString('minutes', timeString);
    hour += DEFAULT_OFFSET;
    let utc_timestamp = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),
        hour, minutes, 0, 0);
    return new Date(utc_timestamp + offset * 3600 * 1000);
}

  • Função alterada
function utcDate(timeString, offset) {
    let now = new Date;

    let hour = getValueByString('hour', timeString);
    let minutes = getValueByString('minutes', timeString);
    let utc_timestamp = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),
        hour, minutes, 0, 0);
   return new Date(utc_timestamp);
}

  1. Substitua a função run padrão pela alterada:
  • Função padrão
function run(offset, start, end, workDays) {

    offset = parseInt(offset) + DEFAULT_OFFSET;
    let today = nowUTC(offset);
    let startDate = utcDate(start, offset);
    let endDate = utcDate(end, offset);

    return ((today - startDate) > 0) && ((endDate - today) > 0) && isWorkDay(today, workDays);
}
  • Função alterada
function run(offset, start, end, workDays) {

    offset = parseInt(offset);
    let today = nowUTC(offset);
    let startDate = utcDate(start, offset);
    let endDate = utcDate(end, offset);
    
    return ((today - startDate) > 0) && ((endDate - today) > 0) && isWorkDay(today, workDays);
}
1 Curtida

Oi Caio. Obrigado.
Não é necessária nenhuma alteração nas variáveis de entrada da ação?

@George_Oliveira , uma dica que eu posso te dar em relação ao fluxo que você apresentou, seria de usar a validação do horário antes do usuário enviar qualquer conteúdo… penso que você não precisa de receber uma entrada do usuário para validar se está dentro ou não do horário de atendimento.
Eu resolvi um problema no meu fluxo dessa forma, verificando antes.

Lembrando que o simples fato de verificar não significa que você está retornando para o cliente que ele não está em horário de atendimento. Você só está, verificando mesmo… rs… na hora que for o momento certo para avisar ao cliente, ai você lê a variável e informa: “Opa meu amigo, sinto muito mas estamos sem técnicos disponíveis no momento”

Espero que te ajude, abraços!

1 Curtida

@Caiof você poderia explicar QUAIS casos precisam desse ajuste? Caso exista alguma definição pra isso… Ou pelo menos informar o que acontecia com o parâmetro DEFAULT_OFFSET que foi removido.

obrigado!

1 Curtida

Olá Caio, poderia me orientar nesse alteração?

Olá @George_Oliveira,

Não é necessário.

1 Curtida

Olá @GabrielPetrone,

O script desenvolvia uma lógica para adaptar o fuso horário da seguinte forma, em uma entrada com os seguintes dados de exemplo:

Horário inicial de atendimento: 8:30
Horário final de atendimento: 18:00
Fuso horário: -3
Horário atual com fuso horário: 9:00

A variável DEFAULT_OFFSET por padrão tem o valor oposto do fuso horário(3), o script realizava mais uma lógica para testes, adicionando todos os DEFAULT_OFFSET aos horários, como resultado:

Horário inicial de atendimento com DEFAULT_OFFSET: 11:30
Horário final de atendimento com DEFAULT_OFFSET: 21:00
Horário atual com fuso horário com DEFAULT_OFFSET: 12:00

Por fim, era verificado se o horário atual estava dentro do intervalo de horário de atendimento. Porém, o script não contempla casos onde o horário final de atendimento adicionado ao DEFAULT_OFFSET ultrapassam as 23:59.

A alteração nos scripts tem como objetivo estruturar esta logica, permitindo estes casos. :man_technologist:t5:

2 Curtidas

Olá @Alessandra_Oliveira,

Claro! Poste aqui, por gentileza o seu atual script que a comunidade irá te ajudar :grin: