From 5fe67604069316ca19ae451added8fe9e3ed2050 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 21 Feb 2012 13:25:27 +0530 Subject: [PATCH] reorder level checking based on stores and reserved warehouse --- erpnext/patches/jan_mar_2012/reload_item.py | 6 +++ erpnext/stock/doctype/bin/bin.py | 54 +++++++++++++-------- 2 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 erpnext/patches/jan_mar_2012/reload_item.py diff --git a/erpnext/patches/jan_mar_2012/reload_item.py b/erpnext/patches/jan_mar_2012/reload_item.py new file mode 100644 index 0000000000..158b67da58 --- /dev/null +++ b/erpnext/patches/jan_mar_2012/reload_item.py @@ -0,0 +1,6 @@ +def execute(): + import webnotes + from webnotes.modules.module_manager import reload_doc + reload_doc('stock', 'doctype', 'item') + + webnotes.conn.sql("update `tabItem` set re_order_qty = min_order_qty") diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index 6a228c1f9b..8f1bdf2512 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -36,8 +36,8 @@ class DocType: self.doc.planned_qty = flt(self.doc.planned_qty) + flt(planned_qty) self.doc.projected_qty = flt(self.doc.actual_qty) + flt(self.doc.ordered_qty) + flt(self.doc.indented_qty) + flt(self.doc.planned_qty) - flt(self.doc.reserved_qty) self.doc.save() - if(( flt(actual_qty)<0 or flt(reserved_qty)>0 )and is_cancelled == 'No' and is_amended=='No'): - self.reorder_item(doc_type,doc_name) + if(( flt(actual_qty)<0 or flt(reserved_qty)>0 ) and is_cancelled == 'No' and is_amended=='No'): + self.reorder_item(doc_type,doc_name) if actual_qty: # check actual qty with total number of serial no @@ -304,26 +304,37 @@ class DocType: (flt(val_rate), cqty, flt(stock_val), self.doc.name)) - # item re-order - # ------------- + def reorder_item(self,doc_type,doc_name): + """ Reorder item if stock reaches reorder level""" + if get_value('Manage Account', None, 'auto_indent'): #check if re-order is required - indent_detail_fields = sql("select re_order_level,item_name,description,brand,item_group,lead_time_days,min_order_qty,email_notify from tabItem where item_code = %s",(self.doc.item_code),as_dict=1) - i = indent_detail_fields[0] - item_reorder_level = i['re_order_level'] or 0 - if ((flt(item_reorder_level) > flt(self.doc.projected_qty)) and item_reorder_level) : - self.reorder_indent(i,item_reorder_level,doc_type,doc_name,email_notify=i['email_notify']) + ret = sql("select re_order_level, item_name, description, brand, item_group, lead_time_days, min_order_qty, email_notify, re_order_qty from tabItem where item_code = %s", (self.doc.item_code), as_dict=1) + + current_qty = sql(""" + select sum(t1.actual_qty) + sum(t1.indented_qty) + sum(t1.ordered_qty) -sum(t1.reserved_qty) + from tabBin t1, tabWarehouse t2 + where t1.item_code = %s + and t1.warehouse = t2.name + and t2.warehouse_type in ('Stores', 'Reserved', 'Default Warehouse Type') + and t1.docstatus != 2 + """, self.doc.item_code) + + if ((flt(ret[0]['re_order_level']) > flt(current_qty)) and ret[0]['re_order_level']): + self.create_auto_indent(ret[0], doc_type, doc_name) + + + + def create_auto_indent(self, i , doc_type, doc_name): + """ Create indent on reaching reorder level """ - - # Re order Auto Intent Generation - def reorder_indent(self,i,item_reorder_level,doc_type,doc_name,email_notify=1): indent = Document('Indent') indent.transaction_date = nowdate() indent.naming_series = 'IDT' indent.company = get_defaults()['company'] indent.fiscal_year = get_defaults()['fiscal_year'] - indent.remark = "This is an auto generated Indent. It was raised because the projected quantity has fallen below the minimum re-order level when %s %s was created"%(doc_type,doc_name) + indent.remark = "This is an auto generated Indent. It was raised because the (actual + ordered + indented - reserved) quantity reaches re-order level when %s %s was created"%(doc_type,doc_name) indent.save(1) indent_obj = get_obj('Indent',indent.name,with_children=1) indent_details_child = addchild(indent_obj.doc,'indent_details','Indent Detail',0) @@ -334,26 +345,29 @@ class DocType: indent_details_child.item_name = i['item_name'] indent_details_child.description = i['description'] indent_details_child.item_group = i['item_group'] - if (i['min_order_qty'] < ( flt(item_reorder_level)-flt(self.doc.projected_qty) )): - indent_details_child.qty =flt(flt(item_reorder_level)-flt(self.doc.projected_qty)) - else: - indent_details_child.qty = i['min_order_qty'] + indent_details_child.qty = i['re_order_qty'] indent_details_child.brand = i['brand'] indent_details_child.save() indent_obj = get_obj('Indent',indent.name,with_children=1) indent_obj.validate() set(indent_obj.doc,'docstatus',1) indent_obj.on_submit() - msgprint("Item: " + self.doc.item_code + " is to be re-ordered. Indent %s raised.Was generated from %s %s"%(indent.name,doc_type, doc_name )) - if(email_notify): + msgprint("Item: " + self.doc.item_code + " is to be re-ordered. Indent %s raised. It was generated from %s %s"%(indent.name,doc_type, doc_name )) + if(i['email_notify']): send_email_notification(doc_type,doc_name) + + def send_email_notification(self,doc_type,doc_name): + """ Notify user about auto creation of indent""" + email_list=[d for d in sql("select parent from tabUserRole where role in ('Purchase Manager','Material Manager') ")] msg1='An Indent has been raised for item %s: %s on %s '%(doc_type, doc_name, nowdate()) sendmail(email_list, sender='automail@webnotestech.com', \ subject='Auto Indent Generation Notification', parts=[['text/plain',msg1]]) - # validate + + + def validate(self): self.validate_mandatory()