diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index c489fbcd55..c653deece3 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -711,6 +711,14 @@ def get_work_order_operation_data(work_order, operation, workstation): @frappe.whitelist() def make_pick_list(source_name, target_doc=None): + def update_item_quantity(source, target, source_parent): + qty = source.required_qty - source.transferred_qty + target.qty = qty + target.stock_qty = qty + target.uom = frappe.get_value('Item', source.item_code, 'stock_uom') + target.stock_uom = target.uom + target.conversion_factor = 1 + doc = get_mapped_doc("Work Order", source_name, { "Work Order": { "doctype": "Pick List", @@ -720,13 +728,8 @@ def make_pick_list(source_name, target_doc=None): }, "Work Order Item": { "doctype": "Pick List Reference Item", - "field_map": { - "item_code": "item", - "required_qty": "qty", - "parenttype": "reference_doctype", - "parent": "reference_name", - "name": "reference_document_item" - }, + "postprocess": update_item_quantity, + "condition": lambda doc: abs(doc.transferred_qty) < abs(doc.required_qty) }, }, target_doc) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 2dc3788568..dd156d0473 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -1024,7 +1024,7 @@ def make_pick_list(source_name, target_doc=None): "name": "sales_order_item" }, "postprocess": update_item_quantity, - "conditions": lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1 + "condition": lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1 }, }, target_doc) diff --git a/erpnext/stock/doctype/pick_list/pick_list.js b/erpnext/stock/doctype/pick_list/pick_list.js index 2e72d98d3f..b9b317b732 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.js +++ b/erpnext/stock/doctype/pick_list/pick_list.js @@ -28,17 +28,35 @@ frappe.ui.form.on('Pick List', { }, make_delivery_note(frm) { frappe.model.open_mapped_doc({ - method: "erpnext.stock.doctype.pick_list.pick_list.make_delivery_note", + method: 'erpnext.stock.doctype.pick_list.pick_list.make_delivery_note', frm: frm }); }, add_get_items_button(frm) { frm.remove_custom_button(__("Get items")); let source_doctype = frm.doc.items_based_on; + let date_field = 'transaction_date'; + let get_query_method = null; + let get_query_filters = { + docstatus: 1, + per_delivered: ['<', 100], + status: ['!=', ''] + }; let method = 'erpnext.selling.doctype.sales_order.sales_order.make_pick_list'; if (source_doctype === 'Work Order') { method = 'erpnext.manufacturing.doctype.work_order.work_order.make_pick_list'; + date_field = 'planned_start_date'; + get_query_method = 'erpnext.stock.doctype.pick_list.pick_list.get_pending_work_orders'; + get_query_filters = null; } + + let get_query = () => { + return { + 'query': get_query_method, + 'filters': get_query_filters + }; + }; + frm.add_custom_button(__("Get items"), () => { erpnext.utils.map_current_doc({ method: method, @@ -47,10 +65,8 @@ frappe.ui.form.on('Pick List', { setters: { company: frm.doc.company, }, - date_field: 'creation', - get_query_filters: { - docstatus: 1, - } + date_field: date_field, + get_query: get_query }); }); } diff --git a/erpnext/stock/doctype/pick_list/pick_list.json b/erpnext/stock/doctype/pick_list/pick_list.json index c7a5fc8c75..70272bf584 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.json +++ b/erpnext/stock/doctype/pick_list/pick_list.json @@ -57,10 +57,10 @@ "fieldname": "items_based_on", "fieldtype": "Select", "label": "Items Based On", - "options": "\nSales Order\nWork Order" + "options": "Sales Order\nWork Order" } ], - "modified": "2019-08-13 19:30:01.151720", + "modified": "2019-08-19 12:31:54.023456", "modified_by": "Administrator", "module": "Stock", "name": "Pick List", diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py index 20b4230002..91bdcb33ee 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.py +++ b/erpnext/stock/doctype/pick_list/pick_list.py @@ -10,6 +10,8 @@ from frappe.model.mapper import get_mapped_doc, map_child_doc from frappe.utils import floor, flt, today from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note as make_delivery_note_from_sales_order +# TODO: Prioritize SO or WO group warehouse + class PickList(Document): def set_item_locations(self): reference_items = self.reference_items @@ -154,36 +156,6 @@ def get_item_locations_based_on_batch_nos(item_doc): if required_qty <= 0: break - # required_qty = item_doc.qty - # while required_qty > 0 and batches: - # batch = batches.pop() - # batch_expiry = frappe.get_value('Batch', batch.batch_no, 'expiry_date') - # if batch_expiry and batch_expiry <= frappe.utils.getdate(): - # frappe.msgprint('Skipping expired Batch {}'.format(batch.batch_no)) - # continue - # item_doc.batch_no = batch.batch_no - # if batch.qty >= item_doc.qty: - # required_qty = 0 - # break - # else: - # # split item_code if quantity of item_code in batch is less that required - # # Look for another batch - - # required_qty -= batch.qty - # # set quantity of current item_code equal to batch quantity - # item_doc.set('qty', batch.qty) - # item_doc = parent_doc.append('items', { - # 'item_code': item_doc.item_code, - # 'qty': required_qty, - # 'warehouse': item_doc.warehouse, - # 'sales_order': item_doc.sales_order, - # 'sales_order_item': item_doc.sales_order_item, - # 'uom': item_doc.uom, - # 'stock_uom': item_doc.stock_uom, - # 'conversion_factor': item_doc.conversion_factor, - # 'stock_qty': qty * item_doc.conversion_factor, - # }) - if required_qty: frappe.msgprint('No batches found for {} qty of {}.'.format(required_qty, item_doc.item_code)) @@ -250,4 +222,27 @@ def update_delivery_note_item(source, target, delivery_note): 'company': delivery_note.company }) - target.cost_center = cost_center \ No newline at end of file + target.cost_center = cost_center + +@frappe.whitelist() +def get_pending_work_orders(doctype, txt, searchfield, start, page_length, filters, as_dict): + return frappe.db.sql(""" + SELECT + `name`, `company`, `planned_start_date` + FROM + `tabWork Order` + WHERE + `qty` > `produced_qty` + AND `status` not in ('Completed', 'Stopped') + AND name like %(txt)s + AND docstatus = 1 + ORDER BY + if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999), name + LIMIT + %(start)s, %(page_length)s""", + { + 'txt': "%%%s%%" % txt, + '_txt': txt.replace('%', ''), + 'start': start, + 'page_length': frappe.utils.cint(page_length), + }, as_dict=as_dict)