fix: Debit credit difference while submitting Sales Invoice (#36523)
* 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
(cherry picked from commit 492ea3bcc8)
# Conflicts:
# erpnext/controllers/accounts_controller.py
* chore: resolve conflicts
---------
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
This commit is contained in:
@@ -976,30 +976,6 @@ class PurchaseInvoice(BuyingController):
|
|||||||
item.item_tax_amount, item.precision("item_tax_amount")
|
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):
|
def get_asset_gl_entry(self, gl_entries):
|
||||||
arbnb_account = self.get_company_default("asset_received_but_not_billed")
|
arbnb_account = self.get_company_default("asset_received_but_not_billed")
|
||||||
eiiav_account = self.get_company_default("expenses_included_in_asset_valuation")
|
eiiav_account = self.get_company_default("expenses_included_in_asset_valuation")
|
||||||
|
|||||||
@@ -1075,6 +1075,7 @@ class SalesInvoice(SellingController):
|
|||||||
self.make_internal_transfer_gl_entries(gl_entries)
|
self.make_internal_transfer_gl_entries(gl_entries)
|
||||||
|
|
||||||
self.make_item_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)
|
self.make_discount_gl_entries(gl_entries)
|
||||||
|
|
||||||
# merge gl entries before adding pos entries
|
# merge gl entries before adding pos entries
|
||||||
|
|||||||
@@ -2049,28 +2049,27 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
self.assertEqual(si.total_taxes_and_charges, 228.82)
|
self.assertEqual(si.total_taxes_and_charges, 228.82)
|
||||||
self.assertEqual(si.rounding_adjustment, -0.01)
|
self.assertEqual(si.rounding_adjustment, -0.01)
|
||||||
|
|
||||||
expected_values = dict(
|
expected_values = [
|
||||||
(d[0], d)
|
["_Test Account Service Tax - _TC", 0.0, 114.41],
|
||||||
for d in [
|
["_Test Account VAT - _TC", 0.0, 114.41],
|
||||||
[si.debit_to, 1500, 0.0],
|
[si.debit_to, 1500, 0.0],
|
||||||
["_Test Account Service Tax - _TC", 0.0, 114.41],
|
["Round Off - _TC", 0.01, 0.01],
|
||||||
["_Test Account VAT - _TC", 0.0, 114.41],
|
["Sales - _TC", 0.0, 1271.18],
|
||||||
["Sales - _TC", 0.0, 1271.18],
|
]
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
gl_entries = frappe.db.sql(
|
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
|
from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
|
||||||
|
group by account
|
||||||
order by account asc""",
|
order by account asc""",
|
||||||
si.name,
|
si.name,
|
||||||
as_dict=1,
|
as_dict=1,
|
||||||
)
|
)
|
||||||
|
|
||||||
for gle in gl_entries:
|
for i, gle in enumerate(gl_entries):
|
||||||
self.assertEqual(expected_values[gle.account][0], gle.account)
|
self.assertEqual(expected_values[i][0], gle.account)
|
||||||
self.assertEqual(expected_values[gle.account][1], gle.debit)
|
self.assertEqual(expected_values[i][1], gle.debit)
|
||||||
self.assertEqual(expected_values[gle.account][2], gle.credit)
|
self.assertEqual(expected_values[i][2], gle.credit)
|
||||||
|
|
||||||
def test_rounding_adjustment_3(self):
|
def test_rounding_adjustment_3(self):
|
||||||
from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import (
|
from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import (
|
||||||
@@ -2125,13 +2124,14 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
["_Test Account Service Tax - _TC", 0.0, 240.43],
|
["_Test Account Service Tax - _TC", 0.0, 240.43],
|
||||||
["_Test Account VAT - _TC", 0.0, 240.43],
|
["_Test Account VAT - _TC", 0.0, 240.43],
|
||||||
["Sales - _TC", 0.0, 4007.15],
|
["Sales - _TC", 0.0, 4007.15],
|
||||||
["Round Off - _TC", 0.01, 0],
|
["Round Off - _TC", 0.02, 0.01],
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
gl_entries = frappe.db.sql(
|
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
|
from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s
|
||||||
|
group by account
|
||||||
order by account asc""",
|
order by account asc""",
|
||||||
si.name,
|
si.name,
|
||||||
as_dict=1,
|
as_dict=1,
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ from erpnext.accounts.doctype.pricing_rule.utils import (
|
|||||||
apply_pricing_rule_on_transaction,
|
apply_pricing_rule_on_transaction,
|
||||||
get_applied_pricing_rules,
|
get_applied_pricing_rules,
|
||||||
)
|
)
|
||||||
|
from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center
|
||||||
from erpnext.accounts.party import (
|
from erpnext.accounts.party import (
|
||||||
get_party_account,
|
get_party_account,
|
||||||
get_party_account_currency,
|
get_party_account_currency,
|
||||||
@@ -1023,6 +1024,33 @@ class AccountsController(TransactionBase):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
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 update_against_document_in_jv(self):
|
def update_against_document_in_jv(self):
|
||||||
"""
|
"""
|
||||||
Links invoice and advance voucher:
|
Links invoice and advance voucher:
|
||||||
|
|||||||
Reference in New Issue
Block a user