Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Auto-apply NetSuite Customer Payments to NetSuite Invoices when they are Created or Edited
/*
Author: <mike@suitesync.io>
Description: When is invoice is created or edited, any unapplied payments on the customer
are auto-applied to the invoice.
Link: https://gist.github.com/iloveitaly/a35d460b0fb744a290dce3db95873e41
Installation:
1. https://system.sandbox.netsuite.com/app/common/scripting/uploadScriptFile.nl
2. User Event
3. Name: Auto-apply Unapplied Customer Payments
4. ID: _invoice_auto_apply_payments
5. After Submit: afterSubmit
6. Deployments: Invoice. Event Type: blank. Ensure accessible to all roles and executes as admin.
*/
// Utils
// https://gist.github.com/iloveitaly/db7d532e772b67f5b81d0199d094301f
function isEmpty(obj) {
return obj === undefined || obj === null || obj === "";
}
function log(msg) {
nlapiLogExecution('DEBUG', msg);
}
function getUnappliedCustomerPaymentsForCustomer(customerInternalId) {
var filters = [
new nlobjSearchFilter('entity', null, 'anyof', customerInternalId),
new nlobjSearchFilter('mainline', null, 'is', 'T')
];
var results = nlapiSearchRecord('customerpayment', null, filters, null);
if(isEmpty(results)) {
log("no payments found for record: " + customerInternalId)
return 0;
}
var unappliedPayments = [];
for(var i = 0; i < results.length; i++ ) {
// NOTE this is a very slow operation, but there is no other way to pull the unapplied
// amount of a payment! It is not available in searches
var paymentId = results[i].getId();
var payment = nlapiLoadRecord('customerpayment', paymentId);
if(parseFloat(payment.getFieldValue('unapplied')) != 0.0) {
unappliedPayments.push(payment)
}
}
return unappliedPayments;
}
function canInvoiceBePaid(invoiceId) {
var transactionStatus = nlapiLookupField('invoice', invoiceId, 'statusRef');
// NOTE not all NetSuite accounts have a pendingApproval status
return !(transactionStatus == 'paidInFull' || transactionStatus == 'pendingApproval' || transactionStatus == 'rejected')
}
function afterSubmit(type) {
if(type == 'create' || type == 'edit') {
if(nlapiGetRecordType() == 'invoice') {
processInvoiceAfterSubmit(nlapiGetRecordId())
} else {
log("invalid record type processed: " + type)
}
}
}
function processInvoiceAfterSubmit(invoiceInternalId) {
if(!canInvoiceBePaid(invoiceInternalId)) {
log("invoice cannot be or is already paid");
return null;
}
// NOTE assumes jobs are not in use in the netsuite account
var entityId = nlapiLookupField('invoice', invoiceInternalId, 'entity');
var unappliedPayments = getUnappliedCustomerPaymentsForCustomer(entityId);
for(var i = 0; i < unappliedPayments.length; i++ ) {
var payment = unappliedPayments[i]
payment.setFieldValue('autoapply', 'T');
nlapiSubmitRecord(payment, true);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.