Fixes related to finding prev sle

This commit is contained in:
Nabin Hait 2011-11-08 15:30:04 +05:30
parent 235439df5b
commit 93ba4fbaa4
5 changed files with 38 additions and 24 deletions

View File

@ -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 = [

View File

@ -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 []

View File

@ -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',

View File

@ -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

View File

@ -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