Merge pull request #17213 from rohitwaghchaure/optimized_code_to_get_items_for_pos
fix: POS takes lot of time to load the items data
This commit is contained in:
		
						commit
						fa8f13dc98
					
				| @ -38,61 +38,60 @@ def get_items(start, page_length, price_list, item_group, search_value="", pos_p | |||||||
| 	# locate function is used to sort by closest match from the beginning of the value | 	# locate function is used to sort by closest match from the beginning of the value | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	if display_items_in_stock == 0: | 	result = [] | ||||||
| 		res = frappe.db.sql("""select i.name as item_code, i.item_name, i.image as item_image, i.idx as idx, |  | ||||||
| 			i.is_stock_item, item_det.price_list_rate, item_det.currency |  | ||||||
| 			from `tabItem` i LEFT JOIN |  | ||||||
| 				(select item_code, price_list_rate, currency from |  | ||||||
| 					`tabItem Price`	where price_list=%(price_list)s) item_det |  | ||||||
| 			ON |  | ||||||
| 				(item_det.item_code=i.name or item_det.item_code=i.variant_of) |  | ||||||
| 			where |  | ||||||
| 				i.disabled = 0 and i.has_variants = 0 and i.is_sales_item = 1 |  | ||||||
| 				and i.item_group in (select name from `tabItem Group` where lft >= {lft} and rgt <= {rgt}) |  | ||||||
| 				and {condition} order by idx desc limit {start}, {page_length}""".format( |  | ||||||
| 					start=start, |  | ||||||
| 					page_length=page_length, |  | ||||||
| 					lft=lft, |  | ||||||
| 					rgt=rgt, |  | ||||||
| 					condition=condition |  | ||||||
| 			), { |  | ||||||
| 				'price_list': price_list |  | ||||||
| 			}, as_dict=1) |  | ||||||
| 
 | 
 | ||||||
| 		res = { | 	items_data = frappe.db.sql(""" SELECT name as item_code, | ||||||
| 		'items': res | 			item_name, image as item_image, idx as idx,is_stock_item | ||||||
| 		} | 		FROM | ||||||
|  | 			`tabItem` | ||||||
|  | 		WHERE | ||||||
|  | 			disabled = 0 and has_variants = 0 and is_sales_item = 1 | ||||||
|  | 			and item_group in (select name from `tabItem Group` where lft >= {lft} and rgt <= {rgt}) | ||||||
|  | 			and {condition} order by idx desc limit {start}, {page_length}""" | ||||||
|  | 		.format( | ||||||
|  | 			start=start, page_length=page_length, | ||||||
|  | 			lft=lft, rgt=rgt, | ||||||
|  | 			condition=condition | ||||||
|  | 		), as_dict=1) | ||||||
| 
 | 
 | ||||||
| 	elif display_items_in_stock == 1: | 	if items_data: | ||||||
| 		query = """select i.name as item_code, i.item_name, i.image as item_image, i.idx as idx, | 		items = [d.item_code for d in items_data] | ||||||
| 				i.is_stock_item, item_det.price_list_rate, item_det.currency | 		item_prices_data = frappe.get_all("Item Price", | ||||||
| 				from `tabItem` i LEFT JOIN | 			fields = ["item_code", "price_list_rate", "currency"], | ||||||
| 					(select item_code, price_list_rate, currency from | 			filters = {'price_list': price_list, 'item_code': ['in', items]}) | ||||||
| 						`tabItem Price`	where price_list=%(price_list)s) item_det |  | ||||||
| 				ON |  | ||||||
| 					(item_det.item_code=i.name or item_det.item_code=i.variant_of) INNER JOIN""" |  | ||||||
| 
 | 
 | ||||||
| 		if warehouse is not None: | 		item_prices, bin_data = {}, {} | ||||||
| 			query = query +  """ (select item_code,actual_qty from `tabBin` where warehouse=%(warehouse)s and actual_qty > 0 group by item_code) item_se""" | 		for d in item_prices_data: | ||||||
| 		else: | 			item_prices[d.item_code] = d | ||||||
| 			query = query +  """ (select item_code,sum(actual_qty) as actual_qty from `tabBin` group by item_code) item_se""" |  | ||||||
| 
 | 
 | ||||||
| 		res = frappe.db.sql(query +  """ |  | ||||||
| 			ON |  | ||||||
| 				((item_se.item_code=i.name or item_det.item_code=i.variant_of) and item_se.actual_qty>0) |  | ||||||
| 			where |  | ||||||
| 				i.disabled = 0 and i.has_variants = 0 and i.is_sales_item = 1 |  | ||||||
| 				and i.item_group in (select name from `tabItem Group` where lft >= {lft} and rgt <= {rgt}) |  | ||||||
| 				and {condition} order by idx desc limit {start}, {page_length} """.format |  | ||||||
| 				(start=start,page_length=page_length,lft=lft, 	rgt=rgt, condition=condition), |  | ||||||
| 			{ |  | ||||||
| 				'price_list': price_list, |  | ||||||
| 				'warehouse': warehouse |  | ||||||
| 			} , as_dict=1) |  | ||||||
| 
 | 
 | ||||||
| 		res = { | 		if display_items_in_stock: | ||||||
| 		'items': res | 			filters = {'actual_qty': [">", 0], 'item_code': ['in', items]} | ||||||
| 		} | 
 | ||||||
|  | 			if warehouse: | ||||||
|  | 				filters['warehouse'] = warehouse | ||||||
|  | 
 | ||||||
|  | 			bin_data = frappe._dict( | ||||||
|  | 				frappe.get_all("Bin", fields = ["item_code", "sum(actual_qty) as actual_qty"], | ||||||
|  | 				filters = filters, group_by = "item_code") | ||||||
|  | 			) | ||||||
|  | 
 | ||||||
|  | 		for item in items_data: | ||||||
|  | 			row = {} | ||||||
|  | 
 | ||||||
|  | 			row.update(item) | ||||||
|  | 			item_price = item_prices.get(item.item_code) or {} | ||||||
|  | 			row.update({ | ||||||
|  | 				'price_list_rate': item_price.get('price_list_rate'), | ||||||
|  | 				'currency': item_price.get('currency'), | ||||||
|  | 				'actual_qty': bin_data.get('actual_qty') | ||||||
|  | 			}) | ||||||
|  | 
 | ||||||
|  | 			result.append(row) | ||||||
|  | 
 | ||||||
|  | 	res = { | ||||||
|  | 		'items': result | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if serial_no: | 	if serial_no: | ||||||
| 		res.update({ | 		res.update({ | ||||||
| @ -132,16 +131,16 @@ def search_serial_or_batch_or_barcode_number(search_value): | |||||||
| 
 | 
 | ||||||
| def get_conditions(item_code, serial_no, batch_no, barcode): | def get_conditions(item_code, serial_no, batch_no, barcode): | ||||||
| 	if serial_no or batch_no or barcode: | 	if serial_no or batch_no or barcode: | ||||||
| 		return "i.name = {0}".format(frappe.db.escape(item_code)) | 		return "name = {0}".format(frappe.db.escape(item_code)) | ||||||
| 
 | 
 | ||||||
| 	return """(i.name like {item_code} | 	return """(name like {item_code} | ||||||
| 		or i.item_name like {item_code})""".format(item_code = frappe.db.escape('%' + item_code + '%')) | 		or item_name like {item_code})""".format(item_code = frappe.db.escape('%' + item_code + '%')) | ||||||
| 
 | 
 | ||||||
| def get_item_group_condition(pos_profile): | def get_item_group_condition(pos_profile): | ||||||
| 	cond = "and 1=1" | 	cond = "and 1=1" | ||||||
| 	item_groups = get_item_groups(pos_profile) | 	item_groups = get_item_groups(pos_profile) | ||||||
| 	if item_groups: | 	if item_groups: | ||||||
| 		cond = "and i.item_group in (%s)"%(', '.join(['%s']*len(item_groups))) | 		cond = "and item_group in (%s)"%(', '.join(['%s']*len(item_groups))) | ||||||
| 
 | 
 | ||||||
| 	return cond % tuple(item_groups) | 	return cond % tuple(item_groups) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user