fix: count un-ordered alternative sets when computing quotation status

This commit is contained in:
Shllokkk
2026-10-29 00:12:24 +05:30
parent ebd35584b2
commit 85739b57e2
2 changed files with 49 additions and 10 deletions
+22 -10
View File
@@ -198,26 +198,38 @@ class Quotation(SellingController):
return "Ordered"
def get_valid_items(self):
"""
Filters out items in an alternatives set that were not ordered.
"""
"""Collapse each alternatives set to its ordered row, or keep the main row if none was ordered."""
def is_in_sales_order(row):
in_sales_order = bool(
return bool(
frappe.db.exists(
"Sales Order Item",
{"quotation_item": row.name, "item_code": row.item_code, "docstatus": 1},
)
)
return in_sales_order
def can_map(row) -> bool:
if row.is_alternative or row.has_alternative_item:
return is_in_sales_order(row)
valid_items = []
alternatives_set = []
return True
def collapse_set():
if not alternatives_set:
return
ordered_rows = [row for row in alternatives_set if is_in_sales_order(row)]
valid_items.extend(ordered_rows or alternatives_set[:1])
return list(filter(can_map, self.get("items")))
for row in self.get("items"):
if row.has_alternative_item:
collapse_set()
alternatives_set = [row]
elif row.is_alternative:
alternatives_set.append(row)
else:
collapse_set()
alternatives_set = []
valid_items.append(row)
collapse_set()
return valid_items
def is_fully_ordered(self):
return self.get_ordered_status() == "Ordered"
@@ -1174,6 +1174,33 @@ class TestQuotation(FrappeTestCase):
self.assertEqual(sales_order.payment_schedule[0].payment_amount, 5000)
self.assertEqual(sales_order.payment_schedule[1].payment_amount, 5000)
def test_unordered_alternative_set_keeps_quotation_partially_ordered(self):
from erpnext.stock.doctype.item.test_item import make_item
warehouse = "_Test Warehouse - _TC"
simple = make_item(properties={"is_stock_item": 1}).item_code
main = make_item(properties={"is_stock_item": 1}).item_code
alt = make_item(properties={"is_stock_item": 1}).item_code
quotation = make_quotation(
item_list=[
{"item_code": simple, "qty": 1, "rate": 100, "warehouse": warehouse},
{"item_code": main, "qty": 1, "rate": 100, "warehouse": warehouse},
{"item_code": alt, "qty": 1, "rate": 100, "is_alternative": True, "warehouse": warehouse},
]
)
frappe.flags.args = frappe._dict(selected_items=[quotation.items[0]])
so = make_sales_order(quotation.name)
frappe.flags.args = frappe._dict()
so.delivery_date = add_days(so.transaction_date, 10)
so.insert()
so.submit()
self.assertEqual(len(so.items), 1)
self.assertEqual(so.items[0].item_code, simple)
quotation.reload()
self.assertEqual(quotation.status, "Partially Ordered")
test_records = frappe.get_test_records("Quotation")