mirror of
https://github.com/frappe/erpnext.git
synced 2026-10-31 23:07:51 +00:00
fix: count un-ordered alternative sets when computing quotation status
This commit is contained in:
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user