BULK DOWNLOAD TRANSACTIONS

FULLY HOLDINGS INC.

FUL-23,24,25,26,27,28,29,30

A Stable solution for the accountants to cross-check the transactions in an accounting period.Bulk PDF prints for the sales transactions or an option for downloading bulk transactions from a single platform.

  1. Created A suitelet page with Generated Folder Button
  2. Created a Client script to define the Button action
  3. A scheduled script is created to generate the folder for the corresponding transactions and the user can find the email Notification after folder generation.
  4. Page reloaded and show the Schedule script status.

Client Script

/**
 * @NApiVersion 2.x
 * @NScriptType ClientScript
 * @NModuleScope SameAccount
 */
/*******************************************************************************
 * CLIENTNAME:FULLY HOLDINGS INC.
 * FUL-23
 * BULK DOWNLOAD TRANSACTIONS
 * **************************************************************************
 * Date : 14-08-2019
 *
 * Author: Jobin & Jismi IT Services LLP
 * Script Description : This script is to define the button actions for the  custom suitelet page for bulk download Transactions 
 * Date created : 14-08-2019
 *
 * REVISION HISTORY
 *
 * Revision 1.0 ${14-08-2019} nd :marg created
 *
 *****************************************************************************/
define(['N/record', 'N/url', 'N/https', 'N/currentRecord'],

    function(record, url, https, currentRecord) {
        function pageInit(scriptContext) {

        }

        function generateFolder() {

            try {

                window.onbeforeunload = null;

                var record = currentRecord.get();

                var savedSearchId = 3197;

                var get_url = url.resolveScript({
                    scriptId: "customscript_jj_ful_23_sl_ss_page",
                    deploymentId: "customdeploy_jj_ful_23_sl_ss_page",

                    params: {

                        ID: savedSearchId,

                    }

                });
                alert("Your Request is Processing,We will notify the user once the folder is created");

                // var status_url = 'https://4141760-sb1.app.netsuite.com/app/common/scripting/scriptstatus.nl?whence='

                // window.open(status_url); Code for showing the schedule script status Page Removed now as the Fully Accountant - READ ONLY Role has no permission for the suitescript 

                window.location.href = get_url;

            } catch (er) {
                console.log('error in  validating the ID', er)
            }

        }

        return {

            pageInit: pageInit,
            generateFolder: generateFolder
        };
    });

Suitelet

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 * @NModuleScope SameAccount
 */
/*******************************************************************************
 * CLIENTNAME:FULLY HOLDINGS INC.
 * FUL-23
 * BULK DOWNLOAD TRANSACTIONS
 * **************************************************************************
 * Date : 14-08-2019
 *
 * Author: Jobin & Jismi IT Services LLP
 * Script Description : This script for creating the custom page for saved search 
 * Date created : 14-08-2019
 *
 * REVISION HISTORY
 *
 * Revision 1.0 ${14-08-2019} nd :marg created
 *
 *****************************************************************************/
define(['N/record', 'N/ui/serverWidget', 'N/task'],

    function(record, serverWidget, task) {

        /**
         * Definition of the Suitelet script trigger point.
         *
         * @param {Object} context
         * @param {ServerRequest} context.request - Encapsulation of the incoming request
         * @param {ServerResponse} context.response - Encapsulation of the Suitelet response
         * @Since 2015.2
         */
        function onRequest(context) {

            try {

                var searchId = context.request.parameters.ID;

                log.debug("searchId ", searchId);

                if (searchId) {

                    var createFolder = task.create({
                        taskType: task.TaskType.SCHEDULED_SCRIPT,
                        scriptId: 'customscript_jj_ful_24_ss_generate_foldr',
                        deploymentId: 'customdeploy_jj_ful_24_ss_generate_flder'
                    });

                    // Submit the task.
                    try {
                        var folderId = createFolder.submit();
                    } catch (e) {


                        log.debug("Err ", e);

                        context.response.write("Failed to submit your request, Another request is in progress.please Try after sometime ")

                        return

                    }
                }

                if (context.request.method == 'GET') {
                    var form = serverWidget.createForm({
                        title: "Bulk Download Transaction"
                    });

                    //fileId of the client script
                    form.clientScriptFileId = 3324295;

                    //Generate Folder Button
                    form.addButton({
                        id: 'generate_folder',
                        label: 'Generate Folder',
                        functionName: 'generateFolder'
                    });

                    context.response.writePage(form);
                }

            } catch (e) {
                log.debug("Err@ onRequest FN ", e);

            }
        }
        return {
            onRequest: onRequest
        };

    });

Scheduled Script

/**
 * @NApiVersion 2.x
 * @NScriptType ScheduledScript
 * @NModuleScope SameAccount
 */
/*******************************************************************************
 * CLIENTNAME:FULLY HOLDINGS INC.
 * FUL-24
 * BULK DOWNLOAD TRANSACTIONS
 * **************************************************************************
 * Date : 16-08-2019
 *
 * Author: Jobin & Jismi IT Services LLP
 * Script Description : This script is to generate the Folder and PDF for Transactions in the Saved Search
 * Date created :  16-08-2019
 *
 * REVISION HISTORY
 *
 * Revision 1.0 ${ 16-08-2019} nd :marg created
 *
 *****************************************************************************/
define(['N/record', 'N/search', 'N/runtime', 'N/email', 'N/render', 'N/file', 'N/task'],

    function(record, search, runtime, email, render, file, task) {

        function execute(scriptContext) {

            try {

                var scriptObj = runtime.getCurrentScript();
                var GeneratedFileId = scriptObj.getParameter('custscript_jj_generated_file_id');
                var fld = scriptObj.getParameter('custscript_jj_loop_var');

                //  log.debug("parameter folder ID", fld)
                if (!GeneratedFileId) {

                    fld = generate_folder();

                    var transactionid = runSavedSearch();

                    if (transactionid) {

                        var currentTranId = transactionid.pop();
                    }

                } else {

                    var fileObj = file.load({
                        id: GeneratedFileId
                    });

                    var contents = fileObj.getContents();

                    transactionid = JSON.parse(contents)

                    var currentTranId = transactionid.pop();
                }

                if (currentTranId) {

                    var idFind = findInAttachment();
                    var elementArray = {}
                    var duplicate = [];

                    for (var i = 0; i < idFind.tranId.length; i++) {

                        if (currentTranId.internalId == idFind.tranId[i]) {

                            elementArray = {
                                "id": currentTranId.internalId,
                                "type": currentTranId.tranType,
                                "fileId": idFind.fileId[i]

                            }
                            duplicate.push(elementArray)

                        }

                    }

                    if (duplicate.length > 0) {

                        var copy = copyfiles(duplicate, fld)

                        log.debug("copy", copy)

                    } else {


                        var attachmentID = CheckFilesAttached(currentTranId);

                        log.debug("attachmentID", attachmentID)

                        if (!attachmentID) {

                            var pdfgenerated = generatePdfInFolder(currentTranId, fld)

                        } else {

                            var objArry = [];
                            objArry.push(attachmentID)
                            log.debug("objArry", objArry)
                            var filescopy = copyfiles(objArry, fld)

                            log.debug("filescopy", filescopy)

                        }

                    }

                    log.debug("transactionid23", transactionid)

                    if (transactionid.length != 0) {


                        var generatepdf_id_file = file.create({
                            name: 'generatePDF.txt',
                            fileType: file.Type.PLAINTEXT,
                            contents: JSON.stringify(transactionid),
                            folder: 3311585

                        });

                        createdFileId = generatepdf_id_file.save();

                        var reschedule = rescheduleScriptandReturn(createdFileId, fld);
                    } else {

                        var senderId = runtime.getCurrentUser().email; //Current user email ID

                        var fldurl = 'https://4141760-sb1.app.netsuite.com/app/common/media/mediaitemfolders.nl?folder=' + fld;

                        email.send({
                            author: 4920725, //the id of employee with email id 'donotreply@fully.com',
                            recipients: senderId,
                            subject: 'BULK PDF GENERATION-NOTIFICATION',
                            body: "Please find the Generated PDF's in the File cabinet using the following link " + fldurl


                        });

                    }
                }

            } catch (e) {
                log.debug("Err@ execute FN ", e);

            }
        }



        /*****************************************************************************
         *FUNCTION TO FIND RUN THE FULLY EUROPE TRANSACTION PDF SAVED SEARCH
         ******************************************************************************/

        function runSavedSearch() {
            try {

                var transactionid = [];

                var transactionSearch = search.load({
                    id: 'customsearch3197'
                });

                transactionSearch.run().each(function(result) {
                    var tranDetail = {};

                    tranDetail.internalId = result.getValue({
                        name: "internalid",
                        label: "Internal ID"
                    });

                    tranDetail.tranType = result.getValue({
                        name: "type",
                        label: "Type"
                    });
                    transactionid.push(tranDetail)
                    return true;


                });

                return transactionid;

            } catch (e) {
                log.debug("Err@runSavedSearch function ", e);

            }
        }

        /******************************************************************************
         *FUNCTION TO FIND THE  FILES AND ITS ASSOCIATED TRANSACTIONS 
         ******************************************************************************/

        function findInAttachment() {

            try {

                var fileSearchObj = search.create({
                    type: "file",
                    filters: [
                        ["filetype", "anyof", "PDF"],
                        "AND", ["folder", "anyof", "3309824"]
                    ],
                    columns: [
                        search.createColumn({
                            name: "name",
                            summary: "GROUP",
                            sort: search.Sort.ASC,
                            label: "Name"
                        }),
                        search.createColumn({
                            name: "created",
                            summary: "MAX",
                            sort: search.Sort.DESC,
                            label: "Date Created"
                        }),
                        search.createColumn({
                            name: "internalid",
                            summary: "MAX",
                            label: "Internal ID"
                        })
                    ]
                });

                var name = [];
                var fileId = [];
                var tranType = [];
                var tranId = [];

                fileSearchObj.run().each(function(result) {

                    var filename = result.getValue({

                        name: "name",
                        summary: "GROUP",
                        sort: search.Sort.ASC,
                        label: "Name"
                    });

                    var fileIntId = result.getValue({

                        name: "internalid",
                        summary: "MAX",
                        label: "Internal ID"
                    });

                    filename = filename.split('_');
                    filename = filename[1];
                    filename = filename.split('.');
                    filename = filename[0];
                    name.push(filename)
                    fileId.push(fileIntId)
                    return true;
                });


                for (var i = 0; i < name.length; i++) {


                    var transactionSearchObj = search.create({
                        type: "transaction",
                        filters: [
                            ["numbertext", "is", name[i]],
                            "AND", ["mainline", "is", "T"]
                        ],
                        columns: [
                            search.createColumn({
                                name: "internalid",
                                label: "Internal ID"
                            }),
                            search.createColumn({
                                name: "trandate",
                                label: "Date"
                            }),
                            search.createColumn({
                                name: "tranid",
                                label: "Document Number"
                            }),
                            search.createColumn({
                                name: "type",
                                label: "Type"
                            })
                        ]
                    });

                    transactionSearchObj.run().each(function(result) {

                        var id = result.getValue({
                            name: "internalid",
                            label: "Internal ID"

                        });

                        var type = result.getValue({

                            name: "type",
                            label: "Type"

                        });

                        tranType.push(type);
                        tranId.push(id)
                        return true;
                    });
                }

            } catch (e) {

                log.debug('Err@findInAttachment function', e)

            }
            return {
                "name": name,
                "fileId": fileId,
                "tranType": tranType,
                "tranId": tranId
            }

        }


        /******************************************************************************
         *FUNCTION TO GENERATE FOLDER
         ******************************************************************************/


        function generate_folder() {

            try {

                var folderRec = record.create({
                    type: record.Type.FOLDER,
                    isDynamic: true
                });
                folderRec.setValue({
                    fieldId: 'parent',
                    value: 3311587
                });
                folderRec.setValue({
                    fieldId: 'name',
                    value: "Belgian Accountant PDF's" + " " + (new Date()).getDate() + "/" + (new Date()).getMonth() + "/" + (new Date()).getFullYear() + " " + "Time:" + " " + new Date().getHours() + "HH" + ":" + new Date().getMinutes() + "MM" + ":" + new Date().getSeconds() + "SS"
                });
                var folderId = folderRec.save({
                    enableSourcing: true,
                    ignoreMandatoryFields: true
                });

            } catch (e) {

                log.debug('Err@generate_folder function', e)

            }

            return folderId;

        }



        /*************************************************************************************
         *FUNCTION TO GENERATE PDF FOR THE TRANSACTIONS AND ATTACH IT TO THE FOLDER CREATED
         *************************************************************************************/

        function generatePdfInFolder(currentTranId, fld) {

            try {

                var renderer = render.create();
                var transactionFile = render.transaction({
                    entityId: parseInt(currentTranId.internalId),
                    printMode: render.PrintMode.PDF,
                    inCustLocale: true
                });
                //    log.debug(' transactionFile[i]', transactionFile)

                var trType = currentTranId.tranType
                trType = {
                    CustInvc: 'invoice',
                    CustCred: 'creditmemo',
                    CashRfnd: 'cashrefund'
                }[trType] || trType;

                var docName = search.lookupFields({
                    type: trType,
                    id: currentTranId.internalId,
                    columns: ['tranid']
                });

                docName = docName.tranid.split('/')
                    // log.debug(' docName', docName[2])
                transactionFile.folder = fld;
                transactionFile.name = docName[0] + "/" + docName[1] + "/" + docName[2] + ".pdf"
                var fileId = transactionFile.save();
                // log.debug(' fileId', fileId)

            } catch (e) {

                log.debug('Err@generatePdfInFolder function', e)

            }

        }


        /*************************************************************************************
         *FUNCTION TO COPY THE FIELS TO THE GENERATED FOLDER
         *************************************************************************************/

        function copyfiles(duplicate, fld) {

            try {

                var trType = duplicate[0].type

                trType = {
                    CustInvc: 'invoice',
                    CustCred: 'creditmemo',
                    CashRfnd: 'cashrefund'
                }[trType] || trType;

                var docName = search.lookupFields({
                    type: trType,
                    id: duplicate[0].id,
                    columns: ['tranid']
                });

                docName = docName.tranid.split('/')

                var fileObj = file.load({
                    id: duplicate[0].fileId
                });

                var contents = fileObj.getContents();

                var fileObject = file.create({
                    name: docName[0] + "_" + docName[1] + "_" + docName[2] + ".pdf",
                    fileType: file.Type.PDF,
                    contents: contents,
                    folder: fld,

                });

                var saveId = fileObject.save();


            } catch (e) {

                log.debug('Err@copyfiles function', e)

            }

        }

        /*************************************************************************************
         *FUNCTION TO CHECK IF ANY PDF ARE ARE ATTACHED IN THE ATTACHMENTS OF THE RECORD
         *************************************************************************************/

        function CheckFilesAttached(currentTranId) {

            try {

                var attachmentObj = {};
                var attachDetailsArr = [];
                var messageSearchObj = search.create({
                    type: "message",
                    filters: [
                        ["transaction.internalid", "anyof", currentTranId.internalId],
                        "AND", ["attachments.name", "haskeywords", "/EU/"],
                        "AND", ["attachments.filetype", "anyof", "PDF"]
                    ],
                    columns: [
                        search.createColumn({
                            name: "view",
                            label: "View"
                        }),
                        search.createColumn({
                            name: "isemailed",
                            label: "Email Sent"
                        }),
                        search.createColumn({
                            name: "internalid",
                            join: "attachments",
                            label: "Internal ID"
                        }),
                        search.createColumn({
                            name: "messagedate",
                            sort: search.Sort.DESC,
                            label: "Date"
                        }),
                        search.createColumn({
                            name: "internalid",
                            join: "transaction",
                            label: "Internal ID"
                        }),
                        search.createColumn({
                            name: "type",
                            join: "transaction",
                            label: "Type"
                        })
                    ]
                });
                var searchResultCount = messageSearchObj.runPaged().count;

                log.debug("messageSearchObj result count", searchResultCount);
                if (searchResultCount > 0) {
                    messageSearchObj.run().each(function(result) {

                        attachmentObj.fileId = result.getValue({

                            name: "internalid",
                            join: "attachments",
                            label: "Internal ID"
                        });

                        attachmentObj.id = result.getValue({

                            name: "internalid",
                            join: "transaction",
                            label: "Internal ID"

                        });

                        attachmentObj.type = result.getValue({

                            name: "type",
                            join: "transaction",
                            label: "Type"

                        });

                        return false;
                    });

                    return attachmentObj

                } else {
                    return false;
                }
            } catch (e) {

                log.debug('Err@copyfiles function', e)

            }
        }


        /*************************************************************************************
         *FUNCTION TO RESCHEDULE THE SCRIPT TO AVOID USAGE
         *************************************************************************************/
        function rescheduleScriptandReturn(createdFileId, fld) {

            var resTask = task.create({
                taskType: task.TaskType.SCHEDULED_SCRIPT,
                scriptId: "customscript_jj_ful_24_ss_generate_foldr",
                deploymentId: "customdeploy_jj_ful_24_ss_generate_flder",
                params: {

                    custscript_jj_generated_file_id: createdFileId,
                    custscript_jj_loop_var: fld

                }
            });
            var scriptTaskId = resTask.submit();

            return true

        }
        return {
            execute: execute
        };

    });

Leave a comment

Your email address will not be published. Required fields are marked *