refactor: tests
diff --git a/erpnext/accounts/doctype/dunning/test_dunning.py b/erpnext/accounts/doctype/dunning/test_dunning.py
index e1fd1e9..956b1cf 100644
--- a/erpnext/accounts/doctype/dunning/test_dunning.py
+++ b/erpnext/accounts/doctype/dunning/test_dunning.py
@@ -6,7 +6,7 @@
import frappe
from frappe.utils import add_days, nowdate, today
-from erpnext.accounts.doctype.dunning.dunning import calculate_interest_and_amount
+from erpnext.accounts.doctype.sales_invoice.sales_invoice import create_dunning as create_dunning_from_sales_invoice
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import (
unlink_payment_on_cancel_of_invoice,
@@ -19,34 +19,34 @@
class TestDunning(unittest.TestCase):
@classmethod
def setUpClass(self):
- create_dunning_type()
- create_dunning_type_with_zero_interest_rate()
+ create_dunning_type("First Notice", fee=0.0, interest=0.0, is_default=1)
+ create_dunning_type("Second Notice", fee=10.0, interest=10.0, is_default=0)
unlink_payment_on_cancel_of_invoice()
@classmethod
def tearDownClass(self):
unlink_payment_on_cancel_of_invoice(0)
- def test_dunning(self):
- dunning = create_dunning()
- amounts = calculate_interest_and_amount(
- dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days
- )
- self.assertEqual(round(amounts.get("interest_amount"), 2), 0.44)
- self.assertEqual(round(amounts.get("dunning_amount"), 2), 20.44)
- self.assertEqual(round(amounts.get("grand_total"), 2), 120.44)
+ def test_first_dunning(self):
+ dunning = create_first_dunning()
- def test_dunning_with_zero_interest_rate(self):
- dunning = create_dunning_with_zero_interest_rate()
- amounts = calculate_interest_and_amount(
- dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days
- )
- self.assertEqual(round(amounts.get("interest_amount"), 2), 0)
- self.assertEqual(round(amounts.get("dunning_amount"), 2), 20)
- self.assertEqual(round(amounts.get("grand_total"), 2), 120)
+ self.assertEqual(round(dunning.total_outstanding, 2), 100.00)
+ self.assertEqual(round(dunning.total_interest, 2), 0.00)
+ self.assertEqual(round(dunning.dunning_fee, 2), 0.00)
+ self.assertEqual(round(dunning.dunning_amount, 2), 0.00)
+ self.assertEqual(round(dunning.grand_total, 2), 100.00)
+
+ def test_second_dunning(self):
+ dunning = create_second_dunning()
+
+ self.assertEqual(round(dunning.total_outstanding, 2), 100.00)
+ self.assertEqual(round(dunning.total_interest, 2), 0.41)
+ self.assertEqual(round(dunning.dunning_fee, 2), 10.00)
+ self.assertEqual(round(dunning.dunning_amount, 2), 10.41)
+ self.assertEqual(round(dunning.grand_total, 2), 110.41)
def test_gl_entries(self):
- dunning = create_dunning()
+ dunning = create_second_dunning()
dunning.submit()
gl_entries = frappe.db.sql(
"""select account, debit, credit
@@ -56,16 +56,17 @@
as_dict=1,
)
self.assertTrue(gl_entries)
- expected_values = dict(
- (d[0], d) for d in [["Debtors - _TC", 20.44, 0.0], ["Sales - _TC", 0.0, 20.44]]
- )
+ expected_values = dict((d[0], d) for d in [
+ ['Debtors - _TC', 10.41, 0.0],
+ ['Sales - _TC', 0.0, 10.41]
+ ])
for gle in gl_entries:
self.assertEqual(expected_values[gle.account][0], gle.account)
self.assertEqual(expected_values[gle.account][1], gle.debit)
self.assertEqual(expected_values[gle.account][2], gle.credit)
def test_payment_entry(self):
- dunning = create_dunning()
+ dunning = create_second_dunning()
dunning.submit()
pe = get_payment_entry("Dunning", dunning.name)
pe.reference_no = "1"
@@ -80,83 +81,49 @@
self.assertEqual(si_doc.outstanding_amount, 0)
-def create_dunning():
+def create_first_dunning():
posting_date = add_days(today(), -20)
due_date = add_days(today(), -15)
sales_invoice = create_sales_invoice_against_cost_center(
- posting_date=posting_date, due_date=due_date, status="Overdue"
- )
- dunning_type = frappe.get_doc("Dunning Type", "First Notice")
- dunning = frappe.new_doc("Dunning")
- dunning.sales_invoice = sales_invoice.name
- dunning.customer_name = sales_invoice.customer_name
- dunning.outstanding_amount = sales_invoice.outstanding_amount
- dunning.debit_to = sales_invoice.debit_to
- dunning.currency = sales_invoice.currency
- dunning.company = sales_invoice.company
- dunning.posting_date = nowdate()
- dunning.due_date = sales_invoice.due_date
- dunning.dunning_type = "First Notice"
- dunning.rate_of_interest = dunning_type.rate_of_interest
- dunning.dunning_fee = dunning_type.dunning_fee
+ posting_date=posting_date, due_date=due_date, qty=1, rate=100)
+ dunning = create_dunning_from_sales_invoice(sales_invoice.name)
dunning.save()
+
return dunning
-def create_dunning_with_zero_interest_rate():
+def create_second_dunning():
posting_date = add_days(today(), -20)
due_date = add_days(today(), -15)
sales_invoice = create_sales_invoice_against_cost_center(
- posting_date=posting_date, due_date=due_date, status="Overdue"
- )
- dunning_type = frappe.get_doc("Dunning Type", "First Notice with 0% Rate of Interest")
- dunning = frappe.new_doc("Dunning")
- dunning.sales_invoice = sales_invoice.name
- dunning.customer_name = sales_invoice.customer_name
- dunning.outstanding_amount = sales_invoice.outstanding_amount
- dunning.debit_to = sales_invoice.debit_to
- dunning.currency = sales_invoice.currency
- dunning.company = sales_invoice.company
- dunning.posting_date = nowdate()
- dunning.due_date = sales_invoice.due_date
- dunning.dunning_type = "First Notice with 0% Rate of Interest"
+ posting_date=posting_date, due_date=due_date, qty=1, rate=100)
+ dunning = create_dunning_from_sales_invoice(sales_invoice.name)
+ dunning_type = frappe.get_doc("Dunning Type", "Second Notice")
+
+ dunning.dunning_type = dunning_type.name
dunning.rate_of_interest = dunning_type.rate_of_interest
dunning.dunning_fee = dunning_type.dunning_fee
dunning.save()
+
return dunning
-def create_dunning_type():
+def create_dunning_type(title, fee, interest, is_default):
+ existing = frappe.db.exists("Dunning Type", title)
+ if existing:
+ return frappe.get_doc("Dunning Type", existing)
+
dunning_type = frappe.new_doc("Dunning Type")
- dunning_type.dunning_type = "First Notice"
- dunning_type.start_day = 10
- dunning_type.end_day = 20
- dunning_type.dunning_fee = 20
- dunning_type.rate_of_interest = 8
+ dunning_type.dunning_type = title
+ dunning_type.is_default = is_default
+ dunning_type.dunning_fee = fee
+ dunning_type.rate_of_interest = interest
dunning_type.append(
- "dunning_letter_text",
- {
+ "dunning_letter_text", {
"language": "en",
- "body_text": "We have still not received payment for our invoice ",
- "closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees.",
- },
+ "body_text": "We have still not received payment for our invoice",
+ "closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees."
+ }
)
dunning_type.save()
-
-
-def create_dunning_type_with_zero_interest_rate():
- dunning_type = frappe.new_doc("Dunning Type")
- dunning_type.dunning_type = "First Notice with 0% Rate of Interest"
- dunning_type.start_day = 10
- dunning_type.end_day = 20
- dunning_type.dunning_fee = 20
- dunning_type.rate_of_interest = 0
- dunning_type.append(
- "dunning_letter_text",
- {
- "language": "en",
- "body_text": "We have still not received payment for our invoice ",
- "closing_text": "We kindly request that you pay the outstanding amount immediately, and late fees.",
- },
- )
- dunning_type.save()
+ return dunning_type