test: add tests for advance liability entries

Add Sales and Purchase Invoice Tests to check if GL entries and Outstanding Amount are generated correctly when advance entries are recorded as liability.

Few changes to return value of added column in Payment Entry References.
This commit is contained in:
Gursheen Anand 2023-06-08 18:15:37 +05:30
parent 4ee163742a
commit b65e58c1ae
5 changed files with 113 additions and 21 deletions

View File

@ -1741,6 +1741,9 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
if reference_doctype in ("Sales Invoice", "Purchase Invoice"):
outstanding_amount = ref_doc.get("outstanding_amount")
account = (
ref_doc.get("debit_to") if reference_doctype == "Sales Invoice" else ref_doc.get("credit_to")
)
else:
outstanding_amount = flt(total_amount) - flt(ref_doc.get("advance_paid"))
@ -1748,7 +1751,7 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
# Get the exchange rate based on the posting date of the ref doc.
exchange_rate = get_exchange_rate(party_account_currency, company_currency, ref_doc.posting_date)
return frappe._dict(
res = frappe._dict(
{
"due_date": ref_doc.get("due_date"),
"total_amount": flt(total_amount),
@ -1757,6 +1760,9 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
"bill_no": ref_doc.get("bill_no"),
}
)
if account:
res.update({"account": account})
return res
@frappe.whitelist()

View File

@ -113,7 +113,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2023-06-07 14:35:06.166907",
"modified": "2023-06-08 07:40:38.487874",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry Reference",

View File

@ -1662,22 +1662,66 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
self.assertTrue(return_pi.docstatus == 1)
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_account": "Debtors - _TC"},
)
pe = create_payment_entry(
company="_Test Company",
payment_type="Pay",
party_type="Supplier",
party="_Test Supplier",
paid_from="Cash - _TC",
paid_to=get_party_account("Supplier", "_Test Supplier", "_Test Company", is_advance=True),
paid_amount=1000,
)
pe.submit()
pi = make_purchase_invoice(
company="_Test Company", customer="_Test Supplier", do_not_save=True, do_not_submit=True
)
pi.base_grand_total = 100
pi.grand_total = 100
pi.set_advances()
self.assertEqual(pi.advances[0].allocated_amount, 100)
pi.advances[0].allocated_amount = 50
pi.advances = [pi.advances[0]]
pi.save()
pi.submit()
expected_gle = [
["Creditors - _TC", 50, 100],
["Debtors - _TC", 0.0, 50],
["Stock Received But Not Billed - _TC", 100, 0.0],
]
check_gl_entries(self, pi.name, expected_gle, nowdate())
self.assertEqual(pi.outstanding_amount, 200)
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
gl_entries = frappe.db.sql(
"""select account, debit, credit, posting_date
from `tabGL Entry`
where voucher_type='Purchase Invoice' and voucher_no=%s and posting_date >= %s
order by posting_date asc, account asc""",
(voucher_no, posting_date),
as_dict=1,
gl = frappe.qb.DocType("GL Entry")
q = (
frappe.qb.from_(gl)
.select(gl.account, gl.debit, gl.credit, gl.posting_date)
.where(
(gl.voucher_type == "Sales Invoice")
& (gl.voucher_no == voucher_no)
& (gl.posting_date >= posting_date)
& (gl.is_cancelled == 0)
)
.orderby(gl.posting_date, gl.account)
)
gl_entries = q.run(as_dict=True)
for i, gle in enumerate(gl_entries):
doc.assertEqual(expected_gle[i][0], gle.account)
doc.assertEqual(expected_gle[i][1], gle.debit)
doc.assertEqual(expected_gle[i][2], gle.credit)
doc.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
def create_tax_witholding_category(category_name, company, account):

View File

@ -3313,6 +3313,46 @@ class TestSalesInvoice(unittest.TestCase):
)
self.assertRaises(frappe.ValidationError, si.submit)
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_account": "Creditors - _TC"},
)
pe = create_payment_entry(
company="_Test Company",
payment_type="Receive",
party_type="Customer",
party="_Test Customer",
paid_from=get_party_account("Customer", "_Test Customer", "_Test Company", is_advance=True),
paid_to="Cash - _TC",
paid_amount=1000,
)
pe.submit()
si = create_sales_invoice(
company="_Test Company", customer="_Test Customer", do_not_save=True, do_not_submit=True
)
si.base_grand_total = 100
si.grand_total = 100
si.set_advances()
self.assertEqual(si.advances[0].allocated_amount, 100)
si.advances[0].allocated_amount = 50
si.advances = [si.advances[0]]
si.save()
si.submit()
expected_gle = [
["Creditors - _TC", 50, 0.0],
["Debtors - _TC", 100, 50],
["Sales - _TC", 0.0, 100],
]
check_gl_entries(self, si.name, expected_gle, nowdate())
self.assertEqual(si.outstanding_amount, 50)
def get_sales_invoice_for_e_invoice():
si = make_sales_invoice_for_ewaybill()
@ -3350,23 +3390,24 @@ def get_sales_invoice_for_e_invoice():
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
gl_entries = frappe.db.sql(
"""select account, debit, credit, posting_date
from `tabGL Entry`
where voucher_type='Sales Invoice' and voucher_no=%s and posting_date >= %s
and is_cancelled = 0
order by posting_date asc, account asc""",
(voucher_no, posting_date),
as_dict=1,
debug=True,
gl = frappe.qb.DocType("GL Entry")
q = (
frappe.qb.from_(gl)
.select(gl.account, gl.debit, gl.credit, gl.posting_date)
.where(
(gl.voucher_type == "Sales Invoice")
& (gl.voucher_no == voucher_no)
& (gl.posting_date >= posting_date)
& (gl.is_cancelled == 0)
)
.orderby(gl.posting_date, gl.account)
)
gl_entries = q.run(as_dict=True)
for i, gle in enumerate(gl_entries):
print(i, gle)
doc.assertEqual(expected_gle[i][0], gle.account)
doc.assertEqual(expected_gle[i][1], gle.debit)
doc.assertEqual(expected_gle[i][2], gle.credit)
doc.assertEqual(getdate(expected_gle[i][3]), gle.posting_date)
def create_sales_invoice(**args):

View File

@ -625,6 +625,7 @@ def update_reference_in_payment_entry(
if not d.exchange_gain_loss
else payment_entry.get_exchange_rate(),
"exchange_gain_loss": d.exchange_gain_loss, # only populated from invoice in case of advance allocation
"account": d.account,
}
if d.voucher_detail_no: