mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-25 13:03:02 +00:00
* fix(manufacturing): stop BOM Stock Analysis inflating both its sums get_bom_data left-joined Bin on item_code alone and then summed over the result. Bin holds one row per warehouse and BOM Item one row per line, so the join is a cross product and each SUM counts the other side's rows: Sum(qty_consumed_per_unit) x (number of warehouses holding the item) Sum(bin.actual_qty) x (number of BOM lines carrying the item) A component on two BOM lines, stocked in two warehouses, reported a per-unit requirement of 10 instead of 5 and available stock of 20 instead of 10 -- wrong on both engines, and wrong in the single-line case too as soon as the item sits in more than one warehouse. Aggregate Bin to one row per item_code before joining, so neither sum can see the other's duplicates. The warehouse filter moves into that subquery; it previously sat in the outer WHERE against a left-joined column, which silently made the join inner, so the join is now made inner explicitly when a warehouse is given to keep items with no bin there excluded as before. * test(manufacturing): cover the BOM Stock Analysis bin-join cross product Component on two BOM lines, stocked in two warehouses: the join yields four rows, so both sums are doubled. Asserts qty_per_unit is the sum of the lines' own per-unit quantities and actual_qty the real total across warehouses. Fails on the previous single-query form with 10.0 != 5.0.