diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py
index 2c0c85c..7c65f88 100644
--- a/erpnext/setup/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/setup_wizard/setup_wizard.py
@@ -68,48 +68,189 @@
 				frappe.message_log.pop()
 
 			pass
+ 
+def create_fiscal_year_and_company(args):
+	if (args.get('fy_start_date')):
+		curr_fiscal_year = get_fy_details(args.get('fy_start_date'), args.get('fy_end_date'))
+		frappe.get_doc({
+		"doctype":"Fiscal Year",
+		'year': curr_fiscal_year,
+		'year_start_date': args.get('fy_start_date'),
+		'year_end_date': args.get('fy_end_date'),
+		}).insert()
+		args["curr_fiscal_year"] = curr_fiscal_year
 
+	# Company
+	if (args.get('company_name')):
+		frappe.get_doc({
+			"doctype":"Company",
+			'company_name':args.get('company_name').strip(),
+			'abbr':args.get('company_abbr'),
+			'default_currency':args.get('currency'),
+			'country': args.get('country'),
+			'chart_of_accounts': args.get(('chart_of_accounts')),
+			'domain': args.get('domain')
+		}).insert()
+
+		#Enable shopping cart
+		enable_shopping_cart(args)
+
+		# Bank Account
+		create_bank_account(args)
+
+def enable_shopping_cart(args):
+	frappe.get_doc({
+		"doctype": "Shopping Cart Settings",
+		"enabled": 1,
+		'company': args.get('company_name').strip(),
+		'price_list': frappe.db.get_value("Price List", {"selling": 1}),
+		'default_customer_group': _("Individual"),
+		'quotation_series': "QTN-",
+	}).insert()
+
+def create_bank_account(args):
+	if args.get("bank_account"):
+		company_name = args.get('company_name').strip()
+		bank_account_group =  frappe.db.get_value("Account",
+			{"account_type": "Bank", "is_group": 1, "root_type": "Asset",
+				"company": company_name})
+		if bank_account_group:
+			bank_account = frappe.get_doc({
+				"doctype": "Account",
+				'account_name': args.get("bank_account"),
+				'parent_account': bank_account_group,
+				'is_group':0,
+				'company': company_name,
+				"account_type": "Bank",
+			})
+			try:
+				return bank_account.insert()
+			except RootNotEditable:
+				frappe.throw(_("Bank account cannot be named as {0}").format(args.get("bank_account")))
+			except frappe.DuplicateEntryError:
+				# bank account same as a CoA entry
+				pass
+
+def create_price_lists(args):
+	for pl_type, pl_name in (("Selling", _("Standard Selling")), ("Buying", _("Standard Buying"))):
+		frappe.get_doc({
+			"doctype": "Price List",
+			"price_list_name": pl_name,
+			"enabled": 1,
+			"buying": 1 if pl_type == "Buying" else 0,
+			"selling": 1 if pl_type == "Selling" else 0,
+			"currency": args["currency"]
+		}).insert()
+
+def set_defaults(args):
+	# enable default currency
+	frappe.db.set_value("Currency", args.get("currency"), "enabled", 1)
+
+	global_defaults = frappe.get_doc("Global Defaults", "Global Defaults")
+	global_defaults.update({
+		'current_fiscal_year': args.curr_fiscal_year,
+		'default_currency': args.get('currency'),
+		'default_company':args.get('company_name').strip(),
+		"country": args.get("country"),
+	})
+
+	global_defaults.save()
+
+	frappe.db.set_value("System Settings", None, "email_footer_address", args.get("company"))
+
+	accounts_settings = frappe.get_doc("Accounts Settings")
+	accounts_settings.auto_accounting_for_stock = 1
+	accounts_settings.save()
+
+	stock_settings = frappe.get_doc("Stock Settings")
+	stock_settings.item_naming_by = "Item Code"
+	stock_settings.valuation_method = "FIFO"
+	stock_settings.default_warehouse = frappe.db.get_value('Warehouse', {'warehouse_name': _('Stores')})
+	stock_settings.stock_uom = _("Nos")
+	stock_settings.auto_indent = 1
+	stock_settings.auto_insert_price_list_rate_if_missing = 1
+	stock_settings.automatically_set_serial_nos_based_on_fifo = 1
+	stock_settings.save()
+
+	selling_settings = frappe.get_doc("Selling Settings")
+	selling_settings.cust_master_name = "Customer Name"
+	selling_settings.so_required = "No"
+	selling_settings.dn_required = "No"
+	selling_settings.save()
+
+	buying_settings = frappe.get_doc("Buying Settings")
+	buying_settings.supp_master_name = "Supplier Name"
+	buying_settings.po_required = "No"
+	buying_settings.pr_required = "No"
+	buying_settings.maintain_same_rate = 1
+	buying_settings.save()
+
+	notification_control = frappe.get_doc("Notification Control")
+	notification_control.quotation = 1
+	notification_control.sales_invoice = 1
+	notification_control.purchase_order = 1
+	notification_control.save()
+
+	hr_settings = frappe.get_doc("HR Settings")
+	hr_settings.emp_created_by = "Naming Series"
+	hr_settings.save()
+
+def create_feed_and_todo():
+	"""update Activity feed and create todo for creation of item, customer, vendor"""
+	add_info_comment(**{
+		"subject": _("ERPNext Setup Complete!")
+	})
+
+def create_email_digest():
+	from frappe.utils.user import get_system_managers
+	system_managers = get_system_managers(only_name=True)
+	if not system_managers:
+		return
+
+	companies = frappe.db.sql_list("select name FROM `tabCompany`")
+	for company in companies:
+		if not frappe.db.exists("Email Digest", "Default Weekly Digest - " + company):
+			edigest = frappe.get_doc({
+				"doctype": "Email Digest",
+				"name": "Default Weekly Digest - " + company,
+				"company": company,
+				"frequency": "Weekly",
+				"recipient_list": "\n".join(system_managers)
+			})
+
+			for df in edigest.meta.get("fields", {"fieldtype": "Check"}):
+				if df.fieldname != "scheduler_errors":
+					edigest.set(df.fieldname, 1)
+
+			edigest.insert()
+
+	# scheduler errors digest
+	if companies:
+		edigest = frappe.new_doc("Email Digest")
+		edigest.update({
+			"name": "Scheduler Errors",
+			"company": companies[0],
+			"frequency": "Daily",
+			"recipient_list": "\n".join(system_managers),
+			"scheduler_errors": 1,
+			"enabled": 1
+		})
+		edigest.insert()
+
+def get_fy_details(fy_start_date, fy_end_date):
+	start_year = getdate(fy_start_date).year
+	if start_year == getdate(fy_end_date).year:
+		fy = cstr(start_year)
+	else:
+		fy = cstr(start_year) + '-' + cstr(start_year + 1)
+	return fy
+	
 def create_sales_tax(args):
 	country_wise_tax = get_country_wise_tax(args.get("country"))
 	if len(country_wise_tax)>0:
 		for sales_tax, tax_data in country_wise_tax.items():
-			account = create_account(tax_data, args)
-			if account:
-				create_sales_template(sales_tax, account, args)
-
-def create_account(tax_data, args):
-	try:
-		account = frappe.get_doc({
-			"doctype": "Account",
-			"is_group": 0,
-			"root_type": "Liability",
-			"company": args.get("company_name"),
-			"parent_account": "Duties and Taxes - %s"%(args.get('company_abbr')),
-			"account_name": tax_data.get('account_name'),
-			"account_type": "Tax",
-			"tax_rate": tax_data.get('tax_rate'),
-			"currency": args.get('currency')
-		}).insert(ignore_permissions=True)
-
-		return account.name
-	except:
-		return None
-
-def create_sales_template(sales_tax, account, args):
-	sales_tax_template = frappe.get_doc({
-		"doctype": "Sales Taxes and Charges Template",
-		"title": sales_tax,
-		"company": args.get("company_name"),
-		"taxes": [{
-			"doctype": "Sales Taxes and Charges",
-			"charge_type": "On Net Total",
-			"account_head": account,
-			"description": sales_tax.split("-")[0]
-		}]
-	}).insert(ignore_permissions=True)
-
-	sales_tax_template.set_missing_values()
-	sales_tax_template.save()
+			make_tax_account_and_template(args.get("company_name").strip(), 
+				tax_data.get('account_name'), tax_data.get('tax_rate'), sales_tax)
 
 def get_country_wise_tax(country):
 	data = {}
@@ -117,491 +258,332 @@
 		data = json.load(countrywise_tax).get(country)
 
 	return data
- 
-def create_fiscal_year_and_company(args):
-    if (args.get('fy_start_date')):
-        curr_fiscal_year = get_fy_details(args.get('fy_start_date'), args.get('fy_end_date'))
-        frappe.get_doc({
-        "doctype":"Fiscal Year",
-        'year': curr_fiscal_year,
-        'year_start_date': args.get('fy_start_date'),
-        'year_end_date': args.get('fy_end_date'),
-        }).insert()
-        args["curr_fiscal_year"] = curr_fiscal_year
-
-    # Company
-    if (args.get('company_name')):
-        frappe.get_doc({
-            "doctype":"Company",
-            'company_name':args.get('company_name').strip(),
-            'abbr':args.get('company_abbr'),
-            'default_currency':args.get('currency'),
-            'country': args.get('country'),
-            'chart_of_accounts': args.get(('chart_of_accounts')),
-            'domain': args.get('domain')
-        }).insert()
-
-        #Enable shopping cart
-        enable_shopping_cart(args)
-
-        # Bank Account
-        create_bank_account(args)
-
-def enable_shopping_cart(args):
-    frappe.get_doc({
-        "doctype": "Shopping Cart Settings",
-        "enabled": 1,
-        'company': args.get('company_name').strip(),
-        'price_list': frappe.db.get_value("Price List", {"selling": 1}),
-        'default_customer_group': _("Individual"),
-        'quotation_series': "QTN-",
-    }).insert()
-
-def create_bank_account(args):
-    if args.get("bank_account"):
-        company_name = args.get('company_name').strip()
-        bank_account_group =  frappe.db.get_value("Account",
-            {"account_type": "Bank", "is_group": 1, "root_type": "Asset",
-                "company": company_name})
-        if bank_account_group:
-            bank_account = frappe.get_doc({
-                "doctype": "Account",
-                'account_name': args.get("bank_account"),
-                'parent_account': bank_account_group,
-                'is_group':0,
-                'company': company_name,
-                "account_type": "Bank",
-            })
-            try:
-                return bank_account.insert()
-            except RootNotEditable:
-                frappe.throw(_("Bank account cannot be named as {0}").format(args.get("bank_account")))
-            except frappe.DuplicateEntryError:
-                # bank account same as a CoA entry
-                pass
-
-def create_price_lists(args):
-    for pl_type, pl_name in (("Selling", _("Standard Selling")), ("Buying", _("Standard Buying"))):
-        frappe.get_doc({
-            "doctype": "Price List",
-            "price_list_name": pl_name,
-            "enabled": 1,
-            "buying": 1 if pl_type == "Buying" else 0,
-            "selling": 1 if pl_type == "Selling" else 0,
-            "currency": args["currency"]
-        }).insert()
-
-def set_defaults(args):
-    # enable default currency
-    frappe.db.set_value("Currency", args.get("currency"), "enabled", 1)
-
-    global_defaults = frappe.get_doc("Global Defaults", "Global Defaults")
-    global_defaults.update({
-        'current_fiscal_year': args.curr_fiscal_year,
-        'default_currency': args.get('currency'),
-        'default_company':args.get('company_name').strip(),
-        "country": args.get("country"),
-    })
-
-    global_defaults.save()
-
-    frappe.db.set_value("System Settings", None, "email_footer_address", args.get("company"))
-
-    accounts_settings = frappe.get_doc("Accounts Settings")
-    accounts_settings.auto_accounting_for_stock = 1
-    accounts_settings.save()
-
-    stock_settings = frappe.get_doc("Stock Settings")
-    stock_settings.item_naming_by = "Item Code"
-    stock_settings.valuation_method = "FIFO"
-    stock_settings.default_warehouse = frappe.db.get_value('Warehouse', {'warehouse_name': _('Stores')})
-    stock_settings.stock_uom = _("Nos")
-    stock_settings.auto_indent = 1
-    stock_settings.auto_insert_price_list_rate_if_missing = 1
-    stock_settings.automatically_set_serial_nos_based_on_fifo = 1
-    stock_settings.save()
-
-    selling_settings = frappe.get_doc("Selling Settings")
-    selling_settings.cust_master_name = "Customer Name"
-    selling_settings.so_required = "No"
-    selling_settings.dn_required = "No"
-    selling_settings.save()
-
-    buying_settings = frappe.get_doc("Buying Settings")
-    buying_settings.supp_master_name = "Supplier Name"
-    buying_settings.po_required = "No"
-    buying_settings.pr_required = "No"
-    buying_settings.maintain_same_rate = 1
-    buying_settings.save()
-
-    notification_control = frappe.get_doc("Notification Control")
-    notification_control.quotation = 1
-    notification_control.sales_invoice = 1
-    notification_control.purchase_order = 1
-    notification_control.save()
-
-    hr_settings = frappe.get_doc("HR Settings")
-    hr_settings.emp_created_by = "Naming Series"
-    hr_settings.save()
-
-def create_feed_and_todo():
-    """update Activity feed and create todo for creation of item, customer, vendor"""
-    add_info_comment(**{
-        "subject": _("ERPNext Setup Complete!")
-    })
-
-def create_email_digest():
-    from frappe.utils.user import get_system_managers
-    system_managers = get_system_managers(only_name=True)
-    if not system_managers:
-        return
-
-    companies = frappe.db.sql_list("select name FROM `tabCompany`")
-    for company in companies:
-        if not frappe.db.exists("Email Digest", "Default Weekly Digest - " + company):
-            edigest = frappe.get_doc({
-                "doctype": "Email Digest",
-                "name": "Default Weekly Digest - " + company,
-                "company": company,
-                "frequency": "Weekly",
-                "recipient_list": "\n".join(system_managers)
-            })
-
-            for df in edigest.meta.get("fields", {"fieldtype": "Check"}):
-                if df.fieldname != "scheduler_errors":
-                    edigest.set(df.fieldname, 1)
-
-            edigest.insert()
-
-    # scheduler errors digest
-    if companies:
-        edigest = frappe.new_doc("Email Digest")
-        edigest.update({
-            "name": "Scheduler Errors",
-            "company": companies[0],
-            "frequency": "Daily",
-            "recipient_list": "\n".join(system_managers),
-            "scheduler_errors": 1,
-            "enabled": 1
-        })
-        edigest.insert()
-
-def get_fy_details(fy_start_date, fy_end_date):
-    start_year = getdate(fy_start_date).year
-    if start_year == getdate(fy_end_date).year:
-        fy = cstr(start_year)
-    else:
-        fy = cstr(start_year) + '-' + cstr(start_year + 1)
-    return fy
 
 def create_taxes(args):
+	for i in xrange(1,6):
+		if args.get("tax_" + str(i)):
+			# replace % in case someone also enters the % symbol
+			tax_rate = cstr(args.get("tax_rate_" + str(i)) or "").replace("%", "")
+			account_name = args.get("tax_" + str(i))
 
-    for i in xrange(1,6):
-        if args.get("tax_" + str(i)):
-            # replace % in case someone also enters the % symbol
-            tax_rate = cstr(args.get("tax_rate_" + str(i)) or "").replace("%", "")
+			make_tax_account_and_template(args.get("company_name").strip(), account_name, tax_rate)
+			
+def make_tax_account_and_template(company, account_name, tax_rate, template_name=None):
+	try:
+		account = make_tax_account(company, account_name, tax_rate)
+		if account:
+			make_sales_and_purchase_tax_templates(account, template_name)
+	except frappe.NameError, e:
+		if e.args[2][0]==1062:
+			pass
+		else:
+			raise
+	except RootNotEditable, e:
+		pass
+				
+def get_tax_account_group(company):
+	tax_group = frappe.db.get_value("Account", 
+		{"account_name": "Duties and Taxes", "is_group": 1, "company": company})
+	if not tax_group:
+		tax_group = frappe.db.get_value("Account", {"is_group": 1, "root_type": "Liability", 
+				"account_type": "Tax", "company": company})
+				
+	return tax_group
 
-            try:
-                tax_group = frappe.db.get_value("Account", {"company": args.get("company_name"),
-                    "is_group": 1, "account_type": "Tax", "root_type": "Liability"})
-                if tax_group:
-                    account = make_tax_head(args, i, tax_group, tax_rate)
-                    make_sales_and_purchase_tax_templates(account)
+def make_tax_account(company, account_name, tax_rate):
+	tax_group = get_tax_account_group(company)
+	if tax_group:
+		return frappe.get_doc({
+			"doctype":"Account",
+			"company": company,
+			"parent_account": tax_group,
+			"account_name": account_name,
+			"is_group": 0,
+			"report_type": "Balance Sheet",
+			"root_type": "Liability",
+			"account_type": "Tax",
+			"tax_rate": flt(tax_rate) if tax_rate else None
+		}).insert(ignore_permissions=True)
 
-            except frappe.NameError, e:
-                if e.args[2][0]==1062:
-                    pass
-                else:
-                    raise
-            except RootNotEditable, e:
-                pass
+def make_sales_and_purchase_tax_templates(account, template_name=None):
+	if not template_name:
+		template_name = account.name
+		
+	sales_tax_template = {
+		"doctype": "Sales Taxes and Charges Template",
+		"title": template_name,
+		"company": account.company,
+		"taxes": [{
+			"category": "Valuation and Total",
+			"charge_type": "On Net Total",
+			"account_head": account.name,
+			"description": "{0} @ {1}".format(account.account_name, account.tax_rate),
+			"rate": account.tax_rate
+		}]
+	}
 
-def make_tax_head(args, i, tax_group, tax_rate):
-    return frappe.get_doc({
-        "doctype":"Account",
-        "company": args.get("company_name").strip(),
-        "parent_account": tax_group,
-        "account_name": args.get("tax_" + str(i)),
-        "is_group": 0,
-        "report_type": "Balance Sheet",
-        "account_type": "Tax",
-        "tax_rate": flt(tax_rate) if tax_rate else None
-    }).insert(ignore_permissions=True)
+	# Sales
+	frappe.get_doc(copy.deepcopy(sales_tax_template)).insert(ignore_permissions=True)
 
-def make_sales_and_purchase_tax_templates(account):
-    doc = {
-        "doctype": "Sales Taxes and Charges Template",
-        "title": account.name,
-        "taxes": [{
-            "category": "Valuation and Total",
-            "charge_type": "On Net Total",
-            "account_head": account.name,
-            "description": "{0} @ {1}".format(account.account_name, account.tax_rate),
-            "rate": account.tax_rate
-        }]
-    }
-
-    # Sales
-    frappe.get_doc(copy.deepcopy(doc)).insert()
-
-    # Purchase
-    doc["doctype"] = "Purchase Taxes and Charges Template"
-    frappe.get_doc(copy.deepcopy(doc)).insert()
+	# Purchase
+	purchase_tax_template = copy.deepcopy(sales_tax_template)
+	purchase_tax_template["doctype"] = "Purchase Taxes and Charges Template"
+	frappe.get_doc(purchase_tax_template).insert(ignore_permissions=True)
 
 def create_items(args):
-    for i in xrange(1,6):
-        item = args.get("item_" + str(i))
-        if item:
-            item_group = args.get("item_group_" + str(i))
-            is_sales_item = args.get("is_sales_item_" + str(i))
-            is_purchase_item = args.get("is_purchase_item_" + str(i))
-            is_stock_item = item_group!=_("Services")
-            default_warehouse = ""
-            if is_stock_item:
-                default_warehouse = frappe.db.get_value("Warehouse", filters={
-                    "warehouse_name": _("Finished Goods") if is_sales_item else _("Stores"),
-                    "company": args.get("company_name").strip()
-                })
+	for i in xrange(1,6):
+		item = args.get("item_" + str(i))
+		if item:
+			item_group = args.get("item_group_" + str(i))
+			is_sales_item = args.get("is_sales_item_" + str(i))
+			is_purchase_item = args.get("is_purchase_item_" + str(i))
+			is_stock_item = item_group!=_("Services")
+			default_warehouse = ""
+			if is_stock_item:
+				default_warehouse = frappe.db.get_value("Warehouse", filters={
+					"warehouse_name": _("Finished Goods") if is_sales_item else _("Stores"),
+					"company": args.get("company_name").strip()
+				})
 
-            try:
-                frappe.get_doc({
-                    "doctype":"Item",
-                    "item_code": item,
-                    "item_name": item,
-                    "description": item,
-                    "show_in_website": 1,
-                    "is_sales_item": is_sales_item,
-                    "is_purchase_item": is_purchase_item,
-                    "is_stock_item": is_stock_item and 1 or 0,
-                    "item_group": item_group,
-                    "stock_uom": args.get("item_uom_" + str(i)),
-                    "default_warehouse": default_warehouse
-                }).insert()
+			try:
+				frappe.get_doc({
+					"doctype":"Item",
+					"item_code": item,
+					"item_name": item,
+					"description": item,
+					"show_in_website": 1,
+					"is_sales_item": is_sales_item,
+					"is_purchase_item": is_purchase_item,
+					"is_stock_item": is_stock_item and 1 or 0,
+					"item_group": item_group,
+					"stock_uom": args.get("item_uom_" + str(i)),
+					"default_warehouse": default_warehouse
+				}).insert()
 
-                if args.get("item_img_" + str(i)):
-                    item_image = args.get("item_img_" + str(i)).split(",")
-                    if len(item_image)==3:
-                        filename, filetype, content = item_image
-                        fileurl = save_file(filename, content, "Item", item, decode=True).file_url
-                        frappe.db.set_value("Item", item, "image", fileurl)
+				if args.get("item_img_" + str(i)):
+					item_image = args.get("item_img_" + str(i)).split(",")
+					if len(item_image)==3:
+						filename, filetype, content = item_image
+						fileurl = save_file(filename, content, "Item", item, decode=True).file_url
+						frappe.db.set_value("Item", item, "image", fileurl)
 
-                if args.get("item_price_" + str(i)):
-                    item_price = flt(args.get("item_price_" + str(i)))
+				if args.get("item_price_" + str(i)):
+					item_price = flt(args.get("item_price_" + str(i)))
 
-                    if is_sales_item:
-                        price_list_name = frappe.db.get_value("Price List", {"selling": 1})
-                        make_item_price(item, price_list_name, item_price)
+					if is_sales_item:
+						price_list_name = frappe.db.get_value("Price List", {"selling": 1})
+						make_item_price(item, price_list_name, item_price)
 
-                    if is_purchase_item:
-                        price_list_name = frappe.db.get_value("Price List", {"buying": 1})
-                        make_item_price(item, price_list_name, item_price)
+					if is_purchase_item:
+						price_list_name = frappe.db.get_value("Price List", {"buying": 1})
+						make_item_price(item, price_list_name, item_price)
 
-            except frappe.NameError:
-                pass
+			except frappe.NameError:
+				pass
 
 def make_item_price(item, price_list_name, item_price):
-    frappe.get_doc({
-        "doctype": "Item Price",
-        "price_list": price_list_name,
-        "item_code": item,
-        "price_list_rate": item_price
-    }).insert()
+	frappe.get_doc({
+		"doctype": "Item Price",
+		"price_list": price_list_name,
+		"item_code": item,
+		"price_list_rate": item_price
+	}).insert()
 
 
 def create_customers(args):
-    for i in xrange(1,6):
-        customer = args.get("customer_" + str(i))
-        if customer:
-            try:
-                doc = frappe.get_doc({
-                    "doctype":"Customer",
-                    "customer_name": customer,
-                    "customer_type": "Company",
-                    "customer_group": _("Commercial"),
-                    "territory": args.get("country"),
-                    "company": args.get("company_name").strip()
-                }).insert()
+	for i in xrange(1,6):
+		customer = args.get("customer_" + str(i))
+		if customer:
+			try:
+				doc = frappe.get_doc({
+					"doctype":"Customer",
+					"customer_name": customer,
+					"customer_type": "Company",
+					"customer_group": _("Commercial"),
+					"territory": args.get("country"),
+					"company": args.get("company_name").strip()
+				}).insert()
 
-                if args.get("customer_contact_" + str(i)):
-                    create_contact(args.get("customer_contact_" + str(i)),
-                        "customer", doc.name)
-            except frappe.NameError:
-                pass
+				if args.get("customer_contact_" + str(i)):
+					create_contact(args.get("customer_contact_" + str(i)),
+						"customer", doc.name)
+			except frappe.NameError:
+				pass
 
 def create_suppliers(args):
-    for i in xrange(1,6):
-        supplier = args.get("supplier_" + str(i))
-        if supplier:
-            try:
-                doc = frappe.get_doc({
-                    "doctype":"Supplier",
-                    "supplier_name": supplier,
-                    "supplier_type": _("Local"),
-                    "company": args.get("company_name").strip()
-                }).insert()
+	for i in xrange(1,6):
+		supplier = args.get("supplier_" + str(i))
+		if supplier:
+			try:
+				doc = frappe.get_doc({
+					"doctype":"Supplier",
+					"supplier_name": supplier,
+					"supplier_type": _("Local"),
+					"company": args.get("company_name").strip()
+				}).insert()
 
-                if args.get("supplier_contact_" + str(i)):
-                    create_contact(args.get("supplier_contact_" + str(i)),
-                        "supplier", doc.name)
-            except frappe.NameError:
-                pass
+				if args.get("supplier_contact_" + str(i)):
+					create_contact(args.get("supplier_contact_" + str(i)),
+						"supplier", doc.name)
+			except frappe.NameError:
+				pass
 
 def create_contact(contact, party_type, party):
-    """Create contact based on given contact name"""
-    contact = contact.strip().split(" ")
+	"""Create contact based on given contact name"""
+	contact = contact.strip().split(" ")
 
-    frappe.get_doc({
-        "doctype":"Contact",
-        party_type: party,
-        "first_name":contact[0],
-        "last_name": len(contact) > 1 and contact[1] or ""
-    }).insert()
+	frappe.get_doc({
+		"doctype":"Contact",
+		party_type: party,
+		"first_name":contact[0],
+		"last_name": len(contact) > 1 and contact[1] or ""
+	}).insert()
 
 def create_letter_head(args):
-    if args.get("attach_letterhead"):
-        frappe.get_doc({
-            "doctype":"Letter Head",
-            "letter_head_name": _("Standard"),
-            "is_default": 1
-        }).insert()
+	if args.get("attach_letterhead"):
+		frappe.get_doc({
+			"doctype":"Letter Head",
+			"letter_head_name": _("Standard"),
+			"is_default": 1
+		}).insert()
 
-        attach_letterhead = args.get("attach_letterhead").split(",")
-        if len(attach_letterhead)==3:
-            filename, filetype, content = attach_letterhead
-            fileurl = save_file(filename, content, "Letter Head", _("Standard"), decode=True).file_url
-            frappe.db.set_value("Letter Head", _("Standard"), "content", "<img src='%s' style='max-width: 100%%;'>" % fileurl)
+		attach_letterhead = args.get("attach_letterhead").split(",")
+		if len(attach_letterhead)==3:
+			filename, filetype, content = attach_letterhead
+			fileurl = save_file(filename, content, "Letter Head", _("Standard"), decode=True).file_url
+			frappe.db.set_value("Letter Head", _("Standard"), "content", "<img src='%s' style='max-width: 100%%;'>" % fileurl)
 
 def create_logo(args):
-    if args.get("attach_logo"):
-        attach_logo = args.get("attach_logo").split(",")
-        if len(attach_logo)==3:
-            filename, filetype, content = attach_logo
-            fileurl = save_file(filename, content, "Website Settings", "Website Settings",
-                decode=True).file_url
-            frappe.db.set_value("Website Settings", "Website Settings", "brand_html",
-                "<img src='{0}' style='max-width: 40px; max-height: 25px;'> {1}".format(fileurl, args.get("company_name").strip()))
+	if args.get("attach_logo"):
+		attach_logo = args.get("attach_logo").split(",")
+		if len(attach_logo)==3:
+			filename, filetype, content = attach_logo
+			fileurl = save_file(filename, content, "Website Settings", "Website Settings",
+				decode=True).file_url
+			frappe.db.set_value("Website Settings", "Website Settings", "brand_html",
+				"<img src='{0}' style='max-width: 40px; max-height: 25px;'> {1}".format(fileurl, args.get("company_name").strip()))
 
 def create_territories():
-    """create two default territories, one for home country and one named Rest of the World"""
-    from frappe.utils.nestedset import get_root_of
-    country = frappe.db.get_default("country")
-    root_territory = get_root_of("Territory")
-    for name in (country, _("Rest Of The World")):
-        if name and not frappe.db.exists("Territory", name):
-            frappe.get_doc({
-                "doctype": "Territory",
-                "territory_name": name.replace("'", ""),
-                "parent_territory": root_territory,
-                "is_group": "No"
-            }).insert()
+	"""create two default territories, one for home country and one named Rest of the World"""
+	from frappe.utils.nestedset import get_root_of
+	country = frappe.db.get_default("country")
+	root_territory = get_root_of("Territory")
+	for name in (country, _("Rest Of The World")):
+		if name and not frappe.db.exists("Territory", name):
+			frappe.get_doc({
+				"doctype": "Territory",
+				"territory_name": name.replace("'", ""),
+				"parent_territory": root_territory,
+				"is_group": "No"
+			}).insert()
 
 def login_as_first_user(args):
-    if args.get("email") and hasattr(frappe.local, "login_manager"):
-        frappe.local.login_manager.login_as(args.get("email"))
+	if args.get("email") and hasattr(frappe.local, "login_manager"):
+		frappe.local.login_manager.login_as(args.get("email"))
 
 def create_users(args):
-    if frappe.session.user == 'Administrator':
-        return
+	if frappe.session.user == 'Administrator':
+		return
 
-    # create employee for self
-    emp = frappe.get_doc({
-        "doctype": "Employee",
-        "employee_name": " ".join(filter(None, [args.get("first_name"), args.get("last_name")])),
-        "user_id": frappe.session.user,
-        "status": "Active",
-        "company": args.get("company_name")
-    })
-    emp.flags.ignore_mandatory = True
-    emp.insert(ignore_permissions = True)
+	# create employee for self
+	emp = frappe.get_doc({
+		"doctype": "Employee",
+		"employee_name": " ".join(filter(None, [args.get("first_name"), args.get("last_name")])),
+		"user_id": frappe.session.user,
+		"status": "Active",
+		"company": args.get("company_name")
+	})
+	emp.flags.ignore_mandatory = True
+	emp.insert(ignore_permissions = True)
 
-    for i in xrange(1,5):
-        email = args.get("user_email_" + str(i))
-        fullname = args.get("user_fullname_" + str(i))
-        if email:
-            if not fullname:
-                fullname = email.split("@")[0]
+	for i in xrange(1,5):
+		email = args.get("user_email_" + str(i))
+		fullname = args.get("user_fullname_" + str(i))
+		if email:
+			if not fullname:
+				fullname = email.split("@")[0]
 
-            parts = fullname.split(" ", 1)
+			parts = fullname.split(" ", 1)
 
-            user = frappe.get_doc({
-                "doctype": "User",
-                "email": email,
-                "first_name": parts[0],
-                "last_name": parts[1] if len(parts) > 1 else "",
-                "enabled": 1,
-                "user_type": "System User"
-            })
+			user = frappe.get_doc({
+				"doctype": "User",
+				"email": email,
+				"first_name": parts[0],
+				"last_name": parts[1] if len(parts) > 1 else "",
+				"enabled": 1,
+				"user_type": "System User"
+			})
 
-            # default roles
-            user.append_roles("Projects User", "Stock User", "Support Team")
+			# default roles
+			user.append_roles("Projects User", "Stock User", "Support Team")
 
-            if args.get("user_sales_" + str(i)):
-                user.append_roles("Sales User", "Sales Manager", "Accounts User")
-            if args.get("user_purchaser_" + str(i)):
-                user.append_roles("Purchase User", "Purchase Manager", "Accounts User")
-            if args.get("user_accountant_" + str(i)):
-                user.append_roles("Accounts Manager", "Accounts User")
+			if args.get("user_sales_" + str(i)):
+				user.append_roles("Sales User", "Sales Manager", "Accounts User")
+			if args.get("user_purchaser_" + str(i)):
+				user.append_roles("Purchase User", "Purchase Manager", "Accounts User")
+			if args.get("user_accountant_" + str(i)):
+				user.append_roles("Accounts Manager", "Accounts User")
 
-            user.flags.delay_emails = True
+			user.flags.delay_emails = True
 
-            if not frappe.db.get_value("User", email):
-                user.insert(ignore_permissions=True)
+			if not frappe.db.get_value("User", email):
+				user.insert(ignore_permissions=True)
 
-                # create employee
-                emp = frappe.get_doc({
-                    "doctype": "Employee",
-                    "employee_name": fullname,
-                    "user_id": email,
-                    "status": "Active",
-                    "company": args.get("company_name")
-                })
-                emp.flags.ignore_mandatory = True
-                emp.insert(ignore_permissions = True)
+				# create employee
+				emp = frappe.get_doc({
+					"doctype": "Employee",
+					"employee_name": fullname,
+					"user_id": email,
+					"status": "Active",
+					"company": args.get("company_name")
+				})
+				emp.flags.ignore_mandatory = True
+				emp.insert(ignore_permissions = True)
 
 def create_academic_term():
-    at = ["Semester 1", "Semester 2", "Semester 3"]
-    ay = ["2013-14", "2014-15", "2015-16", "2016-17", "2017-18"]
-    for y in ay:
-        for t in at:
-            academic_term = frappe.new_doc("Academic Term")
-            academic_term.academic_year = y
-            academic_term.term_name = t
-            academic_term.save()
+	at = ["Semester 1", "Semester 2", "Semester 3"]
+	ay = ["2013-14", "2014-15", "2015-16", "2016-17", "2017-18"]
+	for y in ay:
+		for t in at:
+			academic_term = frappe.new_doc("Academic Term")
+			academic_term.academic_year = y
+			academic_term.term_name = t
+			academic_term.save()
 
 def create_academic_year():
-    ac = ["2013-14", "2014-15", "2015-16", "2016-17", "2017-18"]
-    for d in ac:
-        academic_year = frappe.new_doc("Academic Year")
-        academic_year.academic_year_name = d
-        academic_year.save()
+	ac = ["2013-14", "2014-15", "2015-16", "2016-17", "2017-18"]
+	for d in ac:
+		academic_year = frappe.new_doc("Academic Year")
+		academic_year.academic_year_name = d
+		academic_year.save()
 
 def create_program(args):
-    for i in xrange(1,6):
-        if args.get("program_" + str(i)):
-            program = frappe.new_doc("Program")
-            program.program_name = args.get("program_" + str(i))
-            program.save()
+	for i in xrange(1,6):
+		if args.get("program_" + str(i)):
+			program = frappe.new_doc("Program")
+			program.program_name = args.get("program_" + str(i))
+			program.save()
 
 def create_course(args):
-    for i in xrange(1,6):
-        if args.get("course_" + str(i)):
-            course = frappe.new_doc("Course")
-            course.course_name = args.get("course_" + str(i))
-            course.save()
+	for i in xrange(1,6):
+		if args.get("course_" + str(i)):
+			course = frappe.new_doc("Course")
+			course.course_name = args.get("course_" + str(i))
+			course.save()
 
 def create_instructor(args):
-    for i in xrange(1,6):
-        if args.get("instructor_" + str(i)):
-            instructor = frappe.new_doc("Instructor")
-            instructor.instructor_name = args.get("instructor_" + str(i))
-            instructor.save()
+	for i in xrange(1,6):
+		if args.get("instructor_" + str(i)):
+			instructor = frappe.new_doc("Instructor")
+			instructor.instructor_name = args.get("instructor_" + str(i))
+			instructor.save()
 
 def create_room(args):
-    for i in xrange(1,6):
-        if args.get("room_" + str(i)):
-            room = frappe.new_doc("Room")
-            room.room_name = args.get("room_" + str(i))
-            room.seating_capacity = args.get("room_capacity_" + str(i))
-            room.save()
+	for i in xrange(1,6):
+		if args.get("room_" + str(i)):
+			room = frappe.new_doc("Room")
+			room.room_name = args.get("room_" + str(i))
+			room.seating_capacity = args.get("room_capacity_" + str(i))
+			room.save()
 
 
