Merge branch 'shf_rename' of github.com:webnotes/erpnext into shf_rename
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index f11ec0c..2ba86e6 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -136,7 +136,7 @@
# check if child exists
# ==================================================================
def check_if_child_exists(self):
- return sql("select name from `tabAccount` where parent_account = %s and docstatus != 2", self.doc.name, debug=0)
+ return sql("select name from `tabAccount` where parent_account = %s and docstatus != 2", self.doc.name)
# Update balance
# ==================================================================
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index 559779e..c3c3a38 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.js
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.js
@@ -130,16 +130,6 @@
return 'SELECT DISTINCT `tabPurchase Request`.`name` FROM `tabPurchase Request` WHERE `tabPurchase Request`.company = "' + doc.company + '" and `tabPurchase Request`.`docstatus` = 1 and `tabPurchase Request`.`status` != "Stopped" and ifnull(`tabPurchase Request`.`per_ordered`,0) < 100 and `tabPurchase Request`.%(key)s LIKE "%s" ORDER BY `tabPurchase Request`.`name` DESC LIMIT 50';
}
-/*
-//*********** get approved supplier quotation ********************
-cur_frm.fields_dict['supplier_qtn'].get_query = function(doc) {
- var cond='';
- if(doc.supplier) cond = 'ifnull(`tabSupplier Quotation`.supplier, "") = "'+doc.supplier+'" and';
-
- return repl('SELECT DISTINCT `tabSupplier Quotation`.`name` FROM `tabSupplier Quotation` WHERE `tabSupplier Quotation`.company = "%(company)s" and`tabSupplier Quotation`.`docstatus` = 1 and `tabSupplier Quotation`.`approval_status` = "Approved" and %(cond)s `tabSupplier Quotation`.%(key)s LIKE "%s" ORDER BY `tabSupplier Quotation`.`name` DESC LIMIT 50', {company:doc.company,cond:cond});
-}
-*/
-
//========================= Get Last Purhase Rate =====================================
cur_frm.cscript.get_last_purchase_rate = function(doc, cdt, cdn){
diff --git a/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py b/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py
index a2105c3..6f51942 100644
--- a/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py
+++ b/erpnext/hr/doctype/attendance_control_panel/attendance_control_panel.py
@@ -8,11 +8,11 @@
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Please edit this list and import only required elements
import webnotes
@@ -34,89 +34,85 @@
class DocType:
- def __init__(self,d,dt):
- self.doc, self.doclist = d,dt
-
- #==========================================================================
- def get_att_list(self):
-
- lst = [['Attendance','','','Please fill columns which are Mandatory.',' Please do not modify the structure','',''],['','','','','','',''],['[Mandatory]','','[Mandatory]','[Mandatory]','[Mandatory]','[Mandatory]','[Mandatory]'],['Employee','Employee Name','Attendance Date','Status','Fiscal Year','Company','Naming Series']]
-
- dt = self.date_diff_list() # get date list inbetween from date and to date
-
- att_dt = self.get_att_data() # get default attendance data like fiscal yr, company, naming series
-
- fy, comp, sr = att_dt['fy'], att_dt['comp'], att_dt['sr']
-
- res = sql("select name, employee_name from `tabEmployee` where status = 'Active' and docstatus !=2")
-
- for d in dt:
- for r in res:
- lst.append([r[0],r[1],d,'',fy,comp,sr])
+ def __init__(self,d,dt):
+ self.doc, self.doclist = d,dt
+
+ #==========================================================================
+ def get_att_list(self):
+ lst = [['Attendance','','','Please fill columns which are Mandatory.',' Please do not modify the structure','',''],['','','','','','',''],['[Mandatory]','','[Mandatory]','[Mandatory]','[Mandatory]','[Mandatory]','[Mandatory]'],['Employee','Employee Name','Attendance Date','Status','Fiscal Year','Company','Naming Series']]
+
+ dt = self.date_diff_list() # get date list inbetween from date and to date
+ att_dt = self.get_att_data() # get default attendance data like fiscal yr, company, naming series
+
+ fy, comp, sr = att_dt['fy'], att_dt['comp'], att_dt['sr']
+ res = sql("select name, employee_name from `tabEmployee` where status = 'Active' and docstatus !=2")
+
+ for d in dt:
+ for r in res:
+ lst.append([r[0],r[1],d,'',fy,comp,sr])
- return lst
-
- #------------------------------------------------------------------------------
- # get date list inbetween from date and to date
- def date_diff_list(self):
- import datetime
- #get from date
- att_fr_date = self.doc.att_fr_date and self.doc.att_fr_date or ''
-
- #get to date
- att_to_date = self.doc.att_to_date and self.doc.att_to_date or ''
+ return lst
+
+ #------------------------------------------------------------------------------
+ # get date list inbetween from date and to date
+ def date_diff_list(self):
+ import datetime
+ #get from date
+ att_fr_date = self.doc.att_fr_date and self.doc.att_fr_date or ''
+
+ #get to date
+ att_to_date = self.doc.att_to_date and self.doc.att_to_date or ''
- if att_to_date:
- r = (getdate(self.doc.att_to_date)+datetime.timedelta(days=1)-getdate(self.doc.att_fr_date)).days
- else:
- r = 1
- dateList = [getdate(self.doc.att_fr_date)+datetime.timedelta(days=i) for i in range(0,r)]
- dt=([str(date) for date in dateList])
-
- return dt
+ if att_to_date:
+ r = (getdate(self.doc.att_to_date)+datetime.timedelta(days=1)-getdate(self.doc.att_fr_date)).days
+ else:
+ r = 1
+ dateList = [getdate(self.doc.att_fr_date)+datetime.timedelta(days=i) for i in range(0,r)]
+ dt=([str(date) for date in dateList])
+
+ return dt
- #------------------------------------------------------------------------------
- def get_att_data(self):
-
- fy = get_defaults()['fiscal_year'] #get default fiscal year
+ #------------------------------------------------------------------------------
+ def get_att_data(self):
+ fy = get_defaults()['fiscal_year'] #get default fiscal year
+ comp = get_defaults()['company'] #get default company
+
+ #get naming series of attendance
+ import webnotes.model.doctype
+ docfield = webnotes.model.doctype.get('Attendance')
+ series = [d.options for d in docfield if d.doctype == 'DocField' and d.fieldname == 'naming_series']
+ if not series:
+ msgprint("Please create naming series for Attendance.\nGo to Setup--> Numbering Series.")
+ raise Exception
+ else:
+ sr = series[0][0] or ''
+
+ return {'fy':fy,'comp':comp,'sr':sr}
- comp = get_defaults()['company'] #get default company
-
- #get naming series of attendance
- #sr = sql("select series_options from `tabNaming Series Options` where doc_type='Attendance'")
- sr = sql("select options from `tabDocField` where parent = 'Attendance' and fieldname = 'naming_series'")
- if not sr:
- msgprint("Please create naming series for Attendance.\nGo to Setup--> Manage Series.")
- raise Exception
- else:
- sr = sr and sr[0][0]
-
- return {'fy':fy,'comp':comp,'sr':sr}
+ #=================================================================================
+ def import_att_data(self):
+ filename = self.doc.file_list.split(',')
- #=================================================================================
- def import_att_data(self):
- filename = self.doc.file_list.split(',')
-
- if not filename:
- msgprint("Please attach a .CSV File.")
- raise Exception
-
- if filename[0].find('.csv') < 0:
- raise Exception
-
- if not filename and filename[0] and file[1]:
- msgprint("Please Attach File. ")
- raise Exception
-
- from webnotes.utils import file_manager
- fn, content = file_manager.get_file(filename[1])
+ if not filename:
+ msgprint("Please attach a .CSV File.")
+ raise Exception
+
+ if filename[0].find('.csv') < 0:
+ raise Exception
+
+ if not filename and filename[0] and file[1]:
+ msgprint("Please Attach File. ")
+ raise Exception
+
+ from webnotes.utils import file_manager
+ fn, content = file_manager.get_file(filename[1])
# NOTE: Don't know why this condition exists
- if not isinstance(content, basestring) and hasattr(content, 'tostring'):
- content = content.tostring()
+ if not isinstance(content, basestring) and hasattr(content, 'tostring'):
+ content = content.tostring()
- import webnotes.model.import_docs
- im = webnotes.model.import_docs.CSVImport()
- out = im.import_csv(content,self.doc.import_date_format, cint(self.doc.overwrite))
- return out
+ import webnotes.model.import_docs
+ im = webnotes.model.import_docs.CSVImport()
+ out = im.import_csv(content,self.doc.import_date_format, cint(self.doc.overwrite))
+ return out
diff --git a/erpnext/selling/doctype/lead/lead.py b/erpnext/selling/doctype/lead/lead.py
index e097a4c..4a17a03 100644
--- a/erpnext/selling/doctype/lead/lead.py
+++ b/erpnext/selling/doctype/lead/lead.py
@@ -8,11 +8,11 @@
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Please edit this list and import only required elements
import webnotes
@@ -34,195 +34,169 @@
class DocType:
- def __init__(self, doc, doclist):
- self.doc = doc
- self.doclist = doclist
-
- # Autoname
- # ---------
- def autoname(self):
- self.doc.name = make_autoname(self.doc.naming_series+'.#####')
-
- #check status of lead
- #------------------------
- def check_status(self):
- chk = sql("select status from `tabLead` where name=%s", self.doc.name)
- chk = chk and chk[0][0] or ''
- return cstr(chk)
+ def __init__(self, doc, doclist):
+ self.doc = doc
+ self.doclist = doclist
+
+ # Autoname
+ # ---------
+ def autoname(self):
+ self.doc.name = make_autoname(self.doc.naming_series+'.#####')
+
+ #check status of lead
+ #------------------------
+ def check_status(self):
+ chk = sql("select status from `tabLead` where name=%s", self.doc.name)
+ chk = chk and chk[0][0] or ''
+ return cstr(chk)
- # Gets states belonging cto country selected
- # =====================================================================
- #def check_state(self):
- # return "\n" + "\n".join([i[0] for i in sql("select state_name from `tabState` where `tabState`.country='%s' " % self.doc.country)])
-
- # Get item detail (will be removed later)
- #=======================================
- def get_item_detail(self,item_code):
- it=sql("select item_name,brand,item_group,description,stock_uom from `tabItem` where name='%s'"%item_code)
- if it:
- ret = {
- 'item_name' : it and it[0][0] or '',
- 'brand' : it and it[0][1] or '',
- 'item_group' : it and it[0][2] or '',
- 'description': it and it[0][3] or '',
- 'uom' : it and it[0][4] or ''
- }
- return ret
-
- def validate(self):
- import string
- # Get Address
- # ======================================================================
- #if (self.doc.address_line1) or (self.doc.address_line2) or (self.doc.city) or (self.doc.state) or (self.doc.country) or (self.doc.pincode):
- # address =["address_line1", "address_line2", "city", "state", "country", "pincode"]
- # comp_address=''
- # for d in address:
- # if self.doc.fields[d]:
- # comp_address += self.doc.fields[d] + "\n"
- # if self.doc.website:
- # comp_address += "Website : "+ self.doc.website
- # self.doc.address = comp_address
-
- if self.doc.status == 'Lead Lost' and not self.doc.order_lost_reason:
- msgprint("Please Enter Quotation Lost Reason")
- raise Exception
-
- if self.doc.source == 'Campaign' and not self.doc.campaign_name and session['user'] != 'Guest':
- msgprint("Please specify campaign name")
- raise Exception
-
- if self.doc.email_id:
- if not validate_email_add(self.doc.email_id):
- msgprint('Please enter valid email id.')
- raise Exception
-
- if not self.doc.naming_series:
- if session['user'] == 'Guest':
- so = sql("select options from `tabDocField` where parent = 'Lead' and fieldname = 'naming_series'")
- #so = sql("select series_options from `tabNaming Series Options` where doc_type='Lead'")
- if so:
- sr = so[0][0].split("\n")
- set(self.doc, 'naming_series', sr[0])
- else:
- msgprint("Please specify naming series")
- raise Exception
-
- def on_update(self):
- # Add to calendar
- # ========================================================================
- if self.doc.contact_by:
- self.add_calendar_event()
-
- if session['user'] == 'Guest':
- if self.doc.email_id:
- self.send_email_notification()
-
- if not self.doc.naming_series:
- if session['user'] == 'Guest':
- #so = sql("select series_options from `tabNaming Series Options` where doc_type='Lead'")
- so = sql("select options from `tabDocField` where parent = 'Lead' and fieldname = 'naming_series'")
- if so:
- sr = so[0][0].split("\n")
- set(self.doc, 'naming_series', sr[0])
- else:
- msgprint("Please specify naming series")
- raise Exception
-
- def send_email_notification(self):
- if not validate_email_add(self.doc.email_id.strip(' ')):
- msgprint('error:%s is not a valid email id' % self.doc.email_id.strip(' '))
- raise Exception
- else:
- subject = 'Thank you for interest in erpnext'
-
- sendmail([self.doc.email_id.strip(' ')], sender = sender_email[0][0], subject = subject , parts = [['text/html', self.get_notification_msg()]])
- #sendmail(cc_list, sender = sender_email[0][0], subject = subject , parts = [['text/html', message]],attach=attach_list)
- msgprint("Mail Sent")
-
- def get_notification_msg(self):
- t = """
-<html>
-<body>
-Dear %s,<br><br>
-Thank you for contacting us.<br><br>
+ # Get item detail (will be removed later)
+ #=======================================
+ def get_item_detail(self,item_code):
+ it=sql("select item_name,brand,item_group,description,stock_uom from `tabItem` where name='%s'"%item_code)
+ if it:
+ ret = {
+ 'item_name' : it and it[0][0] or '',
+ 'brand' : it and it[0][1] or '',
+ 'item_group' : it and it[0][2] or '',
+ 'description': it and it[0][3] or '',
+ 'uom' : it and it[0][4] or ''
+ }
+ return ret
+
+ def validate(self):
+ import string
+ if self.doc.status == 'Lead Lost' and not self.doc.order_lost_reason:
+ msgprint("Please Enter Quotation Lost Reason")
+ raise Exception
+
+ if self.doc.source == 'Campaign' and not self.doc.campaign_name and session['user'] != 'Guest':
+ msgprint("Please specify campaign name")
+ raise Exception
+
+ if self.doc.email_id:
+ if not validate_email_add(self.doc.email_id):
+ msgprint('Please enter valid email id.')
+ raise Exception
+
+
+ def on_update(self):
+ # Add to calendar
+ # ========================================================================
+ if self.doc.contact_by:
+ self.add_calendar_event()
+
+ if session['user'] == 'Guest':
+ if self.doc.email_id:
+ self.send_email_notification()
+
+ if not self.doc.naming_series:
+ if session['user'] == 'Guest':
+ import webnotes.model.doctype
+ docfield = webnotes.model.doctype.get('Lead')
+ series = [d.options for d in docfield if d.doctype == 'DocField' and d.fieldname == 'naming_series']
+ if series:
+ sr = series[0].split("\n")
+ set(self.doc, 'naming_series', sr[0])
+ else:
+ msgprint("Please specify naming series")
+ raise Exception
+
+ def send_email_notification(self):
+ if not validate_email_add(self.doc.email_id.strip(' ')):
+ msgprint('error:%s is not a valid email id' % self.doc.email_id.strip(' '))
+ raise Exception
+ else:
+ subject = 'Thank you for interest in erpnext'
+
+ sendmail([self.doc.email_id.strip(' ')], sender = sender_email[0][0], subject = subject , parts = [['text/html', self.get_notification_msg()]])
+ msgprint("Mail Sent")
+
+ def get_notification_msg(self):
+ t = """
+ <html>
+ <body>
+ Dear %s,<br><br>
-You have left following message for us,<br>
-%s
-<br><br>
+ Thank you for contacting us.<br><br>
-You will receive reply on this shortly.<br><br>
+ You have left following message for us,<br>
+ %s
+ <br><br>
-Cheers!
-</body>
-</html>
-""" % (self.doc.lead_name, self.doc.remark)
+ You will receive reply on this shortly.<br><br>
- return t
+ Cheers!
+ </body>
+ </html>
+ """ % (self.doc.lead_name, self.doc.remark)
- # Add to Calendar
- # ===========================================================================
- def add_calendar_event(self):
- # delete any earlier event by this lead
- sql("delete from tabEvent where ref_type='Lead' and ref_name=%s", self.doc.name)
-
- in_calendar_of = self.doc.lead_owner
-
- # get profile (id) if exists for contact_by
- email_id = webnotes.conn.get_value('Sales Person', self.doc.contact_by, 'email_id')
- if webnotes.conn.exists('Profile', email_id):
- in_calendar_of = email_id
-
- ev = Document('Event')
- ev.owner = in_calendar_of
- ev.description = 'Contact ' + cstr(self.doc.lead_name) + '.By : ' + cstr(self.doc.contact_by) + '.To Discuss : ' + cstr(self.doc.remark)
- ev.event_date = self.doc.contact_date
- ev.event_hour = '10:00'
- ev.event_type = 'Private'
- ev.ref_type = 'Lead'
- ev.ref_name = self.doc.name
- ev.save(1)
+ return t
+
+ # Add to Calendar
+ # ===========================================================================
+ def add_calendar_event(self):
+ # delete any earlier event by this lead
+ sql("delete from tabEvent where ref_type='Lead' and ref_name=%s", self.doc.name)
+
+ in_calendar_of = self.doc.lead_owner
+
+ # get profile (id) if exists for contact_by
+ email_id = webnotes.conn.get_value('Sales Person', self.doc.contact_by, 'email_id')
+ if webnotes.conn.exists('Profile', email_id):
+ in_calendar_of = email_id
+
+ ev = Document('Event')
+ ev.owner = in_calendar_of
+ ev.description = 'Contact ' + cstr(self.doc.lead_name) + '.By : ' + cstr(self.doc.contact_by) + '.To Discuss : ' + cstr(self.doc.remark)
+ ev.event_date = self.doc.contact_date
+ ev.event_hour = '10:00'
+ ev.event_type = 'Private'
+ ev.ref_type = 'Lead'
+ ev.ref_name = self.doc.name
+ ev.save(1)
#-----------------Email--------------------------------------------
- def send_emails(self, email=[], subject='', message=''):
- if email:
- sendmail(email, sender = webnotes.user.name, subject = subject , parts = [['text/html', message]])
- msgprint("Mail Sent")
- self.add_in_follow_up(message,'Email')
+ def send_emails(self, email=[], subject='', message=''):
+ if email:
+ sendmail(email, sender = webnotes.user.name, subject = subject , parts = [['text/html', message]])
+ msgprint("Mail Sent")
+ self.add_in_follow_up(message,'Email')
-#-------------------------Checking Sent Mails Details----------------------------------------------
- def send_mail(self):
- if not self.doc.subject or not self.doc.message:
- msgprint("Please enter subject & message in their respective fields.")
- elif not self.doc.email_id:
- msgprint("Recipient not specified. Please add email id of lead in 'Email id' field provided in 'Contact Info' section.")
- raise Exception
- else :
- self.send_emails([self.doc.email_id.strip(' ')], subject = self.doc.subject ,message = self.doc.message)
+#-------------------------Checking Sent Mails Details----------------------------------------------
+ def send_mail(self):
+ if not self.doc.subject or not self.doc.message:
+ msgprint("Please enter subject & message in their respective fields.")
+ elif not self.doc.email_id:
+ msgprint("Recipient not specified. Please add email id of lead in 'Email id' field provided in 'Contact Info' section.")
+ raise Exception
+ else :
+ self.send_emails([self.doc.email_id.strip(' ')], subject = self.doc.subject ,message = self.doc.message)
#---------------------- Add details in follow up table----------------
- def add_in_follow_up(self,message,type):
- import datetime
- child = addchild( self.doc, 'follow_up', 'Communication Log', 1, self.doclist)
- child.date = datetime.datetime.now().date().strftime('%Y-%m-%d')
- child.notes = message
- child.follow_up_type = type
- child.save()
+ def add_in_follow_up(self,message,type):
+ import datetime
+ child = addchild( self.doc, 'follow_up', 'Communication Log', 1, self.doclist)
+ child.date = datetime.datetime.now().date().strftime('%Y-%m-%d')
+ child.notes = message
+ child.follow_up_type = type
+ child.save()
#-------------------SMS----------------------------------------------
- def send_sms(self):
- if not self.doc.sms_message or not self.doc.mobile_no:
- msgprint("Please enter mobile number in Basic Info Section and message in SMS Section ")
- raise Exception
- else:
- receiver_list = []
- if self.doc.mobile_no:
- receiver_list.append(self.doc.mobile_no)
- for d in getlist(self.doclist,'lead_sms_detail'):
- if d.other_mobile_no:
- receiver_list.append(d.other_mobile_no)
-
- if receiver_list:
- msgprint(get_obj('SMS Control', 'SMS Control').send_sms(receiver_list, self.doc.sms_message))
- self.add_in_follow_up(self.doc.sms_message,'SMS')
+ def send_sms(self):
+ if not self.doc.sms_message or not self.doc.mobile_no:
+ msgprint("Please enter mobile number in Basic Info Section and message in SMS Section ")
+ raise Exception
+ else:
+ receiver_list = []
+ if self.doc.mobile_no:
+ receiver_list.append(self.doc.mobile_no)
+ for d in getlist(self.doclist,'lead_sms_detail'):
+ if d.other_mobile_no:
+ receiver_list.append(d.other_mobile_no)
+
+ if receiver_list:
+ msgprint(get_obj('SMS Control', 'SMS Control').send_sms(receiver_list, self.doc.sms_message))
+ self.add_in_follow_up(self.doc.sms_message,'SMS')
diff --git a/erpnext/setup/doctype/customer_group/customer_group.py b/erpnext/setup/doctype/customer_group/customer_group.py
index cc4a9e0..edae5df 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.py
+++ b/erpnext/setup/doctype/customer_group/customer_group.py
@@ -60,6 +60,15 @@
def on_trash(self):
cust = sql("select name from `tabCustomer` where ifnull(customer_group, '') = %s", self.doc.name)
+ cust = [d[0] for d in cust]
+
if cust:
msgprint("""Customer Group: %s can not be trashed/deleted because it is used in customer: %s.
- To trash/delete this, remove/change customer group in customer master""" % (self.doc.name, cust[0][0] or ''), raise_exception=1)
+ To trash/delete this, remove/change customer group in customer master""" % (self.doc.name, cust or ''), raise_exception=1)
+
+ if sql("select name from `tabCustomer Group` where parent_customer_group = %s and docstatus != 2", self.doc.name):
+ msgprint("Child customer group exists for this customer group. You can not trash/cancel/delete this customer group.", raise_exception=1)
+
+ # rebuild tree
+ webnotes.conn.set(self.doc,'old_parent', '')
+ self.update_nsm_model()
\ No newline at end of file
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index b43523d..c96edcf 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -63,7 +63,17 @@
raise Exception
def on_trash(self):
- ig = sql("select name from `tabItem` where ifnull(item_group, '') = %s", self.doc.name)
+ item = sql("select name from `tabItem` where ifnull(item_group, '') = %s", self.doc.name)
+ item = [d[0] for d in item]
+
if ig:
msgprint("""Item Group: %s can not be trashed/deleted because it is used in item: %s.
- To trash/delete this, remove/change item group in item master""" % (self.doc.name, ig[0][0] or ''), raise_exception=1)
+ To trash/delete this, remove/change item group in item master""" % (self.doc.name, item or ''), raise_exception=1)
+
+ if sql("select name from `tabItem Group` where parent_item_group = %s and docstatus != 2", self.doc.name):
+ msgprint("Child item group exists for this item group. You can not trash/cancel/delete this item group.", raise_exception=1)
+
+
+ # rebuild tree
+ set(self.doc,'old_parent', '')
+ self.update_nsm_model()
\ 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 651cfb4..d8c6e43 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.py
+++ b/erpnext/setup/doctype/sales_person/sales_person.py
@@ -21,7 +21,7 @@
from webnotes.model.doclist import getlist
from webnotes.model.code import get_obj
from webnotes import session, form, is_testing, msgprint, errprint
-from webnotes.utils import flt
+from webnotes.utils import flt, cstr
sql = webnotes.conn.sql
convert_to_lists = webnotes.conn.convert_to_lists
@@ -77,4 +77,19 @@
d.sales_person_id = self.doc.name
d.is_sales_person = 1
- d.save(new = (not d.name))
+ d.save(new = (not d.name))
+
+
+ def on_trash(self):
+ st = sql("select parent, parenttype from `tabSales Team` where ifnull(sales_person, '') = %s and docstatus != 2", self.doc.name)
+ st = [(d[1] + ' : ' + d[0]) for d in st]
+ if st:
+ msgprint("""Sales Person: %s can not be trashed/deleted because it is used in %s.
+ To trash/delete this, remove/change sales person in %s""" % (self.doc.name, st or '', st or ''), raise_exception=1)
+
+ if sql("select name from `tabSales Person` where parent_sales_person = %s and docstatus != 2", self.doc.name):
+ msgprint("Child sales person exists for this sales person. You can not trash/cancel this sales person.", raise_exception=1)
+
+ # rebuild tree
+ webnotes.conn.set(self.doc,'old_parent', '')
+ self.update_nsm_model()
diff --git a/erpnext/setup/doctype/territory/territory.py b/erpnext/setup/doctype/territory/territory.py
index 8017ad5..21c3392 100644
--- a/erpnext/setup/doctype/territory/territory.py
+++ b/erpnext/setup/doctype/territory/territory.py
@@ -78,7 +78,17 @@
def on_trash(self):
- terr = sql("select name from `tabCustomer` where ifnull(territory, '') = %s", self.doc.name)
- if terr:
- msgprint("""Territory: %s can not be trashed/deleted because it is used in territory: %s.
- To trash/delete this, remove/change territory in customer master""" % (self.doc.name, terr[0][0] or ''), raise_exception=1)
+ cust = sql("select name from `tabCustomer` where ifnull(territory, '') = %s", self.doc.name)
+ cust = [d[0] for d in cust]
+
+ if cust:
+ msgprint("""Territory: %s can not be trashed/deleted because it is used in customer: %s.
+ To trash/delete this, remove/change territory in customer master""" % (self.doc.name, cust or ''), raise_exception=1)
+
+
+ if sql("select name from `tabTerritory` where parent_territory = %s and docstatus != 2", self.doc.name):
+ msgprint("Child territory exists for this territory. You can not trash/cancel/delete this territory.", raise_exception=1)
+
+ # rebuild tree
+ set(self.doc,'old_parent', '')
+ self.update_nsm_model()
\ No newline at end of file
diff --git a/erpnext/support/doctype/customer_issue/customer_issue.js b/erpnext/support/doctype/customer_issue/customer_issue.js
index 699c97f..0749424 100644
--- a/erpnext/support/doctype/customer_issue/customer_issue.js
+++ b/erpnext/support/doctype/customer_issue/customer_issue.js
@@ -8,85 +8,85 @@
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
cur_frm.cscript.onload = function(doc,cdt,cdn){
- if(!doc.status) set_multiple(dt,dn,{status:'Open'});
- if(doc.__islocal){
- 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:'Open'});
+ if(doc.__islocal){
+ hide_field(['customer_address','contact_person']);
+ }
}
cur_frm.cscript.refresh = function(doc,ct,cdn){
- if(!doc.docstatus) hide_field('make_maintenance_visit');
- else if(doc.docstatus && (doc.status == 'Open' || doc.status == 'Work In Progress')) unhide_field('make_maintenance_visit');
+ if(doc.docstatus == 1 && (doc.status == 'Open' || doc.status == 'Work In Progress'))
+ cur_frm.add_custom_button('Make Maintenance Visit', cur_frm.cscript['Make Maintenance Visit']);
}
//customer
cur_frm.cscript.customer = function(doc,dt,dn) {
- var callback = function(r,rt) {
- var doc = locals[cur_frm.doctype][cur_frm.docname];
- cur_frm.refresh();
- }
+ var callback = function(r,rt) {
+ var doc = locals[cur_frm.doctype][cur_frm.docname];
+ cur_frm.refresh();
+ }
- if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback);
- if(doc.customer) unhide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
+ if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', '', callback);
+ if(doc.customer) unhide_field(['customer_address','contact_person']);
}
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {
- if(doc.customer) 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)
+ 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.on_new = function(dn) {
- locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
- locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+ locals['Address'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+ locals['Address'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
}
cur_frm.fields_dict.contact_person.on_new = function(dn) {
- locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
- locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
+ locals['Contact'][dn].customer = locals[cur_frm.doctype][cur_frm.docname].customer;
+ locals['Contact'][dn].customer_name = locals[cur_frm.doctype][cur_frm.docname].customer_name;
}
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
- return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+ return 'SELECT name,address_line1,city FROM tabAddress WHERE customer = "'+ doc.customer +
+ '" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
}
cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
- return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation FROM tabContact WHERE customer = "'+ doc.customer +'" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
+ return 'SELECT name,CONCAT(first_name," ",ifnull(last_name,"")) As FullName,department,designation \
+ FROM tabContact WHERE customer = "' + doc.customer +
+ '" AND docstatus != 2 AND name LIKE "%s" ORDER BY name ASC LIMIT 50';
}
-
-
-
-cur_frm.cscript.make_maintenance_visit = function(doc, cdt, cdn) {
- if (doc.docstatus == 1) {
- $c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_visit','',
- function(r,rt){
- if(r.message == 'No'){
- n = createLocal("Maintenance Visit");
- $c('dt_map', args={
- 'docs':compress_doclist([locals["Maintenance Visit"][n]]),
- 'from_doctype':'Customer Issue',
- 'to_doctype':'Maintenance Visit',
- 'from_docname':doc.name,
- 'from_to_list':"[['Customer Issue', 'Maintenance Visit'], ['Customer Issue', 'Maintenance Visit Purpose']]"
- }
- , function(r,rt) {
- loaddoc("Maintenance Visit", n);
- }
- );
- }
- else{
- msgprint("You have already completed maintenance against this Customer Issue");
- }
- }
- );
- }
+cur_frm.cscript['Make Maintenance Visit'] = function() {
+ var doc = cur_frm.doc;
+ if (doc.docstatus == 1) {
+ $c_obj(make_doclist(doc.doctype, doc.name),'check_maintenance_visit','',
+ function(r,rt){
+ if(r.message == 'No'){
+ n = createLocal("Maintenance Visit");
+ $c('dt_map', args={
+ 'docs':compress_doclist([locals["Maintenance Visit"][n]]),
+ 'from_doctype':'Customer Issue',
+ 'to_doctype':'Maintenance Visit',
+ 'from_docname':doc.name,
+ 'from_to_list':"[['Customer Issue', 'Maintenance Visit'], ['Customer Issue', 'Maintenance Visit Purpose']]"
+ }, function(r,rt) {
+ loaddoc("Maintenance Visit", n);
+ });
+ } else{
+ msgprint("You have already completed maintenance against this Customer Issue");
+ }
+ }
+ );
+ }
}
// ----------
@@ -94,9 +94,13 @@
// ----------
cur_frm.fields_dict['serial_no'].get_query = function(doc, cdt, cdn) {
- var cond = '';
- if(doc.item_code) cond = ' AND `tabSerial No`.item_code = "'+ doc.item_code +'"';
- return 'SELECT `tabSerial No`.name, `tabSerial No`.description FROM `tabSerial No` WHERE `tabSerial No`.docstatus != 2 AND `tabSerial No`.name LIKE "%s" '+cond+' ORDER BY `tabSerial No`.name ASC LIMIT 50';
+ var cond = '';
+ if(doc.item_code) cond = ' AND `tabSerial No`.item_code = "'+ doc.item_code +'"';
+ if(doc.customer) cond += ' AND `tabSerial No`.customer = "' + doc.customer + '"';
+ return 'SELECT `tabSerial No`.name, `tabSerial No`.description \
+ FROM `tabSerial No` \
+ WHERE `tabSerial No`.docstatus != 2 AND `tabSerial No`.status = "Delivered" \
+ AND `tabSerial No`.name LIKE "%s" ' + cond + ' ORDER BY `tabSerial No`.name ASC LIMIT 50';
}
cur_frm.add_fetch('serial_no', 'item_code', 'item_code');
@@ -105,20 +109,27 @@
cur_frm.add_fetch('serial_no', 'maintenance_status', 'warranty_amc_status');
cur_frm.add_fetch('serial_no', 'warranty_expiry_date', 'warranty_expiry_date');
cur_frm.add_fetch('serial_no', 'amc_expiry_date', 'amc_expiry_date');
-cur_frm.add_fetch('serial_no', 'customer', 'customer');
-cur_frm.add_fetch('serial_no', 'customer_name', 'customer_name');
-cur_frm.add_fetch('serial_no', 'delivery_address', 'customer_address');
+if (cstr(doc.customer) == '') {
+ cur_frm.add_fetch('serial_no', 'customer', 'customer');
+ cur_frm.add_fetch('serial_no', 'customer_name', 'customer_name');
+ cur_frm.add_fetch('serial_no', 'delivery_address', 'customer_address');
+}
// ----------
// item code
// ----------
cur_frm.fields_dict['item_code'].get_query = function(doc, cdt, cdn) {
- if(doc.serial_no){
- return 'SELECT `tabSerial No`.item_code, `tabSerial No`.description FROM `tabSerial No` WHERE `tabSerial No`.docstatus != 2 AND `tabSerial No`.name = "'+ doc.serial_no +'" AND `tabSerial No`.item_code LIKE "%s" ORDER BY `tabSerial No`.item_code ASC LIMIT 50';
- }
- else{
- return 'SELECT `tabItem`.name, `tabItem`.item_name, `tabItem`.description FROM `tabItem` WHERE `tabItem`.docstatus != 2 AND `tabItem`.name LIKE "%s" ORDER BY `tabItem`.name ASC LIMIT 50';
- }
+ if(doc.serial_no) {
+ return 'SELECT `tabSerial No`.item_code, `tabSerial No`.description \
+ FROM `tabSerial No` \
+ WHERE `tabSerial No`.docstatus != 2 AND `tabSerial No`.name = "' + doc.serial_no +
+ '" AND `tabSerial No`.item_code LIKE "%s" ORDER BY `tabSerial No`.item_code ASC LIMIT 50';
+ }
+ else{
+ return 'SELECT `tabItem`.name, `tabItem`.item_name, `tabItem`.description \
+ FROM `tabItem` \
+ WHERE `tabItem`.docstatus != 2 AND `tabItem`.name LIKE "%s" ORDER BY `tabItem`.name ASC LIMIT 50';
+ }
}
cur_frm.add_fetch('item_code', 'item_name', 'item_name');
@@ -128,5 +139,8 @@
//get query select Territory
//=======================================================================================================================
cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
- return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50';
+ return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` \
+ FROM `tabTerritory` \
+ WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 \
+ AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50';
}
diff --git a/erpnext/support/doctype/customer_issue/customer_issue.py b/erpnext/support/doctype/customer_issue/customer_issue.py
index 096d688..5c3f024 100644
--- a/erpnext/support/doctype/customer_issue/customer_issue.py
+++ b/erpnext/support/doctype/customer_issue/customer_issue.py
@@ -8,11 +8,11 @@
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Please edit this list and import only required elements
@@ -36,49 +36,42 @@
from utilities.transaction_base import TransactionBase
class DocType(TransactionBase):
- def __init__(self, doc, doclist=[]):
- self.doc = doc
- self.doclist = doclist
- self.prefix = is_testing and 'test' or 'tab'
-
- def autoname(self):
- #self.doc.name = make_autoname('CI/' + self.doc.fiscal_year + '/.######')
- self.doc.name = make_autoname(self.doc.naming_series + '.######')
-
+ def __init__(self, doc, doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
+
+ def autoname(self):
+ self.doc.name = make_autoname(self.doc.naming_series + '.######')
+
#check if maintenance schedule already generated
#============================================
- def check_maintenance_visit(self):
- nm = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1 and t1.completion_status='Fully Completed'", self.doc.name)
- nm = nm and nm[0][0] or ''
-
- if not nm:
- return 'No'
-
- def on_submit(self):
- if session['user'] != 'Guest':
- if not self.doc.allocated_to:
- msgprint("Please select service person name whom you want to assign this issue")
- raise Exception
-
- def validate(self):
- if session['user'] != 'Guest' and not self.doc.customer:
- msgprint("Please select Customer from whom issue is raised")
- raise Exception
- #if not self.doc.email_id and not self.doc.contact_no:
- # msgprint("Please specify contact no. and/or email_id")
- # raise Exception
- #elif self.doc.email_id and not validate_email_add(self.doc.email_id.strip(' ')):
- # msgprint('error:%s is not a valid email id' % self.doc.email_id)
- # raise Exception
-
- def on_cancel(self):
- lst = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent = t1.name and t2.prevdoc_docname = '%s' and t1.docstatus!=2"%(self.doc.name))
- if lst:
- lst1 = ','.join([x[0] for x in lst])
- msgprint("Maintenance Visit No. "+lst1+" already created against this customer issue. So can not be Cancelled")
- raise Exception
- else:
- set(self.doc, 'status', 'Cancelled')
+ def check_maintenance_visit(self):
+ nm = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1 and t1.completion_status='Fully Completed'", self.doc.name)
+ nm = nm and nm[0][0] or ''
+
+ if not nm:
+ return 'No'
+
+ def on_submit(self):
+ if session['user'] != 'Guest':
+ if not self.doc.allocated_to:
+ msgprint("Please select service person name whom you want to assign this issue")
+ raise Exception
+
+ def validate(self):
+ if session['user'] != 'Guest' and not self.doc.customer:
+ msgprint("Please select Customer from whom issue is raised")
+ raise Exception
- def on_update(self):
- pass
+
+ def on_cancel(self):
+ lst = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent = t1.name and t2.prevdoc_docname = '%s' and t1.docstatus!=2"%(self.doc.name))
+ if lst:
+ lst1 = ','.join([x[0] for x in lst])
+ msgprint("Maintenance Visit No. "+lst1+" already created against this customer issue. So can not be Cancelled")
+ raise Exception
+ else:
+ set(self.doc, 'status', 'Cancelled')
+
+ def on_update(self):
+ pass
diff --git a/erpnext/support/doctype/customer_issue/customer_issue.txt b/erpnext/support/doctype/customer_issue/customer_issue.txt
index 2c27735..a96e91e 100644
--- a/erpnext/support/doctype/customer_issue/customer_issue.txt
+++ b/erpnext/support/doctype/customer_issue/customer_issue.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:40',
+ 'creation': '2012-04-13 11:56:39',
'docstatus': 0,
- 'modified': '2012-03-27 14:45:47',
+ 'modified': '2012-05-18 17:04:36',
'modified_by': u'Administrator',
'owner': u'harshada@webnotestech.com'
},
@@ -25,7 +25,7 @@
'show_in_menu': 0,
'subject': u'%(complaint)s By %(complaint_raised_by)s on %(issue_date)s',
'tag_fields': u'status',
- 'version': 97
+ 'version': 1
},
# These values are common for all DocField
@@ -55,6 +55,15 @@
# DocPerm
{
+ 'create': 1,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Guest',
+ 'write': 1
+ },
+
+ # DocPerm
+ {
'amend': 1,
'cancel': 1,
'create': 1,
@@ -110,21 +119,12 @@
'role': u'Maintenance User'
},
- # DocPerm
- {
- 'create': 1,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Guest',
- 'write': 1
- },
-
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'customer_issue',
+ 'fieldname': u'basic_info',
'fieldtype': u'Section Break',
- 'label': u'Customer Issue',
+ 'label': u'Basic Info',
'oldfieldtype': u'Section Break',
'permlevel': 0
},
@@ -147,24 +147,6 @@
# DocField
{
- 'colour': u'White:FFF',
- 'default': u'Open',
- 'doctype': u'DocField',
- 'fieldname': u'status',
- 'fieldtype': u'Select',
- 'in_filter': 1,
- 'label': u'Status',
- 'no_copy': 1,
- 'oldfieldname': u'status',
- 'oldfieldtype': u'Select',
- 'options': u'\nOpen\nClosed\nWork In Progress\nCancelled',
- 'permlevel': 0,
- 'reqd': 1,
- 'search_index': 1
- },
-
- # DocField
- {
'default': u'Today',
'doctype': u'DocField',
'fieldname': u'complaint_date',
@@ -181,39 +163,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'complaint_raised_by',
- 'fieldtype': u'Data',
- 'label': u'Raised By',
- 'oldfieldname': u'complaint_raised_by',
- 'oldfieldtype': u'Data',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'from_company',
- 'fieldtype': u'Data',
- 'label': u'From Company',
- 'oldfieldname': u'from_company',
- 'oldfieldtype': u'Data',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'service_address',
- 'fieldtype': u'Small Text',
- 'label': u'Service Address',
- 'oldfieldname': u'service_address',
- 'oldfieldtype': u'Small Text',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'column_break0',
'fieldtype': u'Column Break',
'oldfieldtype': u'Column Break',
@@ -264,144 +213,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'customer_name',
- 'fieldtype': u'Data',
- 'label': u'Name',
- 'permlevel': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'address_display',
- 'fieldtype': u'Small Text',
- 'label': u'Address',
- 'permlevel': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'contact_display',
- 'fieldtype': u'Small Text',
- 'label': u'Contact',
- 'permlevel': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'contact_mobile',
- 'fieldtype': u'Data',
- 'label': u'Mobile No',
- 'permlevel': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'contact_email',
- 'fieldtype': u'Data',
- 'label': u'Contact Email',
- 'permlevel': 1
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'doctype': u'DocField',
- 'fieldname': u'territory',
- 'fieldtype': u'Link',
- 'in_filter': 1,
- 'label': u'Territory',
- 'oldfieldname': u'territory',
- 'oldfieldtype': u'Link',
- 'options': u'Territory',
- 'permlevel': 0,
- 'print_hide': 1,
- 'reqd': 0,
- 'search_index': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'customer_group',
- 'fieldtype': u'Link',
- 'label': u'Customer Group',
- 'options': u'Customer Group',
- 'permlevel': 0,
- 'print_hide': 1,
- 'reqd': 0
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'doctype': u'DocField',
- 'fieldname': u'company',
- 'fieldtype': u'Link',
- 'in_filter': 1,
- 'label': u'Company',
- 'oldfieldname': u'company',
- 'oldfieldtype': u'Link',
- 'options': u'Company',
- 'permlevel': 0,
- 'print_hide': 1,
- 'reqd': 1,
- 'search_index': 1,
- 'trigger': u'Client'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'fiscal_year',
- 'fieldtype': u'Select',
- 'in_filter': 1,
- 'label': u'Fiscal Year',
- 'oldfieldname': u'fiscal_year',
- 'oldfieldtype': u'Select',
- 'options': u'link:Fiscal Year',
- 'permlevel': 0,
- 'print_hide': 1,
- 'reqd': 1,
- 'search_index': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'amended_from',
- 'fieldtype': u'Data',
- 'hidden': 1,
- 'label': u'Amended From',
- 'no_copy': 1,
- 'oldfieldname': u'amended_from',
- 'oldfieldtype': u'Data',
- 'permlevel': 0,
- 'print_hide': 1,
- 'width': u'150px'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'amendment_date',
- 'fieldtype': u'Date',
- 'hidden': 1,
- 'label': u'Amendment Date',
- 'no_copy': 1,
- 'oldfieldname': u'amendment_date',
- 'oldfieldtype': u'Date',
- 'permlevel': 0,
- 'print_hide': 1,
- 'width': u'100px'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'issue_details',
'fieldtype': u'Section Break',
'label': u'Issue Details',
@@ -440,6 +251,29 @@
# DocField
{
+ 'doctype': u'DocField',
+ 'fieldname': u'complaint',
+ 'fieldtype': u'Small Text',
+ 'label': u'Issue',
+ 'no_copy': 1,
+ 'oldfieldname': u'complaint',
+ 'oldfieldtype': u'Small Text',
+ 'permlevel': 0,
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'column_break1',
+ 'fieldtype': u'Column Break',
+ 'oldfieldtype': u'Column Break',
+ 'permlevel': 0,
+ 'width': u'50%'
+ },
+
+ # DocField
+ {
'colour': u'White:FFF',
'depends_on': u'eval:doc.item_code',
'doctype': u'DocField',
@@ -467,29 +301,6 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'complaint',
- 'fieldtype': u'Small Text',
- 'label': u'Issue',
- 'no_copy': 1,
- 'oldfieldname': u'complaint',
- 'oldfieldtype': u'Small Text',
- 'permlevel': 0,
- 'reqd': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'column_break1',
- 'fieldtype': u'Column Break',
- 'oldfieldtype': u'Column Break',
- 'permlevel': 0,
- 'width': u'50%'
- },
-
- # DocField
- {
'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'warranty_amc_status',
@@ -522,6 +333,17 @@
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'resolution_section',
+ 'fieldtype': u'Section Break',
+ 'label': u'Resolution',
+ 'oldfieldtype': u'Section Break',
+ 'options': u'Simple',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
'fieldname': u'allocated_on',
'fieldtype': u'Date',
'in_filter': 1,
@@ -549,29 +371,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'resolution_detail',
- 'fieldtype': u'Section Break',
- 'label': u'Resolution Detail',
- 'oldfieldtype': u'Section Break',
- 'options': u'Simple',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'resolution_details',
- 'fieldtype': u'Text',
- 'label': u'Resolution Details',
- 'no_copy': 1,
- 'oldfieldname': u'resolution_details',
- 'oldfieldtype': u'Text',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'column_break2',
'fieldtype': u'Column Break',
'oldfieldtype': u'Column Break',
@@ -610,27 +409,256 @@
# DocField
{
- 'allow_on_submit': 0,
- 'colour': u'White:FFF',
- 'depends_on': u'eval:!doc.__islocal',
'doctype': u'DocField',
- 'fieldname': u'next_steps',
- 'fieldtype': u'Section Break',
- 'label': u'Next Steps',
- 'oldfieldtype': u'Section Break',
+ 'fieldname': u'resolution_details',
+ 'fieldtype': u'Text',
+ 'label': u'Resolution Details',
+ 'no_copy': 1,
+ 'oldfieldname': u'resolution_details',
+ 'oldfieldtype': u'Text',
'permlevel': 0
},
# DocField
{
- 'allow_on_submit': 1,
+ 'doctype': u'DocField',
+ 'fieldname': u'contact_info',
+ 'fieldtype': u'Section Break',
+ 'label': u'Contact Info',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'col_break3',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0,
+ 'width': u'50%'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'customer_name',
+ 'fieldtype': u'Data',
+ 'label': u'Customer Name',
+ 'permlevel': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'customer_group',
+ 'fieldtype': u'Link',
+ 'label': u'Customer Group',
+ 'options': u'Customer Group',
+ 'permlevel': 0,
+ 'print_hide': 1,
+ 'reqd': 0
+ },
+
+ # DocField
+ {
'colour': u'White:FFF',
'doctype': u'DocField',
- 'fieldname': u'make_maintenance_visit',
- 'fieldtype': u'Button',
- 'label': u'Make Maintenance Visit',
- 'oldfieldtype': u'Button',
+ 'fieldname': u'territory',
+ 'fieldtype': u'Link',
+ 'in_filter': 1,
+ 'label': u'Territory',
+ 'oldfieldname': u'territory',
+ 'oldfieldtype': u'Link',
+ 'options': u'Territory',
'permlevel': 0,
+ 'print_hide': 1,
+ 'reqd': 0,
+ 'search_index': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'address_display',
+ 'fieldtype': u'Small Text',
+ 'label': u'Address',
+ 'permlevel': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'col_break4',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0,
+ 'width': u'50%'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'contact_display',
+ 'fieldtype': u'Small Text',
+ 'label': u'Contact',
+ 'permlevel': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'contact_mobile',
+ 'fieldtype': u'Data',
+ 'label': u'Mobile No',
+ 'permlevel': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'contact_email',
+ 'fieldtype': u'Data',
+ 'label': u'Contact Email',
+ 'permlevel': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'service_address',
+ 'fieldtype': u'Small Text',
+ 'label': u'Service Address',
+ 'oldfieldname': u'service_address',
+ 'oldfieldtype': u'Small Text',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'more_info',
+ 'fieldtype': u'Section Break',
+ 'label': u'More Info',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'col_break5',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0,
+ 'width': u'50%'
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'doctype': u'DocField',
+ 'fieldname': u'company',
+ 'fieldtype': u'Link',
+ 'in_filter': 1,
+ 'label': u'Company',
+ 'oldfieldname': u'company',
+ 'oldfieldtype': u'Link',
+ 'options': u'Company',
+ 'permlevel': 0,
+ 'print_hide': 1,
+ 'reqd': 1,
+ 'search_index': 1,
'trigger': u'Client'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'fiscal_year',
+ 'fieldtype': u'Select',
+ 'in_filter': 1,
+ 'label': u'Fiscal Year',
+ 'oldfieldname': u'fiscal_year',
+ 'oldfieldtype': u'Select',
+ 'options': u'link:Fiscal Year',
+ 'permlevel': 0,
+ 'print_hide': 1,
+ 'reqd': 1,
+ 'search_index': 1
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'default': u'Open',
+ 'doctype': u'DocField',
+ 'fieldname': u'status',
+ 'fieldtype': u'Select',
+ 'in_filter': 1,
+ 'label': u'Status',
+ 'no_copy': 1,
+ 'oldfieldname': u'status',
+ 'oldfieldtype': u'Select',
+ 'options': u'\nOpen\nClosed\nWork In Progress\nCancelled',
+ 'permlevel': 0,
+ 'reqd': 1,
+ 'search_index': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'col_break6',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0,
+ 'width': u'50%'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'complaint_raised_by',
+ 'fieldtype': u'Data',
+ 'label': u'Raised By',
+ 'oldfieldname': u'complaint_raised_by',
+ 'oldfieldtype': u'Data',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'from_company',
+ 'fieldtype': u'Data',
+ 'label': u'From Company',
+ 'oldfieldname': u'from_company',
+ 'oldfieldtype': u'Data',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'amended_from',
+ 'fieldtype': u'Data',
+ 'hidden': 1,
+ 'label': u'Amended From',
+ 'no_copy': 1,
+ 'oldfieldname': u'amended_from',
+ 'oldfieldtype': u'Data',
+ 'permlevel': 0,
+ 'print_hide': 1,
+ 'width': u'150px'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'amendment_date',
+ 'fieldtype': u'Date',
+ 'hidden': 1,
+ 'label': u'Amendment Date',
+ 'no_copy': 1,
+ 'oldfieldname': u'amendment_date',
+ 'oldfieldtype': u'Date',
+ 'permlevel': 0,
+ 'print_hide': 1,
+ 'width': u'100px'
}
]
\ No newline at end of file