test: ledger pre and post reconciliation on advance as liability
(cherry picked from commit 0255e09285d62eb9bfe80f56970e0dcaef4df17f)
This commit is contained in:
parent
c67d0eb718
commit
25b49ef0de
@ -8,6 +8,7 @@ from frappe import qb
|
|||||||
from frappe.tests.utils import FrappeTestCase, change_settings
|
from frappe.tests.utils import FrappeTestCase, change_settings
|
||||||
from frappe.utils import flt, nowdate
|
from frappe.utils import flt, nowdate
|
||||||
|
|
||||||
|
from erpnext.accounts.doctype.account.test_account import create_account
|
||||||
from erpnext.accounts.doctype.payment_entry.payment_entry import (
|
from erpnext.accounts.doctype.payment_entry.payment_entry import (
|
||||||
InvalidPaymentEntry,
|
InvalidPaymentEntry,
|
||||||
get_payment_entry,
|
get_payment_entry,
|
||||||
@ -1318,6 +1319,140 @@ class TestPaymentEntry(FrappeTestCase):
|
|||||||
]
|
]
|
||||||
self.check_gl_entries()
|
self.check_gl_entries()
|
||||||
|
|
||||||
|
def test_ledger_entries_for_advance_as_liability(self):
|
||||||
|
from erpnext.accounts.doctype.account.test_account import create_account
|
||||||
|
|
||||||
|
company = "_Test Company"
|
||||||
|
|
||||||
|
advance_account = create_account(
|
||||||
|
parent_account="Current Assets - _TC",
|
||||||
|
account_name="Advances Received",
|
||||||
|
company=company,
|
||||||
|
account_type="Liability",
|
||||||
|
)
|
||||||
|
|
||||||
|
frappe.db.set_value(
|
||||||
|
"Company",
|
||||||
|
company,
|
||||||
|
{
|
||||||
|
"book_advance_payments_in_separate_party_account": 1,
|
||||||
|
"default_advance_received_account": advance_account,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
# Advance Payment
|
||||||
|
pe = create_payment_entry(
|
||||||
|
party_type="Customer",
|
||||||
|
party="_Test Customer",
|
||||||
|
payment_type="Receive",
|
||||||
|
paid_from="Debtors - _TC",
|
||||||
|
paid_to="_Test Cash - _TC",
|
||||||
|
)
|
||||||
|
pe.save() # use save() to trigger set_liability_account()
|
||||||
|
pe.submit()
|
||||||
|
|
||||||
|
# Normal Invoice
|
||||||
|
si = create_sales_invoice(qty=10, rate=100, customer="_Test Customer")
|
||||||
|
|
||||||
|
pre_reconciliation_gle = [
|
||||||
|
{"account": advance_account, "debit": 0.0, "credit": 1000.0},
|
||||||
|
{"account": "_Test Cash - _TC", "debit": 1000.0, "credit": 0.0},
|
||||||
|
]
|
||||||
|
pre_reconciliation_ple = [
|
||||||
|
{
|
||||||
|
"account": advance_account,
|
||||||
|
"voucher_no": pe.name,
|
||||||
|
"against_voucher_no": pe.name,
|
||||||
|
"amount": -1000.0,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
self.voucher_no = pe.name
|
||||||
|
self.expected_gle = pre_reconciliation_gle
|
||||||
|
self.expected_ple = pre_reconciliation_ple
|
||||||
|
self.check_gl_entries()
|
||||||
|
self.check_pl_entries()
|
||||||
|
|
||||||
|
# Partially reconcile advance against invoice
|
||||||
|
pr = frappe.get_doc("Payment Reconciliation")
|
||||||
|
pr.company = company
|
||||||
|
pr.party_type = "Customer"
|
||||||
|
pr.party = "_Test Customer"
|
||||||
|
pr.receivable_payable_account = si.debit_to
|
||||||
|
pr.default_advance_account = advance_account
|
||||||
|
pr.get_unreconciled_entries()
|
||||||
|
|
||||||
|
self.assertEqual(len(pr.invoices), 1)
|
||||||
|
self.assertEqual(len(pr.payments), 1)
|
||||||
|
|
||||||
|
invoices = [x.as_dict() for x in pr.get("invoices")]
|
||||||
|
payments = [x.as_dict() for x in pr.get("payments")]
|
||||||
|
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
|
||||||
|
pr.allocation[0].allocated_amount = 400
|
||||||
|
pr.reconcile()
|
||||||
|
|
||||||
|
# assert General and Payment Ledger entries post partial reconciliation
|
||||||
|
self.expected_gle = [
|
||||||
|
{"account": si.debit_to, "debit": 0.0, "credit": 400.0},
|
||||||
|
{"account": advance_account, "debit": 400.0, "credit": 0.0},
|
||||||
|
{"account": advance_account, "debit": 0.0, "credit": 1000.0},
|
||||||
|
{"account": "_Test Cash - _TC", "debit": 1000.0, "credit": 0.0},
|
||||||
|
]
|
||||||
|
self.expected_ple = [
|
||||||
|
{
|
||||||
|
"account": advance_account,
|
||||||
|
"voucher_no": pe.name,
|
||||||
|
"against_voucher_no": pe.name,
|
||||||
|
"amount": -1000.0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"account": si.debit_to,
|
||||||
|
"voucher_no": pe.name,
|
||||||
|
"against_voucher_no": si.name,
|
||||||
|
"amount": -400.0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"account": advance_account,
|
||||||
|
"voucher_no": pe.name,
|
||||||
|
"against_voucher_no": pe.name,
|
||||||
|
"amount": 400.0,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
self.check_gl_entries()
|
||||||
|
self.check_pl_entries()
|
||||||
|
|
||||||
|
# Unreconcile
|
||||||
|
unrecon = (
|
||||||
|
frappe.get_doc(
|
||||||
|
{
|
||||||
|
"doctype": "Unreconcile Payment",
|
||||||
|
"company": company,
|
||||||
|
"voucher_type": pe.doctype,
|
||||||
|
"voucher_no": pe.name,
|
||||||
|
"allocations": [{"reference_doctype": si.doctype, "reference_name": si.name}],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.save()
|
||||||
|
.submit()
|
||||||
|
)
|
||||||
|
|
||||||
|
self.voucher_no = pe.name
|
||||||
|
self.expected_gle = pre_reconciliation_gle
|
||||||
|
self.expected_ple = pre_reconciliation_ple
|
||||||
|
self.check_gl_entries()
|
||||||
|
self.check_pl_entries()
|
||||||
|
|
||||||
|
def check_pl_entries(self):
|
||||||
|
ple = frappe.qb.DocType("Payment Ledger Entry")
|
||||||
|
pl_entries = (
|
||||||
|
frappe.qb.from_(ple)
|
||||||
|
.select(ple.account, ple.voucher_no, ple.against_voucher_no, ple.amount)
|
||||||
|
.where((ple.voucher_no == self.voucher_no) & (ple.delinked == 0))
|
||||||
|
.orderby(ple.creation)
|
||||||
|
).run(as_dict=True)
|
||||||
|
for row in range(len(self.expected_ple)):
|
||||||
|
for field in ["account", "voucher_no", "against_voucher_no", "amount"]:
|
||||||
|
self.assertEqual(self.expected_ple[row][field], pl_entries[row][field])
|
||||||
|
|
||||||
def check_gl_entries(self):
|
def check_gl_entries(self):
|
||||||
gle = frappe.qb.DocType("GL Entry")
|
gle = frappe.qb.DocType("GL Entry")
|
||||||
gl_entries = (
|
gl_entries = (
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user