✅ Update order line items when there's a change.
1. Overview
This interaction is used to manipulate order line items when there are changes to the quantity, tax rate, or tax.
2. Example
This example demonstrates how the function manipulates order line items when changes occur in the quantity, tax-rate, or other tax fields. It fetches item-specific data when an itemId is available and updates the order line item with calculated values.
async function handler(C) {
const safeJSONParse = (jsonStr, defaultVal = []) => {
try {
return JSON.parse(jsonStr);
} catch (err) {
return defaultVal;
}
};
const index = C.getEventPayload().index;
const line = C.getSubValueBasedOnIndex(
"general-consultants-order-items",
index
);
if (!line) return;
const itemId = line.item[0];
const quantity = +line.quantity || 1;
let finalRate = 0;
const lineRate =
C.event && C.event.payload && C.event.payload.field === "item"
? 0
: finalRate || +line.rate;
let finalNet = 0;
let finalTax = 0;
let taxRatePercent = 0;
let total = 0;
let finalDescription = "";
let account = [];
let finalTaxRate = [];
let finalXeroAccount = [];
let rv;
if (itemId){
const item = await C.api.getEntry({
id: [itemId],
responseType: "iov",
recordId: 6642,
});
const {
description,
"sales-details-unit-price": rate,
"sales-details-tax-type": taxRate,
"sales-details-account": xeroAccount,
} = item;
finalDescription = description;
finalRate = lineRate || rate || 0;
account = safeJSONParse(xeroAccount);
if (C.event && C.event.payload && C.event.payload.field === "item") {
finalTaxRate = safeJSONParse(taxRate);
} else {
finalTaxRate = line["tax-rate"];
}
const taxRateId = finalTaxRate[0];
finalXeroAccount =
xeroAccount && xeroAccount[0] ? safeJSONParse(xeroAccount) : [];
if (taxRateId) {
const taxRateEntry = await C.api.getEntry({
id: [taxRateId],
responseType: "iov",
recordId: 34148,
});
taxRatePercent = +taxRateEntry["effective-tax-rate"] || 0;
}
finalNet = quantity * finalRate;
finalTax = (taxRatePercent * finalNet) / 100;
total = finalNet + finalTax;
const updatedLine = C.updateSubValueBasedOnIndex(
"general-consultants-order-items",
index,
{
description: finalDescription,
rate: finalRate,
"tax-rate": finalTaxRate,
amount: finalNet,
tax: finalTax,
"gross-amount": total,
}
);
const rv2 = C.mergeAll(
updatedLine,
);
return rv2;
}
else{
finalDescription = line["description"];
finalRate = lineRate || 0;
if (C.event && C.event.payload && C.event.payload.field === "item") {
finalTaxRate = safeJSONParse(taxRate);
} else {
finalTaxRate = line["tax-rate"];
}
const taxRateId = finalTaxRate[0];
// finalXeroAccount =
// xeroAccount && xeroAccount[0] ? safeJSONParse(xeroAccount) : [];
if (taxRateId) {
const taxRateEntry = await C.api.getEntry({
id: [taxRateId],
responseType: "iov",
recordId: 34148,
});
taxRatePercent = +taxRateEntry["effective-tax-rate"] || 0;
}
finalNet = quantity * finalRate;
finalTax = (taxRatePercent * finalNet) / 100;
total = finalNet + finalTax;
const updatedLine = C.updateSubValueBasedOnIndex(
"general-consultants-order-items",
index,
{
description: finalDescription,
rate: finalRate,
"tax-rate": finalTaxRate,
amount: finalNet,
tax: finalTax,
"gross-amount": total,
}
);
const rv2 = C.mergeAll(
updatedLine,
);
return rv2;
}
}📌 Need Help?
