mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 16:34:46 +00:00
test: add unit test to validate outstanding amount for update_outstanding_for_self checkbox enabled
(cherry picked from commit 7b0882600a)
# Conflicts:
# erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
This commit is contained in:
@@ -3861,6 +3861,7 @@ class TestSalesInvoice(FrappeTestCase):
|
|||||||
self.assertEqual(doc.total_billed_amount, si.grand_total)
|
self.assertEqual(doc.total_billed_amount, si.grand_total)
|
||||||
|
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
|
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
|
||||||
gl_entries = frappe.db.sql(
|
gl_entries = frappe.db.sql(
|
||||||
"""select account, debit, credit, posting_date
|
"""select account, debit, credit, posting_date
|
||||||
@@ -3870,6 +3871,105 @@ def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
|
|||||||
order by posting_date asc, account asc""",
|
order by posting_date asc, account asc""",
|
||||||
(voucher_no, posting_date),
|
(voucher_no, posting_date),
|
||||||
as_dict=1,
|
as_dict=1,
|
||||||
|
=======
|
||||||
|
si = create_sales_invoice(do_not_submit=True)
|
||||||
|
|
||||||
|
project = frappe.new_doc("Project")
|
||||||
|
project.company = "_Test Company"
|
||||||
|
project.project_name = "Test Total Billed Amount"
|
||||||
|
project.save()
|
||||||
|
|
||||||
|
si.project = project.name
|
||||||
|
si.items.append(copy(si.items[0]))
|
||||||
|
si.items.append(copy(si.items[0]))
|
||||||
|
si.items[0].project = project.name
|
||||||
|
si.items[1].project = project.name
|
||||||
|
# Not setting project on last item
|
||||||
|
si.items[1].insert()
|
||||||
|
si.items[2].insert()
|
||||||
|
si.submit()
|
||||||
|
|
||||||
|
project.reload()
|
||||||
|
self.assertIsNone(si.items[2].project)
|
||||||
|
self.assertEqual(project.total_billed_amount, 300)
|
||||||
|
|
||||||
|
def test_pos_returns_with_party_account_currency(self):
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_sales_return
|
||||||
|
|
||||||
|
pos_profile = make_pos_profile()
|
||||||
|
pos_profile.payments = []
|
||||||
|
pos_profile.append("payments", {"default": 1, "mode_of_payment": "Cash"})
|
||||||
|
pos_profile.save()
|
||||||
|
|
||||||
|
pos = create_sales_invoice(
|
||||||
|
customer="_Test Customer USD",
|
||||||
|
currency="USD",
|
||||||
|
conversion_rate=86.595000000,
|
||||||
|
qty=2,
|
||||||
|
do_not_save=True,
|
||||||
|
)
|
||||||
|
pos.is_pos = 1
|
||||||
|
pos.pos_profile = pos_profile.name
|
||||||
|
pos.debit_to = "_Test Receivable USD - _TC"
|
||||||
|
pos.append("payments", {"mode_of_payment": "Cash", "account": "_Test Bank - _TC", "amount": 20.35})
|
||||||
|
pos.save().submit()
|
||||||
|
|
||||||
|
pos_return = make_sales_return(pos.name)
|
||||||
|
self.assertEqual(abs(pos_return.payments[0].amount), pos.payments[0].amount)
|
||||||
|
|
||||||
|
def test_create_return_invoice_for_self_update(self):
|
||||||
|
from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
|
||||||
|
from erpnext.controllers.sales_and_purchase_return import make_return_doc
|
||||||
|
|
||||||
|
invoice = create_sales_invoice()
|
||||||
|
|
||||||
|
payment_entry = get_payment_entry(dt=invoice.doctype, dn=invoice.name)
|
||||||
|
payment_entry.reference_no = "test001"
|
||||||
|
payment_entry.reference_date = getdate()
|
||||||
|
|
||||||
|
payment_entry.save()
|
||||||
|
payment_entry.submit()
|
||||||
|
|
||||||
|
r_invoice = make_return_doc(invoice.doctype, invoice.name)
|
||||||
|
|
||||||
|
r_invoice.update_outstanding_for_self = 0
|
||||||
|
r_invoice.save()
|
||||||
|
|
||||||
|
self.assertEqual(r_invoice.update_outstanding_for_self, 1)
|
||||||
|
|
||||||
|
r_invoice.submit()
|
||||||
|
|
||||||
|
self.assertNotEqual(r_invoice.outstanding_amount, 0)
|
||||||
|
|
||||||
|
invoice.reload()
|
||||||
|
|
||||||
|
self.assertEqual(invoice.outstanding_amount, 0)
|
||||||
|
|
||||||
|
def test_prevents_fully_returned_invoice_with_zero_quantity(self):
|
||||||
|
from erpnext.controllers.sales_and_purchase_return import StockOverReturnError, make_return_doc
|
||||||
|
|
||||||
|
invoice = create_sales_invoice(qty=10)
|
||||||
|
|
||||||
|
return_doc = make_return_doc(invoice.doctype, invoice.name)
|
||||||
|
return_doc.items[0].qty = -10
|
||||||
|
return_doc.save().submit()
|
||||||
|
|
||||||
|
return_doc = make_return_doc(invoice.doctype, invoice.name)
|
||||||
|
return_doc.items[0].qty = 0
|
||||||
|
|
||||||
|
self.assertRaises(StockOverReturnError, return_doc.save)
|
||||||
|
|
||||||
|
|
||||||
|
def set_advance_flag(company, flag, default_account):
|
||||||
|
frappe.db.set_value(
|
||||||
|
"Company",
|
||||||
|
company,
|
||||||
|
{
|
||||||
|
"book_advance_payments_in_separate_party_account": flag,
|
||||||
|
"default_advance_received_account": default_account,
|
||||||
|
},
|
||||||
|
>>>>>>> 7b0882600a (test: add unit test to validate outstanding amount for update_outstanding_for_self checkbox enabled)
|
||||||
)
|
)
|
||||||
|
|
||||||
for i, gle in enumerate(gl_entries):
|
for i, gle in enumerate(gl_entries):
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
frappe.db.rollback()
|
frappe.db.rollback()
|
||||||
|
|
||||||
def create_sales_invoice(self, no_payment_schedule=False, do_not_submit=False):
|
def create_sales_invoice(self, no_payment_schedule=False, do_not_submit=False, **args):
|
||||||
frappe.set_user("Administrator")
|
frappe.set_user("Administrator")
|
||||||
si = create_sales_invoice(
|
si = create_sales_invoice(
|
||||||
item=self.item,
|
item=self.item,
|
||||||
@@ -34,6 +34,7 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
|
|||||||
rate=100,
|
rate=100,
|
||||||
price_list_rate=100,
|
price_list_rate=100,
|
||||||
do_not_save=1,
|
do_not_save=1,
|
||||||
|
**args,
|
||||||
)
|
)
|
||||||
if not no_payment_schedule:
|
if not no_payment_schedule:
|
||||||
si.append(
|
si.append(
|
||||||
@@ -111,7 +112,7 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
|
|||||||
self.assertEqual(expected_data[0], [row.invoiced, row.paid, row.credit_note])
|
self.assertEqual(expected_data[0], [row.invoiced, row.paid, row.credit_note])
|
||||||
pos_inv.cancel()
|
pos_inv.cancel()
|
||||||
|
|
||||||
def test_accounts_receivable(self):
|
def test_accounts_receivable_with_payment(self):
|
||||||
filters = {
|
filters = {
|
||||||
"company": self.company,
|
"company": self.company,
|
||||||
"based_on_payment_terms": 1,
|
"based_on_payment_terms": 1,
|
||||||
@@ -151,11 +152,15 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
|
|||||||
cr_note = self.create_credit_note(si.name, do_not_submit=True)
|
cr_note = self.create_credit_note(si.name, do_not_submit=True)
|
||||||
cr_note.update_outstanding_for_self = False
|
cr_note.update_outstanding_for_self = False
|
||||||
cr_note.save().submit()
|
cr_note.save().submit()
|
||||||
|
|
||||||
|
# as the invoice partially paid and returning the full amount so the outstanding amount should be True
|
||||||
|
self.assertEqual(cr_note.update_outstanding_for_self, True)
|
||||||
|
|
||||||
report = execute(filters)
|
report = execute(filters)
|
||||||
|
|
||||||
expected_data_after_credit_note = [100, 0, 0, 40, -40, self.debit_to]
|
expected_data_after_credit_note = [0, 0, 100, 0, -100, self.debit_to]
|
||||||
|
|
||||||
row = report[1][0]
|
row = report[1][-1]
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
expected_data_after_credit_note,
|
expected_data_after_credit_note,
|
||||||
[
|
[
|
||||||
@@ -168,6 +173,99 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_accounts_receivable_without_payment(self):
|
||||||
|
filters = {
|
||||||
|
"company": self.company,
|
||||||
|
"based_on_payment_terms": 1,
|
||||||
|
"report_date": today(),
|
||||||
|
"range": "30, 60, 90, 120",
|
||||||
|
"show_remarks": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
# check invoice grand total and invoiced column's value for 3 payment terms
|
||||||
|
si = self.create_sales_invoice()
|
||||||
|
|
||||||
|
report = execute(filters)
|
||||||
|
|
||||||
|
expected_data = [[100, 30, "No Remarks"], [100, 50, "No Remarks"], [100, 20, "No Remarks"]]
|
||||||
|
|
||||||
|
for i in range(3):
|
||||||
|
row = report[1][i - 1]
|
||||||
|
self.assertEqual(expected_data[i - 1], [row.invoice_grand_total, row.invoiced, row.remarks])
|
||||||
|
|
||||||
|
# check invoice grand total, invoiced, paid and outstanding column's value after credit note
|
||||||
|
cr_note = self.create_credit_note(si.name, do_not_submit=True)
|
||||||
|
cr_note.update_outstanding_for_self = False
|
||||||
|
cr_note.save().submit()
|
||||||
|
|
||||||
|
self.assertEqual(cr_note.update_outstanding_for_self, False)
|
||||||
|
|
||||||
|
report = execute(filters)
|
||||||
|
|
||||||
|
row = report[1]
|
||||||
|
self.assertTrue(len(row) == 0)
|
||||||
|
|
||||||
|
def test_accounts_receivable_with_partial_payment(self):
|
||||||
|
filters = {
|
||||||
|
"company": self.company,
|
||||||
|
"based_on_payment_terms": 1,
|
||||||
|
"report_date": today(),
|
||||||
|
"range": "30, 60, 90, 120",
|
||||||
|
"show_remarks": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
# check invoice grand total and invoiced column's value for 3 payment terms
|
||||||
|
si = self.create_sales_invoice(qty=2)
|
||||||
|
|
||||||
|
report = execute(filters)
|
||||||
|
|
||||||
|
expected_data = [[200, 60, "No Remarks"], [200, 100, "No Remarks"], [200, 40, "No Remarks"]]
|
||||||
|
|
||||||
|
for i in range(3):
|
||||||
|
row = report[1][i - 1]
|
||||||
|
self.assertEqual(expected_data[i - 1], [row.invoice_grand_total, row.invoiced, row.remarks])
|
||||||
|
|
||||||
|
# check invoice grand total, invoiced, paid and outstanding column's value after payment
|
||||||
|
self.create_payment_entry(si.name)
|
||||||
|
report = execute(filters)
|
||||||
|
|
||||||
|
expected_data_after_payment = [[200, 60, 40, 20], [200, 100, 0, 100], [200, 40, 0, 40]]
|
||||||
|
|
||||||
|
for i in range(3):
|
||||||
|
row = report[1][i - 1]
|
||||||
|
self.assertEqual(
|
||||||
|
expected_data_after_payment[i - 1],
|
||||||
|
[row.invoice_grand_total, row.invoiced, row.paid, row.outstanding],
|
||||||
|
)
|
||||||
|
|
||||||
|
# check invoice grand total, invoiced, paid and outstanding column's value after credit note
|
||||||
|
cr_note = self.create_credit_note(si.name, do_not_submit=True)
|
||||||
|
cr_note.update_outstanding_for_self = False
|
||||||
|
cr_note.save().submit()
|
||||||
|
|
||||||
|
self.assertFalse(cr_note.update_outstanding_for_self)
|
||||||
|
|
||||||
|
report = execute(filters)
|
||||||
|
|
||||||
|
expected_data_after_credit_note = [
|
||||||
|
[200, 100, 0, 80, 20, self.debit_to],
|
||||||
|
[200, 40, 0, 0, 40, self.debit_to],
|
||||||
|
]
|
||||||
|
|
||||||
|
for i in range(2):
|
||||||
|
row = report[1][i - 1]
|
||||||
|
self.assertEqual(
|
||||||
|
expected_data_after_credit_note[i - 1],
|
||||||
|
[
|
||||||
|
row.invoice_grand_total,
|
||||||
|
row.invoiced,
|
||||||
|
row.paid,
|
||||||
|
row.credit_note,
|
||||||
|
row.outstanding,
|
||||||
|
row.party_account,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
def test_cr_note_flag_to_update_self(self):
|
def test_cr_note_flag_to_update_self(self):
|
||||||
filters = {
|
filters = {
|
||||||
"company": self.company,
|
"company": self.company,
|
||||||
|
|||||||
Reference in New Issue
Block a user