From d98b2690333c22911b93da98ec3d37ff332658d4 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 23 Jun 2026 11:08:40 +0530 Subject: [PATCH] test: cover all projected-qty components in Stock Projected Qty report Add a test exercising the full projected_qty formula - actual + ordered + requested + planned minus reserved, reserved-for-production, reserved-for- subcontract and reserved-for-production-plan - and asserting each component is surfaced as its own column. --- .../test_stock_projected_qty.py | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/erpnext/stock/report/stock_projected_qty/test_stock_projected_qty.py b/erpnext/stock/report/stock_projected_qty/test_stock_projected_qty.py index bd2486845f2..1b292b473fa 100644 --- a/erpnext/stock/report/stock_projected_qty/test_stock_projected_qty.py +++ b/erpnext/stock/report/stock_projected_qty/test_stock_projected_qty.py @@ -31,6 +31,43 @@ class TestStockProjectedQty(ERPNextTestSuite): self.assertEqual(row["ordered_qty"], 5) self.assertEqual(row["projected_qty"], 15) + def test_projected_qty_includes_all_quantity_components(self): + """projected_qty = actual + ordered + requested + planned + - reserved - reserved_for_production - reserved_for_subcontract - reserved_for_production_plan + and every component is surfaced as its own column.""" + item = make_item().name + make_stock_entry(item_code=item, qty=100, to_warehouse=WAREHOUSE, basic_rate=100) + + bin_doc = frappe.get_doc("Bin", {"item_code": item, "warehouse": WAREHOUSE}) + bin_doc.update( + { + "actual_qty": 100, + "ordered_qty": 50, + "indented_qty": 30, # requested + "planned_qty": 20, + "reserved_qty": 10, + "reserved_qty_for_production": 8, + "reserved_qty_for_sub_contract": 6, + "reserved_qty_for_production_plan": 4, + } + ) + bin_doc.set_projected_qty() + bin_doc.db_update() + + # 100 + 50 + 30 + 20 - 10 - 8 - 6 - 4 + self.assertEqual(bin_doc.projected_qty, 172) + + row = self.run_report(item)[0] + self.assertEqual(row["actual_qty"], 100) + self.assertEqual(row["ordered_qty"], 50) + self.assertEqual(row["indented_qty"], 30) + self.assertEqual(row["planned_qty"], 20) + self.assertEqual(row["reserved_qty"], 10) + self.assertEqual(row["reserved_qty_for_production"], 8) + self.assertEqual(row["reserved_qty_for_sub_contract"], 6) + self.assertEqual(row["reserved_qty_for_production_plan"], 4) + self.assertEqual(row["projected_qty"], 172) + def test_shortage_qty_from_reorder_level(self): item = make_item().name doc = frappe.get_doc("Item", item)