added voucher import tool
diff --git a/accounts/doctype/lease_agreement/__init__.py b/accounts/doctype/lease_agreement/__init__.py
deleted file mode 100644
index baffc48..0000000
--- a/accounts/doctype/lease_agreement/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from __future__ import unicode_literals
diff --git a/accounts/doctype/lease_agreement/lease_agreement.js b/accounts/doctype/lease_agreement/lease_agreement.js
deleted file mode 100644
index bf0495c..0000000
--- a/accounts/doctype/lease_agreement/lease_agreement.js
+++ /dev/null
@@ -1,94 +0,0 @@
-// ERPNext - web based ERP (http://erpnext.com)
-// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
-// 
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-// 
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// 
-// You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-$.extend(cur_frm.cscript, {
-	Generate: function(doc, dt, dn) {
-		if(doc.installment_amount==''){
-			msgprint('Set Installment Amount before generating schedule');
-			return;
-		}
-		if(doc.no_of_installments==''){
-			msgprint('Set Number of Installments before generating schedule');
-			return;
-		}
-		if(doc.start_date==''){
-			msgprint('Set Start Date before generating schedule');
-			return;
-		}
-		cur_frm.cscript.clear_installments(doc);
-		tot=0;i=0;
-		while(tot<flt(doc.invoice_amount)-flt(doc.down_payment)){
-				d = LocalDB.add_child(doc, 'Lease Installment', 'installments');
-				d.amount = flt(doc.installment_amount) < flt(doc.invoice_amount)-flt(doc.down_payment)-tot ? flt(doc.installment_amount) : flt(doc.invoice_amount)-flt(doc.down_payment)-tot
-				d.due_date = dateutil.add_months(doc.start_date, i+1);
-				tot += flt(doc.installment_amount)
-				i++;
-		}
-		cur_frm.refresh();
-	},
-	refresh: function(doc) {
-		cur_frm.cscript.hide_show_buttons(doc);
-	},
-	hide_show_buttons: function(doc) {
-		if(doc.docstatus==0) {
-			hide_field('installment_reciept'); show_field('generate');
-		} else if (doc.docstatus==1) {
-			show_field('installment_reciept');hide_field('generate');
-		}
-	},
-	clear_installments: function(doc) {
-		$.each(getchildren('Lease Installment', doc.name, 'installments', 'Lease Agreement'),
-			function(i, d) {
-				LocalDB.delete_doc('Lease Installment', d.name);
-			}
-		)
-	},
-	no_of_installments: function(doc)
-	{
-		if(flt(doc.no_of_installments)!=0) {
-			doc.installment_amount = (flt(doc.invoice_amount)- flt(doc.down_payment))/flt(doc.no_of_installments);
-			refresh_field('installment_amount');
-		}
-	},
-	'Installment Reciept': function(doc, dt, dn) {
-		var d = new wn.widgets.Dialog({
-			width: 500,
-			title: 'Add a new payment installment',
-			fields: [
-				{fieldtype:'Data', label:'Cheque Number', fieldname:'cheque_number', reqd:1},
-				{fieldtype:'Date', label:'Cheque Date', fieldname:'cheque_date', reqd:1},
-				{fieldtype:'Link', label:'Bank Account', fieldname:'bank_account', reqd:1, options:'Account'},
-				{fieldtype:'Button', label:'Update',fieldname:'update'}
-			]
-		})
-		d.show();
-		d.fields_dict.update.input.onclick = function() {
-			var data = d.get_values();
-
-			if(data) {
-				$c_obj(make_doclist(dt,dn),'lease_installment_post',data,function(){cur_frm.refresh(); d.hide();});
-			}
-		}
-	}
-})
-
-
-cur_frm.add_fetch('invoice','grand_total','invoice_amount');
-
-cur_frm.fields_dict.invoice.get_query=function(doc){
-
-	return "SELECT tv.name FROM `tabSales Invoice` tv WHERE debit_to='"+doc.account+"' and  tv.%(key)s like '%s' ORDER BY tv.name LIMIT 50"
-}
diff --git a/accounts/doctype/lease_agreement/lease_agreement.py b/accounts/doctype/lease_agreement/lease_agreement.py
deleted file mode 100644
index f5f444c..0000000
--- a/accounts/doctype/lease_agreement/lease_agreement.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# ERPNext - web based ERP (http://erpnext.com)
-# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
-# 
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# 
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-from __future__ import unicode_literals
-import webnotes
-from webnotes.model.doc import make_autoname, Document, addchild
-from webnotes import msgprint
-from webnotes.utils import get_defaults
-import json
-from accounts.utils import post_jv
-sql = webnotes.conn.sql
-
-class DocType:
-	def __init__(self, doc, doclist):
-		self.doc, self.doclist = doc, doclist
-
-	def autoname(self):
-		"""
-			Create Lease Id using naming_series pattern
-		"""
-		self.doc.name = make_autoname(self.doc.naming_series+ '.#####')
-
-	def lease_installment_post(self, args):
-		"""
-			Posts the Installment receipt into Journal Voucher
-		"""
-		next_inst = sql("select amount,name from `tabLease Installment` where parent=%s and ifnull(cheque_number,'')='' order by due_date limit 1",self.doc.name)
-
-		data = json.loads(args)
-		data['voucher_type']='Lease Receipt'
-		data['naming_series']='JV'
-		data['amount']=next_inst[0][0]
-		data['debit_account']=data.get('bank_account')
-		data['credit_account']=self.doc.account
-		data['fiscal_year']=get_defaults()['fiscal_year']
-		data['company']=get_defaults()['company']
-		jv_name=post_jv(data)
-
-		sql("update `tabLease Installment` set cheque_number=%s, cheque_date=%s, jv_number=%s where name=%s",(data.get('cheque_number'),data.get('cheque_date'),jv_name,next_inst[0][1]))
-
-		self.doclist = [Document(d.doctype, d.name) for d in self.doclist]
diff --git a/accounts/doctype/lease_agreement/lease_agreement.txt b/accounts/doctype/lease_agreement/lease_agreement.txt
deleted file mode 100644
index c4f3e12..0000000
--- a/accounts/doctype/lease_agreement/lease_agreement.txt
+++ /dev/null
@@ -1,276 +0,0 @@
-# DocType, Lease Agreement
-[
-
-	# These values are common in all dictionaries
-	{
-		'creation': '2012-03-27 14:35:44',
-		'docstatus': 0,
-		'modified': '2012-03-27 14:35:44',
-		'modified_by': u'Administrator',
-		'owner': u'Administrator'
-	},
-
-	# These values are common for all DocType
-	{
-		'_last_update': u'1311555967',
-		'colour': u'White:FFF',
-		'default_print_format': u'Standard',
-		'doctype': 'DocType',
-		'module': u'Accounts',
-		'name': '__common__',
-		'section_style': u'Simple',
-		'show_in_menu': 0,
-		'version': 24
-	},
-
-	# These values are common for all DocField
-	{
-		'doctype': u'DocField',
-		'name': '__common__',
-		'parent': u'Lease Agreement',
-		'parentfield': u'fields',
-		'parenttype': u'DocType'
-	},
-
-	# These values are common for all DocPerm
-	{
-		'create': 1,
-		'doctype': u'DocPerm',
-		'name': '__common__',
-		'parent': u'Lease Agreement',
-		'parentfield': u'permissions',
-		'parenttype': u'DocType',
-		'read': 1,
-		'role': u'Accounts Manager'
-	},
-
-	# DocType, Lease Agreement
-	{
-		'doctype': 'DocType',
-		'name': u'Lease Agreement'
-	},
-
-	# DocPerm
-	{
-		'amend': 1,
-		'cancel': 1,
-		'doctype': u'DocPerm',
-		'submit': 1,
-		'write': 1
-	},
-
-	# DocPerm
-	{
-		'amend': 0,
-		'cancel': 0,
-		'doctype': u'DocPerm',
-		'submit': 0,
-		'write': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'naming_series',
-		'fieldtype': u'Select',
-		'label': u'Naming Series',
-		'no_copy': 1,
-		'options': u'\nLA',
-		'permlevel': 0,
-		'reqd': 1
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'lessee_info',
-		'fieldtype': u'Section Break',
-		'label': u'Lessee Info.',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'account',
-		'fieldtype': u'Link',
-		'label': u'Account',
-		'options': u'Account',
-		'permlevel': 0,
-		'reqd': 1
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'lessee_father',
-		'fieldtype': u'Data',
-		'label': u'Lessee Father',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'lessee_nic',
-		'fieldtype': u'Data',
-		'label': u'Lessee NIC',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'lessee_contact',
-		'fieldtype': u'Data',
-		'label': u'Lessee Contact',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'lessee_address',
-		'fieldtype': u'Text',
-		'label': u'Lessee Address',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'vehicle_info',
-		'fieldtype': u'Section Break',
-		'label': u'Vehicle Info.',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'model_no',
-		'fieldtype': u'Data',
-		'label': u'Model No',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'engine_no',
-		'fieldtype': u'Data',
-		'label': u'Engine No',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'chassis_no',
-		'fieldtype': u'Data',
-		'label': u'Chassis No',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'invoice_and_payment_info',
-		'fieldtype': u'Section Break',
-		'label': u'Invoice and Payment Info.',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'colour': u'White:FFF',
-		'doctype': u'DocField',
-		'fieldname': u'invoice',
-		'fieldtype': u'Link',
-		'label': u'Invoice',
-		'options': u'Sales Invoice',
-		'permlevel': 0,
-		'reqd': 1,
-		'trigger': u'Client'
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'invoice_amount',
-		'fieldtype': u'Currency',
-		'label': u'Invoice Amount',
-		'permlevel': 1
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'down_payment',
-		'fieldtype': u'Currency',
-		'label': u'Down Payment',
-		'permlevel': 0,
-		'reqd': 1
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'start_date',
-		'fieldtype': u'Date',
-		'label': u'Start Date',
-		'permlevel': 0,
-		'reqd': 1
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'no_of_installments',
-		'fieldtype': u'Int',
-		'label': u'No of Installments',
-		'permlevel': 0,
-		'reqd': 1
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'installment_amount',
-		'fieldtype': u'Currency',
-		'label': u'Installment Amount',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'colour': u'White:FFF',
-		'doctype': u'DocField',
-		'fieldname': u'generate',
-		'fieldtype': u'Button',
-		'label': u'Generate',
-		'permlevel': 0,
-		'trigger': u'Client'
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'installments',
-		'fieldtype': u'Table',
-		'label': u'Installments',
-		'options': u'Lease Installment',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'allow_on_submit': 1,
-		'colour': u'White:FFF',
-		'doctype': u'DocField',
-		'fieldname': u'installment_reciept',
-		'fieldtype': u'Button',
-		'label': u'Installment Reciept',
-		'permlevel': 0
-	}
-]
\ No newline at end of file
diff --git a/accounts/doctype/lease_installment/__init__.py b/accounts/doctype/lease_installment/__init__.py
deleted file mode 100644
index baffc48..0000000
--- a/accounts/doctype/lease_installment/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from __future__ import unicode_literals
diff --git a/accounts/doctype/lease_installment/lease_installment.txt b/accounts/doctype/lease_installment/lease_installment.txt
deleted file mode 100644
index 475d226..0000000
--- a/accounts/doctype/lease_installment/lease_installment.txt
+++ /dev/null
@@ -1,86 +0,0 @@
-# DocType, Lease Installment
-[
-
-	# These values are common in all dictionaries
-	{
-		'creation': '2012-03-27 14:35:44',
-		'docstatus': 0,
-		'modified': '2012-03-27 14:35:44',
-		'modified_by': u'Administrator',
-		'owner': u'Administrator'
-	},
-
-	# These values are common for all DocType
-	{
-		'colour': u'White:FFF',
-		'doctype': 'DocType',
-		'istable': 1,
-		'module': u'Accounts',
-		'name': '__common__',
-		'section_style': u'Simple',
-		'show_in_menu': 0,
-		'version': 5
-	},
-
-	# These values are common for all DocField
-	{
-		'doctype': u'DocField',
-		'name': '__common__',
-		'parent': u'Lease Installment',
-		'parentfield': u'fields',
-		'parenttype': u'DocType'
-	},
-
-	# DocType, Lease Installment
-	{
-		'doctype': 'DocType',
-		'name': u'Lease Installment'
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'amount',
-		'fieldtype': u'Currency',
-		'label': u'Amount',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'due_date',
-		'fieldtype': u'Date',
-		'label': u'Due Date',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'cheque_number',
-		'fieldtype': u'Data',
-		'label': u'Cheque Number',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'cheque_date',
-		'fieldtype': u'Date',
-		'label': u'Cheque Date',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
-		'fieldname': u'jv_number',
-		'fieldtype': u'Link',
-		'hidden': 0,
-		'label': u'JV Number',
-		'options': u'Journal Voucher',
-		'permlevel': 1
-	}
-]
\ No newline at end of file
diff --git a/accounts/page/voucher_import_tool/__init__.py b/accounts/page/voucher_import_tool/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/accounts/page/voucher_import_tool/__init__.py
diff --git a/accounts/page/voucher_import_tool/voucher_import_tool.js b/accounts/page/voucher_import_tool/voucher_import_tool.js
new file mode 100644
index 0000000..4b9e3f7
--- /dev/null
+++ b/accounts/page/voucher_import_tool/voucher_import_tool.js
@@ -0,0 +1,55 @@
+wn.pages['voucher-import-tool'].onload = function(wrapper) { 
+	wn.ui.make_app_page({
+		parent: wrapper,
+		title: 'Voucher Import Tool',
+		single_column: true
+	});
+	
+	$(wrapper).find('.layout-main').html('\
+		<p class="help">Import multiple accounting entries via CSV (spreadsheet) file:</p>\
+		<h3>1. Download Template</h3><br>\
+		<div style="padding-left: 30px;">\
+			<button class="btn btn-small btn-download-multiple">Download</button>\
+			<p class="help">Import multiple vouchers with one debit and one credit entry</p>\
+		</div>\
+		<hr>\
+		<h3>2. Upload</h3><br>\
+		<div style="padding-left: 30px;">\
+			<p class="help">Upload file in CSV format with UTF-8 encoding</p>\
+			<div id="voucher-upload"></div>\
+		</div><br>\
+		<div class="working"></div>\
+		<div class="well messages" style="display: none;"></div>');
+		
+	wn.upload.make({
+		parent: $(wrapper).find("#voucher-upload"),
+		args: {
+			method: "accounts.page.voucher_import_tool.voucher_import_tool.upload"
+		},
+		callback: function(r) {
+			wrapper.waiting.toggle(false);
+			$(wrapper).find(".messages").toggle(true).html(
+				r.join("<div style='margin:4px; border-top:1px solid #aaa;'></div>"))
+		}
+	});
+	
+	wrapper.waiting = wn.messages.waiting($(wrapper).find('.working'), 
+		"Importing Vouchers...").toggle(false);
+	
+	$(wrapper).find(".btn-download-single").click(function() {
+		window.location.href = wn.request.url 
+			+ '?cmd=accounts.page.voucher_import_tool.voucher_import_tool.get_template_single';
+	});
+
+	$(wrapper).find(".btn-download-multiple").click(function() {
+		window.location.href = wn.request.url 
+			+ '?cmd=accounts.page.voucher_import_tool.voucher_import_tool.get_template_multiple';
+	});
+	
+	// rename button
+	$(wrapper).find('#voucher-upload form input[type="submit"]')
+		.click(function() {
+			$(wrapper).find(".messages").toggle(false);
+			wrapper.waiting.toggle(true);
+		});		
+}
\ No newline at end of file
diff --git a/accounts/page/voucher_import_tool/voucher_import_tool.py b/accounts/page/voucher_import_tool/voucher_import_tool.py
new file mode 100644
index 0000000..1cbeb99
--- /dev/null
+++ b/accounts/page/voucher_import_tool/voucher_import_tool.py
@@ -0,0 +1,185 @@
+import webnotes
+from webnotes.utils import formatdate
+
+@webnotes.whitelist()
+def get_template_multiple():
+	"""download single template"""
+	from webnotes.model.doctype import get_field_property
+	naming_options = get_field_property("Journal Voucher", "naming_series", "options")
+	voucher_type = get_field_property("Journal Voucher", "voucher_type", "options")
+	
+	webnotes.response['result'] = '''"Voucher Import :Multiple"
+"Each entry below will be a separate Journal Voucher."
+"Note:"
+"1. Dates in format: %(user_fmt)s"
+"2. Cost Center is required for Income or Expense accounts"
+"3. Naming Series Options: %(naming_options)s"
+"4. Voucher Type Options: %(voucher_type)s"
+"-------Common Values-----------"
+"Company:","%(default_company)s"
+"--------Data----------"
+"Naming Series","Voucher Type","Posting Date","Amount","Debit Account","Credit Account","Cost Center","Against Sales Invoice","Against Purchase Invoice","Against Journal Voucher","Remarks","Due Date","Ref Number","Ref Date"
+''' % {
+		"user_fmt": webnotes.conn.get_value('Control Panel', None, 'date_format'),
+		"default_company": webnotes.conn.get_default("company"),
+		"naming_options": naming_options.replace("\n", ", "),
+		"voucher_type": voucher_type.replace("\n", ", ")
+	}
+	webnotes.response['type'] = 'csv'
+	webnotes.response['doctype'] = "Voucher-Import-Single"
+
+@webnotes.whitelist()
+def upload():
+	from webnotes.utils.datautils import read_csv_content_from_uploaded_file
+	rows = read_csv_content_from_uploaded_file()
+
+	common_values = get_common_values(rows)
+	data = get_data(rows)
+	
+	if rows[0][0]=="Voucher Import :Single":
+		return import_single(common_values, data)
+	else:
+		return import_multiple(common_values, data)
+
+def map_fields(field_list, source, target):
+	for f in field_list:
+		if ":" in f:
+			target[f.split(":")[1]] = source.get(f.split(":")[0])
+		else:
+			target[f] = source.get(f)
+
+def import_multiple(common_values, data):
+	from webnotes.model.doc import Document
+	from webnotes.model.doclist import DocList
+	from webnotes.model.code import get_obj
+	from accounts.utils import get_fiscal_year_from_date
+	from webnotes.utils.dateutils import user_to_str
+
+	messages = []
+		
+	def get_account_details(account):
+		acc_details = webnotes.conn.sql("""select is_pl_account, 
+			master_name from tabAccount where name=%s""", account, as_dict=1)
+		if not acc_details:
+			webnotes.msgprint("%s is not an Account" % account, raise_exception=1)
+		return acc_details[0]
+
+	def apply_cost_center_and_against_invoice(detail, d):
+		account = get_account_details(detail.account)
+
+		if account.is_pl_account=="Yes":
+			detail.cost_center = d.cost_center
+		
+		if account.master_name:
+			map_fields(["against_sales_invoice:against_invoice", 
+				"against_purhase_invoice:against_voucher", 
+				"against_journal_voucher:against_jv"], d, detail.fields)
+	
+	webnotes.conn.commit()
+	
+	for i in xrange(len(data)):
+		d = data[i]
+		jv = webnotes.DictObj()
+		webnotes.message_log = []
+		try:
+			d.posting_date = user_to_str(d.posting_date)
+			d.due_date = user_to_str(d.due_date)
+			d.ref_date = user_to_str(d.ref_date)
+			d.company = common_values.company
+						
+			jv = Document("Journal Voucher")
+			map_fields(["voucher_type", "posting_date", "naming_series", "remarks:remark",
+				"ref_no:cheque_no", "ref_date:cheque_date", "is_opening",
+				"amount:total_debit", "amount:total_credit", "due_date", "company"], d, jv.fields)
+
+			jv.fiscal_year = get_fiscal_year_from_date(jv.posting_date)
+
+			detail1 = Document("Journal Voucher Detail")
+			detail1.parent = True
+			detail1.parentfield = "entries"
+			map_fields(["debit_account:account","amount:debit"], d, detail1.fields)
+			apply_cost_center_and_against_invoice(detail1, d)
+		
+
+			detail2 = Document("Journal Voucher Detail")
+			detail2.parent = True
+			detail2.parentfield = "entries"
+			map_fields(["credit_account:account","amount:credit"], d, detail2.fields)
+			apply_cost_center_and_against_invoice(detail2, d)
+			
+			webnotes.conn.begin()
+			doclist = DocList([jv, detail1, detail2])
+			doclist.submit()
+			webnotes.conn.commit()
+			
+			messages.append("<p style='color: green'>[row #%s] %s imported</p>" \
+				% (i, jv.name))
+			
+		except Exception, e:
+			webnotes.conn.rollback()
+			messages.append("<p style='color: red'>[row #%s] %s failed: %s</p>" \
+				% (i, jv.name, webnotes.message_log and webnotes.message_log[0] or "No message"))
+			webnotes.errprint(webnotes.getTraceback())
+
+		webnotes.message_log = []
+			
+		return messages
+
+def get_common_values(rows):
+	start = False
+	common_values = webnotes.DictObj()
+	
+	for r in rows:
+		if start:
+			if r[0].startswith("---"):
+				break
+			common_values[r[0][:-1].replace(" ", "_").lower()] = r[1]
+		if r[0]=="-------Common Values-----------":
+			start = True
+
+	return common_values
+	
+def get_data(rows):
+	start_row = 0
+	data = []
+	
+	for i in xrange(len(rows)):
+		r = rows[i]
+		if r[0]:
+			if start_row and i >= start_row:
+				d = webnotes.DictObj()
+				for cidx in xrange(len(columns)):
+					d[columns[cidx]] = r[cidx]
+				data.append(d)
+
+			if r[0]=="--------Data----------":
+				start_row = i+2
+				columns = [c.replace(" ", "_").lower() for c in rows[i+1]]
+		
+	return data
+	
+@webnotes.whitelist()
+def get_template_single():
+	"""download single template"""
+	
+	webnotes.response['result'] = '''"Voucher Import :Single"
+"All entries below will be uploaded in one Journal Voucher."
+"Enter details below:"
+"-------Common Values-----------"
+"Voucher Series:",
+"Voucher Type:",
+"Posting Date:","%(posting_date)s"
+"Remarks:",
+"Is Opening:","No"
+"Company:","%(default_company)s"
+"------------------"
+"Enter rows below headings:"
+"Cost Center is required for Income or Expense accounts"
+"--------Data----------"
+"Account","Cost Center","Debit Amount","Credit Amount","Against Sales Invoice","Against Purchase Invoice","Against Journal Voucher"
+''' % {
+		"posting_date": formatdate(),
+		"default_company": webnotes.conn.get_default("company")
+	}
+	webnotes.response['type'] = 'csv'
+	webnotes.response['doctype'] = "Voucher-Import-Single"
diff --git a/accounts/page/voucher_import_tool/voucher_import_tool.txt b/accounts/page/voucher_import_tool/voucher_import_tool.txt
new file mode 100644
index 0000000..658ef00
--- /dev/null
+++ b/accounts/page/voucher_import_tool/voucher_import_tool.txt
@@ -0,0 +1,28 @@
+# Page, voucher-import-tool
+[
+
+	# These values are common in all dictionaries
+	{
+		u'creation': '2012-09-26 15:21:57',
+		u'docstatus': 0,
+		u'modified': '2012-09-26 15:21:57',
+		u'modified_by': u'Administrator',
+		u'owner': u'Administrator'
+	},
+
+	# These values are common for all Page
+	{
+		u'doctype': u'Page',
+		'module': u'Accounts',
+		u'name': u'__common__',
+		'page_name': u'voucher-import-tool',
+		'standard': u'Yes',
+		'title': u'Voucher Import Tool'
+	},
+
+	# Page, voucher-import-tool
+	{
+		u'doctype': u'Page',
+		u'name': u'voucher-import-tool'
+	}
+]
\ No newline at end of file
diff --git a/accounts/utils/__init__.py b/accounts/utils/__init__.py
index 05d2391f..3dbc728 100644
--- a/accounts/utils/__init__.py
+++ b/accounts/utils/__init__.py
@@ -15,30 +15,16 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 from __future__ import unicode_literals
-from webnotes.model.doc import make_autoname, Document, addchild
-# Posts JV
 
-def post_jv(data):
-	jv = Document('Journal Voucher')
-	jv.voucher_type = data.get('voucher_type')
-	jv.naming_series = data.get('naming_series')
-	jv.voucher_date = data.get('cheque_date')
-	jv.posting_date = data.get('cheque_date')
-	jv.cheque_no = data.get('cheque_number')
-	jv.cheque_date = data.get('cheque_date')
-	jv.fiscal_year = data.get('fiscal_year') # To be modified to take care
-	jv.company = data.get('company')
+import webnotes
 
-	jv.save(1)
-
-	jc = addchild(jv,'entries','Journal Voucher Detail',0)
-	jc.account = data.get('debit_account')
-	jc.debit = data.get('amount')
-	jc.save()
-
-	jc = addchild(jv,'entries','Journal Voucher Detail',0)
-	jc.account = data.get('credit_account')
-	jc.credit = data.get('amount')
-	jc.save()
-
-	return jv.name
\ No newline at end of file
+def get_fiscal_year_from_date(date):
+	from webnotes.utils import formatdate
+	fy = webnotes.conn.sql("""select name from `tabFiscal Year`
+		where %s between year_start_date and adddate(year_start_date, 
+		interval 1 year)""", date)
+	
+	if not fy:
+		webnotes.msgprint("""%s not in any Fiscal Year""" % formatdate(date), raise_exception=1)
+	
+	return fy[0][0]
\ No newline at end of file
diff --git a/erpnext/patches/september_2012/event_permission.py b/patches/september_2012/event_permission.py
similarity index 100%
rename from erpnext/patches/september_2012/event_permission.py
rename to patches/september_2012/event_permission.py
diff --git a/erpnext/patches/september_2012/reload_gross_profit.py b/patches/september_2012/reload_gross_profit.py
similarity index 100%
rename from erpnext/patches/september_2012/reload_gross_profit.py
rename to patches/september_2012/reload_gross_profit.py
diff --git a/erpnext/patches/september_2012/repost_stock.py b/patches/september_2012/repost_stock.py
similarity index 100%
rename from erpnext/patches/september_2012/repost_stock.py
rename to patches/september_2012/repost_stock.py
diff --git a/utilities/page/users/users.js b/utilities/page/users/users.js
index ee05001..7f92609 100644
--- a/utilities/page/users/users.js
+++ b/utilities/page/users/users.js
@@ -95,7 +95,7 @@
 		if(data.file_list) {
 			data.imgsrc = 'files/' + data.file_list.split('\n')[0].split(',')[1];
 		} else {
-			data.imgsrc = 'images/lib/ui/no_img_' + (data.gender=='Female' ? 'f' : 'm') + '.gif';
+			data.imgsrc = 'lib/images/ui/no_img_' + (data.gender=='Female' ? 'f' : 'm') + '.gif';
 		}
 		data.fullname = wn.user_info(data.name).fullname;
 		data.delete_html = '';
diff --git a/website/templates/html/outer.html b/website/templates/html/outer.html
index a671d98..1a036f0 100644
--- a/website/templates/html/outer.html
+++ b/website/templates/html/outer.html
@@ -45,7 +45,7 @@
 						{% endif %}
 					{% endfor %}
 				</ul>
-				<img src="images/lib/ui/spinner.gif" id="spinner"/>
+				<img src="lib/images/ui/spinner.gif" id="spinner"/>
 				<ul class="nav pull-right">
 					<li id="login-topbar-item"><a href="login.html">Login</a></li>
 				</ul>