Merge branch 'master' of github.com:webnotes/erpnext into unicode

Conflicts:
	erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
	public/js/all-app.js
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 4563532..9e0a4eb 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -78,35 +78,32 @@
 	'source', 'cancel_reason', 'total_advance', 'gross_profit',
 	'gross_profit_percent', 'get_advances_received',
 	'advance_adjustment_details', 'sales_partner', 'commission_rate',
-	'total_commission'];
+	'total_commission', 'advances'];
 	
 	item_flds_normal = ['sales_order', 'delivery_note']
 	item_flds_pos = ['warehouse', 'serial_no', 'batch_no', 'actual_qty', 'delivered_qty']
 	
 	if(cint(doc.is_pos) == 1) {
 		hide_field(par_flds);
-		$(cur_frm.fields_dict.payments_section.row.wrapper).toggle(true);
-		$(cur_frm.fields_dict.advances.row.wrapper).toggle(false);
+		unhide_field('payments_section');
 		for(f in item_flds_normal) cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_normal[f], false);
 		for(f in item_flds_pos) cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_pos[f], (doc.update_stock==1?true:false));
 	} else {
+		hide_field('payments_section');
 		unhide_field(par_flds);
-		$(cur_frm.fields_dict.payments_section.row.wrapper).toggle(false);
-		$(cur_frm.fields_dict.advances.row.wrapper).toggle(true);
 		for(f in item_flds_normal) cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_normal[f], true);
 		for(f in item_flds_pos) cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_pos[f], false);
 	}
-	if (doc.docstatus==1) $(cur_frm.fields_dict.recurring_invoice.row.wrapper).toggle(true);
-	else $(cur_frm.fields_dict.recurring_invoice.row.wrapper).toggle(false);
+	if (doc.docstatus==1) unhide_field('recurring_invoice');
+	else hide_field('recurring_invoice');
 
-	if(doc.customer) $(cur_frm.fields_dict.contact_section.row.wrapper).toggle(true);
-	else $(cur_frm.fields_dict.contact_section.row.wrapper).toggle(false);
+	if(doc.customer) unhide_field('contact_section');
+	else hide_field('contact_section');
 
 	// India related fields
 	var cp = wn.control_panel;
 	if (cp.country == 'India') unhide_field(['c_form_applicable', 'c_form_no']);
 	else hide_field(['c_form_applicable', 'c_form_no']);
-
 }
 
 
@@ -114,7 +111,6 @@
 // -------
 cur_frm.cscript.refresh = function(doc, dt, dn) {
 	cur_frm.cscript.is_opening(doc, dt, dn);
-	cur_frm.cscript.hide_fields(doc, dt, dn);
 	erpnext.hide_naming_series();
 
 	// Show / Hide button
@@ -131,6 +127,8 @@
 		if(doc.outstanding_amount!=0)
 			cur_frm.add_custom_button('Make Payment Entry', cur_frm.cscript.make_bank_voucher);
 	}
+	cur_frm.cscript.hide_fields(doc, dt, dn);
+	
 }
 
 //fetch retail transaction related fields
@@ -191,7 +189,7 @@
 	var args = onload ? 'onload':''
 	if(doc.customer) $c_obj(make_doclist(doc.doctype, doc.name), 'get_default_customer_address', args, callback);
 
-	if(doc.customer) unhide_field(['customer_address','contact_person', 'territory','customer_group']);
+	if(doc.customer) unhide_field('contact_section');
 	
 }
 
@@ -231,7 +229,7 @@
 	var callback = function(r,rt) {
 			var doc = locals[cur_frm.doctype][cur_frm.docname];
 			if(doc.customer) $c_obj(make_doclist(dt,dn), 'get_default_customer_address', '', callback2);
-			if(doc.customer) unhide_field(['customer_address','contact_person','territory','customer_group']);
+			if(doc.customer) unhide_field('contact_section');
 			cur_frm.refresh();
 	}
 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
index b1368d1..ad92d22 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-07-13 11:57:13',
+		'creation': '2012-07-18 16:02:44',
 		'docstatus': 0,
-		'modified': '2012-07-16 16:25:11',
+		'modified': '2012-09-07 11:56:59',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -55,6 +55,66 @@
 		'name': u'Sales Invoice'
 	},
 
+	# DocPerm
+	{
+		'amend': 0,
+		'cancel': 0,
+		'create': 0,
+		'doctype': u'DocPerm',
+		'permlevel': 1,
+		'role': u'Accounts Manager',
+		'submit': 0,
+		'write': 0
+	},
+
+	# DocPerm
+	{
+		'amend': 1,
+		'cancel': 1,
+		'create': 1,
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'Accounts Manager',
+		'submit': 1,
+		'write': 1
+	},
+
+	# DocPerm
+	{
+		'amend': 1,
+		'cancel': 1,
+		'create': 1,
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'Accounts User',
+		'submit': 1,
+		'write': 1
+	},
+
+	# DocPerm
+	{
+		'amend': 0,
+		'cancel': 0,
+		'create': 0,
+		'doctype': u'DocPerm',
+		'permlevel': 1,
+		'role': u'Accounts User',
+		'submit': 0,
+		'write': 0
+	},
+
+	# DocPerm
+	{
+		'amend': 0,
+		'cancel': 0,
+		'create': 0,
+		'doctype': u'DocPerm',
+		'permlevel': 0,
+		'role': u'Customer',
+		'submit': 0,
+		'write': 0
+	},
+
 	# DocField
 	{
 		'doctype': u'DocField',
@@ -812,7 +872,7 @@
 		'doctype': u'DocField',
 		'fieldname': u'write_off_outstanding_amount_automatically',
 		'fieldtype': u'Check',
-		'label': u'Write Off Outstanding Amount Automatically',
+		'label': u'Write Off Outstanding Amount',
 		'permlevel': 0,
 		'print_hide': 1
 	},
@@ -1487,6 +1547,7 @@
 	# DocField
 	{
 		'allow_on_submit': 1,
+		'colour': u'White:FFF',
 		'depends_on': u'eval:doc.convert_into_recurring_invoice==1',
 		'description': u'Start date of the invoice period',
 		'doctype': u'DocField',
diff --git a/erpnext/patches/august_2012/reload_stock_ledger.py b/erpnext/patches/august_2012/reload_stock_ledger.py
new file mode 100644
index 0000000..d0ec9ee
--- /dev/null
+++ b/erpnext/patches/august_2012/reload_stock_ledger.py
@@ -0,0 +1,4 @@
+def execute():
+	import webnotes
+	from webnotes.modules import reload_doc
+	reload_doc('stock', 'Report', 'Stock Ledger')
\ No newline at end of file
diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py
index 64c190f..1eaa757 100644
--- a/erpnext/patches/patch_list.py
+++ b/erpnext/patches/patch_list.py
@@ -565,4 +565,12 @@
 		'patch_module': 'patches.august_2012',
 		'patch_file': 'remove_cash_flow_statement',
 	},
-]
\ No newline at end of file
+	{
+		'patch_module': 'patches.august_2012',
+		'patch_file': 'reload_stock_ledger',
+	},
+	{
+		'patch_module': 'patches.september_2012',
+		'patch_file': 'stock_report_permissions_for_accounts',
+	},
+]
diff --git a/erpnext/patches/september_2012/__init__.py b/erpnext/patches/september_2012/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/patches/september_2012/__init__.py
diff --git a/erpnext/patches/september_2012/stock_report_permissions_for_accounts.py b/erpnext/patches/september_2012/stock_report_permissions_for_accounts.py
new file mode 100644
index 0000000..26af06b
--- /dev/null
+++ b/erpnext/patches/september_2012/stock_report_permissions_for_accounts.py
@@ -0,0 +1,17 @@
+def execute():
+	import webnotes
+	from webnotes.model.doc import addchild
+	from webnotes.model.code import get_obj
+	
+	for parent in ("Stock Ledger Entry", "Bin"):
+		existing = webnotes.conn.sql("""select role from `tabDocPerm`
+			where permlevel=0 and parent=%s""", (parent,))
+	
+		if "Accounts Manager" not in map(lambda x: x[0], existing):
+			doctype_obj = get_obj("DocType", parent, with_children=1)
+			ch = addchild(doctype_obj.doc, "permissions", "DocPerm")
+			ch.permlevel = 0
+			ch.role = "Accounts Manager"
+			ch.read = 1
+			ch.save()
+		
\ No newline at end of file
diff --git a/erpnext/stock/Report/Stock Ledger/Stock Ledger.txt b/erpnext/stock/Report/Stock Ledger/Stock Ledger.txt
new file mode 100644
index 0000000..d0c5184
--- /dev/null
+++ b/erpnext/stock/Report/Stock Ledger/Stock Ledger.txt
@@ -0,0 +1,26 @@
+# Report, Stock Ledger
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-09-06 18:47:05',
+		'docstatus': 0,
+		'modified': '2012-09-06 18:48:22',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
+	},
+
+	# These values are common for all Report
+	{
+		'doctype': 'Report',
+		'json': u'{"filters":[["Stock Ledger Entry","is_cancelled","=","No"]],"columns":[["item_code","Stock Ledger Entry"],["warehouse","Stock Ledger Entry"],["posting_date","Stock Ledger Entry"],["posting_time","Stock Ledger Entry"],["actual_qty","Stock Ledger Entry"],["bin_aqat","Stock Ledger Entry"],["voucher_type","Stock Ledger Entry"],["voucher_no","Stock Ledger Entry"]],"sort_by":"Stock Ledger Entry.posting_date","sort_order":"desc","sort_by_next":"Stock Ledger Entry.posting_time","sort_order_next":"desc"}',
+		'name': '__common__',
+		'ref_doctype': u'Stock Ledger Entry'
+	},
+
+	# Report, Stock Ledger
+	{
+		'doctype': 'Report',
+		'name': u'Stock Ledger'
+	}
+]
\ No newline at end of file
diff --git a/erpnext/utilities/page/todo/todo.py b/erpnext/utilities/page/todo/todo.py
index 37f9295..f0de04e 100644
--- a/erpnext/utilities/page/todo/todo.py
+++ b/erpnext/utilities/page/todo/todo.py
@@ -49,7 +49,7 @@
 def delete(arg=None):
 	name = webnotes.form_dict['name']
 	d = Document('ToDo', name)
-	if d and d.name:
+	if d and d.name and d.owner != webnotes.session['user']:
 		notify_assignment(d)
 	webnotes.conn.sql("delete from `tabToDo` where name = %s", name)
 
diff --git a/public/js/all-app.js b/public/js/all-app.js
index e5fb717..f33df11 100644
--- a/public/js/all-app.js
+++ b/public/js/all-app.js
@@ -1043,9 +1043,8 @@
 wn.views.reportview2={show:function(dt){var page_name=wn.get_route_str();if(wn.pages[page_name]){wn.container.change_to(wn.pages[page_name]);}else{var route=wn.get_route();if(route[1]){new wn.views.ReportViewPage(route[1],route[2]);}else{wn.set_route('404');}}}}
 wn.views.ReportViewPage=Class.extend({init:function(doctype,docname){this.doctype=doctype;this.docname=docname;this.page_name=wn.get_route_str();this.make_page();var me=this;wn.model.with_doctype(doctype,function(){me.make_report_view();if(docname){wn.model.with_doc('Report',docname,function(r){me.reportview.set_columns_and_filters(JSON.parse(locals['Report'][docname].json));me.reportview.run();});}else{me.reportview.run();}});},make_page:function(){this.page=wn.container.add_page(this.page_name);wn.ui.make_app_page({parent:this.page,single_column:true});wn.container.change_to(this.page_name);},make_report_view:function(){this.page.appframe.add_breadcrumb(locals.DocType[this.doctype].module);this.reportview=new wn.views.ReportView(this.doctype,this.docname,this.page)}})
 wn.views.ReportView=wn.ui.Listing.extend({init:function(doctype,docname,page){var me=this;$(page).find('.layout-main').html('Loading Report...');this.import_slickgrid();$(page).find('.layout-main').empty();this.doctype=doctype;this.docname=docname;this.page=page;this.tab_name='`tab'+doctype+'`';this.setup();},import_slickgrid:function(){wn.require('js/lib/slickgrid/slick.grid.css');wn.require('js/lib/slickgrid/slick-default-theme.css');wn.require('js/lib/slickgrid/jquery.event.drag.min.js');wn.require('js/lib/slickgrid/slick.core.js');wn.require('js/lib/slickgrid/slick.grid.js');wn.dom.set_style('.slick-cell { font-size: 12px; }');},set_init_columns:function(){var columns=[['name'],['owner']];$.each(wn.meta.docfield_list[this.doctype],function(i,df){if(df.in_filter&&df.fieldname!='naming_series'&&df.fieldtype!='Table'){columns.push([df.fieldname]);}});this.columns=columns;},setup:function(){var me=this;this.make({title:'Report: '+(this.docname?(this.doctype+' - '+this.docname):this.doctype),appframe:this.page.appframe,method:'webnotes.widgets.doclistview.get',get_args:this.get_args,parent:$(this.page).find('.layout-main'),start:0,page_length:20,show_filters:true,new_doctype:this.doctype,allow_delete:true,});this.make_column_picker();this.make_sorter();this.make_export();this.set_init_columns();this.make_save();},set_columns_and_filters:function(opts){var me=this;if(opts.columns)this.columns=opts.columns;if(opts.filters)$.each(opts.filters,function(i,f){me.filter_list.add_filter(f[0],f[1],f[2],f[3]);});if(opts.sort_by)this.sort_by_select.val(opts.sort_by);if(opts.sort_order)this.sort_order_select.val(opts.sort_order);if(opts.sort_by_next)this.sort_by_next_select.val(opts.sort_by_next);if(opts.sort_order_next)this.sort_order_next_select.val(opts.sort_order_next);},get_args:function(){var me=this;return{doctype:this.doctype,fields:$.map(this.columns,function(v){return me.get_full_column_name(v)}),order_by:this.get_order_by(),filters:this.filter_list.get_filters(),docstatus:['0','1','2']}},get_order_by:function(){var order_by=this.get_selected_table_and_column(this.sort_by_select)
-+' '+this.sort_order_select.val()
-if(this.sort_by_next_select.val()){order_by+=', '+this.get_selected_table_and_column(this.sort_by_next_select)
-+' '+this.sort_order_next_select.attr("fieldname")}
++' '+this.sort_order_select.val();if(this.sort_by_next_select.val()){order_by+=', '+this.get_selected_table_and_column(this.sort_by_next_select)
++' '+this.sort_order_next_select.val();}
 return order_by;},get_selected_table_and_column:function($select){return this.get_full_column_name([$select.find('option:selected').attr('fieldname'),$select.find('option:selected').attr('table')])},get_full_column_name:function(v){return(v[1]?('`tab'+v[1]+'`'):this.tab_name)+'.'+v[0];},build_columns:function(){var me=this;return $.map(this.columns,function(c){var docfield=wn.meta.docfield_map[c[1]||me.doctype][c[0]];coldef={id:c[0],field:c[0],docfield:docfield,name:(docfield?docfield.label:toTitle(c[0])),width:(docfield?cint(docfield.width):120)||120}
 if(c[0]=='name'){coldef.formatter=function(row,cell,value,columnDef,dataContext){return repl("<a href='#!Form/%(doctype)s/%(name)s'>%(name)s</a>",{doctype:me.doctype,name:value});}}else if(docfield&&docfield.fieldtype=='Link'){coldef.formatter=function(row,cell,value,columnDef,dataContext){if(value){return repl("<a href='#!Form/%(doctype)s/%(name)s'>%(name)s</a>",{doctype:columnDef.docfield.options,name:value});}else{return'';}}}
 return coldef;});},render_list:function(){var me=this;var columns=[{id:'_idx',field:'_idx',name:'Sr.',width:40}].concat(this.build_columns());$.each(this.data,function(i,v){v._idx=i+1;});var options={enableCellNavigation:true,enableColumnReorder:false};var grid=new Slick.Grid(this.$w.find('.result-list').css('border','1px solid grey').css('height','500px').get(0),this.data,columns,options);},make_column_picker:function(){var me=this;this.column_picker=new wn.ui.ColumnPicker(this);this.page.appframe.add_button('Pick Columns',function(){me.column_picker.show(me.columns);},'icon-th-list');},make_sorter:function(){var me=this;this.sort_dialog=new wn.ui.Dialog({title:'Sorting Preferences'});$(this.sort_dialog.body).html('<p class="help">Sort By</p>\
@@ -2147,7 +2146,7 @@
 refresh_field=function(n,docname,table_field){if(typeof n==typeof[])refresh_many(n,docname,table_field);if(table_field){if(_f.frm_dialog&&_f.frm_dialog.display){_f.frm_dialog.cur_frm.refresh_field(n);}else{var g=_f.cur_grid_cell;if(g)var hc=g.grid.head_row.cells[g.cellIndex];if(g&&hc&&hc.fieldname==n&&g.row.docname==docname){hc.template.refresh();}else{cur_frm.fields_dict[table_field].grid.refresh_cell(docname,n);}}}else if(cur_frm){cur_frm.refresh_field(n)}}
 set_field_options=function(n,txt){cur_frm.set_df_property(n,'options',txt)}
 set_field_permlevel=function(n,level){cur_frm.set_df_property(n,'permlevel',level)}
-toggle_field=function(n,hidden){var df_obj=get_field_obj(n);var df=Meta.get_field(cur_frm.doctype,n,cur_frm.docname);if(df){if(df_obj.df.fieldtype==="Section Break"){$(df_obj.row.wrapper).toggle(hidden?false:true);}else if(df_obj.df.fieldtype==="Column Break"){$(df_obj.cell.wrapper).toggle(hidden?false:true);}else{df.hidden=hidden;refresh_field(n);}}
+toggle_field=function(n,hidden){var df=Meta.get_field(cur_frm.doctype,n,cur_frm.docname);if(df){df.hidden=hidden;refresh_field(n);}
 else{console.log((hidden?"hide_field":"unhide_field")+" cannot find field "+n);}}
 hide_field=function(n){if(cur_frm){if(n.substr)toggle_field(n,1);else{for(var i in n)toggle_field(n[i],1)}}}
 unhide_field=function(n){if(cur_frm){if(n.substr)toggle_field(n,0);else{for(var i in n)toggle_field(n[i],0)}}}