fix: round production plan mr_items quantity to field precision

The stock-UOM qty is rounded in _accumulate_so_items, but the purchase
UOM conversion divided it by the conversion factor without re-rounding,
storing values like 5738748.300863984 in mr_items.quantity. The raw
value flowed into Material Request qty and the raw materials CSV, and
make_material_request compares quantity to requested_qty with exact
float equality, so any rounding downstream left dust quantities.

(cherry picked from commit ffc515f046)
This commit is contained in:
Mihir Kandoi
2026-08-06 20:48:42 +05:30
committed by Mergify
parent e1c1c5ed7e
commit 2d056aee3d

View File

@@ -559,10 +559,11 @@ def _material_request_item_row(
or row.get("default_warehouse") or row.get("default_warehouse")
or item_group_defaults.get("default_warehouse") or item_group_defaults.get("default_warehouse")
) )
precision = frappe.get_precision("Material Request Plan Item", "quantity")
return { return {
"item_code": row.item_code, "item_code": row.item_code,
"item_name": row.item_name, "item_name": row.item_name,
"quantity": required_qty / conversion_factor, "quantity": flt(required_qty / conversion_factor, precision),
"conversion_factor": conversion_factor, "conversion_factor": conversion_factor,
"required_bom_qty": row.get("qty"), "required_bom_qty": row.get("qty"),
"stock_uom": row.get("stock_uom"), "stock_uom": row.get("stock_uom"),
@@ -639,7 +640,7 @@ def _add_remaining_purchase_request(item, new_mr_items, required_qty, consider_m
if frappe.db.get_value("UOM", purchase_uom, "must_be_whole_number"): if frappe.db.get_value("UOM", purchase_uom, "must_be_whole_number"):
required_qty = ceil(required_qty) required_qty = ceil(required_qty)
item["quantity"] = required_qty / item.get("conversion_factor") item["quantity"] = flt(required_qty / item.get("conversion_factor"), precision)
new_mr_items.append(item) new_mr_items.append(item)