fix: Debit credit difference while submitting Sales Invoice (#36523)
* fix: Debit credit difference while submitting Sales Invoice
* test(fix): Update gl entry comparison
* test(fix): Update gl entry comparison
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index d175df5..7329cec 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -969,30 +969,6 @@
item.item_tax_amount, item.precision("item_tax_amount")
)
- def make_precision_loss_gl_entry(self, gl_entries):
- round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
- self.company, "Purchase Invoice", self.name, self.use_company_roundoff_cost_center
- )
-
- precision_loss = self.get("base_net_total") - flt(
- self.get("net_total") * self.conversion_rate, self.precision("net_total")
- )
-
- if precision_loss:
- gl_entries.append(
- self.get_gl_dict(
- {
- "account": round_off_account,
- "against": self.supplier,
- "credit": precision_loss,
- "cost_center": round_off_cost_center
- if self.use_company_roundoff_cost_center
- else self.cost_center or round_off_cost_center,
- "remarks": _("Net total calculation precision loss"),
- }
- )
- )
-
def get_asset_gl_entry(self, gl_entries):
arbnb_account = self.get_company_default("asset_received_but_not_billed")
eiiav_account = self.get_company_default("expenses_included_in_asset_valuation")
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index f08bf18..e331c0b 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -1061,6 +1061,7 @@
self.make_internal_transfer_gl_entries(gl_entries)
self.make_item_gl_entries(gl_entries)
+ self.make_precision_loss_gl_entry(gl_entries)
self.make_discount_gl_entries(gl_entries)
# merge gl entries before adding pos entries
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 8816a8c..63c0c45 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -2049,28 +2049,27 @@
self.assertEqual(si.total_taxes_and_charges, 228.82)
self.assertEqual(si.rounding_adjustment, -0.01)
- expected_values = dict(
- (d[0], d)
- for d in [
- [si.debit_to, 1500, 0.0],
- ["_Test Account Service Tax - _TC", 0.0, 114.41],
- ["_Test Account VAT - _TC", 0.0, 114.41],
- ["Sales - _TC", 0.0, 1271.18],
- ]
- )
+ expected_values = [
+ ["_Test Account Service Tax - _TC", 0.0, 114.41],
+ ["_Test Account VAT - _TC", 0.0, 114.41],
+ [si.debit_to, 1500, 0.0],
+ ["Round Off - _TC", 0.01, 0.01],
+ ["Sales - _TC", 0.0, 1271.18],
+ ]
gl_entries = frappe.db.sql(
- """select account, debit, credit
+ """select account, sum(debit) as debit, sum(credit) as credit
from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
+ group by account
order by account asc""",
si.name,
as_dict=1,
)
- for gle in gl_entries:
- self.assertEqual(expected_values[gle.account][0], gle.account)
- self.assertEqual(expected_values[gle.account][1], gle.debit)
- self.assertEqual(expected_values[gle.account][2], gle.credit)
+ for i, gle in enumerate(gl_entries):
+ self.assertEqual(expected_values[i][0], gle.account)
+ self.assertEqual(expected_values[i][1], gle.debit)
+ self.assertEqual(expected_values[i][2], gle.credit)
def test_rounding_adjustment_3(self):
from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import (
@@ -2125,13 +2124,14 @@
["_Test Account Service Tax - _TC", 0.0, 240.43],
["_Test Account VAT - _TC", 0.0, 240.43],
["Sales - _TC", 0.0, 4007.15],
- ["Round Off - _TC", 0.01, 0],
+ ["Round Off - _TC", 0.02, 0.01],
]
)
gl_entries = frappe.db.sql(
- """select account, debit, credit
+ """select account, sum(debit) as debit, sum(credit) as credit
from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
+ group by account
order by account asc""",
si.name,
as_dict=1,
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index b2cfc39..fbf97aa 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -32,6 +32,7 @@
apply_pricing_rule_on_transaction,
get_applied_pricing_rules,
)
+from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center
from erpnext.accounts.party import (
get_party_account,
get_party_account_currency,
@@ -973,6 +974,33 @@
d.exchange_gain_loss = difference
+ def make_precision_loss_gl_entry(self, gl_entries):
+ round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
+ self.company, "Purchase Invoice", self.name, self.use_company_roundoff_cost_center
+ )
+
+ precision_loss = self.get("base_net_total") - flt(
+ self.get("net_total") * self.conversion_rate, self.precision("net_total")
+ )
+
+ credit_or_debit = "credit" if self.doctype == "Purchase Invoice" else "debit"
+ against = self.supplier if self.doctype == "Purchase Invoice" else self.customer
+
+ if precision_loss:
+ gl_entries.append(
+ self.get_gl_dict(
+ {
+ "account": round_off_account,
+ "against": against,
+ credit_or_debit: precision_loss,
+ "cost_center": round_off_cost_center
+ if self.use_company_roundoff_cost_center
+ else self.cost_center or round_off_cost_center,
+ "remarks": _("Net total calculation precision loss"),
+ }
+ )
+ )
+
def make_exchange_gain_loss_journal(self, args: dict = None) -> None:
"""
Make Exchange Gain/Loss journal for Invoices and Payments