fix: rounding issue of required qty in subcontracting order (#43908)

* fix: rounding issue of required qty in subcontracting order

* fix: uom issue in test case

* fix: test case

* fix: restored report tests for manufacturing
This commit is contained in:
Nabin Hait
2024-10-30 11:25:08 +05:30
committed by GitHub
parent 0171af4604
commit 9ac87bd3b1
3 changed files with 32 additions and 6 deletions

View File

@@ -561,11 +561,11 @@ class SubcontractingController(StockController):
use_serial_batch_fields = frappe.db.get_single_value("Stock Settings", "use_serial_batch_fields")
if self.doctype == self.subcontract_data.order_doctype:
rm_obj.required_qty = qty
rm_obj.amount = rm_obj.required_qty * rm_obj.rate
rm_obj.required_qty = flt(qty, rm_obj.precision("required_qty"))
rm_obj.amount = flt(rm_obj.required_qty * rm_obj.rate, rm_obj.precision("amount"))
else:
rm_obj.consumed_qty = qty
rm_obj.required_qty = bom_item.required_qty or qty
rm_obj.consumed_qty = flt(qty, rm_obj.precision("consumed_qty"))
rm_obj.required_qty = flt(bom_item.required_qty or qty, rm_obj.precision("required_qty"))
rm_obj.serial_and_batch_bundle = None
setattr(
rm_obj, self.subcontract_data.order_field, item_row.get(self.subcontract_data.order_field)
@@ -664,8 +664,8 @@ class SubcontractingController(StockController):
self.__set_serial_nos(item_row, rm_obj)
def __set_consumed_qty(self, rm_obj, consumed_qty, required_qty=0):
rm_obj.required_qty = required_qty
rm_obj.consumed_qty = consumed_qty
rm_obj.required_qty = flt(required_qty, rm_obj.precision("required_qty"))
rm_obj.consumed_qty = flt(consumed_qty, rm_obj.precision("consumed_qty"))
def __set_serial_nos(self, item_row, rm_obj):
key = (rm_obj.rm_item_code, item_row.item_code, item_row.get(self.subcontract_data.order_field))

View File

@@ -1234,6 +1234,7 @@ def make_subcontracted_items():
"Subcontracted Item SA6": {},
"Subcontracted Item SA7": {},
"Subcontracted Item SA8": {},
"Subcontracted Item SA9": {"stock_uom": "Litre"},
}
for item, properties in sub_contracted_items.items():
@@ -1254,6 +1255,7 @@ def make_raw_materials():
"Subcontracted SRM Item 4": {"has_serial_no": 1, "serial_no_series": "SRII.####"},
"Subcontracted SRM Item 5": {"has_serial_no": 1, "serial_no_series": "SRIID.####"},
"Subcontracted SRM Item 8": {},
"Subcontracted SRM Item 9": {"stock_uom": "Litre"},
}
for item, properties in raw_materials.items():
@@ -1280,6 +1282,7 @@ def make_service_items():
"Subcontracted Service Item 6": {},
"Subcontracted Service Item 7": {},
"Subcontracted Service Item 8": {},
"Subcontracted Service Item 9": {},
}
for item, properties in service_items.items():

View File

@@ -25,6 +25,7 @@ from erpnext.controllers.tests.test_subcontracting_controller import (
make_subcontracted_items,
set_backflush_based_on,
)
from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
from erpnext.stock.doctype.item.test_item import make_item
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
from erpnext.subcontracting.doctype.subcontracting_order.subcontracting_order import (
@@ -683,6 +684,28 @@ class TestSubcontractingOrder(FrappeTestCase):
self.assertEqual(requested_qty, new_requested_qty)
def test_subcontracting_order_rm_required_items_for_precision(self):
item_code = "Subcontracted Item SA9"
raw_materials = ["Subcontracted SRM Item 9"]
if not frappe.db.exists("BOM", {"item": item_code}):
make_bom(item=item_code, raw_materials=raw_materials, rate=100, rm_qty=1.04)
service_items = [
{
"warehouse": "_Test Warehouse - _TC",
"item_code": "Subcontracted Service Item 9",
"qty": 1, # 202.0656,
"rate": 100,
"fg_item": "Subcontracted Item SA9",
"fg_item_qty": 202.0656,
},
]
sco = get_subcontracting_order(service_items=service_items)
sco.reload()
self.assertEqual(sco.supplied_items[0].required_qty, 210.149)
def create_subcontracting_order(**args):
args = frappe._dict(args)