Jira Code: MBS-20
Add an extra form “Cari Mutabakat ” in addition to the BA-BS form. Update the forms so that the search result appears only on the click of the ‘Display’ button.
Suitelet: MBS-20 JJ SL Carie Form
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope Public
*/
/*******************************************************************************
* CLIENTNAME:Moneta Business Solutions MBS -20
* ************************************************************************ Date :
* 29/05/2019
*
* Author: Jobin & Jismi IT Services LLP Script Description : This is to Create
* a SL for showing results of "Cari Mutabakat" form
* Date created : 29/05/2019
*
* REVISION HISTORY
*
* Revision 1.0 ${29/05/2019} nd : created
*
*
******************************************************************************/
define(
['N/record', 'N/search', 'N/ui/serverWidget', 'N/render', 'N/email', 'N/file', 'N/encode', 'N/task'],
/**
* @param {record}
* record
* @param {search}
* search
* @param {serverWidget}
* serverWidget
*/
function(record, search, serverWidget, render, email, file, encode, 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 pageIndex = assignDefaultValue(
context.request.parameters.pageindexfield, 0);
var showDisp = assignDefaultValue(
context.request.parameters.display, false);
// log.debug('showDisp', showDisp)
var form_name = context.request.parameters.form_name;
var form_type = context.request.parameters.form_type;
//log.debug('form_name',form_name)
var formTypeSelected = context.request.parameters.formTypeSelected;
// var startDateSelected = context.request.parameters.startDateSelected;
var endDateSelected = context.request.parameters.endDateSelected;
//endDateSelected
// var amountSelected = context.request.parameters.amountSelected;
var mode = context.request.parameters.mode;
var returnObj = context.request.parameters.returnObj;
log.debug("mode", mode);
log.debug("form_name", form_name);
log.debug("form_type", form_type);
if (context.request.method === 'GET') {
// to create a form
var form = serverWidget.createForm({
title: 'Mutabakat Formu'
});
// //Ba-Bs vs cari
var formType = form.addField({
id: 'custpage_type',
label: 'Mutabakat Tipi',
type: serverWidget.FieldType.SELECT
});
if (checkForParameter(form_name))
formType.defaultValue = form_name;
formType.addSelectOption({
value: '0',
text: 'Select Any..'
});
formType.addSelectOption({
value: '1',
text: 'Ba-Bs Mutabakatı'
});
formType.addSelectOption({
value: '2',
text: 'Cari Mutabakatı'
});
// end date
var endDate = form.addField({
id: 'custpage_end_date',
label: 'End Date',
type: serverWidget.FieldType.DATE
});
if (checkForParameter(endDateSelected))
endDate.defaultValue = endDateSelected;
// Sublist
var searchSublist = form.addSublist({
id: 'custpage_search_sublist',
type: serverWidget.SublistType.LIST,
label: 'Cari Mutabakat'
});
// to add buttons
var display = form.addButton({
id: 'custpage_display',
label: 'Display',
functionName: 'displayResult'
});
var print = form.addButton({
id: 'custpage_print',
label: 'Print',
functionName: 'printData'
});
var sendMail = form.addButton({
id: 'custpage_send_mail',
label: 'Send E-mail',
functionName: 'sendMailTo'
});
var pageIndexField = form.addField({
id: 'pageindexfield',
type: serverWidget.FieldType.SELECT,
label: 'Page Index'
}).updateLayoutType({
layoutType: serverWidget.FieldLayoutType.STARTROW
});
if (endDateSelected) {
pageIndexField.defaultValue = pageIndex;
} else {
pageIndexField.addSelectOption({
value: 0,
text: '0 of 0'
});
pageIndexField.defaultValue = 0;
}
var runSearchObj = runSearch(endDateSelected, pageIndexField, pageIndex);
log.debug('checkForParameter(runSearchObj', checkForParameter(runSearchObj))
log.debug('showDisp', showDisp)
if ((checkForParameter(runSearchObj)) && (showDisp === 'true')) {
log.debug('showDisp if', showDisp)
// dynamically define the column list based on the saved
var select = searchSublist.addField({
id: 'custpage_select',
label: 'Yazdir',
type: serverWidget.FieldType.CHECKBOX
});
searchSublist.addMarkAllButtons();
// search definition
if (endDateSelected)
var columns = runSearchObj.columns;
else
var columns = {}
log.debug('columns', columns)
for (var key in columns) {
if (columns[key].label != 'nodisplay') {
if (key == 'formulacurrency') {
searchSublist.addField({
id: key,
label: columns[key].label,
type: serverWidget.FieldType.CURRENCY
});
} else if (columns[key].label == 'BS - Toplam Bedel (KDV Hariç)') {
searchSublist.addField({
id: key,
label: columns[key].label,
type: serverWidget.FieldType.CURRENCY
});
} else {
log.debug(key, columns[key].label)
if (key == 'formulatext') {
var field = searchSublist.addField({
id: key,
label: columns[key].label,
type: serverWidget.FieldType.TEXT
});
field.updateDisplayType({
displayType: serverWidget.FieldDisplayType.HIDDEN
});
} else {
searchSublist.addField({
id: key,
label: columns[key].label,
type: serverWidget.FieldType.TEXT
});
}
}
}
}
var fieldValue;
runSearchObj.result
.forEach(function(eachRow, index) {
for (var key in columns) {
if (columns[key].label != 'nodisplay') {
fieldValue = (eachRow
.getText(columns[key])) ? eachRow
.getText(columns[key]) :
eachRow
.getValue(columns[key]);
searchSublist.setSublistValue({
id: key,
value: assignDefaultValue(
fieldValue, " - "),
line: index
});
}
}
});
}
form.clientScriptFileId = 4516;
if (mode == 'download' && form_name == 2) {
log.debug("mutabakati");
returnObj = JSON.parse(returnObj);
// to get the each files
//to get PDF set
var XML = getPDFContents(returnObj);
var jsonFileDownload = file.create({
name: 'JsonFileDownload.txt',
fileType: file.Type.PLAINTEXT,
contents: XML,
folder: 1214
});
jsonFileDownload.save();
var renderer = render.create();
renderer.templateContent = XML
var pdfFile = renderer.renderAsPdf();
context.response.writeFile(pdfFile, true);
} else if (mode == 'send' && form_type == 2) {
var scheduleScrptTask = task.create({
taskType: task.TaskType.SCHEDULED_SCRIPT,
scriptId: 'customscript_mbs13_jj_ss_sendmail',
deploymentId: 'customdeploy_mbs13_jj_ss_sendmail',
params: {
custscript_object: returnObj,
custscript_form_type: form_type
}
});
scheduleScrptTask.submit();
//context.response.write("Initiated mail send ....");
context.response.writePage(form);
} else {
context.response.writePage(form);
}
}
// 4516
} catch (e) {
log.debug("Err@ FN onRequest", e);
// log.error("Err@ onAction FN ",e.message);
}
}
/****************************************************
* Function to get XML Contents
****************************************************/
function getPDFContents(returnObj) {
log.debug("returnObj", returnObj)
try {
var XML = '<?xml version="1.0"?><!DOCTYPE pdf PUBLIC "-//big.faceless.org//report" "report-1.1.dtd"> <pdfset>';
// to loop the contents
for (var key in returnObj) {
returnObj[key].name = escape_for_xml((returnObj[key].name));
returnObj[key].stringDate = (returnObj[key].stringDate)
returnObj[key].amt = (returnObj[key].amt)
XML = XML + '<pdf>' +
'<head>' +
' <link name="NotoSans" type="font" subtype="truetype" src="${nsfont.NotoSans_Regular}" src-bold="${nsfont.NotoSans_Bold}" src-italic="${nsfont.NotoSans_Italic}" src-bolditalic="${nsfont.NotoSans_BoldItalic}" bytes="2" />' +
' <#if .locale == "zh_CN">' +
' <link name="NotoSansCJKsc" type="font" subtype="opentype" src="${nsfont.NotoSansCJKsc_Regular}" src-bold="${nsfont.NotoSansCJKsc_Bold}" bytes="2" />' +
' <#elseif .locale == "zh_TW">' +
' <link name="NotoSansCJKtc" type="font" subtype="opentype" src="${nsfont.NotoSansCJKtc_Regular}" src-bold="${nsfont.NotoSansCJKtc_Bold}" bytes="2" />' +
' <#elseif .locale == "ja_JP">' +
' <link name="NotoSansCJKjp" type="font" subtype="opentype" src="${nsfont.NotoSansCJKjp_Regular}" src-bold="${nsfont.NotoSansCJKjp_Bold}" bytes="2" />' +
' <#elseif .locale == "ko_KR">' +
' <link name="NotoSansCJKkr" type="font" subtype="opentype" src="${nsfont.NotoSansCJKkr_Regular}" src-bold="${nsfont.NotoSansCJKkr_Bold}" bytes="2" />' +
' <#elseif .locale == "th_TH">' +
' <link name="NotoSansThai" type="font" subtype="opentype" src="${nsfont.NotoSansThai_Regular}" src-bold="${nsfont.NotoSansThai_Bold}" bytes="2" />' +
' </#if>' +
' <macrolist>' +
' <macro id="nlheader">' +
' <table style="width: 100%; font-size: 10pt;"><tr>' +
' <td align="right" style="padding: 0;"><img src="https://system.eu2.netsuite.com/core/media/media.nl?id=21&c=4977528&h=87a60f0e3ed3171b9559" style="float: right; margin: 7px" /> </td>' +
' </tr>' +
' </table>' +
' </macro>' +
' <macro id="nlfooter">' +
' <table style="width: 100%; font-size: 8pt;"><tr>' +
' <td></td>' +
' <td align="right" style="padding: 0;"><pagenumber/> of <totalpages/></td>' +
' </tr></table>' +
' </macro>' +
' </macrolist>' +
' <style type="text/css">* {' +
' <#if .locale == "zh_CN">' +
' font-family: NotoSans, NotoSansCJKsc, sans-serif;' +
' <#elseif .locale == "zh_TW">' +
' font-family: NotoSans, NotoSansCJKtc, sans-serif;' +
' <#elseif .locale == "ja_JP">' +
' font-family: NotoSans, NotoSansCJKjp, sans-serif;' +
' <#elseif .locale == "ko_KR">' +
' font-family: NotoSans, NotoSansCJKkr, sans-serif;' +
' <#elseif .locale == "th_TH">' +
' font-family: NotoSans, NotoSansThai, sans-serif;' +
' <#else>' +
' font-family: NotoSans, sans-serif;' +
' </#if>' +
' }' +
' table {' +
' font-size: 8pt;' +
' table-layout: fixed;' +
' }' +
' th {' +
' font-weight: bold;' +
' font-size: 8pt;' +
' vertical-align: middle;' +
' padding: 5px 6px 3px;' +
' background-color: #e3e3e3;' +
' color: #333333;' +
' }' +
' td {' +
' padding: 4px 6px;' +
' }' +
' td p { align:left }' +
'</style>' +
'</head>' +
'<body header="nlheader" header-height="10%" footer="nlfooter" footer-height="10pt" padding="1.00in 1.00in 1.00in 1.00in" size="Letter">' +
' <#assign aDateTime = .now>' +
' <table width="110%" style="font-family: Times New Roman, Times, serif;font-size: 11pt;"><tr><td align="left">' +
' <p style="font-family: Times New Roman, Times, serif;font-size: 11pt;"> Sayın,' +
returnObj[key].name + '</p></td> <td style="padding-left:170px;"><p style="font-family: Times New Roman, Times, serif;font-size: 11pt;"> Tarih:${aDateTime?date}</p></td></tr></table><br/>' +
'' +
'' +
'' +
' <p style="font-family: Times New Roman, Times, serif;font-size: 11pt;">Şirketimizde bulunan cari hesaplarınızda ' +
returnObj[key].stringDate + ' tarihi itibariyle ' + returnObj[key].amt + ' TL BORÇ / ALACAK bakiyesi vermektedir.</p><br/>' +
'' +
' <p style="font-family: Times New Roman, Times, serif;font-size: 11pt;">Mutabık olup olmadığımızı bildirmenizi rica ederiz.</p><br/>' +
'' +
'' +
' <p style="font-family: Times New Roman, Times, serif;font-size: 11pt;">NOT:<br/>1. Mutabakat veya itirazınızı 7 gün içinde bildirmediğiniz takdirde T.T.K’nın 93.maddesi gereğince mutabık sayılacağımızı hatırlatırız.<br/>2. Bakiyede mutabık olmadığımız takdirde hesap ekstrenizi göndermenizi rica ederiz.</p>' +
' ' +
'<br/>' +
'' +
' <p style="font-family: Times New Roman, Times, serif;font-size: 11pt;">Saygılarımızla,<br/>BAŞARAN OTOM. SAN.TİC.AŞ.</p>' +
'' +
'<br/>' +
' <hr style="width:600px;color:#5d5f60;border-width:0.1px;"/>' +
'<br/><br/>' +
' <p style="font-family: Times New Roman, Times, serif;font-size: 11pt;">Sayın BAŞARAN OTOMOTİV SAN.TİC.AŞ.</p>' +
'' +
'<br/>' +
'' +
'' +
' <p style="font-family: Times New Roman, Times, serif;font-size: 11pt;">...............tarihi itibariyle...................TL BORÇ / ALACAK bakiyesinde mutabık OLDUĞUMUZU/OLMADIĞIMIZI bildiririz.</p>' +
'' +
' ' +
'<br/>' +
' <p style="font-family: Times New Roman, Times, serif;font-size: 11pt;"> Kaşe/İmza</p>' +
'' +
'' +
'' +
'' +
'</body>' +
'</pdf>';
}
XML = XML + '</pdfset>'
return XML;
} catch (e) {
log.debug("Err@ FN getPDFContents", e);
//log.error("Err@ onAction FN ",e.message);
//console.log("Err@ FN =",e.message);
}
}
/*******************************************************************
* To Format Currency
*
******************************************************************/
function format(n) {
return n.toFixed(2).replace(/./g, function(c, i, a) {
return i > 0 && c !== "." && (a.length - i) % 3 === 0 ? "," + c : c;
});
}
/*******************************************************************
* To format the search according to page Index
******************************************************************/
function formatSavedSearch(savedSearchObj, pageIndexField,
pageIndex) {
try {
var columns = savedSearchObj.columns;
var columnsData = {};
columns.forEach(function(result, counter) {
// columnsData['custpage_col_' + counter] = result;
columnsData[(columnsData[result.name]) ? (result.name +
'_' + counter) : (result.name)] = result;
});
log.debug('columnsData', columnsData)
// Paginating Results
var searchPageRanges, size = 15;
if (savedSearchObj.length < 15) {
size = savedSearchObj.length;
}
try {
searchPageRanges = savedSearchObj.runPaged({
pageSize: size
});
} catch (err) {
return {
status: true,
columns: columnsData,
result: []
};
}
if (searchPageRanges.pageRanges.length < 1)
return {
status: true,
columns: columnsData,
result: []
};
for (var i = 0, j = searchPageRanges.pageRanges.length; i < j; i++) {
pageIndexField.addSelectOption({
value: i,
text: i + 1 + ' of ' + j + ' Pages'
});
}
// Fetching Row Data
var rowData = [];
var randomObj = {};
searchPageRanges.fetch({
index: pageIndex
}).data.forEach(function(result) {
var entity = result.getValue({
name: "entity",
summary: "GROUP",
sort: search.Sort.ASC,
label: "Unvan"
});
var amount = result.getValue({
name: "amount",
summary: "SUM",
label: "Bakiye"
});
log.debug("entity", entity)
if (!randomObj[entity] && entity!="") {
randomObj[entity] = {amount:amount};
rowData.push(result);
}
});
log.debug(Object.keys(randomObj).length, randomObj);
return {
status: true,
columns: columnsData,
result: rowData
};
} catch (e) {
log.debug("Err@ FN formatSavedSearch", e.message);
// log.error("Err@ onAction FN ",e.message);
// console.log("Err@ FN =",e.message);
}
}
/*******************************************************************
* To Create Search
*
******************************************************************/
function runSearch(endDateSelected, pageIndexField, pageIndex) {
try {
var filterArray = [
["accounttype", "anyof", "AcctRec", "AcctPay"],
"AND",
["posting", "is", "T"],
"AND",
["name", "noneof", "2"],
"AND",
["type", "noneof", "Custom104"]
];
var isFirstElement = 0;
if (checkForParameter(endDateSelected)) {
filterArray.push("AND", ["trandate", "before",
endDateSelected
]);
}
// to create search
var transactionSearchObj = search
.create({
type: "transaction",
filters: filterArray,
columns: [
search.createColumn({
name: "entity",
summary: "GROUP",
sort: search.Sort.ASC,
label: "Unvan"
}),
search.createColumn({
name: "amount",
summary: "SUM",
label: "Bakiye"
}),
search.createColumn({
name: "formulatext",
summary: "GROUP",
formula: "case when {vendor.email} IS NOT NULL Then {vendor.email} ELSE case when {customermain.email} IS NOT NULL Then {customermain.email} ELSE 'Boş' END END",
label: "email"
})
]
});
var searchResultCount = transactionSearchObj.runPaged().count;
log.debug('searchResultCount', searchResultCount)
return formatSavedSearch(transactionSearchObj,
pageIndexField, pageIndex);
// }
} catch (e) {
log.debug("Err@ FN runSearch", e);
}
}
/*******************************************************************
* To check whether a value exists in parameter
******************************************************************/
function checkForParameter(parameter, parameterName) {
try {
if (parameter !== null && parameter !== undefined &&
parameter !== false && parameter !== "null" &&
parameter !== "undefined" &&
parameter !== "false" && parameter != "" &&
parameter != " ") {
return true;
} else {
if (parameterName)
log.debug('Empty Value found',
'Empty Value for parameter ' +
parameterName);
return false;
}
} catch (e) {
log.debug("Err@ FN checkForParameter", e);
}
}
/*******************************************************************
* To assign a default value if the it is empty
*
* @param value
* @param defaultValue
* @returns
******************************************************************/
function assignDefaultValue(value, defaultValue) {
try {
if (checkForParameter(value))
return value;
else
return defaultValue;
} catch (e) {
log.debug("Err@ FN assignDefaultValue", e);
}
}
/*******************************************************************
* Fix text
*
* @param argument
* @returns Created By JJ on 15-Nov-2017 4:30:21 PM
*/
function escape_for_xml(argument, xml) {
try {
if (argument != "" && argument != null) {
//var newString = xml.escape({
// xmlText : argument
//});
argument = argument.replace(/&/g, '&');
argument = argument.replace(/</g, '<');
argument = argument.replace(/>/g, '>');
argument = argument.replace(/"/g, '"');
argument = argument.replace(/'/g, ''');
return argument;
} else {
return "";
}
} catch (e) {
log.debug({
title: e.name,
details: e.message
});
}
}
return {
onRequest: onRequest
//escape_for_xml:escape_for_xml
};
});
Suitelete:MBS-20 JJ SL Form Selection Page
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/*******************************************************************************
* CLIENTNAME:Moneta Business Solutions MBS -20
* ************************************************************************ Date :
* 29/05/2019
*
* Author: Jobin & Jismi IT Services LLP Script Description : This is to Create
* a SL for choosing the form type Date created : 29/05/2019
*
* REVISION HISTORY
*
* Revision 1.0 ${29/05/2019} nd : created
*
*
******************************************************************************/
define(['N/ui/serverWidget'],
function(serverWidget) {
/**
* 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 {
if (context.request.method === 'GET') {
var form = serverWidget.createForm({
title: 'Mutabakat Formu'
});
form.clientScriptFileId = 4516;
var formType = form.addField({
id: 'custpage_type',
label: 'Mutabakat Tipi',
type: serverWidget.FieldType.SELECT
});
formType.addSelectOption({
value: '0',
text: 'Select Any..'
});
formType.addSelectOption({
value: '1',
text: 'Ba-Bs Mutabakatı'
});
formType.addSelectOption({
value: '2',
text: 'Cari Mutabakatı'
});
context.response.writePage(form);
}
} catch (err) {
log.debug('error @ onRequest', err)
}
}
return {
onRequest: onRequest
};
});