From 8dd861bda53a479304eb4b17f77a2309e41f3666 Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Tue, 20 Dec 2011 17:17:51 +0530 Subject: [PATCH 01/13] Auto Indent creation when stock reaches re-order level --- erpnext/patches/auto_indent.py | 7 ++ .../doctype/sales_order/sales_order.py | 2 +- .../doctype/manage_account/manage_account.txt | 30 +++--- erpnext/stock/doctype/bin/bin.py | 77 +++++++++++++--- .../doctype/delivery_note/delivery_note.py | 3 +- erpnext/stock/doctype/item/item.txt | 92 ++----------------- .../doctype/stock_ledger/stock_ledger.py | 2 +- erpnext/stock/doctype/warehouse/warehouse.py | 4 +- 8 files changed, 96 insertions(+), 121 deletions(-) create mode 100644 erpnext/patches/auto_indent.py diff --git a/erpnext/patches/auto_indent.py b/erpnext/patches/auto_indent.py new file mode 100644 index 00000000000..e215e7cc85e --- /dev/null +++ b/erpnext/patches/auto_indent.py @@ -0,0 +1,7 @@ +def execute(): + import webnotes + from webnotes.modules.module_manager import reload_doc + reload_doc('manage_account', 'doctype', 'auto_indent') + reload_doc('item', 'doctype', 'email_notify') + webnotes.conn.sql("update `tabItem` set re_order_level = min_order_qty where re_order_level=''") + diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index ca5af7ae662..72245ebb941 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -446,7 +446,7 @@ class DocType(TransactionBase): if not d[0]: msgprint("Message: Please enter Reserved Warehouse for item %s as it is stock item."% d[1]) raise Exception - bin = get_obj('Warehouse', d[0]).update_bin( 0, flt(update_stock) * flt(d[2]), 0, 0, 0, d[1], self.doc.transaction_date) + bin = get_obj('Warehouse', d[0]).update_bin( 0, flt(update_stock) * flt(d[2]), 0, 0, 0, d[1], self.doc.transaction_date,doc_type=self.doc.doctype,doc_name=self.doc.name, is_amended = (self.doc.amended_from and 'Yes' or 'No')) # Gets Items from packing list #================================= diff --git a/erpnext/setup/doctype/manage_account/manage_account.txt b/erpnext/setup/doctype/manage_account/manage_account.txt index 21306cf8023..52c1ea122f8 100644 --- a/erpnext/setup/doctype/manage_account/manage_account.txt +++ b/erpnext/setup/doctype/manage_account/manage_account.txt @@ -5,18 +5,19 @@ { 'creation': '2010-08-08 17:09:09', 'docstatus': 0, - 'modified': '2011-12-14 15:08:22', + 'modified': '2011-12-20 11:14:24', 'modified_by': 'Administrator', 'owner': 'Administrator' }, # These values are common for all DocType { - '_last_update': '1323855454', + '_last_update': '1323855502', 'allow_copy': 1, 'allow_email': 1, 'allow_print': 1, 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'hide_toolbar': 0, 'in_create': 1, @@ -27,7 +28,7 @@ 'section_style': 'Tabbed', 'server_code_error': ' ', 'show_in_menu': 1, - 'version': 516 + 'version': 515 }, # These values are common for all DocField @@ -239,6 +240,15 @@ # DocField { + 'doctype': 'DocField', + 'fieldname': 'auto_indent', + 'fieldtype': 'Check', + 'label': 'Raise Indent when stock reaches re-order level' + }, + + # DocField + { + 'default': '1', 'doctype': 'DocField', 'fieldtype': 'Column Break', 'width': '50%' @@ -312,20 +322,6 @@ 'options': 'Role' }, - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'Column Break' - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'HTML', - 'label': 'Acccount Info', - 'options': '
For more accounting defaults, Open Company
' - }, - # DocField { 'doctype': 'DocField', diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index bb1101ea3fa..7c1ddb91327 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -1,11 +1,18 @@ # Please edit this list and import only required elements import webnotes -from webnotes.utils import cint, cstr, flt, nowdate -from webnotes.model.code import get_obj -from webnotes import msgprint +from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add +from webnotes.model import db_exists +from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType +from webnotes.model.doclist import getlist, copy_doclist +from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax +from webnotes import session, form, is_testing, msgprint, errprint +set = webnotes.conn.set sql = webnotes.conn.sql +get_value = webnotes.conn.get_value + + # ----------------------------------------------------------------------------------------- @@ -18,9 +25,9 @@ class DocType: # ------------- # stock update # ------------- - def update_stock(self, actual_qty=0, reserved_qty=0, ordered_qty=0, indented_qty=0, planned_qty=0, dt=None, sle_id='', posting_time='', serial_no = '', is_cancelled = 'No'): - - if not dt: dt = nowdate() + def update_stock(self, actual_qty=0, reserved_qty=0, ordered_qty=0, indented_qty=0, planned_qty=0, dt=None, sle_id='', posting_time='', serial_no = '', is_cancelled = 'No',doc_type='',doc_name='',is_amended='No'): + if not dt: + dt = nowdate() # update the stock values (for current quantities) self.doc.actual_qty = flt(self.doc.actual_qty) + flt(actual_qty) self.doc.ordered_qty = flt(self.doc.ordered_qty) + flt(ordered_qty) @@ -28,9 +35,10 @@ class DocType: self.doc.indented_qty = flt(self.doc.indented_qty) + flt(indented_qty) 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'): + msgprint('is_amended '+is_amended) + self.reorder_item(doc_type,doc_name) if actual_qty: # check actual qty with total number of serial no @@ -299,13 +307,52 @@ class DocType: # item re-order # ------------- - def reorder_item(self): - #check if re-order is required - projected_qty = flt(self.doc.actual_qty) + flt(self.doc.indented_qty) + flt(self.doc.ordered_qty) - item_reorder_level = sql("select reorder_level from `%sItem` where name = '%s'" % (self.prefix, self.doc.item_code))[0][0] or 0 - if flt(item_reorder_level) > flt(projected_qty): - msgprint("Item: " + self.doc.item_code + " is to be re-ordered. Indent raised (Not Implemented).") - + def reorder_item(self,doc_type,doc_name): + msgprint(get_value('Manage Account', None, 'auto_indent')) + 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 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) + + + # Re order Auto Intent Generation + def reorder_indent(self,i,item_reorder_level,doc_type,doc_name): + 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" + 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) + indent_details_child.item_code = self.doc.item_code + indent_details_child.uom = self.doc.stock_uom + indent_details_child.warehouse = self.doc.warehouse + indent_details_child.schedule_date= add_days(nowdate(),i['lead_time_days']) + 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.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 )) + email_list=[d for d in sql("select parent from tabUserRole where role in ('Purchase Manager','Material Manager') ")] + #if getattr(): + msg='An Indent has been raised for %s: %s on %s '%(doc_type, doc_name, nowdate()) + msgprint(email_list) + sendmail(['nijil@iwebnotes.com'], sender='automail@webnotestech.com', \ + subject='Auto Indent Generation Notification', parts=[['text/plain',msg]]) # validate def validate(self): self.validate_mandatory() diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index ea8c648b748..93f72df512c 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -374,8 +374,7 @@ class DocType(TransactionBase): # if prevdoc_doctype = "Sales Order" if d[3] < 0 : # Reduce Reserved Qty from warehouse - bin = get_obj('Warehouse', d[0]).update_bin(0, flt(update_stock) * flt(d[3]), 0, 0, 0, d[1], self.doc.transaction_date) - + bin = get_obj('Warehouse', d[0]).update_bin(0, flt(update_stock) * flt(d[3]), 0, 0, 0, d[1], self.doc.transaction_date,doc_type=self.doc.doctype,doc_name=self.doc.name, is_amended = (self.doc.amended_from and 'Yes' or 'No')) # Reduce actual qty from warehouse self.make_sl_entry(d, d[0], - flt(d[2]) , 0, update_stock) get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values) diff --git a/erpnext/stock/doctype/item/item.txt b/erpnext/stock/doctype/item/item.txt index 0d20f7b5311..c670700e0c3 100644 --- a/erpnext/stock/doctype/item/item.txt +++ b/erpnext/stock/doctype/item/item.txt @@ -5,18 +5,19 @@ { 'creation': '2010-08-08 17:09:05', 'docstatus': 0, - 'modified': '2011-08-18 13:03:31', + 'modified': '2011-12-20 11:15:42', 'modified_by': 'Administrator', 'owner': 'Administrator' }, # These values are common for all DocType { - '_last_update': '1313651083', + '_last_update': '1323333040', 'allow_attach': 1, 'allow_trash': 1, 'autoname': 'field:item_code', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'document_type': 'Master', 'max_attachments': 1, @@ -28,7 +29,7 @@ 'show_in_menu': 0, 'subject': '%(item_name)s', 'tag_fields': 'item_group', - 'version': 161 + 'version': 162 }, # These values are common for all DocField @@ -62,7 +63,6 @@ 'cancel': 0, 'create': 0, 'doctype': 'DocPerm', - 'idx': 1, 'permlevel': 1, 'role': 'Material Manager', 'submit': 0, @@ -75,7 +75,6 @@ 'cancel': 0, 'create': 0, 'doctype': 'DocPerm', - 'idx': 2, 'permlevel': 0, 'role': 'Material Manager', 'submit': 0, @@ -88,7 +87,6 @@ 'cancel': 0, 'create': 0, 'doctype': 'DocPerm', - 'idx': 3, 'permlevel': 1, 'role': 'Material User', 'submit': 0, @@ -101,7 +99,6 @@ 'cancel': 0, 'create': 0, 'doctype': 'DocPerm', - 'idx': 4, 'permlevel': 0, 'role': 'Material User', 'submit': 0, @@ -113,7 +110,6 @@ 'cancel': 1, 'create': 1, 'doctype': 'DocPerm', - 'idx': 5, 'permlevel': 0, 'role': 'Material Master Manager', 'write': 1 @@ -123,7 +119,6 @@ { 'create': 0, 'doctype': 'DocPerm', - 'idx': 6, 'permlevel': 1, 'role': 'Material Master Manager', 'write': 0 @@ -134,7 +129,6 @@ 'cancel': 1, 'create': 1, 'doctype': 'DocPerm', - 'idx': 7, 'permlevel': 0, 'role': 'System Manager', 'write': 1 @@ -143,7 +137,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 8, 'permlevel': 1, 'role': 'System Manager' }, @@ -152,7 +145,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 1, 'label': 'Item', 'no_copy': 0, 'oldfieldtype': 'Section Break', @@ -164,7 +156,6 @@ 'doctype': 'DocField', 'fieldname': 'trash_reason', 'fieldtype': 'Small Text', - 'idx': 2, 'label': 'Trash Reason', 'oldfieldname': 'trash_reason', 'oldfieldtype': 'Small Text', @@ -178,7 +169,6 @@ 'doctype': 'DocField', 'fieldname': 'item_code', 'fieldtype': 'Data', - 'idx': 3, 'in_filter': 0, 'label': 'Item Code', 'oldfieldname': 'item_code', @@ -193,7 +183,6 @@ 'doctype': 'DocField', 'fieldname': 'item_name', 'fieldtype': 'Data', - 'idx': 4, 'in_filter': 1, 'label': 'Item Name', 'oldfieldname': 'item_name', @@ -210,7 +199,6 @@ 'doctype': 'DocField', 'fieldname': 'item_group', 'fieldtype': 'Link', - 'idx': 5, 'in_filter': 1, 'label': 'Item Group', 'oldfieldname': 'item_group', @@ -224,7 +212,6 @@ { 'doctype': 'DocField', 'fieldtype': 'HTML', - 'idx': 6, 'label': 'IGHelp', 'oldfieldtype': 'HTML', 'options': 'To manage Item Group, click here', @@ -237,7 +224,6 @@ 'fieldname': 'brand', 'fieldtype': 'Link', 'hidden': 0, - 'idx': 7, 'label': 'Brand', 'oldfieldname': 'brand', 'oldfieldtype': 'Link', @@ -251,7 +237,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Column Break', - 'idx': 8, 'permlevel': 0 }, @@ -260,7 +245,6 @@ 'doctype': 'DocField', 'fieldname': 'description', 'fieldtype': 'Text', - 'idx': 9, 'in_filter': 0, 'label': 'Description', 'oldfieldname': 'description', @@ -276,7 +260,6 @@ 'doctype': 'DocField', 'fieldname': 'description_html', 'fieldtype': 'Text', - 'idx': 10, 'label': 'Description HTML', 'permlevel': 0 }, @@ -287,7 +270,6 @@ 'description': 'Generates HTML to include image (1st attachment) in the description', 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 11, 'label': 'Add Image', 'permlevel': 0 }, @@ -296,7 +278,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 12, 'label': 'Inventory', 'oldfieldtype': 'Section Break', 'permlevel': 0 @@ -309,7 +290,6 @@ 'doctype': 'DocField', 'fieldname': 'stock_uom', 'fieldtype': 'Link', - 'idx': 13, 'label': 'Default UoM', 'oldfieldname': 'stock_uom', 'oldfieldtype': 'Link', @@ -326,7 +306,6 @@ 'doctype': 'DocField', 'fieldname': 'is_stock_item', 'fieldtype': 'Select', - 'idx': 14, 'label': 'Is Stock Item', 'oldfieldname': 'is_stock_item', 'oldfieldtype': 'Select', @@ -340,7 +319,6 @@ 'doctype': 'DocField', 'fieldname': 'valuation_method', 'fieldtype': 'Select', - 'idx': 15, 'label': 'Valuation Method', 'oldfieldname': 'valuation_method', 'oldfieldtype': 'Select', @@ -353,7 +331,6 @@ 'doctype': 'DocField', 'fieldname': 'default_warehouse', 'fieldtype': 'Link', - 'idx': 16, 'label': 'Default Warehouse', 'oldfieldname': 'default_warehouse', 'oldfieldtype': 'Link', @@ -368,7 +345,6 @@ 'doctype': 'DocField', 'fieldname': 'tolerance', 'fieldtype': 'Currency', - 'idx': 17, 'label': 'Allowance Percent', 'oldfieldname': 'tolerance', 'oldfieldtype': 'Currency', @@ -380,7 +356,6 @@ 'doctype': 'DocField', 'fieldname': 're_order_level', 'fieldtype': 'Currency', - 'idx': 18, 'label': 'Re-Order Level', 'oldfieldname': 're_order_level', 'oldfieldtype': 'Currency', @@ -389,18 +364,11 @@ # DocField { - 'colour': 'White:FFF', - 'default': '0.00', - 'description': 'If stock level for this item has reached the minimum inventory level, system will prompt you to raise an Indent (Purchase Requisition).', 'doctype': 'DocField', - 'fieldname': 'minimum_inventory_level', - 'fieldtype': 'Currency', - 'idx': 19, - 'label': 'Minimum Inventory Level', - 'oldfieldname': 'minimum_inventory_level', - 'oldfieldtype': 'Currency', - 'permlevel': 0, - 'reqd': 0 + 'fieldname': 'email_notify', + 'fieldtype': 'Check', + 'label': 'Send Email Notification when stock reaches re-order level', + 'permlevel': 0 }, # DocField @@ -412,7 +380,6 @@ 'fieldname': 'min_order_qty', 'fieldtype': 'Currency', 'hidden': 0, - 'idx': 20, 'label': 'Minimum Order Qty', 'oldfieldname': 'min_order_qty', 'oldfieldtype': 'Currency', @@ -423,7 +390,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Column Break', - 'idx': 21, 'oldfieldtype': 'Column Break', 'permlevel': 0, 'width': '50%' @@ -437,7 +403,6 @@ 'doctype': 'DocField', 'fieldname': 'is_asset_item', 'fieldtype': 'Select', - 'idx': 22, 'label': 'Is Asset Item', 'oldfieldname': 'is_asset_item', 'oldfieldtype': 'Select', @@ -453,7 +418,6 @@ 'doctype': 'DocField', 'fieldname': 'has_batch_no', 'fieldtype': 'Select', - 'idx': 23, 'label': 'Has Batch No', 'oldfieldname': 'has_batch_no', 'oldfieldtype': 'Select', @@ -470,7 +434,6 @@ 'doctype': 'DocField', 'fieldname': 'has_serial_no', 'fieldtype': 'Select', - 'idx': 24, 'in_filter': 1, 'label': 'Has Serial No', 'oldfieldname': 'has_serial_no', @@ -485,7 +448,6 @@ 'doctype': 'DocField', 'fieldname': 'warranty_period', 'fieldtype': 'Data', - 'idx': 25, 'label': 'Warranty Period (in days)', 'oldfieldname': 'warranty_period', 'oldfieldtype': 'Data', @@ -497,7 +459,6 @@ 'doctype': 'DocField', 'fieldname': 'end_of_life', 'fieldtype': 'Date', - 'idx': 26, 'label': 'End of Life', 'oldfieldname': 'end_of_life', 'oldfieldtype': 'Date', @@ -509,7 +470,6 @@ 'doctype': 'DocField', 'fieldname': 'nett_weight', 'fieldtype': 'Float', - 'idx': 27, 'label': 'Nett Weight', 'permlevel': 0 }, @@ -519,7 +479,6 @@ 'doctype': 'DocField', 'fieldname': 'gross_weight', 'fieldtype': 'Float', - 'idx': 28, 'label': 'Gross Weight', 'permlevel': 0 }, @@ -529,7 +488,6 @@ 'doctype': 'DocField', 'fieldname': 'weight_uom', 'fieldtype': 'Link', - 'idx': 29, 'label': 'Weight UOM', 'options': 'UOM', 'permlevel': 0 @@ -540,7 +498,6 @@ 'colour': 'White:FFF', 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 30, 'label': 'Purchase Details', 'oldfieldtype': 'Section Break', 'permlevel': 0 @@ -554,7 +511,6 @@ 'doctype': 'DocField', 'fieldname': 'is_purchase_item', 'fieldtype': 'Select', - 'idx': 31, 'label': 'Is Purchase Item', 'oldfieldname': 'is_purchase_item', 'oldfieldtype': 'Select', @@ -570,7 +526,6 @@ 'doctype': 'DocField', 'fieldname': 'lead_time_days', 'fieldtype': 'Int', - 'idx': 32, 'label': 'Lead Time Days', 'no_copy': 1, 'oldfieldname': 'lead_time_days', @@ -585,7 +540,6 @@ 'doctype': 'DocField', 'fieldname': 'purchase_account', 'fieldtype': 'Link', - 'idx': 33, 'label': 'Default Expense Account', 'oldfieldname': 'purchase_account', 'oldfieldtype': 'Link', @@ -601,7 +555,6 @@ 'doctype': 'DocField', 'fieldname': 'cost_center', 'fieldtype': 'Link', - 'idx': 34, 'label': 'Default Cost Center', 'oldfieldname': 'cost_center', 'oldfieldtype': 'Link', @@ -616,7 +569,6 @@ 'doctype': 'DocField', 'fieldname': 'buying_cost', 'fieldtype': 'Currency', - 'idx': 35, 'label': 'Buying Cost', 'no_copy': 1, 'oldfieldname': 'buying_cost', @@ -630,7 +582,6 @@ 'doctype': 'DocField', 'fieldname': 'last_purchase_rate', 'fieldtype': 'Currency', - 'idx': 36, 'label': 'Last Purchase Rate', 'no_copy': 1, 'oldfieldname': 'last_purchase_rate', @@ -643,7 +594,6 @@ 'doctype': 'DocField', 'fieldname': 'standard_rate', 'fieldtype': 'Currency', - 'idx': 37, 'label': 'Standard Rate', 'oldfieldname': 'standard_rate', 'oldfieldtype': 'Currency', @@ -654,7 +604,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Column Break', - 'idx': 38, 'oldfieldtype': 'Column Break', 'permlevel': 0, 'width': '50%' @@ -665,7 +614,6 @@ 'doctype': 'DocField', 'fieldname': 'uom_conversion_details', 'fieldtype': 'Table', - 'idx': 39, 'label': 'UOM Conversion Details', 'oldfieldname': 'uom_conversion_details', 'oldfieldtype': 'Table', @@ -677,7 +625,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 40, 'label': 'Sales Details', 'oldfieldtype': 'Section Break', 'permlevel': 0 @@ -691,7 +638,6 @@ 'doctype': 'DocField', 'fieldname': 'is_sales_item', 'fieldtype': 'Select', - 'idx': 41, 'in_filter': 1, 'label': 'Is Sales Item', 'oldfieldname': 'is_sales_item', @@ -709,7 +655,6 @@ 'doctype': 'DocField', 'fieldname': 'is_service_item', 'fieldtype': 'Select', - 'idx': 42, 'in_filter': 1, 'label': 'Is Service Item', 'oldfieldname': 'is_service_item', @@ -727,7 +672,6 @@ 'doctype': 'DocField', 'fieldname': 'is_sample_item', 'fieldtype': 'Select', - 'idx': 43, 'label': 'Allow Samples', 'oldfieldname': 'is_sample_item', 'oldfieldtype': 'Select', @@ -741,7 +685,6 @@ 'doctype': 'DocField', 'fieldname': 'max_discount', 'fieldtype': 'Currency', - 'idx': 44, 'label': 'Max Discount (%)', 'oldfieldname': 'max_discount', 'oldfieldtype': 'Currency', @@ -753,7 +696,6 @@ 'doctype': 'DocField', 'fieldname': 'default_income_account', 'fieldtype': 'Link', - 'idx': 45, 'label': 'Default Income Account', 'options': 'Account', 'permlevel': 0 @@ -764,7 +706,6 @@ 'doctype': 'DocField', 'fieldname': 'default_sales_cost_center', 'fieldtype': 'Link', - 'idx': 46, 'label': 'Cost Center', 'options': 'Cost Center', 'permlevel': 0 @@ -776,7 +717,6 @@ 'fieldname': 'sales_rate', 'fieldtype': 'Currency', 'hidden': 1, - 'idx': 47, 'label': 'Sales Rate', 'oldfieldname': 'sales_rate', 'oldfieldtype': 'Currency', @@ -787,7 +727,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Column Break', - 'idx': 48, 'oldfieldtype': 'Column Break', 'permlevel': 0, 'width': '50%' @@ -800,7 +739,6 @@ 'doctype': 'DocField', 'fieldname': 'ref_rate_details', 'fieldtype': 'Table', - 'idx': 49, 'label': 'Ref Rate Details', 'oldfieldname': 'ref_rate_details', 'oldfieldtype': 'Table', @@ -814,7 +752,6 @@ 'doctype': 'DocField', 'fieldname': 'item_customer_details', 'fieldtype': 'Table', - 'idx': 50, 'label': 'Customer Codes', 'options': 'Item Customer Detail', 'permlevel': 0 @@ -824,7 +761,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 51, 'label': 'Item Tax', 'oldfieldtype': 'Section Break', 'permlevel': 0 @@ -835,7 +771,6 @@ 'doctype': 'DocField', 'fieldname': 'item_tax', 'fieldtype': 'Table', - 'idx': 52, 'label': 'Item Tax1', 'oldfieldname': 'item_tax', 'oldfieldtype': 'Table', @@ -847,7 +782,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 53, 'label': 'Inspection Criteria', 'oldfieldtype': 'Section Break', 'permlevel': 0 @@ -859,7 +793,6 @@ 'doctype': 'DocField', 'fieldname': 'inspection_required', 'fieldtype': 'Select', - 'idx': 54, 'label': 'Inspection Required', 'no_copy': 0, 'oldfieldname': 'inspection_required', @@ -874,7 +807,6 @@ 'doctype': 'DocField', 'fieldname': 'item_specification_details', 'fieldtype': 'Table', - 'idx': 55, 'label': 'Item Specification Detail', 'oldfieldname': 'item_specification_details', 'oldfieldtype': 'Table', @@ -886,7 +818,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 56, 'label': 'Manufacturing', 'oldfieldtype': 'Section Break', 'permlevel': 0 @@ -900,7 +831,6 @@ 'doctype': 'DocField', 'fieldname': 'is_manufactured_item', 'fieldtype': 'Select', - 'idx': 57, 'label': 'Allow Bill of Materials', 'oldfieldname': 'is_manufactured_item', 'oldfieldtype': 'Select', @@ -915,7 +845,6 @@ 'doctype': 'DocField', 'fieldname': 'default_bom', 'fieldtype': 'Link', - 'idx': 58, 'label': 'Default BOM', 'no_copy': 1, 'oldfieldname': 'default_bom', @@ -932,7 +861,6 @@ 'doctype': 'DocField', 'fieldname': 'is_pro_applicable', 'fieldtype': 'Select', - 'idx': 59, 'label': 'Allow Production Order', 'oldfieldname': 'is_pro_applicable', 'oldfieldtype': 'Select', @@ -949,7 +877,6 @@ 'doctype': 'DocField', 'fieldname': 'is_sub_contracted_item', 'fieldtype': 'Select', - 'idx': 60, 'label': 'Is Sub Contracted Item', 'oldfieldname': 'is_sub_contracted_item', 'oldfieldtype': 'Select', @@ -964,8 +891,8 @@ 'fieldname': 'file_list', 'fieldtype': 'Text', 'hidden': 1, - 'idx': 61, 'label': 'File List', + 'no_copy': 1, 'permlevel': 0, 'print_hide': 1 }, @@ -976,7 +903,6 @@ 'fieldname': 'customer_code', 'fieldtype': 'Data', 'hidden': 1, - 'idx': 62, 'in_filter': 1, 'label': 'Customer Code', 'no_copy': 1, diff --git a/erpnext/stock/doctype/stock_ledger/stock_ledger.py b/erpnext/stock/doctype/stock_ledger/stock_ledger.py index 0970b780568..f339970afaa 100644 --- a/erpnext/stock/doctype/stock_ledger/stock_ledger.py +++ b/erpnext/stock/doctype/stock_ledger/stock_ledger.py @@ -224,7 +224,7 @@ class DocType: if v["actual_qty"]: sle_id = self.make_entry(v) - get_obj('Warehouse', v["warehouse"]).update_bin(flt(v["actual_qty"]), 0, 0, 0, 0, v["item_code"], v["posting_date"], sle_id, v["posting_time"], '', v["is_cancelled"]) + get_obj('Warehouse', v["warehouse"]).update_bin(flt(v["actual_qty"]), 0, 0, 0, 0, v["item_code"], v["posting_date"], sle_id, v["posting_time"], '', v["is_cancelled"],v["voucher_type"],v["voucher_no"]) # ----------- diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py index 0b099fdce11..b9d560a4f46 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.py +++ b/erpnext/stock/doctype/warehouse/warehouse.py @@ -52,12 +52,12 @@ class DocType: # update bin # ---------- - def update_bin(self, actual_qty, reserved_qty, ordered_qty, indented_qty, planned_qty, item_code, dt, sle_id = '',posting_time = '', serial_no = '', is_cancelled = 'No'): + def update_bin(self, actual_qty, reserved_qty, ordered_qty, indented_qty, planned_qty, item_code, dt, sle_id = '',posting_time = '', serial_no = '', is_cancelled = 'No',doc_type='',doc_name='',is_amended='No'): self.validate_asset(item_code) it_det = get_value('Item', item_code, 'is_stock_item') if it_det and it_det == 'Yes': bin = self.get_bin(item_code) - bin.update_stock(actual_qty, reserved_qty, ordered_qty, indented_qty, planned_qty, dt, sle_id, posting_time, serial_no, is_cancelled) + bin.update_stock(actual_qty, reserved_qty, ordered_qty, indented_qty, planned_qty, dt, sle_id, posting_time, serial_no, is_cancelled,doc_type,doc_name,is_amended) return bin else: msgprint("[Stock Update] Ignored %s since it is not a stock item" % item_code) From d82e8df7e56d8ef18540cc39ac5e7ec5b0693c26 Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Tue, 20 Dec 2011 17:30:41 +0530 Subject: [PATCH 02/13] patch update for auto indent with email notify --- erpnext/patches/auto_indent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/patches/auto_indent.py b/erpnext/patches/auto_indent.py index e215e7cc85e..80c44f64134 100644 --- a/erpnext/patches/auto_indent.py +++ b/erpnext/patches/auto_indent.py @@ -3,5 +3,6 @@ def execute(): from webnotes.modules.module_manager import reload_doc reload_doc('manage_account', 'doctype', 'auto_indent') reload_doc('item', 'doctype', 'email_notify') + webnotes.conn.sql("alter table `tabSandbox` drop column `minimum_inventory_level`") webnotes.conn.sql("update `tabItem` set re_order_level = min_order_qty where re_order_level=''") From 04da8741c34d956e03ca95942d8156ece3a0d191 Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Tue, 20 Dec 2011 18:09:43 +0530 Subject: [PATCH 03/13] fix --- erpnext/stock/doctype/bin/bin.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index 7c1ddb91327..757dbb9f2de 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -311,15 +311,15 @@ class DocType: msgprint(get_value('Manage Account', None, 'auto_indent')) 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 from tabItem where item_code = %s",(self.doc.item_code),as_dict=1) + 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) + self.reorder_indent(i,item_reorder_level,doc_type,doc_name,email_notify=i['email_notify']) # Re order Auto Intent Generation - def reorder_indent(self,i,item_reorder_level,doc_type,doc_name): + 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' @@ -346,13 +346,13 @@ class DocType: 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 )) - email_list=[d for d in sql("select parent from tabUserRole where role in ('Purchase Manager','Material Manager') ")] - #if getattr(): - msg='An Indent has been raised for %s: %s on %s '%(doc_type, doc_name, nowdate()) - msgprint(email_list) - sendmail(['nijil@iwebnotes.com'], sender='automail@webnotestech.com', \ - subject='Auto Indent Generation Notification', parts=[['text/plain',msg]]) + 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) + email_list=[d for d in sql("select from tabUserRole where role in ('Purchase Manager','Material Manager') ")] + #if getattr(): + 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() From dc0461296d9676cad988e326a7f4f7694cc9c242 Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Tue, 20 Dec 2011 21:13:58 +0530 Subject: [PATCH 04/13] Email Notification for Tasks --- erpnext/projects/doctype/ticket/ticket.py | 14 ++-- erpnext/projects/doctype/ticket/ticket.txt | 79 +++++++--------------- 2 files changed, 33 insertions(+), 60 deletions(-) diff --git a/erpnext/projects/doctype/ticket/ticket.py b/erpnext/projects/doctype/ticket/ticket.py index 0f18b21e753..091267a71b9 100644 --- a/erpnext/projects/doctype/ticket/ticket.py +++ b/erpnext/projects/doctype/ticket/ticket.py @@ -7,9 +7,9 @@ from webnotes.model.doc import Document, addchild, removechild, getchildren, mak from webnotes.model.doclist import getlist, copy_doclist from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax from webnotes import session, form, is_testing, msgprint, errprint - sql = webnotes.conn.sql - +set = webnotes.conn.set +get_value = webnotes.conn.get_value # ----------------------------------------------------------------------------------------- @@ -31,7 +31,7 @@ class DocType: return ret def get_allocated_to_name(self): - as_em = sql("select first_name, last_name from `tabProfile` where name=%s",self.doc.allocated_to) + as_em = sql("select first_name, last_name from `tabProfile` where name=%s",str(self.doc.allocated_to)) ret = { 'allocated_to_name' : as_em and (as_em[0][0] + ' ' + as_em[0][1]) or ''} return ret @@ -67,6 +67,12 @@ class DocType: #-------------------------------------------- def on_update(self): + if (self.doc.status =='Open') and (self.doc.task_email_notify==1): + msg2= 'A task %s has been assigned to you by %s on %s \n%s Project:%s \t Review Date:%s\nClosing Date:%s Details \n %s' \ + %(self.doc.name,self.doc.senders_name,self.doc.opening_date," ",self.doc.project, \ + self.doc.review_date,self.doc.closing_date,self.doc.description) + sendmail(self.doc.allocated_to, sender='automail@webnotestech.com', \ + subject='A task has been assigned', parts=[['text/plain',msg2]]) pass #validate before sending for approval @@ -164,4 +170,4 @@ class DocType: return cstr('true') def on_cancel(self): - self.cancel_task() \ No newline at end of file + self.cancel_task() diff --git a/erpnext/projects/doctype/ticket/ticket.txt b/erpnext/projects/doctype/ticket/ticket.txt index e9d5ff02838..2680fbab166 100644 --- a/erpnext/projects/doctype/ticket/ticket.txt +++ b/erpnext/projects/doctype/ticket/ticket.txt @@ -5,17 +5,18 @@ { 'creation': '2011-01-28 17:52:35', 'docstatus': 0, - 'modified': '2010-12-03 10:04:58', + 'modified': '2011-12-20 20:52:58', 'modified_by': 'Administrator', 'owner': 'Administrator' }, # These values are common for all DocType { - '_last_update': '1307707462', + '_last_update': '1323333040', 'allow_trash': 1, 'autoname': 'TIC/.####', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'document_type': 'Master', 'module': 'Projects', @@ -25,7 +26,7 @@ 'show_in_menu': 0, 'subject': '%(subject)s', 'tag_fields': 'status', - 'version': 245 + 'version': 246 }, # These values are common for all DocField @@ -39,12 +40,17 @@ # These values are common for all DocPerm { + 'amend': 1, + 'cancel': 1, + 'create': 1, 'doctype': 'DocPerm', 'name': '__common__', 'parent': 'Ticket', 'parentfield': 'permissions', 'parenttype': 'DocType', - 'read': 1 + 'read': 1, + 'submit': 1, + 'write': 1 }, # DocType, Ticket @@ -55,41 +61,28 @@ # DocPerm { - 'amend': 1, - 'cancel': 1, - 'create': 1, 'doctype': 'DocPerm', - 'idx': 1, 'permlevel': 0, - 'role': 'All', - 'write': 1 + 'role': 'All' }, # DocPerm { 'doctype': 'DocPerm', - 'idx': 2, 'permlevel': 1, - 'role': 'All', - 'write': 0 + 'role': 'All' }, # DocPerm { - 'amend': 1, - 'cancel': 1, - 'create': 1, 'doctype': 'DocPerm', - 'idx': 3, 'permlevel': 0, - 'role': 'Projects User', - 'write': 1 + 'role': 'Projects User' }, # DocPerm { 'doctype': 'DocPerm', - 'idx': 4, 'permlevel': 1, 'role': 'Projects User' }, @@ -98,7 +91,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 1, 'label': 'Task Details', 'oldfieldtype': 'Section Break', 'permlevel': 0, @@ -111,7 +103,6 @@ 'doctype': 'DocField', 'fieldname': 'subject', 'fieldtype': 'Data', - 'idx': 2, 'in_filter': 1, 'label': 'Subject', 'oldfieldname': 'subject', @@ -125,8 +116,8 @@ 'doctype': 'DocField', 'fieldname': 'status', 'fieldtype': 'Select', - 'idx': 3, 'label': 'Status', + 'no_copy': 1, 'oldfieldname': 'status', 'oldfieldtype': 'Select', 'options': 'Open\nPending Review\nClosed\nCancelled', @@ -134,12 +125,20 @@ 'trigger': 'Client' }, + # DocField + { + 'doctype': 'DocField', + 'fieldname': 'task_email_notify', + 'fieldtype': 'Check', + 'label': 'Sent Mail Notification', + 'permlevel': 0 + }, + # DocField { 'doctype': 'DocField', 'fieldname': 'opening_date', 'fieldtype': 'Date', - 'idx': 4, 'label': 'Creation Date', 'oldfieldname': 'opening_date', 'oldfieldtype': 'Date', @@ -155,7 +154,6 @@ 'fieldname': 'review_date', 'fieldtype': 'Date', 'hidden': 1, - 'idx': 5, 'label': 'Review Date', 'oldfieldname': 'review_date', 'oldfieldtype': 'Date', @@ -170,7 +168,6 @@ 'fieldname': 'closing_date', 'fieldtype': 'Date', 'hidden': 1, - 'idx': 6, 'label': 'Closing Date', 'oldfieldname': 'closing_date', 'oldfieldtype': 'Date', @@ -182,7 +179,6 @@ 'doctype': 'DocField', 'fieldname': 'priority', 'fieldtype': 'Select', - 'idx': 7, 'in_filter': 1, 'label': 'Priority', 'oldfieldname': 'priority', @@ -199,7 +195,6 @@ 'doctype': 'DocField', 'fieldname': 'project', 'fieldtype': 'Link', - 'idx': 8, 'label': 'Project', 'oldfieldname': 'project', 'oldfieldtype': 'Link', @@ -214,7 +209,6 @@ 'doctype': 'DocField', 'fieldname': 'customer', 'fieldtype': 'Link', - 'idx': 9, 'label': 'Customer', 'oldfieldname': 'customer', 'oldfieldtype': 'Link', @@ -228,7 +222,6 @@ 'doctype': 'DocField', 'fieldname': 'customer_name', 'fieldtype': 'Data', - 'idx': 10, 'label': 'Customer Name', 'oldfieldname': 'customer_name', 'oldfieldtype': 'Data', @@ -239,7 +232,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Column Break', - 'idx': 11, 'oldfieldtype': 'Column Break', 'permlevel': 0, 'width': '50%' @@ -251,7 +243,6 @@ 'doctype': 'DocField', 'fieldname': 'allocated_to', 'fieldtype': 'Link', - 'idx': 12, 'label': 'Allocated To', 'oldfieldname': 'allocated_to', 'oldfieldtype': 'Link', @@ -266,7 +257,6 @@ 'fieldname': 'allocated_to_name', 'fieldtype': 'Data', 'hidden': 1, - 'idx': 13, 'label': 'Allocated To Name', 'oldfieldname': 'allocated_to_name', 'oldfieldtype': 'Data', @@ -278,7 +268,6 @@ 'doctype': 'DocField', 'fieldname': 'senders_name', 'fieldtype': 'Data', - 'idx': 14, 'in_filter': 1, 'label': 'Raised By', 'oldfieldname': 'senders_name', @@ -293,7 +282,6 @@ 'doctype': 'DocField', 'fieldname': 'senders_email', 'fieldtype': 'Data', - 'idx': 15, 'label': 'Email', 'oldfieldname': 'senders_email', 'oldfieldtype': 'Data', @@ -306,7 +294,6 @@ 'doctype': 'DocField', 'fieldname': 'senders_contact_no', 'fieldtype': 'Data', - 'idx': 16, 'label': 'Senders Contact No', 'oldfieldname': 'senders_contact_no', 'oldfieldtype': 'Data', @@ -318,7 +305,6 @@ 'doctype': 'DocField', 'fieldname': 'senders_company', 'fieldtype': 'Data', - 'idx': 17, 'label': 'Senders Company', 'oldfieldname': 'senders_company', 'oldfieldtype': 'Data', @@ -330,7 +316,6 @@ 'doctype': 'DocField', 'fieldname': 'category', 'fieldtype': 'Link', - 'idx': 18, 'label': 'Category', 'oldfieldname': 'category', 'oldfieldtype': 'Link', @@ -343,7 +328,6 @@ 'doctype': 'DocField', 'fieldname': 'external_or_internal', 'fieldtype': 'Select', - 'idx': 19, 'label': 'External or Internal', 'oldfieldname': 'external_or_internal', 'oldfieldtype': 'Select', @@ -357,7 +341,6 @@ 'fieldname': 'amended_from', 'fieldtype': 'Data', 'hidden': 1, - 'idx': 20, 'label': 'Amended From', 'no_copy': 1, 'oldfieldname': 'amended_from', @@ -373,7 +356,6 @@ 'fieldname': 'amendment_date', 'fieldtype': 'Date', 'hidden': 1, - 'idx': 21, 'label': 'Amendment Date', 'no_copy': 1, 'oldfieldname': 'amendment_date', @@ -387,7 +369,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 22, 'oldfieldtype': 'Section Break', 'options': 'Simple', 'permlevel': 0 @@ -398,7 +379,6 @@ 'doctype': 'DocField', 'fieldname': 'description', 'fieldtype': 'Text Editor', - 'idx': 23, 'label': 'Details', 'oldfieldname': 'description', 'oldfieldtype': 'Text Editor', @@ -414,7 +394,6 @@ 'fieldname': 'first_creation_flag', 'fieldtype': 'Int', 'hidden': 1, - 'idx': 24, 'in_filter': 0, 'label': 'First Creation Flag', 'no_copy': 1, @@ -431,7 +410,6 @@ 'fieldname': 'second_creation_flag', 'fieldtype': 'Int', 'hidden': 1, - 'idx': 25, 'label': 'Second Creation Flag', 'no_copy': 1, 'oldfieldname': 'second_creation_flag', @@ -444,7 +422,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 26, 'label': 'Time and Budget', 'oldfieldtype': 'Section Break', 'permlevel': 0 @@ -454,7 +431,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Column Break', - 'idx': 27, 'label': 'Expected', 'oldfieldtype': 'Column Break', 'permlevel': 0, @@ -466,7 +442,6 @@ 'doctype': 'DocField', 'fieldname': 'exp_start_date', 'fieldtype': 'Date', - 'idx': 28, 'label': 'Expected Start Date', 'oldfieldname': 'exp_start_date', 'oldfieldtype': 'Date', @@ -479,7 +454,6 @@ 'doctype': 'DocField', 'fieldname': 'exp_end_date', 'fieldtype': 'Date', - 'idx': 29, 'in_filter': 1, 'label': 'Expected End Date', 'oldfieldname': 'exp_end_date', @@ -494,7 +468,6 @@ 'doctype': 'DocField', 'fieldname': 'exp_total_hrs', 'fieldtype': 'Data', - 'idx': 30, 'label': 'Total Hours (Expected)', 'oldfieldname': 'exp_total_hrs', 'oldfieldtype': 'Data', @@ -507,7 +480,6 @@ 'doctype': 'DocField', 'fieldname': 'allocated_budget', 'fieldtype': 'Currency', - 'idx': 31, 'label': 'Allocated Budget', 'oldfieldname': 'allocated_budget', 'oldfieldtype': 'Currency', @@ -518,7 +490,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Column Break', - 'idx': 32, 'label': 'Actual', 'oldfieldtype': 'Column Break', 'permlevel': 0, @@ -530,7 +501,6 @@ 'doctype': 'DocField', 'fieldname': 'act_start_date', 'fieldtype': 'Date', - 'idx': 33, 'label': 'Actual Start Date', 'oldfieldname': 'act_start_date', 'oldfieldtype': 'Date', @@ -542,7 +512,6 @@ 'doctype': 'DocField', 'fieldname': 'act_end_date', 'fieldtype': 'Date', - 'idx': 34, 'label': 'Actual End Date', 'oldfieldname': 'act_end_date', 'oldfieldtype': 'Date', @@ -554,7 +523,6 @@ 'doctype': 'DocField', 'fieldname': 'act_total_hrs', 'fieldtype': 'Data', - 'idx': 35, 'label': 'Total Hours (Actual)', 'oldfieldname': 'act_total_hrs', 'oldfieldtype': 'Data', @@ -566,7 +534,6 @@ 'doctype': 'DocField', 'fieldname': 'actual_budget', 'fieldtype': 'Currency', - 'idx': 36, 'label': 'Actual Budget', 'oldfieldname': 'actual_budget', 'oldfieldtype': 'Currency', From 205e04211357d46dee62a76a17927147a5fae63c Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Tue, 20 Dec 2011 21:14:43 +0530 Subject: [PATCH 05/13] patch file --- erpnext/patches/task_email_notification.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 erpnext/patches/task_email_notification.py diff --git a/erpnext/patches/task_email_notification.py b/erpnext/patches/task_email_notification.py new file mode 100644 index 00000000000..e6a7afa2540 --- /dev/null +++ b/erpnext/patches/task_email_notification.py @@ -0,0 +1,4 @@ +def execute(): + import webnotes + from webnotes.modules.module_manager import reload_doc + reload_doc('projects', 'doctype', 'ticket') From 35aa35bea3b12f866aa07ce9ceb098228b047e68 Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Wed, 21 Dec 2011 11:50:20 +0530 Subject: [PATCH 06/13] Update erpnext/patches/auto_indent.py --- erpnext/patches/auto_indent.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/patches/auto_indent.py b/erpnext/patches/auto_indent.py index 80c44f64134..1b5bbcf1087 100644 --- a/erpnext/patches/auto_indent.py +++ b/erpnext/patches/auto_indent.py @@ -1,8 +1,8 @@ def execute(): import webnotes from webnotes.modules.module_manager import reload_doc - reload_doc('manage_account', 'doctype', 'auto_indent') - reload_doc('item', 'doctype', 'email_notify') + reload_doc('setup', 'doctype', 'manage_account') + reload_doc('stock', 'doctype', 'item') webnotes.conn.sql("alter table `tabSandbox` drop column `minimum_inventory_level`") - webnotes.conn.sql("update `tabItem` set re_order_level = min_order_qty where re_order_level=''") - + webnotes.conn.sql("update `tabItem` set re_order_level = ifnull(re_order_level,min_order_qty) ") + \ No newline at end of file From 4d6a71c5f20e2c1a36cc03c71cfa0a87c826d48e Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Wed, 21 Dec 2011 11:56:42 +0530 Subject: [PATCH 07/13] Update erpnext/patches/auto_indent.py --- erpnext/patches/auto_indent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/patches/auto_indent.py b/erpnext/patches/auto_indent.py index 1b5bbcf1087..2c7392fdf49 100644 --- a/erpnext/patches/auto_indent.py +++ b/erpnext/patches/auto_indent.py @@ -3,6 +3,6 @@ def execute(): from webnotes.modules.module_manager import reload_doc reload_doc('setup', 'doctype', 'manage_account') reload_doc('stock', 'doctype', 'item') - webnotes.conn.sql("alter table `tabSandbox` drop column `minimum_inventory_level`") + webnotes.conn.sql("alter table `tabItem` drop column `minimum_inventory_level`") webnotes.conn.sql("update `tabItem` set re_order_level = ifnull(re_order_level,min_order_qty) ") \ No newline at end of file From 16ca593bbfcfe30833e87b06f20d50bb89246eaa Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Wed, 21 Dec 2011 12:20:07 +0530 Subject: [PATCH 08/13] Update erpnext/patches/auto_indent.py --- erpnext/patches/auto_indent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/patches/auto_indent.py b/erpnext/patches/auto_indent.py index 2c7392fdf49..1877bd13a41 100644 --- a/erpnext/patches/auto_indent.py +++ b/erpnext/patches/auto_indent.py @@ -4,5 +4,5 @@ def execute(): reload_doc('setup', 'doctype', 'manage_account') reload_doc('stock', 'doctype', 'item') webnotes.conn.sql("alter table `tabItem` drop column `minimum_inventory_level`") - webnotes.conn.sql("update `tabItem` set re_order_level = ifnull(re_order_level,min_order_qty) ") + webnotes.conn.sql("update `tabItem` set re_order_level = minimum_inventory_level wehre ifnull(re_order_level,0) = 0 ") \ No newline at end of file From b36bebe9f01d9cc37451ec8d51fc184bf3ddc62d Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Wed, 21 Dec 2011 14:53:04 +0530 Subject: [PATCH 09/13] Update erpnext/stock/doctype/bin/bin.py --- erpnext/stock/doctype/bin/bin.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index 757dbb9f2de..f742de4b4f4 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -37,7 +37,6 @@ class DocType: 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'): - msgprint('is_amended '+is_amended) self.reorder_item(doc_type,doc_name) if actual_qty: @@ -319,13 +318,13 @@ class DocType: # Re order Auto Intent Generation - def reorder_indent(self,i,item_reorder_level,doc_type,doc_name,email_notify='1'): + 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" + 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.save(1) indent_obj = get_obj('Indent',indent.name,with_children=1) indent_details_child = addchild(indent_obj.doc,'indent_details','Indent Detail',0) @@ -347,12 +346,14 @@ class DocType: 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) - email_list=[d for d in sql("select from tabUserRole where role in ('Purchase Manager','Material Manager') ")] - #if getattr(): - 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]]) + if(email_notify): + send_email_notification(doc_type,doc_name) + + def send_email_notification(self,doc_type,doc_name) + email_list=[d for d in sql("select 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() From 9e6f00abab91454c447a926b8f59fbe6e05f5d37 Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Wed, 21 Dec 2011 14:54:14 +0530 Subject: [PATCH 10/13] fixes for notification --- .../accounts/doctype/receivable_voucher/receivable_voucher.py | 2 +- erpnext/patches/auto_indent.py | 4 ++-- erpnext/stock/doctype/stock_entry/stock_entry.py | 2 +- erpnext/stock/doctype/stock_ledger/stock_ledger.py | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py index 20b0ed80736..9e4baa18ca7 100644 --- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py +++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py @@ -520,7 +520,7 @@ class DocType(TransactionBase): if stock_item[0]['is_stock_item'] == "Yes": # Reduce actual qty from warehouse self.make_sl_entry( d, d.warehouse, - flt(d.qty) , 0, update_stock) - get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values) + get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values, self.doc.amended_from and 'Yes' or 'No') #-------------------POS Stock Updatation Part---------------------------------------------- diff --git a/erpnext/patches/auto_indent.py b/erpnext/patches/auto_indent.py index 1877bd13a41..b709f260abf 100644 --- a/erpnext/patches/auto_indent.py +++ b/erpnext/patches/auto_indent.py @@ -3,6 +3,6 @@ def execute(): from webnotes.modules.module_manager import reload_doc reload_doc('setup', 'doctype', 'manage_account') reload_doc('stock', 'doctype', 'item') - webnotes.conn.sql("alter table `tabItem` drop column `minimum_inventory_level`") + webnotes.conn.sql("delete from `tabDocField` where fieldname=`minimum_inventory_level`") webnotes.conn.sql("update `tabItem` set re_order_level = minimum_inventory_level wehre ifnull(re_order_level,0) = 0 ") - \ No newline at end of file + diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 208dd288f45..9eeb11f0d62 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -245,7 +245,7 @@ class DocType: self.add_to_values(d, cstr(d.s_warehouse), -flt(d.transfer_qty), is_cancelled) if cstr(d.t_warehouse): self.add_to_values(d, cstr(d.t_warehouse), flt(d.transfer_qty), is_cancelled) - get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values) + get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values, self.doc.amended_from and 'Yes' or 'No') def validate_for_production_order(self, pro_obj): diff --git a/erpnext/stock/doctype/stock_ledger/stock_ledger.py b/erpnext/stock/doctype/stock_ledger/stock_ledger.py index f339970afaa..f22d2c20a40 100644 --- a/erpnext/stock/doctype/stock_ledger/stock_ledger.py +++ b/erpnext/stock/doctype/stock_ledger/stock_ledger.py @@ -207,7 +207,7 @@ class DocType: # ------------- # update stock # ------------- - def update_stock(self, values): + def update_stock(self, values, is_amended = 'No'): for v in values: sle_id, serial_nos = '', '' @@ -224,7 +224,7 @@ class DocType: if v["actual_qty"]: sle_id = self.make_entry(v) - get_obj('Warehouse', v["warehouse"]).update_bin(flt(v["actual_qty"]), 0, 0, 0, 0, v["item_code"], v["posting_date"], sle_id, v["posting_time"], '', v["is_cancelled"],v["voucher_type"],v["voucher_no"]) + get_obj('Warehouse', v["warehouse"]).update_bin(flt(v["actual_qty"]), 0, 0, 0, 0, v["item_code"], v["posting_date"], sle_id, v["posting_time"], '', v["is_cancelled"],v["voucher_type"],v["voucher_no"], is_amended) # ----------- From f800dc02f1e0943612ce2ace15631ba4351abe57 Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Wed, 21 Dec 2011 16:20:39 +0530 Subject: [PATCH 11/13] fix --- erpnext/projects/doctype/ticket/ticket.py | 5 +++-- erpnext/stock/doctype/bin/bin.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/projects/doctype/ticket/ticket.py b/erpnext/projects/doctype/ticket/ticket.py index b048425ebda..4d3e988f117 100644 --- a/erpnext/projects/doctype/ticket/ticket.py +++ b/erpnext/projects/doctype/ticket/ticket.py @@ -69,8 +69,9 @@ class DocType: def on_update(self): if (self.doc.status =='Open') and (self.doc.task_email_notify==1): - msg2= 'A task %s has been assigned to you by %s on %s \n%s Project:%s \t Review Date:%s\nClosing Date:%s Details \n %s' \ - %(self.doc.name,self.doc.senders_name,self.doc.opening_date," ",self.doc.project, \ + msg2= 'A task %s has been assigned to you by %s on %s
\ + Project:%s
Review Date:%s
Closing Date:%s
Details %s' \ + %(self.doc.name,self.doc.senders_name,self.doc.opening_date,self.doc.project, \ self.doc.review_date,self.doc.closing_date,self.doc.description) sendmail(self.doc.allocated_to, sender='automail@webnotestech.com', \ subject='A task has been assigned', parts=[['text/plain',msg2]]) diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index f742de4b4f4..5e7f74667a2 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -350,7 +350,7 @@ class DocType: send_email_notification(doc_type,doc_name) def send_email_notification(self,doc_type,doc_name) - email_list=[d for d in sql("select from tabUserRole where role in ('Purchase Manager','Material Manager') ")] + 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]]) From c62953579dab3da0220fbe3acc04bfcfba41f03d Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Wed, 21 Dec 2011 16:32:42 +0530 Subject: [PATCH 12/13] fix --- erpnext/projects/doctype/ticket/ticket.txt | 48 ++++++++++++++-------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/erpnext/projects/doctype/ticket/ticket.txt b/erpnext/projects/doctype/ticket/ticket.txt index 2680fbab166..cd984aca942 100644 --- a/erpnext/projects/doctype/ticket/ticket.txt +++ b/erpnext/projects/doctype/ticket/ticket.txt @@ -5,14 +5,14 @@ { 'creation': '2011-01-28 17:52:35', 'docstatus': 0, - 'modified': '2011-12-20 20:52:58', + 'modified': '2011-12-21 16:32:30', 'modified_by': 'Administrator', 'owner': 'Administrator' }, # These values are common for all DocType { - '_last_update': '1323333040', + '_last_update': '1324394580', 'allow_trash': 1, 'autoname': 'TIC/.####', 'colour': 'White:FFF', @@ -26,7 +26,7 @@ 'show_in_menu': 0, 'subject': '%(subject)s', 'tag_fields': 'status', - 'version': 246 + 'version': 247 }, # These values are common for all DocField @@ -40,17 +40,13 @@ # These values are common for all DocPerm { - 'amend': 1, - 'cancel': 1, - 'create': 1, 'doctype': 'DocPerm', 'name': '__common__', 'parent': 'Ticket', 'parentfield': 'permissions', 'parenttype': 'DocType', 'read': 1, - 'submit': 1, - 'write': 1 + 'submit': 0 }, # DocType, Ticket @@ -61,30 +57,46 @@ # DocPerm { - 'doctype': 'DocPerm', - 'permlevel': 0, - 'role': 'All' - }, - - # DocPerm - { + 'amend': 0, + 'cancel': 0, + 'create': 0, 'doctype': 'DocPerm', 'permlevel': 1, - 'role': 'All' + 'role': 'Projects User', + 'write': 0 }, # DocPerm { + 'amend': 1, + 'cancel': 1, + 'create': 1, 'doctype': 'DocPerm', 'permlevel': 0, - 'role': 'Projects User' + 'role': 'All', + 'write': 1 }, # DocPerm { + 'amend': 0, + 'cancel': 0, + 'create': 0, 'doctype': 'DocPerm', 'permlevel': 1, - 'role': 'Projects User' + 'role': 'All', + 'write': 0 + }, + + # DocPerm + { + 'amend': 1, + 'cancel': 1, + 'create': 1, + 'doctype': 'DocPerm', + 'permlevel': 0, + 'role': 'Projects User', + 'write': 1 }, # DocField From 36f58835e66eda277ebad51da3f0bc6048d94f13 Mon Sep 17 00:00:00 2001 From: Nijil Y Date: Wed, 21 Dec 2011 16:35:43 +0530 Subject: [PATCH 13/13] Update erpnext/patches/auto_indent.py --- erpnext/patches/auto_indent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/patches/auto_indent.py b/erpnext/patches/auto_indent.py index b709f260abf..448c247bb76 100644 --- a/erpnext/patches/auto_indent.py +++ b/erpnext/patches/auto_indent.py @@ -3,6 +3,6 @@ def execute(): from webnotes.modules.module_manager import reload_doc reload_doc('setup', 'doctype', 'manage_account') reload_doc('stock', 'doctype', 'item') - webnotes.conn.sql("delete from `tabDocField` where fieldname=`minimum_inventory_level`") + webnotes.conn.sql("delete from `tabDocField` where fieldname=`minimum_inventory_level` and parent='item'") webnotes.conn.sql("update `tabItem` set re_order_level = minimum_inventory_level wehre ifnull(re_order_level,0) = 0 ")