merged live
diff --git a/accounts/doctype/account/account.js b/accounts/doctype/account/account.js
index 071bf57..51cacda 100644
--- a/accounts/doctype/account/account.js
+++ b/accounts/doctype/account/account.js
@@ -72,16 +72,6 @@
else alert("Please select master type");
}
-/*
-// Get customer/supplier address
-// -----------------------------------------
-cur_frm.cscript.master_name = function(doc,cdt,cdn){
- if(doc.master_name){
- get_server_fields('get_address','','',doc,cdt,cdn);
- }
-}
-*/
-
// parent account get query
// -----------------------------------------
cur_frm.fields_dict['parent_account'].get_query = function(doc){
diff --git a/accounts/doctype/account/account.txt b/accounts/doctype/account/account.txt
index b29c617..bf48a24 100644
--- a/accounts/doctype/account/account.txt
+++ b/accounts/doctype/account/account.txt
@@ -455,7 +455,8 @@
'description': "Don't delete this field at any cost",
'doctype': 'DocField',
'fieldname': 'old_parent',
- 'fieldtype': 'Data',
+ 'fieldtype': 'Link',
+ 'options': 'Account',
'hidden': 1,
'idx': 24,
'label': 'Old Parent',
@@ -517,4 +518,4 @@
'oldfieldtype': 'Small Text',
'permlevel': 1
}
-]
\ No newline at end of file
+]
diff --git a/accounts/doctype/cost_center/cost_center.py b/accounts/doctype/cost_center/cost_center.py
index 060225d..521712b 100644
--- a/accounts/doctype/cost_center/cost_center.py
+++ b/accounts/doctype/cost_center/cost_center.py
@@ -31,7 +31,7 @@
ret = {
'company_abbr' : abbr
}
- return cstr(ret)
+ return ret
def validate(self):
# Cost Center name must be unique
diff --git a/accounts/doctype/form_16a/form_16a.py b/accounts/doctype/form_16a/form_16a.py
index 292c52a..0bcef6b 100644
--- a/accounts/doctype/form_16a/form_16a.py
+++ b/accounts/doctype/form_16a/form_16a.py
@@ -39,7 +39,7 @@
'company_address': cstr(comp_det[0][0]),
'registration_details': cstr(comp_det[0][1])
}
- return cstr(ret)
+ return ret
# Get party details
#------------------
diff --git a/accounts/doctype/journal_voucher/journal_voucher.py b/accounts/doctype/journal_voucher/journal_voucher.py
index 4f5e67a..5942ca1 100644
--- a/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/accounts/doctype/journal_voucher/journal_voucher.py
@@ -38,9 +38,9 @@
args = eval(args)
o_s = sql("select outstanding_amount from `tab%s` where name = '%s'" % (args['doctype'],args['docname']))
if args['doctype'] == 'Payable Voucher':
- return cstr({'debit': o_s and flt(o_s[0][0]) or 0})
+ return {'debit': o_s and flt(o_s[0][0]) or 0}
if args['doctype'] == 'Receivable Voucher':
- return cstr({'credit': o_s and flt(o_s[0][0]) or 0})
+ return {'credit': o_s and flt(o_s[0][0]) or 0}
#--------------------------------------------------------------------------------------------------------
# Create remarks
diff --git a/accounts/doctype/payable_voucher/payable_voucher.py b/accounts/doctype/payable_voucher/payable_voucher.py
index 0e930e3..e88066a 100644
--- a/accounts/doctype/payable_voucher/payable_voucher.py
+++ b/accounts/doctype/payable_voucher/payable_voucher.py
@@ -48,14 +48,14 @@
ret['due_date'] = add_days(cstr(self.doc.posting_date), acc_head and cint(acc_head[0][1]) or 0)
elif not acc_head:
msgprint("%s does not have an Account Head in %s. You must first create it from the Supplier Master" % (self.doc.supplier, self.doc.company))
- return cstr(ret)
+ return ret
def get_cust(self):
ret = {}
if self.doc.credit_to:
ret['supplier'] = get_value('Account',self.doc.credit_to,'master_name')
- return cstr(ret)
+ return ret
# Get Default Cost Center and Expense Head from Item Master
@@ -70,7 +70,7 @@
if not args['cost_center'] or args['cost_center'] == 'undefined':
cost_center = sql("select cost_center from `tabItem` where name = '%s'" % args['item_code'])
ret['cost_center'] = cost_center and cost_center[0][0] or ''
- return cstr(ret)
+ return ret
# Get Items based on PO or PR
@@ -115,7 +115,7 @@
'cost_center' : item_det and item_det[0]['cost_center'] or '',
'item_tax_rate' : str(t)
}
- return cstr(ret)
+ return ret
# Advance Allocation
# -------------------
@@ -139,7 +139,7 @@
def get_rate1(self,acc):
rate = sql("select tax_rate from `tabAccount` where name='%s'"%(acc))
ret={'add_tax_rate' :rate and flt(rate[0][0]) or 0 }
- return cstr(ret)
+ return ret
# *************************** Server Utility Functions *****************************
diff --git a/accounts/doctype/receivable_voucher/receivable_voucher.py b/accounts/doctype/receivable_voucher/receivable_voucher.py
index cb62a65..185b0b1 100644
--- a/accounts/doctype/receivable_voucher/receivable_voucher.py
+++ b/accounts/doctype/receivable_voucher/receivable_voucher.py
@@ -90,7 +90,7 @@
def get_debit_to(self):
acc_head = self.get_customer_account()
if acc_head:
- return cstr({ 'debit_to' : acc_head })
+ return { 'debit_to' : acc_head }
# Set Due Date = Posting Date + Credit Days
@@ -515,7 +515,7 @@
ret = {
'actual_qty' : actual_qty and flt(actual_qty[0]['actual_qty']) or 0
}
- return cstr(ret)
+ return ret
# Make GL Entries
# -------------------------
diff --git a/accounts/doctype/tds_payment/tds_payment.py b/accounts/doctype/tds_payment/tds_payment.py
index c91a269..5079d04 100644
--- a/accounts/doctype/tds_payment/tds_payment.py
+++ b/accounts/doctype/tds_payment/tds_payment.py
@@ -34,7 +34,7 @@
else:
ret = { 'registration_details': cstr(comp_det[0][0])}
- return cstr(ret)
+ return ret
# Get default bank and tds account
#------------------------------------
diff --git a/accounts/search_criteria/budget_variance_report/budget_variance_report.py b/accounts/search_criteria/budget_variance_report/budget_variance_report.py
index 2efca28..182f9e5 100644
--- a/accounts/search_criteria/budget_variance_report/budget_variance_report.py
+++ b/accounts/search_criteria/budget_variance_report/budget_variance_report.py
@@ -51,7 +51,6 @@
q1 = "select sum(t1.budget_allocated) from `tabBudget Detail` t1, `tab%s` t2, `tabAccount` t3 where "
cond2 = " t3.is_pl_account = 'Yes' and t3.debit_or_credit = 'Debit' and t3.name = t1.account and t1.docstatus != 2 and "
if ch:
-
qur = q1+cond2+cond1+" and t2.name = '%s'"
ret_amt = sql(qur%(based_on,fiscal_year,based_on,r[0].strip()))
@@ -170,4 +169,4 @@
r.append(actual)
# ================ Variance ===================================================
r.append(r[idx] - r[idx + 1])
- count = count +1
\ No newline at end of file
+ count = count +1
diff --git a/buying/doctype/purchase_common/purchase_common.py b/buying/doctype/purchase_common/purchase_common.py
index fe8c8e6..29658cb 100644
--- a/buying/doctype/purchase_common/purchase_common.py
+++ b/buying/doctype/purchase_common/purchase_common.py
@@ -84,7 +84,7 @@
# ********** get primary contact details (this is done separately coz. , in case there is no primary contact thn it would not be able to fetch customer details in case of join query)
contact_det = sql("select contact_name, contact_no, email_id from `tabContact` where supplier = '%s' and is_supplier = 1 and is_primary_contact = 'Yes' and docstatus != 2" %(name), as_dict = 1)
ret['contact_person'] = contact_det and contact_det[0]['contact_name'] or ''
- return cstr(ret)
+ return ret
else:
msgprint("Supplier : %s does not exists" % (name))
raise Exception
@@ -142,14 +142,14 @@
ret['purchase_rate'] = item and flt(item[0]['last_purchase_rate']) or 0
ret['import_rate'] = flt(item and flt(item[0]['last_purchase_rate']) or 0) / flt(obj.doc.fields.has_key('conversion_rate') and flt(obj.doc.conversion_rate) or 1)
- return cstr(ret)
+ return ret
# Get Available Qty at Warehouse
def get_bin_details( self, arg = ''):
arg = eval(arg)
bin = sql("select projected_qty from `tabBin` where item_code = %s and warehouse = %s", (arg['item_code'], arg['warehouse']), as_dict=1)
ret = { 'projected_qty' : bin and flt(bin[0]['projected_qty']) or 0 }
- return str(ret)
+ return ret
# Get UOM Details
def get_uom_details(self, arg = ''):
@@ -163,7 +163,7 @@
'purchase_rate' : (lpr and flt(lpr[0]['last_purchase_rate']) * flt(uom[0]['conversion_factor'])) or 0
}
- return str(ret)
+ return ret
# get last purchase rate
def get_last_purchase_rate( self, obj):
@@ -522,7 +522,7 @@
'rate' : rate and (rate[0]['account_type'] == 'Tax' and not arg['charge_type'] == 'Actual') and flt(rate[0]['tax_rate']) or 0
}
#msgprint(ret)
- return cstr(ret)
+ return ret
diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py
index 7d9e1da..1a5d2d7 100644
--- a/buying/doctype/purchase_order/purchase_order.py
+++ b/buying/doctype/purchase_order/purchase_order.py
@@ -38,23 +38,17 @@
get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'PO Date')
- # Client Trigger Functions
- #----------------------------------------------------------------------------------------------------
- # Get Supplier Details
- #def get_supplier_details(self, name = ''):
- #return cstr(get_obj(dt='Purchase Common').get_supplier_details(name))
-
# Get Item Details
def get_item_details(self, arg =''):
- return cstr(get_obj(dt='Purchase Common').get_item_details(self,arg))
+ return get_obj(dt='Purchase Common').get_item_details(self,arg)
# Get UOM Details
def get_uom_details(self, arg = ''):
- return cstr(get_obj(dt='Purchase Common').get_uom_details(arg))
+ return get_obj(dt='Purchase Common').get_uom_details(arg)
# get available qty at warehouse
def get_bin_details(self, arg = ''):
- return cstr(get_obj(dt='Purchase Common').get_bin_details(arg))
+ return get_obj(dt='Purchase Common').get_bin_details(arg)
# Pull Indent
def get_indent_details(self):
diff --git a/buying/doctype/supplier_quotation/supplier_quotation.py b/buying/doctype/supplier_quotation/supplier_quotation.py
index 0c659bc..ac59430 100755
--- a/buying/doctype/supplier_quotation/supplier_quotation.py
+++ b/buying/doctype/supplier_quotation/supplier_quotation.py
@@ -18,7 +18,7 @@
'supplier_name' : cd and cd[0][4] or '',
'supplier_address': cd and cd[0][5] or ''
}
- return cstr(ret)
+ return ret
def get_rfq_details(self):
self.doc.clear_table(self.doclist, 'supplier_quotation_details')
@@ -28,12 +28,12 @@
def update_approval_status(self):
if not self.doc.approval_status or self.doc.approval_status == 'Not Approved':
set(self.doc, 'approval_status','Approved')
- return cstr(self.doc.approval_status)
+ return self.doc.approval_status
elif self.doc.approval_status == 'Approved':
pc_obj = get_obj('Purchase Common')
pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Order', docname = self.doc.name, detail_doctype = 'PO Detail')
set(self.doc, 'approval_status', 'Not Approved')
- return cstr(self.doc.approval_status)
+ return self.doc.approval_status
def validate_item_list(self):
if not getlist(self.doclist, 'supplier_quotation_details'):
@@ -101,4 +101,4 @@
# Get Supplier Details
# --------------------
def get_supplier_details(self, name = ''):
- return cstr(get_obj('Purchase Common').get_supplier_details(name))
\ No newline at end of file
+ return get_obj('Purchase Common').get_supplier_details(name)
\ No newline at end of file
diff --git a/hr/doctype/appraisal/appraisal.py b/hr/doctype/appraisal/appraisal.py
index 1731559..e13f9f3 100644
--- a/hr/doctype/appraisal/appraisal.py
+++ b/hr/doctype/appraisal/appraisal.py
@@ -26,7 +26,7 @@
emp_nm = sql("select employee_name from `tabEmployee` where name=%s", self.doc.employee)
emp_nm= emp_nm and emp_nm[0][0] or ''
self.doc.employee_name = emp_nm
- return cstr(emp_nm)
+ return emp_nm
def fetch_kra(self):
if not self.doc.kra_template:
@@ -88,7 +88,7 @@
if d.score:
total = total + flt(d.score_earned)
ret={'total_score':flt(total)}
- return cstr(ret)
+ return ret
def declare_completed(self):
ret={}
diff --git a/hr/doctype/attendance/attendance.py b/hr/doctype/attendance/attendance.py
index d64a8e3..3c687ef 100644
--- a/hr/doctype/attendance/attendance.py
+++ b/hr/doctype/attendance/attendance.py
@@ -34,7 +34,7 @@
set(self.doc, 'employee_name', emp_nm and emp_nm[0][0] or '')
ret = { 'employee_name' : emp_nm and emp_nm[0][0] or ''}
- return str(ret)
+ return ret
#validation for duplicate record
def validate_duplicate_record(self):
diff --git a/hr/doctype/employee/employee.py b/hr/doctype/employee/employee.py
index 54142db..01ff32d 100644
--- a/hr/doctype/employee/employee.py
+++ b/hr/doctype/employee/employee.py
@@ -41,7 +41,7 @@
if self.doc.date_of_birth:
dt = getdate(self.doc.date_of_birth) + datetime.timedelta(21915)
ret = {'date_of_retirement': dt.strftime('%Y-%m-%d')}
- return str(ret)
+ return ret
# check if salary structure exists
#========================================================================================================
diff --git a/hr/doctype/leave_allocation/leave_allocation.py b/hr/doctype/leave_allocation/leave_allocation.py
index e11a335..46f7809 100755
--- a/hr/doctype/leave_allocation/leave_allocation.py
+++ b/hr/doctype/leave_allocation/leave_allocation.py
@@ -66,7 +66,7 @@
'carry_forwarded_leaves' : prev_bal,
'total_leaves_allocated' : flt(prev_bal) + flt(self.doc.new_leaves_allocated)
}
- return str(ret)
+ return ret
# ********************************************** validate *****************************************************
diff --git a/hr/doctype/leave_application/leave_application.js b/hr/doctype/leave_application/leave_application.js
index ba00a31..1eda69f 100755
--- a/hr/doctype/leave_application/leave_application.js
+++ b/hr/doctype/leave_application/leave_application.js
@@ -52,12 +52,9 @@
// to date
// --------
cur_frm.cscript.to_date = function(doc, dt, dn) {
- if(cint(doc.half_day) == 1 && doc.from_date && doc.from_date != doc.to_date){
+ if(cint(doc.half_day) == 1 && cstr(doc.from_date) && doc.from_date != doc.to_date){
msgprint("To Date should be same as From Date for Half Day leave");
- return;
- }
- if(cint(doc.half_day) == 1){
- set_multiple(dt,dn,{to_date:doc.from_date});
+ set_multiple(dt,dn,{to_date:doc.from_date});
}
calculate_total_days(doc, dt, dn);
}
diff --git a/hr/doctype/salary_slip/salary_slip.js b/hr/doctype/salary_slip/salary_slip.js
index 8c76b1e..8f953e6 100644
--- a/hr/doctype/salary_slip/salary_slip.js
+++ b/hr/doctype/salary_slip/salary_slip.js
@@ -29,7 +29,7 @@
// Calculate total if lwp exists
// ------------------------------------------------------------------------
cur_frm.cscript.leave_without_pay = function(doc,dt,dn){
- doc.payment_days = cint(doc.total_days_in_month) - cint(doc.leave_without_pay);
+ doc.payment_days = flt(doc.total_days_in_month) - flt(doc.leave_without_pay);
refresh_field('payment_days');
calculate_all(doc, dt, dn);
}
diff --git a/hr/doctype/salary_slip/salary_slip.py b/hr/doctype/salary_slip/salary_slip.py
index 9c94885..af55956 100644
--- a/hr/doctype/salary_slip/salary_slip.py
+++ b/hr/doctype/salary_slip/salary_slip.py
@@ -18,210 +18,219 @@
from utilities.transaction_base import TransactionBase
class DocType(TransactionBase):
- def __init__(self,doc,doclist=[]):
- self.doc = doc
- self.doclist = doclist
-
-
- # autoname
- #=======================================================
- def autoname(self):
- self.doc.name = make_autoname('Sal Slip/' +self.doc.employee + '/.#####')
+ def __init__(self,doc,doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
+
+
+ # autoname
+ #=======================================================
+ def autoname(self):
+ self.doc.name = make_autoname('Sal Slip/' +self.doc.employee + '/.#####')
- # Get employee details
- #=======================================================
- def get_emp_and_leave_details(self):
- # Get payment days
- if self.doc.fiscal_year and self.doc.month:
- self.get_leave_details()
+ # Get employee details
+ #=======================================================
+ def get_emp_and_leave_details(self):
+ # Get payment days
+ if self.doc.fiscal_year and self.doc.month:
+ self.get_leave_details()
- # check sal structure
- if self.doc.employee:
- struct = self.check_sal_struct()
- if struct:
- self.pull_sal_struct(struct)
+ # check sal structure
+ if self.doc.employee:
+ struct = self.check_sal_struct()
+ if struct:
+ self.pull_sal_struct(struct)
- # Check sal structure
- #=======================================================
- def check_sal_struct(self):
- struct = sql("select name from `tabSalary Structure` where employee ='%s' and is_active = 'Yes' "%self.doc.employee)
- if not struct:
- msgprint("Please create Salary Structure for employee '%s'"%self.doc.employee)
- self.doc.employee = ''
- return struct and struct[0][0] or ''
+ # Check sal structure
+ #=======================================================
+ def check_sal_struct(self):
+ struct = sql("select name from `tabSalary Structure` where employee ='%s' and is_active = 'Yes' "%self.doc.employee)
+ if not struct:
+ msgprint("Please create Salary Structure for employee '%s'"%self.doc.employee)
+ self.doc.employee = ''
+ return struct and struct[0][0] or ''
- # Pull struct details
- #=======================================================
- def pull_sal_struct(self, struct):
- self.doc.clear_table(self.doclist, 'earning_details')
- self.doc.clear_table(self.doclist, 'deduction_details')
+ # Pull struct details
+ #=======================================================
+ def pull_sal_struct(self, struct):
+ self.doc.clear_table(self.doclist, 'earning_details')
+ self.doc.clear_table(self.doclist, 'deduction_details')
- get_obj('DocType Mapper', 'Salary Structure-Salary Slip').dt_map('Salary Structure', 'Salary Slip', struct, self.doc, self.doclist, "[['Salary Structure', 'Salary Slip'],['Earning Detail', 'SS Earning Detail'],['Deduction Detail','SS Deduction Detail']]")
+ get_obj('DocType Mapper', 'Salary Structure-Salary Slip').dt_map('Salary Structure', 'Salary Slip', struct, self.doc, self.doclist, "[['Salary Structure', 'Salary Slip'],['Earning Detail', 'SS Earning Detail'],['Deduction Detail','SS Deduction Detail']]")
- basic_info = sql("select bank_name, bank_ac_no, esic_card_no, pf_number from `tabEmployee` where name ='%s'" % self.doc.employee)
- self.doc.bank_name = basic_info[0][0]
- self.doc.bank_account_no = basic_info[0][1]
- self.doc.esic_no = basic_info[0][2]
- self.doc.pf_no = basic_info[0][3]
+ basic_info = sql("select bank_name, bank_ac_no, esic_card_no, pf_number from `tabEmployee` where name ='%s'" % self.doc.employee)
+ self.doc.bank_name = basic_info[0][0]
+ self.doc.bank_account_no = basic_info[0][1]
+ self.doc.esic_no = basic_info[0][2]
+ self.doc.pf_no = basic_info[0][3]
- # Get leave details
- #=======================================================
- def get_leave_details(self):
- m = self.get_month_details()
- lwp = self.calculate_lwp(m)
- self.doc.total_days_in_month = m[3]
- self.doc.leave_without_pay = lwp
- self.doc.payment_days = flt(m[3]) - flt(lwp)
+ # Get leave details
+ #=======================================================
+ def get_leave_details(self):
+ m = self.get_month_details()
+ lwp = self.calculate_lwp(m)
+ self.doc.total_days_in_month = m[3]
+ self.doc.leave_without_pay = lwp
+ self.doc.payment_days = flt(m[3]) - flt(lwp)
- # Get month details
- #=======================================================
- def get_month_details(self):
- ysd = sql("select year_start_date from `tabFiscal Year` where name ='%s'"%self.doc.fiscal_year)[0][0]
- if ysd:
- from dateutil.relativedelta import relativedelta
- import calendar, datetime
- mnt = int(self.doc.month)
- diff_mnt = int(mnt)-int(ysd.month)
- if diff_mnt<0:
- diff_mnt = 12-int(ysd.month)+int(mnt)
- msd = ysd + relativedelta(months=diff_mnt) # month start date
- month_days = cint(calendar.monthrange(cint(msd.year) ,cint(self.doc.month))[1]) # days in month
- med = datetime.date(msd.year, cint(self.doc.month), month_days) # month end date
- return msd.year, msd, med, month_days
+ # Get month details
+ #=======================================================
+ def get_month_details(self):
+ ysd = sql("select year_start_date from `tabFiscal Year` where name ='%s'"%self.doc.fiscal_year)[0][0]
+ if ysd:
+ from dateutil.relativedelta import relativedelta
+ import calendar, datetime
+ mnt = int(self.doc.month)
+ diff_mnt = int(mnt)-int(ysd.month)
+ if diff_mnt<0:
+ diff_mnt = 12-int(ysd.month)+int(mnt)
+ msd = ysd + relativedelta(months=diff_mnt) # month start date
+ month_days = cint(calendar.monthrange(cint(msd.year) ,cint(self.doc.month))[1]) # days in month
+ med = datetime.date(msd.year, cint(self.doc.month), month_days) # month end date
+ return msd.year, msd, med, month_days
- # Calculate LWP
- #=======================================================
- def calculate_lwp(self, m):
- holidays = sql("select t1.holiday_date from `tabHoliday List Detail` t1, tabEmployee t2 where t1.parent = t2.holiday_list and t2.name = '%s' and t1.holiday_date between '%s' and '%s'" % (self.doc.employee, m[1], m[2]))
- if not holidays:
- holidays = sql("select t1.holiday_date from `tabHoliday List Detail` t1, `tabHoliday List` t2 where t1.parent = t2.name and ifnull(t2.is_default, 0) = 1 and t2.fiscal_year = '%s'" % self.doc.fiscal_year)
- holidays = [cstr(i[0]) for i in holidays]
- lwp = 0
- for d in range(m[3]):
- dt = add_days(cstr(m[1]), d)
- if dt not in holidays:
- if sql("select t1.name from `tabLeave Application` t1, `tabLeave Type` t2 where t2.name = t1.leave_type and ifnull(t2.is_lwp, 0) = 1 and t1.docstatus = 1 and t1.employee = '%s' and '%s' between from_date and to_date"%(self.doc.employee, dt)):
- lwp += 1
- return lwp
-
- # Check existing
- #=======================================================
- def check_existing(self):
- ret_exist = sql("select name from `tabSalary Slip` where month = '%s' and fiscal_year = '%s' and docstatus != 2 and employee = '%s' and name !='%s'" % (self.doc.month,self.doc.fiscal_year,self.doc.employee,self.doc.name))
- if ret_exist:
- msgprint("Salary Slip of employee '%s' already created for this month" % self.doc.employee)
- self.doc.employee = ''
- raise Exception
+ # Calculate LWP
+ #=======================================================
+ def calculate_lwp(self, m):
+ holidays = sql("select t1.holiday_date from `tabHoliday List Detail` t1, tabEmployee t2 where t1.parent = t2.holiday_list and t2.name = '%s' and t1.holiday_date between '%s' and '%s'" % (self.doc.employee, m[1], m[2]))
+ if not holidays:
+ holidays = sql("select t1.holiday_date from `tabHoliday List Detail` t1, `tabHoliday List` t2 where t1.parent = t2.name and ifnull(t2.is_default, 0) = 1 and t2.fiscal_year = '%s'" % self.doc.fiscal_year)
+ holidays = [cstr(i[0]) for i in holidays]
+ lwp = 0
+ for d in range(m[3]):
+ dt = add_days(cstr(m[1]), d)
+ if dt not in holidays:
+ leave = sql("""
+ select t1.name, t1.half_day
+ from `tabLeave Application` t1, `tabLeave Type` t2
+ where t2.name = t1.leave_type
+ and ifnull(t2.is_lwp, 0) = 1
+ and t1.docstatus = 1
+ and t1.employee = '%s'
+ and '%s' between from_date and to_date
+ """%(self.doc.employee, dt))
+ if leave:
+ lwp = cint(leave[0][1]) and lwp + 0.5 or lwp + 1
+ return lwp
+
+ # Check existing
+ #=======================================================
+ def check_existing(self):
+ ret_exist = sql("select name from `tabSalary Slip` where month = '%s' and fiscal_year = '%s' and docstatus != 2 and employee = '%s' and name !='%s'" % (self.doc.month,self.doc.fiscal_year,self.doc.employee,self.doc.name))
+ if ret_exist:
+ msgprint("Salary Slip of employee '%s' already created for this month" % self.doc.employee)
+ self.doc.employee = ''
+ raise Exception
- # Validate
- #=======================================================
- def validate(self):
- self.check_existing()
- dcc = TransactionBase().get_company_currency(self.doc.company)
- self.doc.total_in_words = get_obj('Sales Common').get_total_in_words(dcc, self.doc.rounded_total)
-
- # ON SUBMIT
- #=======================================================
- def on_submit(self):
- if(self.doc.email_check == 1):
- self.send_mail_funct()
+ # Validate
+ #=======================================================
+ def validate(self):
+ self.check_existing()
+ dcc = TransactionBase().get_company_currency(self.doc.company)
+ self.doc.total_in_words = get_obj('Sales Common').get_total_in_words(dcc, self.doc.rounded_total)
+
+ # ON SUBMIT
+ #=======================================================
+ def on_submit(self):
+ if(self.doc.email_check == 1):
+ self.send_mail_funct()
- # Send mail
- #=======================================================
- def send_mail_funct(self):
- emailid_ret=sql("select company_email from `tabEmployee` where name = '%s'"%self.doc.employee)
- if emailid_ret:
- receiver = cstr(emailid_ret[0][0])
- subj = 'Salary Slip ' + cstr(self.doc.month) +' '+cstr(self.doc.year)
- earn_ret=sql("select e_type,e_amount from `tabSS Earning Detail` where parent = '%s'"%self.doc.name)
- ded_ret=sql("select d_type,d_amount from `tabSS Deduction Detail` where parent = '%s'"%self.doc.name)
-
- earn_table = ''
- ded_table = ''
- if earn_ret:
-
- earn_table += "<table cellspacing= '5' cellpadding='5' >"
-
- for e in earn_ret:
- if not e[1]:
- earn_table +='<tr><td>%s</td><td>0.00</td></tr>'%(cstr(e[0]))
- else:
- earn_table +='<tr><td>%s</td><td>%s</td></tr>'%(cstr(e[0]),cstr(e[1]))
- earn_table += '</table>'
-
- if ded_ret:
-
- ded_table += "<table cellspacing= '5' cellpadding='5' >"
-
- for d in ded_ret:
- if not d[1]:
- ded_table +='<tr><td>%s</td><td>0.00</td></tr>'%(cstr(d[0]))
- else:
- ded_table +='<tr><td>%s</td><td>%s</td></tr>'%(cstr(d[0]),cstr(d[1]))
- ded_table += '</table>'
-
- letter_head = sql("select value from `tabSingles` where field = 'letter_head' and doctype = 'Control Panel'")
-
- if not letter_head:
- letter_head = ''
-
- msg = ''' %s <br>
- <table cellspacing= "5" cellpadding="5" >
- <tr>
- <td colspan = 4><h4>Salary Slip</h4></td>
- </tr>
- <tr>
- <td colspan = 2><b>Employee Code : %s</b></td>
- <td colspan = 2><b>Employee Name : %s</b></td>
- </tr>
- <tr>
- <td>Month : %s</td>
- <td>Year : %s</td>
- <td colspan = 2>Fiscal Year : %s</td>
- </tr>
- <tr>
- <td>Department : %s</td>
- <td>Branch : %s</td>
- <td colspan = 2>Designation : %s</td>
-
- </tr>
- <tr>
- <td>Grade : %s</td>
- <td>Bank Account No. : %s</td>
- <td colspan = 2>Bank Name : %s</td>
-
- </tr>
- <tr>
- <td>PF No. : %s</td>
- <td>ESIC No. : %s</td>
- <td colspan = 2>Arrear Amount : <b>%s</b></td>
- </tr>
- <tr>
- <td>Total days in month : %s</td>
- <td>Leave Without Pay : %s</td>
- <td colspan = 2>Payment days : %s</td>
-
- </tr>
- <br><br>
- <tr>
- <td colspan = 2><b>Earning</b></td>
- <td colspan = 2><b>Deduction</b></td>
- </tr>
- <tr>
- <td colspan = 2>%s</td>
- <td colspan = 2>%s</td>
- </tr>
- <br>
- <tr>
- <td colspan = 2><b>Gross Pay :</b> %s</td>
- <td colspan = 2><b>Total Deduction :</b> %s</td>
- </tr>
- <tr>
- <td><b>Net Pay : %s</b></td>
- <td colspan = 3><b>Net Pay (in words) : %s</b></td>
- </tr>
- </table>'''%(cstr(letter_head[0][0]),cstr(self.doc.employee),self.doc.employee_name,cstr(self.doc.month),cstr(self.doc.year),cstr(self.doc.fiscal_year),self.doc.department,self.doc.branch,self.doc.designation,self.doc.grade,cstr(self.doc.bank_account_no),self.doc.bank_name,cstr(self.doc.pf_no),cstr(self.doc.esic_no),cstr(self.doc.arrear_amount),cstr(self.doc.total_days_in_month),cstr(self.doc.leave_without_pay),cstr(self.doc.payment_days),earn_table,ded_table,cstr(self.doc.gross_pay),cstr(self.doc.total_deduction),cstr(self.doc.net_pay),cstr(self.doc.net_pay_in_words))
- sendmail([receiver], sender='automail@webnotestech.com', subject=subj, parts=[['text/plain', msg]])
- else:
- msgprint("Company Email ID not found.")
+ # Send mail
+ #=======================================================
+ def send_mail_funct(self):
+ emailid_ret=sql("select company_email from `tabEmployee` where name = '%s'"%self.doc.employee)
+ if emailid_ret:
+ receiver = cstr(emailid_ret[0][0])
+ subj = 'Salary Slip ' + cstr(self.doc.month) +' '+cstr(self.doc.year)
+ earn_ret=sql("select e_type,e_amount from `tabSS Earning Detail` where parent = '%s'"%self.doc.name)
+ ded_ret=sql("select d_type,d_amount from `tabSS Deduction Detail` where parent = '%s'"%self.doc.name)
+
+ earn_table = ''
+ ded_table = ''
+ if earn_ret:
+
+ earn_table += "<table cellspacing= '5' cellpadding='5' >"
+
+ for e in earn_ret:
+ if not e[1]:
+ earn_table +='<tr><td>%s</td><td>0.00</td></tr>'%(cstr(e[0]))
+ else:
+ earn_table +='<tr><td>%s</td><td>%s</td></tr>'%(cstr(e[0]),cstr(e[1]))
+ earn_table += '</table>'
+
+ if ded_ret:
+
+ ded_table += "<table cellspacing= '5' cellpadding='5' >"
+
+ for d in ded_ret:
+ if not d[1]:
+ ded_table +='<tr><td>%s</td><td>0.00</td></tr>'%(cstr(d[0]))
+ else:
+ ded_table +='<tr><td>%s</td><td>%s</td></tr>'%(cstr(d[0]),cstr(d[1]))
+ ded_table += '</table>'
+
+ letter_head = sql("select value from `tabSingles` where field = 'letter_head' and doctype = 'Control Panel'")
+
+ if not letter_head:
+ letter_head = ''
+
+ msg = ''' %s <br>
+ <table cellspacing= "5" cellpadding="5" >
+ <tr>
+ <td colspan = 4><h4>Salary Slip</h4></td>
+ </tr>
+ <tr>
+ <td colspan = 2><b>Employee Code : %s</b></td>
+ <td colspan = 2><b>Employee Name : %s</b></td>
+ </tr>
+ <tr>
+ <td>Month : %s</td>
+ <td>Year : %s</td>
+ <td colspan = 2>Fiscal Year : %s</td>
+ </tr>
+ <tr>
+ <td>Department : %s</td>
+ <td>Branch : %s</td>
+ <td colspan = 2>Designation : %s</td>
+
+ </tr>
+ <tr>
+ <td>Grade : %s</td>
+ <td>Bank Account No. : %s</td>
+ <td colspan = 2>Bank Name : %s</td>
+
+ </tr>
+ <tr>
+ <td>PF No. : %s</td>
+ <td>ESIC No. : %s</td>
+ <td colspan = 2>Arrear Amount : <b>%s</b></td>
+ </tr>
+ <tr>
+ <td>Total days in month : %s</td>
+ <td>Leave Without Pay : %s</td>
+ <td colspan = 2>Payment days : %s</td>
+
+ </tr>
+ <br><br>
+ <tr>
+ <td colspan = 2><b>Earning</b></td>
+ <td colspan = 2><b>Deduction</b></td>
+ </tr>
+ <tr>
+ <td colspan = 2>%s</td>
+ <td colspan = 2>%s</td>
+ </tr>
+ <br>
+ <tr>
+ <td colspan = 2><b>Gross Pay :</b> %s</td>
+ <td colspan = 2><b>Total Deduction :</b> %s</td>
+ </tr>
+ <tr>
+ <td><b>Net Pay : %s</b></td>
+ <td colspan = 3><b>Net Pay (in words) : %s</b></td>
+ </tr>
+ </table>'''%(cstr(letter_head[0][0]),cstr(self.doc.employee),self.doc.employee_name,cstr(self.doc.month),cstr(self.doc.year),cstr(self.doc.fiscal_year),self.doc.department,self.doc.branch,self.doc.designation,self.doc.grade,cstr(self.doc.bank_account_no),self.doc.bank_name,cstr(self.doc.pf_no),cstr(self.doc.esic_no),cstr(self.doc.arrear_amount),cstr(self.doc.total_days_in_month),cstr(self.doc.leave_without_pay),cstr(self.doc.payment_days),earn_table,ded_table,cstr(self.doc.gross_pay),cstr(self.doc.total_deduction),cstr(self.doc.net_pay),cstr(self.doc.net_pay_in_words))
+ sendmail([receiver], sender='automail@webnotestech.com', subject=subj, parts=[['text/plain', msg]])
+ else:
+ msgprint("Company Email ID not found.")
diff --git a/hr/doctype/salary_structure/salary_structure.py b/hr/doctype/salary_structure/salary_structure.py
index fd295ea..36a1855 100644
--- a/hr/doctype/salary_structure/salary_structure.py
+++ b/hr/doctype/salary_structure/salary_structure.py
@@ -42,7 +42,7 @@
'grade' : cstr(det[0][4]),
'backup_employee': cstr(self.doc.employee)
}
- return cstr(ret)
+ return ret
# Set Salary structure field values
@@ -53,7 +53,7 @@
'bank_ac_no' : basic_info and basic_info[0][1] or '',
'esic_no' : basic_info and basic_info[0][2] or '',
'pf_no' : basic_info and basic_info[0][3] or ''}
- return cstr(ret)
+ return ret
# Make earning and deduction table
#---------------------------------------------------------
diff --git a/patches/patch.py b/patches/patch.py
index 0eafef6..ae301b1 100644
--- a/patches/patch.py
+++ b/patches/patch.py
@@ -1374,6 +1374,34 @@
html = "acx=".join(sp_acx)
webnotes.conn.sql("""UPDATE tabItem SET description_html=%s WHERE name=%s""", (html, item))
elif patch_no == 338:
+ # Patch for billing status based on amount
+ # reload so and dn
+ reload_doc('selling','doctype','sales_order')
+ reload_doc('stock','doctype','delivery_note')
+
+ # delete billed_qty field
+ sql("delete from `tabDocField` where fieldname = 'billed_qty' and parent in ('Sales Order Detail', 'Delivery Note Detail')")
+
+ # update billed amt in item table in so and dn
+ sql(""" update `tabSales Order Detail` so
+ set billed_amt = (select sum(amount) from `tabRV Detail` where `so_detail`= so.name and docstatus=1 and parent not like 'old%%'), modified = now()""")
+
+ sql(""" update `tabDelivery Note Detail` dn
+ set billed_amt = (select sum(amount) from `tabRV Detail` where `dn_detail`= dn.name and docstatus=1 and parent not like 'old%%'), modified = now()""")
+
+ # calculate % billed based on item table
+ sql(""" update `tabSales Order` so
+ set per_billed = (select sum(if(amount > ifnull(billed_amt, 0), billed_amt, amount))/sum(amount)*100 from `tabSales Order Detail` where parent = so.name), modified = now()""")
+
+ sql(""" update `tabDelivery Note` dn
+ set per_billed = (select sum(if(amount > ifnull(billed_amt, 0), billed_amt, amount))/sum(amount)*100 from `tabDelivery Note Detail` where parent = dn.name), modified = now()""")
+
+ # update billing status based on % billed
+ sql("""update `tabSales Order` set billing_status = if(ifnull(per_billed,0) < 0.001, 'Not Billed',
+ if(per_billed >= 99.99, 'Fully Billed', 'Partly Billed'))""")
+ sql("""update `tabDelivery Note` set billing_status = if(ifnull(per_billed,0) < 0.001, 'Not Billed',
+ if(per_billed >= 99.99, 'Fully Billed', 'Partly Billed'))""")
+
# update name of questions page
sql("update tabPage set name='questions' where name='Questions'")
- sql("update tabPage set name='question-view' where name='Question View'")
\ No newline at end of file
+ sql("update tabPage set name='question-view' where name='Question View'")
diff --git a/production/doctype/bill_of_materials/bill_of_materials.py b/production/doctype/bill_of_materials/bill_of_materials.py
index f8f8e30..cc686e5 100644
--- a/production/doctype/bill_of_materials/bill_of_materials.py
+++ b/production/doctype/bill_of_materials/bill_of_materials.py
@@ -36,7 +36,7 @@
ret={
'description' : item and item[0]['description'] or ''
}
- return cstr(ret)
+ return ret
def get_workstation_details(self,workstation):
ws = sql("select hour_rate, capacity from `tabWorkstation` where name = %s",workstation , as_dict = 1)
@@ -44,7 +44,7 @@
'hour_rate' : ws and flt(ws[0]['hour_rate']) or '',
'workstation_capacity' : ws and flt(ws[0]['capacity']) or ''
}
- return cstr(ret)
+ return ret
def get_bom_material_detail(self, arg):
arg = eval(arg)
@@ -106,7 +106,7 @@
'standard_rate' : 0
}
ret_item.update(ret_bom_rates)
- return cstr(ret_item)
+ return ret_item
def set_as_default_bom(self):
# set Is Default as 1
diff --git a/production/doctype/production_planning_tool/production_planning_tool.py b/production/doctype/production_planning_tool/production_planning_tool.py
index c548173..d0ae05b 100644
--- a/production/doctype/production_planning_tool/production_planning_tool.py
+++ b/production/doctype/production_planning_tool/production_planning_tool.py
@@ -32,7 +32,7 @@
'stock_uom' : item and item[0]['stock_uom'],
'bom_no' : item and item[0]['default_bom']
}
- return cstr(ret)
+ return ret
else:
msgprint("Item %s does not exist in system." %(args['item_code']))
raise Exception
diff --git a/production/doctype/workstation/workstation.py b/production/doctype/workstation/workstation.py
index aaa4908..45851de 100644
--- a/production/doctype/workstation/workstation.py
+++ b/production/doctype/workstation/workstation.py
@@ -25,7 +25,7 @@
def update_bom_operation(self):
bom_list = sql(" select DISTINCT parent from `tabBOM Operation` where workstation = '%s'" % self.doc.name)
for bom_no in bom_list:
- sql("update `tabBOM Operation` set hour_rate = '%s' where parent = '%s' and workstation = '%s'"%( self.doc.hour_rate, bom_no, self.doc.name))
+ sql("update `tabBOM Operation` set hour_rate = '%s' where parent = '%s' and workstation = '%s'"%( self.doc.hour_rate, bom_no[0], self.doc.name))
def on_update(self):
set(self.doc, 'overhead', flt(self.doc.hour_rate_electricity) + flt(self.doc.hour_rate_consumable) + flt(self.doc.hour_rate_rent))
diff --git a/projects/doctype/project/project.py b/projects/doctype/project/project.py
index e68771c..084df6c 100644
--- a/projects/doctype/project/project.py
+++ b/projects/doctype/project/project.py
@@ -38,7 +38,7 @@
ret['contact_person'] = contact_det and contact_det[0]['contact_name'] or ''
ret['contact_no'] = contact_det and contact_det[0]['contact_no'] or ''
ret['email_id'] = contact_det and contact_det[0]['email_id'] or ''
- return cstr(ret)
+ return ret
else:
msgprint("Customer : %s does not exist in system." % (self.doc.customer))
raise Exception
@@ -65,7 +65,7 @@
#if pft > 0:
per_pft = (flt(pft) / flt(self.doc.project_value)) * 100
ret = {'gross_margin_value': pft, 'per_gross_margin': per_pft}
- return cstr(ret)
+ return ret
# validate
#================================================
diff --git a/projects/doctype/ticket/ticket.py b/projects/doctype/ticket/ticket.py
index 8d716cc..0f18b21 100644
--- a/projects/doctype/ticket/ticket.py
+++ b/projects/doctype/ticket/ticket.py
@@ -22,18 +22,18 @@
cust = sql("select customer, customer_name from `tabProject` where name = %s", self.doc.project)
if cust:
ret = {'customer': cust and cust[0][0] or '', 'customer_name': cust and cust[0][1] or ''}
- return cstr(ret)
+ return ret
def get_customer_details(self):
cust = sql("select customer_name from `tabCustomer` where name=%s", self.doc.customer)
if cust:
ret = {'customer_name': cust and cust[0][0] or ''}
- return cstr(ret)
+ return ret
def get_allocated_to_name(self):
as_em = sql("select first_name, last_name from `tabProfile` where name=%s",self.doc.allocated_to)
ret = { 'allocated_to_name' : as_em and (as_em[0][0] + ' ' + as_em[0][1]) or ''}
- return cstr(ret)
+ return ret
# validate
#--------------------------------------------
diff --git a/projects/doctype/timesheet/timesheet.py b/projects/doctype/timesheet/timesheet.py
index ba921f4..f07975c 100644
--- a/projects/doctype/timesheet/timesheet.py
+++ b/projects/doctype/timesheet/timesheet.py
@@ -32,7 +32,7 @@
tsk = sql("select name, project, customer, customer_name from `tabTicket` where subject = %s", task_sub)
if tsk:
ret = {'task_id': tsk and tsk[0][0] or '', 'project_name': tsk and tsk[0][1] or '', 'customer_name': tsk and tsk[0][3] or ''}
- return cstr(ret)
+ return ret
def validate(self):
if getdate(self.doc.timesheet_date) > getdate(nowdate()):
diff --git a/selling/doctype/enquiry/enquiry.py b/selling/doctype/enquiry/enquiry.py
index 61bc4ec..1259702 100644
--- a/selling/doctype/enquiry/enquiry.py
+++ b/selling/doctype/enquiry/enquiry.py
@@ -50,7 +50,7 @@
ret['contact_no'] = contact_det and contact_det[0]['contact_no'] or ''
ret['email_id'] = contact_det and contact_det[0]['email_id'] or ''
- return cstr(ret)
+ return ret
else:
msgprint("Customer : %s does not exist in system." % (name))
raise Exception
@@ -64,7 +64,7 @@
'contact_no' : contact and contact[0]['contact_no'] or '',
'email_id' : contact and contact[0]['email_id'] or ''
}
- return str(ret)
+ return ret
# ====================================================================================================================
def on_update(self):
@@ -184,7 +184,7 @@
else:
set(self.doc, 'status', 'Enquiry Lost')
set(self.doc, 'order_lost_reason', arg)
- return cstr('true')
+ return 'true'
# ====================================================================================================================
def update_follow_up(self):
diff --git a/selling/doctype/installation_note/installation_note.py b/selling/doctype/installation_note/installation_note.py
index ce21363..e0af7ec 100644
--- a/selling/doctype/installation_note/installation_note.py
+++ b/selling/doctype/installation_note/installation_note.py
@@ -29,20 +29,7 @@
# ---------
def autoname(self):
self.doc.name = make_autoname(self.doc.naming_series+'.#####')
-
- #fetch customer details
- #=================================
- #def get_customer_details(self):
- # det = sql("select t1.customer_name, t1.address,t1.territory,t2.contact_name from `tabCustomer` t1, `tabContact` t2 where t1.name = '%s' and t1.name=t2.customer and t2.is_primary_contact = 'Yes'"%self.doc.customer, as_dict=1)
-
- # ret = {
- # 'customer_name': det and det[0]['customer_name'] or '',
- # 'address' : det and det[0]['address'] or '',
- # 'territory': det and det[0]['territory'] or '',
- # 'contact_person' : det and det[0]['contact_name'] or ''
- # }
-
- # return str(ret)
+
#fetch delivery note details
#====================================
diff --git a/selling/doctype/lead/lead.py b/selling/doctype/lead/lead.py
index 1bf8c8d..14d14e1 100644
--- a/selling/doctype/lead/lead.py
+++ b/selling/doctype/lead/lead.py
@@ -51,7 +51,7 @@
'description': it and it[0][3] or '',
'uom' : it and it[0][4] or ''
}
- return cstr(ret)
+ return ret
def validate(self):
import string
diff --git a/selling/doctype/quotation/quotation.py b/selling/doctype/quotation/quotation.py
index aed868e..1175540 100644
--- a/selling/doctype/quotation/quotation.py
+++ b/selling/doctype/quotation/quotation.py
@@ -45,17 +45,12 @@
self.get_adj_percent()
- return cstr(self.doc.quotation_to)
-
- # Get Customer Details
- # --------------------
- #def get_customer_details(self):
- # return cstr(get_obj('Sales Common').get_customer_details(self))
+ return self.doc.quotation_to
# Get contact person details based on customer selected
# ------------------------------------------------------
def get_contact_details(self):
- return cstr(get_obj('Sales Common').get_contact_details(self,0))
+ return get_obj('Sales Common').get_contact_details(self,0)
# Clear Quotation Details
# -----------------------
@@ -111,7 +106,7 @@
'contact_mobile' : details and details[0]['mobile_no'] or '-',
'contact_email' : details and details[0]['email_id'] or '-'
}
- return cstr(ret)
+ return ret
# GET TERMS AND CONDITIONS
@@ -295,7 +290,7 @@
set(self.doc, 'status', 'Order Lost')
set(self.doc, 'order_lost_reason', arg)
self.update_enquiry('order lost')
- return cstr('true')
+ return 'true'
#check if value entered in item table
#--------------------------------------
diff --git a/selling/doctype/sales_common/sales_common.py b/selling/doctype/sales_common/sales_common.py
index 25dd960..acdca50 100644
--- a/selling/doctype/sales_common/sales_common.py
+++ b/selling/doctype/sales_common/sales_common.py
@@ -118,21 +118,21 @@
t = {}
for x in tax: t[x[0]] = flt(x[1])
ret = {
- 'description' : item and item[0]['description_html'] or item[0]['description'],
- 'item_group' : item and item[0]['item_group'] or '',
- 'item_name' : item and item[0]['item_name'] or '',
- 'brand' : item and item[0]['brand'] or '',
- 'stock_uom' : item and item[0]['stock_uom'] or '',
- 'reserved_warehouse' : item and item[0]['default_warehouse'] or '',
- 'warehouse' : item and item[0]['default_warehouse'] or '',
- 'income_account' : item and item[0]['default_income_account'] or '',
- 'cost_center' : item and item[0]['default_sales_cost_center'] or '',
- 'qty' : 1.00, # this is done coz if item once fetched is fetched again thn its qty shld be reset to 1
- 'adj_rate' : 0,
- 'amount' : 0,
- 'export_amount' : 0,
- 'item_tax_rate' : str(t),
- 'batch_no' : ''
+ 'description' : item and item[0]['description_html'] or item[0]['description'],
+ 'item_group' : item and item[0]['item_group'] or '',
+ 'item_name' : item and item[0]['item_name'] or '',
+ 'brand' : item and item[0]['brand'] or '',
+ 'stock_uom' : item and item[0]['stock_uom'] or '',
+ 'reserved_warehouse' : item and item[0]['default_warehouse'] or '',
+ 'warehouse' : item and item[0]['default_warehouse'] or '',
+ 'income_account' : item and item[0]['default_income_account'] or '',
+ 'cost_center' : item and item[0]['default_sales_cost_center'] or '',
+ 'qty' : 1.00, # this is done coz if item once fetched is fetched again thn its qty shld be reset to 1
+ 'adj_rate' : 0,
+ 'amount' : 0,
+ 'export_amount' : 0,
+ 'item_tax_rate' : str(t),
+ 'batch_no' : ''
}
if(obj.doc.price_list_name and item): #this is done to fetch the changed BASIC RATE and REF RATE based on PRICE LIST
ref_rate = self.get_ref_rate(item_code, obj.doc.price_list_name, obj.doc.currency)
@@ -143,7 +143,8 @@
if obj.doc.doctype == 'Receivable Voucher':
return ret
- return str(ret)
+
+ return ret
# ***************** Get Ref rate as entered in Item Master ********************
def get_ref_rate(self, item_code, price_list_name, currency):
@@ -161,7 +162,6 @@
d.base_ref_rate = flt(ref_rate) * flt(obj.doc.conversion_rate)
d.export_rate = flt(ref_rate)
-
# Load Default Taxes
# ====================
def load_default_taxes(self, obj):
@@ -203,7 +203,7 @@
ret = {
'item_tax_rate' : tax and str(t) or ''
}
- return str(ret)
+ return ret
# Get Serial No Details
# ==========================================================================
@@ -220,7 +220,7 @@
'description' : item and item[0]['description'] or '',
'item_tax_rate' : str(t)
}
- return str(ret)
+ return ret
# Get Commission rate
# =======================================================================
@@ -233,7 +233,7 @@
'commission_rate' : comm_rate and flt(comm_rate[0]['commission_rate']) or 0,
'total_commission' : flt(total_comm)
}
- return str(ret)
+ return ret
else:
msgprint("Business Associate : %s does not exist in the system." % (sales_partner))
raise Exception
@@ -287,7 +287,7 @@
ret = {
'rate' : rate and flt(rate[0]['tax_rate']) or 0
}
- return cstr(ret)
+ return ret
# Make Packing List from Sales BOM
@@ -324,11 +324,33 @@
if self.has_sales_bom(d.item_code):
for i in self.get_sales_bom_items(d.item_code):
- il.append([warehouse, i[0], flt(flt(i[1])* qty), reserved_qty, i[2], d.batch_no, d.serial_no])
+ il.append([warehouse, i[0], flt(flt(i[1])* qty), flt(flt(i[1])*reserved_qty), i[2], d.batch_no, d.serial_no])
else:
il.append([warehouse, d.item_code, qty, reserved_qty, d.stock_uom, d.batch_no, d.serial_no])
return il
+ # ---------------------------------------------------------------------------------------------
+ # get qty, amount already billed or delivered against curr line item for current doctype
+ # For Eg: SO-RV get total qty, amount from SO and also total qty, amount against that SO in RV
+ # ---------------------------------------------------------------------------------------------
+ def get_curr_and_ref_doc_details(self, curr_doctype, ref_tab_fname, ref_tab_dn, ref_doc_tname, curr_parent_name, curr_parent_doctype):
+ # Get total qty, amt of current doctype (eg RV) except for qty, amt of this transaction
+ if curr_parent_doctype == 'Installation Note':
+ curr_det = sql("select sum(qty) from `tab%s` where %s = '%s' and docstatus = 1 and parent != '%s'"% (curr_doctype, ref_tab_fname, ref_tab_dn, curr_parent_name))
+ qty, amt = curr_det and flt(curr_det[0][0]) or 0, 0
+ else:
+ curr_det = sql("select sum(qty), sum(amount) from `tab%s` where %s = '%s' and docstatus = 1 and parent != '%s'"% (curr_doctype, ref_tab_fname, ref_tab_dn, curr_parent_name))
+ qty, amt = curr_det and flt(curr_det[0][0]) or 0, curr_det and flt(curr_det[0][1]) or 0
+
+ # get total qty of ref doctype
+ ref_det = sql("select qty, amount from `tab%s` where name = '%s' and docstatus = 1"% (ref_doc_tname, ref_tab_dn))
+ max_qty, max_amt = ref_det and flt(ref_det[0][0]) or 0, ref_det and flt(ref_det[0][1]) or 0
+
+ return qty, max_qty, amt, max_amt
+
+
+
+
# -----------------------
# add packing list items
@@ -458,26 +480,6 @@
def update_prevdoc_detail(self, is_submit, obj):
StatusUpdater(obj, is_submit).update()
- # ---------------------------------------------------------------------------------------------
- # get qty, amount already billed or delivered against curr line item for current doctype
- # For Eg: SO-RV get total qty, amount from SO and also total qty, amount against that SO in RV
- # ---------------------------------------------------------------------------------------------
- def get_curr_and_ref_doc_details(self, curr_doctype, ref_tab_fname, ref_tab_dn, ref_doc_tname, curr_parent_name, curr_parent_doctype):
- # Get total qty, amt of current doctype (eg RV) except for qty, amt of this transaction
- if curr_parent_doctype == 'Installation Note':
- curr_det = sql("select sum(qty) from `tab%s` where %s = '%s' and docstatus = 1 and parent != '%s'"% (curr_doctype, ref_tab_fname, ref_tab_dn, curr_parent_name))
- qty, amt = curr_det and flt(curr_det[0][0]) or 0, 0
- else:
- curr_det = sql("select sum(qty), sum(amount) from `tab%s` where %s = '%s' and docstatus = 1 and parent != '%s'"% (curr_doctype, ref_tab_fname, ref_tab_dn, curr_parent_name))
- qty, amt = curr_det and flt(curr_det[0][0]) or 0, curr_det and flt(curr_det[0][1]) or 0
-
- # get total qty of ref doctype
- ref_det = sql("select qty, amount from `tab%s` where name = '%s' and docstatus = 1"% (ref_doc_tname, ref_tab_dn))
- max_qty, max_amt = ref_det and flt(ref_det[0][0]) or 0, ref_det and flt(ref_det[0][1]) or 0
-
- return qty, max_qty, amt, max_amt
-
-
@@ -496,7 +498,7 @@
- Validate over delivery
From Receivable Voucher
- - Update Billed Qty
+ - Update Billed Amt
- Update Percent
- Validate over billing
@@ -524,23 +526,33 @@
self.validate_qty({
'source_dt' :'Delivery Note Detail',
'compare_field' :'delivered_qty',
+ 'compare_ref_field' :'qty',
'target_dt' :'Sales Order Detail',
'join_field' :'prevdoc_detail_docname'
})
elif self.obj.doc.doctype=='Receivable Voucher':
self.validate_qty({
'source_dt' :'RV Detail',
- 'compare_field' :'billed_qty',
+ 'compare_field' :'billed_amt',
+ 'compare_ref_field' :'amount',
'target_dt' :'Sales Order Detail',
'join_field' :'so_detail'
})
+ self.validate_qty({
+ 'source_dt' :'RV Detail',
+ 'compare_field' :'billed_amt',
+ 'compare_ref_field' :'amount',
+ 'target_dt' :'Delivery Note Detail',
+ 'join_field' :'dn_detail'
+ }, no_tolerance =1)
elif self.obj.doc.doctype=='Installation Note':
self.validate_qty({
'source_dt' :'Installation Item Details',
'compare_field' :'installed_qty',
+ 'compare_ref_field' :'qty',
'target_dt' :'Delivery Note Detail',
'join_field' :'dn_detail'
- }, no_tolerance =1);
+ }, no_tolerance =1)
def get_tolerance_for(self, item_code):
@@ -567,22 +579,22 @@
# check if overflow is within tolerance
tolerance = self.get_tolerance_for(item['item_code'])
- overflow_percent = ((item[args['compare_field']] - item['qty']) / item['qty'] * 100)
+ overflow_percent = ((item[args['compare_field']] - item[args['compare_ref_field']]) / item[args['compare_ref_field']] * 100)
if overflow_percent - tolerance > 0.0001:
- item['max_allowed'] = flt(item['qty'] * (100+tolerance)/100)
+ item['max_allowed'] = flt(item[args['compare_ref_field']] * (100+tolerance)/100)
item['reduce_by'] = item[args['compare_field']] - item['max_allowed']
msgprint("""
- Row #%(idx)s: Max qty allowed for <b>Item %(item_code)s</b> against <b>%(parenttype)s %(parent)s</b> is <b>%(max_allowed)s</b>.
+ Row #%(idx)s: Max %(compare_ref_field)s allowed for <b>Item %(item_code)s</b> against <b>%(parenttype)s %(parent)s</b> is <b>%(max_allowed)s</b>.
If you want to increase your overflow tolerance, please increase tolerance %% in Global Defaults or Item master.
- Or, you must reduce the qty by %(reduce_by)s""" % item, raise_exception=1)
+ Or, you must reduce the %(compare_ref_field)s by %(reduce_by)s""" % item, raise_exception=1)
def validate_qty(self, args, no_tolerance=None):
"""
- Updates qty at row level
+ Validates qty at row level
"""
# get unique transactions to update
for d in self.obj.doclist:
@@ -591,22 +603,23 @@
# get all qty where qty > compare_field
item = sql("""
- select item_code, qty, `%(compare_field)s`, parenttype, parent from `tab%(target_dt)s`
- where qty < `%(compare_field)s` and name="%(name)s" and docstatus=1
+ select item_code, `%(compare_ref_field)s`, `%(compare_field)s`, parenttype, parent from `tab%(target_dt)s`
+ where `%(compare_ref_field)s` < `%(compare_field)s` and name="%(name)s" and docstatus=1
""" % args, as_dict=1)
if item:
item = item[0]
item['idx'] = d.idx
-
+ item['compare_ref_field'] = args['compare_ref_field']
if no_tolerance:
- item['reduce_by'] = item[args['compare_field']] - item['qty']
+ item['reduce_by'] = item[args['compare_field']] - item[args['compare_ref_field']]
msgprint("""
- Row #%(idx)s: Max qty allowed for <b>Item %(item_code)s</b> against
- <b>%(parenttype)s %(parent)s</b> is <b>%(qty)s</b>.
+ Row #%(idx)s: Max %(compare_ref_field)s allowed for <b>Item %(item_code)s</b> against
+ <b>%(parenttype)s %(parent)s</b> is <b>""" % item
+ + cstr(item[args['compare_ref_field']]) + """</b>.
- You must reduce the qty by %(reduce_by)s""" % item, raise_exception=1)
-
+ You must reduce the %(compare_ref_field)s by %(reduce_by)s""" % item, raise_exception=1)
+
else:
self.check_overflow_with_tolerance(item, args)
@@ -621,6 +634,7 @@
'target_dt' :'Sales Order Detail',
'target_parent_dt' :'Sales Order',
'target_parent_field' :'per_delivered',
+ 'target_ref_field' :'qty',
'source_dt' :'Delivery Note Detail',
'source_field' :'qty',
'join_field' :'prevdoc_detail_docname',
@@ -631,12 +645,13 @@
elif self.obj.doc.doctype=='Receivable Voucher':
self.update_qty({
- 'target_field' :'billed_qty',
+ 'target_field' :'billed_amt',
'target_dt' :'Sales Order Detail',
'target_parent_dt' :'Sales Order',
'target_parent_field' :'per_billed',
+ 'target_ref_field' :'amount',
'source_dt' :'RV Detail',
- 'source_field' :'qty',
+ 'source_field' :'amount',
'join_field' :'so_detail',
'percent_join_field' :'sales_order',
'status_field' :'billing_status',
@@ -644,12 +659,13 @@
})
self.update_qty({
- 'target_field' :'billed_qty',
+ 'target_field' :'billed_amt',
'target_dt' :'Delivery Note Detail',
'target_parent_dt' :'Delivery Note',
'target_parent_field' :'per_billed',
+ 'target_ref_field' :'amount',
'source_dt' :'RV Detail',
- 'source_field' :'qty',
+ 'source_field' :'amount',
'join_field' :'dn_detail',
'percent_join_field' :'delivery_note',
'status_field' :'billing_status',
@@ -662,6 +678,7 @@
'target_dt' :'Delivery Note Detail',
'target_parent_dt' :'Delivery Note',
'target_parent_field' :'per_installed',
+ 'target_ref_field' :'qty',
'source_dt' :'Installed Item Details',
'source_field' :'qty',
'join_field' :'prevdoc_detail_docname',
@@ -692,7 +709,7 @@
update
`tab%(target_dt)s`
set
- %(target_field)s = (select sum(qty) from `tab%(source_dt)s` where `%(join_field)s`="%(detail_id)s" and (docstatus=1 %(cond)s))
+ %(target_field)s = (select sum(%(source_field)s) from `tab%(source_dt)s` where `%(join_field)s`="%(detail_id)s" and (docstatus=1 %(cond)s))
where
name="%(detail_id)s"
""" % args)
@@ -708,10 +725,10 @@
`tab%(target_parent_dt)s`
set
%(target_parent_field)s =
- (select sum(if(qty > ifnull(%(target_field)s, 0), %(target_field)s, qty))/sum(qty)*100 from `tab%(target_dt)s` where parent="%(name)s"),
+ (select sum(if(%(target_ref_field)s > ifnull(%(target_field)s, 0), %(target_field)s, %(target_ref_field)s))/sum(%(target_ref_field)s)*100 from `tab%(target_dt)s` where parent="%(name)s"),
modified = now()
- where
- name="%(name)s"
+ where
+ name="%(name)s"
""" % args)
# update field
diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py
index 11842fb..ca5af7a 100644
--- a/selling/doctype/sales_order/sales_order.py
+++ b/selling/doctype/sales_order/sales_order.py
@@ -19,470 +19,469 @@
from utilities.transaction_base import TransactionBase
class DocType(TransactionBase):
- def __init__(self, doc, doclist=[]):
- self.doc = doc
- self.doclist = doclist
- self.tname = 'Sales Order Detail'
- self.fname = 'sales_order_details'
- self.person_tname = 'Target Detail'
- self.partner_tname = 'Partner Target Detail'
- self.territory_tname = 'Territory Target Detail'
+ def __init__(self, doc, doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
+ self.tname = 'Sales Order Detail'
+ self.fname = 'sales_order_details'
+ self.person_tname = 'Target Detail'
+ self.partner_tname = 'Partner Target Detail'
+ self.territory_tname = 'Territory Target Detail'
# Autoname
# ===============
- def autoname(self):
- self.doc.name = make_autoname(self.doc.naming_series+'.#####')
+ def autoname(self):
+ self.doc.name = make_autoname(self.doc.naming_series+'.#####')
-
+
# DOCTYPE TRIGGER FUNCTIONS
# =============================
- # Pull Quotation Details
- # -----------------------
- def pull_quotation_details(self):
- self.doc.clear_table(self.doclist, 'other_charges')
- self.doc.clear_table(self.doclist, 'sales_order_details')
- self.doc.clear_table(self.doclist, 'sales_team')
- self.doc.clear_table(self.doclist, 'tc_details')
- if self.doc.quotation_no:
- get_obj('DocType Mapper', 'Quotation-Sales Order').dt_map('Quotation', 'Sales Order', self.doc.quotation_no, self.doc, self.doclist, "[['Quotation', 'Sales Order'],['Quotation Detail', 'Sales Order Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team'],['TC Detail','TC Detail']]")
- else:
- msgprint("Please select Quotation whose details need to pull")
+ # Pull Quotation Details
+ # -----------------------
+ def pull_quotation_details(self):
+ self.doc.clear_table(self.doclist, 'other_charges')
+ self.doc.clear_table(self.doclist, 'sales_order_details')
+ self.doc.clear_table(self.doclist, 'sales_team')
+ self.doc.clear_table(self.doclist, 'tc_details')
+ if self.doc.quotation_no:
+ get_obj('DocType Mapper', 'Quotation-Sales Order').dt_map('Quotation', 'Sales Order', self.doc.quotation_no, self.doc, self.doclist, "[['Quotation', 'Sales Order'],['Quotation Detail', 'Sales Order Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team'],['TC Detail','TC Detail']]")
+ else:
+ msgprint("Please select Quotation whose details need to pull")
- return cstr(self.doc.quotation_no)
-
- #pull project customer
- #-------------------------
- def pull_project_customer(self):
- res = sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name)
- if res:
- get_obj('DocType Mapper', 'Project-Sales Order').dt_map('Project', 'Sales Order', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Sales Order']]")
-
-
- # Get Customer Details
- # ---------------------
- #def get_customer_details(self):
- # sales_com_obj = get_obj('Sales Common')
- # sales_com_obj.get_customer_details(self)
- # sales_com_obj.get_shipping_details(self)
+ return cstr(self.doc.quotation_no)
+
+ #pull project customer
+ #-------------------------
+ def pull_project_customer(self):
+ res = sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name)
+ if res:
+ get_obj('DocType Mapper', 'Project-Sales Order').dt_map('Project', 'Sales Order', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Sales Order']]")
+
+
+ # Get Customer Details
+ # ---------------------
+ #def get_customer_details(self):
+ # sales_com_obj = get_obj('Sales Common')
+ # sales_com_obj.get_customer_details(self)
+ # sales_com_obj.get_shipping_details(self)
- # Get contact person details based on customer selected
- # ------------------------------------------------------
- def get_contact_details(self):
- get_obj('Sales Common').get_contact_details(self,0)
+ # Get contact person details based on customer selected
+ # ------------------------------------------------------
+ def get_contact_details(self):
+ get_obj('Sales Common').get_contact_details(self,0)
- # Get Commission rate of Sales Partner
- # -------------------------------------
- def get_comm_rate(self, sales_partner):
- return get_obj('Sales Common').get_comm_rate(sales_partner, self)
+ # Get Commission rate of Sales Partner
+ # -------------------------------------
+ def get_comm_rate(self, sales_partner):
+ return get_obj('Sales Common').get_comm_rate(sales_partner, self)
- # Clear Sales Order Details Table
- # --------------------------------
- def clear_sales_order_details(self):
- self.doc.clear_table(self.doclist, 'sales_order_details')
-
+ # Clear Sales Order Details Table
+ # --------------------------------
+ def clear_sales_order_details(self):
+ self.doc.clear_table(self.doclist, 'sales_order_details')
+
# SALES ORDER DETAILS TRIGGER FUNCTIONS
# ================================================================================
- # Get Item Details
- # ----------------
- def get_item_details(self, item_code):
- return get_obj('Sales Common').get_item_details(item_code, self)
+ # Get Item Details
+ # ----------------
+ def get_item_details(self, item_code):
+ return get_obj('Sales Common').get_item_details(item_code, self)
- # Re-calculates Basic Rate & amount based on Price List Selected
- # --------------------------------------------------------------
- def get_adj_percent(self, arg=''):
- get_obj('Sales Common').get_adj_percent(self)
+ # Re-calculates Basic Rate & amount based on Price List Selected
+ # --------------------------------------------------------------
+ def get_adj_percent(self, arg=''):
+ get_obj('Sales Common').get_adj_percent(self)
- # Get projected qty of item based on warehouse selected
- # -----------------------------------------------------
- def get_available_qty(self,args):
- args = eval(args)
- tot_avail_qty = sql("select projected_qty, actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (args['item_code'], args['warehouse']), as_dict=1)
- ret = {
- 'projected_qty' : tot_avail_qty and flt(tot_avail_qty[0]['projected_qty']) or 0,
- 'actual_qty' : tot_avail_qty and flt(tot_avail_qty[0]['actual_qty']) or 0
- }
- return cstr(ret)
-
-
+ # Get projected qty of item based on warehouse selected
+ # -----------------------------------------------------
+ def get_available_qty(self,args):
+ args = eval(args)
+ tot_avail_qty = sql("select projected_qty, actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (args['item_code'], args['warehouse']), as_dict=1)
+ ret = {
+ 'projected_qty' : tot_avail_qty and flt(tot_avail_qty[0]['projected_qty']) or 0,
+ 'actual_qty' : tot_avail_qty and flt(tot_avail_qty[0]['actual_qty']) or 0
+ }
+ return ret
+
# OTHER CHARGES TRIGGER FUNCTIONS
# ====================================================================================
-
- # Get Tax rate if account type is TAX
- # ------------------------------------
- def get_rate(self,arg):
- return get_obj('Sales Common').get_rate(arg)
+
+ # Get Tax rate if account type is TAX
+ # ------------------------------------
+ def get_rate(self,arg):
+ return get_obj('Sales Common').get_rate(arg)
- # Load Default Charges
- # ----------------------------------------------------------
- def load_default_taxes(self):
- return get_obj('Sales Common').load_default_taxes(self)
+ # Load Default Charges
+ # ----------------------------------------------------------
+ def load_default_taxes(self):
+ return get_obj('Sales Common').load_default_taxes(self)
- # Pull details from other charges master (Get Other Charges)
- # ----------------------------------------------------------
- def get_other_charges(self):
- return get_obj('Sales Common').get_other_charges(self)
+ # Pull details from other charges master (Get Other Charges)
+ # ----------------------------------------------------------
+ def get_other_charges(self):
+ return get_obj('Sales Common').get_other_charges(self)
# GET TERMS & CONDITIONS
# =====================================================================================
- def get_tc_details(self):
- return get_obj('Sales Common').get_tc_details(self)
+ def get_tc_details(self):
+ return get_obj('Sales Common').get_tc_details(self)
#check if maintenance schedule already generated
#============================================
- def check_maintenance_schedule(self):
- nm = sql("select t1.name from `tabMaintenance Schedule` t1, `tabItem Maintenance Detail` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", self.doc.name)
- nm = nm and nm[0][0] or ''
-
- if not nm:
- return cstr('No')
+ def check_maintenance_schedule(self):
+ nm = sql("select t1.name from `tabMaintenance Schedule` t1, `tabItem Maintenance Detail` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", self.doc.name)
+ nm = nm and nm[0][0] or ''
+
+ if not nm:
+ return 'No'
#check if maintenance visit already generated
#============================================
- def check_maintenance_visit(self):
- nm = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Detail` 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 cstr('No')
+ def check_maintenance_visit(self):
+ nm = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Detail` 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'
# VALIDATE
# =====================================================================================
- # Fiscal Year Validation
- # ----------------------
- def validate_fiscal_year(self):
- get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Sales Order Date')
-
- # Validate values with reference document
- #----------------------------------------
- def validate_reference_value(self):
- get_obj('DocType Mapper', 'Quotation-Sales Order', with_children = 1).validate_reference_value(self, self.doc.name)
+ # Fiscal Year Validation
+ # ----------------------
+ def validate_fiscal_year(self):
+ get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Sales Order Date')
+
+ # Validate values with reference document
+ #----------------------------------------
+ def validate_reference_value(self):
+ get_obj('DocType Mapper', 'Quotation-Sales Order', with_children = 1).validate_reference_value(self, self.doc.name)
- # Validate Mandatory
- # -------------------
- def validate_mandatory(self):
- # validate transaction date v/s delivery date
- if self.doc.delivery_date:
- if getdate(self.doc.transaction_date) > getdate(self.doc.delivery_date):
- msgprint("Expected Delivery Date cannot be before Sales Order Date")
- raise Exception
+ # Validate Mandatory
+ # -------------------
+ def validate_mandatory(self):
+ # validate transaction date v/s delivery date
+ if self.doc.delivery_date:
+ if getdate(self.doc.transaction_date) > getdate(self.doc.delivery_date):
+ msgprint("Expected Delivery Date cannot be before Sales Order Date")
+ raise Exception
- # Validate P.O Date
- # ------------------
- def validate_po_date(self):
- # validate p.o date v/s delivery date
- if self.doc.po_date and self.doc.delivery_date and getdate(self.doc.po_date) >= getdate(self.doc.delivery_date):
- msgprint("Expected Delivery Date cannot be before Purchase Order Date")
- raise Exception
- # amendment date is necessary if document is amended
- if self.doc.amended_from and not self.doc.amendment_date:
- msgprint("Please Enter Amendment Date")
- raise Exception
-
- # Validations of Details Table
- # -----------------------------
- def validate_for_items(self):
- check_list,flag = [],0
- chk_dupl_itm = []
- # Sales Order Details Validations
- for d in getlist(self.doclist, 'sales_order_details'):
- if cstr(self.doc.quotation_no) == cstr(d.prevdoc_docname):
- flag = 1
- if d.prevdoc_docname:
- if self.doc.quotation_date and getdate(self.doc.quotation_date) > getdate(self.doc.transaction_date):
- msgprint("Sales Order Date cannot be before Quotation Date")
- raise Exception
- # validates whether quotation no in doctype and in table is same
- if not cstr(d.prevdoc_docname) == cstr(self.doc.quotation_no):
- msgprint("Items in table does not belong to the Quotation No mentioned.")
- raise Exception
+ # Validate P.O Date
+ # ------------------
+ def validate_po_date(self):
+ # validate p.o date v/s delivery date
+ if self.doc.po_date and self.doc.delivery_date and getdate(self.doc.po_date) >= getdate(self.doc.delivery_date):
+ msgprint("Expected Delivery Date cannot be before Purchase Order Date")
+ raise Exception
+ # amendment date is necessary if document is amended
+ if self.doc.amended_from and not self.doc.amendment_date:
+ msgprint("Please Enter Amendment Date")
+ raise Exception
+
+ # Validations of Details Table
+ # -----------------------------
+ def validate_for_items(self):
+ check_list,flag = [],0
+ chk_dupl_itm = []
+ # Sales Order Details Validations
+ for d in getlist(self.doclist, 'sales_order_details'):
+ if cstr(self.doc.quotation_no) == cstr(d.prevdoc_docname):
+ flag = 1
+ if d.prevdoc_docname:
+ if self.doc.quotation_date and getdate(self.doc.quotation_date) > getdate(self.doc.transaction_date):
+ msgprint("Sales Order Date cannot be before Quotation Date")
+ raise Exception
+ # validates whether quotation no in doctype and in table is same
+ if not cstr(d.prevdoc_docname) == cstr(self.doc.quotation_no):
+ msgprint("Items in table does not belong to the Quotation No mentioned.")
+ raise Exception
- # validates whether item is not entered twice
- e = [d.item_code, d.description, d.reserved_warehouse, d.prevdoc_docname or '']
- f = [d.item_code, d.description]
+ # validates whether item is not entered twice
+ e = [d.item_code, d.description, d.reserved_warehouse, d.prevdoc_docname or '']
+ f = [d.item_code, d.description]
- #check item is stock item
- st_itm = sql("select is_stock_item from `tabItem` where name = '%s'"%d.item_code)
+ #check item is stock item
+ st_itm = sql("select is_stock_item from `tabItem` where name = '%s'"%d.item_code)
- if st_itm and st_itm[0][0] == 'Yes':
- if e in check_list:
- msgprint("Item %s has been entered twice." % d.item_code)
- else:
- check_list.append(e)
- elif st_itm and st_itm[0][0]== 'No':
- if f in chk_dupl_itm:
- msgprint("Item %s has been entered twice." % d.item_code)
- else:
- chk_dupl_itm.append(f)
+ if st_itm and st_itm[0][0] == 'Yes':
+ if e in check_list:
+ msgprint("Item %s has been entered twice." % d.item_code)
+ else:
+ check_list.append(e)
+ elif st_itm and st_itm[0][0]== 'No':
+ if f in chk_dupl_itm:
+ msgprint("Item %s has been entered twice." % d.item_code)
+ else:
+ chk_dupl_itm.append(f)
- # used for production plan
- d.transaction_date = self.doc.transaction_date
- d.delivery_date = self.doc.delivery_date
+ # used for production plan
+ d.transaction_date = self.doc.transaction_date
+ d.delivery_date = self.doc.delivery_date
- # gets total projected qty of item in warehouse selected (this case arises when warehouse is selected b4 item)
- tot_avail_qty = sql("select projected_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (d.item_code,d.reserved_warehouse))
- d.projected_qty = tot_avail_qty and flt(tot_avail_qty[0][0]) or 0
-
- if flag == 0:
- msgprint("There are no items of the quotation selected.")
- raise Exception
+ # gets total projected qty of item in warehouse selected (this case arises when warehouse is selected b4 item)
+ tot_avail_qty = sql("select projected_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (d.item_code,d.reserved_warehouse))
+ d.projected_qty = tot_avail_qty and flt(tot_avail_qty[0][0]) or 0
+
+ if flag == 0:
+ msgprint("There are no items of the quotation selected.")
+ raise Exception
- # validate sales/ service item against order type
- #----------------------------------------------------
- def validate_sales_mntc_item(self):
- if self.doc.order_type == 'Maintenance':
- item_field = 'is_service_item'
- order_type = 'Maintenance Order'
- item_type = 'service item'
- else :
- item_field = 'is_sales_item'
- order_type = 'Sales Order'
- item_type = 'sales item'
-
- for d in getlist(self.doclist, 'sales_order_details'):
- res = sql("select %s from `tabItem` where name='%s'"% (item_field,d.item_code))
- res = res and res[0][0] or 'No'
-
- if res == 'No':
- msgprint("You can not select non "+item_type+" "+d.item_code+" in "+order_type)
- raise Exception
-
- # validate sales/ maintenance quotation against order type
- #------------------------------------------------------------------
- def validate_sales_mntc_quotation(self):
- for d in getlist(self.doclist, 'sales_order_details'):
- if d.prevdoc_docname:
- res = sql("select order_type from `tabQuotation` where name=%s", (d.prevdoc_docname))
- res = res and res[0][0] or ''
-
- if self.doc.order_type== 'Maintenance' and res != 'Maintenance':
- msgprint("You can not select non Maintenance Quotation against Maintenance Order")
- raise Exception
- elif self.doc.order_type != 'Maintenance' and res == 'Maintenance':
- msgprint("You can not select non Sales Quotation against Sales Order")
- raise Exception
+ # validate sales/ service item against order type
+ #----------------------------------------------------
+ def validate_sales_mntc_item(self):
+ if self.doc.order_type == 'Maintenance':
+ item_field = 'is_service_item'
+ order_type = 'Maintenance Order'
+ item_type = 'service item'
+ else :
+ item_field = 'is_sales_item'
+ order_type = 'Sales Order'
+ item_type = 'sales item'
+
+ for d in getlist(self.doclist, 'sales_order_details'):
+ res = sql("select %s from `tabItem` where name='%s'"% (item_field,d.item_code))
+ res = res and res[0][0] or 'No'
+
+ if res == 'No':
+ msgprint("You can not select non "+item_type+" "+d.item_code+" in "+order_type)
+ raise Exception
+
+ # validate sales/ maintenance quotation against order type
+ #------------------------------------------------------------------
+ def validate_sales_mntc_quotation(self):
+ for d in getlist(self.doclist, 'sales_order_details'):
+ if d.prevdoc_docname:
+ res = sql("select order_type from `tabQuotation` where name=%s", (d.prevdoc_docname))
+ res = res and res[0][0] or ''
+
+ if self.doc.order_type== 'Maintenance' and res != 'Maintenance':
+ msgprint("You can not select non Maintenance Quotation against Maintenance Order")
+ raise Exception
+ elif self.doc.order_type != 'Maintenance' and res == 'Maintenance':
+ msgprint("You can not select non Sales Quotation against Sales Order")
+ raise Exception
- #do not allow sales item/quotation in maintenance order and service item/quotation in sales order
- #-----------------------------------------------------------------------------------------------
- def validate_order_type(self):
- #validate delivery date
- if self.doc.order_type != 'Maintenance' and not self.doc.delivery_date:
- msgprint("Please enter 'Expected Delivery Date'")
- raise Exception
-
- self.validate_sales_mntc_quotation()
- self.validate_sales_mntc_item()
+ #do not allow sales item/quotation in maintenance order and service item/quotation in sales order
+ #-----------------------------------------------------------------------------------------------
+ def validate_order_type(self):
+ #validate delivery date
+ if self.doc.order_type != 'Maintenance' and not self.doc.delivery_date:
+ msgprint("Please enter 'Expected Delivery Date'")
+ raise Exception
+
+ self.validate_sales_mntc_quotation()
+ self.validate_sales_mntc_item()
- #check for does customer belong to same project as entered..
- #-------------------------------------------------------------------------------------------------
- def validate_proj_cust(self):
- if self.doc.project_name and self.doc.customer_name:
- res = sql("select name from `tabProject` where name = '%s' and (customer = '%s' or ifnull(customer,'')='')"%(self.doc.project_name, self.doc.customer))
- if not res:
- msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.doc.customer,self.doc.project_name,self.doc.project_name))
- raise Exception
-
+ #check for does customer belong to same project as entered..
+ #-------------------------------------------------------------------------------------------------
+ def validate_proj_cust(self):
+ if self.doc.project_name and self.doc.customer_name:
+ res = sql("select name from `tabProject` where name = '%s' and (customer = '%s' or ifnull(customer,'')='')"%(self.doc.project_name, self.doc.customer))
+ if not res:
+ msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.doc.customer,self.doc.project_name,self.doc.project_name))
+ raise Exception
+
- # Validate
- # ---------
- def validate(self):
- self.validate_fiscal_year()
- self.validate_order_type()
- self.validate_mandatory()
- self.validate_proj_cust()
- self.validate_po_date()
- #self.validate_reference_value()
- self.validate_for_items()
- sales_com_obj = get_obj(dt = 'Sales Common')
- sales_com_obj.check_active_sales_items(self)
- sales_com_obj.check_conversion_rate(self)
+ # Validate
+ # ---------
+ def validate(self):
+ self.validate_fiscal_year()
+ self.validate_order_type()
+ self.validate_mandatory()
+ self.validate_proj_cust()
+ self.validate_po_date()
+ #self.validate_reference_value()
+ self.validate_for_items()
+ sales_com_obj = get_obj(dt = 'Sales Common')
+ sales_com_obj.check_active_sales_items(self)
+ sales_com_obj.check_conversion_rate(self)
- # verify whether rate is not greater than max_discount
- sales_com_obj.validate_max_discount(self,'sales_order_details')
- # this is to verify that the allocated % of sales persons is 100%
- sales_com_obj.get_allocated_sum(self)
- sales_com_obj.make_packing_list(self,'sales_order_details')
-
- # get total in words
- dcc = TransactionBase().get_company_currency(self.doc.company)
- self.doc.in_words = sales_com_obj.get_total_in_words(dcc, self.doc.rounded_total)
- self.doc.in_words_export = sales_com_obj.get_total_in_words(self.doc.currency, self.doc.rounded_total_export)
-
- # set SO status
- self.doc.status='Draft'
- if not self.doc.billing_status: self.doc.billing_status = 'Not Billed'
- if not self.doc.delivery_status: self.doc.delivery_status = 'Not Delivered'
-
+ # verify whether rate is not greater than max_discount
+ sales_com_obj.validate_max_discount(self,'sales_order_details')
+ # this is to verify that the allocated % of sales persons is 100%
+ sales_com_obj.get_allocated_sum(self)
+ sales_com_obj.make_packing_list(self,'sales_order_details')
+
+ # get total in words
+ dcc = TransactionBase().get_company_currency(self.doc.company)
+ self.doc.in_words = sales_com_obj.get_total_in_words(dcc, self.doc.rounded_total)
+ self.doc.in_words_export = sales_com_obj.get_total_in_words(self.doc.currency, self.doc.rounded_total_export)
+
+ # set SO status
+ self.doc.status='Draft'
+ if not self.doc.billing_status: self.doc.billing_status = 'Not Billed'
+ if not self.doc.delivery_status: self.doc.delivery_status = 'Not Delivered'
+
# ON SUBMIT
# ===============================================================================================
- # Checks Quotation Status
- # ------------------------
- def check_prev_docstatus(self):
- for d in getlist(self.doclist, 'sales_order_details'):
- cancel_quo = sql("select name from `tabQuotation` where docstatus = 2 and name = '%s'" % d.prevdoc_docname)
- if cancel_quo:
- msgprint("Quotation :" + cstr(cancel_quo[0][0]) + " is already cancelled !")
- raise Exception , "Validation Error. "
-
- def update_enquiry_status(self, prevdoc, flag):
- enq = sql("select t2.prevdoc_docname from `tabQuotation` t1, `tabQuotation Detail` t2 where t2.parent = t1.name and t1.name=%s", prevdoc)
- if enq:
- sql("update `tabEnquiry` set status = %s where name=%s",(flag,enq[0][0]))
+ # Checks Quotation Status
+ # ------------------------
+ def check_prev_docstatus(self):
+ for d in getlist(self.doclist, 'sales_order_details'):
+ cancel_quo = sql("select name from `tabQuotation` where docstatus = 2 and name = '%s'" % d.prevdoc_docname)
+ if cancel_quo:
+ msgprint("Quotation :" + cstr(cancel_quo[0][0]) + " is already cancelled !")
+ raise Exception , "Validation Error. "
+
+ def update_enquiry_status(self, prevdoc, flag):
+ enq = sql("select t2.prevdoc_docname from `tabQuotation` t1, `tabQuotation Detail` t2 where t2.parent = t1.name and t1.name=%s", prevdoc)
+ if enq:
+ sql("update `tabEnquiry` set status = %s where name=%s",(flag,enq[0][0]))
- #update status of quotation, enquiry
- #----------------------------------------
- def update_prevdoc_status(self, flag):
- for d in getlist(self.doclist, 'sales_order_details'):
- if d.prevdoc_docname:
- if flag=='submit':
- sql("update `tabQuotation` set status = 'Order Confirmed' where name=%s",d.prevdoc_docname)
-
- #update enquiry
- self.update_enquiry_status(d.prevdoc_docname, 'Order Confirmed')
- elif flag == 'cancel':
- chk = sql("select t1.name from `tabSales Order` t1, `tabSales Order Detail` t2 where t2.parent = t1.name and t2.prevdoc_docname=%s and t1.name!=%s and t1.docstatus=1", (d.prevdoc_docname,self.doc.name))
- if not chk:
- sql("update `tabQuotation` set status = 'Submitted' where name=%s",d.prevdoc_docname)
-
- #update enquiry
- self.update_enquiry_status(d.prevdoc_docname, 'Quotation Sent')
-
- # Submit
- # -------
- def on_submit(self):
- self.check_prev_docstatus()
- self.update_stock_ledger(update_stock = 1)
- self.set_sms_msg(1)
- # update customer's last sales order no.
- update_customer = sql("update `tabCustomer` set last_sales_order = '%s', modified = '%s' where name = '%s'" %(self.doc.name, self.doc.modified, self.doc.customer))
- get_obj('Sales Common').check_credit(self,self.doc.grand_total)
-
- # Check for Approving Authority
- get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.grand_total, self)
-
- #update prevdoc status
- self.update_prevdoc_status('submit')
- # set SO status
- set(self.doc, 'status', 'Submitted')
-
- # on submit notification
- if self.doc.email_id:
- get_obj('Notification Control').notify_contact('Sales Order',self.doc.doctype,self.doc.name, self.doc.email_id, self.doc.contact_person)
-
+ #update status of quotation, enquiry
+ #----------------------------------------
+ def update_prevdoc_status(self, flag):
+ for d in getlist(self.doclist, 'sales_order_details'):
+ if d.prevdoc_docname:
+ if flag=='submit':
+ sql("update `tabQuotation` set status = 'Order Confirmed' where name=%s",d.prevdoc_docname)
+
+ #update enquiry
+ self.update_enquiry_status(d.prevdoc_docname, 'Order Confirmed')
+ elif flag == 'cancel':
+ chk = sql("select t1.name from `tabSales Order` t1, `tabSales Order Detail` t2 where t2.parent = t1.name and t2.prevdoc_docname=%s and t1.name!=%s and t1.docstatus=1", (d.prevdoc_docname,self.doc.name))
+ if not chk:
+ sql("update `tabQuotation` set status = 'Submitted' where name=%s",d.prevdoc_docname)
+
+ #update enquiry
+ self.update_enquiry_status(d.prevdoc_docname, 'Quotation Sent')
+
+ # Submit
+ # -------
+ def on_submit(self):
+ self.check_prev_docstatus()
+ self.update_stock_ledger(update_stock = 1)
+ self.set_sms_msg(1)
+ # update customer's last sales order no.
+ update_customer = sql("update `tabCustomer` set last_sales_order = '%s', modified = '%s' where name = '%s'" %(self.doc.name, self.doc.modified, self.doc.customer))
+ get_obj('Sales Common').check_credit(self,self.doc.grand_total)
+
+ # Check for Approving Authority
+ get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.grand_total, self)
+
+ #update prevdoc status
+ self.update_prevdoc_status('submit')
+ # set SO status
+ set(self.doc, 'status', 'Submitted')
+
+ # on submit notification
+ if self.doc.email_id:
+ get_obj('Notification Control').notify_contact('Sales Order',self.doc.doctype,self.doc.name, self.doc.email_id, self.doc.contact_person)
+
# ON CANCEL
# ===============================================================================================
- def on_cancel(self):
- # Cannot cancel stopped SO
- if self.doc.status == 'Stopped':
- msgprint("Sales Order : '%s' cannot be cancelled as it is Stopped. Unstop it for any further transactions" %(self.doc.name))
- raise Exception
- self.check_nextdoc_docstatus()
- self.update_stock_ledger(update_stock = -1)
- self.set_sms_msg()
-
- #update prevdoc status
- self.update_prevdoc_status('cancel')
-
- # ::::::::: SET SO STATUS ::::::::::
- set(self.doc, 'status', 'Cancelled')
-
- # CHECK NEXT DOCSTATUS
- # does not allow to cancel document if DN or RV made against it is SUBMITTED
- # ----------------------------------------------------------------------------
- def check_nextdoc_docstatus(self):
- # Checks Delivery Note
- submit_dn = sql("select t1.name from `tabDelivery Note` t1,`tabDelivery Note Detail` t2 where t1.name = t2.parent and t2.prevdoc_docname = '%s' and t1.docstatus = 1" % (self.doc.name))
- if submit_dn:
- msgprint("Delivery Note : " + cstr(submit_dn[0][0]) + " has been submitted against " + cstr(self.doc.doctype) + ". Please cancel Delivery Note : " + cstr(submit_dn[0][0]) + " first and then cancel "+ cstr(self.doc.doctype), raise_exception = 1)
- # Checks Receivable Voucher
- submit_rv = sql("select t1.name from `tabReceivable Voucher` t1,`tabRV Detail` t2 where t1.name = t2.parent and t2.sales_order = '%s' and t1.docstatus = 1" % (self.doc.name))
- if submit_rv:
- msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted against " +cstr(self.doc.doctype)+ ". Please cancel Sales Invoice : "+ cstr(submit_rv[0][0]) + " first and then cancel "+ cstr(self.doc.doctype), raise_exception = 1)
- #check maintenance schedule
- submit_ms = sql("select t1.name from `tabMaintenance Schedule` t1, `tabItem Maintenance Detail` t2 where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1",self.doc.name)
- if submit_ms:
- msgprint("Maintenance Schedule : " + cstr(submit_ms[0][0]) + " has already been submitted against " +cstr(self.doc.doctype)+ ". Please cancel Maintenance Schedule : "+ cstr(submit_ms[0][0]) + " first and then cancel "+ cstr(self.doc.doctype), raise_exception = 1)
- submit_mv = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Detail` t2 where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1",self.doc.name)
- if submit_mv:
- msgprint("Maintenance Visit : " + cstr(submit_mv[0][0]) + " has already been submitted against " +cstr(self.doc.doctype)+ ". Please cancel Maintenance Visit : " + cstr(submit_mv[0][0]) + " first and then cancel "+ cstr(self.doc.doctype), raise_exception = 1)
+ def on_cancel(self):
+ # Cannot cancel stopped SO
+ if self.doc.status == 'Stopped':
+ msgprint("Sales Order : '%s' cannot be cancelled as it is Stopped. Unstop it for any further transactions" %(self.doc.name))
+ raise Exception
+ self.check_nextdoc_docstatus()
+ self.update_stock_ledger(update_stock = -1)
+ self.set_sms_msg()
+
+ #update prevdoc status
+ self.update_prevdoc_status('cancel')
+
+ # ::::::::: SET SO STATUS ::::::::::
+ set(self.doc, 'status', 'Cancelled')
+
+ # CHECK NEXT DOCSTATUS
+ # does not allow to cancel document if DN or RV made against it is SUBMITTED
+ # ----------------------------------------------------------------------------
+ def check_nextdoc_docstatus(self):
+ # Checks Delivery Note
+ submit_dn = sql("select t1.name from `tabDelivery Note` t1,`tabDelivery Note Detail` t2 where t1.name = t2.parent and t2.prevdoc_docname = '%s' and t1.docstatus = 1" % (self.doc.name))
+ if submit_dn:
+ msgprint("Delivery Note : " + cstr(submit_dn[0][0]) + " has been submitted against " + cstr(self.doc.doctype) + ". Please cancel Delivery Note : " + cstr(submit_dn[0][0]) + " first and then cancel "+ cstr(self.doc.doctype), raise_exception = 1)
+ # Checks Receivable Voucher
+ submit_rv = sql("select t1.name from `tabReceivable Voucher` t1,`tabRV Detail` t2 where t1.name = t2.parent and t2.sales_order = '%s' and t1.docstatus = 1" % (self.doc.name))
+ if submit_rv:
+ msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted against " +cstr(self.doc.doctype)+ ". Please cancel Sales Invoice : "+ cstr(submit_rv[0][0]) + " first and then cancel "+ cstr(self.doc.doctype), raise_exception = 1)
+ #check maintenance schedule
+ submit_ms = sql("select t1.name from `tabMaintenance Schedule` t1, `tabItem Maintenance Detail` t2 where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1",self.doc.name)
+ if submit_ms:
+ msgprint("Maintenance Schedule : " + cstr(submit_ms[0][0]) + " has already been submitted against " +cstr(self.doc.doctype)+ ". Please cancel Maintenance Schedule : "+ cstr(submit_ms[0][0]) + " first and then cancel "+ cstr(self.doc.doctype), raise_exception = 1)
+ submit_mv = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Detail` t2 where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1",self.doc.name)
+ if submit_mv:
+ msgprint("Maintenance Visit : " + cstr(submit_mv[0][0]) + " has already been submitted against " +cstr(self.doc.doctype)+ ". Please cancel Maintenance Visit : " + cstr(submit_mv[0][0]) + " first and then cancel "+ cstr(self.doc.doctype), raise_exception = 1)
- def check_modified_date(self):
- mod_db = sql("select modified from `tabSales Order` where name = '%s'" % self.doc.name)
- date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified)))
-
- if date_diff and date_diff[0][0]:
- msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ")
- raise Exception
+ def check_modified_date(self):
+ mod_db = sql("select modified from `tabSales Order` where name = '%s'" % self.doc.name)
+ date_diff = sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.doc.modified)))
+
+ if date_diff and date_diff[0][0]:
+ msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ")
+ raise Exception
- # STOP SALES ORDER
- # ==============================================================================================
- # Stops Sales Order & no more transactions will be created against this Sales Order
- def stop_sales_order(self):
- self.check_modified_date()
- self.update_stock_ledger(update_stock = -1,clear = 1)
- # ::::::::: SET SO STATUS ::::::::::
- set(self.doc, 'status', 'Stopped')
- msgprint(self.doc.doctype + ": " + self.doc.name + " has been Stopped. To make transactions against this Sales Order you need to Unstop it.")
+ # STOP SALES ORDER
+ # ==============================================================================================
+ # Stops Sales Order & no more transactions will be created against this Sales Order
+ def stop_sales_order(self):
+ self.check_modified_date()
+ self.update_stock_ledger(update_stock = -1,clear = 1)
+ # ::::::::: SET SO STATUS ::::::::::
+ set(self.doc, 'status', 'Stopped')
+ msgprint(self.doc.doctype + ": " + self.doc.name + " has been Stopped. To make transactions against this Sales Order you need to Unstop it.")
- # UNSTOP SALES ORDER
- # ==============================================================================================
- # Unstops Sales Order & now transactions can be continued against this Sales Order
- def unstop_sales_order(self):
- self.check_modified_date()
- self.update_stock_ledger(update_stock = 1,clear = 1)
- # ::::::::: SET SO STATUS ::::::::::
- set(self.doc, 'status', 'Submitted')
- msgprint(self.doc.doctype + ": " + self.doc.name + " has been Unstopped.")
+ # UNSTOP SALES ORDER
+ # ==============================================================================================
+ # Unstops Sales Order & now transactions can be continued against this Sales Order
+ def unstop_sales_order(self):
+ self.check_modified_date()
+ self.update_stock_ledger(update_stock = 1,clear = 1)
+ # ::::::::: SET SO STATUS ::::::::::
+ set(self.doc, 'status', 'Submitted')
+ msgprint(self.doc.doctype + ": " + self.doc.name + " has been Unstopped.")
- # UPDATE STOCK LEDGER
- # ===============================================================================================
- def update_stock_ledger(self, update_stock, clear = 0):
- for d in self.get_item_list(clear):
- stock_item = sql("SELECT is_stock_item FROM tabItem where name = '%s'"%(d[1]),as_dict = 1) # stock ledger will be updated only if it is a stock item
- if stock_item and stock_item[0]['is_stock_item'] == "Yes":
- if not d[0]:
- msgprint("Message: Please enter Reserved Warehouse for item %s as it is stock item."% d[1])
- raise Exception
- bin = get_obj('Warehouse', d[0]).update_bin( 0, flt(update_stock) * flt(d[2]), 0, 0, 0, d[1], self.doc.transaction_date)
+ # UPDATE STOCK LEDGER
+ # ===============================================================================================
+ def update_stock_ledger(self, update_stock, clear = 0):
+ for d in self.get_item_list(clear):
+ stock_item = sql("SELECT is_stock_item FROM tabItem where name = '%s'"%(d[1]),as_dict = 1) # stock ledger will be updated only if it is a stock item
+ if stock_item and stock_item[0]['is_stock_item'] == "Yes":
+ if not d[0]:
+ msgprint("Message: Please enter Reserved Warehouse for item %s as it is stock item."% d[1])
+ raise Exception
+ bin = get_obj('Warehouse', d[0]).update_bin( 0, flt(update_stock) * flt(d[2]), 0, 0, 0, d[1], self.doc.transaction_date)
+
+ # Gets Items from packing list
+ #=================================
+ def get_item_list(self, clear):
+ return get_obj('Sales Common').get_item_list( self, clear)
+
+ # SET MESSAGE FOR SMS
+ #======================
+ def set_sms_msg(self, is_submitted = 0):
+ if is_submitted:
+ if not self.doc.amended_from:
+ msg = 'Sales Order: '+self.doc.name+' has been made against PO no: '+cstr(self.doc.po_no)
+ set(self.doc, 'message', msg)
+ else:
+ msg = 'Sales Order has been amended. New SO no:'+self.doc.name
+ set(self.doc, 'message', msg)
+ else:
+ msg = 'Sales Order: '+self.doc.name+' has been cancelled.'
+ set(self.doc, 'message', msg)
+
+ # SEND SMS
+ # =========
+ def send_sms(self):
+ if not self.doc.customer_mobile_no:
+ msgprint("Please enter customer mobile no")
+ elif not self.doc.message:
+ msgprint("Please enter the message you want to send")
+ else:
+ msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.customer_mobile_no,], self.doc.message))
- # Gets Items from packing list
- #=================================
- def get_item_list(self, clear):
- return get_obj('Sales Common').get_item_list( self, clear)
-
- # SET MESSAGE FOR SMS
- #======================
- def set_sms_msg(self, is_submitted = 0):
- if is_submitted:
- if not self.doc.amended_from:
- msg = 'Sales Order: '+self.doc.name+' has been made against PO no: '+cstr(self.doc.po_no)
- set(self.doc, 'message', msg)
- else:
- msg = 'Sales Order has been amended. New SO no:'+self.doc.name
- set(self.doc, 'message', msg)
- else:
- msg = 'Sales Order: '+self.doc.name+' has been cancelled.'
- set(self.doc, 'message', msg)
-
- # SEND SMS
- # =========
- def send_sms(self):
- if not self.doc.customer_mobile_no:
- msgprint("Please enter customer mobile no")
- elif not self.doc.message:
- msgprint("Please enter the message you want to send")
- else:
- msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.customer_mobile_no,], self.doc.message))
+ # on update
+ def on_update(self):
+ pass
- # on update
- def on_update(self):
- pass
-
- # Repair Sales Order
- # ===========================================
- def repair_sales_order(self):
- get_obj('Sales Common', 'Sales Common').repair_curr_doctype_details(self)
+ # Repair Sales Order
+ # ===========================================
+ def repair_sales_order(self):
+ get_obj('Sales Common', 'Sales Common').repair_curr_doctype_details(self)
diff --git a/selling/doctype/sales_order/sales_order.txt b/selling/doctype/sales_order/sales_order.txt
index 69773dd..98833d1 100644
--- a/selling/doctype/sales_order/sales_order.txt
+++ b/selling/doctype/sales_order/sales_order.txt
@@ -5,15 +5,14 @@
{
'creation': '2010-08-08 17:09:21',
'docstatus': 0,
- 'modified': '2011-06-27 16:05:56',
+ 'modified': '2011-08-09 17:06:09',
'modified_by': 'Administrator',
'owner': 'Administrator'
},
# These values are common for all DocType
{
- '_last_update': '1309170956',
- 'client_script': "cur_frm.add_fetch('customer','sales_person','sales_person');",
+ '_last_update': '1311621379',
'colour': 'White:FFF',
'doctype': 'DocType',
'document_type': 'Transaction',
@@ -28,7 +27,7 @@
'show_in_menu': 0,
'subject': 'From %(customer_name)s on %(transaction_date)s worth %(currency)s %(grand_total_export)s | %(per_delivered)s% delivered | %(per_billed)s% billed',
'tag_fields': 'delivery_status,billing_status',
- 'version': 593
+ 'version': 597
},
# These values are common for all DocField
@@ -58,28 +57,23 @@
# DocPerm
{
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
'doctype': 'DocPerm',
'idx': 1,
- 'permlevel': 1,
- 'role': 'Sales Manager',
- 'submit': 0,
- 'write': 0
+ 'permlevel': 0,
+ 'role': 'Production Manager'
},
# DocPerm
{
- 'amend': 1,
- 'cancel': 1,
- 'create': 1,
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
'doctype': 'DocPerm',
'idx': 2,
- 'permlevel': 0,
+ 'permlevel': 1,
'role': 'Sales Manager',
- 'submit': 1,
- 'write': 1
+ 'submit': 0,
+ 'write': 0
},
# DocPerm
@@ -90,6 +84,19 @@
'doctype': 'DocPerm',
'idx': 3,
'permlevel': 0,
+ 'role': 'Sales Manager',
+ 'submit': 1,
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ 'amend': 1,
+ 'cancel': 1,
+ 'create': 1,
+ 'doctype': 'DocPerm',
+ 'idx': 4,
+ 'permlevel': 0,
'role': 'Sales User',
'submit': 1,
'write': 1
@@ -101,7 +108,7 @@
'cancel': 0,
'create': 0,
'doctype': 'DocPerm',
- 'idx': 4,
+ 'idx': 5,
'permlevel': 1,
'role': 'Sales User',
'submit': 0,
@@ -111,7 +118,7 @@
# DocPerm
{
'doctype': 'DocPerm',
- 'idx': 5,
+ 'idx': 6,
'match': 'customer_name',
'permlevel': 0,
'role': 'Customer'
@@ -120,7 +127,7 @@
# DocPerm
{
'doctype': 'DocPerm',
- 'idx': 6,
+ 'idx': 7,
'permlevel': 2,
'role': 'Accounts User',
'write': 1
@@ -132,7 +139,7 @@
'cancel': 1,
'create': 1,
'doctype': 'DocPerm',
- 'idx': 7,
+ 'idx': 8,
'permlevel': 0,
'role': 'Maintenance Manager',
'submit': 1,
@@ -142,7 +149,7 @@
# DocPerm
{
'doctype': 'DocPerm',
- 'idx': 8,
+ 'idx': 9,
'permlevel': 1,
'role': 'Maintenance Manager'
},
@@ -153,7 +160,7 @@
'cancel': 1,
'create': 1,
'doctype': 'DocPerm',
- 'idx': 9,
+ 'idx': 10,
'permlevel': 0,
'role': 'Maintenance User',
'submit': 1,
@@ -163,7 +170,7 @@
# DocPerm
{
'doctype': 'DocPerm',
- 'idx': 10,
+ 'idx': 11,
'permlevel': 1,
'role': 'Maintenance User'
},
@@ -204,7 +211,7 @@
'no_copy': 1,
'oldfieldname': 'naming_series',
'oldfieldtype': 'Select',
- 'options': 'SO\nSO/10-11/',
+ 'options': 'PI/2011/\nSO\nSO/10-11/\nSO1112',
'permlevel': 0,
'print_hide': 1,
'reqd': 1
@@ -504,7 +511,7 @@
'fieldtype': 'Currency',
'idx': 23,
'in_filter': 1,
- 'label': '% Qty Billed',
+ 'label': '% Amount Billed',
'no_copy': 1,
'oldfieldname': 'per_billed',
'oldfieldtype': 'Currency',
@@ -607,12 +614,22 @@
# DocField
{
+ 'doctype': 'DocField',
+ 'fieldname': 'vehicle_detail',
+ 'fieldtype': 'Small Text',
+ 'idx': 30,
+ 'label': 'Vehicle Detail',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
'colour': 'White:FFF',
'doctype': 'DocField',
'fieldname': 'quotation_date',
'fieldtype': 'Date',
'hidden': 1,
- 'idx': 30,
+ 'idx': 31,
'label': 'Quotation Date',
'no_copy': 0,
'oldfieldname': 'quotation_date',
@@ -627,7 +644,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 31,
+ 'idx': 32,
'label': 'Pull Quotation Details',
'oldfieldtype': 'Button',
'options': 'pull_quotation_details',
@@ -642,7 +659,7 @@
'doctype': 'DocField',
'fieldname': 'price_list_name',
'fieldtype': 'Select',
- 'idx': 32,
+ 'idx': 33,
'label': 'Price List',
'oldfieldname': 'price_list_name',
'oldfieldtype': 'Select',
@@ -658,7 +675,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
- 'idx': 33,
+ 'idx': 34,
'permlevel': 0,
'width': '50%'
},
@@ -670,7 +687,7 @@
'doctype': 'DocField',
'fieldname': 'currency',
'fieldtype': 'Select',
- 'idx': 34,
+ 'idx': 35,
'label': 'Currency',
'oldfieldname': 'currency',
'oldfieldtype': 'Select',
@@ -689,7 +706,7 @@
'doctype': 'DocField',
'fieldname': 'conversion_rate',
'fieldtype': 'Currency',
- 'idx': 35,
+ 'idx': 36,
'label': 'Conversion Rate',
'oldfieldname': 'conversion_rate',
'oldfieldtype': 'Currency',
@@ -704,7 +721,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
- 'idx': 36,
+ 'idx': 37,
'permlevel': 0
},
@@ -715,7 +732,7 @@
'doctype': 'DocField',
'fieldname': 'sales_order_details',
'fieldtype': 'Table',
- 'idx': 37,
+ 'idx': 38,
'label': 'Sales Order Details',
'oldfieldname': 'sales_order_details',
'oldfieldtype': 'Table',
@@ -729,7 +746,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 38,
+ 'idx': 39,
'label': 'Clear Table',
'oldfieldtype': 'Button',
'options': 'clear_sales_order_details',
@@ -741,7 +758,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 39,
+ 'idx': 40,
'label': 'Re-Calculate Values',
'oldfieldtype': 'Button',
'permlevel': 0,
@@ -755,7 +772,7 @@
'doctype': 'DocField',
'fieldname': 'net_total',
'fieldtype': 'Currency',
- 'idx': 40,
+ 'idx': 41,
'label': 'Net Total*',
'oldfieldname': 'net_total',
'oldfieldtype': 'Currency',
@@ -770,7 +787,7 @@
'colour': 'White:FFF',
'doctype': 'DocField',
'fieldtype': 'HTML',
- 'idx': 41,
+ 'idx': 42,
'label': 'Note1',
'oldfieldtype': 'HTML',
'options': '<b>NOTE :</b> * In Base Currency',
@@ -783,7 +800,7 @@
'colour': 'White:FFF',
'doctype': 'DocField',
'fieldtype': 'Section Break',
- 'idx': 42,
+ 'idx': 43,
'label': 'Taxes',
'oldfieldtype': 'Section Break',
'permlevel': 0,
@@ -795,7 +812,7 @@
'doctype': 'DocField',
'fieldname': 'charge',
'fieldtype': 'Link',
- 'idx': 43,
+ 'idx': 44,
'label': 'Select Charges Master',
'oldfieldname': 'charge',
'oldfieldtype': 'Link',
@@ -808,7 +825,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 44,
+ 'idx': 45,
'label': 'Get Charges',
'oldfieldtype': 'Button',
'permlevel': 0,
@@ -820,7 +837,7 @@
'doctype': 'DocField',
'fieldname': 'other_charges',
'fieldtype': 'Table',
- 'idx': 45,
+ 'idx': 46,
'label': 'Other Charges',
'oldfieldname': 'other_charges',
'oldfieldtype': 'Table',
@@ -832,7 +849,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 46,
+ 'idx': 47,
'label': 'Calculate Charges',
'oldfieldtype': 'Button',
'permlevel': 0,
@@ -845,7 +862,7 @@
'doctype': 'DocField',
'fieldname': 'other_charges_total',
'fieldtype': 'Currency',
- 'idx': 47,
+ 'idx': 48,
'label': 'Charges Total*',
'oldfieldname': 'other_charges_total',
'oldfieldtype': 'Currency',
@@ -859,7 +876,7 @@
'doctype': 'DocField',
'fieldname': 'grand_total',
'fieldtype': 'Currency',
- 'idx': 48,
+ 'idx': 49,
'label': 'Grand Total*',
'oldfieldname': 'grand_total',
'oldfieldtype': 'Currency',
@@ -873,7 +890,7 @@
{
'doctype': 'DocField',
'fieldtype': 'HTML',
- 'idx': 49,
+ 'idx': 50,
'label': 'OT Notes',
'oldfieldtype': 'HTML',
'options': '<b>NOTE :</b> * In Base Currency',
@@ -885,7 +902,7 @@
{
'doctype': 'DocField',
'fieldtype': 'HTML',
- 'idx': 50,
+ 'idx': 51,
'label': 'Other Charges Calculation',
'oldfieldtype': 'HTML',
'permlevel': 0,
@@ -897,7 +914,7 @@
'colour': 'White:FFF',
'doctype': 'DocField',
'fieldtype': 'Section Break',
- 'idx': 51,
+ 'idx': 52,
'label': 'Totals',
'oldfieldtype': 'Section Break',
'permlevel': 0,
@@ -909,7 +926,7 @@
'doctype': 'DocField',
'fieldname': 'rounded_total',
'fieldtype': 'Currency',
- 'idx': 52,
+ 'idx': 53,
'label': 'Rounded Total',
'oldfieldname': 'rounded_total',
'oldfieldtype': 'Currency',
@@ -925,7 +942,7 @@
'doctype': 'DocField',
'fieldname': 'in_words',
'fieldtype': 'Data',
- 'idx': 53,
+ 'idx': 54,
'label': 'In Words',
'oldfieldname': 'in_words',
'oldfieldtype': 'Data',
@@ -938,7 +955,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
- 'idx': 54,
+ 'idx': 55,
'oldfieldtype': 'Column Break',
'permlevel': 0,
'print_hide': 1,
@@ -950,7 +967,7 @@
'doctype': 'DocField',
'fieldname': 'grand_total_export',
'fieldtype': 'Currency',
- 'idx': 55,
+ 'idx': 56,
'label': 'Grand Total (Export)',
'oldfieldname': 'grand_total_export',
'oldfieldtype': 'Currency',
@@ -965,7 +982,7 @@
'doctype': 'DocField',
'fieldname': 'rounded_total_export',
'fieldtype': 'Currency',
- 'idx': 56,
+ 'idx': 57,
'label': 'Rounded Total (Export)',
'oldfieldname': 'rounded_total_export',
'oldfieldtype': 'Currency',
@@ -981,7 +998,7 @@
'doctype': 'DocField',
'fieldname': 'in_words_export',
'fieldtype': 'Data',
- 'idx': 57,
+ 'idx': 58,
'label': 'In Words (Export)',
'oldfieldname': 'in_words_export',
'oldfieldtype': 'Data',
@@ -995,7 +1012,7 @@
'colour': 'White:FFF',
'doctype': 'DocField',
'fieldtype': 'Section Break',
- 'idx': 58,
+ 'idx': 59,
'label': 'Terms',
'oldfieldtype': 'Section Break',
'permlevel': 0,
@@ -1007,7 +1024,7 @@
'doctype': 'DocField',
'fieldname': 'tc_name',
'fieldtype': 'Link',
- 'idx': 59,
+ 'idx': 60,
'label': 'Select Terms',
'oldfieldname': 'tc_name',
'oldfieldtype': 'Link',
@@ -1021,7 +1038,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 60,
+ 'idx': 61,
'label': 'Get Terms',
'oldfieldtype': 'Button',
'options': 'get_tc_details',
@@ -1033,7 +1050,7 @@
{
'doctype': 'DocField',
'fieldtype': 'HTML',
- 'idx': 61,
+ 'idx': 62,
'label': 'Terms HTML',
'oldfieldtype': 'HTML',
'options': 'You can add Terms and Notes that will be printed in the Transaction',
@@ -1046,7 +1063,7 @@
'doctype': 'DocField',
'fieldname': 'terms',
'fieldtype': 'Text Editor',
- 'idx': 62,
+ 'idx': 63,
'label': 'Term Details',
'oldfieldname': 'terms',
'oldfieldtype': 'Text Editor',
@@ -1060,7 +1077,7 @@
'description': 'Filling in additional information about the Sales Order will help you analyze your data better.',
'doctype': 'DocField',
'fieldtype': 'Section Break',
- 'idx': 63,
+ 'idx': 64,
'label': 'More Info',
'oldfieldtype': 'Section Break',
'permlevel': 0,
@@ -1071,7 +1088,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
- 'idx': 64,
+ 'idx': 65,
'oldfieldtype': 'Column Break',
'permlevel': 0,
'print_hide': 1,
@@ -1084,7 +1101,7 @@
'doctype': 'DocField',
'fieldname': 'letter_head',
'fieldtype': 'Select',
- 'idx': 65,
+ 'idx': 66,
'label': 'Letter Head',
'oldfieldname': 'letter_head',
'oldfieldtype': 'Select',
@@ -1100,7 +1117,7 @@
'doctype': 'DocField',
'fieldname': 'company',
'fieldtype': 'Link',
- 'idx': 66,
+ 'idx': 67,
'in_filter': 1,
'label': 'Company',
'oldfieldname': 'company',
@@ -1119,7 +1136,7 @@
'doctype': 'DocField',
'fieldname': 'fiscal_year',
'fieldtype': 'Select',
- 'idx': 67,
+ 'idx': 68,
'in_filter': 1,
'label': 'Fiscal Year',
'oldfieldname': 'fiscal_year',
@@ -1139,7 +1156,7 @@
'doctype': 'DocField',
'fieldname': 'select_print_heading',
'fieldtype': 'Link',
- 'idx': 68,
+ 'idx': 69,
'label': 'Select Print Heading',
'no_copy': 1,
'oldfieldname': 'select_print_heading',
@@ -1154,7 +1171,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
- 'idx': 69,
+ 'idx': 70,
'oldfieldtype': 'Column Break',
'permlevel': 0,
'print_hide': 1,
@@ -1167,7 +1184,7 @@
'doctype': 'DocField',
'fieldname': 'source',
'fieldtype': 'Select',
- 'idx': 70,
+ 'idx': 71,
'label': 'Source',
'oldfieldname': 'source',
'oldfieldtype': 'Select',
@@ -1183,7 +1200,7 @@
'doctype': 'DocField',
'fieldname': 'campaign',
'fieldtype': 'Link',
- 'idx': 71,
+ 'idx': 72,
'label': 'Campaign',
'oldfieldname': 'campaign',
'oldfieldtype': 'Link',
@@ -1198,7 +1215,7 @@
'doctype': 'DocField',
'fieldname': 'note',
'fieldtype': 'Text',
- 'idx': 72,
+ 'idx': 73,
'label': 'Note',
'oldfieldname': 'note',
'oldfieldtype': 'Text',
@@ -1213,7 +1230,7 @@
'doctype': 'DocField',
'fieldname': 'cancel_reason',
'fieldtype': 'Data',
- 'idx': 73,
+ 'idx': 74,
'label': 'Cancel Reason',
'no_column': 0,
'no_copy': 1,
@@ -1229,7 +1246,7 @@
'fieldname': 'delivery_status',
'fieldtype': 'Select',
'hidden': 1,
- 'idx': 74,
+ 'idx': 75,
'label': 'Delivery Status',
'no_column': 0,
'no_copy': 1,
@@ -1244,7 +1261,7 @@
'fieldname': 'billing_status',
'fieldtype': 'Select',
'hidden': 1,
- 'idx': 75,
+ 'idx': 76,
'label': 'Billing Status',
'no_column': 0,
'no_copy': 1,
@@ -1260,7 +1277,7 @@
'doctype': 'DocField',
'fieldtype': 'Section Break',
'hidden': 0,
- 'idx': 76,
+ 'idx': 77,
'label': 'Packing List',
'oldfieldtype': 'Section Break',
'permlevel': 0,
@@ -1273,7 +1290,7 @@
'doctype': 'DocField',
'fieldname': 'packing_details',
'fieldtype': 'Table',
- 'idx': 77,
+ 'idx': 78,
'label': 'Packing Details',
'oldfieldname': 'packing_details',
'oldfieldtype': 'Table',
@@ -1286,7 +1303,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
- 'idx': 78,
+ 'idx': 79,
'label': 'Sales Team',
'oldfieldtype': 'Section Break',
'permlevel': 0,
@@ -1300,7 +1317,7 @@
'doctype': 'DocField',
'fieldname': 'sales_partner',
'fieldtype': 'Link',
- 'idx': 79,
+ 'idx': 80,
'in_filter': 1,
'label': 'Sales Partner',
'oldfieldname': 'sales_partner',
@@ -1318,7 +1335,7 @@
'doctype': 'DocField',
'fieldname': 'commission_rate',
'fieldtype': 'Currency',
- 'idx': 80,
+ 'idx': 81,
'label': 'Commission Rate',
'oldfieldname': 'commission_rate',
'oldfieldtype': 'Currency',
@@ -1333,7 +1350,7 @@
'doctype': 'DocField',
'fieldname': 'total_commission',
'fieldtype': 'Currency',
- 'idx': 81,
+ 'idx': 82,
'label': 'Total Commission',
'oldfieldname': 'total_commission',
'oldfieldtype': 'Currency',
@@ -1347,7 +1364,7 @@
'doctype': 'DocField',
'fieldname': 'sales_team',
'fieldtype': 'Table',
- 'idx': 82,
+ 'idx': 83,
'label': 'Sales Team1',
'oldfieldname': 'sales_team',
'oldfieldtype': 'Table',
@@ -1361,7 +1378,7 @@
'allow_on_submit': 1,
'doctype': 'DocField',
'fieldtype': 'Button',
- 'idx': 83,
+ 'idx': 84,
'label': 'Repair Sales Order',
'oldfieldtype': 'Button',
'options': 'repair_sales_order',
diff --git a/setup/doctype/email_settings/email_settings.py b/setup/doctype/email_settings/email_settings.py
index 37de7bc..ef0a763 100644
--- a/setup/doctype/email_settings/email_settings.py
+++ b/setup/doctype/email_settings/email_settings.py
@@ -13,7 +13,7 @@
for r in res:
ret[cstr(r[0])]=r[1] and cstr(r[1]) or ''
- return str(ret)
+ return ret
def set_cp_value(self, key):
"""
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 74e6f8a..3534dad 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -40,15 +40,10 @@
def validate_fiscal_year(self):
get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.posting_date,'Posting Date')
- # ******************* Get Customer Details ***********************
- #def get_customer_details(self):
- # sales_com_obj = get_obj('Sales Common')
- # sales_com_obj.get_customer_details(self)
- # sales_com_obj.get_shipping_details(self)
# ****** Get contact person details based on customer selected ****
def get_contact_details(self):
- return cstr(get_obj('Sales Common').get_contact_details(self,0))
+ return get_obj('Sales Common').get_contact_details(self,0)
# *********** Get Commission rate of Sales Partner ****************
def get_comm_rate(self, sales_partner):
@@ -122,7 +117,7 @@
ret = {
'actual_qty' : actual_qty and flt(actual_qty[0]['actual_qty']) or 0
}
- return cstr(ret)
+ return ret
# OTHER CHARGES TRIGGER FUNCTIONS
diff --git a/stock/doctype/delivery_note/delivery_note.txt b/stock/doctype/delivery_note/delivery_note.txt
index 97280e9..b77a6a5 100644
--- a/stock/doctype/delivery_note/delivery_note.txt
+++ b/stock/doctype/delivery_note/delivery_note.txt
@@ -3,16 +3,16 @@
# These values are common in all dictionaries
{
- 'creation': '2010-08-08 17:08:57',
+ 'creation': '2011-04-18 15:58:20',
'docstatus': 0,
- 'modified': '2011-06-27 16:42:01',
+ 'modified': '2011-08-09 17:10:45',
'modified_by': 'Administrator',
'owner': 'Administrator'
},
# These values are common for all DocType
{
- '_last_update': '1309173122',
+ '_last_update': '1311621379',
'colour': 'White:FFF',
'doctype': 'DocType',
'document_type': 'Transaction',
@@ -27,7 +27,7 @@
'show_in_menu': 0,
'subject': 'To %(customer_name)s on %(transaction_date)s | %(per_billed)s% billed',
'tag_fields': 'billing_status',
- 'version': 444
+ 'version': 446
},
# These values are common for all DocField
@@ -70,15 +70,15 @@
# DocPerm
{
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
+ 'amend': 1,
+ 'cancel': 1,
+ 'create': 1,
'doctype': 'DocPerm',
'idx': 2,
- 'permlevel': 1,
- 'role': 'Material User',
- 'submit': 0,
- 'write': 0
+ 'permlevel': 0,
+ 'role': 'Sales User',
+ 'submit': 1,
+ 'write': 1
},
# DocPerm
@@ -89,22 +89,22 @@
'doctype': 'DocPerm',
'idx': 3,
'permlevel': 0,
- 'role': 'Material Manager',
+ 'role': 'Material Master Manager',
'submit': 1,
'write': 1
},
# DocPerm
{
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
+ 'amend': 1,
+ 'cancel': 1,
+ 'create': 1,
'doctype': 'DocPerm',
'idx': 4,
- 'permlevel': 1,
+ 'permlevel': 0,
'role': 'Material Manager',
- 'submit': 0,
- 'write': 0
+ 'submit': 1,
+ 'write': 1
},
# DocPerm
@@ -115,60 +115,25 @@
'doctype': 'DocPerm',
'idx': 5,
'permlevel': 0,
- 'role': 'Sales User',
+ 'role': 'Sales Manager',
'submit': 1,
'write': 1
},
# DocPerm
{
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
'doctype': 'DocPerm',
'idx': 6,
'permlevel': 1,
- 'role': 'Sales User',
- 'submit': 0,
- 'write': 0
+ 'role': 'All'
},
# DocPerm
{
- 'cancel': 0,
- 'create': 0,
'doctype': 'DocPerm',
'idx': 7,
- 'permlevel': 0,
- 'role': 'Accounts User',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'doctype': 'DocPerm',
- 'idx': 8,
- 'permlevel': 1,
- 'role': 'Accounts User'
- },
-
- # DocPerm
- {
- 'doctype': 'DocPerm',
- 'idx': 9,
- 'match': 'customer_name',
- 'permlevel': 0,
- 'role': 'Customer'
- },
-
- # DocPerm
- {
- 'doctype': 'DocPerm',
- 'idx': 10,
'permlevel': 2,
- 'role': 'All',
- 'write': 1
+ 'role': 'All'
},
# DocField
@@ -332,7 +297,7 @@
'permlevel': 0,
'print_hide': 0,
'reqd': 1,
- 'search_index': 0,
+ 'search_index': 1,
'width': '100px'
},
@@ -352,7 +317,7 @@
'permlevel': 1,
'print_hide': 1,
'reqd': 1,
- 'search_index': 0,
+ 'search_index': 1,
'width': '150px'
},
@@ -366,13 +331,13 @@
'fieldtype': 'Currency',
'idx': 15,
'in_filter': 1,
- 'label': '% Qty Billed',
+ 'label': '% Amount Billed',
'no_copy': 1,
'oldfieldname': 'per_billed',
'oldfieldtype': 'Currency',
'permlevel': 1,
'print_hide': 1,
- 'search_index': 0
+ 'search_index': 1
},
# DocField
@@ -391,7 +356,7 @@
'oldfieldtype': 'Currency',
'permlevel': 1,
'print_hide': 1,
- 'search_index': 0
+ 'search_index': 1
},
# DocField
@@ -439,7 +404,7 @@
'permlevel': 0,
'print_hide': 1,
'reqd': 1,
- 'search_index': 0
+ 'search_index': 1
},
# DocField
@@ -453,7 +418,7 @@
'options': 'Customer Group',
'permlevel': 0,
'print_hide': 1,
- 'search_index': 0
+ 'search_index': 1
},
# DocField
@@ -1014,7 +979,7 @@
'permlevel': 0,
'print_hide': 1,
'reqd': 1,
- 'search_index': 0,
+ 'search_index': 1,
'width': '150px'
},
@@ -1032,7 +997,7 @@
'permlevel': 0,
'print_hide': 1,
'reqd': 1,
- 'search_index': 0,
+ 'search_index': 1,
'width': '150px'
},
diff --git a/stock/doctype/delivery_note/tests.py b/stock/doctype/delivery_note/tests.py
deleted file mode 100644
index df04c41..0000000
--- a/stock/doctype/delivery_note/tests.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import unittest
-import webnotes
-
-from webnotes.model.code import get_obj
-
-class SubmissionTest(unittest.TestCase):
- def setUp(self):
- self.dn = webnotes.testing.create('Delivery Note')
- self.dn_items = []
-
- # get a line item for testing
- for d in self.dn.doclist:
- if d.doctype=='Delivery Note Detail':
- self.dn_items.append(d)
-
- self.old_bin = get_obj('Warehouse', self.line_item[0].warehouse).get_bin(self.line_item[0].item_code)
- self.dn.on_submit()
-
- def test_bin_is_updated(self):
- "tests if bin quantity is affected when on submission"
- bin = get_obj('Warehouse', self.line_item.warehouse).get_bin(self.line_item[0].item_code)
- self.assertTrue(bin.actual_qty == self.old_bin.actual_qty - self.line_item[0].qty)
-
- def test_sales_order_is_updated(self):
- "tests if"
\ No newline at end of file
diff --git a/stock/doctype/item/item.py b/stock/doctype/item/item.py
index ae67749..d51fb3a 100644
--- a/stock/doctype/item/item.py
+++ b/stock/doctype/item/item.py
@@ -27,7 +27,7 @@
ret = {
'tax_rate' : rate and flt(rate[0][0]) or 0
}
- return str(ret)
+ return ret
def on_update(self):
bin = sql("select stock_uom from `tabBin` where item_code = '%s' " % self.doc.item_code)
@@ -178,3 +178,7 @@
sle = sql("select name from `tabStock Ledger Entry` where item_code = %s and ifnull(is_cancelled, 'No') = 'No'", self.doc.name)
return sle and 'exists' or 'not exists'
+
+ def on_rename(self,newdn,olddn):
+ sql("update tabItem set item_code = %s where name = %s", (newdn, olddn))
+
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 0eda680..4329980 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -42,18 +42,15 @@
#-----------------Validation For Fiscal Year------------------------
def validate_fiscal_year(self):
get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Transaction Date')
-
- # Get Supplier Details
- #def get_supplier_details(self, name = ''):
- # return cstr(get_obj(dt='Purchase Common').get_supplier_details(name))
+
# Get Item Details
def get_item_details(self, arg = ''):
- return cstr(get_obj(dt='Purchase Common').get_item_details(self,arg))
+ return get_obj(dt='Purchase Common').get_item_details(self,arg)
# Get UOM Details
def get_uom_details(self, arg = ''):
- return cstr(get_obj(dt='Purchase Common').get_uom_details(arg))
+ return get_obj(dt='Purchase Common').get_uom_details(arg)
# GET TERMS & CONDITIONS
# =====================================================================================
@@ -62,7 +59,7 @@
# get available qty at warehouse
def get_bin_details(self, arg = ''):
- return cstr(get_obj(dt='Purchase Common').get_bin_details(arg))
+ return get_obj(dt='Purchase Common').get_bin_details(arg)f
# Pull Purchase Order
def get_po_details(self):
diff --git a/stock/doctype/sales_bom/sales_bom.py b/stock/doctype/sales_bom/sales_bom.py
index 3bd6fa5..ce4567e 100644
--- a/stock/doctype/sales_bom/sales_bom.py
+++ b/stock/doctype/sales_bom/sales_bom.py
@@ -38,7 +38,7 @@
def get_item_details(self, name):
det = sql("select description, stock_uom from `tabItem` where name = '%s' " % cstr(name))
rate = sql("select ref_rate from `tabRef Rate Detail` where price_list_name = %s and parent = %s and ref_currency = %s", (self.doc.price_list, name, self.doc.currency))
- return cstr({'description' : det and det[0][0] or '', 'uom': det and det[0][1] or '', 'rate': rate and flt(rate[0][0]) or 0.00})
+ return {'description' : det and det[0][0] or '', 'uom': det and det[0][1] or '', 'rate': rate and flt(rate[0][0]) or 0.00}
def get_main_item(self):
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index b380995..47f0394 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -54,7 +54,7 @@
'conversion_factor' : 1,
'batch_no' : ''
}
- return str(ret)
+ return ret
# Get UOM Details
@@ -70,7 +70,7 @@
'conversion_factor' : flt(uom[0]['conversion_factor']),
'transfer_qty' : flt(arg['qty']) * flt(uom[0]['conversion_factor']),
}
- return str(ret)
+ return ret
# get stock and incoming rate on posting date
@@ -396,7 +396,7 @@
'customer_name' : res and res[0][1] or '',
'customer_address' : res and res[0][2] or ''}
- return str(ret)
+ return ret
def get_cust_addr(self):
@@ -405,7 +405,7 @@
'customer_name' : res and res[0][0] or '',
'customer_address' : res and res[0][1] or ''}
- return str(ret)
+ return ret
@@ -415,7 +415,7 @@
'supplier' : res and res[0][0] or '',
'supplier_name' :res and res[0][1] or '',
'supplier_address' : res and res[0][2] or ''}
- return str(ret)
+ return ret
def get_supp_addr(self):
@@ -423,4 +423,4 @@
ret = {
'supplier_name' : res and res[0][0] or '',
'supplier_address' : res and res[0][1] or ''}
- return str(ret)
+ return ret
diff --git a/stock/doctype/stock_entry_detail/stock_entry_detail.txt b/stock/doctype/stock_entry_detail/stock_entry_detail.txt
index 1d2408b..50b7154 100644
--- a/stock/doctype/stock_entry_detail/stock_entry_detail.txt
+++ b/stock/doctype/stock_entry_detail/stock_entry_detail.txt
@@ -253,7 +253,8 @@
'no_copy': 1,
'oldfieldname': 'serial_no',
'oldfieldtype': 'Text',
- 'permlevel': 0
+ 'permlevel': 0,
+ 'reqd': 0
},
# DocField
@@ -280,4 +281,4 @@
'oldfieldtype': 'Currency',
'permlevel': 1
}
-]
\ No newline at end of file
+]
diff --git a/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py b/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
index e603d1f..f8ac737 100644
--- a/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
+++ b/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.py
@@ -22,7 +22,7 @@
self.doc, self.doclist = d,dl
def get_stock_uom(self, item_code):
- return cstr({'current_stock_uom': cstr(get_value('Item', item_code, 'stock_uom'))})
+ return {'current_stock_uom': cstr(get_value('Item', item_code, 'stock_uom'))}
def validate_mandatory(self):
if not cstr(self.doc.item_code):
diff --git a/support/doctype/customer_issue/customer_issue.py b/support/doctype/customer_issue/customer_issue.py
index db63cc2..12a8ebd 100644
--- a/support/doctype/customer_issue/customer_issue.py
+++ b/support/doctype/customer_issue/customer_issue.py
@@ -27,37 +27,6 @@
def autoname(self):
#self.doc.name = make_autoname('CI/' + self.doc.fiscal_year + '/.######')
self.doc.name = make_autoname(self.doc.naming_series + '.######')
-
- #def get_customer_details(self):
- # details = sql("select address, territory, customer_group, customer_name from `tabCustomer` where name = '%s' and docstatus != 2" %(self.doc.customer), as_dict = 1)
- # if details:
- # ret = {
- # 'customer_address' : details and details[0]['address'] or '',
- # 'customer_name' : details and details[0]['customer_name'] or '',
- # 'territory' : details and details[0]['territory'] or '',
- # 'customer_group' : details and details[0]['customer_group'] or ''
- # }
- # # ********** get primary contact details (this is done separately coz. , in case there is no primary contact thn it would not be able to fetch customer details in case of join query)
- # contact_det = sql("select contact_name, contact_no, email_id from `tabContact` where customer_name = '%s' and is_customer = 1 and is_primary_contact = 'Yes' and docstatus != 2" %(self.doc.customer), as_dict = 1)
- # ret['contact_person'] = contact_det and contact_det[0]['contact_name'] or ''
- # ret['contact_no'] = contact_det and contact_det[0]['contact_no'] or ''
- # ret['email_id'] = contact_det and contact_det[0]['email_id'] or ''
- #
- # return cstr(ret)
- # else:
- # msgprint("Customer : %s does not exist in system." % (name))
- # raise Exception
-
- # Get customer's contact person details
- # ==============================================================
- #def get_contact_details(self):
- # contact = sql("select contact_no, email_id from `tabContact` where contact_name = '%s' and customer_name = '%s' and docstatus != 2" %(self.doc.contact_person, self.doc.customer), as_dict = 1)
- # ret = {
- # 'contact_no' : contact and contact[0]['contact_no'] or '',
- # 'email_id' : contact and contact[0]['email_id'] or ''
- # }
- # return str(ret)
-
#check if maintenance schedule already generated
#============================================
@@ -66,7 +35,7 @@
nm = nm and nm[0][0] or ''
if not nm:
- return cstr('No')
+ return 'No'
def on_submit(self):
if session['user'] != 'Guest':
diff --git a/support/doctype/maintenance_schedule/maintenance_schedule.py b/support/doctype/maintenance_schedule/maintenance_schedule.py
index 0d6ef80..d5c90b5 100644
--- a/support/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/support/doctype/maintenance_schedule/maintenance_schedule.py
@@ -38,21 +38,8 @@
'item_name': item and item[0]['item_name'] or '',
'description' : item and item[0]['description'] or ''
}
- return str(ret)
-
- #pull customer details
- #-------------------------
- #def get_customer_details(self):
- # det = sql("select t1.customer_name,t1.address,t1.territory,t2.contact_name from `tabCustomer` t1, `tabContact` t2 where t1.name = %s and t1.name=t2.customer and t2.is_primary_contact = 'Yes'", self.doc.customer, as_dict=1)
- #
- # ret = {
- # 'customer_name': det and det[0]['customer_name'] or '',
- # 'address' : det and det[0]['address'] or '',
- # 'territory': det and det[0]['territory'] or '',
- # 'contact_person' : det and det[0]['contact_name'] or ''
- # }
- # return str(ret)
-
+ return ret
+
# generate maintenance schedule
#-------------------------------------
def generate_schedule(self):
@@ -132,7 +119,7 @@
count = period/365
ret = {'no_of_visits':count}
- return str(ret)
+ return ret
def validate_maintenance_detail(self):
if not getlist(self.doclist, 'item_maintenance_detail'):
diff --git a/support/doctype/maintenance_visit/maintenance_visit.py b/support/doctype/maintenance_visit/maintenance_visit.py
index 203793c..e4efe1c 100644
--- a/support/doctype/maintenance_visit/maintenance_visit.py
+++ b/support/doctype/maintenance_visit/maintenance_visit.py
@@ -31,20 +31,7 @@
'item_name' : item and item[0]['item_name'] or '',
'description' : item and item[0]['description'] or ''
}
- return str(ret)
-
- #get customer details
- #-----------------------
- #def get_customer_details(self):
- # det = sql("select t1.customer_name,t1.address,t1.territory,t2.contact_name from `tabCustomer` t1, `tabContact` t2 where t1.name = %s and t1.name=t2.customer and t2.is_primary_contact = 'Yes'", self.doc.customer, as_dict=1)
- #
- # ret = {
- # 'customer_name' : det and det[0]['customer_name'] or '',
- # 'address' : det and det[0]['address'] or '',
- # 'territory': det and det[0]['territory'] or '',
- # 'contact_person' : det and det[0]['contact_name'] or ''
- # }
- # return str(ret)
+ return ret
# fetch details of resp Sales order or customer issue
#-----------------------------------------------------------