mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-22 14:39:19 +00:00
refactor: tests
This commit is contained in:
@@ -6,7 +6,7 @@ import unittest
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe.utils import add_days, nowdate, today
|
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.payment_entry.test_payment_entry import get_payment_entry
|
||||||
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import (
|
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import (
|
||||||
unlink_payment_on_cancel_of_invoice,
|
unlink_payment_on_cancel_of_invoice,
|
||||||
@@ -19,34 +19,34 @@ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import (
|
|||||||
class TestDunning(unittest.TestCase):
|
class TestDunning(unittest.TestCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(self):
|
def setUpClass(self):
|
||||||
create_dunning_type()
|
create_dunning_type("First Notice", fee=0.0, interest=0.0, is_default=1)
|
||||||
create_dunning_type_with_zero_interest_rate()
|
create_dunning_type("Second Notice", fee=10.0, interest=10.0, is_default=0)
|
||||||
unlink_payment_on_cancel_of_invoice()
|
unlink_payment_on_cancel_of_invoice()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def tearDownClass(self):
|
def tearDownClass(self):
|
||||||
unlink_payment_on_cancel_of_invoice(0)
|
unlink_payment_on_cancel_of_invoice(0)
|
||||||
|
|
||||||
def test_dunning(self):
|
def test_first_dunning(self):
|
||||||
dunning = create_dunning()
|
dunning = create_first_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_dunning_with_zero_interest_rate(self):
|
self.assertEqual(round(dunning.total_outstanding, 2), 100.00)
|
||||||
dunning = create_dunning_with_zero_interest_rate()
|
self.assertEqual(round(dunning.total_interest, 2), 0.00)
|
||||||
amounts = calculate_interest_and_amount(
|
self.assertEqual(round(dunning.dunning_fee, 2), 0.00)
|
||||||
dunning.outstanding_amount, dunning.rate_of_interest, dunning.dunning_fee, dunning.overdue_days
|
self.assertEqual(round(dunning.dunning_amount, 2), 0.00)
|
||||||
)
|
self.assertEqual(round(dunning.grand_total, 2), 100.00)
|
||||||
self.assertEqual(round(amounts.get("interest_amount"), 2), 0)
|
|
||||||
self.assertEqual(round(amounts.get("dunning_amount"), 2), 20)
|
def test_second_dunning(self):
|
||||||
self.assertEqual(round(amounts.get("grand_total"), 2), 120)
|
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):
|
def test_gl_entries(self):
|
||||||
dunning = create_dunning()
|
dunning = create_second_dunning()
|
||||||
dunning.submit()
|
dunning.submit()
|
||||||
gl_entries = frappe.db.sql(
|
gl_entries = frappe.db.sql(
|
||||||
"""select account, debit, credit
|
"""select account, debit, credit
|
||||||
@@ -56,16 +56,17 @@ class TestDunning(unittest.TestCase):
|
|||||||
as_dict=1,
|
as_dict=1,
|
||||||
)
|
)
|
||||||
self.assertTrue(gl_entries)
|
self.assertTrue(gl_entries)
|
||||||
expected_values = dict(
|
expected_values = dict((d[0], d) for d in [
|
||||||
(d[0], d) for d in [["Debtors - _TC", 20.44, 0.0], ["Sales - _TC", 0.0, 20.44]]
|
['Debtors - _TC', 10.41, 0.0],
|
||||||
)
|
['Sales - _TC', 0.0, 10.41]
|
||||||
|
])
|
||||||
for gle in gl_entries:
|
for gle in gl_entries:
|
||||||
self.assertEqual(expected_values[gle.account][0], gle.account)
|
self.assertEqual(expected_values[gle.account][0], gle.account)
|
||||||
self.assertEqual(expected_values[gle.account][1], gle.debit)
|
self.assertEqual(expected_values[gle.account][1], gle.debit)
|
||||||
self.assertEqual(expected_values[gle.account][2], gle.credit)
|
self.assertEqual(expected_values[gle.account][2], gle.credit)
|
||||||
|
|
||||||
def test_payment_entry(self):
|
def test_payment_entry(self):
|
||||||
dunning = create_dunning()
|
dunning = create_second_dunning()
|
||||||
dunning.submit()
|
dunning.submit()
|
||||||
pe = get_payment_entry("Dunning", dunning.name)
|
pe = get_payment_entry("Dunning", dunning.name)
|
||||||
pe.reference_no = "1"
|
pe.reference_no = "1"
|
||||||
@@ -80,83 +81,49 @@ class TestDunning(unittest.TestCase):
|
|||||||
self.assertEqual(si_doc.outstanding_amount, 0)
|
self.assertEqual(si_doc.outstanding_amount, 0)
|
||||||
|
|
||||||
|
|
||||||
def create_dunning():
|
def create_first_dunning():
|
||||||
posting_date = add_days(today(), -20)
|
posting_date = add_days(today(), -20)
|
||||||
due_date = add_days(today(), -15)
|
due_date = add_days(today(), -15)
|
||||||
sales_invoice = create_sales_invoice_against_cost_center(
|
sales_invoice = create_sales_invoice_against_cost_center(
|
||||||
posting_date=posting_date, due_date=due_date, status="Overdue"
|
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", "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
|
|
||||||
dunning.save()
|
dunning.save()
|
||||||
|
|
||||||
return dunning
|
return dunning
|
||||||
|
|
||||||
|
|
||||||
def create_dunning_with_zero_interest_rate():
|
def create_second_dunning():
|
||||||
posting_date = add_days(today(), -20)
|
posting_date = add_days(today(), -20)
|
||||||
due_date = add_days(today(), -15)
|
due_date = add_days(today(), -15)
|
||||||
sales_invoice = create_sales_invoice_against_cost_center(
|
sales_invoice = create_sales_invoice_against_cost_center(
|
||||||
posting_date=posting_date, due_date=due_date, status="Overdue"
|
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", "First Notice with 0% Rate of Interest")
|
dunning_type = frappe.get_doc("Dunning Type", "Second Notice")
|
||||||
dunning = frappe.new_doc("Dunning")
|
|
||||||
dunning.sales_invoice = sales_invoice.name
|
dunning.dunning_type = dunning_type.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"
|
|
||||||
dunning.rate_of_interest = dunning_type.rate_of_interest
|
dunning.rate_of_interest = dunning_type.rate_of_interest
|
||||||
dunning.dunning_fee = dunning_type.dunning_fee
|
dunning.dunning_fee = dunning_type.dunning_fee
|
||||||
dunning.save()
|
dunning.save()
|
||||||
|
|
||||||
return dunning
|
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 = frappe.new_doc("Dunning Type")
|
||||||
dunning_type.dunning_type = "First Notice"
|
dunning_type.dunning_type = title
|
||||||
dunning_type.start_day = 10
|
dunning_type.is_default = is_default
|
||||||
dunning_type.end_day = 20
|
dunning_type.dunning_fee = fee
|
||||||
dunning_type.dunning_fee = 20
|
dunning_type.rate_of_interest = interest
|
||||||
dunning_type.rate_of_interest = 8
|
|
||||||
dunning_type.append(
|
dunning_type.append(
|
||||||
"dunning_letter_text",
|
"dunning_letter_text", {
|
||||||
{
|
|
||||||
"language": "en",
|
"language": "en",
|
||||||
"body_text": "We have still not received payment for our invoice ",
|
"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.",
|
"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()
|
dunning_type.save()
|
||||||
|
return dunning_type
|
||||||
|
|||||||
Reference in New Issue
Block a user