Scenario:
- When an IF is generated for the Adobe Commerce order it will be synched to the Adobe Commerce website through a real time sync.
- The Shipment tracking numbers will be also synced to Website.
- The shipments of the items that are back ordered at the time of placing the order are not considered in the scenario.
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
/*******************************************************************************************************
* Szco Supplies, Inc
*
* SZCO-755 : NetSuite - Magento Item Fulfillment Sync
*
* *****************************************************************************************************
*
* Author: Jobin and Jismi IT Services
*
* Date Created : 20-August-2023
*
*Description : This script is to implement an integration between NetSuite and Magento to sync the
Item fulfillments in NetSuite to Magento
*
* REVISION HISTORY
*
* @version 1.0 SZCO-755 : 20-August-2023 : Created the initial build by JJ0152
*
******************************************************************************************************/
define(['N/error', 'N/record', 'N/search', '../Common Library/jj_adobe_common_library.js', '../Common Library/jj_adobe_ns_utility.js'],
/**
* @param{error} error
* @param{record} record
* @param{runtime} runtime
* @param{search} search
*/
(error, record, search, adobeLib, jjUtil) => {
/**
* @desc function to fetch the integration record data
* @param soId
* @return {*}
*/
function fetchIntegrationRecData(soId) {
try {
let integrationRecData = {};
let customRecordSearch = search.create({
type: 'customrecord_jj_adobe_order_sync_szco227',
columns: [{
name: 'custrecord_jj_adobe_order_id'
}, {
name: 'internalid'
}],
filters: [["custrecord_jj_adobe_sales_order", "is", soId], "AND", ["isinactive", "is", "F"]]
});
let customRecordSearchCount = customRecordSearch.runPaged().count;
integrationRecData.count = customRecordSearchCount;
if (customRecordSearchCount > 0) {
customRecordSearch.run().each(function (result) {
integrationRecData.recId = result.getValue({
"name": "internalid"
});
integrationRecData.orderEnityId = result.getValue({
"name": "custrecord_jj_adobe_order_id"
});
return true;
});
}
else {
return { 'count': 0, 'recId': "", 'orderEnityId': "" };
}
return integrationRecData;
} catch (e) {
log.error("Error@fetchIntegrationRecData", e.message)
return { 'count': 0, 'recId': "", 'orderEnityId': "" };
}
}
/**
* @desc function to set data in integration record
* @param response
* @param customRecDetails
*/
function setIntegrationRecData(responseData, customRecDetails, ifRecId) {
try {
let today = new Date();
let customRecord = record.load({
type: 'customrecord_jj_adobe_order_sync_szco227',
id: Number(customRecDetails.recId)
});
customRecord.setValue({
fieldId: "custrecord_api_request_if",
value: JSON.stringify(responseData.payLoad)
});
if (responseData.code == '200') {
customRecord.setValue({
fieldId: "custrecord_jj_status_if_creation",
value: "CREATED"
});
let IFArray = customRecord.getValue('custrecord_jj_item_fulfil_id');
IFArray.push(ifRecId);
customRecord.setValue({
fieldId: "custrecord_jj_item_fulfil_id",
value: IFArray
});
let shipID = customRecord.getValue('custrecord_jj_magento_if_id');
if (shipID) {
customRecord.setValue('custrecord_jj_magento_if_id', shipID + ", " + JSON.parse(responseData.response))
} else {
customRecord.setValue({
fieldId: "custrecord_jj_magento_if_id",
value: JSON.parse(responseData.response)
});
log.debug("responseData.ifId", JSON.parse(responseData.response));
}
customRecord.setValue('custrecord_jj_error_if_creation', "");
customRecord.setValue('custrecord_if_updated_date', today);
// set value in IF record in netsuite
record.submitFields({
type: record.Type.ITEM_FULFILLMENT,
id: ifRecId,
values: {
custbody_jj_adobe_if_id: JSON.parse(responseData.response)
},
options: {
enableSourcing: false,
ignoreMandatoryFields: true
}
});
}
else {
customRecord.setValue('custrecord_jj_error_if_creation', JSON.parse(responseData.response)?.message);
customRecord.setValue('custrecord_jj_status_if_creation', "FAILED");
}
customRecord.save({
enableSourcing: false,
ignoreMandatoryFields: true
});
} catch (e) {
log.error("error @setIntegrationRecData", e);
}
}
/**
* function to create IF in Adobe
* @param {Object} newRecord
* @param {Number} soAdobeId
* @returns {Object}
*/
function createIfInAdobe(newRecord, soAdobeId) {
let payLoad;
try {
//loop through the item sublist
let numLines = newRecord.getLineCount({
sublistId: 'item'
});
let shippingCarrier = newRecord.getText({ fieldId: 'shipcarrier' })
let items = [], tracks = [];
for (let i = 0; i < numLines; i++) {
let lineItemObj = {};
let fulfill = newRecord.getSublistValue({
fieldId: 'itemreceive',
sublistId: 'item',
line: i
});
if (fulfill == true) {
let itemQuantity = newRecord.getSublistValue({
fieldId: 'quantity',
sublistId: 'item',
line: i
});
let itemType = newRecord.getSublistValue({
fieldId: 'itemtype',
sublistId: 'item',
line: i
});
if (itemType == "InvtPart") {
let lineItemIdArr = newRecord.getSublistValue({
fieldId: 'custcol_jj_adobe_line_id',
sublistId: 'item',
line: i
});
lineItemObj.qty = itemQuantity;
lineItemObj.order_item_id = lineItemIdArr;
items.push(lineItemObj);
}
}
}
//get the tracking number/s
let trackignLines = newRecord.getLineCount({
sublistId: 'package'
});
log.debug('trackignLines', trackignLines)
for (let i = 0; i < trackignLines; i++) {
let trackNumberObj = {};
let trackNum = newRecord.getSublistValue({
sublistId: 'package',
fieldId: 'packagetrackingnumber',
line: i
});
log.debug("trackNum",trackNum)
if (trackNum) {
trackNumberObj.track_number = trackNum;
trackNumberObj.title = shippingCarrier;
trackNumberObj.carrier_code = (shippingCarrier == 'nonups') ? "custom" : "United Parcel Service";
tracks.push(trackNumberObj);
log.debug('tracks111', tracks)
}
}
log.debug('tracks', tracks)
let responseData = {};
//Call the create API to create the shipment in website
let shipmentCreateApi = adobeLib.ADOBE_API_REQUESTS.CREATE_ITEM_FULFILLMENT;
shipmentCreateApi = shipmentCreateApi.replace('{orderId}', soAdobeId);
log.debug('shipmentCreateApi', shipmentCreateApi)
let shipmentCreateResponse = adobeLib.commonFunctions.sendAPIRequest(
"POST",
shipmentCreateApi,
{
"items": items,
"tracks": tracks
}
);
log.debug('shipmentCreateResponse', shipmentCreateResponse)
responseData.payLoad = {
"items": items,
"tracks": tracks
}
payLoad = responseData.payLoad;
responseData.code = shipmentCreateResponse.code;
responseData.response = shipmentCreateResponse.body;
return responseData;
} catch (e) {
log.error("createIfInAdobe", e);
return { 'payLoad': payLoad, 'code': '', 'response': e.message };
}
}
/**
* Defines the function definition that is executed after record is submitted.
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {Record} scriptContext.oldRecord - Old record
* @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
* @since 2015.2
*/
const afterSubmit = (scriptContext) => {
try {
//code for checking in sandbox/production // to avoid integration via sandbox after Sandbox refresh
let isSandbox = jjUtil.refFunction.isSandbox();
log.debug("isSandbox", isSandbox);
if (isSandbox) return;
if (scriptContext.type == scriptContext.UserEventType.DELETE) {
return;
}
let newRecord = scriptContext.newRecord;
let ifRecId = newRecord.id;
let soId = newRecord.getValue('createdfrom');
let shipStatus = newRecord.getValue('shipstatus');
let adobeIdExist = newRecord.getValue('custbody_jj_adobe_if_id');
if (adobeIdExist || (shipStatus !== 'C')) {
return;
}
//get the custom record entry created for this sales order
let customRecDetails = fetchIntegrationRecData(soId)
if (customRecDetails.count == 0) {
return;
}
let soAdobeId = customRecDetails.orderEnityId;
let responseData = createIfInAdobe(newRecord, soAdobeId);
log.debug('responseData', responseData)
setIntegrationRecData(responseData, customRecDetails, ifRecId);
} catch (e) {
log.debug("error", e);
}
};
return { afterSubmit: afterSubmit }
});