On Change of Quantity and Tax Manipulate Order Line Items

✅ 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?

If you require assistance or encounter any issues, please don't hesitate to contact us for further support.