Fixes related to finding prev sle
This commit is contained in:
		
							parent
							
								
									235439df5b
								
							
						
					
					
						commit
						93ba4fbaa4
					
				| @ -344,8 +344,7 @@ def execute(patch_no): | |||||||
| 		bin = sql("select name from tabBin") | 		bin = sql("select name from tabBin") | ||||||
| 		for b in bin: | 		for b in bin: | ||||||
| 			bobj = get_obj('Bin',b[0]) | 			bobj = get_obj('Bin',b[0]) | ||||||
| 			prev_sle = bobj.get_prev_sle(posting_date = '2011-09-01', posting_time = '01:00') | 			bobj.update_entries_after(posting_date = '2011-09-01', posting_time = '01:00') | ||||||
| 			bobj.update_entries_after(posting_date = '2011-09-01', posting_time = '01:00', prev_sle = prev_sle) |  | ||||||
| 	elif patch_no == 368: | 	elif patch_no == 368: | ||||||
| 		from webnotes.utils import nestedset | 		from webnotes.utils import nestedset | ||||||
| 		t = [ | 		t = [ | ||||||
|  | |||||||
| @ -411,8 +411,8 @@ class DocType: | |||||||
|     if val_method == 'FIFO': |     if val_method == 'FIFO': | ||||||
|       if warehouse: |       if warehouse: | ||||||
|         bin_obj = get_obj('Warehouse',warehouse).get_bin(item_code) |         bin_obj = get_obj('Warehouse',warehouse).get_bin(item_code) | ||||||
|         prev_sle = bin_obj.get_prev_sle('',nowdate(), (now().split(' ')[1])[:-3]) |         prev_sle = bin_obj.get_prev_sle(nowdate(), (now().split(' ')[1])[:-3]) | ||||||
|         fcfs_stack = prev_sle and (prev_sle[0][3] and eval(prev_sle[0][3]) or []) or [] |         fcfs_stack = prev_sle and prev_sle['fcfs_stack'] and eval(prev_sle['fcfs_stack']) or [] | ||||||
|       else: |       else: | ||||||
|         prev_sle = sql("select fcfs_stack from `tabStock Ledger Entry` where item_code = '%s' and posting_date <= '%s' order by posting_date DESC, posting_time DESC, name DESC limit 1" % (item_code, nowdate())) |         prev_sle = sql("select fcfs_stack from `tabStock Ledger Entry` where item_code = '%s' and posting_date <= '%s' order by posting_date DESC, posting_time DESC, name DESC limit 1" % (item_code, nowdate())) | ||||||
|         fcfs_stack = prev_sle and (prev_sle[0][0] and eval(prev_sle[0][0]) or []) or [] |         fcfs_stack = prev_sle and (prev_sle[0][0] and eval(prev_sle[0][0]) or []) or [] | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								erpnext/sandbox/testdata/stock_entry.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								erpnext/sandbox/testdata/stock_entry.py
									
									
									
									
										vendored
									
									
								
							| @ -43,7 +43,7 @@ mtn = [ | |||||||
| 			'doctype': 'Stock Entry', | 			'doctype': 'Stock Entry', | ||||||
| 			'posting_date': '2011-09-01', | 			'posting_date': '2011-09-01', | ||||||
| 			'transfer_date': '2011-09-01', | 			'transfer_date': '2011-09-01', | ||||||
| 			'posting_time': '13:00', | 			'posting_time': '12:00', | ||||||
| 			'company': 'comp', | 			'company': 'comp', | ||||||
| 			'fiscal_year' : '2011-2012', | 			'fiscal_year' : '2011-2012', | ||||||
| 			'purpose': 'Material Transfer', | 			'purpose': 'Material Transfer', | ||||||
|  | |||||||
| @ -76,8 +76,29 @@ class DocType: | |||||||
| 		""", (self.doc.item_code, self.doc.warehouse), as_dict=1) | 		""", (self.doc.item_code, self.doc.warehouse), as_dict=1) | ||||||
| 		return sle and sle[0] or None | 		return sle and sle[0] or None | ||||||
| 
 | 
 | ||||||
| 	def get_prev_sle(self, posting_date = '0000-00-00', posting_time = '00:00'): | 	def get_prev_sle(self, posting_date = '1900-01-01', posting_time = '12:00', sle_id = ''): | ||||||
| 		"""get previous stock ledger entry""" | 		""" | ||||||
|  | 			get the last sle on or before the current time-bucket,  | ||||||
|  | 			to get actual qty before transaction, this function | ||||||
|  | 			is called from various transaction like stock entry, reco etc | ||||||
|  | 		""" | ||||||
|  | 		 | ||||||
|  | 		sle = sql(""" | ||||||
|  | 			select * from `tabStock Ledger Entry` | ||||||
|  | 			where item_code = %s | ||||||
|  | 			and warehouse = %s | ||||||
|  | 			and ifnull(is_cancelled, 'No') = 'No' | ||||||
|  | 			and name != %s | ||||||
|  | 			and timestamp(posting_date, posting_time) <= timestamp(%s, %s) | ||||||
|  | 			order by timestamp(posting_date, posting_time) desc, name desc | ||||||
|  | 			limit 1 | ||||||
|  | 		""", (self.doc.item_code, self.doc.warehouse, sle_id, posting_date, posting_time), as_dict=1) | ||||||
|  | 
 | ||||||
|  | 		return sle and sle[0] or {} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	def get_sle_prev_timebucket(self, posting_date = '1900-01-01', posting_time = '12:00'): | ||||||
|  | 		"""get previous stock ledger entry before current time-bucket""" | ||||||
| 		# get the last sle before the current time-bucket, so that all values | 		# get the last sle before the current time-bucket, so that all values | ||||||
| 		# are reposted from the current time-bucket onwards. | 		# are reposted from the current time-bucket onwards. | ||||||
| 		# this is necessary because at the time of cancellation, there may be | 		# this is necessary because at the time of cancellation, there may be | ||||||
| @ -96,11 +117,7 @@ class DocType: | |||||||
| 		return sle and sle[0] or {} | 		return sle and sle[0] or {} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 	#------------------------------------------------------------- | ||||||
| 
 |  | ||||||
| 	# -------------------------------------------------------------------------------------------------------------------------------------- |  | ||||||
| 	#  |  | ||||||
| 	# -------------------------------------------------------------------------------------------------------------------------------------- |  | ||||||
| 	def validate_negative_stock(self, cqty, s): | 	def validate_negative_stock(self, cqty, s): | ||||||
| 		""" | 		""" | ||||||
| 			validate negative stock for entries current datetime onwards | 			validate negative stock for entries current datetime onwards | ||||||
| @ -117,10 +134,12 @@ class DocType: | |||||||
| 					s['posting_date'], s['posting_time'], s['voucher_type'], s['voucher_no']), \ | 					s['posting_date'], s['posting_time'], s['voucher_type'], s['voucher_no']), \ | ||||||
| 					raise_exception=1) | 					raise_exception=1) | ||||||
| 
 | 
 | ||||||
| 	# ------------------------------------ | 
 | ||||||
| 	# get serialized inventory values |  | ||||||
| 	# ------------------------------------ | 	# ------------------------------------ | ||||||
| 	def get_serialized_inventory_values(self, val_rate, in_rate, opening_qty, actual_qty, is_cancelled, serial_nos): | 	def get_serialized_inventory_values(self, val_rate, in_rate, opening_qty, actual_qty, is_cancelled, serial_nos): | ||||||
|  | 		""" | ||||||
|  | 			get serialized inventory values | ||||||
|  | 		""" | ||||||
| 		if flt(in_rate) < 0: # wrong incoming rate | 		if flt(in_rate) < 0: # wrong incoming rate | ||||||
| 			in_rate = val_rate | 			in_rate = val_rate | ||||||
| 		elif flt(in_rate) == 0: # In case of delivery/stock issue, get average purchase rate of serial nos of current entry | 		elif flt(in_rate) == 0: # In case of delivery/stock issue, get average purchase rate of serial nos of current entry | ||||||
| @ -219,7 +238,7 @@ class DocType: | |||||||
| 		""" | 		""" | ||||||
| 		 | 		 | ||||||
| 		# Get prev sle | 		# Get prev sle | ||||||
| 		prev_sle = self.get_prev_sle(posting_date, posting_time) | 		prev_sle = self.get_sle_prev_timebucket(posting_date, posting_time) | ||||||
| 		 | 		 | ||||||
| 		# if no prev sle, start from the first one (for repost) | 		# if no prev sle, start from the first one (for repost) | ||||||
| 		if not prev_sle: | 		if not prev_sle: | ||||||
| @ -246,7 +265,7 @@ class DocType: | |||||||
| 			and timestamp(posting_date, posting_time) > timestamp(%s, %s) | 			and timestamp(posting_date, posting_time) > timestamp(%s, %s) | ||||||
| 			order by timestamp(posting_date, posting_time) asc, name asc""", \ | 			order by timestamp(posting_date, posting_time) asc, name asc""", \ | ||||||
| 				(self.doc.item_code, self.doc.warehouse, \ | 				(self.doc.item_code, self.doc.warehouse, \ | ||||||
| 					prev_sle.get('posting_date','0000-00-00'), prev_sle.get('posting_time', '00:00')), as_dict = 1) | 					prev_sle.get('posting_date','1900-01-01'), prev_sle.get('posting_time', '12:00')), as_dict = 1) | ||||||
| 
 | 
 | ||||||
| 		for sle in sll: | 		for sle in sll: | ||||||
| 			# block if stock level goes negative on any date | 			# block if stock level goes negative on any date | ||||||
|  | |||||||
| @ -122,8 +122,6 @@ class DocType: | |||||||
| 				 | 				 | ||||||
| 	def get_raw_materials(self,pro_obj): | 	def get_raw_materials(self,pro_obj): | ||||||
| 		# get all items from flat bom except, child items of sub-contracted and sub assembly items and sub assembly items itself. | 		# get all items from flat bom except, child items of sub-contracted and sub assembly items and sub assembly items itself. | ||||||
| #		flat_bom_items = sql("select item_code, ifnull(sum(qty_consumed_per_unit), 0) * '%s', description, stock_uom from `tabFlat BOM Detail` where parent = '%s' and parent_bom = '%s' and is_pro_applicable = 'No' and docstatus < 2 group by item_code" % ((self.doc.process == 'Backflush') and flt(self.doc.fg_completed_qty) or flt(pro_obj.doc.qty), cstr(pro_obj.doc.bom_no), cstr(pro_obj.doc.bom_no))) |  | ||||||
| #		self.make_items_dict(flat_bom_items) |  | ||||||
| 
 | 
 | ||||||
| 		if pro_obj.doc.consider_sa_items == 'Yes': | 		if pro_obj.doc.consider_sa_items == 'Yes': | ||||||
| 			# get all Sub Assembly items only from flat bom | 			# get all Sub Assembly items only from flat bom | ||||||
| @ -132,7 +130,6 @@ class DocType: | |||||||
| 		 | 		 | ||||||
| 		if pro_obj.doc.consider_sa_items == 'No': | 		if pro_obj.doc.consider_sa_items == 'No': | ||||||
| 			# get all sub assembly childs only from flat bom | 			# get all sub assembly childs only from flat bom | ||||||
| 			#select item_code,ifnull(sum(qty_consumed_per_unit),0)*'%s' as qty,description,stock_uom from ( select distinct fb.name,fb.description,fb.item_code,fb.qty_consumed_per_unit,fb.stock_uom from `tabFlat BOM Detail` fb,`tabBOM Material` bm where bm.parent=fb.parent_bom and bm.docstatus<2 and fb.is_pro_applicable='Yes' and fb.docstatus<2 and fb.parent='%s' and bm.bom_no is null)a group by item_code,stock_uom |  | ||||||
| 			fl_bom_sa_child_item = sql("select item_code,ifnull(sum(qty_consumed_per_unit),0)*'%s' as qty,description,stock_uom from ( select distinct fb.name,fb.description,fb.item_code,fb.qty_consumed_per_unit,fb.stock_uom from `tabFlat BOM Detail` fb,`tabBOM Material` bm where bm.parent=fb.parent_bom and bm.docstatus<2 and fb.is_pro_applicable='Yes' and fb.docstatus<2 and fb.parent='%s' and bm.bom_no is null)a group by item_code,stock_uom" % ((self.doc.process == 'Backflush') and flt(self.doc.fg_completed_qty) or flt(pro_obj.doc.qty), cstr(pro_obj.doc.bom_no))) | 			fl_bom_sa_child_item = sql("select item_code,ifnull(sum(qty_consumed_per_unit),0)*'%s' as qty,description,stock_uom from ( select distinct fb.name,fb.description,fb.item_code,fb.qty_consumed_per_unit,fb.stock_uom from `tabFlat BOM Detail` fb,`tabBOM Material` bm where bm.parent=fb.parent_bom and bm.docstatus<2 and fb.is_pro_applicable='Yes' and fb.docstatus<2 and fb.parent='%s' and bm.bom_no is null)a group by item_code,stock_uom" % ((self.doc.process == 'Backflush') and flt(self.doc.fg_completed_qty) or flt(pro_obj.doc.qty), cstr(pro_obj.doc.bom_no))) | ||||||
| 			self.make_items_dict(fl_bom_sa_child_item) | 			self.make_items_dict(fl_bom_sa_child_item) | ||||||
| 
 | 
 | ||||||
| @ -179,8 +176,7 @@ class DocType: | |||||||
| 			if flt(d.transfer_qty) <= 0: | 			if flt(d.transfer_qty) <= 0: | ||||||
| 				msgprint("Transfer Quantity can not be less than or equal to zero at Row No " + cstr(d.idx)) | 				msgprint("Transfer Quantity can not be less than or equal to zero at Row No " + cstr(d.idx)) | ||||||
| 				raise Exception | 				raise Exception | ||||||
| 			if d.s_warehouse: | 			if d.s_warehouse and flt(d.transfer_qty) > flt(d.actual_qty): | ||||||
| 				if flt(d.transfer_qty) > flt(d.actual_qty): |  | ||||||
| 				msgprint("Transfer Quantity is more than Available Qty at Row No " + cstr(d.idx)) | 				msgprint("Transfer Quantity is more than Available Qty at Row No " + cstr(d.idx)) | ||||||
| 				raise Exception | 				raise Exception | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user