Iniciando um processo no BPM pelo Botfactory

Atualmente é possível integrar o BPM com o Botfactory via API. Para isso é necessário que exista um serviço no meio de campo mapeando os parâmetros enviados pelo botfactory para o padrão aceito pelo BPM.

O snippet de código abaixo apresenta o exemplo de uma lambda na AWS que realiza um início de processo no BPM com base nos valores enviados pelo Botfactory. Para realizar a configuração, é possível configurar um serviço externo no Botfactory dois modos:

  • Se você já possui uma conta na AWS, crie uma lambda e configure como um serviço externo conforme a documentação. Este método tem como vantagem utilizar a mesma lambda em vários tenants se assim for necessário.
  • Se você não possui uma conta na AWS, é possível utilizar a SDK da Senior conforme a documentação. Neste caso, cada função será exclusiva de cada tenant. Não utilize este método se a solução será aplicada em múltiplos tenants.
const axios = require('axios')

const createResponse = (statusCode, message, processInstanceId) => ({
    statusCode,
    body: JSON.stringify({ type: 'PLAINTEXT', text: [ message ], processInstanceId: processInstanceId })
});

const execute = async event => {
   
    const auth = event.headers['Authorization'];
    if (!auth) {
        return createResponse(401, 'No authorization provided.');
    }

    console.log(event.body);
    console.log(JSON.parse(event.body));

    const {
        processId,
        action,
        nextResponsible,
        outputMessage,
        ...data
    } = JSON.parse(event.body || '{}');

    if (!processId) {
        return createResponse(400, 'processId is required.');
    }

    const config = {
        headers: {
            'Content-Type': 'application/json',
            'Authorization': auth
        }
    }

    console.log('antes de getFormAccessProperties');

    const getFormAccessPropertiesParams = {
        processId,
        processState: 'New',
        authorization: auth
    };
    const { data: { accessPropertiesResponse } } = await axios.get(`${process.env.PLATFORM_URL}/rest/platform/workflow/queries/getFormAccessProperties`, {
        params: getFormAccessPropertiesParams,
        ...config,
    });

    console.log('antes de getNextProcessInstanceId');

    const { data: { processInstanceID } } = await axios.get(`${process.env.PLATFORM_URL}/rest/platform/workflow/queries/getNextProcessInstanceId`, config);

    console.log('antes de ecm_form');

    if (accessPropertiesResponse.performerURI === 'com.senior.wfe.EcmForm') {
        const ecmConfig = JSON.parse(accessPropertiesResponse.performerData);
        const createEcmRecordParam = {
            ...data,
            processInstanceId: processInstanceID
        }
        console.log(createEcmRecordParam);
        await axios.post(`${process.env.PLATFORM_URL}/odata/platform/ecm_form/${ecmConfig.entityName}`, createEcmRecordParam, config);
    }

    const startProcessParams = {
        processInstanceID,
        processId,
        businessData: JSON.stringify({ root: data }),
        authorization: auth,
        flowExecutionData: {
            actionToExecute: action,
            nextSubject: nextResponsible || null
        }
    };

    console.log('antes de startProcess');
   
    await axios.post(`${process.env.PLATFORM_URL}/rest/platform/workflow/actions/startProcess`, startProcessParams, config);
   
    console.log(`Process instance with id ${processInstanceID} started.`);
    return createResponse(200, outputMessage || 'Processo iniciado.', processInstanceID);
}

exports.lambdaHandler = async (event) => {
    console.log(event);
    try {
        return await execute(event);
    } catch (err) {
        console.log(err);
        const errorStatusCode = (err.response && err.response.status) || 500;
        const errorMsg = (err.data && err.data.message) || 'ERROR';
        return createResponse(errorStatusCode, errorMsg);
    }
};

O serviço acima espera quatro parâmetros: processId, action, nextResponsible, outputMessage. O processId é o identificador do processo que será iniciado. A action é qual ação será executada no processo (ex.: Prosseguir). O nextResponsible será o responsável pela tarefa. O outputMessage será a mensagem a ser exibida pelo bot quando a solicitação ser iniciada.

Os dados do formulário podem ser repassados então como os parâmetros adicionais do serviço. Por exemplo, se o formulário tiver o campo_1 e campo_2, podem ser adicionados à configuração conforme exemplo abaixo:

Leave A Comment