diff --git a/erpnext/accounts/doctype/account/account.js b/erpnext/accounts/doctype/account/account.js index 162eeaf7947..75cc9e5fe2f 100644 --- a/erpnext/accounts/doctype/account/account.js +++ b/erpnext/accounts/doctype/account/account.js @@ -30,12 +30,12 @@ cur_frm.cscript.set_breadcrumbs = function(barea) { // Refresh // ----------------------------------------- cur_frm.cscript.refresh = function(doc, cdt, cdn) { + cur_frm.toggle_fields('account_name', doc.__islocal); + // hide fields if group cur_frm.toggle_fields(['account_type', 'master_type', 'master_name', 'freeze_account', 'credit_days', 'credit_limit', 'tax_rate'], doc.group_or_ledger=='Ledger') - cur_frm.toggle_fields('account_name', doc.__islocal) - // read-only for root accounts root_acc = ['Application of Funds (Assets)','Expenses','Income','Source of Funds (Liabilities)']; if(in_list(root_acc, doc.account_name)) { diff --git a/erpnext/accounts/doctype/cost_center/cost_center.js b/erpnext/accounts/doctype/cost_center/cost_center.js index 9b6670454ca..c131081a39c 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.js +++ b/erpnext/accounts/doctype/cost_center/cost_center.js @@ -34,9 +34,9 @@ cur_frm.cscript.set_breadcrumbs = function(barea) { } cur_frm.cscript.refresh = function(doc, cdt, cdn) { - cur_frm.toggle_fields('cost_center_name', doc.__islocal) - var intro_txt = ''; + cur_frm.toggle_fields('cost_center_name', doc.__islocal); + if(!doc.__islocal && doc.group_or_ledger=='Group') { intro_txt += '

Note: This is Cost Center is a Group, \ Accounting Entries are not allowed against groups.

'; diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.js b/erpnext/accounts/doctype/fiscal_year/fiscal_year.js index f263ee4cfe7..d60e4ecc419 100644 --- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.js +++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.js @@ -1,4 +1,3 @@ cur_frm.cscript.refresh = function(doc, dt, dn) { - cur_frm.toggle_fields('year', doc.__islocal); cur_frm.enable_fields('year_start_date', doc.__islocal) } diff --git a/erpnext/setup/doctype/price_list/price_list.js b/erpnext/setup/doctype/price_list/price_list.js index a222a65f08f..11993f8c3b1 100644 --- a/erpnext/setup/doctype/price_list/price_list.js +++ b/erpnext/setup/doctype/price_list/price_list.js @@ -14,24 +14,34 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . - -//--------- ONLOAD ------------- -cur_frm.cscript.onload = function(doc, cdt, cdn) { -} - cur_frm.cscript.refresh = function(doc, cdt, cdn) { if(doc.__islocal) { - set_field_options('price_help', ''); return; + cur_frm.set_intro("Save this list to begin."); + return; } if(!doc.file_list) { - set_field_options('price_help', '
To upload a price list, please attach a (.csv) file with 3 columns - Item Code, Price and Currency (no headings necessary). See attachments box in the right column
') - } else { - set_field_options('price_help', '
To update prices from the attachment, please click on "Update Prices"
') - } -} + cur_frm.set_intro('

1. Click on "Download Template" \ + to download the template of all Items.

' + +'

2. Update prices and Currency.

' + +'

3. Save it as a CSV (.csv) file.

' + +'

4. Upload the file.

'); + + cur_frm.add_custom_button('Download Template', function() { + $c_obj_csv(cur_frm.get_doclist(), 'download_template'); + }, 'icon-download') + + cur_frm.add_custom_button('Upload Price List', function() { + cur_frm.attachments.add_attachment(); + }, 'icon-upload') + -cur_frm.cscript.clear_prices = function(doc, cdt, cdn) { - if(confirm("This action will clear all rates for '"+ doc.name +"' from the Item Master and cannot be un-done. Are you sure you want to continue?")) { - $c_obj(make_doclist(doc.doctype, doc.name), 'clear_prices', '', function(r, rt) { }); + } else { + cur_frm.set_intro('To update prices from the attachment, click on "Update Prices". \ + To reset prices, delete the attachment (in the sidebar) and upload again.'); + + // Update Prices + cur_frm.add_custom_button('Update Prices', function() { + cur_frm.call_server('update_prices'); + }, 'icon-refresh') } } diff --git a/erpnext/setup/doctype/price_list/price_list.py b/erpnext/setup/doctype/price_list/price_list.py index be59c658163..69b87a532b2 100644 --- a/erpnext/setup/doctype/price_list/price_list.py +++ b/erpnext/setup/doctype/price_list/price_list.py @@ -14,23 +14,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Please edit this list and import only required elements import webnotes -from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add -from webnotes.model import db_exists -from webnotes.model.doc import Document, addchild, getchildren, make_autoname -from webnotes.model.doclist import getlist, copy_doclist -from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax -from webnotes import session, form, is_testing, msgprint, errprint - -set = webnotes.conn.set -sql = webnotes.conn.sql -get_value = webnotes.conn.get_value -in_transaction = webnotes.conn.in_transaction -convert_to_lists = webnotes.conn.convert_to_lists - -# ----------------------------------------------------------------------------------------- +from webnotes.model.doc import Document +from webnotes import msgprint class DocType: @@ -43,11 +30,25 @@ class DocType: if currency in self.cl: return 1 - if sql("select name from tabCurrency where name=%s", currency): + if webnotes.conn.sql("select name from tabCurrency where name=%s", currency): self.cl.append(currency) return 1 else: return 0 + + def download_template(self, arg=None): + """download 3 column template with all Items""" + default_currency = webnotes.conn.get_default('currency') + item_list = webnotes.conn.sql("""select name from tabItem where + ifnull(is_stock_item,'')='Yes' and (ifnull(is_sales_item,'')='Yes' + or ifnull(is_service_item,'')='Yes')""") + data = [self.get_price(i[0], default_currency) for i in item_list] + return [['Item', 'Rate', 'Currency']] + data + + def get_price(self, item, default_currency): + rate = webnotes.conn.sql("""select ref_rate, ref_currency from `tabItem Price` + where parent=%s and price_list_name=%s""", (item, self.doc.name)) + return [item, rate and rate[0][0] or 0, rate and rate[0][1] or default_currency] # update prices in Price List def update_prices(self): @@ -57,15 +58,15 @@ class DocType: updated = 0 for line in data: - if line and len(line)==3: + if line and len(line)==3 and line[0]!='Item': # if item exists - if sql("select name from tabItem where name=%s", line[0]): + if webnotes.conn.sql("select name from tabItem where name=%s", line[0]): if self.is_currency_valid(line[2]): # if price exists - ref_ret_detail = sql("select name from `tabItem Price` where parent=%s and price_list_name=%s and ref_currency=%s", \ + ref_ret_detail = webnotes.conn.sql("select name from `tabItem Price` where parent=%s and price_list_name=%s and ref_currency=%s", \ (line[0], self.doc.name, line[2])) if ref_ret_detail: - sql("update `tabItem Price` set ref_rate=%s where name=%s", (line[1], ref_ret_detail[0][0])) + webnotes.conn.sql("update `tabItem Price` set ref_rate=%s where name=%s", (line[1], ref_ret_detail[0][0])) else: d = Document('Item Price') d.parent = line[0] @@ -80,17 +81,9 @@ class DocType: msgprint("[Ignored] Unknown currency '%s' for Item '%s'" % (line[2], line[0])) else: msgprint("[Ignored] Did not find Item '%s'" % line[1]) - else: - msgprint("[Ignored] Incorrect format: %s" % str(line)) msgprint("%s items updated" % updated) - # clear prices - def clear_prices(self): - cnt = sql("select count(*) from `tabItem Price` where price_list_name = %s", self.doc.name) - sql("delete from `tabItem Price` where price_list_name = %s", self.doc.name) - msgprint("%s prices cleared" % cnt[0][0]) - # Update CSV data def get_csv_data(self): if not self.doc.file_list: @@ -99,8 +92,12 @@ class DocType: fid = self.doc.file_list.split(',')[1] - from webnotes.utils import file_manager - fn, content = file_manager.get_file(fid) + try: + from webnotes.utils import file_manager + fn, content = file_manager.get_file(fid) + except Exception, e: + webnotes.msgprint("Unable to open attached file. Please try again.") + raise e # NOTE: Don't know why this condition exists if not isinstance(content, basestring) and hasattr(content, 'tostring'): diff --git a/erpnext/setup/doctype/price_list/price_list.txt b/erpnext/setup/doctype/price_list/price_list.txt index 2881cd7122d..4aa3b3b0032 100644 --- a/erpnext/setup/doctype/price_list/price_list.txt +++ b/erpnext/setup/doctype/price_list/price_list.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2012-05-15 12:15:02', + 'creation': '2012-07-03 13:30:55', 'docstatus': 0, - 'modified': '2012-06-22 10:51:23', + 'modified': '2012-07-11 17:06:32', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -14,6 +14,9 @@ { '_last_update': u'1303100817', 'allow_attach': 1, + 'allow_copy': 1, + 'allow_email': 1, + 'allow_print': 1, 'allow_trash': 1, 'autoname': u'field:price_list_name', 'colour': u'White:FFF', @@ -34,7 +37,8 @@ 'name': '__common__', 'parent': u'Price List', 'parentfield': u'fields', - 'parenttype': u'DocType' + 'parenttype': u'DocType', + 'permlevel': 0 }, # These values are common for all DocPerm @@ -105,17 +109,6 @@ 'write': 1 }, - # DocField - { - 'doctype': u'DocField', - 'fieldname': u'trash_reason', - 'fieldtype': u'Small Text', - 'label': u'Trash Reason', - 'oldfieldname': u'trash_reason', - 'oldfieldtype': u'Small Text', - 'permlevel': 1 - }, - # DocField { 'doctype': u'DocField', @@ -124,55 +117,15 @@ 'label': u'Price List Name', 'oldfieldname': u'price_list_name', 'oldfieldtype': u'Data', - 'permlevel': 0, 'reqd': 1 }, - # DocField - { - 'colour': u'White:FFF', - 'depends_on': u'eval:!doc.__islocal', - 'doctype': u'DocField', - 'fieldname': u'price_help', - 'fieldtype': u'HTML', - 'label': u'Price Help', - 'permlevel': 0 - }, - - # DocField - { - 'colour': u'White:FFF', - 'depends_on': u'eval:!doc.__islocal', - 'description': u'Click on this button to clear prices for this list in all items', - 'doctype': u'DocField', - 'fieldname': u'clear_prices', - 'fieldtype': u'Button', - 'label': u'Clear Prices', - 'permlevel': 0, - 'trigger': u'Client' - }, - # DocField { 'doctype': u'DocField', 'fieldname': u'file_list', 'fieldtype': u'Text', 'hidden': 1, - 'label': u'File List', - 'permlevel': 0 - }, - - # DocField - { - 'colour': u'White:FFF', - 'depends_on': u'eval:!doc.__islocal', - 'description': u'Update prices from the attachment', - 'doctype': u'DocField', - 'fieldname': u'update_prices', - 'fieldtype': u'Button', - 'label': u'Update Prices', - 'options': u'update_prices', - 'permlevel': 0, - 'trigger': u'Server' + 'label': u'File List' } ] \ No newline at end of file diff --git a/public/js/all-app.js b/public/js/all-app.js index e634cf3fcae..8732fddfef6 100644 --- a/public/js/all-app.js +++ b/public/js/all-app.js @@ -397,8 +397,8 @@ return;} if(r.server_messages)msgprint(r.server_messages) if(r.exc){console.log(r.exc);};if(r['403']){wn.container.change_to('403');} if(r.docs){LocalDB.sync(r.docs);}} -wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus) -if(opts.error)opts.error(xhr)}})} +wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success&&opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus) +opts.error&&opts.error(xhr)}})} wn.call=function(opts){var args=$.extend({},opts.args) if(opts.module&&opts.page){args.cmd=opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method}else if(opts.method){args.cmd=opts.method;} for(key in args){if(args[key]&&typeof args[key]!='string'){args[key]=JSON.stringify(args[key]);}} @@ -1794,7 +1794,7 @@ $.each(this.sections,function(i,f){f.refresh(true);}) this.cleanup_refresh(this);} _f.Frm.prototype.cleanup_refresh=function(){var me=this;if(me.fields_dict['amended_from']){if(me.doc.amended_from){unhide_field('amended_from');unhide_field('amendment_date');}else{hide_field('amended_from');hide_field('amendment_date');}} if(me.fields_dict['trash_reason']){if(me.doc.trash_reason&&me.doc.docstatus==2){unhide_field('trash_reason');}else{hide_field('trash_reason');}} -if(me.meta.autoname&&me.meta.autoname.substr(0,6)=='field:'&&!me.doc.__islocal){var fn=me.meta.autoname.substr(6);set_field_permlevel(fn,1);}} +if(me.meta.autoname&&me.meta.autoname.substr(0,6)=='field:'&&!me.doc.__islocal){var fn=me.meta.autoname.substr(6);cur_frm.toggle_fields(fn,false);}} _f.Frm.prototype.refresh_dependency=function(){var me=this;var doc=locals[this.doctype][this.docname];var dep_dict={};var has_dep=false;for(fkey in me.fields){var f=me.fields[fkey];f.dependencies_clear=true;var guardian=f.df.depends_on;if(guardian){if(!dep_dict[guardian]) dep_dict[guardian]=[];dep_dict[guardian][dep_dict[guardian].length]=f;has_dep=true;}} if(!has_dep)return;for(var i=me.fields.length-1;i>=0;i--){var f=me.fields[i];f.guardian_has_value=true;if(f.df.depends_on){var v=doc[f.df.depends_on];if(f.df.depends_on.substr(0,5)=='eval:'){f.guardian_has_value=eval(f.df.depends_on.substr(5));}else if(f.df.depends_on.substr(0,3)=='fn:'){f.guardian_has_value=me.runclientscript(f.df.depends_on.substr(3),me.doctype,me.docname);}else{if(v||(v==0&&!v.substr)){}else{f.guardian_has_value=false;}} @@ -1858,6 +1858,7 @@ _f.Frm.prototype.get_doclist=function(){return make_doclist(this.doctype,this.do _f.Frm.prototype.toggle_fields=function(fields,show){if(show){unhide_field(fields)} else{hide_field(fields)}} _f.Frm.prototype.enable_fields=function(fields,enable){if(typeof fields=='string')fields=[fields];$.each(fields,function(i,f){var field=cur_frm.fields_dict[f];if(field){field.disabled=enable?false:true;field.refresh&&field.refresh();};})} +_f.Frm.prototype.call_server=function(method,args,callback){$c_obj(cur_frm.get_doclist(),method,args,callback);} /* * lib/js/legacy/widgets/form/form_fields.js */ diff --git a/public/js/all-web.js b/public/js/all-web.js index 2e7f1cee36f..ec171ad98f5 100644 --- a/public/js/all-web.js +++ b/public/js/all-web.js @@ -284,8 +284,8 @@ return;} if(r.server_messages)msgprint(r.server_messages) if(r.exc){console.log(r.exc);};if(r['403']){wn.container.change_to('403');} if(r.docs){LocalDB.sync(r.docs);}} -wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus) -if(opts.error)opts.error(xhr)}})} +wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success&&opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus) +opts.error&&opts.error(xhr)}})} wn.call=function(opts){var args=$.extend({},opts.args) if(opts.module&&opts.page){args.cmd=opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method}else if(opts.method){args.cmd=opts.method;} for(key in args){if(args[key]&&typeof args[key]!='string'){args[key]=JSON.stringify(args[key]);}}