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))
|
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"):
|
if self.payment_type in ("Receive", "Pay") and not self.get("party_account_field"):
|
||||||
self.setup_party_account_field()
|
self.setup_party_account_field()
|
||||||
|
|
||||||
gl_entries = []
|
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_bank_gl_entries(gl_entries)
|
||||||
self.add_deductions_gl_entries(gl_entries)
|
self.add_deductions_gl_entries(gl_entries)
|
||||||
self.add_tax_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)
|
gl_entries = process_gl_map(gl_entries)
|
||||||
make_gl_entries(gl_entries, cancel=cancel, adv_adj=adv_adj)
|
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.party_account:
|
||||||
if self.payment_type == "Receive":
|
if self.payment_type == "Receive":
|
||||||
against_account = self.paid_to
|
against_account = self.paid_to
|
||||||
@ -917,13 +917,14 @@ class PaymentEntry(AccountsController):
|
|||||||
d.reference_doctype in ["Sales Invoice", "Purchase Invoice"]
|
d.reference_doctype in ["Sales Invoice", "Purchase Invoice"]
|
||||||
and book_advance_payments_as_liability
|
and book_advance_payments_as_liability
|
||||||
):
|
):
|
||||||
self.make_invoice_liability_entry(gl_entries, d)
|
if not is_reconcile:
|
||||||
gle.update(
|
self.make_invoice_liability_entry(gl_entries, d)
|
||||||
{
|
gle.update(
|
||||||
"against_voucher_type": "Payment Entry",
|
{
|
||||||
"against_voucher": self.name,
|
"against_voucher_type": "Payment Entry",
|
||||||
}
|
"against_voucher": self.name,
|
||||||
)
|
}
|
||||||
|
)
|
||||||
|
|
||||||
allocated_amount_in_company_currency = self.calculate_base_allocated_amount_for_reference(d)
|
allocated_amount_in_company_currency = self.calculate_base_allocated_amount_for_reference(d)
|
||||||
gle.update(
|
gle.update(
|
||||||
|
@ -1664,13 +1664,9 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
|
|||||||
|
|
||||||
def test_advance_entries_as_liability(self):
|
def test_advance_entries_as_liability(self):
|
||||||
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
|
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(
|
set_advance_flag(company="_Test Company", flag=1, default_account="Debtors - _TC")
|
||||||
"Company",
|
|
||||||
"_Test Company",
|
|
||||||
{"book_advance_payments_as_liability": 1, "default_advance_paid_account": "Debtors - _TC"},
|
|
||||||
)
|
|
||||||
pe = create_payment_entry(
|
pe = create_payment_entry(
|
||||||
company="_Test Company",
|
company="_Test Company",
|
||||||
payment_type="Pay",
|
payment_type="Pay",
|
||||||
@ -1678,34 +1674,48 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
|
|||||||
party="_Test Supplier",
|
party="_Test Supplier",
|
||||||
paid_from="Cash - _TC",
|
paid_from="Cash - _TC",
|
||||||
paid_to="Creditors - _TC",
|
paid_to="Creditors - _TC",
|
||||||
paid_amount=1000,
|
paid_amount=500,
|
||||||
)
|
)
|
||||||
pe.submit()
|
pe.submit()
|
||||||
|
|
||||||
pi = make_purchase_invoice(
|
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.base_grand_total = 1000
|
||||||
pi.grand_total = 100
|
pi.grand_total = 1000
|
||||||
pi.set_advances()
|
pi.set_advances()
|
||||||
self.assertEqual(pi.advances[0].allocated_amount, 100)
|
for advance in pi.advances:
|
||||||
pi.advances[0].allocated_amount = 50
|
advance.allocated_amount = 500 if advance.reference_name == pe.name else 0
|
||||||
pi.advances = [pi.advances[0]]
|
|
||||||
pi.save()
|
pi.save()
|
||||||
pi.submit()
|
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())
|
check_gl_entries(self, pi.name, expected_gle, nowdate())
|
||||||
self.assertEqual(pi.outstanding_amount, 200)
|
self.assertEqual(pi.outstanding_amount, 500)
|
||||||
frappe.db.set_value(
|
|
||||||
"Company",
|
set_advance_flag(company="_Test Company", flag=0, default_account="")
|
||||||
"_Test Company",
|
|
||||||
{"book_advance_payments_as_liability": 0, "default_advance_paid_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):
|
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):
|
def test_advance_entries_as_liability(self):
|
||||||
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
|
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(
|
pe = create_payment_entry(
|
||||||
company="_Test Company",
|
company="_Test Company",
|
||||||
payment_type="Receive",
|
payment_type="Receive",
|
||||||
@ -3337,32 +3331,42 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
pe.submit()
|
pe.submit()
|
||||||
|
|
||||||
si = create_sales_invoice(
|
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.base_grand_total = 500
|
||||||
si.grand_total = 100
|
si.grand_total = 500
|
||||||
si.set_advances()
|
si.set_advances()
|
||||||
self.assertEqual(si.advances[0].allocated_amount, 100)
|
for advance in si.advances:
|
||||||
si.advances[0].allocated_amount = 50
|
advance.allocated_amount = 500 if advance.reference_name == pe.name else 0
|
||||||
si.advances = [si.advances[0]]
|
|
||||||
si.save()
|
si.save()
|
||||||
si.submit()
|
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())
|
check_gl_entries(self, si.name, expected_gle, nowdate())
|
||||||
self.assertEqual(si.outstanding_amount, 50)
|
self.assertEqual(si.outstanding_amount, 0)
|
||||||
frappe.db.set_value(
|
|
||||||
"Company",
|
set_advance_flag(company="_Test Company", flag=0, default_account="")
|
||||||
"_Test Company",
|
|
||||||
{
|
|
||||||
"book_advance_payments_as_liability": 0,
|
def set_advance_flag(company, flag, default_account):
|
||||||
"default_advance_received_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():
|
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)
|
doc.save(ignore_permissions=True)
|
||||||
# re-submit advance entry
|
# re-submit advance entry
|
||||||
doc = frappe.get_doc(entry.voucher_type, entry.voucher_no)
|
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)
|
create_payment_ledger_entry(gl_map, update_outstanding="No", cancel=0, adv_adj=1)
|
||||||
|
|
||||||
# Only update outstanding for newly linked vouchers
|
# Only update outstanding for newly linked vouchers
|
||||||
|
@ -22,7 +22,7 @@ frappe.ui.form.on("Supplier", {
|
|||||||
let d = locals[cdt][cdn];
|
let d = locals[cdt][cdn];
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
"root_type": 'Asset',
|
"account_type": "Receivable",
|
||||||
"company": d.company,
|
"company": d.company,
|
||||||
"is_group": 0
|
"is_group": 0
|
||||||
}
|
}
|
||||||
|
@ -2940,10 +2940,8 @@ def make_advance_liability_entry(
|
|||||||
dr_or_cr + "_in_account_currency": allocated_amount,
|
dr_or_cr + "_in_account_currency": allocated_amount,
|
||||||
rev: 0,
|
rev: 0,
|
||||||
rev + "_in_account_currency": 0,
|
rev + "_in_account_currency": 0,
|
||||||
"against_voucher": invoice.return_against
|
"against_voucher": pe.name,
|
||||||
if cint(invoice.is_return) and invoice.return_against
|
"against_voucher_type": "Payment Entry",
|
||||||
else invoice.name,
|
|
||||||
"against_voucher_type": invoice.doctype,
|
|
||||||
"cost_center": invoice.cost_center,
|
"cost_center": invoice.cost_center,
|
||||||
"project": invoice.project,
|
"project": invoice.project,
|
||||||
"voucher_type": voucher_type,
|
"voucher_type": voucher_type,
|
||||||
|
@ -39,7 +39,7 @@ frappe.ui.form.on("Customer", {
|
|||||||
let d = locals[cdt][cdn];
|
let d = locals[cdt][cdn];
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
"root_type": 'Liability',
|
"account_type": 'Payable',
|
||||||
"company": d.company,
|
"company": d.company,
|
||||||
"is_group": 0
|
"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"}],
|
["asset_received_but_not_billed", {"account_type": "Asset Received But Not Billed"}],
|
||||||
["unrealized_profit_loss_account", {"root_type": ["in", ["Liability", "Asset"]]}],
|
["unrealized_profit_loss_account", {"root_type": ["in", ["Liability", "Asset"]]}],
|
||||||
["default_provisional_account", {"root_type": ["in", ["Liability", "Asset"]]}],
|
["default_provisional_account", {"root_type": ["in", ["Liability", "Asset"]]}],
|
||||||
["default_advance_received_account", {"root_type": "Liability"}],
|
["default_advance_received_account", {"account_type": "Payable"}],
|
||||||
["default_advance_paid_account", {"root_type": "Asset"}],
|
["default_advance_paid_account", {"account_type": "Receivable"}],
|
||||||
], function(i, v) {
|
], function(i, v) {
|
||||||
erpnext.company.set_custom_query(frm, v);
|
erpnext.company.set_custom_query(frm, v);
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user