Merge pull request #30754 from deepeshgarg007/round_off_account_cost_center
fix: First preference to parent cost center rather than round off cost center
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index c06809c..a1d86e2 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -1369,7 +1369,9 @@
if (
not self.is_internal_transfer() and self.rounding_adjustment and self.base_rounding_adjustment
):
- round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(self.company)
+ round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
+ self.company, "Purchase Invoice", self.name
+ )
gl_entries.append(
self.get_gl_dict(
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index dd85d99..f0880c1 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -1466,7 +1466,9 @@
and self.base_rounding_adjustment
and not self.is_internal_transfer()
):
- round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(self.company)
+ round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
+ self.company, "Sales Invoice", self.name
+ )
gl_entries.append(
self.get_gl_dict(
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 98a5755..f2a696d 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -1978,6 +1978,13 @@
self.assertEqual(expected_values[gle.account][2], gle.credit)
def test_rounding_adjustment_3(self):
+ from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import (
+ create_dimension,
+ disable_dimension,
+ )
+
+ create_dimension()
+
si = create_sales_invoice(do_not_save=True)
si.items = []
for d in [(1122, 2), (1122.01, 1), (1122.01, 1)]:
@@ -2005,6 +2012,10 @@
"included_in_print_rate": 1,
},
)
+
+ si.cost_center = "_Test Cost Center 2 - _TC"
+ si.location = "Block 1"
+
si.save()
si.submit()
self.assertEqual(si.net_total, 4007.16)
@@ -2040,6 +2051,18 @@
self.assertEqual(debit_credit_diff, 0)
+ round_off_gle = frappe.db.get_value(
+ "GL Entry",
+ {"voucher_type": "Sales Invoice", "voucher_no": si.name, "account": "Round Off - _TC"},
+ ["cost_center", "location"],
+ as_dict=1,
+ )
+
+ self.assertEqual(round_off_gle.cost_center, "_Test Cost Center 2 - _TC")
+ self.assertEqual(round_off_gle.location, "Block 1")
+
+ disable_dimension()
+
def test_sales_invoice_with_shipping_rule(self):
from erpnext.accounts.doctype.shipping_rule.test_shipping_rule import create_shipping_rule
diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py
index f52e517..89034eb 100644
--- a/erpnext/accounts/general_ledger.py
+++ b/erpnext/accounts/general_ledger.py
@@ -355,7 +355,7 @@
def make_round_off_gle(gl_map, debit_credit_diff, precision):
round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
- gl_map[0].company
+ gl_map[0].company, gl_map[0].voucher_type, gl_map[0].voucher_no
)
round_off_account_exists = False
round_off_gle = frappe._dict()
@@ -392,14 +392,43 @@
}
)
+ update_accounting_dimensions(round_off_gle)
+
if not round_off_account_exists:
gl_map.append(round_off_gle)
-def get_round_off_account_and_cost_center(company):
+def update_accounting_dimensions(round_off_gle):
+ dimensions = get_accounting_dimensions()
+ meta = frappe.get_meta(round_off_gle["voucher_type"])
+ has_all_dimensions = True
+
+ for dimension in dimensions:
+ if not meta.has_field(dimension):
+ has_all_dimensions = False
+
+ if dimensions and has_all_dimensions:
+ dimension_values = frappe.db.get_value(
+ round_off_gle["voucher_type"], round_off_gle["voucher_no"], dimensions, as_dict=1
+ )
+
+ for dimension in dimensions:
+ round_off_gle[dimension] = dimension_values.get(dimension)
+
+
+def get_round_off_account_and_cost_center(company, voucher_type, voucher_no):
round_off_account, round_off_cost_center = frappe.get_cached_value(
"Company", company, ["round_off_account", "round_off_cost_center"]
) or [None, None]
+
+ meta = frappe.get_meta(voucher_type)
+
+ # Give first preference to parent cost center for round off GLE
+ if meta.has_field("cost_center"):
+ parent_cost_center = frappe.db.get_value(voucher_type, voucher_no, "cost_center")
+ if parent_cost_center:
+ round_off_cost_center = parent_cost_center
+
if not round_off_account:
frappe.throw(_("Please mention Round Off Account in Company"))