From 4bf40ff70a58d9c8e65c5b50801b278064900591 Mon Sep 17 00:00:00 2001 From: David Malinowski Date: Thu, 26 Mar 2026 14:07:40 +0100 Subject: [PATCH] fix: apply_ohne_berechnung sets values directly to avoid async recalculation conflicts frappe.model.set_value in a loop triggered ERPNext pricing recalculation per item, causing values to be overwritten. Now sets values on locals objects directly and triggers a single recalculation at the end. Co-Authored-By: Claude Opus 4.6 (1M context) --- msp/public/js/sales_invoice.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/msp/public/js/sales_invoice.js b/msp/public/js/sales_invoice.js index 3627ac7..fb67d63 100644 --- a/msp/public/js/sales_invoice.js +++ b/msp/public/js/sales_invoice.js @@ -204,9 +204,16 @@ function show_ohne_berechnung_dialog(frm) { } function apply_ohne_berechnung(frm, selected_items) { + // Werte direkt auf den Doc-Objekten setzen (ohne einzelne set_value-Events) selected_items.forEach(item => { + const doc_item = locals[item.doctype][item.name]; + if (!doc_item) return; + // 100% Rabatt setzen - frappe.model.set_value(item.doctype, item.name, 'discount_percentage', 100); + doc_item.discount_percentage = 100; + doc_item.discount_amount = 0; + doc_item.rate = 0; + doc_item.amount = 0; // Beschreibung bereinigen und "ohne Berechnung" genau einmal anhängen let desc = item.description || ''; @@ -225,11 +232,14 @@ function apply_ohne_berechnung(frm, selected_items) { // Standard-Zeile einmal anhängen const stamp = '

ohne Berechnung

'; - desc = (desc ? desc + stamp : stamp); - - frappe.model.set_value(item.doctype, item.name, 'description', desc); + doc_item.description = (desc ? desc + stamp : stamp); }); + // Einmalig Formular neu berechnen und aktualisieren + frm.dirty(); + frm.script_manager.trigger('calculate_taxes_and_totals'); + frm.refresh_fields(); + frappe.show_alert({ message: __("{0} Artikel wurden auf 'ohne Berechnung' gesetzt.", [selected_items.length]), indicator: 'green'