fix: Fix raw matterial selection based on finished item qty

This commit is contained in:
Suraj Shetty
2019-08-22 16:37:44 +05:30
parent c1f25ff9e3
commit 8d55f81baa
4 changed files with 64 additions and 19 deletions

View File

@@ -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

View File

@@ -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('');
// }
// }
// });

View File

@@ -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"
} }

View File

@@ -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')