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