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.
- Created A suitelet page with Generated Folder Button
- Created a Client script to define the Button action
- A scheduled script is created to generate the folder for the corresponding transactions and the user can find the email Notification after folder generation.
- 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
};
});