diff --git a/erpnext/hr/doctype/employee/employee.js b/erpnext/hr/doctype/employee/employee.js index 23d50670fb..7ee88f7068 100644 --- a/erpnext/hr/doctype/employee/employee.js +++ b/erpnext/hr/doctype/employee/employee.js @@ -4,10 +4,10 @@ wn.provide("erpnext.hr"); erpnext.hr.EmployeeController = wn.ui.form.Controller.extend({ setup: function() { - this.frm.fields_dict.user_id.get_query = function(doc,cdt,cdn) { - return { query:"webnotes.core.doctype.profile.profile.profile_query"} } - this.frm.fields_dict.reports_to.get_query = function(doc,cdt,cdn) { - return{ query: "erpnext.controllers.queries.employee_query"} } + this.frm.fields_dict.user_id.get_query = function(doc, cdt, cdn) { + return { query:"webnotes.core.doctype.profile.profile.profile_query"} } + this.frm.fields_dict.reports_to.get_query = function(doc, cdt, cdn) { + return { query: "erpnext.controllers.queries.employee_query"} } }, onload: function() { @@ -93,4 +93,4 @@ erpnext.hr.EmployeeController = wn.ui.form.Controller.extend({ }); }, }); -cur_frm.cscript = new erpnext.hr.EmployeeController({frm: cur_frm}); \ No newline at end of file +cur_frm.cscript = new erpnext.hr.EmployeeController({frm: cur_frm}); diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.py b/erpnext/hr/doctype/holiday_list/holiday_list.py index 1045077e77..9f28e4c6b4 100644 --- a/erpnext/hr/doctype/holiday_list/holiday_list.py +++ b/erpnext/hr/doctype/holiday_list/holiday_list.py @@ -8,9 +8,7 @@ from webnotes.utils import add_days, add_years, cint, getdate from webnotes.model import db_exists from webnotes.model.doc import addchild, make_autoname from webnotes.model.bean import copy_doclist -from webnotes import msgprint - - +from webnotes import msgprint, throw, _ import datetime class DocType: @@ -19,7 +17,7 @@ class DocType: self.doclist = doclist def autoname(self): - self.doc.name = make_autoname(self.doc.fiscal_year +"/"+ self.doc.holiday_list_name+"/.###") + self.doc.name = make_autoname(self.doc.fiscal_year + "/" + self.doc.holiday_list_name + "/.###") def validate(self): self.update_default_holiday_list() @@ -38,11 +36,9 @@ class DocType: def validate_values(self): if not self.doc.fiscal_year: - msgprint("Please select Fiscal Year") - raise Exception + throw(_("Please select Fiscal Year")) if not self.doc.weekly_off: - msgprint("Please select weekly off day") - raise Exception + throw(_("Please select weekly off day")) def get_fy_start_end_dates(self): return webnotes.conn.sql("""select year_start_date, year_end_date diff --git a/erpnext/patches.txt b/erpnext/patches.txt index a1614aad0c..79644a854e 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -2,7 +2,7 @@ erpnext.patches.1401.enable_all_price_list erpnext.patches.4_0.update_user_properties erpnext.patches.4_0.move_warehouse_user_to_restrictions erpnext.patches.4_0.new_permissions - +erpnext.patches.4_0.update_incharge_name_to_sales_person_in_maintenance_schedule execute:webnotes.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-03 execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-03 execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2014-01-03 @@ -19,4 +19,4 @@ execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Modern') # 2 execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Spartan') # 2014-01-03 execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Classic') # 2014-01-03 execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Modern') # 2014-01-03 -execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Spartan') # 2014-01-03 +execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Spartan') # 2014-01-03 \ No newline at end of file diff --git a/erpnext/patches/4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py b/erpnext/patches/4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py new file mode 100644 index 0000000000..2a488f4c8f --- /dev/null +++ b/erpnext/patches/4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py @@ -0,0 +1,12 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import webnotes + +def execute(): + webnotes.reload_doc("support", "doctype", "maintenance_schedule_detail") + webnotes.reload_doc("support", "doctype", "maintenance_schedule_item") + + webnotes.conn.sql("""update `tabMaintenance Schedule Detail` set sales_person=incharge_name""") + webnotes.conn.sql("""update `tabMaintenance Schedule Item` set sales_person=incharge_name""") \ No newline at end of file diff --git a/erpnext/selling/doctype/lead/lead.js b/erpnext/selling/doctype/lead/lead.js index 41f679e34a..228d790e9e 100644 --- a/erpnext/selling/doctype/lead/lead.js +++ b/erpnext/selling/doctype/lead/lead.js @@ -7,18 +7,18 @@ wn.provide("erpnext"); erpnext.LeadController = wn.ui.form.Controller.extend({ setup: function() { - this.frm.fields_dict.customer.get_query = function(doc,cdt,cdn) { + this.frm.fields_dict.customer.get_query = function(doc, cdt, cdn) { return { query: "erpnext.controllers.queries.customer_query" } } }, onload: function() { if(cur_frm.fields_dict.lead_owner.df.options.match(/^Profile/)) { - cur_frm.fields_dict.lead_owner.get_query = function(doc,cdt,cdn) { + cur_frm.fields_dict.lead_owner.get_query = function(doc, cdt, cdn) { return { query:"webnotes.core.doctype.profile.profile.profile_query" } } } if(cur_frm.fields_dict.contact_by.df.options.match(/^Profile/)) { - cur_frm.fields_dict.contact_by.get_query = function(doc,cdt,cdn) { + cur_frm.fields_dict.contact_by.get_query = function(doc, cdt, cdn) { return { query:"webnotes.core.doctype.profile.profile.profile_query" } } } @@ -90,4 +90,4 @@ erpnext.LeadController = wn.ui.form.Controller.extend({ } }); -$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm})); \ No newline at end of file +$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm})); diff --git a/erpnext/setup/doctype/authorization_rule/authorization_rule.js b/erpnext/setup/doctype/authorization_rule/authorization_rule.js index 66b14a85ba..b814965ddd 100644 --- a/erpnext/setup/doctype/authorization_rule/authorization_rule.js +++ b/erpnext/setup/doctype/authorization_rule/authorization_rule.js @@ -1,114 +1,113 @@ // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt - - -//--------- ONLOAD ------------- -cur_frm.cscript.onload = function(doc, cdt, cdn) { - -} - // Settings Module +cur_frm.cscript.refresh = function(doc, cdt, cdn) { + if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') + hide_field('master_name'); + else + unhide_field('master_name'); -cur_frm.cscript.refresh = function(doc,cdt,cdn){ - + if (doc.based_on == 'Not Applicable') + hide_field('value'); + else + unhide_field('value'); - if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') hide_field('master_name'); - else unhide_field('master_name'); - - if(doc.based_on == 'Not Applicable') hide_field('value'); - else unhide_field('value'); - - if(doc.transaction == 'Appraisal'){ - hide_field(['master_name','system_role', 'system_user']); - unhide_field(['to_emp','to_designation']); - if(doc.transaction == 'Appraisal') hide_field('value'); - else unhide_field('value'); - } - else { - unhide_field(['master_name','system_role', 'system_user','value']); - hide_field(['to_emp','to_designation']); - } + if (doc.transaction == 'Appraisal') { + hide_field(['master_name','system_role', 'system_user']); + unhide_field(['to_emp','to_designation']); + + if (doc.transaction == 'Appraisal') + hide_field('value'); + else + unhide_field('value'); + } + else { + unhide_field(['master_name','system_role', 'system_user','value']); + hide_field(['to_emp','to_designation']); + } } -cur_frm.cscript.based_on = function(doc){ - if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable'){ - doc.master_name = ''; - refresh_field('master_name'); - hide_field('master_name'); - } - else{ - unhide_field('master_name'); - } - - if(doc.based_on == 'Not Applicable') { - doc.value =0; - refresh_field('value'); - hide_field('value'); - } - else unhide_field('value'); +cur_frm.cscript.based_on = function(doc) { + if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') { + doc.master_name = ''; + refresh_field('master_name'); + hide_field('master_name'); + } + else + unhide_field('master_name'); + + if (doc.based_on == 'Not Applicable') { + doc.value =0; + refresh_field('value'); + hide_field('value'); + } + else + unhide_field('value'); } -cur_frm.cscript.transaction = function(doc,cdt,cdn){ - if (doc.transaction == 'Appraisal'){ - doc.master_name = doc.system_role = doc.system_user = ''; - refresh_many(['master_name','system_role', 'system_user']); - hide_field(['master_name','system_role', 'system_user']); - unhide_field(['to_emp','to_designation']); - doc.value =0; - refresh_many('value'); - hide_field('value'); - } - else { - unhide_field(['master_name','system_role', 'system_user','value']); - hide_field(['to_emp','to_designation']); - } - - if(doc.transaction == 'Appraisal') doc.based_on == 'Not Applicable'; +cur_frm.cscript.transaction = function(doc, cdt, cdn){ + if (doc.transaction == 'Appraisal') { + doc.based_on == 'Not Applicable'; + doc.master_name = doc.system_role = doc.system_user = ''; + refresh_many(['master_name','system_role', 'system_user', 'based_on']); + hide_field(['master_name','system_role', 'system_user']); + unhide_field(['to_emp','to_designation']); + doc.value = 0; + refresh_many('value'); + hide_field('value'); + } + else { + unhide_field(['master_name','system_role', 'system_user','value']); + hide_field(['to_emp','to_designation']); + } + } +cur_frm.fields_dict.system_user.get_query = function(doc, cdt, cdn) { + return { query:"webnotes.core.doctype.profile.profile.profile_query" } +} -cur_frm.fields_dict.system_user.get_query = function(doc,cdt,cdn) { - return{ query:"webnotes.core.doctype.profile.profile.profile_query" } } - -cur_frm.fields_dict.approving_user.get_query = function(doc,cdt,cdn) { - return{ query:"webnotes.core.doctype.profile.profile.profile_query" } } +cur_frm.fields_dict.approving_user.get_query = function(doc, cdt, cdn) { + return { query:"webnotes.core.doctype.profile.profile.profile_query" } +} cur_frm.fields_dict['approving_role'].get_query = cur_frm.fields_dict['system_role'].get_query; // System Role Trigger // ----------------------- cur_frm.fields_dict['system_role'].get_query = function(doc) { - return{ - filters:[ - ['Role', 'name', 'not in', 'Administrator, Guest, All'] - ] - } + return { + filters:[ + ['Role', 'name', 'not in', 'Administrator, Guest, All'] + ] + } } // Master Name Trigger // -------------------- -cur_frm.fields_dict['master_name'].get_query = function(doc){ - if(doc.based_on == 'Customerwise Discount') - return { - doctype: "Customer", - filters:[ - ['Customer', 'docstatus', '!=', 2] - ] - } - else if(doc.based_on == 'Itemwise Discount') - return { - doctype: "Item", - query: "erpnext.controllers.queries.item_query" - } - else - return { - filters: [ - ['Item', 'name', '=', 'cheating done to avoid null'] - ] - } +cur_frm.fields_dict['master_name'].get_query = function(doc) { + if (doc.based_on == 'Customerwise Discount') + return { + doctype: "Customer", + filters:[ + ['Customer', 'docstatus', '!=', 2] + ] + } + else if (doc.based_on == 'Itemwise Discount') + return { + doctype: "Item", + query: "erpnext.controllers.queries.item_query" + } + else + return { + filters: [ + ['Item', 'name', '=', 'cheating done to avoid null'] + ] + } } -cur_frm.fields_dict.to_emp.get_query = function(doc,cdt,cdn) { - return{ query: "erpnext.controllers.queries.employee_query" } } \ No newline at end of file +cur_frm.fields_dict.to_emp.get_query = function(doc, cdt, cdn) { + return { query: "erpnext.controllers.queries.employee_query" } +} diff --git a/erpnext/setup/doctype/sales_person/sales_person.js b/erpnext/setup/doctype/sales_person/sales_person.js index 19c13b18a4..22f3f98bf2 100644 --- a/erpnext/setup/doctype/sales_person/sales_person.js +++ b/erpnext/setup/doctype/sales_person/sales_person.js @@ -15,15 +15,10 @@ cur_frm.cscript.set_root_readonly = function(doc) { } } - -cur_frm.cscript.onload = function(){ - -} - //get query select sales person -cur_frm.fields_dict['parent_sales_person'].get_query = function(doc,cdt,cdn) { +cur_frm.fields_dict['parent_sales_person'].get_query = function(doc, cdt, cdn) { return{ - filters:[ + filters: [ ['Sales Person', 'is_group', '=', 'Yes'], ['Sales Person', 'name', '!=', doc.sales_person_name] ] @@ -31,10 +26,11 @@ cur_frm.fields_dict['parent_sales_person'].get_query = function(doc,cdt,cdn) { } cur_frm.fields_dict['target_details'].grid.get_field("item_group").get_query = function(doc, cdt, cdn) { - return{ - filters:{ 'is_group': "No" } + return { + filters: { 'is_group': "No" } } } -cur_frm.fields_dict.employee.get_query = function(doc,cdt,cdn) { - return{ query: "erpnext.controllers.queries.employee_query" } } +cur_frm.fields_dict.employee.get_query = function(doc, cdt, cdn) { + return { query: "erpnext.controllers.queries.employee_query" } +} \ No newline at end of file diff --git a/erpnext/setup/doctype/sales_person/sales_person.py b/erpnext/setup/doctype/sales_person/sales_person.py index cf20087e04..41f461be76 100644 --- a/erpnext/setup/doctype/sales_person/sales_person.py +++ b/erpnext/setup/doctype/sales_person/sales_person.py @@ -3,10 +3,8 @@ from __future__ import unicode_literals import webnotes - from webnotes.model.bean import getlist from webnotes.utils import flt - from webnotes.utils.nestedset import DocTypeNestedSet class DocType(DocTypeNestedSet): @@ -18,8 +16,7 @@ class DocType(DocTypeNestedSet): def validate(self): for d in getlist(self.doclist, 'target_details'): if not flt(d.target_qty) and not flt(d.target_amount): - webnotes.msgprint("Either target qty or target amount is mandatory.") - raise Exception + webnotes.throw(_("Either target qty or target amount is mandatory.")) def on_update(self): super(DocType, self).on_update() @@ -28,8 +25,7 @@ class DocType(DocTypeNestedSet): def get_email_id(self): profile = webnotes.conn.get_value("Employee", self.doc.employee, "user_id") if not profile: - webnotes.msgprint("User ID (Profile) no set for Employee %s" % self.doc.employee, - raise_exception=True) + webnotes.throw("User ID (Profile) not set for Employee %s" % self.doc.employee) else: return webnotes.conn.get_value("Profile", profile, "email") or profile \ No newline at end of file diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js index 75773e07ac..2ee8b80e47 100644 --- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js +++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js @@ -5,107 +5,117 @@ wn.provide("erpnext.support"); // TODO commonify this code erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({ refresh: function() { - if (this.frm.doc.docstatus===0) { - cur_frm.add_custom_button(wn._('From Sales Order'), + var me = this; + + if (this.frm.doc.docstatus === 0) { + this.frm.add_custom_button(wn._('From Sales Order'), function() { wn.model.map_current_doc({ method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule", source_doctype: "Sales Order", get_query_filters: { docstatus: 1, - order_type: cur_frm.doc.order_type, - customer: cur_frm.doc.customer || undefined, - company: cur_frm.doc.company + order_type: me.frm.doc.order_type, + customer: me.frm.doc.customer || undefined, + company: me.frm.doc.company } - }) + }); }); - } else if (this.frm.doc.docstatus===1) { - cur_frm.add_custom_button(wn._("Make Maintenance Visit"), function() { + } else if (this.frm.doc.docstatus === 1) { + this.frm.add_custom_button(wn._("Make Maintenance Visit"), function() { wn.model.open_mapped_doc({ method: "erpnext.support.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit", - source_name: cur_frm.doc.name + source_name: me.frm.doc.name }) - }) + }); } }, customer: function() { var me = this; if(this.frm.doc.customer) { return this.frm.call({ - doc: this.frm.doc, + doc: me.frm.doc, method: "set_customer_defaults", }); - } - }, + } + }, }); $.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm})); cur_frm.cscript.onload = function(doc, dt, dn) { - if(!doc.status) set_multiple(dt,dn,{status:'Draft'}); - - if(doc.__islocal){ - set_multiple(dt,dn,{transaction_date:get_today()}); - hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); - } + if (!doc.status) + set_multiple(dt, dn, { status:'Draft' }); + + if (doc.__islocal) { + set_multiple(dt, dn, { transaction_date:get_today() }); + hide_field(['customer_address', 'contact_person', 'customer_name', 'address_display', + 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']); + } } -cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { - if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); +cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc, dt, dn) { + if (doc.customer) { + return get_server_fields('get_customer_address', + JSON.stringify({customer: doc.customer, address: doc.customer_address, + contact: doc.contact_person}), '', doc, dt, dn, 1); + } } cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) { - return{ - filters:{ 'customer': doc.customer} - } + return { + filters:{ 'customer': doc.customer } + } } cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { - return{ - filters:{ 'customer': doc.customer} - } + return { + filters:{ 'customer': doc.customer } + } } // cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) { - return{ - filters:{ 'is_service_item': "Yes"} - } + return { + filters:{ 'is_service_item': "Yes" } + } } cur_frm.cscript.item_code = function(doc, cdt, cdn) { - var fname = cur_frm.cscript.fname; - var d = locals[cdt][cdn]; - if (d.item_code) { - return get_server_fields('get_item_details',d.item_code, 'item_maintenance_detail',doc,cdt,cdn,1); - } + var fname = cur_frm.cscript.fname; + var d = locals[cdt][cdn]; + if (d.item_code) { + return get_server_fields('get_item_details', d.item_code, 'item_maintenance_detail', + doc, cdt, cdn, 1); + } } cur_frm.cscript.periodicity = function(doc, cdt, cdn){ - var d = locals[cdt][cdn]; - if(d.start_date && d.end_date){ - arg = {} - arg.start_date = d.start_date; - arg.end_date = d.end_date; - arg.periodicity = d.periodicity; - return get_server_fields('get_no_of_visits',docstring(arg),'item_maintenance_detail',doc, cdt, cdn, 1); - } - else{ - msgprint(wn._("Please enter Start Date and End Date")); - } + var d = locals[cdt][cdn]; + if(d.start_date && d.end_date) { + arg = {} + arg.start_date = d.start_date; + arg.end_date = d.end_date; + arg.periodicity = d.periodicity; + return get_server_fields('get_no_of_visits', docstring(arg), + 'item_maintenance_detail', doc, cdt, cdn, 1); + } else { + msgprint(wn._("Please enter Start Date and End Date")); + } } cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) { - if (!doc.__islocal) { - return $c('runserverobj', args={'method':'generate_schedule', 'docs':wn.model.compress(make_doclist(cdt,cdn))}, - function(r,rt){ - refresh_field('maintenance_schedule_detail'); - } - ); - } else { - alert(wn._("Please save the document before generating maintenance schedule")); - } + if (!doc.__islocal) { + return $c('runserverobj', args={'method':'generate_schedule', + 'docs':wn.model.compress(make_doclist(cdt,cdn))}, + function(r, rt) { + refresh_field('maintenance_schedule_detail'); + }); + } else { + msgprint(wn._("Please save the document before generating maintenance schedule")); + } } cur_frm.fields_dict.customer.get_query = function(doc,cdt,cdn) { - return{ query: "erpnext.controllers.queries.customer_query" } } + return { query: "erpnext.controllers.queries.customer_query" } +} diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py index 8263b19667..8f75247d1f 100644 --- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py +++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py @@ -4,13 +4,10 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import add_days, cstr, getdate +from webnotes.utils import add_days, cstr, getdate, cint from webnotes.model.doc import addchild from webnotes.model.bean import getlist -from webnotes import msgprint - - - +from webnotes import msgprint, throw, _ from erpnext.utilities.transaction_base import TransactionBase, delete_events class DocType(TransactionBase): @@ -19,7 +16,8 @@ class DocType(TransactionBase): self.doclist = doclist def get_item_details(self, item_code): - item = webnotes.conn.sql("select item_name, description from `tabItem` where name = '%s'" %(item_code), as_dict=1) + item = webnotes.conn.sql("""select item_name, description from `tabItem` + where name=%s""", (item_code), as_dict=1) ret = { 'item_name': item and item[0]['item_name'] or '', 'description' : item and item[0]['description'] or '' @@ -28,13 +26,14 @@ class DocType(TransactionBase): def generate_schedule(self): self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail') - count = 0 - webnotes.conn.sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name)) + webnotes.conn.sql("""delete from `tabMaintenance Schedule Detail` + where parent=%s""", (self.doc.name)) + count = 1 for d in getlist(self.doclist, 'item_maintenance_detail'): self.validate_maintenance_detail() - s_list =[] - s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits) - for i in range(d.no_of_visits): + s_list = [] + s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits, d.sales_person) + for i in range(d.no_of_visits): child = addchild(self.doc, 'maintenance_schedule_detail', 'Maintenance Schedule Detail', self.doclist) child.item_code = d.item_code @@ -43,40 +42,39 @@ class DocType(TransactionBase): if d.serial_no: child.serial_no = d.serial_no child.idx = count - count = count+1 - child.incharge_name = d.incharge_name + count = count + 1 + child.sales_person = d.sales_person child.save(1) self.on_update() def on_submit(self): if not getlist(self.doclist, 'maintenance_schedule_detail'): - msgprint("Please click on 'Generate Schedule' to get schedule") - raise Exception + throw("Please click on 'Generate Schedule' to get schedule") self.check_serial_no_added() self.validate_serial_no_warranty() self.validate_schedule() - email_map ={} + email_map = {} for d in getlist(self.doclist, 'item_maintenance_detail'): if d.serial_no: self.update_amc_date(d.serial_no, d.end_date) - if d.incharge_name not in email_map: - email_map[d.incharge_name] = webnotes.bean("Sales Person", - d.incharge_name).run_method("get_email_id") + if d.sales_person not in email_map: + sp = webnotes.bean("Sales Person", d.sales_person).make_controller() + email_map[d.sales_person] = sp.get_email_id() - scheduled_date =webnotes.conn.sql("select scheduled_date from `tabMaintenance Schedule Detail` \ - where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \ - d.item_code, self.doc.name), as_dict=1) + scheduled_date = webnotes.conn.sql("""select scheduled_date from + `tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and + parent=%s""", (d.sales_person, d.item_code, self.doc.name), as_dict=1) for key in scheduled_date: - if email_map[d.incharge_name]: + if email_map[d.sales_person]: description = "Reference: %s, Item Code: %s and Customer: %s" % \ (self.doc.name, d.item_code, self.doc.customer) webnotes.bean({ "doctype": "Event", - "owner": email_map[d.incharge_name] or self.doc.owner, + "owner": email_map[d.sales_person] or self.doc.owner, "subject": description, "description": description, "starts_on": key["scheduled_date"] + " 10:00:00", @@ -89,92 +87,121 @@ class DocType(TransactionBase): #get schedule dates #---------------------- - def create_schedule_list(self, start_date, end_date, no_of_visit): + def create_schedule_list(self, start_date, end_date, no_of_visit, sales_person): schedule_list = [] - start_date1 = start_date + start_date_copy = start_date date_diff = (getdate(end_date) - getdate(start_date)).days - add_by = date_diff/no_of_visit - #schedule_list.append(start_date1) - while(getdate(start_date1) < getdate(end_date)): - start_date1 = add_days(start_date1, add_by) - if len(schedule_list) < no_of_visit: - schedule_list.append(getdate(start_date1)) + add_by = date_diff / no_of_visit + + for visit in range(cint(no_of_visit)): + if (getdate(start_date_copy) < getdate(end_date)): + start_date_copy = add_days(start_date_copy, add_by) + if len(schedule_list) < no_of_visit: + schedule_date = self.validate_schedule_date_for_holiday_list(getdate(start_date_copy), + sales_person) + if schedule_date > getdate(end_date): + schedule_date = getdate(end_date) + schedule_list.append(schedule_date) + return schedule_list - + + def validate_schedule_date_for_holiday_list(self, schedule_date, sales_person): + from erpnext.accounts.utils import get_fiscal_year + validated = False + fy_details = "" + + try: + fy_details = get_fiscal_year(date=schedule_date, verbose=0) + except Exception: + pass + + if fy_details and fy_details[0]: + # check holiday list in employee master + holiday_list = webnotes.conn.sql_list("""select h.holiday_date from `tabEmployee` emp, + `tabSales Person` sp, `tabHoliday` h, `tabHoliday List` hl + where sp.name=%s and emp.name=sp.employee + and hl.name=emp.holiday_list and + h.parent=hl.name and + hl.fiscal_year=%s""", (sales_person, fy_details[0])) + if not holiday_list: + # check global holiday list + holiday_list = webnotes.conn.sql("""select h.holiday_date from + `tabHoliday` h, `tabHoliday List` hl + where h.parent=hl.name and ifnull(hl.is_default, 0) = 1 + and hl.fiscal_year=%s""", fy_details[0]) + + if not validated and holiday_list: + if schedule_date in holiday_list: + schedule_date = add_days(schedule_date, -1) + else: + validated = True + + return schedule_date + #validate date range and periodicity selected #------------------------------------------------- def validate_period(self, arg): - arg1 = eval(arg) - if getdate(arg1['start_date']) >= getdate(arg1['end_date']): - msgprint("Start date should be less than end date ") - raise Exception - - period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1 - - if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365: - msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only") - raise Exception - elif arg1['periodicity']=='Monthly' and period<30: - msgprint("Monthly periodicity can be set for period of atleast 1 month or more") - raise Exception - elif arg1['periodicity']=='Weekly' and period<7: - msgprint("Weekly periodicity can be set for period of atleast 1 week or more") - raise Exception + args = eval(arg) + if getdate(args['start_date']) >= getdate(args['end_date']): + throw(_("Start date should be less than end date.")) + + period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1 + + if (args['periodicity'] == 'Yearly' or args['periodicity'] == 'Half Yearly' or + args['periodicity'] == 'Quarterly') and period < 365: + throw(cstr(args['periodicity']) + " periodicity can be set for period of atleast 1 year or more only") + elif args['periodicity'] == 'Monthly' and period < 30: + throw("Monthly periodicity can be set for period of atleast 1 month or more") + elif args['periodicity'] == 'Weekly' and period < 7: + throw("Weekly periodicity can be set for period of atleast 1 week or more") def get_no_of_visits(self, arg): - arg1 = eval(arg) + args = eval(arg) self.validate_period(arg) - period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1 - - count =0 - if arg1['periodicity'] == 'Weekly': + period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1 + count = 0 + + if args['periodicity'] == 'Weekly': count = period/7 - elif arg1['periodicity'] == 'Monthly': + elif args['periodicity'] == 'Monthly': count = period/30 - elif arg1['periodicity'] == 'Quarterly': + elif args['periodicity'] == 'Quarterly': count = period/91 - elif arg1['periodicity'] == 'Half Yearly': + elif args['periodicity'] == 'Half Yearly': count = period/182 - elif arg1['periodicity'] == 'Yearly': + elif args['periodicity'] == 'Yearly': count = period/365 - ret = {'no_of_visits':count} + ret = {'no_of_visits' : count} return ret - - def validate_maintenance_detail(self): if not getlist(self.doclist, 'item_maintenance_detail'): - msgprint("Please enter Maintaince Details first") - raise Exception + throw(_("Please enter Maintaince Details first")) for d in getlist(self.doclist, 'item_maintenance_detail'): if not d.item_code: - msgprint("Please select item code") - raise Exception + throw(_("Please select item code")) elif not d.start_date or not d.end_date: - msgprint("Please select Start Date and End Date for item "+d.item_code) - raise Exception + throw(_("Please select Start Date and End Date for item") + " " + d.item_code) elif not d.no_of_visits: - msgprint("Please mention no of visits required") - raise Exception - elif not d.incharge_name: - msgprint("Please select Incharge Person's name") - raise Exception + throw(_("Please mention no of visits required")) + elif not d.sales_person: + throw(_("Please select Incharge Person's name")) if getdate(d.start_date) >= getdate(d.end_date): - msgprint("Start date should be less than end date for item "+d.item_code) - raise Exception + throw(_("Start date should be less than end date for item") + " " + d.item_code) #check if maintenance schedule already created against same sales order #----------------------------------------------------------------------------------- def validate_sales_order(self): for d in getlist(self.doclist, 'item_maintenance_detail'): if d.prevdoc_docname: - chk = webnotes.conn.sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", d.prevdoc_docname) + chk = webnotes.conn.sql("""select ms.name from `tabMaintenance Schedule` ms, + `tabMaintenance Schedule Item` msi where msi.parent=ms.name and + msi.prevdoc_docname=%s and ms.docstatus=1""", d.prevdoc_docname) if chk: - msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist") - raise Exception + throw("Maintenance Schedule against " + d.prevdoc_docname + " already exist") def validate_serial_no(self): @@ -185,13 +212,13 @@ class DocType(TransactionBase): cur_s_no = cur_serial_no.split(',') for x in cur_s_no: - chk = webnotes.conn.sql("select name, status from `tabSerial No` where docstatus!=2 and name=%s", (x)) + chk = webnotes.conn.sql("""select name, status from `tabSerial No` + where docstatus!=2 and name=%s""", (x)) chk1 = chk and chk[0][0] or '' status = chk and chk[0][1] or '' if not chk1: - msgprint("Serial no "+x+" does not exist in system.") - raise Exception + throw("Serial no " + x + " does not exist in system.") def validate(self): self.validate_maintenance_detail() @@ -208,13 +235,13 @@ class DocType(TransactionBase): cur_s_no = cur_serial_no.split(',') for x in cur_s_no: - dt = webnotes.conn.sql("select delivery_date from `tabSerial No` where name = %s", x) + dt = webnotes.conn.sql("""select delivery_date from `tabSerial No` + where name=%s""", x) dt = dt and dt[0][0] or '' if dt: if dt > getdate(d.start_date): - msgprint("Maintenance start date can not be before delivery date "+dt.strftime('%Y-%m-%d')+" for serial no "+x) - raise Exception + throw("Maintenance start date can not be before delivery date " + dt.strftime('%Y-%m-%d') + " for serial no " + x) #update amc expiry date in serial no #------------------------------------------ @@ -224,7 +251,8 @@ class DocType(TransactionBase): cur_s_no = cur_serial_no.split(',') for x in cur_s_no: - webnotes.conn.sql("update `tabSerial No` set amc_expiry_date = '%s', maintenance_status = 'Under AMC' where name = '%s'"% (amc_end_date,x)) + webnotes.conn.sql("""update `tabSerial No` set amc_expiry_date=%s, + maintenance_status='Under AMC' where name=%s""", (amc_end_date, x)) def on_update(self): webnotes.conn.set(self.doc, 'status', 'Draft') @@ -233,16 +261,16 @@ class DocType(TransactionBase): for d in getlist(self.doclist, 'item_maintenance_detail'): if cstr(d.serial_no).strip(): dt = webnotes.conn.sql("""select warranty_expiry_date, amc_expiry_date - from `tabSerial No` where name = %s""", d.serial_no, as_dict=1) + from `tabSerial No` where name=%s""", d.serial_no, as_dict=1) if dt[0]['warranty_expiry_date'] and dt[0]['warranty_expiry_date'] >= d.start_date: - webnotes.msgprint("""Serial No: %s is already under warranty upto %s. + throw("""Serial No: %s is already under warranty upto %s. Please check AMC Start Date.""" % - (d.serial_no, dt[0]["warranty_expiry_date"]), raise_exception=1) + (d.serial_no, dt[0]["warranty_expiry_date"])) if dt[0]['amc_expiry_date'] and dt[0]['amc_expiry_date'] >= d.start_date: - webnotes.msgprint("""Serial No: %s is already under AMC upto %s. + throw("""Serial No: %s is already under AMC upto %s. Please check AMC Start Date.""" % - (d.serial_no, dt[0]["amc_expiry_date"]), raise_exception=1) + (d.serial_no, dt[0]["amc_expiry_date"])) def validate_schedule(self): item_lst1 =[] @@ -256,13 +284,11 @@ class DocType(TransactionBase): item_lst2.append(m.item_code) if len(item_lst1) != len(item_lst2): - msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'") - raise Exception + throw("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'") else: for x in item_lst1: if x not in item_lst2: - msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'") - raise Exception + throw("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'") #check if serial no present in item maintenance table #----------------------------------------------------------- @@ -275,18 +301,15 @@ class DocType(TransactionBase): for m in getlist(self.doclist, 'maintenance_schedule_detail'): if serial_present: if m.item_code in serial_present and not m.serial_no: - msgprint("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code) - raise Exception - - - + throw("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code) + def on_cancel(self): for d in getlist(self.doclist, 'item_maintenance_detail'): if d.serial_no: self.update_amc_date(d.serial_no, '') webnotes.conn.set(self.doc, 'status', 'Cancelled') delete_events(self.doc.doctype, self.doc.name) - + def on_trash(self): delete_events(self.doc.doctype, self.doc.name) @@ -313,7 +336,7 @@ def make_maintenance_visit(source_name, target_doclist=None): "field_map": { "parent": "prevdoc_docname", "parenttype": "prevdoc_doctype", - "incharge_name": "service_person" + "sales_person": "service_person" } } }, target_doclist) diff --git a/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.txt b/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.txt index 8b52d8b671..8ed6856d24 100644 --- a/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.txt +++ b/erpnext/support/doctype/maintenance_schedule_detail/maintenance_schedule_detail.txt @@ -2,7 +2,7 @@ { "creation": "2013-02-22 01:28:05", "docstatus": 0, - "modified": "2013-12-20 19:23:20", + "modified": "2013-12-31 12:13:38", "modified_by": "Administrator", "owner": "Administrator" }, @@ -52,6 +52,7 @@ "search_index": 0 }, { + "allow_on_submit": 0, "doctype": "DocField", "fieldname": "scheduled_date", "fieldtype": "Date", @@ -78,12 +79,13 @@ "report_hide": 1 }, { + "allow_on_submit": 0, "doctype": "DocField", - "fieldname": "incharge_name", + "fieldname": "sales_person", "fieldtype": "Link", "in_filter": 1, "in_list_view": 1, - "label": "Incharge Name", + "label": "Sales Person", "oldfieldname": "incharge_name", "oldfieldtype": "Link", "options": "Sales Person", diff --git a/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.txt b/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.txt index f42b48bf55..43d281d9e6 100644 --- a/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.txt +++ b/erpnext/support/doctype/maintenance_schedule_item/maintenance_schedule_item.txt @@ -2,7 +2,7 @@ { "creation": "2013-02-22 01:28:05", "docstatus": 0, - "modified": "2013-12-20 19:23:20", + "modified": "2013-12-31 12:08:32", "modified_by": "Administrator", "owner": "Administrator" }, @@ -112,10 +112,10 @@ }, { "doctype": "DocField", - "fieldname": "incharge_name", + "fieldname": "sales_person", "fieldtype": "Link", "in_filter": 1, - "label": "Sales Person Incharge", + "label": "Sales Person", "oldfieldname": "incharge_name", "oldfieldtype": "Link", "options": "Sales Person", diff --git a/erpnext/support/report/maintenance_schedules/maintenance_schedules.txt b/erpnext/support/report/maintenance_schedules/maintenance_schedules.txt index 766eb20151..eec3d7f852 100644 --- a/erpnext/support/report/maintenance_schedules/maintenance_schedules.txt +++ b/erpnext/support/report/maintenance_schedules/maintenance_schedules.txt @@ -2,7 +2,7 @@ { "creation": "2013-05-06 14:25:21", "docstatus": 0, - "modified": "2013-10-09 12:23:27", + "modified": "2013-12-31 12:24:48", "modified_by": "Administrator", "owner": "Administrator" }, @@ -10,7 +10,7 @@ "doctype": "Report", "is_standard": "Yes", "name": "__common__", - "query": "SELECT\n ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.incharge_name as \"Incharge::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n `tabMaintenance Schedule Detail` ms_sch, \n `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc", + "query": "SELECT\n ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.sales_person as \"Sales Person::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n `tabMaintenance Schedule Detail` ms_sch, \n `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc", "ref_doctype": "Maintenance Schedule", "report_name": "Maintenance Schedules", "report_type": "Query Report"