test(selling): cover invoicing after returns and re-deliveries

This commit is contained in:
Mihir Kandoi
2026-08-11 13:26:00 +05:30
parent 47c6274b13
commit 220b25db09

View File

@@ -226,6 +226,95 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase):
si1 = make_sales_invoice(so.name)
self.assertEqual(len(si1.get("items")), 0)
def test_make_sales_invoice_after_return_and_redelivery(self):
from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_return
so = make_sales_order(qty=10, rate=100)
dn = create_dn_against_so(so.name, 10)
dn_return = frappe.get_doc(make_sales_return(dn.name).as_dict())
dn_return.insert()
dn_return.submit()
self.assertEqual(len(make_sales_invoice(so.name).get("items")), 0)
create_dn_against_so(so.name, 10)
so.load_from_db()
item = so.get("items")[0]
self.assertEqual(item.delivered_qty, 10)
self.assertEqual(item.returned_qty, 10)
si = make_sales_invoice(so.name)
self.assertEqual(si.get("items")[0].qty, 10)
def test_make_sales_invoice_bills_ordered_qty_for_partial_delivery(self):
so = make_sales_order(qty=10, rate=100)
create_dn_against_so(so.name, 4)
si = make_sales_invoice(so.name)
self.assertEqual(si.get("items")[0].qty, 10)
def test_make_sales_invoice_after_partial_billing_return_and_redelivery(self):
from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_return
so = make_sales_order(qty=10, rate=100)
dn = create_dn_against_so(so.name, 10)
si = make_sales_invoice(so.name)
si.get("items")[0].qty = 4
si.insert()
si.submit()
dn_return = frappe.get_doc(make_sales_return(dn.name).as_dict())
dn_return.insert()
dn_return.submit()
create_dn_against_so(so.name, 5)
so.load_from_db()
item = so.get("items")[0]
self.assertEqual(item.delivered_qty, 5)
self.assertEqual(item.returned_qty, 10)
self.assertEqual(item.billed_amt, 400)
pending_invoice = make_sales_invoice(so.name)
self.assertEqual(pending_invoice.get("items")[0].qty, 1)
pending_invoice.insert()
pending_invoice.submit()
so.load_from_db()
self.assertEqual(so.get("items")[0].billed_amt, 500)
def test_make_sales_invoice_after_partial_billing_multiple_items(self):
so = make_sales_order(
item_list=[
{
"item_code": "_Test Item",
"warehouse": "_Test Warehouse - _TC",
"qty": 10,
"rate": 100,
},
{
"item_code": "_Test FG Item",
"warehouse": "_Test Warehouse - _TC",
"qty": 10,
"rate": 100,
},
]
)
si = make_sales_invoice(so.name)
si.get("items")[0].qty = 4
si.get("items")[1].qty = 6
si.insert()
si.submit()
pending_invoice = make_sales_invoice(so.name)
self.assertEqual(
{item.so_detail: item.qty for item in pending_invoice.get("items")},
{so.get("items")[0].name: 6, so.get("items")[1].name: 4},
)
def test_so_billed_amount_against_return_entry(self):
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_sales_return