Hey, 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 in quotation it doesn’t change. 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);
},
});