isoBot - Botmaker

Integração do isoCRM com o chatbot da Botmaker

Webhook

Parâmetros

Usuário de acesso e sessão

Para efetuar as requisições nas api's do isoCRM é necessário criar um usuário para que tenha sessão de acesso. 

O usuário deverá ser criado com um login específico e um código de sessão gerado manualmente, pois o mesmo deverá ser configurado na plataforma da Botmaker.

A sessão deverá ser gerada manualmente com caracteres aleatórios com no máximo 32 caracteres. 

Após gerar o código de sessão, é necessário cadastrá-lo em um parâmetro, desta forma:

Após é necessário configurar o código da sessão na plataforma da Botmaker como uma constante.

Logado na plataforma da Botmaker, acessar o menu:
Bots - Variáveis e Constantes - Aba Constantes - New constant

Adicionar uma constante da seguinte forma:

Direcionamento para atendimento humano por "setor"

Para o direcionamento ao atendimento humano por setor, existem duas formas; Classificação chat pré-definida e classificação dinâmica.

Classificação chat pré-definida

Para essa forma de direcionamento é necessário construir o fluxo da seguinte forma:

Definir quais são os "setores", conforme as classificações previamente cadastradas e configuradas no isoCRM, obter os códigos de cada classificação cadastrar para relacionar com a opção do menu de atendimento e adicionar as ações conforme a seguir:

Classificação chat dinâmica

Para esse tipo de direcionamento o isobot irá listar todas as classificações chat disponíveis para atendimento humano:

Para habilitar uma classificação chat para atendimento humano e ficar disponível no menu, exstem duas formas:

Desta forma a api que lista as classificações chat irá verificar esse campo e gerar a opção de menu.

2. Parâmetro ISOCHATBOT_ATENDIMENTO.

É necessário cadastrar os detalhes e valores conforme a descrição da classificação chat e seu código. 

Exemplo:

Detalhamento do fluxo

Fluxo - chatbot

Fluxo necessário para o caso quando o atendimento humano não esteja disponível. Após retornar a mensagem de indisponibilidade, deverá retornar opções para o usuário ir para algum bloco do fluxo ou encerrar. 

Sugestão de fluxo:

api - Consulta pedido

//@constant('Use external service URI')

const URI = 'https://sandbox.isocrm.com.br/isocrmisoapi/rest/WSISOInt_ISOPvBuscaPedido';


//@constant('Use http method (POST, GET, PUT...)')

const METHOD = 'POST';


//@constant('Authentication key. Only if the service requires')

const AUTHENTICATION = JSON.parse(context.userData.constants)[`apiKey`];


//@constant('Variable where the response will be stored')

const BM_RESULT_VAR_NAME = 'response_variable'


const IS_TEST = user.get('botmakerEnvironment') === 'DEVELOPMENT';

const CUSTOMER_ID = context.userData._id_;


const OUTPUTS = {

    log: (text) => { IS_TEST ? result.text(text) : bmconsole.log(text); },

};


const postData = {

    sessao: JSON.parse(context.userData.constants)[`apiKey`],

    CPFCNPJStr: user.get('clienteCPF'),

    ISOPvPed_Codigo: user.get('pedidoCod')    

};


const callServiceApiRest = () => {

    return rp({

        method: METHOD,

        uri: URI,

        json: true,

        headers: {

            'Content-Type': 'application/json',

            'Accept': 'application/json',

            "Authorization": AUTHENTICATION,

        },

        body: postData,

    });

}


const main = async() => {

    const response = await callServiceApiRest();

    user.set('pedidoSit', response.Pedido[`Status`]);

    user.set('pedidoTotal', response.Pedido[`ValorTotal`]);

    user.set('msgErro', response.msgerro);

    let text ='';

    for (let i = 0; i < response.Pedido[`itens`].length; i++) {

      text += response.Pedido[`itens`][i][`Produto`] + ` - ` + response.Pedido[`itens`][i][`Descricao`] + ` Qtd: ` + response.Pedido[`itens`][i][`Quantidade`] + ` Vlr: ` + response.Pedido[`itens`][i][`Valor`] + `\n`;

    }

    user.set('pedidoItens', text);

 

};


main()

    .catch((err) => {

        // Code on error

        const errorMessage = `[Integration with api rest] :  Error - ${CUSTOMER_ID} - ${err.message}`;

        user.set('ca_error', errorMessage);

        OUTPUTS.log(errorMessage);

    })

    .finally(result.done);


api - Consulta atendimento

//@constant('Use external service URI')

const URI = 'https://sandbox.isocrm.com.br/isocrmisoapi/rest/WSISOInt_ISOSABuscaAtendimento';


//@constant('Use http method (POST, GET, PUT...)')

const METHOD = 'POST';


//@constant('Authentication key. Only if the service requires')

const AUTHENTICATION = user.get('isosessao'); //JSON.parse(context.userData.constants)[`apiKey`];


//@constant('Variable where the response will be stored')

const BM_RESULT_VAR_NAME = 'response_variable';


const IS_TEST = user.get('botmakerEnvironment') === 'DEVELOPMENT';

const CUSTOMER_ID = context.userData._id_;


const OUTPUTS = {

    log: (text) => { IS_TEST ? result.text(text) : bmconsole.log(text); },

};


const postData = {

    sessao: JSON.parse(context.userData.constants)[`apiKey`],

    CPFCNPJStr: user.get('clienteCPF'),

    ISOSAAte_Codigo: user.get('atendimentoCod')    

};


const callServiceApiRest = () => {

    return rp({

        method: METHOD,

        uri: URI,

        json: true,

        headers: {

            'Content-Type': 'application/json',

            'Accept': 'application/json',

            "Authorization": AUTHENTICATION,

            'token':AUTHENTICATION

        },

        body: postData,

    });

};


const main = async() => {

    const response = await callServiceApiRest();

    user.set('atendimentoSit', response.Atendimento[`Status`]);

    user.set('atendimentoDsc', response.Atendimento[`Descricao`]);

    user.set('atendimentoSolucao', response.Atendimento[`Solucao`]);

    user.set('msgErro', response.msgerro);

};


main()

    .catch((err) => {

        // Code on error

        const errorMessage = `[Integration with api rest] :  Error - ${CUSTOMER_ID} - ${err.message}`;

        user.set('ca_error', errorMessage);

        OUTPUTS.log(errorMessage);

    })

    .finally(result.done);


api - Lista classificação chat 

//@constant('Use external service URI')

const URI = 'https://sandbox.isocrm.com.br/isocrmisoapi/rest/WSR_ISOClassificacaoChat_isoBot';


//@constant('Use http method (POST, GET, PUT...)')

const METHOD = 'POST';


//@constant('Authentication key. Only if the service requires')

const AUTHENTICATION = '';


//@constant('Variable where the response will be stored')

const BM_RESULT_VAR_NAME = 'response_variable';


const IS_TEST = user.get('botmakerEnvironment') === 'DEVELOPMENT';

const CUSTOMER_ID = context.userData._id_;


const postData = {

      sessao: JSON.parse(context.userData.constants)[`apiKey`]

    };


const OUTPUTS = {

    log: (text) => { IS_TEST ? result.text(text) : bmconsole.log(text); },

};


const callServiceApiRest = () => {

    return rp({

        method: METHOD,

        uri: URI,

        json: true,

        headers: {

            'Content-Type': 'application/json',

            'Accept': 'application/json'

        },

        body: postData

    });

};


const main = async() => {

    const response = await callServiceApiRest();

    let text ='';

    let myJSONList = [];

    let myJSONListCod = [];

    let opcoesAtendimento =[];

    let opcoesAtendimentoCod =[];

    user.set('retornoClassChat', JSON.stringify(response.retorno));

    for (let i = 0; i < response.retorno.length; i++) {

      opcoesAtendimento[i] = response.retorno[i][`Classificacao`];

    }

    opcoesAtendimento[response.retorno.length] = 'Voltar';

    myJSONList = opcoesAtendimento.map((classificacao, index) => { return { id: index, name: classificacao }; });

    user.set('classChatJSON', JSON.stringify(myJSONList));

    result.done();

};


main()

    .catch((err) => {

        // Code on error

        const errorMessage = `[Integration with api rest] :  Error - ${CUSTOMER_ID} - ${err.message}`;

        user.set('ca_error', errorMessage);

        OUTPUTS.log(errorMessage);

    })

    .finally(result.done);



api - Registra classificação chat 

//@constant('Use external service URI')

const URI =

  'https://sandbox.isocrm.com.br/isocrmisobot/rest/WSR_ISOClassificacaoChatBot';


//@constant('Use http method (POST, GET, PUT...)')

const METHOD = 'POST';


//@constant('Authentication key. Only if the service requires')

const AUTHENTICATION = '';


//@constant('Variable where the response will be stored')

const BM_RESULT_VAR_NAME = 'response_variable';


const IS_TEST = user.get('botmakerEnvironment') === 'DEVELOPMENT';

const CUSTOMER_ID = context.userData._id_;


const OUTPUTS = {

  log: (text) => {

    IS_TEST ? result.text(text) : bmconsole.log(text);

  },

};



const callServiceApiRest = (classificacaochatbot) => {

  const postData = {

    sessao: JSON.parse(context.userData.constants)[`apiKey`],

    classificacaochat: classificacaochatbot,

  };

  return rp({

    method: METHOD,

    uri: URI,

    json: true,

    headers: {

      'Content-Type': 'application/json',

      Accept: 'application/json',

    },

    body: postData,

  });

};


const main = async () => {

  let codClassificacao = 0;

  if (user.get('codClassificacao') > 0) {

    codClassificacao = user.get('codClassificacao');

  } else {

    const retorno = JSON.parse(user.get('retornoClassChat'));

    let classificacao = JSON.parse(user.get('classificacaoChat'))[`name`];

    for (let i = 0; i < retorno.length; i++) {

      if (classificacao == retorno[i][`Classificacao`]) {

        codClassificacao = retorno[i][`ClassificacaoCod`];

      }

    }

  }

  const classificacaochatbot = [

    {

      UserDevice: context.userData.PLATFORM_CONTACT_ID,

      codClassificacao: codClassificacao,

      channelId: context.userData.CHAT_CHANNEL_ID,

      customerId: context.userData._id_,

    },

  ];

  user.set('classificacaochat', JSON.stringify(classificacaochatbot));


  const response = await callServiceApiRest(classificacaochatbot);


  result.done();

};


main()

  .catch((err) => {

    // Code on error

    const errorMessage = `[Integration with api rest] :  Error - ${CUSTOMER_ID} - ${err.message}`;

    user.set('ca_error', errorMessage);

    OUTPUTS.log(errorMessage);

  })

  .finally(result.done);