fix: incorrect stock quantity if 'Allow Multiple Material Consumption' has enabled
This commit is contained in:
parent
f8d6726990
commit
edb99d4e53
@ -491,6 +491,39 @@ class TestWorkOrder(unittest.TestCase):
|
|||||||
work_order1.save()
|
work_order1.save()
|
||||||
self.assertEqual(work_order1.operations[0].time_in_mins, 40.0)
|
self.assertEqual(work_order1.operations[0].time_in_mins, 40.0)
|
||||||
|
|
||||||
|
def test_partial_material_consumption(self):
|
||||||
|
frappe.db.set_value("Manufacturing Settings", None, "material_consumption", 1)
|
||||||
|
wo_order = make_wo_order_test_record(planned_start_date=now(), qty=4)
|
||||||
|
|
||||||
|
ste_cancel_list = []
|
||||||
|
ste1 = test_stock_entry.make_stock_entry(item_code="_Test Item",
|
||||||
|
target="_Test Warehouse - _TC", qty=20, basic_rate=5000.0)
|
||||||
|
ste2 = test_stock_entry.make_stock_entry(item_code="_Test Item Home Desktop 100",
|
||||||
|
target="_Test Warehouse - _TC", qty=20, basic_rate=1000.0)
|
||||||
|
|
||||||
|
ste_cancel_list.extend([ste1, ste2])
|
||||||
|
|
||||||
|
s = frappe.get_doc(make_stock_entry(wo_order.name, "Material Transfer for Manufacture", 4))
|
||||||
|
s.submit()
|
||||||
|
ste_cancel_list.append(s)
|
||||||
|
|
||||||
|
ste1 = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 2))
|
||||||
|
ste1.submit()
|
||||||
|
ste_cancel_list.append(ste1)
|
||||||
|
|
||||||
|
print(wo_order.name)
|
||||||
|
ste3 = frappe.get_doc(make_stock_entry(wo_order.name, "Material Consumption for Manufacture", 2))
|
||||||
|
self.assertEquals(ste3.fg_completed_qty, 2)
|
||||||
|
|
||||||
|
expected_qty = {"_Test Item": 2, "_Test Item Home Desktop 100": 4}
|
||||||
|
for row in ste3.items:
|
||||||
|
self.assertEquals(row.qty, expected_qty.get(row.item_code))
|
||||||
|
|
||||||
|
for ste_doc in ste_cancel_list:
|
||||||
|
ste_doc.cancel()
|
||||||
|
|
||||||
|
frappe.db.set_value("Manufacturing Settings", None, "material_consumption", 0)
|
||||||
|
|
||||||
def get_scrap_item_details(bom_no):
|
def get_scrap_item_details(bom_no):
|
||||||
scrap_items = {}
|
scrap_items = {}
|
||||||
for item in frappe.db.sql("""select item_code, stock_qty from `tabBOM Scrap Item`
|
for item in frappe.db.sql("""select item_code, stock_qty from `tabBOM Scrap Item`
|
||||||
|
|||||||
@ -545,7 +545,8 @@ erpnext.work_order = {
|
|||||||
var tbl = frm.doc.required_items || [];
|
var tbl = frm.doc.required_items || [];
|
||||||
var tbl_lenght = tbl.length;
|
var tbl_lenght = tbl.length;
|
||||||
for (var i = 0, len = tbl_lenght; i < len; i++) {
|
for (var i = 0, len = tbl_lenght; i < len; i++) {
|
||||||
if (flt(frm.doc.required_items[i].required_qty) > flt(frm.doc.required_items[i].consumed_qty)) {
|
let wo_item_qty = frm.doc.required_items[i].transferred_qty || frm.doc.required_items[i].required_qty;
|
||||||
|
if (flt(wo_item_qty) > flt(frm.doc.required_items[i].consumed_qty)) {
|
||||||
counter += 1;
|
counter += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -841,6 +841,10 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
fg_completed_qty: function() {
|
||||||
|
this.get_items();
|
||||||
|
},
|
||||||
|
|
||||||
get_items: function() {
|
get_items: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
if(!this.frm.doc.fg_completed_qty || !this.frm.doc.bom_no)
|
if(!this.frm.doc.fg_completed_qty || !this.frm.doc.bom_no)
|
||||||
@ -850,6 +854,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
|
|||||||
// if work order / bom is mentioned, get items
|
// if work order / bom is mentioned, get items
|
||||||
return this.frm.call({
|
return this.frm.call({
|
||||||
doc: me.frm.doc,
|
doc: me.frm.doc,
|
||||||
|
freeze: true,
|
||||||
method: "get_items",
|
method: "get_items",
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(!r.exc) refresh_field("items");
|
if(!r.exc) refresh_field("items");
|
||||||
|
|||||||
@ -1033,25 +1033,21 @@ class StockEntry(StockController):
|
|||||||
wo = frappe.get_doc("Work Order", self.work_order)
|
wo = frappe.get_doc("Work Order", self.work_order)
|
||||||
wo_items = frappe.get_all('Work Order Item',
|
wo_items = frappe.get_all('Work Order Item',
|
||||||
filters={'parent': self.work_order},
|
filters={'parent': self.work_order},
|
||||||
fields=["item_code", "required_qty", "consumed_qty"]
|
fields=["item_code", "required_qty", "consumed_qty", "transferred_qty"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
work_order_qty = wo.material_transferred_for_manufacturing or wo.qty
|
||||||
for item in wo_items:
|
for item in wo_items:
|
||||||
qty = item.required_qty
|
|
||||||
|
|
||||||
item_account_details = get_item_defaults(item.item_code, self.company)
|
item_account_details = get_item_defaults(item.item_code, self.company)
|
||||||
# Take into account consumption if there are any.
|
# Take into account consumption if there are any.
|
||||||
if self.purpose == 'Manufacture':
|
|
||||||
req_qty_each = flt(item.required_qty / wo.qty)
|
wo_item_qty = item.transferred_qty or item.required_qty
|
||||||
if (flt(item.consumed_qty) != 0):
|
|
||||||
remaining_qty = flt(item.consumed_qty) - (flt(wo.produced_qty) * req_qty_each)
|
req_qty_each = (
|
||||||
exhaust_qty = req_qty_each * wo.produced_qty
|
(flt(wo_item_qty) - flt(item.consumed_qty)) /
|
||||||
if remaining_qty > exhaust_qty :
|
(flt(work_order_qty) - flt(wo.produced_qty))
|
||||||
if (remaining_qty/(req_qty_each * flt(self.fg_completed_qty))) >= 1:
|
)
|
||||||
qty =0
|
|
||||||
else:
|
|
||||||
qty = (req_qty_each * flt(self.fg_completed_qty)) - remaining_qty
|
|
||||||
else:
|
|
||||||
qty = req_qty_each * flt(self.fg_completed_qty)
|
qty = req_qty_each * flt(self.fg_completed_qty)
|
||||||
|
|
||||||
if qty > 0:
|
if qty > 0:
|
||||||
@ -1134,13 +1130,15 @@ class StockEntry(StockController):
|
|||||||
else:
|
else:
|
||||||
qty = req_qty_each * flt(self.fg_completed_qty)
|
qty = req_qty_each * flt(self.fg_completed_qty)
|
||||||
|
|
||||||
|
|
||||||
elif backflushed_materials.get(item.item_code):
|
elif backflushed_materials.get(item.item_code):
|
||||||
for d in backflushed_materials.get(item.item_code):
|
for d in backflushed_materials.get(item.item_code):
|
||||||
if d.get(item.warehouse):
|
if d.get(item.warehouse):
|
||||||
if (qty > req_qty):
|
if (qty > req_qty):
|
||||||
qty = (qty/trans_qty) * flt(self.fg_completed_qty)
|
qty = (qty/trans_qty) * flt(self.fg_completed_qty)
|
||||||
|
|
||||||
|
if consumed_qty:
|
||||||
|
qty -= consumed_qty
|
||||||
|
|
||||||
if cint(frappe.get_cached_value('UOM', item.stock_uom, 'must_be_whole_number')):
|
if cint(frappe.get_cached_value('UOM', item.stock_uom, 'must_be_whole_number')):
|
||||||
qty = frappe.utils.ceil(qty)
|
qty = frappe.utils.ceil(qty)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user