mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-08 15:42:52 +00:00
fix: Fix raw matterial selection based on finished item qty
This commit is contained in:
@@ -711,13 +711,29 @@ def get_work_order_operation_data(work_order, operation, workstation):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def create_pick_list(source_name, target_doc=None):
|
def create_pick_list(source_name, target_doc=None):
|
||||||
|
pick_list = json.loads(target_doc)
|
||||||
|
max_finished_goods_qty = frappe.db.get_value('Work Order', source_name, 'qty')
|
||||||
def update_item_quantity(source, target, source_parent):
|
def update_item_quantity(source, target, source_parent):
|
||||||
qty = source.required_qty - source.transferred_qty
|
# qty = source.required_qty - source.transferred_qty
|
||||||
|
# target.qty = qty
|
||||||
|
|
||||||
|
pending_to_issue = flt(source.required_qty) - flt(source.transferred_qty)
|
||||||
|
desire_to_transfer = flt(source.required_qty) / max_finished_goods_qty * flt(pick_list.get('for_qty'))
|
||||||
|
|
||||||
|
qty = 0
|
||||||
|
if desire_to_transfer <= pending_to_issue:
|
||||||
|
qty = desire_to_transfer
|
||||||
|
elif pending_to_issue > 0:
|
||||||
|
qty = pending_to_issue
|
||||||
|
|
||||||
|
if qty:
|
||||||
target.qty = qty
|
target.qty = qty
|
||||||
target.stock_qty = qty
|
target.stock_qty = qty
|
||||||
target.uom = frappe.get_value('Item', source.item_code, 'stock_uom')
|
target.uom = frappe.get_value('Item', source.item_code, 'stock_uom')
|
||||||
target.stock_uom = target.uom
|
target.stock_uom = target.uom
|
||||||
target.conversion_factor = 1
|
target.conversion_factor = 1
|
||||||
|
else:
|
||||||
|
target.delete()
|
||||||
|
|
||||||
doc = get_mapped_doc("Work Order", source_name, {
|
doc = get_mapped_doc("Work Order", source_name, {
|
||||||
"Work Order": {
|
"Work Order": {
|
||||||
@@ -733,4 +749,17 @@ def create_pick_list(source_name, target_doc=None):
|
|||||||
},
|
},
|
||||||
}, target_doc)
|
}, target_doc)
|
||||||
|
|
||||||
|
# # aggregate qty for same item
|
||||||
|
# item_map = frappe._dict()
|
||||||
|
# for item in doc.items:
|
||||||
|
# item.idx = None
|
||||||
|
# if not item_map.get(item.item_code):
|
||||||
|
# item_map[item.item_code] = item
|
||||||
|
# else:
|
||||||
|
# item_map[item.item_code].qty += item.qty
|
||||||
|
# item_map[item.item_code].stock_qty += item.stock_qty
|
||||||
|
|
||||||
|
# doc.delete_key('items')
|
||||||
|
# doc.set('items', item_map.values())
|
||||||
|
|
||||||
return doc
|
return doc
|
||||||
@@ -28,32 +28,35 @@ frappe.ui.form.on('Pick List', {
|
|||||||
frm.call('set_item_locations');
|
frm.call('set_item_locations');
|
||||||
}).addClass('btn-primary');
|
}).addClass('btn-primary');
|
||||||
}
|
}
|
||||||
|
if (frm.doc.docstatus == 1) {
|
||||||
if (frm.doc.items_based_on === 'Sales Order') {
|
if (frm.doc.items_based_on === 'Sales Order') {
|
||||||
frm.add_custom_button(__('Delivery Note'), () => frm.trigger('create_delivery_note'), __('Create'));
|
frm.add_custom_button(__('Delivery Note'), () => frm.trigger('create_delivery_note'), __('Create'));
|
||||||
} else {
|
} else {
|
||||||
frm.add_custom_button(__('Stock Entry'), () => frm.trigger('create_stock_entry'), __('Create'));
|
frm.add_custom_button(__('Stock Entry'), () => frm.trigger('create_stock_entry'), __('Create'));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
work_order: (frm) => {
|
work_order: (frm) => {
|
||||||
frm.clear_table('items');
|
|
||||||
frappe.db.get_value('Work Order',
|
frappe.db.get_value('Work Order',
|
||||||
frm.doc.work_order,
|
frm.doc.work_order,
|
||||||
['qty', 'produced_qty']
|
['qty', 'material_transferred_for_manufacturing']
|
||||||
).then(data => {
|
).then(data => {
|
||||||
let qty_data = data.message;
|
let qty_data = data.message;
|
||||||
let max = qty_data.qty - qty_data.produced_qty;
|
let max = qty_data.qty - qty_data.material_transferred_for_manufacturing;
|
||||||
frappe.prompt({
|
frappe.prompt({
|
||||||
fieldtype: 'Float',
|
fieldtype: 'Float',
|
||||||
label: __('Qty'),
|
label: __('Qty of Finished Goods Item'),
|
||||||
fieldname: 'qty',
|
fieldname: 'qty',
|
||||||
description: __('Max: {0}', [max]),
|
description: __('Max: {0}', [max]),
|
||||||
default: max
|
default: max
|
||||||
}, (data) => {
|
}, (data) => {
|
||||||
frm.set_value('qty', data.qty);
|
frm.set_value('for_qty', data.qty);
|
||||||
if (data.qty > max) {
|
if (data.qty > max) {
|
||||||
frappe.msgprint(__('Quantity must not be more than {0}', [max]));
|
frappe.msgprint(__('Quantity must not be more than {0}', [max]));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
frm.clear_table('items');
|
||||||
|
frm.clear_table('locations');
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: 'erpnext.manufacturing.doctype.work_order.work_order.create_pick_list',
|
method: 'erpnext.manufacturing.doctype.work_order.work_order.create_pick_list',
|
||||||
target: frm,
|
target: frm,
|
||||||
@@ -63,6 +66,8 @@ frappe.ui.form.on('Pick List', {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
items_based_on: (frm) => {
|
items_based_on: (frm) => {
|
||||||
|
frm.clear_table('items');
|
||||||
|
frm.clear_table('locations');
|
||||||
frm.trigger('add_get_items_button');
|
frm.trigger('add_get_items_button');
|
||||||
},
|
},
|
||||||
create_delivery_note(frm) {
|
create_delivery_note(frm) {
|
||||||
@@ -107,3 +112,13 @@ frappe.ui.form.on('Pick List', {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// frappe.ui.form.on('Pick List Reference Item', {
|
||||||
|
// item_code: (frm, cdt, cdn) => {
|
||||||
|
// let row = locals[cdt][cdn];
|
||||||
|
// if (row.item_code) {
|
||||||
|
// frappe.xcall('');
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// });
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
"items_based_on",
|
"items_based_on",
|
||||||
"customer",
|
"customer",
|
||||||
"work_order",
|
"work_order",
|
||||||
"qty",
|
"for_qty",
|
||||||
"column_break_4",
|
"column_break_4",
|
||||||
"parent_warehouse",
|
"parent_warehouse",
|
||||||
"company",
|
"company",
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
{
|
{
|
||||||
"depends_on": "work_order",
|
"depends_on": "work_order",
|
||||||
"description": "Qty of raw materials will be decided based on the qty of the Finished Goods Item",
|
"description": "Qty of raw materials will be decided based on the qty of the Finished Goods Item",
|
||||||
"fieldname": "qty",
|
"fieldname": "for_qty",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"label": "Qty of Finished Goods Item"
|
"label": "Qty of Finished Goods Item"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ def get_items_with_warehouse_and_quantity(item_doc, from_warehouses, item_locati
|
|||||||
if uom_must_be_whole_number:
|
if uom_must_be_whole_number:
|
||||||
qty = floor(qty)
|
qty = floor(qty)
|
||||||
stock_qty = qty * item_doc.conversion_factor
|
stock_qty = qty * item_doc.conversion_factor
|
||||||
|
if not stock_qty: break
|
||||||
|
|
||||||
locations.append({
|
locations.append({
|
||||||
'qty': qty,
|
'qty': qty,
|
||||||
@@ -243,7 +244,7 @@ def create_stock_entry(pick_list):
|
|||||||
stock_entry.from_bom = 1
|
stock_entry.from_bom = 1
|
||||||
stock_entry.bom_no = work_order.bom_no
|
stock_entry.bom_no = work_order.bom_no
|
||||||
stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
|
stock_entry.use_multi_level_bom = work_order.use_multi_level_bom
|
||||||
stock_entry.fg_completed_qty = pick_list.qty
|
stock_entry.fg_completed_qty = pick_list.for_qty
|
||||||
if work_order.bom_no:
|
if work_order.bom_no:
|
||||||
stock_entry.inspection_required = frappe.db.get_value('BOM',
|
stock_entry.inspection_required = frappe.db.get_value('BOM',
|
||||||
work_order.bom_no, 'inspection_required')
|
work_order.bom_no, 'inspection_required')
|
||||||
|
|||||||
Reference in New Issue
Block a user