fix: calculate outstanding amount on reconcile correctly
This commit is contained in:
parent
5e9821dce2
commit
17341adf1c
@ -872,12 +872,12 @@ class PaymentEntry(AccountsController):
|
||||
|
||||
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 @@ class PaymentEntry(AccountsController):
|
||||
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 @@ class PaymentEntry(AccountsController):
|
||||
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(
|
||||
|
@ -1664,13 +1664,9 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
|
||||
|
||||
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 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
|
||||
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):
|
||||
|
@ -3315,16 +3315,10 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
|
||||
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
|
||||
|
||||
set_advance_flag(company="_Test Company", flag=1, default_account="Creditors - _TC")
|
||||
|
||||
frappe.db.set_value(
|
||||
"Company",
|
||||
"_Test Company",
|
||||
{
|
||||
"book_advance_payments_as_liability": 1,
|
||||
"default_advance_received_account": "Creditors - _TC",
|
||||
},
|
||||
)
|
||||
pe = create_payment_entry(
|
||||
company="_Test Company",
|
||||
payment_type="Receive",
|
||||
@ -3337,32 +3331,42 @@ class TestSalesInvoice(unittest.TestCase):
|
||||
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():
|
||||
|
@ -472,7 +472,7 @@ def reconcile_against_document(args, skip_ref_details_update_for_pe=False): # n
|
||||
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
|
||||
|
@ -22,7 +22,7 @@ frappe.ui.form.on("Supplier", {
|
||||
let d = locals[cdt][cdn];
|
||||
return {
|
||||
filters: {
|
||||
"root_type": 'Asset',
|
||||
"account_type": "Receivable",
|
||||
"company": d.company,
|
||||
"is_group": 0
|
||||
}
|
||||
|
@ -2940,10 +2940,8 @@ def make_advance_liability_entry(
|
||||
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,
|
||||
|
@ -39,7 +39,7 @@ frappe.ui.form.on("Customer", {
|
||||
let d = locals[cdt][cdn];
|
||||
return {
|
||||
filters: {
|
||||
"root_type": 'Liability',
|
||||
"account_type": 'Payable',
|
||||
"company": d.company,
|
||||
"is_group": 0
|
||||
}
|
||||
|
@ -227,8 +227,8 @@ erpnext.company.setup_queries = function(frm) {
|
||||
["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);
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user