➕ Calculate total and auto-populate fields when an item is set or changed.
1. Overview
This interaction is designed to help auto-populate fields and calculate subrecord totals on a set or change of items.
2. Example
In the below example, the function responds to changes in the item and automatically updates related fields and calculates the total.
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,
account: finalXeroAccount,
"tax-rate": finalTaxRate,
amount: finalNet,
tax: finalTax,
"gross-amount": total,
}
);
const rv2 = C.mergeAll(
updatedLine,
);
return rv2;
}
else{
const updatedLine = C.updateSubValueBasedOnIndex(
"general-consultants-order-items",
index,
{
description: "",
quantity:1,
rate: 0,
account: finalXeroAccount,
"tax-rate": finalTaxRate,
amount: finalNet,
tax: finalTax,
"gross-amount": 0,
}
);
const rv2 = C.mergeAll(
updatedLine
);
return rv2;
}
}📌 Need Help?
