fix: Quantity while creating pick list from work order
- Fix get_mapped_doc config to filter items - Fix erroneous condition in get_mapped_doc used for creation of pick_list in sales order Co-authored-by: Nabin Hait <nabinhait@gmail.com>
This commit is contained in:
		
							parent
							
								
									6450be5e58
								
							
						
					
					
						commit
						1a090432d9
					
				| @ -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) | ||||
| 
 | ||||
|  | ||||
| @ -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) | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
| 			}); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| @ -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", | ||||
|  | ||||
| @ -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 | ||||
| 	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) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user