mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-15 09:53:09 +00:00
Merge pull request #57650 from aerele/fix/material-transfer-qty-precision
fix: respect quantity precision in material transfer validation
This commit is contained in:
@@ -226,9 +226,11 @@ class MaterialTransferForManufactureStockEntry(BaseMaterialTransferStockEntry):
|
|||||||
first_row_by_item.setdefault(key, item)
|
first_row_by_item.setdefault(key, item)
|
||||||
|
|
||||||
for key, transfer_qty in transfer_by_item.items():
|
for key, transfer_qty in transfer_by_item.items():
|
||||||
pending_qty = pending_by_item[key]
|
item = first_row_by_item[key]
|
||||||
|
precision = item.precision("qty")
|
||||||
|
transfer_qty = flt(transfer_qty, precision)
|
||||||
|
pending_qty = flt(pending_by_item[key], precision)
|
||||||
if transfer_qty > pending_qty:
|
if transfer_qty > pending_qty:
|
||||||
item = first_row_by_item[key]
|
|
||||||
frappe.throw(
|
frappe.throw(
|
||||||
_(
|
_(
|
||||||
"Row #{0}: Cannot transfer {1} {2} of Item {3}. "
|
"Row #{0}: Cannot transfer {1} {2} of Item {3}. "
|
||||||
|
|||||||
@@ -906,6 +906,43 @@ class TestStockEntry(ERPNextTestSuite):
|
|||||||
fg_cost = next(filter(lambda x: x.item_code == "_Test FG Item 2", stock_entry.get("items"))).amount
|
fg_cost = next(filter(lambda x: x.item_code == "_Test FG Item 2", stock_entry.get("items"))).amount
|
||||||
self.assertEqual(fg_cost, flt(rm_cost + bom_operation_cost + work_order.additional_operating_cost, 2))
|
self.assertEqual(fg_cost, flt(rm_cost + bom_operation_cost + work_order.additional_operating_cost, 2))
|
||||||
|
|
||||||
|
@ERPNextTestSuite.change_settings("System Settings", {"float_precision": 3})
|
||||||
|
@ERPNextTestSuite.change_settings("Manufacturing Settings", {"backflush_raw_materials_based_on": "BOM"})
|
||||||
|
def test_material_transfer_for_manufacture_qty_precision(self):
|
||||||
|
from erpnext.stock.doctype.stock_entry.services.material_transfer import (
|
||||||
|
MaterialTransferForManufactureStockEntry,
|
||||||
|
)
|
||||||
|
|
||||||
|
work_order = frappe.new_doc("Work Order")
|
||||||
|
work_order.append(
|
||||||
|
"required_items",
|
||||||
|
{
|
||||||
|
"item_code": "_Test Item",
|
||||||
|
"required_qty": 33.876,
|
||||||
|
"transferred_qty": 33.875,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
stock_entry = frappe.new_doc("Stock Entry")
|
||||||
|
stock_entry.work_order = "Test Work Order"
|
||||||
|
stock_entry.append(
|
||||||
|
"items",
|
||||||
|
{
|
||||||
|
"item_code": "_Test Item",
|
||||||
|
"s_warehouse": "_Test Warehouse - _TC",
|
||||||
|
"qty": 0.001,
|
||||||
|
"uom": "Nos",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
service = MaterialTransferForManufactureStockEntry(stock_entry)
|
||||||
|
service._wo_doc = work_order
|
||||||
|
service._validate_no_excess_transfer()
|
||||||
|
|
||||||
|
stock_entry.items[0].qty = 0.002
|
||||||
|
with self.assertRaises(frappe.ValidationError):
|
||||||
|
service._validate_no_excess_transfer()
|
||||||
|
|
||||||
@ERPNextTestSuite.change_settings("Manufacturing Settings", {"material_consumption": 1})
|
@ERPNextTestSuite.change_settings("Manufacturing Settings", {"material_consumption": 1})
|
||||||
def test_work_order_manufacture_with_material_consumption(self):
|
def test_work_order_manufacture_with_material_consumption(self):
|
||||||
from erpnext.manufacturing.doctype.work_order.mapper import (
|
from erpnext.manufacturing.doctype.work_order.mapper import (
|
||||||
|
|||||||
Reference in New Issue
Block a user