fix: calculate outstanding amount on reconcile correctly
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index 7a31dc5..dd34909 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -872,12 +872,12 @@
self.set("remarks", "\n".join(remarks))
- def build_gl_map(self):
+ def build_gl_map(self, is_reconcile=False):
if self.payment_type in ("Receive", "Pay") and not self.get("party_account_field"):
self.setup_party_account_field()
gl_entries = []
- self.add_party_gl_entries(gl_entries)
+ self.add_party_gl_entries(gl_entries, is_reconcile)
self.add_bank_gl_entries(gl_entries)
self.add_deductions_gl_entries(gl_entries)
self.add_tax_gl_entries(gl_entries)
@@ -888,7 +888,7 @@
gl_entries = process_gl_map(gl_entries)
make_gl_entries(gl_entries, cancel=cancel, adv_adj=adv_adj)
- def add_party_gl_entries(self, gl_entries):
+ def add_party_gl_entries(self, gl_entries, is_reconcile):
if self.party_account:
if self.payment_type == "Receive":
against_account = self.paid_to
@@ -917,13 +917,14 @@
d.reference_doctype in ["Sales Invoice", "Purchase Invoice"]
and book_advance_payments_as_liability
):
- self.make_invoice_liability_entry(gl_entries, d)
- gle.update(
- {
- "against_voucher_type": "Payment Entry",
- "against_voucher": self.name,
- }
- )
+ if not is_reconcile:
+ self.make_invoice_liability_entry(gl_entries, d)
+ gle.update(
+ {
+ "against_voucher_type": "Payment Entry",
+ "against_voucher": self.name,
+ }
+ )
allocated_amount_in_company_currency = self.calculate_base_allocated_amount_for_reference(d)
gle.update(
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 1ac231b..6ebb6af 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -1664,13 +1664,9 @@
def test_advance_entries_as_liability(self):
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
- from erpnext.accounts.party import get_party_account
- frappe.db.set_value(
- "Company",
- "_Test Company",
- {"book_advance_payments_as_liability": 1, "default_advance_paid_account": "Debtors - _TC"},
- )
+ set_advance_flag(company="_Test Company", flag=1, default_account="Debtors - _TC")
+
pe = create_payment_entry(
company="_Test Company",
payment_type="Pay",
@@ -1678,34 +1674,48 @@
party="_Test Supplier",
paid_from="Cash - _TC",
paid_to="Creditors - _TC",
- paid_amount=1000,
+ paid_amount=500,
)
pe.submit()
pi = make_purchase_invoice(
- company="_Test Company", customer="_Test Supplier", do_not_save=True, do_not_submit=True
+ company="_Test Company",
+ customer="_Test Supplier",
+ do_not_save=True,
+ do_not_submit=True,
+ rate=1000,
+ price_list_rate=1000,
+ qty=1,
)
- pi.base_grand_total = 100
- pi.grand_total = 100
+ pi.base_grand_total = 1000
+ pi.grand_total = 1000
pi.set_advances()
- self.assertEqual(pi.advances[0].allocated_amount, 100)
- pi.advances[0].allocated_amount = 50
- pi.advances = [pi.advances[0]]
+ for advance in pi.advances:
+ advance.allocated_amount = 500 if advance.reference_name == pe.name else 0
pi.save()
pi.submit()
- expected_gle = [
- ["Creditors - _TC", 50, 100, nowdate()],
- ["Debtors - _TC", 0.0, 50, nowdate()],
- ["Stock Received But Not Billed - _TC", 100, 0.0, nowdate()],
- ]
+ self.assertEqual(pi.advances[0].allocated_amount, 500)
+ expected_gle = [
+ ["Creditors - _TC", 500, 1000, nowdate()],
+ ["Debtors - _TC", 0.0, 500, nowdate()],
+ ["Stock Received But Not Billed - _TC", 1000, 0.0, nowdate()],
+ ]
check_gl_entries(self, pi.name, expected_gle, nowdate())
- self.assertEqual(pi.outstanding_amount, 200)
- frappe.db.set_value(
- "Company",
- "_Test Company",
- {"book_advance_payments_as_liability": 0, "default_advance_paid_account": ""},
- )
+ self.assertEqual(pi.outstanding_amount, 500)
+
+ set_advance_flag(company="_Test Company", flag=0, default_account="")
+
+
+def set_advance_flag(company, flag, default_account):
+ frappe.db.set_value(
+ "Company",
+ company,
+ {
+ "book_advance_payments_as_liability": flag,
+ "default_advance_paid_account": default_account,
+ },
+ )
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 8ab7fd7..067808d 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -3315,16 +3315,10 @@
def test_advance_entries_as_liability(self):
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
- from erpnext.accounts.party import get_party_account
+ from erpnext.accounts.report.accounts_receivable.accounts_receivable import execute
- frappe.db.set_value(
- "Company",
- "_Test Company",
- {
- "book_advance_payments_as_liability": 1,
- "default_advance_received_account": "Creditors - _TC",
- },
- )
+ set_advance_flag(company="_Test Company", flag=1, default_account="Creditors - _TC")
+
pe = create_payment_entry(
company="_Test Company",
payment_type="Receive",
@@ -3337,32 +3331,42 @@
pe.submit()
si = create_sales_invoice(
- company="_Test Company", customer="_Test Customer", do_not_save=True, do_not_submit=True
+ company="_Test Company",
+ customer="_Test Customer",
+ do_not_save=True,
+ do_not_submit=True,
+ rate=500,
+ price_list_rate=500,
)
- si.base_grand_total = 100
- si.grand_total = 100
+ si.base_grand_total = 500
+ si.grand_total = 500
si.set_advances()
- self.assertEqual(si.advances[0].allocated_amount, 100)
- si.advances[0].allocated_amount = 50
- si.advances = [si.advances[0]]
+ for advance in si.advances:
+ advance.allocated_amount = 500 if advance.reference_name == pe.name else 0
si.save()
si.submit()
- expected_gle = [
- ["Creditors - _TC", 50, 0.0, nowdate()],
- ["Debtors - _TC", 100, 50, nowdate()],
- ["Sales - _TC", 0.0, 100, nowdate()],
- ]
+ self.assertEqual(si.advances[0].allocated_amount, 500)
+ expected_gle = [
+ ["Creditors - _TC", 500, 0.0, nowdate()],
+ ["Debtors - _TC", 500, 500, nowdate()],
+ ["Sales - _TC", 0.0, 500, nowdate()],
+ ]
check_gl_entries(self, si.name, expected_gle, nowdate())
- self.assertEqual(si.outstanding_amount, 50)
- frappe.db.set_value(
- "Company",
- "_Test Company",
- {
- "book_advance_payments_as_liability": 0,
- "default_advance_received_account": "",
- },
- )
+ self.assertEqual(si.outstanding_amount, 0)
+
+ set_advance_flag(company="_Test Company", flag=0, default_account="")
+
+
+def set_advance_flag(company, flag, default_account):
+ frappe.db.set_value(
+ "Company",
+ company,
+ {
+ "book_advance_payments_as_liability": flag,
+ "default_advance_received_account": default_account,
+ },
+ )
def get_sales_invoice_for_e_invoice():
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index c1d3653..728a6d7 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -472,7 +472,7 @@
doc.save(ignore_permissions=True)
# re-submit advance entry
doc = frappe.get_doc(entry.voucher_type, entry.voucher_no)
- gl_map = doc.build_gl_map()
+ gl_map = doc.build_gl_map(is_reconcile=True)
create_payment_ledger_entry(gl_map, update_outstanding="No", cancel=0, adv_adj=1)
# Only update outstanding for newly linked vouchers
diff --git a/erpnext/buying/doctype/supplier/supplier.js b/erpnext/buying/doctype/supplier/supplier.js
index 50f9bb6..a5bf4b2 100644
--- a/erpnext/buying/doctype/supplier/supplier.js
+++ b/erpnext/buying/doctype/supplier/supplier.js
@@ -22,7 +22,7 @@
let d = locals[cdt][cdn];
return {
filters: {
- "root_type": 'Asset',
+ "account_type": "Receivable",
"company": d.company,
"is_group": 0
}
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 3fac56c..7b2039d 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -2940,10 +2940,8 @@
dr_or_cr + "_in_account_currency": allocated_amount,
rev: 0,
rev + "_in_account_currency": 0,
- "against_voucher": invoice.return_against
- if cint(invoice.is_return) and invoice.return_against
- else invoice.name,
- "against_voucher_type": invoice.doctype,
+ "against_voucher": pe.name,
+ "against_voucher_type": "Payment Entry",
"cost_center": invoice.cost_center,
"project": invoice.project,
"voucher_type": voucher_type,
diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js
index 8f82880..408e89b 100644
--- a/erpnext/selling/doctype/customer/customer.js
+++ b/erpnext/selling/doctype/customer/customer.js
@@ -39,7 +39,7 @@
let d = locals[cdt][cdn];
return {
filters: {
- "root_type": 'Liability',
+ "account_type": 'Payable',
"company": d.company,
"is_group": 0
}
diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js
index 436fe05..089e20d 100644
--- a/erpnext/setup/doctype/company/company.js
+++ b/erpnext/setup/doctype/company/company.js
@@ -227,8 +227,8 @@
["asset_received_but_not_billed", {"account_type": "Asset Received But Not Billed"}],
["unrealized_profit_loss_account", {"root_type": ["in", ["Liability", "Asset"]]}],
["default_provisional_account", {"root_type": ["in", ["Liability", "Asset"]]}],
- ["default_advance_received_account", {"root_type": "Liability"}],
- ["default_advance_paid_account", {"root_type": "Asset"}],
+ ["default_advance_received_account", {"account_type": "Payable"}],
+ ["default_advance_paid_account", {"account_type": "Receivable"}],
], function(i, v) {
erpnext.company.set_custom_query(frm, v);
});