0

I have a customized the function that calculates amount in quotation since I added other fields, but when it comes Sales Taxes and Charges part (tax_amount, total) in quotation it doesn’t seem to override. I have tried some solutions so I want to know where can I find event listener or something equivalent? so the function can be triggered when I change those fields (width, height) this is my code (client script)

function calculateAmount(frm, cdt, cdn) {
    setTimeout(function() {
        var item = locals[cdt][cdn];
        var length = item.length;
        var width = item.width;
        var quantity = item.qty;
        var rate = item.rate;

        // Calculate the item amount
        var amount = length * rate * width * quantity;
        frappe.model.set_value(cdt, cdn, 'amount', amount);

        // Calculate the total of items
        var total = 0;
        frm.doc.items.forEach(function(item) {
            total += item.amount;
        });
        frappe.model.set_value('Quotation', frm.doc.name, 'total', total);

        // Calculate the total tax amount based on tax rates
        var taxTotal = 0;
        for (var i = 0; i < frm.doc.taxes.length; i++) {
            var tax = frm.doc.taxes[i];
            var currentTaxAmount = 0;

             if (tax.charge_type === "Actual") {
                // Distribute the tax amount proportionally to each item row
                var actual = tax.tax_amount;
                currentTaxAmount = (total * actual) / frm.doc.net_total || 0.0;
            } else if (tax.charge_type === "On Net Total") {
                currentTaxAmount = (tax.rate / 100.0) * total;
            } else if (tax.charge_type === "On Previous Row Amount") {
                currentTaxAmount = (tax.rate / 100.0) * frm.doc.taxes[i - 1].base_tax_amount;
            } else if (tax.charge_type === "On Previous Row Total") {
                currentTaxAmount = (tax.rate / 100.0) * frm.doc.taxes[cint(tax.row_id) - 1].base_total;
            } else if (tax.charge_type === "On Item Quantity") {
                currentTaxAmount = tax.rate * frm.doc.total_qty;
            }
            
            console.log(currentTaxAmount)

            frappe.model.set_value('Sales Taxes and Charges', tax.name, 'tax_amount', currentTaxAmount);
            taxTotal += currentTaxAmount;
        }

        // Calculate total related fields
        var grandTotal = total + taxTotal;
        var baseGrandTotal = grandTotal * frm.doc.conversion_rate;
        var roundedTotal = Math.round(grandTotal);

        // Update the document fields
        frappe.model.set_value('Quotation', frm.doc.name, 'grand_total', grandTotal);
        frappe.model.set_value('Quotation', frm.doc.name, 'base_grand_total', baseGrandTotal);
        frappe.model.set_value('Quotation', frm.doc.name, 'total_taxes_and_charges', taxTotal);
        frappe.model.set_value('Quotation', frm.doc.name, 'rounded_total', roundedTotal);

        // Log the calculated values
        console.log('total', total, 'grandTotal', grandTotal, 'baseGrandTotal', baseGrandTotal, 'taxTotal', taxTotal, 'rounded total', roundedTotal);
    }, 1000);
}

frappe.ui.form.on('Quotation Item', {
    length: function(frm, cdt, cdn) {
        calculateAmount(frm, cdt, cdn);
    },
    width: function(frm, cdt, cdn) {
        calculateAmount(frm, cdt, cdn);
    },
    qty: function(frm, cdt, cdn) {
        calculateAmount(frm, cdt, cdn);
    },
    rate: function(frm, cdt, cdn) {
        calculateAmount(frm, cdt, cdn);
    },
    refresh: function(frm, cdt, cdn) {
        calculateAmount(frm, cdt, cdn);
    },
});
imo
  • 1
  • 4

0 Answers0