From e31ed38843cb2c1e80a870f4a3c8f148ff6c6812 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 15 Sep 2011 14:40:04 +0530 Subject: [PATCH 01/62] opening balance fixes in general ledger --- .../general_ledger/general_ledger.py | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/accounts/search_criteria/general_ledger/general_ledger.py b/accounts/search_criteria/general_ledger/general_ledger.py index 6cba6e44bc..8c855cfa52 100644 --- a/accounts/search_criteria/general_ledger/general_ledger.py +++ b/accounts/search_criteria/general_ledger/general_ledger.py @@ -1,9 +1,11 @@ #get company letter head +#--------------------------------------------------------------------- l_head = sql("select content from `tabLetter Head` where ifnull(is_default, 0) = 1 and ifnull(disabled, 0) = 0") l_head = l_head and l_head[0][0] or '' + # Posting date, fiscal year and year start date -#----------------------------------------------- +#--------------------------------------------------------------------- if not filter_values.get('posting_date') or not filter_values.get('posting_date1'): msgprint("Please enter From Date and To Date") raise Exception @@ -11,11 +13,16 @@ else: from_date = filter_values['posting_date'] to_date = filter_values['posting_date1'] -from_date_year = sql("select name from `tabFiscal Year` where %s between year_start_date and date_sub(date_add(year_start_date,interval 1 year), interval 1 day)",from_date)[0][0] +from_date_year = sql("select name from `tabFiscal Year` where %s between year_start_date and date_sub(date_add(year_start_date,interval 1 year), interval 1 day)",from_date) +if not from_date_year: + msgprint("From Date is out of range. Please check.", raise_exception=1) +else: + from_date_year = from_date_year[0][0] #to_date_year = sql("select name from `tabFiscal Year` where %s between year_start_date and date_sub(date_add(year_start_date,interval 1 year), interval 1 day)",to_date)[0][0] + # define columns -#--------------- +#--------------------------------------------------------------------- col = [] col.append(['Date','Date','80px','']) col.append(['Detail','Text','475px','']) @@ -30,9 +37,9 @@ for c in col: col_idx[c[0]] = len(colnames) -total_debit, total_credit, total_opening, total_diff = 0,0,0,0 - #total query +#--------------------------------------------------------------------- +total_debit, total_credit, total_opening, total_diff = 0,0,0,0 q = query.split('WHERE')[1].split('LIMIT') if len(q) > 2: query_where_clause = 'LIMIT'.join(q[:-1]) @@ -47,27 +54,32 @@ for t in tot: total_diff = total_debit - total_credit -# opening -account = filter_values.get('account') -if not account: - msgprint('Select an account to proceed',raise_exception=0,small=1) - - -acc_det = sql("select debit_or_credit, is_pl_account, lft, rgt, group_or_ledger from tabAccount where name = '%s'" % account) - -opening_bal = get_obj('GL Control').get_as_on_balance(account, from_date_year, from_date, acc_det[0][0], acc_det[0][2], acc_det[0][3])[2] -closing_bal = get_obj('GL Control').get_as_on_balance(account, from_date_year, to_date, acc_det[0][0], acc_det[0][2], acc_det[0][3])[2] -if acc_det[0][0] == 'Credit': - closing_bal = -1*closing_bal - opening_bal = -1*opening_bal - out = [] -t_row = ['' for i in range(len(colnames))] -t_row[1] = 'Opening as on '+formatdate(from_date) -t_row[col_idx['Debit']-1] = opening_bal -out.append(t_row) +# If account mentioned, show opening and closing +#--------------------------------------------------------------------- +account = filter_values.get('account') + +if account and (total_debit != 0 or total_credit != 0): + acc_det = sql("select debit_or_credit, is_pl_account, lft, rgt, group_or_ledger from tabAccount where name = '%s'" % account) + + opening_bal = get_obj('GL Control').get_as_on_balance(account, from_date_year, add_days(from_date, -1), acc_det[0][0], acc_det[0][2], acc_det[0][3])[2] + closing_bal = get_obj('GL Control').get_as_on_balance(account, from_date_year, to_date, acc_det[0][0], acc_det[0][2], acc_det[0][3])[2] + + if acc_det[0][0] == 'Credit': + closing_bal = -1*closing_bal + opening_bal = -1*opening_bal + + # add opening row + t_row = ['' for i in range(len(colnames))] + t_row[1] = 'Opening as on '+formatdate(from_date) + t_row[col_idx['Debit']-1] = opening_bal + out.append(t_row) + + +# table output +#--------------------------------------------------------------------- count = 0 for r in res: count +=1 @@ -79,6 +91,9 @@ for r in res: r[1] = a out.append(r) + +# Total, Difference and closing balance +#--------------------------------------------------------------------- if total_debit != 0 or total_credit != 0: # Total debit/credit t_row = ['' for i in range(len(colnames))] @@ -87,7 +102,6 @@ if total_debit != 0 or total_credit != 0: t_row[col_idx['Credit']-1] = total_credit out.append(t_row) - # diffrence (dr-cr) t_row = ['' for i in range(len(colnames))] t_row[1] = 'Total(Dr-Cr)' @@ -101,7 +115,9 @@ if total_debit != 0 or total_credit != 0: t_row[col_idx['Debit']-1] = flt(closing_bal) out.append(t_row) + # Print Format +#--------------------------------------------------------------------- myheader = """' - +'' - +'' - +'' - } + var make_row = function(title,val,bold){ + var bstart = ''; var bend = ''; + return '' + +'' + +'' + +'' + } - function convert_rate(val){ - var new_val = flt(val)/flt(doc.conversion_rate); - return new_val; - } - out =''; - if (!doc.print_without_amount) { - var cl = getchildren('RV Tax Detail',doc.name,'other_charges'); + function convert_rate(val){ + var new_val = flt(val)/flt(doc.conversion_rate); + return new_val; + } + out =''; + if (!doc.print_without_amount) { + print_hide_dict = {}; + for(var i in locals['DocField']) { + var doc_field = locals['DocField'][i]; + if(doc_field.fieldname) { + print_hide_dict[doc_field.fieldname] = doc_field.print_hide; + } + } - // outer table - var out='
"""+l_head+"""
From c526a8db47d13bf1ec28b96670e33cbaca6faeec Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 15 Sep 2011 15:38:57 +0530 Subject: [PATCH 02/62] check serial nos bin qty only if serial no entered into the document --- stock/doctype/bin/bin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock/doctype/bin/bin.py b/stock/doctype/bin/bin.py index 65b86867b6..3b71bd0034 100644 --- a/stock/doctype/bin/bin.py +++ b/stock/doctype/bin/bin.py @@ -40,7 +40,7 @@ class DocType: # update valuation for post dated entry - if actual_qty: + if actual_qty and serial_no: # check actual qty with total number of serial no self.check_qty_with_serial_no() From 11b2c0305c6c433e22c4e6fc91b7a4594cf2ab8d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 15 Sep 2011 18:27:37 +0530 Subject: [PATCH 03/62] trend analyzer issue fixed --- analysis/search_criteria/trend_analyzer/trend_analyzer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/analysis/search_criteria/trend_analyzer/trend_analyzer.js b/analysis/search_criteria/trend_analyzer/trend_analyzer.js index 72334df1b4..9a87abbd11 100644 --- a/analysis/search_criteria/trend_analyzer/trend_analyzer.js +++ b/analysis/search_criteria/trend_analyzer/trend_analyzer.js @@ -13,8 +13,8 @@ report.customize_filters = function() { this.add_filter({fieldname:'company', label:'Company', fieldtype:'Link', options:'Company', report_default:sys_defaults.company, ignore : 1, parent:'Profile'}); - this.set_filter_properties('Profile','Fiscal Year',{filter_hide:0, in_first_page:1, report_default: sys_defaults.fiscal_year}); - this.get_filter('Profile', 'Fiscal Year').set_as_single(); + this.add_filter({fieldname:'fiscal_year', label:'Fiscal Year', fieldtype:'Link', options:'Fiscal Year', report_default:sys_defaults.fiscal_year, ignore : 1, parent:'Profile', in_first_page:1}); + // Add Filters this.add_filter({fieldname:'item', label:'Item', fieldtype:'Link', options:'Item', ignore : 1, parent:'Profile'}); @@ -118,4 +118,4 @@ report.get_query = function() { return q; } -} \ No newline at end of file +} From 0ad3235c1fc56c96af3602c494f82dcbccdde7f0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 16 Sep 2011 11:28:56 +0530 Subject: [PATCH 04/62] removed make_feed() function --- home/doctype/widget_control/widget_control.py | 9 --------- hr/doctype/it_checklist/it_checklist.py | 6 ------ selling/doctype/enquiry/enquiry.py | 8 -------- 3 files changed, 23 deletions(-) diff --git a/home/doctype/widget_control/widget_control.py b/home/doctype/widget_control/widget_control.py index fa41cc9db2..d6bb9d1c45 100644 --- a/home/doctype/widget_control/widget_control.py +++ b/home/doctype/widget_control/widget_control.py @@ -27,11 +27,6 @@ class DocType: cmt.comment_date = nowdate() cmt.comment_time = time.strftime('%H:%M') cmt.save(1) - - try: - get_obj('Feed Control').upate_comment_in_feed(args['comment_doctype'], args['comment_docname']) - except: - pass else: raise Exception @@ -39,7 +34,3 @@ class DocType: def remove_comment(self, args): args = json.loads(args) sql("delete from `tabComment Widget Record` where name=%s",args['id']) - - try: - get_obj('Feed Control').upate_comment_in_feed(args['dt'], args['dn']) - except: pass diff --git a/hr/doctype/it_checklist/it_checklist.py b/hr/doctype/it_checklist/it_checklist.py index abed301573..182e171746 100644 --- a/hr/doctype/it_checklist/it_checklist.py +++ b/hr/doctype/it_checklist/it_checklist.py @@ -411,9 +411,3 @@ class DocType: new_tot_income = cint(self.doc.tax_tot_income) + cint(self.doc.edu_cess) - (cint(ret_income_tax[0][0]) or 0) self.doc.tax_per_month = new_tot_income/cint(self.doc.rem_months) - - # on update - def on_update(self): - obj = get_obj('Feed Control', 'Feed Control') - - obj.make_feed(self.doc) \ No newline at end of file diff --git a/selling/doctype/enquiry/enquiry.py b/selling/doctype/enquiry/enquiry.py index 12597022bd..4ad1b0ac30 100644 --- a/selling/doctype/enquiry/enquiry.py +++ b/selling/doctype/enquiry/enquiry.py @@ -115,12 +115,6 @@ class DocType(TransactionBase): ch = addchild(ev, 'event_individuals', 'Event User', 0) ch.person = d ch.save(1) - - #user_list = ['Sales Manager', 'Sales User'] - #for d in user_list: - # ch = addchild(ev, 'event_individuals', 'Event User', 0) - # ch.person = d - # ch.save() #--------------Validation For Last Contact Date----------------- # ==================================================================================================================== @@ -171,8 +165,6 @@ class DocType(TransactionBase): raise Exception else: set(self.doc, 'status', 'Cancelled') - - get_obj('Feed Control').make_feed(self.doc, 'cancelled') # declare as enquiry lost #--------------------------- From 7c96a101768c0cebdbbc1d1fefca50590e943b06 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 16 Sep 2011 12:48:31 +0530 Subject: [PATCH 05/62] Error fixed in bin --- stock/doctype/bin/bin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/stock/doctype/bin/bin.py b/stock/doctype/bin/bin.py index 3b71bd0034..cf9509a332 100644 --- a/stock/doctype/bin/bin.py +++ b/stock/doctype/bin/bin.py @@ -40,9 +40,10 @@ class DocType: # update valuation for post dated entry - if actual_qty and serial_no: + if actual_qty: # check actual qty with total number of serial no - self.check_qty_with_serial_no() + if serial_no: + self.check_qty_with_serial_no() prev_sle = self.get_prev_sle(dt, posting_time, sle_id) cqty = flt(prev_sle.get('bin_aqat', 0)) From 4f2bd45ec10dee76f9fa0b6eb94610d2c32d0458 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 16 Sep 2011 13:28:01 +0530 Subject: [PATCH 06/62] update valuation and bin_aqat patch --- patches/patch.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/patches/patch.py b/patches/patch.py index ca289f1672..e930c2e05e 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 365 +last_patch = 366 #------------------------------------------- @@ -340,3 +340,9 @@ def execute(patch_no): elif patch_no == 365: from patches.delivery_billing_status_patch import run_patch run_patch() + elif patch_no == 366: + bin = sql("select name from tabBin") + for b in bin: + bobj = get_obj('Bin',b[0]) + prev_sle = bobj.get_prev_sle(posting_date = '2011-09-15', posting_time = '01:00') + bobj.update_item_valuation(posting_date = '2011-09-15', posting_time = '01:00', prev_sle = prev_sle) From d0da2c22109353a08bbf78cfa138229e4f191579 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 16 Sep 2011 17:32:16 +0530 Subject: [PATCH 07/62] contact address will be fetched in sales invoice onload when come through mapper --- accounts/doctype/receivable_voucher/receivable_voucher.js | 2 +- accounts/doctype/receivable_voucher/receivable_voucher.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/accounts/doctype/receivable_voucher/receivable_voucher.js b/accounts/doctype/receivable_voucher/receivable_voucher.js index e773a95fc8..14a53c416b 100644 --- a/accounts/doctype/receivable_voucher/receivable_voucher.js +++ b/accounts/doctype/receivable_voucher/receivable_voucher.js @@ -33,7 +33,7 @@ cur_frm.cscript.onload_post_render = function(doc, dt, dn) { 'load_default_accounts','', function(r,rt) { refresh_field('entries'); - refresh_field('debit_to'); + cur_frm.cscript.customer(doc,dt,dn); } ); } diff --git a/accounts/doctype/receivable_voucher/receivable_voucher.py b/accounts/doctype/receivable_voucher/receivable_voucher.py index f26374a382..dba08fe8b9 100644 --- a/accounts/doctype/receivable_voucher/receivable_voucher.py +++ b/accounts/doctype/receivable_voucher/receivable_voucher.py @@ -139,7 +139,6 @@ class DocType(TransactionBase): Loads default accounts from items, customer when called from mapper """ self.get_income_account('entries') - self.doc.debit_to = self.get_customer_account() def get_income_account(self,doctype): for d in getlist(self.doclist, doctype): From fb34564238022b9c129e3d16e4b4f0de4e7a2c2a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 19 Sep 2011 12:20:10 +0530 Subject: [PATCH 08/62] update valuation and bin_aqat patch applicable after 01-09-2009 entries --- patches/patch.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/patches/patch.py b/patches/patch.py index e930c2e05e..788803717e 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 366 +last_patch = 367 #------------------------------------------- @@ -340,9 +340,9 @@ def execute(patch_no): elif patch_no == 365: from patches.delivery_billing_status_patch import run_patch run_patch() - elif patch_no == 366: + elif patch_no == 367: bin = sql("select name from tabBin") for b in bin: bobj = get_obj('Bin',b[0]) - prev_sle = bobj.get_prev_sle(posting_date = '2011-09-15', posting_time = '01:00') - bobj.update_item_valuation(posting_date = '2011-09-15', posting_time = '01:00', prev_sle = prev_sle) + prev_sle = bobj.get_prev_sle(posting_date = '2011-09-01', posting_time = '01:00') + bobj.update_item_valuation(posting_date = '2011-09-01', posting_time = '01:00', prev_sle = prev_sle) From eb89d28a3bac4a43291eea45318243155462a81d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 21 Sep 2011 15:24:03 +0530 Subject: [PATCH 09/62] fixed issue in reseting in opening balance, clear bal only that company --- accounts/doctype/fiscal_year/fiscal_year.py | 32 +++++++++------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/accounts/doctype/fiscal_year/fiscal_year.py b/accounts/doctype/fiscal_year/fiscal_year.py index 48d7d91cde..74b90ccbb6 100644 --- a/accounts/doctype/fiscal_year/fiscal_year.py +++ b/accounts/doctype/fiscal_year/fiscal_year.py @@ -21,34 +21,32 @@ class DocType: def __init__(self, d, dl): self.doc, self.doclist = d,dl - def repost(self, account = ''): + def repost(self): if not self.doc.company: msgprint("Please select company", raise_exception=1) if not in_transaction: sql("start transaction") - self.clear_account_balances(account) - self.create_account_balances(account) - self.update_opening(account) - self.post_entries(account) + self.clear_account_balances() + self.create_account_balances() + self.update_opening() + self.post_entries() sql("commit") - msg_cond = account and " and account: " + account or "" - msgprint("Account balance reposted for fiscal year: " + self.doc.name + msg_cond) + msgprint("Account balance reposted for fiscal year: " + self.doc.name) - def clear_account_balances(self, account = ''): + def clear_account_balances(self): # balances clear - `tabAccount Balance` for fiscal year - cond = account and (" and account = '" + account + "'") or '' - sql("update `tabAccount Balance` set opening=0, balance=0, debit=0, credit=0 where fiscal_year=%s %s", (self.doc.name, cond)) + sql("update `tabAccount Balance` t1, tabAccount t2 set t1.opening=0, t1.balance=0, t1.debit=0, t1.credit=0 where t1.fiscal_year=%s and t2.company = %s and t1.account = t2.name", (self.doc.name, self.doc.company)) - def create_account_balances(self, account = ''): + def create_account_balances(self): # get periods period_list = self.get_period_list() cnt = 0 # get accounts - al = account and [[account]] or sql("select name from tabAccount") + al = sql("select name from tabAccount") for a in al: # check @@ -83,14 +81,13 @@ class DocType: return periods # ==================================================================================== - def update_opening(self, account = ''): + def update_opening(self): """ set opening from last year closing """ - cond = account and (" and t2.name = '" + account + "'") or '' - abl = sql("select t1.account, t1.balance from `tabAccount Balance` t1, tabAccount t2 where t1.period= '%s' and t2.company= '%s' and ifnull(t2.is_pl_account, 'No') = 'No' and t1.account = t2.name %s for update" % (self.doc.past_year, self.doc.company, cond)) + abl = sql("select t1.account, t1.balance from `tabAccount Balance` t1, tabAccount t2 where t1.period= '%s' and t2.company= '%s' and ifnull(t2.is_pl_account, 'No') = 'No' and t1.account = t2.name for update" % (self.doc.past_year, self.doc.company)) cnt = 0 for ab in abl: @@ -108,11 +105,10 @@ class DocType: return sql("select debit_or_credit, lft, rgt, is_pl_account from tabAccount where name=%s", account)[0] # ==================================================================================== - def post_entries(self, account = ''): + def post_entries(self): sql("LOCK TABLE `tabGL Entry` WRITE") - cond = account and (" and account = '" + account + "'") or '' # post each gl entry (batch or complete) - gle = sql("select name, account, debit, credit, is_opening, posting_date from `tabGL Entry` where fiscal_year=%s and ifnull(is_cancelled,'No')='No' and company=%s %s", (self.doc.name, self.doc.company, cond)) + gle = sql("select name, account, debit, credit, is_opening, posting_date from `tabGL Entry` where fiscal_year=%s and ifnull(is_cancelled,'No')='No' and company=%s", (self.doc.name, self.doc.company)) account_details = {} cnt = 0 From 29f998ff21770f8789a3becd5e3798bfd2ee71ec Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 21 Sep 2011 15:25:02 +0530 Subject: [PATCH 10/62] Dont add opening entries in account balance debit, credit column --- accounts/doctype/gl_entry/gl_entry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accounts/doctype/gl_entry/gl_entry.py b/accounts/doctype/gl_entry/gl_entry.py index 5d3976056c..c45e1625ac 100644 --- a/accounts/doctype/gl_entry/gl_entry.py +++ b/accounts/doctype/gl_entry/gl_entry.py @@ -146,8 +146,8 @@ class DocType: # build dict p = { - 'debit': flt(debit) - ,'credit':flt(credit) + 'debit': self.doc.is_opening=='No' and flt(debit) or 0 + ,'credit':self.doc.is_opening=='No' and flt(credit) or 0 ,'opening': self.doc.is_opening=='Yes' and amt or 0 # end date condition only if it is not opening ,'end_date_condition':(self.doc.is_opening!='Yes' and ("and ab.end_date >= '"+self.doc.posting_date+"'") or '') From cc9428019a4cc1c2e46be93da93830d055e469b0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 21 Sep 2011 15:26:22 +0530 Subject: [PATCH 11/62] Trial balance opening issue fixed if there is no prev year Opening and Closing splitted into 4 cols as per international standard --- .../trial_balance/trial_balance.py | 88 +++++++++++-------- 1 file changed, 53 insertions(+), 35 deletions(-) diff --git a/accounts/search_criteria/trial_balance/trial_balance.py b/accounts/search_criteria/trial_balance/trial_balance.py index fb168e57af..994a5b8baa 100644 --- a/accounts/search_criteria/trial_balance/trial_balance.py +++ b/accounts/search_criteria/trial_balance/trial_balance.py @@ -1,13 +1,13 @@ # Columns #---------- -cl = [['Account','Data', '200px'],['Debit/Credit', 'Data', '100px'], ['Group/Ledger', 'Data', '100px'], ['Is PL Account', 'Data', '100px'], ['Opening','Data', '100px'],['Debit', 'Data', '100px'],['Credit', 'Data', '100px'],['Closing', 'Data', '100px']] +cl = [['Account','Data', '200px'],['Debit/Credit', 'Data', '100px'], ['Group/Ledger', 'Data', '100px'], ['Is PL Account', 'Data', '100px'], ['Opening (Dr)','Data', '100px'], ['Opening (Cr)','Data', '100px'],['Debit', 'Data', '100px'],['Credit', 'Data', '100px'],['Closing (Dr)', 'Data', '100px'],['Closing (Cr)', 'Data', '100px']] for c in cl: colnames.append(c[0]) coltypes.append(c[1]) colwidths.append(c[2]) coloptions.append('') col_idx[c[0]] = len(colnames)-1 - + # transaction date # ------------------ if not filter_values.get('transaction_date') or not filter_values.get('transaction_date1'): @@ -23,7 +23,7 @@ if not sql("select name from `tabFiscal Year` where %s between year_start_date a msgprint("From Date and To Date must be within same year") raise Exception -# get year of the from date and to date +# get year of the from date and to date # -------------------------------------- from_date_year = sql("select name from `tabFiscal Year` where %s between year_start_date and date_sub(date_add(year_start_date,interval 1 year), interval 1 day)",add_days(from_date, -1)) from_date_year = from_date_year and from_date_year[0][0] or '' @@ -33,11 +33,17 @@ to_date_year = to_date_year and to_date_year[0][0] or '' # if output is more than 500 lines then it will ask to export # ------------------------------------------------------------ -if len(res) > 500 and from_export == 0: +if len(res) > 1000 and from_export == 0: msgprint("This is a very large report and cannot be shown in the browser as it is likely to make your browser very slow.Please click on 'Export' to open in a spreadsheet") raise Exception + -total_debit, total_credit = 0,0 +acc_dict = {} +for t in sql("select name, debit_or_credit, is_pl_account, lft, rgt, group_or_ledger from tabAccount where docstatus != 2 and company = %s", filter_values['company']): + acc_dict[t[0]] = [t[1], t[2], t[3], t[4], t[5]] + + +total_debit, total_credit, total_opening_dr, total_opening_cr, total_closing_dr, total_closing_cr = 0, 0, 0, 0, 0, 0 glc = get_obj('GL Control') # Main logic @@ -45,47 +51,55 @@ glc = get_obj('GL Control') for r in res: # Fetch account details acc = r[col_idx['Account']].strip() - acc_det = sql("select debit_or_credit, is_pl_account, lft, rgt, group_or_ledger from tabAccount where name = '%s'" % acc) - r.append(acc_det[0][0]) - r.append(acc_det[0][4]) - r.append(acc_det[0][1]) + r.append(acc_dict[acc][0]) + r.append(acc_dict[acc][4]) + r.append(acc_dict[acc][1]) #if shows group and ledger both but without group balance - if filter_values.get('show_group_ledger') == 'Both But Without Group Balance' and acc_det[0][4] == 'Group': + if filter_values.get('show_group_ledger') == 'Both But Without Group Balance' and acc_dict[acc][4] == 'Group': for i in range(4): r.append('') continue - # opening balance - if from_date_year: - debit_on_fromdate, credit_on_fromdate, opening = glc.get_as_on_balance(acc, from_date_year, add_days(from_date, -1), acc_det[0][0], acc_det[0][2], acc_det[0][3]) - else: # if there is no previous year in system - debit_on_fromdate, credit_on_fromdate, opening = 0, 0, 0 + # Opening Balance + #----------------------------- + if from_date_year == to_date_year: + debit_on_fromdate, credit_on_fromdate, opening = glc.get_as_on_balance(acc, from_date_year, add_days(from_date, -1), acc_dict[acc][0], acc_dict[acc][2], acc_dict[acc][3]) # opening = closing of prev_date + elif acc_dict[acc][1] == 'No': # if there is no previous year in system and not pl account + opening = sql("select opening from `tabAccount Balance` where account = %s and period = %s", (acc, to_date_year)) + debit_on_fromdate, credit_on_fromdate, opening = 0, 0, flt(opening[0][0]) + else: # if pl account and there is no previous year in system + debit_on_fromdate, credit_on_fromdate, opening = 0,0,0 # closing balance - debit_on_todate, credit_on_todate, closing = glc.get_as_on_balance(acc, to_date_year, to_date, acc_det[0][0], acc_det[0][2], acc_det[0][3]) + #-------------------------------- + debit_on_todate, credit_on_todate, closing = glc.get_as_on_balance(acc, to_date_year, to_date, acc_dict[acc][0], acc_dict[acc][2], acc_dict[acc][3]) # transaction betn the period - if from_date_year == to_date_year: - debit = flt(debit_on_todate) - flt(debit_on_fromdate) - credit = flt(credit_on_todate) - flt(credit_on_fromdate) - else: # if from date is start date of the year - debit = flt(debit_on_todate) - credit = flt(credit_on_todate) - + #---------------------------------------- + + debit = flt(debit_on_todate) - flt(debit_on_fromdate) + credit = flt(credit_on_todate) - flt(credit_on_fromdate) + + # Debit / Credit + if acc_dict[acc][0] == 'Credit': + opening, closing = -1*opening, -1*closing + + # Totals + total_opening_dr += opening>0 and flt(opening) or 0 + total_opening_cr += opening<0 and -1*flt(opening) or 0 total_debit += debit total_credit += credit - - if acc_det[0][1] == 'Yes' and from_date_year != to_date_year: - opening = 0 - - if acc_det[0][0] == 'Credit': - opening, closing = -1*opening, -1*closing + total_closing_dr += closing>0 and flt(closing) or 0 + total_closing_cr += closing<0 and -1*flt(closing) or 0 - r.append(flt(opening)) + # Append in rows + r.append(flt(opening>0 and opening or 0)) + r.append(flt(opening<0 and -opening or 0)) r.append(flt(debit)) r.append(flt(credit)) - r.append(flt(closing)) + r.append(flt(closing>0 and closing or 0)) + r.append(flt(closing<0 and -closing or 0)) out =[] @@ -94,14 +108,18 @@ for r in res: # ------------------------------------------------------------------ if filter_values.get('show_zero_balance') != 'No': out.append(r) - elif r[col_idx['Opening']] or r[col_idx['Debit']] or r[col_idx['Credit']] or r[col_idx['Closing']] or (r[col_idx['Group/Ledger']] == 'Group' and filter_values.get('show_group_ledger') == 'Both But Without Group Balance'): + elif r[col_idx['Opening (Dr)']] or r[col_idx['Opening (Cr)']] or r[col_idx['Debit']] or r[col_idx['Credit']] or r[col_idx['Closing (Dr)']] or r[col_idx['Closing (Cr)']] or (r[col_idx['Group/Ledger']] == 'Group' and filter_values.get('show_group_ledger') == 'Both But Without Group Balance'): out.append(r) - + # Total Debit / Credit # -------------------------- if filter_values.get('show_group_ledger') in ['Only Ledgers', 'Both But Without Group Balance']: t_row = ['' for i in range(len(colnames))] t_row[col_idx['Account']] = 'Total' - t_row[col_idx['Debit']] = total_debit - t_row[col_idx['Credit']] = total_credit + t_row[col_idx['Opening (Dr)']] = '%.2f' % total_opening_dr + t_row[col_idx['Opening (Cr)']] = '%.2f' % total_opening_cr + t_row[col_idx['Debit']] = '%.2f' % total_debit + t_row[col_idx['Credit']] = '%.2f' % total_credit + t_row[col_idx['Closing (Dr)']] = '%.2f' % total_closing_dr + t_row[col_idx['Closing (Cr)']] = '%.2f' % total_closing_cr out.append(t_row) From 89b98ebca9ee1dc5c8dee57a324c90b8c0e73310 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 21 Sep 2011 17:37:21 +0530 Subject: [PATCH 12/62] rebuild all tree through push_patch --- patches/patch.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/patches/patch.py b/patches/patch.py index 788803717e..cfeddeb427 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 367 +last_patch = 368 #------------------------------------------- @@ -346,3 +346,12 @@ def execute(patch_no): bobj = get_obj('Bin',b[0]) prev_sle = bobj.get_prev_sle(posting_date = '2011-09-01', posting_time = '01:00') bobj.update_item_valuation(posting_date = '2011-09-01', posting_time = '01:00', prev_sle = prev_sle) + elif patch_no == 368: + from webnotes.utils import nestedset + t = [ + ['Account', 'parent_account'], ['Cost Center', 'parent_cost_center'], + ['Item Group', 'parent_item_group'], ['Territory', 'parent_territory'], + ['Customer Group', 'parent_customer_group'], ['Sales Person', 'parent_sales_person'] + ] + for d in t: + nestedset.rebuild_tree(d[0], d[1]) From 8bc34d87acd969ba79e7f01260266535240a2fe8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 22 Sep 2011 11:09:02 +0530 Subject: [PATCH 13/62] Appraisal score allowed to be fraction --- hr/doctype/appraisal/appraisal.js | 237 ++++++++-------- hr/doctype/appraisal/appraisal.py | 255 +++++++++--------- hr/doctype/appraisal/appraisal.txt | 40 +-- .../appraisal_detail/appraisal_detail.txt | 19 +- patches/patch.py | 5 +- 5 files changed, 268 insertions(+), 288 deletions(-) diff --git a/hr/doctype/appraisal/appraisal.js b/hr/doctype/appraisal/appraisal.js index ed53141957..b2683d82de 100644 --- a/hr/doctype/appraisal/appraisal.js +++ b/hr/doctype/appraisal/appraisal.js @@ -1,145 +1,150 @@ cur_frm.add_fetch('employee', 'company', 'company'); cur_frm.cscript.onload = function(doc,cdt,cdn){ - if(!doc.status) set_multiple(dt,dn,{status:'Draft'}); - if(doc.employee) cur_frm.cscript.employee(doc,cdt,cdn); - if(doc.amended_from && doc.__islocal) cur_frm.cscript.refresh_appraisal_details(doc, cdt, cdn); + if(!doc.status) set_multiple(dt,dn,{status:'Draft'}); + if(doc.employee) cur_frm.cscript.employee(doc,cdt,cdn); + if(doc.amended_from && doc.__islocal) cur_frm.cscript.refresh_appraisal_details(doc, cdt, cdn); } cur_frm.cscript.refresh = function(doc,cdt,cdn){ - if(user == doc.kra_approver && doc.status == 'Submitted') unhide_field(['Update', 'Declare Completed', 'Calculate Total Score']); - else hide_field(['Update', 'Declare Completed', 'Calculate Total Score']); - - if(!doc.docstatus) unhide_field('Fetch Template'); - else hide_field('Fetch Template'); + if(user == doc.kra_approver && doc.status == 'Submitted') unhide_field(['Update', 'Declare Completed', 'Calculate Total Score']); + else hide_field(['Update', 'Declare Completed', 'Calculate Total Score']); + + if(!doc.docstatus) unhide_field('Fetch Template'); + else hide_field('Fetch Template'); } cur_frm.cscript.refresh_appraisal_details = function(doc, cdt, cdn){ - var val = getchildren('Appraisal Detail', doc.name, 'appraisal_details', doc.doctype); - for(var i = 0; iYou wont be able to do any changes after declaring this Appraisal as completed. Are you sure, you want to declare it as completed ?'], - ['HTML', 'Response', '
'], - ['HTML', 'Declare Completed', '
'] - ]); - - var declare_completed_btn1 = $a($i(declare_completed_dialog.widgets['Declare Completed']), 'button', 'button'); - declare_completed_btn1.innerHTML = 'Yes'; - declare_completed_btn1.onclick = function(){ declare_completed_dialog.add(); } - - var declare_completed_btn2 = $a($i(declare_completed_dialog.widgets['Declare Completed']), 'button', 'button'); - declare_completed_btn2.innerHTML = 'No'; - $y(declare_completed_btn2,{marginLeft:'4px'}); - declare_completed_btn2.onclick = function(){ declare_completed_dialog.hide();} - - declare_completed_dialog.onshow = function() { - $i('declare_completed_dialog_response').innerHTML = ''; - } - - declare_completed_dialog.refresh_dt = function(){ - cur_frm.cscript.refresh(this.doc, this.cdt, this.cdn); - msgprint("refersh done"); - $c('webnotes.widgets.form.form_header.refresh_labels',this.doc,function(r,rt){}); - } - - declare_completed_dialog.add = function() { - // sending... - $i('declare_completed_dialog_response').innerHTML = 'Processing...'; - var m_arg = user+ '~~' + this.msg_nm_lst; - - $c_obj(make_doclist(this.doc.doctype, this.doc.name),'declare_completed','', function(r,rt){ - - if(r.message.status == 'Completed'){ - $i('declare_completed_dialog_response').innerHTML = 'Done'; - refresh_field('status'); - declare_completed_dialog.refresh_dt(); - hide_field(['Update', 'Declare Completed', 'Calculate Total Score']); - declare_completed_dialog.hide(); - } - else if(r.message.status == 'Incomplete'){ - $i('declare_completed_dialog_response').innerHTML = 'Incomplete Appraisal'; - } - else if(r.message.status == 'No Score'){ - $i('declare_completed_dialog_response').innerHTML = 'Calculate total score'; - } - }); - } - } - - if(!declare_completed_dialog){ - set_declare_completed_dialog(); - } - declare_completed_dialog.doc = doc; - declare_completed_dialog.cdt = cdt; - declare_completed_dialog.cdn = cdn; - declare_completed_dialog.show(); + var declare_completed_dialog; + + set_declare_completed_dialog = function() { + declare_completed_dialog = new Dialog(400, 200, 'Declare Completed'); + declare_completed_dialog.make_body([ + ['HTML', 'Message', '
You wont be able to do any changes after declaring this Appraisal as completed. Are you sure, you want to declare it as completed ?
'], + ['HTML', 'Response', '
'], + ['HTML', 'Declare Completed', '
'] + ]); + + var declare_completed_btn1 = $a($i(declare_completed_dialog.widgets['Declare Completed']), 'button', 'button'); + declare_completed_btn1.innerHTML = 'Yes'; + declare_completed_btn1.onclick = function(){ declare_completed_dialog.add(); } + + var declare_completed_btn2 = $a($i(declare_completed_dialog.widgets['Declare Completed']), 'button', 'button'); + declare_completed_btn2.innerHTML = 'No'; + $y(declare_completed_btn2,{marginLeft:'4px'}); + declare_completed_btn2.onclick = function(){ declare_completed_dialog.hide();} + + declare_completed_dialog.onshow = function() { + $i('declare_completed_dialog_response').innerHTML = ''; + } + + declare_completed_dialog.refresh_dt = function(){ + cur_frm.cscript.refresh(this.doc, this.cdt, this.cdn); + msgprint("refersh done"); + $c('webnotes.widgets.form.form_header.refresh_labels',this.doc,function(r,rt){}); + } + + declare_completed_dialog.add = function() { + // sending... + $i('declare_completed_dialog_response').innerHTML = 'Processing...'; + var m_arg = user+ '~~' + this.msg_nm_lst; + + $c_obj(make_doclist(this.doc.doctype, this.doc.name),'declare_completed','', function(r,rt){ + + if(r.message.status == 'Completed'){ + $i('declare_completed_dialog_response').innerHTML = 'Done'; + refresh_field('status'); + declare_completed_dialog.refresh_dt(); + hide_field(['Update', 'Declare Completed', 'Calculate Total Score']); + declare_completed_dialog.hide(); + } + else if(r.message.status == 'Incomplete'){ + $i('declare_completed_dialog_response').innerHTML = 'Incomplete Appraisal'; + } + else if(r.message.status == 'No Score'){ + $i('declare_completed_dialog_response').innerHTML = 'Calculate total score'; + } + }); + } + } + + if(!declare_completed_dialog){ + set_declare_completed_dialog(); + } + declare_completed_dialog.doc = doc; + declare_completed_dialog.cdt = cdt; + declare_completed_dialog.cdn = cdn; + declare_completed_dialog.show(); } cur_frm.cscript.score = function(doc,cdt,cdn){ - var d = locals[cdt][cdn]; - if (d.score){ - total = flt(d.per_weightage*d.score)/100; - d.score_earned = total.toPrecision(2); - refresh_field('score_earned', d.name, 'appraisal_details'); - } - else{ - d.score_earned = ''; - refresh_field('score_earned', d.name, 'appraisal_details'); - } - cur_frm.cscript.calculate_total(doc,cdt,cdn); + var d = locals[cdt][cdn]; + if (d.score){ + if (flt(d.score) > 5) { + msgprint("Score must be less than or equal to 5"); + d.score = 0; + refresh_field('score', d.name, 'appraisal_details'); + } + total = flt(d.per_weightage*d.score)/100; + d.score_earned = total.toPrecision(2); + refresh_field('score_earned', d.name, 'appraisal_details'); + } + else{ + d.score_earned = ''; + refresh_field('score_earned', d.name, 'appraisal_details'); + } + cur_frm.cscript.calculate_total(doc,cdt,cdn); } cur_frm.cscript.calculate_total = function(doc,cdt,cdn){ - var val = getchildren('Appraisal Detail', doc.name, 'appraisal_details', doc.doctype); - var total =0; - for(var i = 0; i getdate(self.doc.end_date): - msgprint("End Date can not be less than Start Date") - raise Exception - - def validate_existing_appraisal(self): - chk = sql("select name from `tabAppraisal` where employee=%s and (status='Submitted' or status='Completed') and ((start_date>=%s and start_date<=%s) or (end_date>=%s and end_date<=%s))",(self.doc.employee,self.doc.start_date,self.doc.end_date,self.doc.start_date,self.doc.end_date)) - if chk: - msgprint("You have already created Appraisal "+cstr(chk[0][0])+" in the current date range for employee "+cstr(self.doc.employee_name)) - raise Exception - - def validate_curr_appraisal(self): - for d in getlist(self.doclist, 'appraisal_details'): - if d.target_achieved or d.score: - if self.doc.status == 'Draft': - msgprint("Target achieved or Score can be added only for submitted Appraisal") - raise Exception - elif self.doc.status == 'Submitted' and session['user'] != self.doc.kra_approver: - msgprint("Target achieved or Score can be added only by Appraisal Approver") - raise Exception - - def validate_fiscal_year(self): - fy=sql("select year_start_date from `tabFiscal Year` where name='%s'"%self.doc.fiscal_year) - ysd=fy and fy[0][0] or "" - yed=add_days(str(ysd),365) - if str(self.doc.start_date) < str(ysd) or str(self.doc.start_date) > str(yed) or str(self.doc.end_date) < str(ysd) or str(self.doc.end_date) > str(yed): - msgprint("Appraisal date range is not within the Fiscal Year selected") - raise Exception - - def validate(self): - self.validate_dates() - self.validate_existing_appraisal() - self.validate_curr_appraisal() - self.validate_fiscal_year() - - def set_approver(self): - ret={} - approver_lst =[] - emp_nm = self.get_employee_name() - approver_lst1 = get_obj('Authorization Control').get_approver_name(self.doc.doctype,0,self) - if approver_lst1: - approver_lst=approver_lst1 - else: - approver_lst = [x[0] for x in sql("select distinct name from `tabProfile` where enabled=1 and name!='Administrator' and name!='Guest' and docstatus!=2")] - ret = {'app_lst':"\n" + "\n".join(approver_lst), 'emp_nm':cstr(emp_nm)} - return ret - - def calculate_total(self): - total = 0 - for d in getlist(self.doclist, 'appraisal_details'): - if d.score: - total = total + flt(d.score_earned) - ret={'total_score':flt(total)} - return ret - - def declare_completed(self): - ret={} - for d in getlist(self.doclist, 'appraisal_details'): - if not d.target_achieved or not d.score or not d.score_earned: - msgprint("Please add 'Target Achieved' and 'Score' for all KPI") - ret = {'status':'Incomplete'} - return ret - - if not self.doc.total_score: - msgprint("Please calculate total score using button 'Calculate Total Score'") - ret = {'status':'No Score'} - return ret - self.update_appraisal() - #set(self.doc, 'status', 'Completed') - ret = {'status':'Completed'} - return ret - - def update_appraisal(self): - for d in getlist(self.doclist, 'appraisal_details'): - if not d.kra or not d.per_weightage: - msgprint("Please remove the extra blank row added") - raise Exception - d.save() - if self.doc.total_score: - set(self.doc,'total_score',self.doc.total_score) - - def on_update(self): - set(self.doc, 'status', 'Draft') - - def validate_total_weightage(self): - total_w = 0 - for d in getlist(self.doclist, 'appraisal_details'): - total_w = flt(total_w) + flt(d.per_weightage) - - if flt(total_w)>100 or flt(total_w)<100: - msgprint("Total of weightage assigned to KPI is "+cstr(total_w)+".It should be 100(%)") - raise Exception - - def validate_appraisal_detail(self): - if not self.doc.kra_approver: - msgprint("Please mention the name of Approver") - raise Exception - - if not getlist(self.doclist, 'appraisal_details'): - msgprint("Please add KRA Details") - raise Exception - - self.validate_total_weightage() - - def on_submit(self): - self.validate_appraisal_detail() - set(self.doc, 'status', 'Submitted') - - def on_cancel(self): - set(self.doc, 'status', 'Cancelled') \ No newline at end of file + def __init__(self, doc, doclist=[]): + self.doc = doc + self.doclist = doclist + + def get_employee_name(self): + 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 emp_nm + + def fetch_kra(self): + if not self.doc.kra_template: + msgprint("Please select KRA Template to be be fetched") + raise Exception + self.doc.clear_table(self.doclist,'appraisal_details') + get_obj('DocType Mapper', 'KRA Template-Appraisal').dt_map('KRA Template', 'Appraisal', self.doc.kra_template, self.doc, self.doclist, "[['KRA Template','Appraisal'],['KRA Sheet', 'Appraisal Detail']]") + + def validate_dates(self): + if getdate(self.doc.start_date) > getdate(self.doc.end_date): + msgprint("End Date can not be less than Start Date") + raise Exception + + def validate_existing_appraisal(self): + chk = sql("select name from `tabAppraisal` where employee=%s and (status='Submitted' or status='Completed') and ((start_date>=%s and start_date<=%s) or (end_date>=%s and end_date<=%s))",(self.doc.employee,self.doc.start_date,self.doc.end_date,self.doc.start_date,self.doc.end_date)) + if chk: + msgprint("You have already created Appraisal "+cstr(chk[0][0])+" in the current date range for employee "+cstr(self.doc.employee_name)) + raise Exception + + def validate_curr_appraisal(self): + for d in getlist(self.doclist, 'appraisal_details'): + if d.target_achieved or d.score: + if self.doc.status == 'Draft': + msgprint("Target achieved or Score can be added only for submitted Appraisal") + raise Exception + elif self.doc.status == 'Submitted' and session['user'] != self.doc.kra_approver: + msgprint("Target achieved or Score can be added only by Appraisal Approver") + raise Exception + + + def validate_fiscal_year(self): + fy=sql("select year_start_date from `tabFiscal Year` where name='%s'"%self.doc.fiscal_year) + ysd=fy and fy[0][0] or "" + yed=add_days(str(ysd),365) + if str(self.doc.start_date) < str(ysd) or str(self.doc.start_date) > str(yed) or str(self.doc.end_date) < str(ysd) or str(self.doc.end_date) > str(yed): + msgprint("Appraisal date range is not within the Fiscal Year selected") + raise Exception + + def validate(self): + self.validate_dates() + self.validate_existing_appraisal() + self.validate_curr_appraisal() + self.validate_fiscal_year() + + def set_approver(self): + ret={} + approver_lst =[] + emp_nm = self.get_employee_name() + approver_lst1 = get_obj('Authorization Control').get_approver_name(self.doc.doctype,0,self) + if approver_lst1: + approver_lst=approver_lst1 + else: + approver_lst = [x[0] for x in sql("select distinct name from `tabProfile` where enabled=1 and name!='Administrator' and name!='Guest' and docstatus!=2")] + ret = {'app_lst':"\n" + "\n".join(approver_lst), 'emp_nm':cstr(emp_nm)} + return ret + + def calculate_total(self): + total = 0 + for d in getlist(self.doclist, 'appraisal_details'): + if d.score: + total = total + flt(d.score_earned) + ret={'total_score':flt(total)} + return ret + + def declare_completed(self): + ret={} + for d in getlist(self.doclist, 'appraisal_details'): + if not d.target_achieved or not d.score or not d.score_earned: + msgprint("Please add 'Target Achieved' and 'Score' for all KPI") + ret = {'status':'Incomplete'} + return ret + + if not self.doc.total_score: + msgprint("Please calculate total score using button 'Calculate Total Score'") + ret = {'status':'No Score'} + return ret + self.update_appraisal() + #set(self.doc, 'status', 'Completed') + ret = {'status':'Completed'} + return ret + + def update_appraisal(self): + for d in getlist(self.doclist, 'appraisal_details'): + if not d.kra or not d.per_weightage: + msgprint("Please remove the extra blank row added") + raise Exception + d.save() + if self.doc.total_score: + set(self.doc,'total_score',self.doc.total_score) + + def on_update(self): + set(self.doc, 'status', 'Draft') + + def validate_total_weightage(self): + total_w = 0 + for d in getlist(self.doclist, 'appraisal_details'): + total_w = flt(total_w) + flt(d.per_weightage) + + if flt(total_w)>100 or flt(total_w)<100: + msgprint("Total of weightage assigned to KPI is "+cstr(total_w)+".It should be 100(%)") + raise Exception + + def validate_appraisal_detail(self): + if not self.doc.kra_approver: + msgprint("Please mention the name of Approver") + raise Exception + + if not getlist(self.doclist, 'appraisal_details'): + msgprint("Please add KRA Details") + raise Exception + + self.validate_total_weightage() + + def on_submit(self): + self.validate_appraisal_detail() + set(self.doc, 'status', 'Submitted') + + def on_cancel(self): + set(self.doc, 'status', 'Cancelled') diff --git a/hr/doctype/appraisal/appraisal.txt b/hr/doctype/appraisal/appraisal.txt index 3521c6f867..b10c43407d 100644 --- a/hr/doctype/appraisal/appraisal.txt +++ b/hr/doctype/appraisal/appraisal.txt @@ -5,16 +5,17 @@ { 'creation': '2010-09-01 15:48:05', 'docstatus': 0, - 'modified': '2011-06-27 14:39:10', + 'modified': '2011-09-22 10:59:43', 'modified_by': 'Administrator', 'owner': 'ashwini@webnotestech.com' }, # These values are common for all DocType { - '_last_update': '1308808105', + '_last_update': '1316075905', 'autoname': 'APRSL.#####', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'module': 'HR', 'name': '__common__', @@ -22,7 +23,7 @@ 'section_style': 'Simple', 'server_code_error': ' ', 'show_in_menu': 0, - 'version': 160 + 'version': 161 }, # These values are common for all DocField @@ -56,7 +57,6 @@ 'cancel': 1, 'create': 1, 'doctype': 'DocPerm', - 'idx': 1, 'permlevel': 0, 'role': 'System Manager', 'submit': 1, @@ -66,7 +66,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 2, 'permlevel': 1, 'role': 'System Manager' }, @@ -77,7 +76,6 @@ 'cancel': 1, 'create': 1, 'doctype': 'DocPerm', - 'idx': 3, 'permlevel': 0, 'role': 'System Manager', 'submit': 1, @@ -87,7 +85,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 4, 'permlevel': 1, 'role': 'System Manager' }, @@ -98,7 +95,6 @@ 'cancel': 1, 'create': 1, 'doctype': 'DocPerm', - 'idx': 5, 'permlevel': 0, 'role': 'HR Manager', 'submit': 1, @@ -111,7 +107,6 @@ 'cancel': 1, 'create': 1, 'doctype': 'DocPerm', - 'idx': 6, 'permlevel': 0, 'role': 'HR User', 'submit': 1, @@ -121,7 +116,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 7, 'permlevel': 1, 'role': 'HR Manager' }, @@ -129,7 +123,6 @@ # DocPerm { 'doctype': 'DocPerm', - 'idx': 8, 'permlevel': 1, 'role': 'HR User' }, @@ -138,7 +131,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 1, 'label': 'Employee Details', 'oldfieldtype': 'Section Break', 'permlevel': 0 @@ -151,9 +143,9 @@ 'doctype': 'DocField', 'fieldname': 'status', 'fieldtype': 'Select', - 'idx': 2, 'in_filter': 1, 'label': 'Status', + 'no_copy': 1, 'oldfieldname': 'status', 'oldfieldtype': 'Select', 'options': '\nDraft\nSubmitted\nCompleted\nCancelled', @@ -168,7 +160,6 @@ 'doctype': 'DocField', 'fieldname': 'employee', 'fieldtype': 'Link', - 'idx': 3, 'in_filter': 1, 'label': 'Employee', 'oldfieldname': 'employee', @@ -185,7 +176,6 @@ 'doctype': 'DocField', 'fieldname': 'employee_name', 'fieldtype': 'Data', - 'idx': 4, 'in_filter': 1, 'label': 'Employee Name', 'oldfieldname': 'employee_name', @@ -198,7 +188,6 @@ 'doctype': 'DocField', 'fieldname': 'fiscal_year', 'fieldtype': 'Select', - 'idx': 5, 'in_filter': 1, 'label': 'Fiscal Year', 'oldfieldname': 'fiscal_year', @@ -213,7 +202,6 @@ 'doctype': 'DocField', 'fieldname': 'company', 'fieldtype': 'Select', - 'idx': 6, 'in_filter': 1, 'label': 'Company', 'oldfieldname': 'company', @@ -227,7 +215,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Column Break', - 'idx': 7, 'oldfieldtype': 'Column Break', 'permlevel': 0, 'width': '50%' @@ -238,7 +225,6 @@ 'doctype': 'DocField', 'fieldname': 'start_date', 'fieldtype': 'Date', - 'idx': 8, 'in_filter': 1, 'label': 'Start Date', 'oldfieldname': 'start_date', @@ -252,7 +238,6 @@ 'doctype': 'DocField', 'fieldname': 'end_date', 'fieldtype': 'Date', - 'idx': 9, 'in_filter': 1, 'label': 'End Date', 'oldfieldname': 'end_date', @@ -267,7 +252,6 @@ 'doctype': 'DocField', 'fieldname': 'kra_approver', 'fieldtype': 'Select', - 'idx': 10, 'in_filter': 0, 'label': 'Approver', 'oldfieldname': 'kra_approver', @@ -282,7 +266,6 @@ 'fieldname': 'amended_from', 'fieldtype': 'Data', 'hidden': 1, - 'idx': 11, 'label': 'Amended From', 'no_copy': 1, 'oldfieldname': 'amended_from', @@ -299,7 +282,6 @@ 'fieldname': 'amendment_date', 'fieldtype': 'Date', 'hidden': 1, - 'idx': 12, 'label': 'Amendment Date', 'no_copy': 1, 'oldfieldname': 'amendment_date', @@ -316,7 +298,6 @@ 'colour': 'White:FFF', 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 13, 'label': 'Declare Completed', 'oldfieldtype': 'Button', 'permlevel': 0, @@ -327,7 +308,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 14, 'oldfieldtype': 'Section Break', 'options': 'Simple', 'permlevel': 0 @@ -340,7 +320,6 @@ 'doctype': 'DocField', 'fieldname': 'kra_template', 'fieldtype': 'Link', - 'idx': 15, 'label': 'KRA Template', 'oldfieldname': 'kra_template', 'oldfieldtype': 'Link', @@ -352,7 +331,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 16, 'label': 'Fetch Template', 'oldfieldtype': 'Button', 'options': 'fetch_kra', @@ -366,7 +344,6 @@ 'doctype': 'DocField', 'fieldtype': 'Button', 'hidden': 1, - 'idx': 17, 'label': 'Update', 'oldfieldtype': 'Button', 'permlevel': 0, @@ -380,7 +357,6 @@ 'doctype': 'DocField', 'fieldname': 'appraisal_details', 'fieldtype': 'Table', - 'idx': 18, 'label': 'Appraisal Details', 'oldfieldname': 'appraisal_details', 'oldfieldtype': 'Table', @@ -393,7 +369,6 @@ 'allow_on_submit': 1, 'doctype': 'DocField', 'fieldtype': 'Button', - 'idx': 19, 'label': 'Calculate Total Score', 'oldfieldtype': 'Button', 'options': 'calculate_total', @@ -405,11 +380,10 @@ 'doctype': 'DocField', 'fieldname': 'total_score', 'fieldtype': 'Currency', - 'idx': 20, - 'label': 'Total Score', + 'label': 'Total Score (Out of 5)', 'no_copy': 1, 'oldfieldname': 'total_score', 'oldfieldtype': 'Currency', 'permlevel': 1 } -] \ No newline at end of file +] diff --git a/hr/doctype/appraisal_detail/appraisal_detail.txt b/hr/doctype/appraisal_detail/appraisal_detail.txt index fa57bef30e..06edc81e1b 100644 --- a/hr/doctype/appraisal_detail/appraisal_detail.txt +++ b/hr/doctype/appraisal_detail/appraisal_detail.txt @@ -5,8 +5,8 @@ { 'creation': '2010-09-01 15:48:05', 'docstatus': 0, - 'modified': '2010-09-20 14:06:57', - 'modified_by': 'rahul@webnotestech.com', + 'modified': '2011-09-22 10:45:37', + 'modified_by': 'Administrator', 'owner': 'ashwini@webnotestech.com' }, @@ -14,13 +14,14 @@ { 'autoname': 'APRSLD.#####', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'istable': 1, 'module': 'HR', 'name': '__common__', 'section_style': 'Simple', 'server_code_error': ' ', - 'version': 13 + 'version': 15 }, # These values are common for all DocField @@ -45,7 +46,6 @@ 'doctype': 'DocField', 'fieldname': 'kra', 'fieldtype': 'Small Text', - 'idx': 1, 'label': 'KRA', 'oldfieldname': 'kra', 'oldfieldtype': 'Small Text', @@ -58,7 +58,6 @@ 'doctype': 'DocField', 'fieldname': 'per_weightage', 'fieldtype': 'Currency', - 'idx': 2, 'label': 'Weightage (%)', 'oldfieldname': 'per_weightage', 'oldfieldtype': 'Currency', @@ -72,7 +71,6 @@ 'doctype': 'DocField', 'fieldname': 'target_achieved', 'fieldtype': 'Small Text', - 'idx': 3, 'label': 'Target Achieved', 'no_copy': 1, 'oldfieldname': 'target_achieved', @@ -86,15 +84,15 @@ 'colour': 'White:FFF', 'doctype': 'DocField', 'fieldname': 'score', - 'fieldtype': 'Select', - 'idx': 4, + 'fieldtype': 'Currency', 'label': 'Score (0-5)', 'no_copy': 1, 'oldfieldname': 'score', 'oldfieldtype': 'Select', 'options': '\n0\n1\n2\n3\n4\n5', 'permlevel': 0, - 'trigger': 'Client' + 'trigger': 'Client', + 'width': '60px' }, # DocField @@ -102,11 +100,10 @@ 'doctype': 'DocField', 'fieldname': 'score_earned', 'fieldtype': 'Currency', - 'idx': 5, 'label': 'Score Earned', 'no_copy': 1, 'oldfieldname': 'score_earned', 'oldfieldtype': 'Currency', 'permlevel': 1 } -] \ No newline at end of file +] diff --git a/patches/patch.py b/patches/patch.py index cfeddeb427..f8f61a5f98 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 368 +last_patch = 369 #------------------------------------------- @@ -355,3 +355,6 @@ def execute(patch_no): ] for d in t: nestedset.rebuild_tree(d[0], d[1]) + elif patch_no == 369: + reload_doc('hr', 'doctype', 'appraisal') + reload_doc('hr', 'doctype', 'appraisal_detail') From 03456444f794e1a9b5ed6448cdfc41528223330e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 26 Sep 2011 12:52:12 +0530 Subject: [PATCH 14/62] fixed cancelled gl entry issue in period closing voucher --- .../period_closing_voucher/period_closing_voucher.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/accounts/doctype/period_closing_voucher/period_closing_voucher.py b/accounts/doctype/period_closing_voucher/period_closing_voucher.py index c7e5db6639..895130ea0f 100644 --- a/accounts/doctype/period_closing_voucher/period_closing_voucher.py +++ b/accounts/doctype/period_closing_voucher/period_closing_voucher.py @@ -79,8 +79,8 @@ class DocType: # Get account (pl) specific balance #=========================================================== def get_pl_balances(self, d_or_c): - acc_bal = sql("select t1.account, sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) from `tabGL Entry` t1, `tabAccount` t2 where t1.account = t2.name and t2.group_or_ledger = 'Ledger' and ifnull(t2.freeze_account, 'No') = 'No' and t2.is_pl_account = 'Yes' and t2.debit_or_credit = '%s' and t2.docstatus < 2 and t2.company = '%s' and t1.posting_date between '%s' and '%s' group by t1.account " % (d_or_c, self.doc.company, self.year_start_date, self.doc.posting_date)) - return acc_bal + acc_bal = sql("select t1.account, sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) from `tabGL Entry` t1, `tabAccount` t2 where t1.account = t2.name and t2.group_or_ledger = 'Ledger' and ifnull(t2.freeze_account, 'No') = 'No' and ifnull(t2.is_pl_account, 'No') = 'Yes' and ifnull(is_cancelled, 'No') = 'No' and t2.debit_or_credit = '%s' and t2.docstatus < 2 and t2.company = '%s' and t1.posting_date between '%s' and '%s' group by t1.account " % (d_or_c, self.doc.company, self.year_start_date, self.doc.posting_date)) + return acc_bal # Makes GL Entries @@ -185,7 +185,7 @@ class DocType: # ============================================================= def on_cancel(self): # get all submit entries of current closing entry voucher - gl_entries = sql("select account, debit, credit from `tabGL Entry` where voucher_type = 'Period Closing Voucher' and voucher_no = '%s'" % (self.doc.name)) + gl_entries = sql("select account, debit, credit from `tabGL Entry` where voucher_type = 'Period Closing Voucher' and voucher_no = '%s' and ifnull(is_cancelled, 'No') = 'No'" % (self.doc.name)) # Swap Debit & Credit Column and make gl entry for gl in gl_entries: From 8bb4ba46386fe84a611e29155f87761ebc9e8555 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 26 Sep 2011 15:16:06 +0530 Subject: [PATCH 15/62] unhide group/ledger field in cost senter for import purpose --- patches/patch.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/patches/patch.py b/patches/patch.py index f8f61a5f98..5db300a797 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 369 +last_patch = 370 #------------------------------------------- @@ -358,3 +358,5 @@ def execute(patch_no): elif patch_no == 369: reload_doc('hr', 'doctype', 'appraisal') reload_doc('hr', 'doctype', 'appraisal_detail') + elif patch_no == 370: + sql("update `tabDocField` set `hidden` = 0 where fieldname = 'group_or_ledger' and parent = 'Cost Center'") From fe02f0602c7783808c64dd831f4147625a5c1ddd Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 27 Sep 2011 10:38:41 +0530 Subject: [PATCH 16/62] update_nsm_model in cost center on_trash() --- accounts/doctype/cost_center/cost_center.py | 100 +++++++++++--------- patches/patch.py | 14 +++ 2 files changed, 67 insertions(+), 47 deletions(-) diff --git a/accounts/doctype/cost_center/cost_center.py b/accounts/doctype/cost_center/cost_center.py index 521712b1f9..66d22f017d 100644 --- a/accounts/doctype/cost_center/cost_center.py +++ b/accounts/doctype/cost_center/cost_center.py @@ -18,51 +18,57 @@ convert_to_lists = webnotes.conn.convert_to_lists class DocType: - def __init__(self,d,dl): - self.doc, self.doclist = d,dl - self.nsm_parent_field = 'parent_cost_center' - - def autoname(self): - #company_abbr = sql("select abbr from tabCompany where name=%s", self.doc.company)[0][0] - self.doc.name = self.doc.cost_center_name + ' - ' + self.doc.company_abbr - - def get_abbr(self): - abbr = sql("select abbr from tabCompany where company_name='%s'"%(self.doc.company_name))[0][0] or '' - ret = { - 'company_abbr' : abbr - } - return ret + def __init__(self,d,dl): + self.doc, self.doclist = d,dl + self.nsm_parent_field = 'parent_cost_center' + + def autoname(self): + self.doc.name = self.doc.cost_center_name + ' - ' + self.doc.company_abbr + + #------------------------------------------------------------------------- + def get_abbr(self): + abbr = sql("select abbr from tabCompany where company_name='%s'"%(self.doc.company_name))[0][0] or '' + ret = { + 'company_abbr' : abbr + } + return ret - def validate(self): - # Cost Center name must be unique - # --------------------------- - if (self.doc.__islocal or (not self.doc.name)) and sql("select name from `tabCost Center` where cost_center_name = %s and company_name=%s", (self.doc.cost_center_name, self.doc.company_name)): - msgprint("Cost Center Name already exists, please rename") - raise Exception - - check_acc_list = [] - for d in getlist(self.doclist, 'budget_details'): - if [d.account, d.fiscal_year] in check_acc_list: - msgprint("Account " + cstr(d.account) + "has been entered more than once for fiscal year " + cstr(d.fiscal_year)) - raise Exception - if [d.account, d.fiscal_year] not in check_acc_list: check_acc_list.append([d.account, d.fiscal_year]) - - def on_update(self): - # update Node Set Model - import webnotes - import webnotes.utils.nestedset - # update Node Set Model - webnotes.utils.nestedset.update_nsm(self) - - def check_if_child_exists(self): - return sql("select name from `tabCost Center` where parent_cost_center = %s and docstatus != 2", self.doc.name, debug=0) - - # On Trash - # -------- - def on_trash(self): - if self.check_if_child_exists(): - msgprint("Child exists for this cost center. You can not trash this account.", raise_exception=1) - - # rebuild tree - set(self.doc,'old_parent', '') - self.update_nsm_model() + #------------------------------------------------------------------------- + def validate(self): + """ + Cost Center name must be unique + """ + if (self.doc.__islocal or not self.doc.name) and sql("select name from `tabCost Center` where cost_center_name = %s and company_name=%s", (self.doc.cost_center_name, self.doc.company_name)): + msgprint("Cost Center Name already exists, please rename", raise_exception=1) + + check_acc_list = [] + for d in getlist(self.doclist, 'budget_details'): + if [d.account, d.fiscal_year] in check_acc_list: + msgprint("Account " + cstr(d.account) + "has been entered more than once for fiscal year " + cstr(d.fiscal_year), raise_exception=1) + else: + check_acc_list.append([d.account, d.fiscal_year]) + + #------------------------------------------------------------------------- + def update_nsm_model(self): + """ + update Nested Set Model + """ + import webnotes.utils.nestedset + webnotes.utils.nestedset.update_nsm(self) + + #------------------------------------------------------------------------- + def on_update(self): + self.update_nsm_model() + + def check_if_child_exists(self): + return sql("select name from `tabCost Center` where parent_cost_center = %s and docstatus != 2", self.doc.name) + + # On Trash + #------------------------------------------------------------------------- + def on_trash(self): + if self.check_if_child_exists(): + msgprint("Child exists for this cost center. You can not trash this account.", raise_exception=1) + + # rebuild tree + set(self.doc,'old_parent', '') + self.update_nsm_model() diff --git a/patches/patch.py b/patches/patch.py index 5db300a797..3b2bb3ecc6 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -360,3 +360,17 @@ def execute(patch_no): reload_doc('hr', 'doctype', 'appraisal_detail') elif patch_no == 370: sql("update `tabDocField` set `hidden` = 0 where fieldname = 'group_or_ledger' and parent = 'Cost Center'") + elif patch_no == 371: + comp = sql("select name from tabCompany where docstatus!=2") + fy = sql("select name from `tabFiscal Year` order by year_start_date asc") + for c in comp: + prev_fy = '' + for f in fy: + fy_obj = get_obj('Fiscal Year', f[0]) + fy_obj.doc.past_year = prev_fy + fy_obj.doc.company = c[0] + fy_obj.doc.save() + fy_obj.repost() + prev_fy = f[0] + sql("commit") + sql("start transaction") From 22b33b59d011fc2537fbecfebde31ec5985de3ae Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 27 Sep 2011 17:01:11 +0530 Subject: [PATCH 17/62] Error fixed in auth control --- .../authorization_control/authorization_control.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/setup/doctype/authorization_control/authorization_control.py b/setup/doctype/authorization_control/authorization_control.py index d0494301c8..3ddcab41db 100644 --- a/setup/doctype/authorization_control/authorization_control.py +++ b/setup/doctype/authorization_control/authorization_control.py @@ -38,7 +38,7 @@ class DocType(TransactionBase): for d in app_dtl: if(d[0]): appr_users.append(d[0]) if(d[1]): appr_roles.append(d[1]) - + if not has_common(appr_roles, webnotes.user.get_roles()) and not has_common(appr_users, session['user']): msg, add_msg = '','' if max_amount: @@ -117,7 +117,7 @@ class DocType(TransactionBase): # Check for authorization set for individual user based_on = [x[0] for x in sql("select distinct based_on from `tabAuthorization Rule` where transaction = %s and system_user = %s and (company = %s or ifnull(company,'')='') and docstatus != 2", (doctype_name, session['user'], company))] - + for d in based_on: self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 1, company) @@ -128,7 +128,13 @@ class DocType(TransactionBase): # Specific Role # =============== # Check for authorization set on particular roles - based_on = [x[0] for x in sql("select based_on from `tabAuthorization Rule` where transaction = %s and system_role IN (%s) and based_on IN (%s) and (company = %s or ifnull(company,'')='') and docstatus != 2", (doctype_name, "'"+"','".join(webnotes.user.get_roles())+"'", "'"+"','".join(final_based_on)+"'",company))] + based_on = [x[0] for x in sql("""select based_on + from `tabAuthorization Rule` + where transaction = %s and system_role IN (%s) and based_on IN (%s) + and (company = %s or ifnull(company,'')='') + and docstatus != 2 + """ % ('%s', "'"+"','".join(webnotes.user.get_roles())+"'", "'"+"','".join(final_based_on)+"'", '%s'), (doctype_name, company))] + for d in based_on: self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 2, company) From bbca2337db0cc673b6a9a8a4ae694f408503c08e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 30 Sep 2011 17:49:24 +0530 Subject: [PATCH 18/62] get_query modified for item in quotation --- selling/doctype/quotation/quotation.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selling/doctype/quotation/quotation.js b/selling/doctype/quotation/quotation.js index 0732e45dc6..21eceb9c61 100644 --- a/selling/doctype/quotation/quotation.js +++ b/selling/doctype/quotation/quotation.js @@ -314,9 +314,9 @@ cur_frm.fields_dict['quotation_details'].grid.get_field('item_code').get_query= var d = locals[cdt][cdn]; var cond = (doc.order_type == 'Maintenance')? " and tabItem.is_service_item = 'Yes'" : " and tabItem.is_sales_item = 'Yes'" if(doc.customer) - return repl("SELECT i.name,i.item_code,concat('Last quoted at - ',cast(quote_rate as char)) as quote_rate,concat('Last sold at - ',cast(sales_rate as char)) as sales_rate FROM\ + return repl("SELECT i.name,i.item_code,concat('Last quoted at - ',cast(quote_rate as char)) as quote_rate,concat('Last sold at - ',cast(sales_rate as char)) as sales_rate, i.item_name, i.description FROM\ (\ - select item_code,name from tabItem where tabItem.%(key)s like '%s' %(cond)s\ + select item_code,name, item_name, description from tabItem where tabItem.%(key)s like '%s' %(cond)s\ )i\ left join\ (\ @@ -339,5 +339,5 @@ cur_frm.fields_dict['quotation_details'].grid.get_field('item_code').get_query= )m where r.item_code=m.item_code and r.voucher_date=m.voucher_date\ )s on i.item_code=s.item_code ORDER BY item_code LIMIT 50",{cust:doc.customer, cond:cond}); else - return repl("SELECT name, item_code FROM tabItem WHERE `tabItem`.%(key)s LIKE '%s' %(cond)s ORDER BY tabItem.item_code DESC LIMIT 50", {cond:cond}); + return repl("SELECT name, item_name, description FROM tabItem WHERE `tabItem`.%(key)s LIKE '%s' %(cond)s ORDER BY tabItem.item_code DESC LIMIT 50", {cond:cond}); } From d4694763f62a2eb601352d938f43177ac9ebf5be Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 30 Sep 2011 17:50:17 +0530 Subject: [PATCH 19/62] get_query modified for item in quotation --- selling/doctype/quotation/quotation.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selling/doctype/quotation/quotation.js b/selling/doctype/quotation/quotation.js index 0732e45dc6..21eceb9c61 100644 --- a/selling/doctype/quotation/quotation.js +++ b/selling/doctype/quotation/quotation.js @@ -314,9 +314,9 @@ cur_frm.fields_dict['quotation_details'].grid.get_field('item_code').get_query= var d = locals[cdt][cdn]; var cond = (doc.order_type == 'Maintenance')? " and tabItem.is_service_item = 'Yes'" : " and tabItem.is_sales_item = 'Yes'" if(doc.customer) - return repl("SELECT i.name,i.item_code,concat('Last quoted at - ',cast(quote_rate as char)) as quote_rate,concat('Last sold at - ',cast(sales_rate as char)) as sales_rate FROM\ + return repl("SELECT i.name,i.item_code,concat('Last quoted at - ',cast(quote_rate as char)) as quote_rate,concat('Last sold at - ',cast(sales_rate as char)) as sales_rate, i.item_name, i.description FROM\ (\ - select item_code,name from tabItem where tabItem.%(key)s like '%s' %(cond)s\ + select item_code,name, item_name, description from tabItem where tabItem.%(key)s like '%s' %(cond)s\ )i\ left join\ (\ @@ -339,5 +339,5 @@ cur_frm.fields_dict['quotation_details'].grid.get_field('item_code').get_query= )m where r.item_code=m.item_code and r.voucher_date=m.voucher_date\ )s on i.item_code=s.item_code ORDER BY item_code LIMIT 50",{cust:doc.customer, cond:cond}); else - return repl("SELECT name, item_code FROM tabItem WHERE `tabItem`.%(key)s LIKE '%s' %(cond)s ORDER BY tabItem.item_code DESC LIMIT 50", {cond:cond}); + return repl("SELECT name, item_name, description FROM tabItem WHERE `tabItem`.%(key)s LIKE '%s' %(cond)s ORDER BY tabItem.item_code DESC LIMIT 50", {cond:cond}); } From 2ce051284acb9a93156912cf4ad9f6d5939ed966 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 30 Sep 2011 20:15:39 +0530 Subject: [PATCH 20/62] fieldname changed in features setup and required patch --- patches/patch.py | 17 ++++++- .../doctype/features_setup/features_setup.txt | 45 ++++++++++--------- startup/startup.js | 34 +++++++------- 3 files changed, 56 insertions(+), 40 deletions(-) diff --git a/patches/patch.py b/patches/patch.py index 3b2bb3ecc6..8177e87f7e 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 370 +last_patch = 371 #------------------------------------------- @@ -361,6 +361,21 @@ def execute(patch_no): elif patch_no == 370: sql("update `tabDocField` set `hidden` = 0 where fieldname = 'group_or_ledger' and parent = 'Cost Center'") elif patch_no == 371: + reload_doc('setup', 'doctype','features_setup') + flds = ['page_break', 'projects', 'packing_details', 'discounts', 'brands', 'item_batch_nos', 'after_sales_installations', 'item_serial_nos', 'item_group_in_details', 'exports', 'imports', 'item_advanced', 'sales_extras', 'more_info', 'quality', 'manufacturing', 'pos', 'item_serial_nos'] + + for f in flds: + val = sql("select value from tabSingles where field = '%s' and doctype = 'Features Setup'" % f) + val = val and val[0][0] or 0 + sql("update `tabSingles` set value = %s where field = '%s' and doctype = 'Features Setup'" % (val, '__'+f)) + + st = "'"+"', '".join(flds)+"'" + sql("delete from `tabSingles` where field in (%s) and doctype = 'Features Setup'" % st) + sql("delete from `tabDefaultValue` where defkey in (%s) and parent = 'Control Panel'" % st) + + get_obj('Features Setup', 'Features Setup').doc.save() + + elif patch_no == 372: comp = sql("select name from tabCompany where docstatus!=2") fy = sql("select name from `tabFiscal Year` order by year_start_date asc") for c in comp: diff --git a/setup/doctype/features_setup/features_setup.txt b/setup/doctype/features_setup/features_setup.txt index 224d175a0b..b43a8eba66 100644 --- a/setup/doctype/features_setup/features_setup.txt +++ b/setup/doctype/features_setup/features_setup.txt @@ -3,17 +3,18 @@ # These values are common in all dictionaries { - 'creation': '2011-08-25 16:53:56', + 'creation': '2011-09-07 11:59:05', 'docstatus': 0, - 'modified': '2011-08-31 15:05:53', + 'modified': '2011-09-30 19:49:12', 'modified_by': 'Administrator', 'owner': 'Administrator' }, # These values are common for all DocType { - '_last_update': '1314783102', + '_last_update': '1317365120', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'issingle': 1, 'module': 'Setup', @@ -21,7 +22,7 @@ 'name_case': 'Title Case', 'section_style': 'Simple', 'show_in_menu': 1, - 'version': 16 + 'version': 19 }, # These values are common for all DocField @@ -77,7 +78,7 @@ 'colour': 'White:FFF', 'description': 'To track item in sales and purchase documents based on their serial nos. This is can also used to track warranty details of the product.', 'doctype': 'DocField', - 'fieldname': 'item_searial_nos', + 'fieldname': '__item_searial_nos', 'fieldtype': 'Check', 'label': 'Item Serial Nos' }, @@ -87,7 +88,7 @@ 'colour': 'White:FFF', 'description': 'To track items in sales and purchase documents with batch nos
Preferred Industry: Chemicals etc', 'doctype': 'DocField', - 'fieldname': 'item_batch_nos', + 'fieldname': '__item_batch_nos', 'fieldtype': 'Check', 'label': 'Item Batch Nos' }, @@ -97,7 +98,7 @@ 'colour': 'White:FFF', 'description': 'To track brand name in the following documents
\nDelivery Note, Enuiry, Indent, Item, Purchase Order, Purchase Voucher, Purchaser Receipt, Quotation, Receivable Voucher, Sales BOM, Sales Order, Serial No', 'doctype': 'DocField', - 'fieldname': 'brands', + 'fieldname': '__brands', 'fieldtype': 'Check', 'label': 'Brands' }, @@ -113,7 +114,7 @@ 'colour': 'White:FFF', 'description': '1. To maintain the customer wise item code and to make them searchable based on their code use this option', 'doctype': 'DocField', - 'fieldname': 'item_advanced', + 'fieldname': '__item_advanced', 'fieldtype': 'Check', 'label': 'Item Advanced' }, @@ -123,7 +124,7 @@ 'colour': 'White:FFF', 'description': 'If Sale BOM is defined, the actual BOM of the Pack is displayed as table.\nAvailable in Delivery Note and Sales Order', 'doctype': 'DocField', - 'fieldname': 'packing_details', + 'fieldname': '__packing_details', 'fieldtype': 'Check', 'label': 'Packing Detials' }, @@ -133,7 +134,7 @@ 'colour': 'White:FFF', 'description': 'To get Item Group in details table', 'doctype': 'DocField', - 'fieldname': 'item_group_in_details', + 'fieldname': '__item_group_in_details', 'fieldtype': 'Check', 'label': 'Item Groups in Details' }, @@ -150,7 +151,7 @@ 'colour': 'White:FFF', 'description': 'All export related fields like currency, conversion rate, export total, export grand total etc are available in
\nDelivery Note, POS, Quotation, Sales Invoice, Sales Order etc.', 'doctype': 'DocField', - 'fieldname': 'exports', + 'fieldname': '__exports', 'fieldtype': 'Check', 'label': 'Exports' }, @@ -160,7 +161,7 @@ 'colour': 'White:FFF', 'description': 'All import related fields like currency, conversion rate, import total, import grand total etc are available in
\nPurchase Receipt, Supplier Quotation, Purchase Invoice, Purchase Order etc.', 'doctype': 'DocField', - 'fieldname': 'imports', + 'fieldname': '__imports', 'fieldtype': 'Check', 'label': 'Imports' }, @@ -176,7 +177,7 @@ 'colour': 'White:FFF', 'description': 'Field available in Delivery Note, Quotation, Receivable Voucher, Sales Order', 'doctype': 'DocField', - 'fieldname': 'discounts', + 'fieldname': '__discounts', 'fieldtype': 'Check', 'label': 'Discounts' }, @@ -186,7 +187,7 @@ 'colour': 'White:FFF', 'description': 'To track any installation or commissioning related work after sales', 'doctype': 'DocField', - 'fieldname': 'after_sales_installations', + 'fieldname': '__after_sales_installations', 'fieldtype': 'Check', 'label': 'After Sale Installations' }, @@ -195,7 +196,7 @@ { 'description': 'Available in \nBill Of Materials, Delivery Note, Payable Voucher, Production Order, Purchase Order, Purchase Receipt, Receivable Voucher, Sales Order, Stock Entry, Timesheet', 'doctype': 'DocField', - 'fieldname': 'projects', + 'fieldname': '__projects', 'fieldtype': 'Check', 'label': 'Projects' }, @@ -205,7 +206,7 @@ 'colour': 'White:FFF', 'description': 'If you have Sales Team and Sale Partners (Channel Partners) they can be tagged and maintain their contribution in the sales activity', 'doctype': 'DocField', - 'fieldname': 'sales_extras', + 'fieldname': '__sales_extras', 'fieldtype': 'Check', 'label': 'Sales Extras' }, @@ -222,7 +223,7 @@ 'colour': 'White:FFF', 'description': 'If you involve in manufacturing activity
\nEnables item Is Manufactured', 'doctype': 'DocField', - 'fieldname': 'manufacturing', + 'fieldname': '__manufacturing', 'fieldtype': 'Check', 'label': 'Manufacturing' }, @@ -238,7 +239,7 @@ 'colour': 'White:FFF', 'description': 'If you follow Quality Inspection
\nEnables item QA Required and QA No in Purchase Receipt', 'doctype': 'DocField', - 'fieldname': 'quality', + 'fieldname': '__quality', 'fieldtype': 'Check', 'label': 'Quality' }, @@ -248,7 +249,7 @@ 'colour': 'White:FFF', 'description': 'To enable Point of Sale features', 'doctype': 'DocField', - 'fieldname': 'pos', + 'fieldname': '__pos', 'fieldtype': 'Check', 'label': 'Point of Sale' }, @@ -265,7 +266,7 @@ 'colour': 'White:FFF', 'description': 'If you have long print formats, this feature can be used to split the page to be printed on multiple pages with all headers and footers on each page', 'doctype': 'DocField', - 'fieldname': 'page_break', + 'fieldname': '__page_break', 'fieldtype': 'Check', 'label': 'Page Break' }, @@ -281,8 +282,8 @@ 'colour': 'White:FFF', 'description': 'Enables More Info. in all documents', 'doctype': 'DocField', - 'fieldname': 'more_info', + 'fieldname': '__more_info', 'fieldtype': 'Check', 'label': 'More Info' } -] \ No newline at end of file +] diff --git a/startup/startup.js b/startup/startup.js index 942f4effc5..6199c772bc 100644 --- a/startup/startup.js +++ b/startup/startup.js @@ -552,7 +552,7 @@ Dictionary Format } // ====================================================================*/ pscript.feature_dict = { - 'projects': { + '__projects': { 'Bill Of Materials': {'fields':['project_name']}, 'Delivery Note': {'fields':['project_name']}, 'Payable Voucher': {'fields':['project_name']}, @@ -564,17 +564,17 @@ pscript.feature_dict = { 'Stock Entry': {'fields':['project_name']}, 'Timesheet': {'timesheet_details':['project_name']} }, - 'packing_details': { + '__packing_details': { 'Delivery Note': {'fields':['packing_details','print_packing_slip'],'delivery_note_details':['no_of_packs','pack_gross_wt','pack_nett_wt','pack_no','pack_unit']}, 'Sales Order': {'fields':['packing_details']} }, - 'discounts': { + '__discounts': { 'Delivery Note': {'delivery_note_details':['adj_rate']}, 'Quotation': {'quotation_details':['adj_rate']}, 'Receivable Voucher': {'entries':['adj_rate']}, 'Sales Order': {'sales_order_details':['adj_rate','ref_rate']} }, - 'brands': { + '__brands': { 'Delivery Note': {'delivery_note_details':['brand']}, 'Indent': {'indent_details':['brand']}, 'Item': {'fields':['brand']}, @@ -586,10 +586,10 @@ pscript.feature_dict = { 'Sales Order': {'sales_order_details':['brand']}, 'Serial No': {'fields':['brand']} }, - 'after_sales_installations': { + '__after_sales_installations': { 'Delivery Note': {'fields':['installation_status','per_installed'],'delivery_note_details':['installed_qty']} }, - 'item_batch_nos': { + '__item_batch_nos': { 'Delivery Note': {'delivery_note_details':['batch_no']}, 'Item': {'fields':['has_batch_no']}, 'Purchase Receipt': {'purchase_receipt_details':['batch_no']}, @@ -599,7 +599,7 @@ pscript.feature_dict = { 'Stock Entry': {'mtn_details':['batch_no']}, 'Stock Ledger Entry': {'fields':['batch_no']} }, - 'item_serial_nos': { + '__item_serial_nos': { 'Customer Issue': {'fields':['serial_no']}, 'Delivery Note': {'delivery_note_details':['serial_no'],'packing_details':['serial_no']}, 'Installation Note': {'installed_item_details':['serial_no']}, @@ -613,7 +613,7 @@ pscript.feature_dict = { 'Stock Entry': {'mtn_details':['serial_no']}, 'Stock Ledger Entry': {'fields':['serial_no']} }, - 'item_group_in_details': { + '__item_group_in_details': { 'Delivery Note': {'delivery_note_details':['item_group']}, 'Enquiry': {'enquiry_details':['item_group']}, 'Indent': {'indent_details':['item_group']}, @@ -631,7 +631,7 @@ pscript.feature_dict = { 'Sales Person': {'target_details':['item_group']}, 'Territory': {'target_details':['item_group']} }, - 'page_break': { + '__page_break': { 'Delivery Note': {'delivery_note_details':['page_break'],'packing_details':['page_break']}, 'Indent': {'indent_details':['page_break']}, 'Purchase Order': {'po_details':['page_break']}, @@ -641,7 +641,7 @@ pscript.feature_dict = { 'Receivable Voucher': {'entries':['page_break']}, 'Sales Order': {'sales_order_details':['page_break']} }, - 'exports': { + '__exports': { 'Delivery Note': {'fields':['Note','conversion_rate','currency','grand_total_export','in_words_export','rounded_total_export'],'delivery_note_details':['base_ref_rate','export_amount','export_rate']}, 'POS Setting': {'fields':['conversion_rate','currency']}, 'Quotation': {'fields':['Note HTML','OT Notes','conversion_rate','currency','grand_total_export','in_words_export','rounded_total_export'],'quotation_details':['base_ref_rate','export_amount','export_rate']}, @@ -650,16 +650,16 @@ pscript.feature_dict = { 'Sales BOM': {'fields':['currency']}, 'Sales Order': {'fields':['Note1','OT Notes','conversion_rate','currency','grand_total_export','in_words_export','rounded_total_export'],'sales_order_details':['base_ref_rate','export_amount','export_rate']} }, - 'imports': { + '__imports': { 'Payable Voucher': {'fields':['conversion_rate','currency','grand_total_import','in_words_import','net_total_import','other_charges_added_import','other_charges_deducted_import'],'entries':['import_amount','import_rate']}, 'Purchase Order': {'fields':['Note HTML','conversion_rate','currency','grand_total_import','in_words_import','net_total_import','other_charges_added_import','other_charges_deducted_import'],'po_details':['import_amount','import_rate']}, 'Purchase Receipt': {'fields':['conversion_rate','currency','grand_total_import','in_words_import','net_total_import','other_charges_added_import','other_charges_deducted_import'],'purchase_receipt_details':['import_amount','import_rate']}, 'Supplier Quotation': {'fields':['conversion_rate','currency']} }, - 'item_advanced': { + '__item_advanced': { 'Item': {'fields':['item_customer_details']} }, - 'sales_extras': { + '__sales_extras': { 'Address': {'fields':['sales_partner']}, 'Contact': {'fields':['sales_partner']}, 'Customer': {'fields':['sales_team']}, @@ -668,7 +668,7 @@ pscript.feature_dict = { 'Receivable Voucher': {'fields':['sales_team']}, 'Sales Order': {'fields':['sales_team','Packing List']} }, - 'more_info': { + '__more_info': { 'Customer': {'fields':['More Info']}, 'Delivery Note': {'fields':['More Info']}, 'Enquiry': {'fields':['More Info']}, @@ -683,14 +683,14 @@ pscript.feature_dict = { 'Serial No': {'fields':['More Info']}, 'Supplier': {'fields':['More Info']} }, - 'quality': { + '__quality': { 'Item': {'fields':['Item Inspection Criteria','inspection_required']}, 'Purchase Receipt': {'purchase_receipt_details':['qa_no']} }, - 'manufacturing': { + '__manufacturing': { 'Item': {'fields':['Manufacturing']} }, - 'pos': { + '__pos': { 'Receivable Voucher': {'fields':['is_pos']} } } From 5556cbe51dace8c1ff8905be5851d74a4c54b86e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 30 Sep 2011 20:36:56 +0530 Subject: [PATCH 21/62] features setup patch fixed --- patches/patch.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/patches/patch.py b/patches/patch.py index 8177e87f7e..cdfbbb6c6d 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -361,6 +361,8 @@ def execute(patch_no): elif patch_no == 370: sql("update `tabDocField` set `hidden` = 0 where fieldname = 'group_or_ledger' and parent = 'Cost Center'") elif patch_no == 371: + from webnotes.modules.module_manager import reload_doc + reload_doc('setup', 'doctype','features_setup') flds = ['page_break', 'projects', 'packing_details', 'discounts', 'brands', 'item_batch_nos', 'after_sales_installations', 'item_serial_nos', 'item_group_in_details', 'exports', 'imports', 'item_advanced', 'sales_extras', 'more_info', 'quality', 'manufacturing', 'pos', 'item_serial_nos'] @@ -368,9 +370,9 @@ def execute(patch_no): val = sql("select value from tabSingles where field = '%s' and doctype = 'Features Setup'" % f) val = val and val[0][0] or 0 sql("update `tabSingles` set value = %s where field = '%s' and doctype = 'Features Setup'" % (val, '__'+f)) - + st = "'"+"', '".join(flds)+"'" - sql("delete from `tabSingles` where field in (%s) and doctype = 'Features Setup'" % st) + sql("delete from `tabDocField` where fieldname in (%s) and parent = 'Features Setup'" % st) sql("delete from `tabDefaultValue` where defkey in (%s) and parent = 'Control Panel'" % st) get_obj('Features Setup', 'Features Setup').doc.save() From cdb8255628b9ce29bc185a750fe02af2f87e8935 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 5 Oct 2011 11:26:46 +0530 Subject: [PATCH 22/62] Fieldname changed in Features Setup --- patches/patch.py | 23 +++++++++-- .../doctype/features_setup/features_setup.txt | 40 +++++++++---------- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/patches/patch.py b/patches/patch.py index cdfbbb6c6d..6618b7aefe 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 371 +last_patch = 372 #------------------------------------------- @@ -364,12 +364,12 @@ def execute(patch_no): from webnotes.modules.module_manager import reload_doc reload_doc('setup', 'doctype','features_setup') - flds = ['page_break', 'projects', 'packing_details', 'discounts', 'brands', 'item_batch_nos', 'after_sales_installations', 'item_serial_nos', 'item_group_in_details', 'exports', 'imports', 'item_advanced', 'sales_extras', 'more_info', 'quality', 'manufacturing', 'pos', 'item_serial_nos'] + flds = ['page_break', 'projects', 'packing_details', 'discounts', 'brands', 'item_batch_nos', 'after_sales_installations', 'item_searial_nos', 'item_group_in_details', 'exports', 'imports', 'item_advanced', 'sales_extras', 'more_info', 'quality', 'manufacturing', 'pos', 'item_serial_nos'] for f in flds: val = sql("select value from tabSingles where field = '%s' and doctype = 'Features Setup'" % f) val = val and val[0][0] or 0 - sql("update `tabSingles` set value = %s where field = '%s' and doctype = 'Features Setup'" % (val, '__'+f)) + sql("update `tabSingles` set `value` = %s where `field` = '%s' and doctype = 'Features Setup'" % (val, '__'+f)) st = "'"+"', '".join(flds)+"'" sql("delete from `tabDocField` where fieldname in (%s) and parent = 'Features Setup'" % st) @@ -378,6 +378,23 @@ def execute(patch_no): get_obj('Features Setup', 'Features Setup').doc.save() elif patch_no == 372: + from webnotes.modules.module_manager import reload_doc + + reload_doc('setup', 'doctype','features_setup') + flds = ['page_break', 'projects', 'packing_details', 'discounts', 'brands', 'item_batch_nos', 'after_sales_installations', 'item_searial_nos', 'item_group_in_details', 'exports', 'imports', 'item_advanced', 'sales_extras', 'more_info', 'quality', 'manufacturing', 'pos', 'item_serial_nos'] + + for f in flds: + val = sql("select value from tabSingles where field = '%s' and doctype = 'Features Setup'" % f) + val = val and val[0][0] or 0 + sql("update `tabSingles` set `value` = %s where `field` = '%s' and doctype = 'Features Setup'" % (val, 'fs_'+f)) + + st = "'__"+"', '__".join(flds)+"'" + + sql("delete from `tabDocField` where fieldname in (%s) and parent = 'Features Setup'" % st) + sql("delete from `tabDefaultValue` where defkey in (%s) and parent = 'Control Panel'" % st) + + get_obj('Features Setup', 'Features Setup').doc.save() + elif patch_no == 373: comp = sql("select name from tabCompany where docstatus!=2") fy = sql("select name from `tabFiscal Year` order by year_start_date asc") for c in comp: diff --git a/setup/doctype/features_setup/features_setup.txt b/setup/doctype/features_setup/features_setup.txt index b43a8eba66..722d49a07e 100644 --- a/setup/doctype/features_setup/features_setup.txt +++ b/setup/doctype/features_setup/features_setup.txt @@ -5,14 +5,14 @@ { 'creation': '2011-09-07 11:59:05', 'docstatus': 0, - 'modified': '2011-09-30 19:49:12', + 'modified': '2011-10-05 10:50:17', 'modified_by': 'Administrator', 'owner': 'Administrator' }, # These values are common for all DocType { - '_last_update': '1317365120', + '_last_update': '1317790484', 'colour': 'White:FFF', 'default_print_format': 'Standard', 'doctype': 'DocType', @@ -22,7 +22,7 @@ 'name_case': 'Title Case', 'section_style': 'Simple', 'show_in_menu': 1, - 'version': 19 + 'version': 21 }, # These values are common for all DocField @@ -78,7 +78,7 @@ 'colour': 'White:FFF', 'description': 'To track item in sales and purchase documents based on their serial nos. This is can also used to track warranty details of the product.', 'doctype': 'DocField', - 'fieldname': '__item_searial_nos', + 'fieldname': 'fs_item_serial_nos', 'fieldtype': 'Check', 'label': 'Item Serial Nos' }, @@ -88,7 +88,7 @@ 'colour': 'White:FFF', 'description': 'To track items in sales and purchase documents with batch nos
Preferred Industry: Chemicals etc', 'doctype': 'DocField', - 'fieldname': '__item_batch_nos', + 'fieldname': 'fs_item_batch_nos', 'fieldtype': 'Check', 'label': 'Item Batch Nos' }, @@ -98,7 +98,7 @@ 'colour': 'White:FFF', 'description': 'To track brand name in the following documents
\nDelivery Note, Enuiry, Indent, Item, Purchase Order, Purchase Voucher, Purchaser Receipt, Quotation, Receivable Voucher, Sales BOM, Sales Order, Serial No', 'doctype': 'DocField', - 'fieldname': '__brands', + 'fieldname': 'fs_brands', 'fieldtype': 'Check', 'label': 'Brands' }, @@ -114,7 +114,7 @@ 'colour': 'White:FFF', 'description': '1. To maintain the customer wise item code and to make them searchable based on their code use this option', 'doctype': 'DocField', - 'fieldname': '__item_advanced', + 'fieldname': 'fs_item_advanced', 'fieldtype': 'Check', 'label': 'Item Advanced' }, @@ -124,7 +124,7 @@ 'colour': 'White:FFF', 'description': 'If Sale BOM is defined, the actual BOM of the Pack is displayed as table.\nAvailable in Delivery Note and Sales Order', 'doctype': 'DocField', - 'fieldname': '__packing_details', + 'fieldname': 'fs_packing_details', 'fieldtype': 'Check', 'label': 'Packing Detials' }, @@ -134,7 +134,7 @@ 'colour': 'White:FFF', 'description': 'To get Item Group in details table', 'doctype': 'DocField', - 'fieldname': '__item_group_in_details', + 'fieldname': 'fs_item_group_in_details', 'fieldtype': 'Check', 'label': 'Item Groups in Details' }, @@ -151,7 +151,7 @@ 'colour': 'White:FFF', 'description': 'All export related fields like currency, conversion rate, export total, export grand total etc are available in
\nDelivery Note, POS, Quotation, Sales Invoice, Sales Order etc.', 'doctype': 'DocField', - 'fieldname': '__exports', + 'fieldname': 'fs_exports', 'fieldtype': 'Check', 'label': 'Exports' }, @@ -161,7 +161,7 @@ 'colour': 'White:FFF', 'description': 'All import related fields like currency, conversion rate, import total, import grand total etc are available in
\nPurchase Receipt, Supplier Quotation, Purchase Invoice, Purchase Order etc.', 'doctype': 'DocField', - 'fieldname': '__imports', + 'fieldname': 'fs_imports', 'fieldtype': 'Check', 'label': 'Imports' }, @@ -177,7 +177,7 @@ 'colour': 'White:FFF', 'description': 'Field available in Delivery Note, Quotation, Receivable Voucher, Sales Order', 'doctype': 'DocField', - 'fieldname': '__discounts', + 'fieldname': 'fs_discounts', 'fieldtype': 'Check', 'label': 'Discounts' }, @@ -187,7 +187,7 @@ 'colour': 'White:FFF', 'description': 'To track any installation or commissioning related work after sales', 'doctype': 'DocField', - 'fieldname': '__after_sales_installations', + 'fieldname': 'fs_after_sales_installations', 'fieldtype': 'Check', 'label': 'After Sale Installations' }, @@ -196,7 +196,7 @@ { 'description': 'Available in \nBill Of Materials, Delivery Note, Payable Voucher, Production Order, Purchase Order, Purchase Receipt, Receivable Voucher, Sales Order, Stock Entry, Timesheet', 'doctype': 'DocField', - 'fieldname': '__projects', + 'fieldname': 'fs_projects', 'fieldtype': 'Check', 'label': 'Projects' }, @@ -206,7 +206,7 @@ 'colour': 'White:FFF', 'description': 'If you have Sales Team and Sale Partners (Channel Partners) they can be tagged and maintain their contribution in the sales activity', 'doctype': 'DocField', - 'fieldname': '__sales_extras', + 'fieldname': 'fs_sales_extras', 'fieldtype': 'Check', 'label': 'Sales Extras' }, @@ -223,7 +223,7 @@ 'colour': 'White:FFF', 'description': 'If you involve in manufacturing activity
\nEnables item Is Manufactured', 'doctype': 'DocField', - 'fieldname': '__manufacturing', + 'fieldname': 'fs_manufacturing', 'fieldtype': 'Check', 'label': 'Manufacturing' }, @@ -239,7 +239,7 @@ 'colour': 'White:FFF', 'description': 'If you follow Quality Inspection
\nEnables item QA Required and QA No in Purchase Receipt', 'doctype': 'DocField', - 'fieldname': '__quality', + 'fieldname': 'fs_quality', 'fieldtype': 'Check', 'label': 'Quality' }, @@ -249,7 +249,7 @@ 'colour': 'White:FFF', 'description': 'To enable Point of Sale features', 'doctype': 'DocField', - 'fieldname': '__pos', + 'fieldname': 'fs_pos', 'fieldtype': 'Check', 'label': 'Point of Sale' }, @@ -266,7 +266,7 @@ 'colour': 'White:FFF', 'description': 'If you have long print formats, this feature can be used to split the page to be printed on multiple pages with all headers and footers on each page', 'doctype': 'DocField', - 'fieldname': '__page_break', + 'fieldname': 'fs_page_break', 'fieldtype': 'Check', 'label': 'Page Break' }, @@ -282,7 +282,7 @@ 'colour': 'White:FFF', 'description': 'Enables More Info. in all documents', 'doctype': 'DocField', - 'fieldname': '__more_info', + 'fieldname': 'fs_more_info', 'fieldtype': 'Check', 'label': 'More Info' } From e20311e9d4dc4f969de664fb3c9be5d8aff1c1d6 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 5 Oct 2011 11:31:11 +0530 Subject: [PATCH 23/62] Fieldname changed in Features Setup --- startup/startup.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/startup/startup.js b/startup/startup.js index 6199c772bc..a0661ae06f 100644 --- a/startup/startup.js +++ b/startup/startup.js @@ -552,7 +552,7 @@ Dictionary Format } // ====================================================================*/ pscript.feature_dict = { - '__projects': { + 'fs_projects': { 'Bill Of Materials': {'fields':['project_name']}, 'Delivery Note': {'fields':['project_name']}, 'Payable Voucher': {'fields':['project_name']}, @@ -564,17 +564,17 @@ pscript.feature_dict = { 'Stock Entry': {'fields':['project_name']}, 'Timesheet': {'timesheet_details':['project_name']} }, - '__packing_details': { + 'fs_packing_details': { 'Delivery Note': {'fields':['packing_details','print_packing_slip'],'delivery_note_details':['no_of_packs','pack_gross_wt','pack_nett_wt','pack_no','pack_unit']}, 'Sales Order': {'fields':['packing_details']} }, - '__discounts': { + 'fs_discounts': { 'Delivery Note': {'delivery_note_details':['adj_rate']}, 'Quotation': {'quotation_details':['adj_rate']}, 'Receivable Voucher': {'entries':['adj_rate']}, 'Sales Order': {'sales_order_details':['adj_rate','ref_rate']} }, - '__brands': { + 'fs_brands': { 'Delivery Note': {'delivery_note_details':['brand']}, 'Indent': {'indent_details':['brand']}, 'Item': {'fields':['brand']}, @@ -586,10 +586,10 @@ pscript.feature_dict = { 'Sales Order': {'sales_order_details':['brand']}, 'Serial No': {'fields':['brand']} }, - '__after_sales_installations': { + 'fs_after_sales_installations': { 'Delivery Note': {'fields':['installation_status','per_installed'],'delivery_note_details':['installed_qty']} }, - '__item_batch_nos': { + 'fs_item_batch_nos': { 'Delivery Note': {'delivery_note_details':['batch_no']}, 'Item': {'fields':['has_batch_no']}, 'Purchase Receipt': {'purchase_receipt_details':['batch_no']}, @@ -599,7 +599,7 @@ pscript.feature_dict = { 'Stock Entry': {'mtn_details':['batch_no']}, 'Stock Ledger Entry': {'fields':['batch_no']} }, - '__item_serial_nos': { + 'fs_item_serial_nos': { 'Customer Issue': {'fields':['serial_no']}, 'Delivery Note': {'delivery_note_details':['serial_no'],'packing_details':['serial_no']}, 'Installation Note': {'installed_item_details':['serial_no']}, @@ -613,7 +613,7 @@ pscript.feature_dict = { 'Stock Entry': {'mtn_details':['serial_no']}, 'Stock Ledger Entry': {'fields':['serial_no']} }, - '__item_group_in_details': { + 'fs_item_group_in_details': { 'Delivery Note': {'delivery_note_details':['item_group']}, 'Enquiry': {'enquiry_details':['item_group']}, 'Indent': {'indent_details':['item_group']}, @@ -631,7 +631,7 @@ pscript.feature_dict = { 'Sales Person': {'target_details':['item_group']}, 'Territory': {'target_details':['item_group']} }, - '__page_break': { + 'fs_page_break': { 'Delivery Note': {'delivery_note_details':['page_break'],'packing_details':['page_break']}, 'Indent': {'indent_details':['page_break']}, 'Purchase Order': {'po_details':['page_break']}, @@ -641,7 +641,7 @@ pscript.feature_dict = { 'Receivable Voucher': {'entries':['page_break']}, 'Sales Order': {'sales_order_details':['page_break']} }, - '__exports': { + 'fs_exports': { 'Delivery Note': {'fields':['Note','conversion_rate','currency','grand_total_export','in_words_export','rounded_total_export'],'delivery_note_details':['base_ref_rate','export_amount','export_rate']}, 'POS Setting': {'fields':['conversion_rate','currency']}, 'Quotation': {'fields':['Note HTML','OT Notes','conversion_rate','currency','grand_total_export','in_words_export','rounded_total_export'],'quotation_details':['base_ref_rate','export_amount','export_rate']}, @@ -650,16 +650,16 @@ pscript.feature_dict = { 'Sales BOM': {'fields':['currency']}, 'Sales Order': {'fields':['Note1','OT Notes','conversion_rate','currency','grand_total_export','in_words_export','rounded_total_export'],'sales_order_details':['base_ref_rate','export_amount','export_rate']} }, - '__imports': { + 'fs_imports': { 'Payable Voucher': {'fields':['conversion_rate','currency','grand_total_import','in_words_import','net_total_import','other_charges_added_import','other_charges_deducted_import'],'entries':['import_amount','import_rate']}, 'Purchase Order': {'fields':['Note HTML','conversion_rate','currency','grand_total_import','in_words_import','net_total_import','other_charges_added_import','other_charges_deducted_import'],'po_details':['import_amount','import_rate']}, 'Purchase Receipt': {'fields':['conversion_rate','currency','grand_total_import','in_words_import','net_total_import','other_charges_added_import','other_charges_deducted_import'],'purchase_receipt_details':['import_amount','import_rate']}, 'Supplier Quotation': {'fields':['conversion_rate','currency']} }, - '__item_advanced': { + 'fs_item_advanced': { 'Item': {'fields':['item_customer_details']} }, - '__sales_extras': { + 'fs_sales_extras': { 'Address': {'fields':['sales_partner']}, 'Contact': {'fields':['sales_partner']}, 'Customer': {'fields':['sales_team']}, @@ -668,7 +668,7 @@ pscript.feature_dict = { 'Receivable Voucher': {'fields':['sales_team']}, 'Sales Order': {'fields':['sales_team','Packing List']} }, - '__more_info': { + 'fs_more_info': { 'Customer': {'fields':['More Info']}, 'Delivery Note': {'fields':['More Info']}, 'Enquiry': {'fields':['More Info']}, @@ -683,14 +683,14 @@ pscript.feature_dict = { 'Serial No': {'fields':['More Info']}, 'Supplier': {'fields':['More Info']} }, - '__quality': { + 'fs_quality': { 'Item': {'fields':['Item Inspection Criteria','inspection_required']}, 'Purchase Receipt': {'purchase_receipt_details':['qa_no']} }, - '__manufacturing': { + 'fs_manufacturing': { 'Item': {'fields':['Manufacturing']} }, - '__pos': { + 'fs_pos': { 'Receivable Voucher': {'fields':['is_pos']} } } From 7cb981c3fbb35b70a40035e11c86af9822ed9ba8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 5 Oct 2011 11:47:38 +0530 Subject: [PATCH 24/62] Fieldname changed in Features Setup --- patches/patch.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/patches/patch.py b/patches/patch.py index 6618b7aefe..cb1f056602 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 372 +last_patch = 373 #------------------------------------------- @@ -395,6 +395,9 @@ def execute(patch_no): get_obj('Features Setup', 'Features Setup').doc.save() elif patch_no == 373: + sql("delete from `tabDocField` where fieldname = 'item_searial_nos' and parent = 'Features Setup'") + sql("delete from `tabDefaultValue` where defkey = 'item_searial_nos' and parent = 'Control Panel'") + elif patch_no == 374: comp = sql("select name from tabCompany where docstatus!=2") fy = sql("select name from `tabFiscal Year` order by year_start_date asc") for c in comp: From 1c48c598986e776829429c0c1d32b82fd7ce1c85 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 5 Oct 2011 12:10:44 +0530 Subject: [PATCH 25/62] features by default on --- patches/patch.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/patches/patch.py b/patches/patch.py index cb1f056602..a202f81ad9 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 373 +last_patch = 374 #------------------------------------------- @@ -397,7 +397,15 @@ def execute(patch_no): elif patch_no == 373: sql("delete from `tabDocField` where fieldname = 'item_searial_nos' and parent = 'Features Setup'") sql("delete from `tabDefaultValue` where defkey = 'item_searial_nos' and parent = 'Control Panel'") - elif patch_no == 374: + elif patch_no == 374: + rs = sql("select fieldname from tabDocField where parent='Features Setup' and fieldname is not null") + from webnotes.model.code import get_obj + m = get_obj('Features Setup') + for d in rs: + m.doc.fields[d[0]] = 1 + m.doc.save() + m.validate() + elif patch_no == 375: comp = sql("select name from tabCompany where docstatus!=2") fy = sql("select name from `tabFiscal Year` order by year_start_date asc") for c in comp: From f092b8c21e54eddb6fdd8bbc59e7e4dc9a44b04c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 5 Oct 2011 15:00:34 +0530 Subject: [PATCH 26/62] purchase tax mapping while pulling --- accounts/doctype/payable_voucher/payable_voucher.js | 7 +++---- accounts/doctype/payable_voucher/payable_voucher.py | 12 +++--------- stock/doctype/purchase_receipt/purchase_receipt.js | 8 +++++--- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/accounts/doctype/payable_voucher/payable_voucher.js b/accounts/doctype/payable_voucher/payable_voucher.js index e3b986d8a1..06c2947dd2 100644 --- a/accounts/doctype/payable_voucher/payable_voucher.js +++ b/accounts/doctype/payable_voucher/payable_voucher.js @@ -169,13 +169,12 @@ cur_frm.cscript['Recalculate'] = function(doc, dt, dn) { // ----------------- cur_frm.cscript['Get Items'] = function(doc, dt, dn) { var callback = function(r,rt) { - unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']); - refresh_many(['credit_to','supplier','supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email','entries','purchase_receipt_main','purchase_order_main']); + unhide_field(['supplier_address', 'contact_person', 'supplier_name', 'address_display', 'contact_display', 'contact_mobile','contact_email']); + refresh_many(['credit_to','supplier','supplier_address','contact_person','supplier_name', 'address_display', 'contact_display','contact_mobile', 'contact_email','entries', 'purchase_receipt_main', 'purchase_order_main', 'purchase_tax_details']); } - get_server_fields('pull_details','','',doc, dt, dn,1,callback); + $c_obj(make_doclist(dt,dn),'pull_details','',callback); } - // ========== PV Details Table ============ // Item Code diff --git a/accounts/doctype/payable_voucher/payable_voucher.py b/accounts/doctype/payable_voucher/payable_voucher.py index b403d20c02..7bc0eb6301 100644 --- a/accounts/doctype/payable_voucher/payable_voucher.py +++ b/accounts/doctype/payable_voucher/payable_voucher.py @@ -72,25 +72,19 @@ class DocType(TransactionBase): ret['cost_center'] = cost_center and cost_center[0][0] or '' return ret - + # Get Items based on PO or PR # ---------------------------- def pull_details(self): if self.doc.purchase_receipt_main: self.validate_duplicate_docname('purchase_receipt') - self.doclist = get_obj('DocType Mapper', 'Purchase Receipt-Payable Voucher').dt_map('Purchase Receipt', 'Payable Voucher', self.doc.purchase_receipt_main, self.doc, self.doclist, "[['Purchase Receipt', 'Payable Voucher'],['Purchase Receipt Detail', 'PV Detail']]") + self.doclist = get_obj('DocType Mapper', 'Purchase Receipt-Payable Voucher').dt_map('Purchase Receipt', 'Payable Voucher', self.doc.purchase_receipt_main, self.doc, self.doclist, "[['Purchase Receipt', 'Payable Voucher'], ['Purchase Receipt Detail', 'PV Detail'], ['Purchase Tax Detail','Purchase Tax Detail']]") elif self.doc.purchase_order_main: self.validate_duplicate_docname('purchase_order') - self.doclist = get_obj('DocType Mapper', 'Purchase Order-Payable Voucher').dt_map('Purchase Order', 'Payable Voucher', self.doc.purchase_order_main, self.doc, self.doclist, "[['Purchase Order', 'Payable Voucher'],['PO Detail', 'PV Detail']]") + self.doclist = get_obj('DocType Mapper', 'Purchase Order-Payable Voucher').dt_map('Purchase Order', 'Payable Voucher', self.doc.purchase_order_main, self.doc, self.doclist, "[['Purchase Order', 'Payable Voucher'],['PO Detail', 'PV Detail'], ['Purchase Tax Detail','Purchase Tax Detail']]") ret = self.get_credit_to() - #self.doc.supplier_name = ret['supplier_name'] - #self.doc.supplier_address = ret['supplier_address'] - - #self.doc.cst_no =ret['cst_no'] - #self.doc.bst_no = ret['bst_no'] - #self.doc.vat_tin_no = ret['vat_tin_no'] if ret.has_key('credit_to'): self.doc.credit_to = ret['credit_to'] diff --git a/stock/doctype/purchase_receipt/purchase_receipt.js b/stock/doctype/purchase_receipt/purchase_receipt.js index e060e3c564..1e3d4406ac 100644 --- a/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/stock/doctype/purchase_receipt/purchase_receipt.js @@ -78,17 +78,19 @@ cur_frm.fields_dict.contact_person.on_new = function(dn) { locals['Contact'][dn].supplier_name = locals[cur_frm.doctype][cur_frm.docname].supplier_name; } + // Get Purchase Order Button // ----------------- cur_frm.cscript['Pull Purchase Order Details'] = function(doc, dt, dn) { var callback = function(r,rt) { - unhide_field(['supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email']); - refresh_many(['supplier','supplier_address','contact_person','supplier_name','address_display','contact_display','contact_mobile','contact_email','purchase_receipt_details']); + unhide_field(['supplier_address','contact_person','supplier_name','address_display', 'contact_display', 'contact_mobile','contact_email']); + refresh_many(['supplier','supplier_address','contact_person', 'supplier_name', 'address_display', 'contact_display','contact_mobile', 'contact_email', 'purchase_receipt_details', 'purchase_tax_details']); } - get_server_fields('get_po_details','','',doc, dt, dn,1,callback); + $c_obj(make_doclist(dt,dn),'get_po_details','',callback); } + //================ create new contact ============================================================================ cur_frm.cscript.new_contact = function(){ tn = createLocal('Contact'); From 0801ef24b07b3a5349c249e8b7e6a7e4065664a7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 7 Oct 2011 12:25:34 +0530 Subject: [PATCH 27/62] map schedule date from po to pr --- patches/patch.py | 3 +++ .../Purchase Order-Purchase Receipt.txt | 12 ++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/patches/patch.py b/patches/patch.py index a202f81ad9..db5317a601 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -406,6 +406,9 @@ def execute(patch_no): m.doc.save() m.validate() elif patch_no == 375: + from webnotes.session_cache import clear_cache + clear_cache(webnotes.session['user']) + elif patch_no == 376: comp = sql("select name from tabCompany where docstatus!=2") fy = sql("select name from `tabFiscal Year` order by year_start_date asc") for c in comp: diff --git a/stock/DocType Mapper/Purchase Order-Purchase Receipt/Purchase Order-Purchase Receipt.txt b/stock/DocType Mapper/Purchase Order-Purchase Receipt/Purchase Order-Purchase Receipt.txt index f561c157d9..42eff14c5f 100644 --- a/stock/DocType Mapper/Purchase Order-Purchase Receipt/Purchase Order-Purchase Receipt.txt +++ b/stock/DocType Mapper/Purchase Order-Purchase Receipt/Purchase Order-Purchase Receipt.txt @@ -5,7 +5,7 @@ { 'creation': '2010-08-08 17:09:35', 'docstatus': 0, - 'modified': '2011-09-13 17:26:55', + 'modified': '2011-10-07 12:10:26', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -145,6 +145,14 @@ 'to_field': 'amount' }, + # Field Mapper Detail + { + 'doctype': 'Field Mapper Detail', + 'from_field': 'schedule_date', + 'match_id': 1, + 'to_field': 'schedule_date' + }, + # Table Mapper Detail { 'doctype': 'Table Mapper Detail', @@ -178,4 +186,4 @@ 'to_table': 'Purchase Tax Detail', 'validation_logic': 'docstatus = 1' } -] \ No newline at end of file +] From e2904d6afee99b8db9b34559f5f7276249cffd9e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 7 Oct 2011 12:26:41 +0530 Subject: [PATCH 28/62] clear cache forcefully --- patches/patch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/patch.py b/patches/patch.py index db5317a601..cf3bf6dcb4 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 374 +last_patch = 375 #------------------------------------------- From 95409cad784ef23e639dd18bd4bd75c41b4d5bde Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 7 Oct 2011 12:36:43 +0530 Subject: [PATCH 29/62] reload PO-PR mapper --- patches/patch.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/patches/patch.py b/patches/patch.py index cf3bf6dcb4..f1aff7c162 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 375 +last_patch = 376 #------------------------------------------- @@ -408,7 +408,9 @@ def execute(patch_no): elif patch_no == 375: from webnotes.session_cache import clear_cache clear_cache(webnotes.session['user']) - elif patch_no == 376: + elif patch_no == 376: + reload_doc('stock', 'DocType Mapper', 'Purchase Order-Purchase Receipt') + elif patch_no == 377: comp = sql("select name from tabCompany where docstatus!=2") fy = sql("select name from `tabFiscal Year` order by year_start_date asc") for c in comp: From 7b23dbf8470a5ac9587f46e9384fb883b79d9d0d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 7 Oct 2011 19:00:54 +0530 Subject: [PATCH 30/62] patch for page break issue --- patches/patch.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/patches/patch.py b/patches/patch.py index f1aff7c162..b66b4f0471 100644 --- a/patches/patch.py +++ b/patches/patch.py @@ -1,7 +1,7 @@ # REMEMBER to update this # ======================== -last_patch = 376 +last_patch = 377 #------------------------------------------- @@ -410,7 +410,16 @@ def execute(patch_no): clear_cache(webnotes.session['user']) elif patch_no == 376: reload_doc('stock', 'DocType Mapper', 'Purchase Order-Purchase Receipt') - elif patch_no == 377: + elif patch_no == 377: + flds = ['page_break', 'projects', 'packing_details', 'discounts', 'brands', 'item_batch_nos', 'after_sales_installations', 'item_searial_nos', 'item_group_in_details', 'exports', 'imports', 'item_advanced', 'sales_extras', 'more_info', 'quality', 'manufacturing', 'pos', 'item_serial_nos'] + + st = "'"+"', '".join(flds)+"'" + sql("delete from `tabDocField` where fieldname in (%s) and parent = 'Features Setup'" % st) + sql("delete from `tabDefaultValue` where defkey in (%s) and parent = 'Control Panel'" % st) + + from webnotes.session_cache import clear_cache + clear_cache(webnotes.session['user']) + elif patch_no == 378: comp = sql("select name from tabCompany where docstatus!=2") fy = sql("select name from `tabFiscal Year` order by year_start_date asc") for c in comp: From d56d57d20551537910e482e518ba38e063570dfd Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 2 Jan 2012 16:25:05 +0530 Subject: [PATCH 31/62] Patch system changes, Inclusive Price feature and session cache clear on disabling user or on new login --- .../doctype/rv_tax_detail/rv_tax_detail.txt | 37 +-- erpnext/home/page/my_company/my_company.py | 5 + erpnext/patches/patch_list.py | 11 + .../doctype/sales_common/sales_common.js | 241 +++++++++++++++--- .../doctype/other_charges/other_charges.js | 2 +- erpnext/startup/event_handlers.py | 10 +- 6 files changed, 248 insertions(+), 58 deletions(-) create mode 100644 erpnext/patches/patch_list.py diff --git a/erpnext/accounts/doctype/rv_tax_detail/rv_tax_detail.txt b/erpnext/accounts/doctype/rv_tax_detail/rv_tax_detail.txt index a9326a0286..784c3b7591 100644 --- a/erpnext/accounts/doctype/rv_tax_detail/rv_tax_detail.txt +++ b/erpnext/accounts/doctype/rv_tax_detail/rv_tax_detail.txt @@ -5,8 +5,8 @@ { 'creation': '2010-08-08 17:09:20', 'docstatus': 0, - 'modified': '2010-09-20 14:06:57', - 'modified_by': 'nabin@webnotestech.com', + 'modified': '2011-12-28 17:33:30', + 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,6 +14,7 @@ { 'autoname': 'INVTD.######', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'hide_heading': 1, 'istable': 1, @@ -22,7 +23,7 @@ 'section_style': 'Tray', 'server_code_error': ' ', 'show_in_menu': 0, - 'version': 15 + 'version': 18 }, # These values are common for all DocField @@ -45,7 +46,6 @@ 'doctype': 'DocField', 'fieldname': 'charge_type', 'fieldtype': 'Select', - 'idx': 1, 'label': 'Type', 'oldfieldname': 'charge_type', 'oldfieldtype': 'Select', @@ -60,7 +60,6 @@ 'doctype': 'DocField', 'fieldname': 'account_head', 'fieldtype': 'Link', - 'idx': 2, 'label': 'Account Head', 'oldfieldname': 'account_head', 'oldfieldtype': 'Link', @@ -75,13 +74,11 @@ 'doctype': 'DocField', 'fieldname': 'cost_center_other_charges', 'fieldtype': 'Link', - 'idx': 3, 'label': 'Cost Center', 'oldfieldname': 'cost_center_other_charges', 'oldfieldtype': 'Link', 'options': 'Cost Center', - 'permlevel': 0, - 'search_index': 0 + 'permlevel': 0 }, # DocField @@ -89,7 +86,6 @@ 'doctype': 'DocField', 'fieldname': 'description', 'fieldtype': 'Small Text', - 'idx': 4, 'label': 'Description', 'oldfieldname': 'description', 'oldfieldtype': 'Small Text', @@ -103,7 +99,6 @@ 'doctype': 'DocField', 'fieldname': 'rate', 'fieldtype': 'Currency', - 'idx': 5, 'label': 'Rate', 'oldfieldname': 'rate', 'oldfieldtype': 'Currency', @@ -117,7 +112,6 @@ 'doctype': 'DocField', 'fieldname': 'tax_amount', 'fieldtype': 'Currency', - 'idx': 6, 'label': 'Amount*', 'oldfieldname': 'tax_amount', 'oldfieldtype': 'Currency', @@ -131,7 +125,6 @@ 'doctype': 'DocField', 'fieldname': 'total', 'fieldtype': 'Currency', - 'idx': 7, 'label': 'Total*', 'oldfieldname': 'total', 'oldfieldtype': 'Currency', @@ -144,7 +137,6 @@ 'fieldname': 'row_id', 'fieldtype': 'Data', 'hidden': 0, - 'idx': 8, 'label': 'Enter Row', 'oldfieldname': 'row_id', 'oldfieldtype': 'Data', @@ -157,7 +149,6 @@ 'doctype': 'DocField', 'fieldname': 'item_wise_tax_detail', 'fieldtype': 'Small Text', - 'idx': 9, 'label': 'Item Wise Tax Detail ', 'oldfieldname': 'item_wise_tax_detail', 'oldfieldtype': 'Small Text', @@ -170,7 +161,6 @@ 'fieldname': 'parenttype', 'fieldtype': 'Data', 'hidden': 1, - 'idx': 10, 'in_filter': 1, 'label': 'Parenttype', 'oldfieldname': 'parenttype', @@ -188,7 +178,6 @@ 'fieldname': 'total_tax_amount', 'fieldtype': 'Currency', 'hidden': 1, - 'idx': 11, 'label': 'Total Tax Amount', 'no_copy': 1, 'oldfieldname': 'total_tax_amount', @@ -205,7 +194,6 @@ 'fieldname': 'total_amount', 'fieldtype': 'Currency', 'hidden': 1, - 'idx': 12, 'label': 'Total Amount', 'no_copy': 1, 'oldfieldname': 'total_amount', @@ -213,5 +201,20 @@ 'permlevel': 0, 'print_hide': 1, 'report_hide': 1 + }, + + # DocField + { + 'allow_on_submit': 0, + 'description': 'If checked, the tax amount will be considered as already included in the Print Rate / Print Amount', + 'doctype': 'DocField', + 'fieldname': 'included_in_print_rate', + 'fieldtype': 'Check', + 'label': 'Included in Print Rate', + 'no_column': 0, + 'no_copy': 1, + 'permlevel': 0, + 'print_hide': 1, + 'report_hide': 1 } ] \ No newline at end of file diff --git a/erpnext/home/page/my_company/my_company.py b/erpnext/home/page/my_company/my_company.py index ad0089dc14..4931ea9a6f 100644 --- a/erpnext/home/page/my_company/my_company.py +++ b/erpnext/home/page/my_company/my_company.py @@ -34,6 +34,11 @@ def disable_profile(arg=''): return 'Cannot disable Administrator' webnotes.conn.sql("update tabProfile set enabled=0 where name=%s", arg) + sid_list = webnotes.conn.sql("SELECT sid FROM `tabSessions` WHERE user=%s", arg) + from webnotes.auth import LoginManager + login_manager = LoginManager() + for sid in sid_list: + login_manager.logout(sid=sid) return 0 # diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py new file mode 100644 index 0000000000..80f1cc1df0 --- /dev/null +++ b/erpnext/patches/patch_list.py @@ -0,0 +1,11 @@ +patch_list = [ + { + 'patch_file': 'reload_print_format', + 'description': 'Reload doctype print format' + }, + { + 'patch_module': 'patches', + 'patch_file': 'reload_project_task', + 'description': 'Reload doctype task of project module' + } +] diff --git a/erpnext/selling/doctype/sales_common/sales_common.js b/erpnext/selling/doctype/sales_common/sales_common.js index 23e04202f2..0cc886872b 100644 --- a/erpnext/selling/doctype/sales_common/sales_common.js +++ b/erpnext/selling/doctype/sales_common/sales_common.js @@ -130,26 +130,47 @@ cur_frm.cscript.adj_rate = function(doc, cdt, cdn) { cur_frm.cscript.recalc(doc, // ************************ REF RATE **************************** cur_frm.cscript.ref_rate = function(doc, cdt, cdn){ - var d = locals[cdt][cdn]; - set_multiple(cur_frm.cscript.tname, d.name, {'export_rate': flt(d.ref_rate) * (100 - flt(d.adj_rate)) / 100}, cur_frm.cscript.fname); - cur_frm.cscript.recalc(doc, 3); + var d = locals[cdt][cdn]; + var consider_incl_rate = cur_frm.cscript.consider_incl_rate(doc, cur_frm.cscript.other_fname); + if(!consider_incl_rate) { + set_multiple(cur_frm.cscript.tname, d.name, {'export_rate': flt(d.ref_rate) * (100 - flt(d.adj_rate)) / 100}, cur_frm.cscript.fname); + } + cur_frm.cscript.recalc(doc, 1); } // *********************** BASIC RATE ************************** cur_frm.cscript.basic_rate = function(doc, cdt, cdn) { - var fname = cur_frm.cscript.fname; - var d = locals[cdt][cdn];; - if(!d.qty) - { - d.qty = 1; - refresh_field('qty', d.name, fname); - - } - cur_frm.cscript.recalc(doc, 2); + var fname = cur_frm.cscript.fname; + var d = locals[cdt][cdn]; + if(!d.qty) { + d.qty = 1; + refresh_field('qty', d.name, fname); + } + var consider_incl_rate = cur_frm.cscript.consider_incl_rate(doc, cur_frm.cscript.other_fname); + if(!consider_incl_rate) { + cur_frm.cscript.recalc(doc, 2); + } else { + var basic_rate = cur_frm.cscript.back_calc_basic_rate( + doc, cur_frm.cscript.tname, fname, d, cur_frm.cscript.other_fname + ); + if (d.basic_rate != basic_rate.toFixed(2)) { + d.basic_rate = basic_rate; + refresh_field('basic_rate', d.name, fname); + msgprint("You cannot change Basic Rate* (Base Currency) when \ + considering rates inclusive of taxes.
\ + Please either
\ + * Specify Basic Rate (i.e. Rate which will be displayed in print)
\ + -- or --
\ + * Uncheck 'Included in Print Rate' in the tax entries of Taxes section."); + } + } } // ************************ EXPORT RATE ************************* -cur_frm.cscript.export_rate = function(doc,cdt,cdn) { cur_frm.cscript.recalc(doc, 3);} +cur_frm.cscript.export_rate = function(doc,cdt,cdn) { + doc = locals[doc.doctype][doc.name]; + cur_frm.cscript.recalc(doc, 1); +} @@ -177,7 +198,7 @@ cur_frm.cscript.recalc = function(doc, n) { if(!flt(doc.conversion_rate)) { doc.conversion_rate = 1; refresh_field('conversion_rate'); } if(!flt(doc.plc_conversion_rate)) { doc.plc_conversion_rate = 1; refresh_field('plc_conversion_rate'); } - if(n > 0) cur_frm.cscript.update_fname_table(doc , tname , fname , n); // updates all values in table (i.e. amount, export amount, net total etc.) + if(n > 0) cur_frm.cscript.update_fname_table(doc , tname , fname , n, other_fname); // updates all values in table (i.e. amount, export amount, net total etc.) if(flt(doc.net_total) > 0) { var cl = getchildren('RV Tax Detail', doc.name, other_fname,doc.doctype); @@ -218,11 +239,18 @@ cur_frm.cscript.calc_doc_values = function(doc, cdt, cdn, tname, fname, other_fn for(var i = 0; i net_total ? flt(net_total_incl) : flt(net_total); doc.other_charges_total = flt(other_charges_total); doc.grand_total = flt(flt(net_total) + flt(other_charges_total)); doc.rounded_total = Math.round(doc.grand_total); @@ -278,9 +306,12 @@ cur_frm.cscript.calc_other_charges = function(doc , tname , fname , other_fname) // this is calculation part for all types if(tax[t].charge_type != "Actual") tax[t].item_wise_tax_detail += item_wise_tax_detail; - tax[t].total_amount = flt(tax_amount.toFixed(2)); //stores actual tax amount in virtual field - tax[t].total_tax_amount = flt(prev_total.toFixed(2)); //stores total amount in virtual field - tax[t].tax_amount += flt(tax_amount.toFixed(2)); + //tax[t].total_amount = flt(tax_amount.toFixed(2)); //stores actual tax amount in virtual field + //tax[t].total_tax_amount = flt(prev_total.toFixed(2)); //stores total amount in virtual field + //tax[t].tax_amount += flt(tax_amount.toFixed(2)); + tax[t].total_amount = flt(tax_amount); //stores actual tax amount in virtual field + tax[t].total_tax_amount = flt(prev_total); //stores total amount in virtual field + tax[t].tax_amount += flt(tax_amount); var total_amount = flt(tax[t].tax_amount); total_tax_amount = flt(tax[t].total_tax_amount) + flt(total_amount); set_multiple('RV Tax Detail', tax[t].name, { 'item_wise_tax_detail':tax[t].item_wise_tax_detail, 'amount':total_amount, 'total':flt(total)+flt(tax[t].tax_amount)/*_tax_amount)*/}, other_fname); @@ -311,7 +342,8 @@ cur_frm.cscript.check_charge_type_and_get_tax_amount = function( doc, tax, t, cl refresh_field('total_excise_rate'); return } - return tax_amount = (flt(rate) * flt(cl.amount) / 100); + + return tax_amount = (flt(rate) * flt(cl.amount) / 100); } else if(tax[t].charge_type == 'On Previous Row Amount'){ if(flt(print_amt) == 1) { @@ -347,28 +379,150 @@ cur_frm.cscript.check_charge_type_and_get_tax_amount = function( doc, tax, t, cl } } +// ********************** Functions for inclusive value calc ****************************** +cur_frm.cscript.consider_incl_rate = function(doc, other_fname) { + var tax_list = getchildren('RV Tax Detail', doc.name, other_fname, doc.doctype); + for(var i=0; i \ + * On Net Total
\ + * On Previous Row Amount
\ + * On Previous Row Total"); + tax.included_in_print_rate = 0; + refresh_field('included_in_print_rate', tax.name, cur_frm.cscript.other_fname); + } else if(inList(['On Previous Row Total', 'On Previous Row Amount'], tax.charge_type)){ + if(tax.row_id) { + var tax_list = getchildren('RV Tax Detail', doc.name, cur_frm.cscript.other_fname, doc.doctype); + if(tax_list[tax.row_id-1].charge_type=='Actual') { + msgprint("Row of type 'Actual' cannot be depended on for type '" + tax.charge_type + "'\ + when using tax inclusive prices.
\ + This will lead to incorrect values.

\ + Please specify correct value in 'Enter Row' column of Row: " + + tax.idx + " in Taxes table"); + validated = false; + tax.included_in_print_rate = 0; + refresh_field('included_in_print_rate', tax.name, cur_frm.cscript.other_fname); + } + } + } + } +} + // ********************** Update values in table ****************************** -cur_frm.cscript.update_fname_table = function(doc , tname , fname , n) { +cur_frm.cscript.update_fname_table = function(doc , tname , fname , n, other_fname) { doc = locals[doc.doctype][doc.name] var net_total = 0 var cl = getchildren(tname, doc.name, fname); + var consider_incl_rate = cur_frm.cscript.consider_incl_rate(doc, other_fname); for(var i=0;i 0) - set_multiple(tname, cl[i].name, {'export_rate': flt(flt(cl[i].ref_rate) * (100 - flt(cl[i].adj_rate)) / 100)}, fname); - set_multiple(tname, cl[i].name, {'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)), 'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate)), 'amount': flt((flt(cl[i].export_rate) * flt(doc.conversion_rate)) * flt(cl[i].qty)) }, fname); + if(!consider_incl_rate && (flt(cl[i].ref_rate) > 0)) { + set_multiple(tname, cl[i].name, { + 'export_rate': flt(flt(cl[i].ref_rate) * (100 - flt(cl[i].adj_rate)) / 100) + }, fname); + + set_multiple(tname, cl[i].name, { + 'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)), + 'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate)), + 'amount': flt((flt(cl[i].export_rate) * flt(doc.conversion_rate)) * flt(cl[i].qty)) + }, fname); + + var base_ref_rate = flt(cl[i].basic_rate) + flt(flt(cl[i].basic_rate) * flt(cl[i].adj_rate) / 100); + set_multiple(tname, cl[i].name, { + 'base_ref_rate': flt(base_ref_rate) + }, fname); + + } else if(consider_incl_rate) { + if(flt(cl[i].export_rate) > 0) { + // calculate basic rate based on taxes + // then calculate and set basic_rate, base_ref_rate, ref_rate, amount, export_amount + var ref_rate = flt(cl[i].adj_rate)!=flt(100) ? + flt((100 * flt(cl[i].export_rate))/flt(100 - flt(cl[i].adj_rate))) : + flt(0) + set_multiple(tname, cl[i].name, { 'ref_rate': ref_rate }, fname); + } else if((flt(cl[i].ref_rate) > 0) && (flt(cl[i].adj_rate) > 0)) { + var export_rate = flt(cl[i].ref_rate) * flt(1 - flt(cl[i].adj_rate / 100)); + set_multiple(tname, cl[i].name, { 'export_rate': flt(export_rate) }, fname); + } + console.log("export_rate: " + cl[i].export_rate); + + var basic_rate = cur_frm.cscript.back_calc_basic_rate(doc, tname, fname, cl[i], other_fname); + var base_ref_rate = basic_rate + flt(basic_rate * flt(cl[i].adj_rate) / 100); + set_multiple(tname, cl[i].name, { + 'basic_rate': flt(basic_rate), + 'amount': flt(basic_rate * flt(cl[i].qty)), + 'export_amount': flt(flt(cl[i].qty) * flt(cl[i].export_rate)), + 'base_ref_rate': flt(base_ref_rate) + }, fname); + } } else if(n == 2){ if(flt(cl[i].ref_rate) > 0) set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].basic_rate) * 100 / (flt(cl[i].ref_rate) * flt(doc.conversion_rate)))}, fname); set_multiple(tname, cl[i].name, {'amount': flt(flt(cl[i].qty) * flt(cl[i].basic_rate)), 'export_rate': flt(flt(cl[i].basic_rate) / flt(doc.conversion_rate)), 'export_amount': flt((flt(cl[i].basic_rate) / flt(doc.conversion_rate)) * flt(cl[i].qty)) }, fname); } - else if(n == 3){ + /*else if(n == 3){ set_multiple(tname, cl[i].name, {'basic_rate': flt(flt(cl[i].export_rate) * flt(doc.conversion_rate))}, fname); set_multiple(tname, cl[i].name, {'amount' : flt(flt(cl[i].basic_rate) * flt(cl[i].qty)), 'export_amount': flt(flt(cl[i].export_rate) * flt(cl[i].qty))}, fname); if(cl[i].ref_rate > 0) set_multiple(tname, cl[i].name, {'adj_rate': 100 - flt(flt(cl[i].export_rate) * 100 / flt(cl[i].ref_rate)), 'base_ref_rate': flt(flt(cl[i].ref_rate) * flt(doc.conversion_rate)) }, fname); - } + }*/ net_total += flt(flt(cl[i].qty) * flt(cl[i].basic_rate)); } doc.net_total = net_total; @@ -389,20 +543,31 @@ cur_frm.cscript['Re-Calculate Values'] = function(doc, cdt, cdn) { } cur_frm.cscript['Calculate Charges'] = function(doc, cdt, cdn) { - var other_fname = cur_frm.cscript.other_fname; + var other_fname = cur_frm.cscript.other_fname; - var cl = getchildren('RV Tax Detail', doc.name, other_fname, doc.doctype); - for(var i = 0; i\ + This will lead to incorrect values.

\ + Please specify correct value in 'Enter Row' column of Row: " + + cl[i].idx + " in Taxes table"); + validated = false; + cl[i].included_in_print_rate = 0; + refresh_field('included_in_print_rate', cl[i].name, other_fname); + } + } + } + cur_frm.cscript.recalc(doc, 1); } // Get Sales Partner Commission diff --git a/erpnext/setup/doctype/other_charges/other_charges.js b/erpnext/setup/doctype/other_charges/other_charges.js index 4c154f529e..ddc9755254 100644 --- a/erpnext/setup/doctype/other_charges/other_charges.js +++ b/erpnext/setup/doctype/other_charges/other_charges.js @@ -36,7 +36,7 @@ cur_frm.pformat.other_charges= function(doc){ // add rows if(cl.length){ for(var i=0;i Date: Tue, 3 Jan 2012 11:26:00 +0530 Subject: [PATCH 32/62] Allow demo user to have multiple sessions --- erpnext/startup/event_handlers.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py index 59f31d387c..ce5c4c4cfa 100644 --- a/erpnext/startup/event_handlers.py +++ b/erpnext/startup/event_handlers.py @@ -44,12 +44,16 @@ def on_login_post_session(login_manager): if webnotes.form_dict.get('login_from'): webnotes.session['data']['login_from'] = webnotes.form.getvalue('login_from') webnotes.session_obj.update() + + exception_list = ['demo@webnotestech.com'] - sid_list = webnotes.conn.sql("SELECT sid FROM `tabSessions` WHERE user=%s AND sid!=%s", (webnotes.session['user'], webnotes.session['sid'])) - from webnotes.auth import LoginManager - login_manager = LoginManager() - for sid in sid_list: - login_manager.logout(sid=sid) + if webnotes.session['user'] not in exception_list: + # Clear previous sessions i.e. logout previous log-in attempts + sid_list = webnotes.conn.sql("SELECT sid FROM `tabSessions` WHERE user=%s AND sid!=%s", (webnotes.session['user'], webnotes.session['sid'])) + from webnotes.auth import LoginManager + login_manager = LoginManager() + for sid in sid_list: + login_manager.logout(sid=sid) update_account_details() From d34ff7652619f59bd0b7b76f5c7f494a2fdf0e43 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 3 Jan 2012 16:00:03 +0530 Subject: [PATCH 33/62] Fixed logout issues --- erpnext/home/page/my_company/my_company.py | 5 +---- erpnext/startup/event_handlers.py | 6 +----- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/erpnext/home/page/my_company/my_company.py b/erpnext/home/page/my_company/my_company.py index 4931ea9a6f..dfeb30feba 100644 --- a/erpnext/home/page/my_company/my_company.py +++ b/erpnext/home/page/my_company/my_company.py @@ -34,11 +34,8 @@ def disable_profile(arg=''): return 'Cannot disable Administrator' webnotes.conn.sql("update tabProfile set enabled=0 where name=%s", arg) - sid_list = webnotes.conn.sql("SELECT sid FROM `tabSessions` WHERE user=%s", arg) - from webnotes.auth import LoginManager login_manager = LoginManager() - for sid in sid_list: - login_manager.logout(sid=sid) + login_manager.logout(user=arg) return 0 # diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py index ce5c4c4cfa..7dd6c9a769 100644 --- a/erpnext/startup/event_handlers.py +++ b/erpnext/startup/event_handlers.py @@ -50,10 +50,6 @@ def on_login_post_session(login_manager): if webnotes.session['user'] not in exception_list: # Clear previous sessions i.e. logout previous log-in attempts sid_list = webnotes.conn.sql("SELECT sid FROM `tabSessions` WHERE user=%s AND sid!=%s", (webnotes.session['user'], webnotes.session['sid'])) - from webnotes.auth import LoginManager - login_manager = LoginManager() - for sid in sid_list: - login_manager.logout(sid=sid) update_account_details() @@ -63,7 +59,7 @@ def on_login_post_session(login_manager): def on_logout(login_manager): if cint(webnotes.conn.get_value('Control Panel', None, 'sync_with_gateway')): from server_tools.gateway_utils import logout_sso - logout_sso(login_manager.sid) + logout_sso(user=login_manager.user) # # create a profile (if logs in for the first time) From b63a007c91c684b51052aba67f7caab28a33bbb9 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 3 Jan 2012 16:11:04 +0530 Subject: [PATCH 34/62] Fixed logout issue --- erpnext/startup/event_handlers.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py index 7dd6c9a769..71ae767626 100644 --- a/erpnext/startup/event_handlers.py +++ b/erpnext/startup/event_handlers.py @@ -45,11 +45,21 @@ def on_login_post_session(login_manager): webnotes.session['data']['login_from'] = webnotes.form.getvalue('login_from') webnotes.session_obj.update() + # Clear previous sessions i.e. logout previous log-in attempts exception_list = ['demo@webnotestech.com'] - if webnotes.session['user'] not in exception_list: - # Clear previous sessions i.e. logout previous log-in attempts - sid_list = webnotes.conn.sql("SELECT sid FROM `tabSessions` WHERE user=%s AND sid!=%s", (webnotes.session['user'], webnotes.session['sid'])) + sid_list = webnotes.conn.sql(""" + SELECT sid + FROM `tabSessions` + WHERE + user=%s AND + sid!=%s + ORDER BY lastupdate desc""", \ + (webnotes.session['user'], webnotes.session['sid']), as_list=1) + if sid_list and len(sid_list)>1: + for i in xrange(len(sid_list)): + if i>0: + webnotes.conn.sql("DELETE FROM `tabSessions` WHERE sid=%s", sid_list[i][0]) update_account_details() From a6272af68a7d7210fbb5d2090b8b6f4a70b68ff7 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 3 Jan 2012 17:02:20 +0530 Subject: [PATCH 35/62] Fix to logout previous session on login --- erpnext/startup/event_handlers.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py index 71ae767626..59fa0fde48 100644 --- a/erpnext/startup/event_handlers.py +++ b/erpnext/startup/event_handlers.py @@ -56,10 +56,8 @@ def on_login_post_session(login_manager): sid!=%s ORDER BY lastupdate desc""", \ (webnotes.session['user'], webnotes.session['sid']), as_list=1) - if sid_list and len(sid_list)>1: - for i in xrange(len(sid_list)): - if i>0: - webnotes.conn.sql("DELETE FROM `tabSessions` WHERE sid=%s", sid_list[i][0]) + for sid in sid_list: + webnotes.conn.sql("DELETE FROM `tabSessions` WHERE sid=%s", sid[0]) update_account_details() From 9dfc9f617b6c5e91bfef525e15679d14788b868e Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 5 Jan 2012 13:54:29 +0530 Subject: [PATCH 36/62] Fix regarding support ticket to support ticket system email chaining issue --- .../doctype/support_ticket/__init__.py | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/erpnext/support/doctype/support_ticket/__init__.py b/erpnext/support/doctype/support_ticket/__init__.py index f629cbdde6..fcf4e32d0e 100644 --- a/erpnext/support/doctype/support_ticket/__init__.py +++ b/erpnext/support/doctype/support_ticket/__init__.py @@ -40,18 +40,32 @@ class SupportMailbox(POP3Mailbox): else: content, content_type = mail.html_content, 'text/html' - thread_id = mail.get_thread_id() + thread_list = mail.get_thread_id() - if webnotes.conn.exists('Support Ticket', thread_id): - from webnotes.model.code import get_obj - - st = get_obj('Support Ticket', thread_id) - st.make_response_record(content, mail.mail['From'], content_type) - webnotes.conn.set(st.doc, 'status', 'Open') - update_feed(st.doc) - # extract attachments - self.save_attachments(st.doc, mail.attachments) - return + + email_id = mail.mail['From'] + if "<" in mail.mail['From']: + import re + re_result = re.findall('(?<=\<)(\S+)(?=\>)', mail.mail['From']) + if re_result and re_result[0]: email_id = res_result[0] + + + for thread_id in thread_list: + exists = webnotes.conn.sql("""\ + SELECT name + FROM `tabSupport Ticket` + WHERE name=%s AND raised_by LIKE %s + """, (thread_id, "%" + email_id + "%")) + if exists and exists[0] and exists[0][0]: + from webnotes.model.code import get_obj + + st = get_obj('Support Ticket', thread_id) + st.make_response_record(content, mail.mail['From'], content_type) + webnotes.conn.set(st.doc, 'status', 'Open') + update_feed(st.doc) + # extract attachments + self.save_attachments(st.doc, mail.attachments) + return # new ticket from webnotes.model.doc import Document From 523f3a0ea20b5fb0bd0a279023f03bcaae9a1286 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 5 Jan 2012 14:34:30 +0530 Subject: [PATCH 37/62] Added Administrator to exception list of users to be logged out post login --- erpnext/startup/event_handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py index 59fa0fde48..4eec0bc167 100644 --- a/erpnext/startup/event_handlers.py +++ b/erpnext/startup/event_handlers.py @@ -46,7 +46,7 @@ def on_login_post_session(login_manager): webnotes.session_obj.update() # Clear previous sessions i.e. logout previous log-in attempts - exception_list = ['demo@webnotestech.com'] + exception_list = ['demo@webnotestech.com', 'Administrator'] if webnotes.session['user'] not in exception_list: sid_list = webnotes.conn.sql(""" SELECT sid From dc64802e961c8a001b3e6cfd639317574749ddf9 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 5 Jan 2012 15:19:00 +0530 Subject: [PATCH 38/62] Fix Support Ticket --- erpnext/support/doctype/support_ticket/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/support/doctype/support_ticket/__init__.py b/erpnext/support/doctype/support_ticket/__init__.py index fcf4e32d0e..bff98d2534 100644 --- a/erpnext/support/doctype/support_ticket/__init__.py +++ b/erpnext/support/doctype/support_ticket/__init__.py @@ -54,8 +54,8 @@ class SupportMailbox(POP3Mailbox): exists = webnotes.conn.sql("""\ SELECT name FROM `tabSupport Ticket` - WHERE name=%s AND raised_by LIKE %s - """, (thread_id, "%" + email_id + "%")) + WHERE name=%s AND raised_by REGEXP '%s' + """ % ('(' + email_id + ')',), thread_id) if exists and exists[0] and exists[0][0]: from webnotes.model.code import get_obj From 97b1bf4b19fc758087a7b0f2563679234e39bd30 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 5 Jan 2012 15:46:47 +0530 Subject: [PATCH 39/62] Fixed support ticket issue --- erpnext/support/doctype/support_ticket/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/support/doctype/support_ticket/__init__.py b/erpnext/support/doctype/support_ticket/__init__.py index bff98d2534..0e73cf7782 100644 --- a/erpnext/support/doctype/support_ticket/__init__.py +++ b/erpnext/support/doctype/support_ticket/__init__.py @@ -47,15 +47,15 @@ class SupportMailbox(POP3Mailbox): if "<" in mail.mail['From']: import re re_result = re.findall('(?<=\<)(\S+)(?=\>)', mail.mail['From']) - if re_result and re_result[0]: email_id = res_result[0] + if re_result and re_result[0]: email_id = re_result[0] for thread_id in thread_list: exists = webnotes.conn.sql("""\ SELECT name FROM `tabSupport Ticket` - WHERE name=%s AND raised_by REGEXP '%s' - """ % ('(' + email_id + ')',), thread_id) + WHERE name=%s AND raised_by REGEXP %s + """ , (thread_id, '(' + email_id + ')')) if exists and exists[0] and exists[0][0]: from webnotes.model.code import get_obj From 9dd1e5d7289421ae7ee2772fd9d806d2e81cb40c Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 5 Jan 2012 17:39:42 +0530 Subject: [PATCH 40/62] Support Ticket Naming Series --- .../doctype/support_ticket/support_ticket.py | 4 +++ .../doctype/support_ticket/support_ticket.txt | 30 ++++++++++++------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/erpnext/support/doctype/support_ticket/support_ticket.py b/erpnext/support/doctype/support_ticket/support_ticket.py index c71304a0f7..709c7638a5 100644 --- a/erpnext/support/doctype/support_ticket/support_ticket.py +++ b/erpnext/support/doctype/support_ticket/support_ticket.py @@ -1,4 +1,5 @@ import webnotes +from webnotes.model.doc import make_autoname from utilities.transaction_base import TransactionBase from home import update_feed @@ -8,6 +9,9 @@ class DocType(TransactionBase): self.doc = doc self.doclist = doclist + def autoname(self): + self.doc.name = make_autoname(self.doc.naming_series+'.#####') + def send_response(self): """ Adds a new response to the ticket and sends an email to the sender diff --git a/erpnext/support/doctype/support_ticket/support_ticket.txt b/erpnext/support/doctype/support_ticket/support_ticket.txt index 0e3dee6590..bcdda149f0 100644 --- a/erpnext/support/doctype/support_ticket/support_ticket.txt +++ b/erpnext/support/doctype/support_ticket/support_ticket.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-05-23 10:00:38', + 'creation': '2011-05-23 12:37:01', 'docstatus': 0, - 'modified': '2011-12-27 17:40:25', + 'modified': '2012-01-05 16:29:45', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -15,8 +15,8 @@ '_last_update': '1311584009', 'allow_attach': 1, 'allow_trash': 1, - 'autoname': 'SUP.######', 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'module': 'Support', 'name': '__common__', @@ -26,7 +26,7 @@ 'show_in_menu': 0, 'subject': '%(subject)s', 'tag_fields': 'status,allocated_to', - 'version': 149 + 'version': 153 }, # These values are common for all DocField @@ -41,6 +41,7 @@ # These values are common for all DocPerm { 'amend': 0, + 'cancel': 0, 'doctype': 'DocPerm', 'name': '__common__', 'parent': 'Support Ticket', @@ -58,7 +59,6 @@ # DocPerm { - 'cancel': 0, 'create': 1, 'doctype': 'DocPerm', 'permlevel': 0, @@ -68,7 +68,6 @@ # DocPerm { - 'cancel': 0, 'create': 1, 'doctype': 'DocPerm', 'permlevel': 0, @@ -78,7 +77,6 @@ # DocPerm { - 'cancel': 1, 'create': 1, 'doctype': 'DocPerm', 'permlevel': 0, @@ -88,7 +86,6 @@ # DocPerm { - 'cancel': 0, 'create': 0, 'doctype': 'DocPerm', 'permlevel': 1, @@ -98,7 +95,6 @@ # DocPerm { - 'cancel': 0, 'create': 0, 'doctype': 'DocPerm', 'permlevel': 2, @@ -187,7 +183,6 @@ 'doctype': 'DocField', 'fieldtype': 'Button', 'label': 'Send', - 'options': 'send_response', 'permlevel': 0 }, @@ -392,5 +387,20 @@ 'no_copy': 1, 'permlevel': 0, 'print_hide': 1 + }, + + # DocField + { + 'doctype': 'DocField', + 'fieldname': 'naming_series', + 'fieldtype': 'Select', + 'hidden': 1, + 'label': 'Series', + 'no_copy': 1, + 'options': 'SUP', + 'permlevel': 0, + 'print_hide': 1, + 'reqd': 0, + 'search_index': 0 } ] \ No newline at end of file From 6a13e8b645d030db9f569ceed3c6dfa4ecb2e735 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 5 Jan 2012 19:17:57 +0530 Subject: [PATCH 41/62] Apply naming series when saving support ticket for 1st time --- erpnext/support/doctype/support_ticket/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/support/doctype/support_ticket/__init__.py b/erpnext/support/doctype/support_ticket/__init__.py index 0e73cf7782..3b05bda051 100644 --- a/erpnext/support/doctype/support_ticket/__init__.py +++ b/erpnext/support/doctype/support_ticket/__init__.py @@ -67,6 +67,9 @@ class SupportMailbox(POP3Mailbox): self.save_attachments(st.doc, mail.attachments) return + opts = webnotes.conn.sql("""\ + SELECT options FROM tabDocField + WHERE parent='Support Ticket' AND fieldname='naming_series'""") # new ticket from webnotes.model.doc import Document d = Document('Support Ticket') @@ -75,6 +78,7 @@ class SupportMailbox(POP3Mailbox): d.raised_by = mail.mail['From'] d.content_type = content_type d.status = 'Open' + d.naming_series = (opts and opts[0] and opts[0][0] and opts[0][0].split("\n")[0]) or 'SUP' try: d.save(1) From 449f534c36bb509f1b7a0de654b66b6ca24979e4 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 6 Jan 2012 11:54:21 +0530 Subject: [PATCH 42/62] Trying to fix support ticket refresh on reply issue --- erpnext/support/doctype/support_ticket/support_ticket.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/support/doctype/support_ticket/support_ticket.js b/erpnext/support/doctype/support_ticket/support_ticket.js index 914227b222..906a220ed1 100644 --- a/erpnext/support/doctype/support_ticket/support_ticket.js +++ b/erpnext/support/doctype/support_ticket/support_ticket.js @@ -83,8 +83,9 @@ $.extend(cur_frm.cscript, { Send: function(doc, dt, dn) { $c_obj([doc], 'send_response', '', function(r,rt) { locals[dt][dn].new_response = ''; - refresh_field('new_response'); - cs.make_listing(doc); + //refresh_field('new_response'); + //cs.make_listing(doc); + cs.refresh(doc); }); }, From 7a87c7de4610c1445ee749d0b60b38ed1d4fd9b4 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 6 Jan 2012 12:02:50 +0530 Subject: [PATCH 43/62] Trying to fix support ticket refresh issue --- erpnext/support/doctype/support_ticket/support_ticket.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/support/doctype/support_ticket/support_ticket.js b/erpnext/support/doctype/support_ticket/support_ticket.js index 906a220ed1..d626647d0b 100644 --- a/erpnext/support/doctype/support_ticket/support_ticket.js +++ b/erpnext/support/doctype/support_ticket/support_ticket.js @@ -85,7 +85,7 @@ $.extend(cur_frm.cscript, { locals[dt][dn].new_response = ''; //refresh_field('new_response'); //cs.make_listing(doc); - cs.refresh(doc); + cur_frm.refresh(); }); }, From 7f16efe35da8779ad56d67c8ac6c96c41fc07cf3 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 6 Jan 2012 12:06:29 +0530 Subject: [PATCH 44/62] Refresh issue fixed for support ticket --- erpnext/support/doctype/support_ticket/support_ticket.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/erpnext/support/doctype/support_ticket/support_ticket.js b/erpnext/support/doctype/support_ticket/support_ticket.js index d626647d0b..be734ad04a 100644 --- a/erpnext/support/doctype/support_ticket/support_ticket.js +++ b/erpnext/support/doctype/support_ticket/support_ticket.js @@ -83,8 +83,6 @@ $.extend(cur_frm.cscript, { Send: function(doc, dt, dn) { $c_obj([doc], 'send_response', '', function(r,rt) { locals[dt][dn].new_response = ''; - //refresh_field('new_response'); - //cs.make_listing(doc); cur_frm.refresh(); }); }, From 4a1da119f9adadaa9dcdd8aa37d0a1eeb3da052a Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 6 Jan 2012 12:58:23 +0530 Subject: [PATCH 45/62] Refresh support ticket status when a new reply is received --- erpnext/support/doctype/support_ticket/support_ticket.js | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/support/doctype/support_ticket/support_ticket.js b/erpnext/support/doctype/support_ticket/support_ticket.js index be734ad04a..b7413ea919 100644 --- a/erpnext/support/doctype/support_ticket/support_ticket.js +++ b/erpnext/support/doctype/support_ticket/support_ticket.js @@ -47,6 +47,7 @@ $.extend(cur_frm.cscript, { set_field_permlevel('description',2); set_field_permlevel('raised_by',2); } + refresh_field('status'); }, // From 58455c9d8ee88ab8c910b09a99f4832cca87e730 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 6 Jan 2012 14:33:57 +0530 Subject: [PATCH 46/62] Changes in print format to hide taxes when using inclusive prices and showing reference rate when discount is to be displayed --- .../Sales Invoice Classic.txt | 6 +++--- .../Sales Invoice Modern.txt | 6 +++--- .../Sales Invoice Spartan.txt | 6 +++--- .../print_formats/DeliveryNoteClassic.html | 17 ++++++++++------- .../print_formats/DeliveryNoteModern.html | 17 ++++++++++------- .../print_formats/DeliveryNoteSpartan.html | 17 ++++++++++------- .../patches/print_formats/QuotationClassic.html | 17 ++++++++++------- .../patches/print_formats/QuotationModern.html | 17 ++++++++++------- .../patches/print_formats/QuotationSpartan.html | 17 ++++++++++------- .../print_formats/SalesInvoiceClassic.html | 17 ++++++++++------- .../print_formats/SalesInvoiceModern.html | 17 ++++++++++------- .../print_formats/SalesInvoiceSpartan.html | 17 ++++++++++------- .../print_formats/SalesOrderClassic.html | 17 ++++++++++------- .../patches/print_formats/SalesOrderModern.html | 17 ++++++++++------- .../print_formats/SalesOrderSpartan.html | 17 ++++++++++------- .../Quotation Classic/Quotation Classic.txt | 6 +++--- .../Quotation Modern/Quotation Modern.txt | 6 +++--- .../Quotation Spartan/Quotation Spartan.txt | 6 +++--- .../Sales Order Classic/Sales Order Classic.txt | 6 +++--- .../Sales Order Modern/Sales Order Modern.txt | 6 +++--- .../Sales Order Spartan/Sales Order Spartan.txt | 6 +++--- .../Delivery Note Classic.txt | 6 +++--- .../Delivery Note Modern.txt | 6 +++--- .../Delivery Note Spartan.txt | 6 +++--- 24 files changed, 156 insertions(+), 120 deletions(-) diff --git a/erpnext/accounts/Print Format/Sales Invoice Classic/Sales Invoice Classic.txt b/erpnext/accounts/Print Format/Sales Invoice Classic/Sales Invoice Classic.txt index d6255d71e7..c628e83013 100644 --- a/erpnext/accounts/Print Format/Sales Invoice Classic/Sales Invoice Classic.txt +++ b/erpnext/accounts/Print Format/Sales Invoice Classic/Sales Invoice Classic.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 13:31:22', + 'modified': '2012-01-06 14:17:57', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Receivable Voucher', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Invoice Date
Due Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Invoice Date
Due Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Accounts', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/accounts/Print Format/Sales Invoice Modern/Sales Invoice Modern.txt b/erpnext/accounts/Print Format/Sales Invoice Modern/Sales Invoice Modern.txt index f7d2c6b387..0b4c15c747 100644 --- a/erpnext/accounts/Print Format/Sales Invoice Modern/Sales Invoice Modern.txt +++ b/erpnext/accounts/Print Format/Sales Invoice Modern/Sales Invoice Modern.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 13:37:39', + 'modified': '2012-01-06 14:18:11', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Receivable Voucher', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Invoice No.
Invoice Date
Due Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Invoice No.
Invoice Date
Due Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Accounts', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/accounts/Print Format/Sales Invoice Spartan/Sales Invoice Spartan.txt b/erpnext/accounts/Print Format/Sales Invoice Spartan/Sales Invoice Spartan.txt index c24cde5464..dc85a5f078 100644 --- a/erpnext/accounts/Print Format/Sales Invoice Spartan/Sales Invoice Spartan.txt +++ b/erpnext/accounts/Print Format/Sales Invoice Spartan/Sales Invoice Spartan.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 13:39:55', + 'modified': '2012-01-06 14:18:25', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Receivable Voucher', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Invoice Date
Due Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Invoice Date
Due Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Accounts', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/patches/print_formats/DeliveryNoteClassic.html b/erpnext/patches/print_formats/DeliveryNoteClassic.html index 64475d64d4..65d30e6577 100644 --- a/erpnext/patches/print_formats/DeliveryNoteClassic.html +++ b/erpnext/patches/print_formats/DeliveryNoteClassic.html @@ -115,7 +115,8 @@ var to_append = '' if(data_row.adj_rate){ to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { data_row.description = data_row.description + to_append; } @@ -156,12 +157,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/DeliveryNoteModern.html b/erpnext/patches/print_formats/DeliveryNoteModern.html index 375a8a6a1e..652358fca8 100644 --- a/erpnext/patches/print_formats/DeliveryNoteModern.html +++ b/erpnext/patches/print_formats/DeliveryNoteModern.html @@ -138,7 +138,8 @@ var to_append = '' if(data_row.adj_rate){ to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { data_row.description = data_row.description + to_append; } @@ -179,12 +180,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/DeliveryNoteSpartan.html b/erpnext/patches/print_formats/DeliveryNoteSpartan.html index 5426f134b6..978183d2d5 100644 --- a/erpnext/patches/print_formats/DeliveryNoteSpartan.html +++ b/erpnext/patches/print_formats/DeliveryNoteSpartan.html @@ -137,7 +137,8 @@ var to_append = '' if(data_row.adj_rate){ to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { data_row.description = data_row.description + to_append; } @@ -178,12 +179,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/QuotationClassic.html b/erpnext/patches/print_formats/QuotationClassic.html index a522ec626e..ca6975594f 100644 --- a/erpnext/patches/print_formats/QuotationClassic.html +++ b/erpnext/patches/print_formats/QuotationClassic.html @@ -114,7 +114,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -146,12 +147,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/QuotationModern.html b/erpnext/patches/print_formats/QuotationModern.html index 33db0aa34f..7f7727ab47 100644 --- a/erpnext/patches/print_formats/QuotationModern.html +++ b/erpnext/patches/print_formats/QuotationModern.html @@ -137,7 +137,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -169,12 +170,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/QuotationSpartan.html b/erpnext/patches/print_formats/QuotationSpartan.html index 72ed0f71a5..e0829933d5 100644 --- a/erpnext/patches/print_formats/QuotationSpartan.html +++ b/erpnext/patches/print_formats/QuotationSpartan.html @@ -136,7 +136,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -168,12 +169,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/SalesInvoiceClassic.html b/erpnext/patches/print_formats/SalesInvoiceClassic.html index 79da643711..78cb8155ff 100644 --- a/erpnext/patches/print_formats/SalesInvoiceClassic.html +++ b/erpnext/patches/print_formats/SalesInvoiceClassic.html @@ -114,7 +114,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -146,12 +147,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/SalesInvoiceModern.html b/erpnext/patches/print_formats/SalesInvoiceModern.html index 3173c55140..cef84ac6a2 100644 --- a/erpnext/patches/print_formats/SalesInvoiceModern.html +++ b/erpnext/patches/print_formats/SalesInvoiceModern.html @@ -137,7 +137,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -169,12 +170,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/SalesInvoiceSpartan.html b/erpnext/patches/print_formats/SalesInvoiceSpartan.html index b76c49ec7d..7d13674f9a 100644 --- a/erpnext/patches/print_formats/SalesInvoiceSpartan.html +++ b/erpnext/patches/print_formats/SalesInvoiceSpartan.html @@ -136,7 +136,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -168,12 +169,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/SalesOrderClassic.html b/erpnext/patches/print_formats/SalesOrderClassic.html index 21d8d46c45..070feb05e1 100644 --- a/erpnext/patches/print_formats/SalesOrderClassic.html +++ b/erpnext/patches/print_formats/SalesOrderClassic.html @@ -114,7 +114,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -146,12 +147,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/SalesOrderModern.html b/erpnext/patches/print_formats/SalesOrderModern.html index 48b60f7c81..e2ac0c1bd4 100644 --- a/erpnext/patches/print_formats/SalesOrderModern.html +++ b/erpnext/patches/print_formats/SalesOrderModern.html @@ -137,7 +137,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -169,12 +170,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/patches/print_formats/SalesOrderSpartan.html b/erpnext/patches/print_formats/SalesOrderSpartan.html index b3fce740cc..866e84fbc0 100644 --- a/erpnext/patches/print_formats/SalesOrderSpartan.html +++ b/erpnext/patches/print_formats/SalesOrderSpartan.html @@ -136,7 +136,8 @@ 'description' : function(data_row) { if(data_row.adj_rate) { var to_append = '
Discount: ' + - data_row.adj_rate + '%
'; + data_row.adj_rate + '% on ' + doc.currency + ' ' + + fmt_money(data_row.ref_rate) + ''; if(data_row.description.indexOf(to_append)==-1) { return data_row.description + to_append; } else { return data_row.description; } @@ -168,12 +169,14 @@ var oc = getchildren('RV Tax Detail', doc.name, 'other_charges'); var rows = '\n'; for(var i=0; i\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\n'; + if(!oc[i].included_in_print_rate) { + rows += + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n'; + } } return rows + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
' + oc[i].description + '' + fmt_money(oc[i].tax_amount) + '
\n'; } diff --git a/erpnext/selling/Print Format/Quotation Classic/Quotation Classic.txt b/erpnext/selling/Print Format/Quotation Classic/Quotation Classic.txt index 0650f30abf..48620bcac3 100644 --- a/erpnext/selling/Print Format/Quotation Classic/Quotation Classic.txt +++ b/erpnext/selling/Print Format/Quotation Classic/Quotation Classic.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 12:12:22', + 'modified': '2012-01-06 14:17:12', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Quotation', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Quotation Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Quotation Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Selling', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/selling/Print Format/Quotation Modern/Quotation Modern.txt b/erpnext/selling/Print Format/Quotation Modern/Quotation Modern.txt index 89d2e20d63..be9aa37b6c 100644 --- a/erpnext/selling/Print Format/Quotation Modern/Quotation Modern.txt +++ b/erpnext/selling/Print Format/Quotation Modern/Quotation Modern.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 12:20:42', + 'modified': '2012-01-06 14:17:27', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Quotation', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Quotation No.
Quotation Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Quotation No.
Quotation Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Selling', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/selling/Print Format/Quotation Spartan/Quotation Spartan.txt b/erpnext/selling/Print Format/Quotation Spartan/Quotation Spartan.txt index 258060efec..3700c7d7e5 100644 --- a/erpnext/selling/Print Format/Quotation Spartan/Quotation Spartan.txt +++ b/erpnext/selling/Print Format/Quotation Spartan/Quotation Spartan.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 12:24:23', + 'modified': '2012-01-06 14:17:40', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Quotation', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Quotation Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Quotation Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Selling', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/selling/Print Format/Sales Order Classic/Sales Order Classic.txt b/erpnext/selling/Print Format/Sales Order Classic/Sales Order Classic.txt index 7d99371ccb..f955bf8e33 100644 --- a/erpnext/selling/Print Format/Sales Order Classic/Sales Order Classic.txt +++ b/erpnext/selling/Print Format/Sales Order Classic/Sales Order Classic.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 12:30:15', + 'modified': '2012-01-06 14:18:38', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Sales Order', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Sales Order Date
Delivery Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Sales Order Date
Delivery Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Selling', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/selling/Print Format/Sales Order Modern/Sales Order Modern.txt b/erpnext/selling/Print Format/Sales Order Modern/Sales Order Modern.txt index aaf8c194c5..234256f01d 100644 --- a/erpnext/selling/Print Format/Sales Order Modern/Sales Order Modern.txt +++ b/erpnext/selling/Print Format/Sales Order Modern/Sales Order Modern.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 12:36:06', + 'modified': '2012-01-06 14:18:51', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Sales Order', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Sales Order No.
Sales Order Date
Delivery Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Sales Order No.
Sales Order Date
Delivery Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Selling', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/selling/Print Format/Sales Order Spartan/Sales Order Spartan.txt b/erpnext/selling/Print Format/Sales Order Spartan/Sales Order Spartan.txt index 14df2e7c4a..5fc3c45906 100644 --- a/erpnext/selling/Print Format/Sales Order Spartan/Sales Order Spartan.txt +++ b/erpnext/selling/Print Format/Sales Order Spartan/Sales Order Spartan.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 12:42:52', + 'modified': '2012-01-06 14:19:02', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Sales Order', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Sales Order Date
Delivery Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Sales Order Date
Delivery Date
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Selling', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/stock/Print Format/Delivery Note Classic/Delivery Note Classic.txt b/erpnext/stock/Print Format/Delivery Note Classic/Delivery Note Classic.txt index aa90475e80..b33b28d5c4 100644 --- a/erpnext/stock/Print Format/Delivery Note Classic/Delivery Note Classic.txt +++ b/erpnext/stock/Print Format/Delivery Note Classic/Delivery Note Classic.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 13:11:24', + 'modified': '2012-01-06 14:16:03', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Delivery Note', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Delivery Note Date
Sales Order No.\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t()\n\t\t\t\t\t\t
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Delivery Note Date
Sales Order No.\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t()\n\t\t\t\t\t\t
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Stock', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/stock/Print Format/Delivery Note Modern/Delivery Note Modern.txt b/erpnext/stock/Print Format/Delivery Note Modern/Delivery Note Modern.txt index 1b10b1631a..065f3f49d0 100644 --- a/erpnext/stock/Print Format/Delivery Note Modern/Delivery Note Modern.txt +++ b/erpnext/stock/Print Format/Delivery Note Modern/Delivery Note Modern.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 13:20:50', + 'modified': '2012-01-06 14:16:38', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Delivery Note', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Delivery Note No.
Delivery Note Date
Sales Order No.\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t()\n\t\t\t\t\t\t
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Delivery Note No.
Delivery Note Date
Sales Order No.\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t()\n\t\t\t\t\t\t
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Stock', 'name': '__common__', 'standard': 'Yes' diff --git a/erpnext/stock/Print Format/Delivery Note Spartan/Delivery Note Spartan.txt b/erpnext/stock/Print Format/Delivery Note Spartan/Delivery Note Spartan.txt index b0931075be..1309b5cefd 100644 --- a/erpnext/stock/Print Format/Delivery Note Spartan/Delivery Note Spartan.txt +++ b/erpnext/stock/Print Format/Delivery Note Spartan/Delivery Note Spartan.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2011-12-13 11:02:59', + 'creation': '2011-12-21 11:02:04', 'docstatus': 0, - 'modified': '2011-12-13 13:22:53', + 'modified': '2012-01-06 14:16:51', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -14,7 +14,7 @@ { 'doc_type': 'Delivery Note', 'doctype': 'Print Format', - 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Delivery Note Date
Sales Order No.\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t()\n\t\t\t\t\t\t
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', + 'html': '\n\n\n\n\n\n\n\n\n\n\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t

\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
Name
Address
Contact
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t
Delivery Note Date
Sales Order No.\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t()\n\t\t\t\t\t\t
\n
\n
\n\t\n\t\n
\n
\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t
\n\t\t\t\t\tTerms, Conditions & Other Information:
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
Net Total
Grand Total
Rounded Total
\n\t\t\t\t\t
In Words
\n\t\t\t\t\t\n\t\t\t\t
\n
\n', 'module': 'Stock', 'name': '__common__', 'standard': 'Yes' From a31fd1080bd2cae31fa3202ada3450e48ad374a0 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 6 Jan 2012 16:27:54 +0530 Subject: [PATCH 47/62] Change in top toolbar. It will not include profile link. The home right sidebar will have the profile settings link --- .../home/page/event_updates/event_updates.js | 6 +++- erpnext/startup/startup.js | 29 +++++++----------- index.html | 2 +- versions-master.db | Bin 742400 -> 742400 bytes 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/erpnext/home/page/event_updates/event_updates.js b/erpnext/home/page/event_updates/event_updates.js index b58a0c0914..ee348e6307 100644 --- a/erpnext/home/page/event_updates/event_updates.js +++ b/erpnext/home/page/event_updates/event_updates.js @@ -583,7 +583,11 @@ HomeStatusBar = function() { this.render = function(r) { this.wrapper.innerHTML = ''; - this.span = $a(this.wrapper, 'span', 'link_type', {fontWeight:'bold'}); + this.profile_settings = $a($a(this.wrapper, 'p'), 'span', 'link_type', {fontWeight:'bold'}); + this.profile_settings.innerHTML = user_fullname + ' (Profile Settings)'; + this.profile_settings.onclick = function() { loadpage('profile-settings'); } + + this.span = $a($a(this.wrapper, 'p'), 'span', 'link_type', {fontWeight:'bold'}); this.span.onclick = function() { loadpage('My Company') } if(r.unread_messages) { diff --git a/erpnext/startup/startup.js b/erpnext/startup/startup.js index 07c1629f83..5a66ec672d 100644 --- a/erpnext/startup/startup.js +++ b/erpnext/startup/startup.js @@ -432,16 +432,17 @@ pscript.startup_set_module_order = function() { pscript.startup_setup_toolbar = function() { var menu_tab = page_body.wntoolbar.menu_table_right; - // Profile - // --------- - $td(menu_tab,0,0).innerHTML = ''+user_fullname+''; - + // help + // ---- + $td(menu_tab,0,0).innerHTML = 'Help'; + + $td(menu_tab,0,1).innerHTML = 'Forum'; + if(pscript.is_erpnext_saas){ - // Help - // -------------- - //var help_url = login_file + '#!helpdesk' - $td(menu_tab,0,1).innerHTML = 'Forum'; - + // Live Chat Help + // -------------- + $td(menu_tab,0,2).innerHTML = 'Chat'; + // Manage account // -------------- if(is_system_manager) { @@ -449,18 +450,10 @@ pscript.startup_setup_toolbar = function() { } } else{ - $dh($td(menu_tab,0,1)); + $dh($td(menu_tab,0,2)); $dh($td(menu_tab,0,3)); } - // Live Chat Help - // -------------- - $td(menu_tab,0,2).innerHTML = 'Chat'; - - // help - // ---- - var cell = menu_tab.rows[0].insertCell(3); - cell.innerHTML = 'Help'; $y(cell, page_body.wntoolbar.right_table_style); } diff --git a/index.html b/index.html index b04284a147..02b3b1a687 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ ERPNext - diff --git a/js/app.js b/js/app.js index aeb10a189d..5a8597d48b 100644 --- a/js/app.js +++ b/js/app.js @@ -4,17 +4,10 @@ wn.require('lib/js/lib/jquery.min.js'); wn.require('lib/js/legacy/tiny_mce_33/jquery.tinymce.js'); wn.require('lib/js/wn/ui/status_bar.js'); -wn.sb = new wn.ui.StatusBar(); -wn.sb.set_value(15); // for datepicker wn.require('lib/js/legacy/jquery/jquery-ui.min.js') -wn.sb.set_value(25); - wn.require('lib/js/legacy/wnf.compressed.js'); -wn.sb.set_value(40); - wn.require('lib/css/legacy/default.css'); -wn.sb.set_value(70); $(document).bind('ready', function() { startup(); diff --git a/templates/index.html b/templates/index.html index 5a4f9b6c47..1f83af37ad 100644 --- a/templates/index.html +++ b/templates/index.html @@ -3,7 +3,7 @@ ERPNext - +
@@ -13,7 +13,7 @@
- {{ content }} + No content
diff --git a/version.num b/version.num new file mode 100644 index 0000000000..f11c82a4cb --- /dev/null +++ b/version.num @@ -0,0 +1 @@ +9 \ No newline at end of file diff --git a/versions-master.db b/versions-master.db deleted file mode 100644 index 56eff64907d1599ab799834dc9d9f02ed70becab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 742400 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 Date: Mon, 9 Jan 2012 16:55:30 +0530 Subject: [PATCH 51/62] On Print Hide, hide net_total, rounded_total_export and grand_total_export --- .../receivable_voucher/receivable_voucher.txt | 12 +- .../Discount_purchase_cycle.py | 0 erpnext/patches/before_jan_2012/__init__.py | 0 .../accounts_default_form.py | 0 .../{ => before_jan_2012}/auto_indent.py | 0 .../{ => before_jan_2012}/c_form_patch.py | 0 .../delivery_billing_status_patch.py | 0 .../deploy_email_digest.py | 0 .../edigest_enable_income_year_to_date.py | 0 .../employeewise_balance_leave_report.py | 0 .../erpnext_structure_cleanup.py | 0 .../{ => before_jan_2012}/index_patch.py | 0 .../install_print_formats.py | 0 .../{ => before_jan_2012}/lcw_patch.py | 0 erpnext/patches/{ => before_jan_2012}/p1.py | 0 .../{ => before_jan_2012}/packing_slip.py | 0 .../{ => before_jan_2012}/price_list_patch.py | 0 .../print_hide_price_list.py | 0 .../profile_mark_not_in_create.py | 0 .../{ => before_jan_2012}/project_patch.py | 0 .../{ => before_jan_2012}/reload_address.py | 0 .../{ => before_jan_2012}/reload_bom.py | 0 .../{ => before_jan_2012}/reload_doclayer.py | 0 .../reload_email_digest.py | 0 ...eload_employeewise_balance_leave_report.py | 0 .../{ => before_jan_2012}/reload_flat_bom.py | 0 .../{ => before_jan_2012}/reload_gl_mapper.py | 0 .../{ => before_jan_2012}/reload_lc_wizard.py | 0 .../reload_print_format.py | 0 .../reload_project_task.py | 0 .../{ => before_jan_2012}/reload_reco.py | 0 .../{ => before_jan_2012}/reload_rv.py | 0 .../reload_support_ticket.py | 0 .../remove_duplicate_table_mapper_detail.py | 0 .../remove_extra_button_from_email_digest.py | 0 .../remove_old_cp_email_settings.py | 0 .../remove_page_break_from_defaults.py | 0 .../remove_previous_field_property_setter.py | 0 .../repost_account_bal.py | 0 .../{ => before_jan_2012}/repost_stock.py | 0 .../{ => before_jan_2012}/sal_man_patch.py | 0 .../task_email_notification.py | 0 .../{ => before_jan_2012}/update_0_idx.py | 0 .../update_gle_against_voucher_for_jv.py | 0 erpnext/patches/jan_mar_2012/__init__.py | 0 .../patches/jan_mar_2012/print_hide_totals.py | 20 ++++ .../stable_branch_shift_09_01_12.py | 38 +++++++ erpnext/patches/patch_list.py | 10 ++ .../selling/doctype/quotation/quotation.txt | 12 +- .../doctype/sales_order/sales_order.txt | 12 +- .../doctype/other_charges/other_charges.js | 106 +++++++++++------- .../doctype/delivery_note/delivery_note.txt | 12 +- index.html | 2 +- versions-master.db | Bin 742400 -> 742400 bytes 54 files changed, 161 insertions(+), 63 deletions(-) rename erpnext/patches/{ => before_jan_2012}/Discount_purchase_cycle.py (100%) mode change 100755 => 100644 create mode 100644 erpnext/patches/before_jan_2012/__init__.py rename erpnext/patches/{ => before_jan_2012}/accounts_default_form.py (100%) rename erpnext/patches/{ => before_jan_2012}/auto_indent.py (100%) rename erpnext/patches/{ => before_jan_2012}/c_form_patch.py (100%) rename erpnext/patches/{ => before_jan_2012}/delivery_billing_status_patch.py (100%) rename erpnext/patches/{ => before_jan_2012}/deploy_email_digest.py (100%) rename erpnext/patches/{ => before_jan_2012}/edigest_enable_income_year_to_date.py (100%) rename erpnext/patches/{ => before_jan_2012}/employeewise_balance_leave_report.py (100%) rename erpnext/patches/{ => before_jan_2012}/erpnext_structure_cleanup.py (100%) rename erpnext/patches/{ => before_jan_2012}/index_patch.py (100%) rename erpnext/patches/{ => before_jan_2012}/install_print_formats.py (100%) rename erpnext/patches/{ => before_jan_2012}/lcw_patch.py (100%) rename erpnext/patches/{ => before_jan_2012}/p1.py (100%) rename erpnext/patches/{ => before_jan_2012}/packing_slip.py (100%) rename erpnext/patches/{ => before_jan_2012}/price_list_patch.py (100%) rename erpnext/patches/{ => before_jan_2012}/print_hide_price_list.py (100%) rename erpnext/patches/{ => before_jan_2012}/profile_mark_not_in_create.py (100%) rename erpnext/patches/{ => before_jan_2012}/project_patch.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_address.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_bom.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_doclayer.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_email_digest.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_employeewise_balance_leave_report.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_flat_bom.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_gl_mapper.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_lc_wizard.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_print_format.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_project_task.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_reco.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_rv.py (100%) rename erpnext/patches/{ => before_jan_2012}/reload_support_ticket.py (100%) rename erpnext/patches/{ => before_jan_2012}/remove_duplicate_table_mapper_detail.py (100%) rename erpnext/patches/{ => before_jan_2012}/remove_extra_button_from_email_digest.py (100%) rename erpnext/patches/{ => before_jan_2012}/remove_old_cp_email_settings.py (100%) rename erpnext/patches/{ => before_jan_2012}/remove_page_break_from_defaults.py (100%) rename erpnext/patches/{ => before_jan_2012}/remove_previous_field_property_setter.py (100%) rename erpnext/patches/{ => before_jan_2012}/repost_account_bal.py (100%) rename erpnext/patches/{ => before_jan_2012}/repost_stock.py (100%) rename erpnext/patches/{ => before_jan_2012}/sal_man_patch.py (100%) rename erpnext/patches/{ => before_jan_2012}/task_email_notification.py (100%) rename erpnext/patches/{ => before_jan_2012}/update_0_idx.py (100%) rename erpnext/patches/{ => before_jan_2012}/update_gle_against_voucher_for_jv.py (100%) create mode 100644 erpnext/patches/jan_mar_2012/__init__.py create mode 100644 erpnext/patches/jan_mar_2012/print_hide_totals.py create mode 100644 erpnext/patches/jan_mar_2012/stable_branch_shift_09_01_12.py diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt index c194e7cc0c..2d890387aa 100644 --- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt +++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt @@ -5,7 +5,7 @@ { 'creation': '2010-08-08 17:09:18', 'docstatus': 0, - 'modified': '2011-12-22 19:04:07', + 'modified': '2012-01-09 16:52:22', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -21,7 +21,7 @@ # These values are common for all DocType { - '_last_update': '1324367593', + '_last_update': '1326105583', 'change_log': '1. Change in pull_details method dt.-26-06-2009', 'colour': 'White:FFF', 'default_print_format': 'Standard', @@ -34,7 +34,7 @@ 'server_code_error': ' ', 'show_in_menu': 0, 'subject': 'To %(customer_name)s worth %(currency)s %(grand_total_export)s due on %(due_date)s | %(outstanding_amount)s outstanding', - 'version': 392 + 'version': 394 }, # These values are common for all DocFormat @@ -653,7 +653,7 @@ 'oldfieldname': 'net_total', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 1 }, @@ -1218,7 +1218,7 @@ 'oldfieldname': 'grand_total_export', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 1 }, @@ -1231,7 +1231,7 @@ 'oldfieldname': 'rounded_total_export', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1 + 'print_hide': 0 }, # DocField diff --git a/erpnext/patches/Discount_purchase_cycle.py b/erpnext/patches/before_jan_2012/Discount_purchase_cycle.py old mode 100755 new mode 100644 similarity index 100% rename from erpnext/patches/Discount_purchase_cycle.py rename to erpnext/patches/before_jan_2012/Discount_purchase_cycle.py diff --git a/erpnext/patches/before_jan_2012/__init__.py b/erpnext/patches/before_jan_2012/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/patches/accounts_default_form.py b/erpnext/patches/before_jan_2012/accounts_default_form.py similarity index 100% rename from erpnext/patches/accounts_default_form.py rename to erpnext/patches/before_jan_2012/accounts_default_form.py diff --git a/erpnext/patches/auto_indent.py b/erpnext/patches/before_jan_2012/auto_indent.py similarity index 100% rename from erpnext/patches/auto_indent.py rename to erpnext/patches/before_jan_2012/auto_indent.py diff --git a/erpnext/patches/c_form_patch.py b/erpnext/patches/before_jan_2012/c_form_patch.py similarity index 100% rename from erpnext/patches/c_form_patch.py rename to erpnext/patches/before_jan_2012/c_form_patch.py diff --git a/erpnext/patches/delivery_billing_status_patch.py b/erpnext/patches/before_jan_2012/delivery_billing_status_patch.py similarity index 100% rename from erpnext/patches/delivery_billing_status_patch.py rename to erpnext/patches/before_jan_2012/delivery_billing_status_patch.py diff --git a/erpnext/patches/deploy_email_digest.py b/erpnext/patches/before_jan_2012/deploy_email_digest.py similarity index 100% rename from erpnext/patches/deploy_email_digest.py rename to erpnext/patches/before_jan_2012/deploy_email_digest.py diff --git a/erpnext/patches/edigest_enable_income_year_to_date.py b/erpnext/patches/before_jan_2012/edigest_enable_income_year_to_date.py similarity index 100% rename from erpnext/patches/edigest_enable_income_year_to_date.py rename to erpnext/patches/before_jan_2012/edigest_enable_income_year_to_date.py diff --git a/erpnext/patches/employeewise_balance_leave_report.py b/erpnext/patches/before_jan_2012/employeewise_balance_leave_report.py similarity index 100% rename from erpnext/patches/employeewise_balance_leave_report.py rename to erpnext/patches/before_jan_2012/employeewise_balance_leave_report.py diff --git a/erpnext/patches/erpnext_structure_cleanup.py b/erpnext/patches/before_jan_2012/erpnext_structure_cleanup.py similarity index 100% rename from erpnext/patches/erpnext_structure_cleanup.py rename to erpnext/patches/before_jan_2012/erpnext_structure_cleanup.py diff --git a/erpnext/patches/index_patch.py b/erpnext/patches/before_jan_2012/index_patch.py similarity index 100% rename from erpnext/patches/index_patch.py rename to erpnext/patches/before_jan_2012/index_patch.py diff --git a/erpnext/patches/install_print_formats.py b/erpnext/patches/before_jan_2012/install_print_formats.py similarity index 100% rename from erpnext/patches/install_print_formats.py rename to erpnext/patches/before_jan_2012/install_print_formats.py diff --git a/erpnext/patches/lcw_patch.py b/erpnext/patches/before_jan_2012/lcw_patch.py similarity index 100% rename from erpnext/patches/lcw_patch.py rename to erpnext/patches/before_jan_2012/lcw_patch.py diff --git a/erpnext/patches/p1.py b/erpnext/patches/before_jan_2012/p1.py similarity index 100% rename from erpnext/patches/p1.py rename to erpnext/patches/before_jan_2012/p1.py diff --git a/erpnext/patches/packing_slip.py b/erpnext/patches/before_jan_2012/packing_slip.py similarity index 100% rename from erpnext/patches/packing_slip.py rename to erpnext/patches/before_jan_2012/packing_slip.py diff --git a/erpnext/patches/price_list_patch.py b/erpnext/patches/before_jan_2012/price_list_patch.py similarity index 100% rename from erpnext/patches/price_list_patch.py rename to erpnext/patches/before_jan_2012/price_list_patch.py diff --git a/erpnext/patches/print_hide_price_list.py b/erpnext/patches/before_jan_2012/print_hide_price_list.py similarity index 100% rename from erpnext/patches/print_hide_price_list.py rename to erpnext/patches/before_jan_2012/print_hide_price_list.py diff --git a/erpnext/patches/profile_mark_not_in_create.py b/erpnext/patches/before_jan_2012/profile_mark_not_in_create.py similarity index 100% rename from erpnext/patches/profile_mark_not_in_create.py rename to erpnext/patches/before_jan_2012/profile_mark_not_in_create.py diff --git a/erpnext/patches/project_patch.py b/erpnext/patches/before_jan_2012/project_patch.py similarity index 100% rename from erpnext/patches/project_patch.py rename to erpnext/patches/before_jan_2012/project_patch.py diff --git a/erpnext/patches/reload_address.py b/erpnext/patches/before_jan_2012/reload_address.py similarity index 100% rename from erpnext/patches/reload_address.py rename to erpnext/patches/before_jan_2012/reload_address.py diff --git a/erpnext/patches/reload_bom.py b/erpnext/patches/before_jan_2012/reload_bom.py similarity index 100% rename from erpnext/patches/reload_bom.py rename to erpnext/patches/before_jan_2012/reload_bom.py diff --git a/erpnext/patches/reload_doclayer.py b/erpnext/patches/before_jan_2012/reload_doclayer.py similarity index 100% rename from erpnext/patches/reload_doclayer.py rename to erpnext/patches/before_jan_2012/reload_doclayer.py diff --git a/erpnext/patches/reload_email_digest.py b/erpnext/patches/before_jan_2012/reload_email_digest.py similarity index 100% rename from erpnext/patches/reload_email_digest.py rename to erpnext/patches/before_jan_2012/reload_email_digest.py diff --git a/erpnext/patches/reload_employeewise_balance_leave_report.py b/erpnext/patches/before_jan_2012/reload_employeewise_balance_leave_report.py similarity index 100% rename from erpnext/patches/reload_employeewise_balance_leave_report.py rename to erpnext/patches/before_jan_2012/reload_employeewise_balance_leave_report.py diff --git a/erpnext/patches/reload_flat_bom.py b/erpnext/patches/before_jan_2012/reload_flat_bom.py similarity index 100% rename from erpnext/patches/reload_flat_bom.py rename to erpnext/patches/before_jan_2012/reload_flat_bom.py diff --git a/erpnext/patches/reload_gl_mapper.py b/erpnext/patches/before_jan_2012/reload_gl_mapper.py similarity index 100% rename from erpnext/patches/reload_gl_mapper.py rename to erpnext/patches/before_jan_2012/reload_gl_mapper.py diff --git a/erpnext/patches/reload_lc_wizard.py b/erpnext/patches/before_jan_2012/reload_lc_wizard.py similarity index 100% rename from erpnext/patches/reload_lc_wizard.py rename to erpnext/patches/before_jan_2012/reload_lc_wizard.py diff --git a/erpnext/patches/reload_print_format.py b/erpnext/patches/before_jan_2012/reload_print_format.py similarity index 100% rename from erpnext/patches/reload_print_format.py rename to erpnext/patches/before_jan_2012/reload_print_format.py diff --git a/erpnext/patches/reload_project_task.py b/erpnext/patches/before_jan_2012/reload_project_task.py similarity index 100% rename from erpnext/patches/reload_project_task.py rename to erpnext/patches/before_jan_2012/reload_project_task.py diff --git a/erpnext/patches/reload_reco.py b/erpnext/patches/before_jan_2012/reload_reco.py similarity index 100% rename from erpnext/patches/reload_reco.py rename to erpnext/patches/before_jan_2012/reload_reco.py diff --git a/erpnext/patches/reload_rv.py b/erpnext/patches/before_jan_2012/reload_rv.py similarity index 100% rename from erpnext/patches/reload_rv.py rename to erpnext/patches/before_jan_2012/reload_rv.py diff --git a/erpnext/patches/reload_support_ticket.py b/erpnext/patches/before_jan_2012/reload_support_ticket.py similarity index 100% rename from erpnext/patches/reload_support_ticket.py rename to erpnext/patches/before_jan_2012/reload_support_ticket.py diff --git a/erpnext/patches/remove_duplicate_table_mapper_detail.py b/erpnext/patches/before_jan_2012/remove_duplicate_table_mapper_detail.py similarity index 100% rename from erpnext/patches/remove_duplicate_table_mapper_detail.py rename to erpnext/patches/before_jan_2012/remove_duplicate_table_mapper_detail.py diff --git a/erpnext/patches/remove_extra_button_from_email_digest.py b/erpnext/patches/before_jan_2012/remove_extra_button_from_email_digest.py similarity index 100% rename from erpnext/patches/remove_extra_button_from_email_digest.py rename to erpnext/patches/before_jan_2012/remove_extra_button_from_email_digest.py diff --git a/erpnext/patches/remove_old_cp_email_settings.py b/erpnext/patches/before_jan_2012/remove_old_cp_email_settings.py similarity index 100% rename from erpnext/patches/remove_old_cp_email_settings.py rename to erpnext/patches/before_jan_2012/remove_old_cp_email_settings.py diff --git a/erpnext/patches/remove_page_break_from_defaults.py b/erpnext/patches/before_jan_2012/remove_page_break_from_defaults.py similarity index 100% rename from erpnext/patches/remove_page_break_from_defaults.py rename to erpnext/patches/before_jan_2012/remove_page_break_from_defaults.py diff --git a/erpnext/patches/remove_previous_field_property_setter.py b/erpnext/patches/before_jan_2012/remove_previous_field_property_setter.py similarity index 100% rename from erpnext/patches/remove_previous_field_property_setter.py rename to erpnext/patches/before_jan_2012/remove_previous_field_property_setter.py diff --git a/erpnext/patches/repost_account_bal.py b/erpnext/patches/before_jan_2012/repost_account_bal.py similarity index 100% rename from erpnext/patches/repost_account_bal.py rename to erpnext/patches/before_jan_2012/repost_account_bal.py diff --git a/erpnext/patches/repost_stock.py b/erpnext/patches/before_jan_2012/repost_stock.py similarity index 100% rename from erpnext/patches/repost_stock.py rename to erpnext/patches/before_jan_2012/repost_stock.py diff --git a/erpnext/patches/sal_man_patch.py b/erpnext/patches/before_jan_2012/sal_man_patch.py similarity index 100% rename from erpnext/patches/sal_man_patch.py rename to erpnext/patches/before_jan_2012/sal_man_patch.py diff --git a/erpnext/patches/task_email_notification.py b/erpnext/patches/before_jan_2012/task_email_notification.py similarity index 100% rename from erpnext/patches/task_email_notification.py rename to erpnext/patches/before_jan_2012/task_email_notification.py diff --git a/erpnext/patches/update_0_idx.py b/erpnext/patches/before_jan_2012/update_0_idx.py similarity index 100% rename from erpnext/patches/update_0_idx.py rename to erpnext/patches/before_jan_2012/update_0_idx.py diff --git a/erpnext/patches/update_gle_against_voucher_for_jv.py b/erpnext/patches/before_jan_2012/update_gle_against_voucher_for_jv.py similarity index 100% rename from erpnext/patches/update_gle_against_voucher_for_jv.py rename to erpnext/patches/before_jan_2012/update_gle_against_voucher_for_jv.py diff --git a/erpnext/patches/jan_mar_2012/__init__.py b/erpnext/patches/jan_mar_2012/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/patches/jan_mar_2012/print_hide_totals.py b/erpnext/patches/jan_mar_2012/print_hide_totals.py new file mode 100644 index 0000000000..5d1854ddf0 --- /dev/null +++ b/erpnext/patches/jan_mar_2012/print_hide_totals.py @@ -0,0 +1,20 @@ +import webnotes + +def execute(): + """ + To Hide Net Total, Grand Total Export and Rounded Total Export on checking print hide + + Uncheck print_hide for fields: + net_total, grand_total_export and rounded_total_export + For DocType(s): + * Receivable Voucher + * Sales Order + * Delivery Note + * Quotation + """ + webnotes.conn.sql("""\ + UPDATE tabDocField + SET print_hide = 0 + WHERE fieldname IN ('net_total', 'grand_total_export', 'rounded_total_export') + AND parent IN ('Receivable Voucher', 'Sales Order', 'Delivery Note', 'Quotation') + """) diff --git a/erpnext/patches/jan_mar_2012/stable_branch_shift_09_01_12.py b/erpnext/patches/jan_mar_2012/stable_branch_shift_09_01_12.py new file mode 100644 index 0000000000..bd8641172a --- /dev/null +++ b/erpnext/patches/jan_mar_2012/stable_branch_shift_09_01_12.py @@ -0,0 +1,38 @@ +import webnotes +from webnotes.modules.module_manager import reload_doc + +def execute(): + """ + * Reload RV Tax Detail + * Reload Support Ticket + * Run Install Print Format Patch + * Reload DocLayer + """ + reload_doc('accounts', 'doctype', 'rv_tax_detail') + reload_doc('support', 'doctype', 'support_ticket') + reload_print_formats() + reload_doc('core', 'doctype', 'doclayer') + +def reload_print_formats(): + """ + Reloads the following print formats: + * Sales Invoice Classic/Modern/Spartan + * Sales Order Classic/Modern/Spartan + * Delivery Note Classic/Modern/Spartan + * Quotation Classic/Modern/Spartan + """ + reload_doc('accounts', 'Print Format', 'Sales Invoice Classic') + reload_doc('accounts', 'Print Format', 'Sales Invoice Modern') + reload_doc('accounts', 'Print Format', 'Sales Invoice Spartan') + + reload_doc('selling', 'Print Format', 'Sales Order Classic') + reload_doc('selling', 'Print Format', 'Sales Order Modern') + reload_doc('selling', 'Print Format', 'Sales Order Spartan') + + reload_doc('selling', 'Print Format', 'Quotation Classic') + reload_doc('selling', 'Print Format', 'Quotation Modern') + reload_doc('selling', 'Print Format', 'Quotation Spartan') + + reload_doc('stock', 'Print Format', 'Delivery Note Classic') + reload_doc('stock', 'Print Format', 'Delivery Note Modern') + reload_doc('stock', 'Print Format', 'Delivery Note Spartan') diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py index 80f1cc1df0..78e0e9adfb 100644 --- a/erpnext/patches/patch_list.py +++ b/erpnext/patches/patch_list.py @@ -7,5 +7,15 @@ patch_list = [ 'patch_module': 'patches', 'patch_file': 'reload_project_task', 'description': 'Reload doctype task of project module' + }, + { + 'patch_module': 'patches.jan_mar_2012', + 'patch_file': 'stable_branch_shift_09_01_12', + 'description': 'Various Reloads for shifting branch from master to stable' + }, + { + 'patch_module': 'patches.jan_mar_2012', + 'patch_file': 'print_hide_totals', + 'description': 'Uncheck print_hide for RV, SO, DN and Quotation' } ] diff --git a/erpnext/selling/doctype/quotation/quotation.txt b/erpnext/selling/doctype/quotation/quotation.txt index ac58dc4db9..d1054bfcc2 100644 --- a/erpnext/selling/doctype/quotation/quotation.txt +++ b/erpnext/selling/doctype/quotation/quotation.txt @@ -5,7 +5,7 @@ { 'creation': '2010-08-08 17:09:17', 'docstatus': 0, - 'modified': '2011-12-22 19:03:04', + 'modified': '2012-01-09 16:52:51', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -21,7 +21,7 @@ # These values are common for all DocType { - '_last_update': '1322549700', + '_last_update': '1325570646', 'allow_attach': 1, 'allow_email': 0, 'allow_trash': 1, @@ -41,7 +41,7 @@ 'show_in_menu': 0, 'subject': 'To %(customer_name)s on %(transaction_date)s worth %(currency)s %(grand_total_export)s', 'tag_fields': 'status', - 'version': 598 + 'version': 599 }, # These values are common for all DocFormat @@ -703,7 +703,7 @@ 'oldfieldname': 'net_total', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 0, 'width': '100px' }, @@ -902,7 +902,7 @@ 'oldfieldname': 'grand_total_export', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 0, 'width': '200px' }, @@ -917,7 +917,7 @@ 'oldfieldname': 'rounded_total_export', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 0, 'width': '200px' }, diff --git a/erpnext/selling/doctype/sales_order/sales_order.txt b/erpnext/selling/doctype/sales_order/sales_order.txt index 2e6ea99966..0ff3ee049f 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.txt +++ b/erpnext/selling/doctype/sales_order/sales_order.txt @@ -5,7 +5,7 @@ { 'creation': '2010-08-08 17:09:21', 'docstatus': 0, - 'modified': '2011-12-22 19:03:25', + 'modified': '2012-01-09 16:52:34', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -21,7 +21,7 @@ # These values are common for all DocType { - '_last_update': '1324295218', + '_last_update': '1325570646', 'allow_attach': 0, 'colour': 'White:FFF', 'default_print_format': 'Standard', @@ -38,7 +38,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': 609 + 'version': 610 }, # These values are common for all DocFormat @@ -771,7 +771,7 @@ 'oldfieldname': 'net_total', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 0, 'width': '150px' }, @@ -951,7 +951,7 @@ 'oldfieldname': 'grand_total_export', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 0, 'width': '150px' }, @@ -965,7 +965,7 @@ 'oldfieldname': 'rounded_total_export', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'width': '150px' }, diff --git a/erpnext/setup/doctype/other_charges/other_charges.js b/erpnext/setup/doctype/other_charges/other_charges.js index ddc9755254..9be3e2d577 100644 --- a/erpnext/setup/doctype/other_charges/other_charges.js +++ b/erpnext/setup/doctype/other_charges/other_charges.js @@ -8,50 +8,80 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) { }*/ // For customizing print +cur_frm.pformat.net_total = function(doc) { + return ''; +} + +cur_frm.pformat.grand_total_export = function(doc) { + return ''; +} + +cur_frm.pformat.round_total_export = function(doc) { + return ''; +} cur_frm.pformat.other_charges= function(doc){ //function to make row of table - var make_row = function(title,val,bold){ - var bstart = ''; var bend = ''; - return '

'+(bold?bstart:'')+title+(bold?bend:'')+''+doc.currency+''+val+'
'+(bold?bstart:'')+title+(bold?bend:'')+''+doc.currency+''+val+'
'; - - // main table - out +=''+make_row('Net Total',fmt_money(convert_rate(doc.net_total)),1); + var cl = getchildren('RV Tax Detail',doc.name,'other_charges'); - // add rows - if(cl.length){ - for(var i=0;i' - } - out +='
'; - } - return out; + // outer table + var out='
'; + + // main table + + out +=''; + if(!print_hide_dict['net_total']) { + out +=make_row('Net Total',fmt_money(convert_rate(doc.net_total)),1); + } + + // add rows + if(cl.length){ + for(var i=0;i' + } + out +='
'; + } + return out; } cur_frm.cscript.charge_type = function(doc, cdt, cdn) { diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.txt b/erpnext/stock/doctype/delivery_note/delivery_note.txt index 5340955e67..3078bf6ff2 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.txt +++ b/erpnext/stock/doctype/delivery_note/delivery_note.txt @@ -5,7 +5,7 @@ { 'creation': '2011-04-18 15:58:20', 'docstatus': 0, - 'modified': '2011-12-22 19:03:44', + 'modified': '2012-01-09 16:52:43', 'modified_by': 'Administrator', 'owner': 'Administrator' }, @@ -21,7 +21,7 @@ # These values are common for all DocType { - '_last_update': '1324367019', + '_last_update': '1326105502', 'colour': 'White:FFF', 'default_print_format': 'Standard', 'doctype': 'DocType', @@ -37,7 +37,7 @@ 'show_in_menu': 0, 'subject': 'To %(customer_name)s on %(transaction_date)s | %(per_billed)s% billed', 'tag_fields': 'billing_status', - 'version': 460 + 'version': 463 }, # These values are common for all DocFormat @@ -703,7 +703,7 @@ 'oldfieldname': 'net_total', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 0, 'width': '150px' }, @@ -885,7 +885,7 @@ 'oldfieldname': 'grand_total_export', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'reqd': 0, 'width': '150px' }, @@ -900,7 +900,7 @@ 'oldfieldname': 'rounded_total_export', 'oldfieldtype': 'Currency', 'permlevel': 1, - 'print_hide': 1, + 'print_hide': 0, 'width': '150px' }, diff --git a/index.html b/index.html index 8c95f87dec..1edfd89f20 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ ERPNext -