Jira Code: TRS-7
Create a vendor bill using the custom form and in the approval button action, the vendor bill converts into a journal entry.
In this task, the primary fund number is auto-populated. In the validation part, the button is only visible for the particular vendor bill created using custom suitelet form.
//Suitelet for creating custom form and button action
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/*******************************************************************************
* Trust Bridge
*
******************************************************************************
* Date:
* Author: Jobin & Jismi IT Services LLP
* Script Description: Created for suitelet form for creating vendor bill,
* Date created :18/06/2019
******************************************************************************/
define(['N/ui/serverWidget', 'N/search', 'N/record', 'N/runtime'],
function(serverWidget, search, record, runtime) {
/**
* 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 checkForParameter(parameter) {
if (parameter != "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter !== 'false' && parameter != " ")
return parameter;
else {
return null;
}
}
function onRequest(context) {
if (context.request.method == 'GET') {
try {
var chartArr = [];
// crate custom form with fields
var form = serverWidget.createForm({
title: 'CREATE A VENDOR BILL'
});
form.clientScriptFileId = 642;
// Add fields that will shows in results
var nameField = form.addField({
id: 'custpage_name',
type: serverWidget.FieldType.SELECT,
label: 'Vendor name',
source: 'vendor'
})
nameField.isMandatory = true;
nameField.updateDisplaySize({
height: 80,
width: 600
});
var dateField = form.addField({
id: 'custpage_date',
type: serverWidget.FieldType.DATE,
label: 'Date'
})
dateField.isMandatory = true;
dateField.updateDisplaySize({
height: 80,
width: 600
});
var currencyField = form.addField({
id: 'custpage_currency',
type: serverWidget.FieldType.SELECT,
label: 'Currency',
source: 'currency'
});
currencyField.isMandatory = true;
currencyField.updateDisplaySize({
height: 80,
width: 600
});
// search for getting chart of account child under grant account
var accountSearchObj = search.create({
type: "account",
filters: [
["parent", "anyof", "252"] //grant expense chart of account
],
columns: [
search.createColumn({
name: "name",
sort: search.Sort.ASC,
label: "Name"
}),
search.createColumn({ name: "internalid", label: "Internal ID" })
]
});
var searchResultCount = accountSearchObj.runPaged().count;
log.debug("accountSearchObj result count", searchResultCount);
accountSearchObj.run().each(function(result) {
var chartObj = {};
chartObj.name = result.getValue(accountSearchObj.columns[0]);
chartObj.id = result.getValue(accountSearchObj.columns[1]);
chartArr.push(chartObj);
return true;
});
var accountField = form.addField({
id: 'custpage_account',
type: serverWidget.FieldType.SELECT,
label: 'Account'
});
accountField.isMandatory = true;
accountField.addSelectOption({
value: "",
text: ""
});
for (var i = 1; i < chartArr.length; i++) {
accountField.addSelectOption({
value: chartArr[i].id,
text: chartArr[i].name
});
}
accountField.updateDisplaySize({
height: 80,
width: 600
});
var amountField = form.addField({
id: 'custpage_amount',
type: serverWidget.FieldType.CURRENCY,
label: 'Amount'
});
amountField.updateDisplaySize({
height: 80,
width: 40
});
amountField.isMandatory = true;
var memoField = form.addField({
id: 'custpage_memo',
type: serverWidget.FieldType.TEXT,
label: 'Memo'
});
memoField.isMandatory = true;
memoField.updateDisplaySize({
height: 80,
width: 40
});
var fundField = form.addField({
id: 'custpage_fundnum',
type: serverWidget.FieldType.SELECT,
label: 'Fund number',
source: 'customrecord_cseg5'
});
fundField.isMandatory = true;
fundField.updateDisplaySize({
height: 80,
width: 600
});
var primaryField = form.addField({
id: 'custpage_primarychar',
type: serverWidget.FieldType.SELECT,
label: 'Primary Charity Purpose',
source: 'customrecord_cseg6'
});
primaryField.isMandatory = true;
primaryField.updateDisplaySize({
height: 80,
width: 600
});
form.addSubmitButton('Submit');
context.response.writePage(form);
} catch (err) {
log.debug("err", err);
}
} else {
try {
// getting values using post action and set values for mandatory field
var currentUserMail = runtime.getCurrentUser().email;
log.debug("currentUserMail", currentUserMail)
var billRecord = record.create({
type: record.Type.VENDOR_BILL
});
billRecord.setText({
fieldId: 'custbody_user_mailid',
text: currentUserMail
});
billRecord.setText({
fieldId: 'approvalstatus',
text: "Pending Approval"
});
var nameField2 = context.request.parameters.custpage_name
log.debug("nameField2", nameField2)
billRecord.setValue({
fieldId: 'entity',
value: checkForParameter(nameField2)
});
var dateField2 = context.request.parameters.custpage_date
log.debug("dateField2", dateField2)
billRecord.setValue({
fieldId: 'trandate',
value: new Date(dateField2)
});
var currencyField2 = context.request.parameters.custpage_currency
log.debug("currencyField2", currencyField2)
billRecord.setValue({
fieldId: 'currency',
value: checkForParameter(currencyField2)
});
var memoField2 = context.request.parameters.custpage_memo
log.debug("memoField2", memoField2)
billRecord.setValue({
fieldId: 'memo',
value: checkForParameter(memoField2)
});
var fundField2 = context.request.parameters.custpage_fundnum
log.debug("fundField2", fundField2)
billRecord.setValue({
fieldId: 'cseg5',
value: checkForParameter(fundField2)
});
var primaryField2 = context.request.parameters.custpage_primarychar
log.debug("primaryField2", primaryField2)
billRecord.setValue({
fieldId: 'cseg6',
value: checkForParameter(primaryField2)
});
var amountField2 = context.request.parameters.custpage_amount
log.debug("amountField2", amountField2)
billRecord.setSublistValue({
sublistId: 'expense',
fieldId: 'amount',
line: 0,
value: checkForParameter(amountField2)
});
var accountField2 = context.request.parameters.custpage_account
log.debug("accountField2", accountField2)
billRecord.setSublistValue({
sublistId: 'expense',
fieldId: 'account',
line: 0,
value: checkForParameter(accountField2)
});
var billRecordId = billRecord.save({
enableSourcing: true,
ignoreMandatoryFields: true
});
log.debug("billRecordId", billRecordId);
if (billRecordId) {
var htmlCode = '<html><head></head><body><script>confirm("Successfully created Vendor Bill. Internal ID of Vendor bill = ' + billRecordId + '");window.location.href ="' + "https://5432341-sb1.app.netsuite.com/app/site/hosting/scriptlet.nl?script=24&deploy=1&whence=" + '";</script></body></html>';
context.response.write(htmlCode);
}
} catch (err1) {
log.debug("err1", err1);
}
}
}
return {
onRequest: onRequest
};
});
// client script for field change for auto population and currency validation.
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
/*******************************************************************************
* Trust Bridge
*
******************************************************************************
* Date:
* Author: Jobin & Jismi IT Services LLP
* Script Description:Created for auto populating field in the vendonor name selection.
* Date created :18/06/2019
******************************************************************************/
define(['N/record', 'N/currentRecord', 'N/search'], function(record, currentRecord, search) {
function fieldChanged(context) {
try {
var currentRecord = context.currentRecord;
console.log("currentRecord", currentRecord);
var FieldName = context.fieldId;
var currentVendor = currentRecord.getValue({
'fieldId': 'custpage_name'
});
console.log("currentVendor", currentVendor);
if (FieldName == 'custpage_name') {
currentRecord.setValue({
fieldId: 'custpage_currency',
value: ""
});
var sourceItem = search.lookupFields({
type: search.Type.VENDOR,
id: currentVendor,
columns: ['cseg6']
});
console.log("sourceItem", sourceItem);
if (sourceItem.cseg6[0])
var primaryCharity = sourceItem.cseg6[0].value;
console.log("primaryCharity", primaryCharity);
if (primaryCharity != null && primaryCharity != "" && primaryCharity != undefined) {
currentRecord.setValue({
fieldId: 'custpage_primarychar',
value: primaryCharity
});
}
}
if (FieldName == 'custpage_currency') {
var currentVendorCurrency = currentRecord.getValue({
'fieldId': 'custpage_currency'
});
var vendorSearchObjcurrency = search.create({
type: "vendor",
filters: [
["internalid", "anyof", currentVendor],
"AND",
["vendorcurrencybalance.currency", "anyof", currentVendorCurrency]
],
columns: [
]
});
var searchResultCount = vendorSearchObjcurrency.runPaged().count;
console.log("vendorSearchObjcurrency result count", searchResultCount);
if (searchResultCount == 0) {
console.log("innnnn");
alert("This currency is not added to the customer. Please add and try again.");
currentRecord.setValue({
fieldId: 'custpage_currency',
value: ""
});
return false
}
return true
}
} catch (err) {
console.log("err", err)
}
}
return {
fieldChanged: fieldChanged
};
});
//for creating buttons in vendor bill and editing functionality of button click
/**
* @NApiVersion 2.x
* @NScriptType UserEventScript
* @NModuleScope SameAccount
*/
/*******************************************************************************
* Trust Bridge
*
******************************************************************************
* Date:
* Author: Jobin & Jismi IT Services LLP
* Script Description:Created for button creation and validation.
* Date created :19/06/2019
******************************************************************************/
define(['N/record', 'N/search', 'N/runtime'],
function(record, search, runtime) {
function beforeLoad(context) {
try {
if (context.type == 'view') {
var vendorBill = context.newRecord;
var vendorBillId = vendorBill.id;
log.debug("vendorBillId", vendorBillId);
var currentUserRole = runtime.getCurrentUser().role;
log.debug("currentUserRole", currentUserRole)
var vendorBillBtn = context.form;
vendorBillBtn.clientScriptFileId = 644;
var mailIdFeld = null;
var approvalStatus = null;
var vendorbillSearchObj = search.create({
type: "vendorbill",
filters: [
["type", "anyof", "VendBill"],
"AND",
["internalid", "anyof", vendorBillId],
"AND",
["mainline", "is", "T"]
],
columns: [
search.createColumn({ name: "statusref", label: "Status" }),
search.createColumn({ name: "custbody_user_mailid", label: "USER MAILID" }),
search.createColumn({ name: "internalid", label: "Internal ID" })
]
});
var searchResultCount = vendorbillSearchObj.runPaged().count;
log.debug("vendorbillSearchObj result count", searchResultCount);
vendorbillSearchObj.run().each(function(result) {
approvalStatus = result.getValue(vendorbillSearchObj.columns[0]);
mailIdFeld = result.getValue(vendorbillSearchObj.columns[1]);
return true;
});
if ((mailIdFeld) && (approvalStatus == 'pendingApproval')) {
var vendorBillApproveBtn = vendorBillBtn.addButton({
id: 'custpage_approve',
label: 'Approve',
functionName: 'ApproveBtn'
});
var VendorBillRejectBtn = vendorBillBtn.addButton({
id: 'custpage_reject',
label: 'Reject',
functionName: 'RejectBtn'
});
}
if ((mailIdFeld) && (approvalStatus == 'rejected')) {
var VendorBillRejectBtn = vendorBillBtn.addButton({
id: 'custpage_resubmit',
label: 'Resubmit',
functionName: 'ResubmitBtn'
});
}
}
} catch (er) {
log.debug('er', er);
}
}
function afterSubmit(context) {
try {
var vendorBillContent = context.newRecord;
log.debug("vendorBillContent", vendorBillContent);
var vendorBillIdAfter = vendorBillContent.id;
log.debug("vendorBillIdAfter", vendorBillIdAfter);
var journalEntryFieldAfter = null;
var currentBillAmount = null;
var vendorbillSearchObj = search.create({
type: "vendorbill",
filters: [
["type", "anyof", "VendBill"],
"AND",
["internalid", "anyof", vendorBillIdAfter],
"AND",
["mainline", "is", "F"],
"AND",
["taxline", "is", "F"],
"AND",
["shipping", "is", "F"]
],
columns: [
search.createColumn({ name: "fxamount", label: "Amount (Foreign Currency)" }),
search.createColumn({ name: "internalid", label: "Internal ID" }),
search.createColumn({ name: "custbody_journal_field", label: "JOURNAL FIELD" })
]
});
var searchResultCount = vendorbillSearchObj.runPaged().count;
log.debug("vendorbillSearchObj result count", searchResultCount);
vendorbillSearchObj.run().each(function(result) {
currentBillAmount = result.getValue(vendorbillSearchObj.columns[0]);
journalEntryFieldAfter = result.getValue(vendorbillSearchObj.columns[2]);
return true;
});
if (journalEntryFieldAfter) {
var objRecord = record.load({
type: record.Type.JOURNAL_ENTRY,
id: journalEntryFieldAfter
});
objRecord.setSublistValue({
sublistId: 'line',
fieldId: 'debit',
line: 0,
value: currentBillAmount
})
objRecord.setSublistValue({
sublistId: 'line',
fieldId: 'credit',
line: 1,
value: currentBillAmount
})
var recordId = objRecord.save({
enableSource: true,
ignoreMandatoryFields: true
});
log.debug("recordId", recordId);
}
} catch (err) {
log.debug("err", err);
}
}
return {
beforeLoad: beforeLoad,
afterSubmit: afterSubmit
};
});
// create a client script for buttons and button action.
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
/*******************************************************************************
* Trust Bridge
*
******************************************************************************
* Date:
* Author: Jobin & Jismi IT Services LLP
* Script Description:Created for journal entry creation and buttons action.
* Date created :20/06/2019
******************************************************************************/
define(['N/currentRecord', 'N/url', 'N/https', 'N/search', 'N/runtime', 'N/record', 'N/email'],
function(currentRecord, url, https, search, runtime, record, email) {
function pageInit(scriptContext) {
try {
console.log("inn");
document.getElementById("inpt_approvalstatus2").disabled = true;
jQuery("#inpt_approvalstatus2,#inpt_approvalstatus2_arrow").css('pointer-events', 'none');
} catch (err) {
console.log("err", err)
}
}
function ApproveBtn() {
try {
console.log("enter")
document.getElementById("custpage_approve").disabled = true;
var vendorBillApprove = currentRecord.get();
console.log("vendorBillApprove", vendorBillApprove)
var vendorBiilId = vendorBillApprove.id;
console.log("vendorBiilId", vendorBiilId);
var billArr = [];
var vendorbillSearchObj = search.create({
type: "vendorbill",
filters: [
["type", "anyof", "VendBill"],
"AND",
["mainline", "is", "F"],
"AND",
["internalid", "anyof", vendorBiilId],
"AND",
["taxline", "is", "F"],
"AND",
["shipping", "is", "F"]
],
columns: [
search.createColumn({ name: "memomain", label: "Memo (Main)" }),
search.createColumn({ name: "subsidiary", label: "Subsidiary" }),
search.createColumn({ name: "currency", label: "Currency" }),
search.createColumn({ name: "trandate", label: "Date" }),
search.createColumn({ name: "fxamount", label: "Amount (Foreign Currency)" }),
search.createColumn({
name: "entityid",
join: "vendor",
label: "Name"
}),
search.createColumn({ name: "account", label: "Account" }),
search.createColumn({ name: "cseg5", label: "Fund Number" })
]
});
var searchResultCount = vendorbillSearchObj.runPaged().count;
console.log("vendorbillSearchObj result count", searchResultCount);
vendorbillSearchObj.run().each(function(result) {
var billObj = {};
billObj.memomain = result.getValue(vendorbillSearchObj.columns[0]);
billObj.subsidiary = result.getValue(vendorbillSearchObj.columns[1]);
billObj.currency = result.getValue(vendorbillSearchObj.columns[2]);
billObj.trandate = result.getValue(vendorbillSearchObj.columns[3]);
billObj.amount = result.getValue(vendorbillSearchObj.columns[4]);
billObj.Name = result.getValue(vendorbillSearchObj.columns[5]);
billObj.account = result.getValue(vendorbillSearchObj.columns[6]);
billObj.fundnumber = result.getValue(vendorbillSearchObj.columns[7]);
billArr.push(billObj);
return true
});
console.log("billArr", billArr);
// search for getting virtal currency account equalent for currency type
var currencyAccountName = null;
var currencyAccountId = null;
var accountSearchObj = search.create({
type: "account",
filters: [
["custrecord_virtual_currency", "anyof", billArr[0].currency]
],
columns: [
search.createColumn({
name: "name",
sort: search.Sort.ASC,
label: "Name"
}),
search.createColumn({ name: "internalid", label: "Internal ID" })
]
});
var searchResultCount = accountSearchObj.runPaged().count;
console.log("accountSearchObj result count", searchResultCount);
accountSearchObj.run().each(function(result) {
currencyAccountName = result.getValue(accountSearchObj.columns[0]);
currencyAccountId = result.getValue(accountSearchObj.columns[1]);
return true;
});
console.log("currencyAccountName", currencyAccountName);
console.log("currencyAccountId", currencyAccountId);
var journalRecord = record.create({
type: record.Type.JOURNAL_ENTRY
});
journalRecord.setValue({
fieldId: 'trandate',
value: new Date(billArr[0].trandate)
});
journalRecord.setValue({
fieldId: 'subsidiary',
value: billArr[0].subsidiary
});
journalRecord.setValue({
fieldId: 'currency',
value: billArr[0].currency
});
journalRecord.setValue({
fieldId: 'memo',
value: billArr[0].memomain
});
journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'account', line: 0, value: currencyAccountId });
journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'debit', line: 0, value: billArr[0].amount });
journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'cseg5', line: 0, value: billArr[0].fundnumber });
journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'account', line: 1, value: currencyAccountId });
journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'credit', line: 1, value: billArr[0].amount });
journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'cseg5', line: 1, value: billArr[0].fundnumber });
var recordId = journalRecord.save({
enableSource: false,
ignoreMandatoryFields: true
});
console.log("recordid", recordId);
var journalField = record.submitFields({
type: record.Type.VENDOR_BILL,
id: vendorBiilId,
values: {
custbody_journal_field: recordId,
approvalstatus: 2 // setting approval status to open
}
});
console.log("journalField", journalField);
window.location.reload();
} catch (er) {
console.log('er', er);
}
}
function RejectBtn() {
try {
document.getElementById("custpage_reject").disabled = true;
var vendorBillReject = currentRecord.get();
console.log("vendorBillReject", vendorBillReject)
var vendorBiilIdMail = vendorBillReject.id;
console.log("vendorBiilIdMail", vendorBiilIdMail);
var currentUserMail = runtime.getCurrentUser().email;
console.log("currentUserMail", currentUserMail);
var mailRecipient = null;
var journalField = record.submitFields({
type: record.Type.VENDOR_BILL,
id: vendorBiilIdMail,
values: {
approvalstatus: 3
}
});
var vendorbillSearchObj2 = search.create({
type: "vendorbill",
filters: [
["type", "anyof", "VendBill"],
"AND",
["internalid", "anyof", vendorBiilIdMail],
"AND",
["mainline", "is", "T"]
],
columns: [
search.createColumn({ name: "custbody_user_mailid", label: "USER MAILID" })
]
});
var searchResultCount = vendorbillSearchObj2.runPaged().count;
console.log("vendorbillSearchObj2 result count", searchResultCount);
vendorbillSearchObj2.run().each(function(result) {
mailRecipient = result.getValue(vendorbillSearchObj2.columns[0]);
return true;
});
console.log("mailRecipient", mailRecipient);
if (mailRecipient) {
console.log("innn")
email.send({
author: -5, //administrator Mail,
recipients: mailRecipient,
subject: 'Vendor bill id - ' + vendorBiilIdMail + ' : Rejected',
body: 'The vendor bill of id = ' + vendorBiilIdMail + ' has been rejected. Please do necessary changes and resubmit.'
});
}
window.location.reload();
} catch (err2) {
console.log('err2', err2);
}
}
function ResubmitBtn() {
try {
document.getElementById("custpage_resubmit").disabled = true;
var vendorBillResubmit = currentRecord.get();
console.log("vendorBillResubmit", vendorBillResubmit)
var vendorBiilIdResubmitBtn = vendorBillResubmit.id;
console.log("vendorBiilIdResubmitBtn", vendorBiilIdResubmitBtn);
var satusField3 = record.submitFields({
type: record.Type.VENDOR_BILL,
id: vendorBiilIdResubmitBtn,
values: {
approvalstatus: 1
}
});
window.location.reload();
} catch (err3) {
console.log('err3', err3);
}
}
return {
pageInit: pageInit,
ApproveBtn: ApproveBtn,
RejectBtn: RejectBtn,
ResubmitBtn: ResubmitBtn
};
});