From 2b7d58602d3a85edab89e63d450494c9463b5040 Mon Sep 17 00:00:00 2001 From: Logesh Periyasamy Date: Tue, 25 Nov 2025 10:21:17 +0530 Subject: [PATCH] feat(accounting-dimension): add dynamic triggers for custom accounting dimensions (#50621) * feat: add dynamic triggers for custom accounting dimensions * feat: add accounting dimension trigger call in setup event * chore: ignore cur_frm semgrep rules * chore: move function to transaction.js (cherry picked from commit 5e58e344b2d57456b7c83d2445babf0f0e38e98d) --- .../purchase_invoice/purchase_invoice.js | 1 + .../doctype/sales_invoice/sales_invoice.js | 1 + .../doctype/purchase_order/purchase_order.js | 1 + erpnext/public/js/controllers/transaction.js | 17 +++++++++++++++++ .../selling/doctype/sales_order/sales_order.js | 3 +++ .../doctype/delivery_note/delivery_note.js | 1 + .../purchase_receipt/purchase_receipt.js | 1 + 7 files changed, 25 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index ad367f3c9cb..9a831598328 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -12,6 +12,7 @@ erpnext.buying.setup_buying_controller(); erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.BuyingController { setup(doc) { + this.setup_accounting_dimension_triggers(); this.setup_posting_date_time_check(); super.setup(doc); diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 193014d340d..abb5d76b9d8 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -14,6 +14,7 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends ( erpnext.selling.SellingController ) { setup(doc) { + this.setup_accounting_dimension_triggers(); this.setup_posting_date_time_check(); super.setup(doc); this.frm.make_methods = { diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index d82a5e18c23..85095e66a57 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -303,6 +303,7 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends ( erpnext.buying.BuyingController ) { setup() { + this.setup_accounting_dimension_triggers(); this.frm.custom_make_buttons = { "Purchase Receipt": "Purchase Receipt", "Purchase Invoice": "Purchase Invoice", diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 7b63d78c09b..3abcde36072 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -2749,6 +2749,23 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe ]); } } + + setup_accounting_dimension_triggers() { + frappe.call({ + method: "erpnext.accounts.doctype.accounting_dimension.accounting_dimension.get_dimensions", + callback: function (r) { + if (r.message && r.message[0]) { + let dimensions = r.message[0].map((d) => d.fieldname); + dimensions.forEach((dim) => { + // nosemgrep: frappe-semgrep-rules.rules.frappe-cur-frm-usage + cur_frm.cscript[dim] = function (doc, cdt, cdn) { + erpnext.utils.copy_value_in_all_rows(doc, cdt, cdn, "items", dim); + }; + }); + } + }, + }); + } }; erpnext.show_serial_batch_selector = function (frm, item_row, callback, on_close, show_dialog) { diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 3e0425c1201..ce20966a25e 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -574,6 +574,9 @@ frappe.ui.form.on("Sales Order Item", { }); erpnext.selling.SalesOrderController = class SalesOrderController extends erpnext.selling.SellingController { + setup() { + this.setup_accounting_dimension_triggers(); + } onload(doc, dt, dn) { super.onload(doc, dt, dn); } diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 527d672cc6a..b9c98bbb8ba 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -140,6 +140,7 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends ( erpnext.selling.SellingController ) { setup(doc) { + this.setup_accounting_dimension_triggers(); this.setup_posting_date_time_check(); super.setup(doc); this.frm.make_methods = { diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index db065a80c92..29026969404 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -195,6 +195,7 @@ erpnext.stock.PurchaseReceiptController = class PurchaseReceiptController extend erpnext.buying.BuyingController ) { setup(doc) { + this.setup_accounting_dimension_triggers(); this.setup_posting_date_time_check(); super.setup(doc); }