Payment Slip Plug-in Creation (Brazilian Hub SuiteApp)

The Brazilian Hub SuiteApp uses plug-ins to generate payment slip files, known in Brazil as boleto bancário. To generate payment slips for a bank that is not predefined by the SuiteApp, you must create a new plug-in file and its implementation in NetSuite.

Create a JavaScript file for the custom plug-in implementation. The JavaScript file must be compatible with SuiteScript 2.0.

The following code is a sample custom plug-in implementation for a payment slip.

          /**
 * @NApiVersion 2.x
 * @NScriptType plugintypeimpl
 */
define(function () {
    // You can define your own functions and statements to use internally in the plug-in. These functions will be not executed outside this scope.
    if (!String.prototype.lpad) {
        Object.defineProperty(String.prototype, 'lpad', {
            value: function (padString, length) {
                var str = this;
                while (str.length < length)
                    str = padString + str;
                return str;
            },
            enumerable: false
        });
    }
    /**
     * This function is required and returns the CNAB barcode string
     * @param {object} data
     * @param {string|number} data.bankCode
     * @param {string|number} data.currency
     * @param {string|number} data.agencyNumber
     * @param {string|number} data.agencyNumberDV
     * @param {string|number} data.portfolio
     * @param {string|number} data.accountNumber
     * @param {string|number} data.accountNumberDV
     * @param {string|number} data.beneficiaryCode
     * @param {string|number} data.beneficiaryDigit
     * @param {string|number} data.agreement
     * @param {string|number} data.expirationDays
     * @param {string|date} data.dueDate
     * @param {string|number} data.amount
     * @param {string|number} data.expirationFactor
     * @param {string|number} data.fineValue
     * @param {string|number} data.interestValue
     * @param {string|number} data.discountAmount
     * @param {string|number} data.total
     * @param {string|number} data.ourNumber
     *
     * @returns {string}
     */
    function generateBarcode(data){
        // This is an example code and it is not related with the bank requirements
        var codeBar = "";
        codeBar += data.bankCode.toString().lpad("0", 3);
        codeBar += data.currency.toString().lpad("0", 1);
        codeBar += "#";
        codeBar += data.expirationFactor.toString().lpad("0", 4);
        codeBar += Number(data.amount).toFixed(2).toString().replace(",", "").replace(".", "").lpad("0", 10);
        return codeBar;
    }
    /**
     * This function is required and returns the manual barcode - 'linha digitável'
     * @param {object} data
     * @param {string|number} data.bankCode
     * @param {string|number} data.currency
     * @param {string|number} data.agencyNumber
     * @param {string|number} data.agencyNumberDV
     * @param {string|number} data.portfolio
     * @param {string|number} data.accountNumber
     * @param {string|number} data.accountNumberDV
     * @param {string|number} data.beneficiaryCode
     * @param {string|number} data.beneficiaryDigit
     * @param {string|number} data.agreement
     * @param {string|number} data.expirationDays
     * @param {string|date} data.dueDate
     * @param {string|number} data.amount
     * @param {string|number} data.expirationFactor
     * @param {string|number} data.fineValue
     * @param {string|number} data.interestValue
     * @param {string|number} data.discountAmount
     * @param {string|number} data.total
     * @param {string|number} data.ourNumber
     *
     * @returns {string}
     */
    function generateManualBarcode(data){
        // This is an example code and it is not related with the bank requirements
        var amount = data.total.replace(/\D/g, "");
        var barcode = generateBarcode(data);
        var digitableNumber = [];
        var group1 = "";
        group1 += data.bankCode;
        group1 += data.currency;
        group1 += ".";
        digitableNumber.push(group1);
        var group2 = "";
        group2 += ".";
        digitableNumber.push(group2);
        var group3 = "";;
        group3 += ".";
        digitableNumber.push(group3);
        var group4 = "";
        group4 += barcode.substring(4, 5);
        digitableNumber.push(group4);
        var group5 = "";
        group5 += data.expirationFactor.toString().lpad("0", 4);
        group5 += Number(amount).toString().lpad("0", 10);
        digitableNumber.push(group5);
        return digitableNumber.join(" ");
    }
    /**
     * This function is required and it returns the 'Our Number' ('Nosso Número') information. This is used to clean and prepare the 'Nosso Número' data stored in the parcela and banco contas record types
     * @param {object} data
     * @param {string|number} data.bankCode
     * @param {string|number} data.currency
     * @param {string|number} data.agencyNumber
     * @param {string|number} data.agencyNumberDV
     * @param {string|number} data.portfolio
     * @param {string|number} data.accountNumber
     * @param {string|number} data.accountNumberDV
     * @param {string|number} data.beneficiaryCode
     * @param {string|number} data.beneficiaryDigit
     * @param {string|number} data.agreement
     * @param {string|number} data.expirationDays
     * @param {string|date} data.dueDate
     * @param {string|number} data.amount
     * @param {string|number} data.expirationFactor
     * @param {string|number} data.fineValue
     * @param {string|number} data.interestValue
     * @param {string|number} data.discountAmount
     * @param {string|number} data.total
     * @param {string|number} data.ourNumber
     *
     * @returns {string}
     */
    function generateOurNumber(data){
        // This is an example code and it is not related with the bank requirements
        return data.ourNumber.lpad("0", 8);
    }
    /**
     * This function is required and it returns the 'Beneficiary Code'. This is used to clean and prepare the 'Beneficiary Code' data stored in the banco contas record type
     * @param {object} data
     * @param {string|number} data.bankCode
     * @param {string|number} data.currency
     * @param {string|number} data.agencyNumber
     * @param {string|number} data.agencyNumberDV
     * @param {string|number} data.portfolio
     * @param {string|number} data.accountNumber
     * @param {string|number} data.accountNumberDV
     * @param {string|number} data.beneficiaryCode
     * @param {string|number} data.beneficiaryDigit
     * @param {string|number} data.agreement
     * @param {string|number} data.expirationDays
     * @param {string|date} data.dueDate
     * @param {string|number} data.amount
     * @param {string|number} data.expirationFactor
     * @param {string|number} data.fineValue
     * @param {string|number} data.interestValue
     * @param {string|number} data.discountAmount
     * @param {string|number} data.total
     * @param {string|number} data.ourNumber
     *
     * @returns {string}
     */
    function generateBeneficiaryCode(data){
        // This is an example code and it is not related with the bank requirements
        return data.beneficiaryCode;
    }
    return {
        generateBarcode : generateBarcode,
        generateManualBarcode : generateManualBarcode,
        generateOurNumber : generateOurNumber,
        generateBeneficiaryCode : generateBeneficiaryCode
    }
}); 

        

After you create the JavaScript file, you must create a plug-in implementation record in NetSuite. When you create the plug-in implementation record, select the plug-in type Plug-in de Geração de Boleto Bancário. For more information about creating the plug-in implementation, see Adding the Alternate Implementation to NetSuite.

Related Topics

Implementing a Custom Bank in Brazil (Brazilian Hub SuiteApp)
Payment Slip Template Creation (Brazilian Hub SuiteApp)
Creating Bancos Records in Brazil (Brazilian Hub SuiteApp)

General Notices