Merge branch 'responsive' of github.com:webnotes/erpnext into responsive
diff --git a/public/js/startup.js b/public/js/startup.js
index 96953ad..26e5219 100644
--- a/public/js/startup.js
+++ b/public/js/startup.js
@@ -36,11 +36,18 @@
 		erpnext.toolbar.setup();
 		
 		// complete registration
-		if(in_list(user_roles,'System Manager') && (wn.boot.setup_complete=='No')) { 
+		if(in_list(user_roles,'System Manager') && (wn.boot.setup_complete==='No')) { 
 			wn.require("app/js/complete_setup.js");
 			erpnext.complete_setup.show(); 
-		}
-		if(wn.boot.expires_on && in_list(user_roles, 'System Manager')) {
+		} else if(!wn.boot.customer_count) {
+			if(wn.get_route()[0]!=="Setup") {
+				msgprint("<a class='btn btn-success' href='#Setup'>" 
+					+ wn._("Proceed to Setup") + "</a>\
+					<br><br><p class='text-muted'>"+
+					wn._("This message goes away after you create your first customer.")+
+					"</p>", wn._("Welcome"));
+			}
+		} else if(wn.boot.expires_on && in_list(user_roles, 'System Manager')) {
 			var today = dateutil.str_to_obj(wn.boot.server_date);
 			var expires_on = dateutil.str_to_obj(wn.boot.expires_on);
 			var diff = dateutil.get_diff(expires_on, today);
diff --git a/setup/doctype/setup_control/setup_control.py b/setup/doctype/setup_control/setup_control.py
index 0f4f6a1..9cb0c48 100644
--- a/setup/doctype/setup_control/setup_control.py
+++ b/setup/doctype/setup_control/setup_control.py
@@ -17,7 +17,7 @@
 from __future__ import unicode_literals
 import webnotes
 
-from webnotes.utils import cint, cstr, getdate, now, nowdate
+from webnotes.utils import cint, cstr, getdate, now, nowdate, get_defaults
 from webnotes.model.doc import Document, addchild
 from webnotes.model.code import get_obj
 from webnotes import session, form, msgprint
@@ -26,16 +26,31 @@
 	def __init__(self, d, dl):
 		self.doc, self.doclist = d, dl
 	
-	# Account Setup
-	# ---------------
 	def setup_account(self, args):
 		import webnotes, json
 		args = json.loads(args)
 		webnotes.conn.begin()
 
-		curr_fiscal_year, fy_start_date, fy_abbr = self.get_fy_details(args.get('fy_start'))
-		#webnotes.msgprint(self.get_fy_details(args.get('fy_start')))
+		self.update_profile_name(args)
+		add_all_roles_to(webnotes.session.user)
+		self.create_fiscal_year_and_company(args)
+		self.set_defaults(args)
+		create_territories()
+		self.create_price_lists(args)
+		self.create_feed_and_todo()
+		self.create_email_digest()
 
+		webnotes.clear_cache()
+		msgprint("Company setup is complete. This page will be refreshed in a moment.")
+		webnotes.conn.commit()
+
+		return {
+			'sys_defaults': get_defaults(), 
+			'user_fullname': (args.get('first_name') or '') + (args.get('last_name')
+					and (" " + args.get('last_name')) or '')
+		}
+	
+	def update_profile_name(self, args):
 		args['name'] = webnotes.session.get('user')
 
 		# Update Profile
@@ -44,39 +59,54 @@
 			UPDATE `tabProfile` SET first_name=%(first_name)s,
 			last_name=%(last_name)s
 			WHERE name=%(name)s AND docstatus<2""", args)
-			
-		
+	
+	def create_fiscal_year_and_company(self, args):
+		curr_fiscal_year, fy_start_date, fy_abbr = self.get_fy_details(args.get('fy_start'))
 		# Fiscal Year
-		master_dict = {'Fiscal Year':{
+		webnotes.bean([{
+			"doctype":"Fiscal Year",
 			'year': curr_fiscal_year,
 			'year_start_date': fy_start_date,
-		}}
-		self.create_records(master_dict)
-		
+		}]).insert()
 		
 		# Company
-		master_dict = {'Company': {
+		webnotes.bean([{
+			"doctype":"Company",
 			'company_name':args.get('company_name'),
 			'abbr':args.get('company_abbr'),
 			'default_currency':args.get('currency')
-		}}
-		self.create_records(master_dict)
-
+		}]).insert()
+		
+		self.curr_fiscal_year = curr_fiscal_year
+	
+	def create_price_lists(self, args):
+		webnotes.bean({
+			'doctype': 'Price List', 
+			'price_list_name': 'Standard Selling',
+			"buying_or_selling": "Selling",
+			"currency": args["currency"]
+		}).insert(),
+		webnotes.bean({
+			'doctype': 'Price List', 
+			'price_list_name': 'Standard Buying',
+			"buying_or_selling": "Buying",
+			"currency": args["currency"]
+		}).insert(),
+	
+	def set_defaults(self, args):
 		# enable default currency
 		webnotes.conn.set_value("Currency", args.get("currency"), "enabled", 1)
 		
-		def_args = {
-			'current_fiscal_year':curr_fiscal_year,
+		global_defaults = webnotes.bean("Global Defaults", "Global Defaults")
+		global_defaults.doc.fields.update({
+			'current_fiscal_year': self.curr_fiscal_year,
 			'default_currency': args.get('currency'),
 			'default_company':args.get('company_name'),
-			'date_format': webnotes.conn.get_value("Country", 
-				args.get("country"), "date_format"),
+			'date_format': webnotes.conn.get_value("Country", args.get("country"), "date_format"),
 			'emp_created_by':'Naming Series',
 			"float_precision": 4
-		}
-
-		# Set 
-		self.set_defaults(def_args)
+		})
+		global_defaults.save()
 		
 		webnotes.conn.set_value("Accounts Settings", None, "auto_inventory_accounting", 1)
 		webnotes.conn.set_default("auto_inventory_accounting", 1)
@@ -100,29 +130,20 @@
 		buying_settings.doc.pr_required = "No"
 		buying_settings.doc.maintain_same_rate = 1
 		buying_settings.save()
-		
-		cp_args = {}
+
+		notification_control = webnotes.bean("Notification Control")
+		notification_control.doc.quotation = 1
+		notification_control.doc.sales_invoice = 1
+		notification_control.doc.purchase_order = 1
+		notification_control.save()
+
+		# control panel
+		cp = webnotes.doc("Control Panel", "Control Panel")
 		for k in ['industry', 'country', 'timezone', 'company_name']:
-			cp_args[k] = args[k]
-		
-		self.set_cp_defaults(**cp_args)
-		
-		create_territories()
-
-		self.create_feed_and_todo()
-		
-		self.create_email_digest()
-
-		webnotes.clear_cache()
-		msgprint("Company setup is complete. This page will be refreshed in a moment.")
-		
-		import webnotes.utils
-		user_fullname = (args.get('first_name') or '') + (args.get('last_name')
-				and (" " + args.get('last_name')) or '')
-				
-		webnotes.conn.commit()
-		return {'sys_defaults': webnotes.utils.get_defaults(), 'user_fullname': user_fullname}
-		
+			cp.fields[k] = args[k]
+			
+		cp.save()
+			
 	def create_feed_and_todo(self):
 		"""update activty feed and create todo for creation of item, customer, vendor"""
 		import home
@@ -131,24 +152,9 @@
 			To Do List</a>' + '"</i>', '#6B24B3')
 
 		d = Document('ToDo')
-		d.description = 'Create your first Customer'
+		d.description = '<a href="#Setup">Complete ERPNext Setup</a>'
 		d.priority = 'High'
 		d.date = nowdate()
-		d.reference_type = 'Customer'
-		d.save(1)
-
-		d = Document('ToDo')
-		d.description = 'Create your first Item'
-		d.priority = 'High'
-		d.date = nowdate()
-		d.reference_type = 'Item'
-		d.save(1)
-
-		d = Document('ToDo')
-		d.description = 'Create your first Supplier'
-		d.priority = 'High'
-		d.date = nowdate()
-		d.reference_type = 'Supplier'
 		d.save(1)
 
 	def create_email_digest(self):
@@ -206,42 +212,7 @@
 			fy = cstr(curr_year) + '-' + cstr(curr_year+1)
 			abbr = cstr(curr_year)[-2:] + '-' + cstr(curr_year+1)[-2:]
 		return fy, stdt, abbr
-
-
-	def create_records(self, master_dict):
-		for d in master_dict.keys():
-			rec = Document(d)
-			for fn in master_dict[d].keys():
-				rec.fields[fn] = master_dict[d][fn]
-				
-			rec_obj = get_obj(doc=rec)
-			rec_obj.doc.save(1)
-			if hasattr(rec_obj, 'on_update'):
-				rec_obj.on_update()
-
-
-	# Set System Defaults
-	# --------------------
-	def set_defaults(self, def_args):
-		ma_obj = get_obj('Global Defaults','Global Defaults')
-		for d in def_args.keys():
-			ma_obj.doc.fields[d] = def_args[d]
-		ma_obj.doc.save()
-		ma_obj.on_update()
-
-
-	# Set Control Panel Defaults
-	# --------------------------
-	def set_cp_defaults(self, industry, country, timezone, company_name):
-		cp = Document('Control Panel','Control Panel')
-		cp.company_name = company_name
-		cp.industry = industry
-		cp.time_zone = timezone
-		cp.country = country
-		cp.save()
 			
-	# Create Profile
-	# --------------
 	def create_profile(self, user_email, user_fname, user_lname, pwd=None):
 		pr = Document('Profile')
 		pr.first_name = user_fname
@@ -261,7 +232,7 @@
 	profile = webnotes.doc("Profile", name)
 	for role in webnotes.conn.sql("""select name from tabRole"""):
 		if role[0] not in ["Administrator", "Guest", "All", "Customer", "Supplier", "Partner"]:
-			d = profile.addchild("userroles", "UserRole")
+			d = profile.addchild("user_roles", "UserRole")
 			d.role = role[0]
 			d.insert()
 			
diff --git a/setup/page/setup/setup.css b/setup/page/setup/setup.css
deleted file mode 100644
index bff44db..0000000
--- a/setup/page/setup/setup.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.setup-column {
-	float: left;
-	width: 45%;
-	margin-right: 5%;
-	margin-bottom: 15px;
-}
\ No newline at end of file
diff --git a/setup/page/setup/setup.js b/setup/page/setup/setup.js
index 788021a..04a8d48 100644
--- a/setup/page/setup/setup.js
+++ b/setup/page/setup/setup.js
@@ -1,228 +1,180 @@
-// ERPNext: Copyright 2013 Web Notes Technologies Pvt Ltd
-// GNU General Public License. See "license.txt"
+wn.pages['Setup'].onload = function(wrapper) { 
+	if(msg_dialog && msg_dialog.display) msg_dialog.hide();
+	wn.ui.make_app_page({
+		parent: wrapper,
+		title: 'Setup',
+		single_column: true
+	});
 
-wn.module_page["Setup"] = [
-	{
-		title: wn._("Organization"),
-		icon: "icon-building",
-		items: [
-			{
-				"label":wn._("Company"),
-				"doctype":"Company",
-				"description":wn._("List of companies (not customers / suppliers)")
-			},
-			{
-				"doctype":"Fiscal Year",
-				"label": wn._("Fiscal Year"),
-				"description":wn._("Financial Years for books of accounts")
-			},
-			{
-				"doctype":"Currency",
-				"label": wn._("Currency"),
-				"description": wn._("Enable / disable currencies.")
-			},
-		]
-	},
-	{
-		title: wn._("Users"),
-		icon: "icon-group",
-		right: true,
-		items: [
-			{
-				"doctype":"Profile",
-				"label": wn._("Profile"),
-				"description": wn._("Add/remove users, set roles, passwords etc")
-			},
-			{
-				"page":"permission-manager",
-				label: wn._("Permission Manager"),
-				"description": wn._("Set permissions on transactions / masters")
-			},
-			{
-				"page":"user-properties",
-				label: wn._("User Properties"),
-				"description":wn._("Set default values for users (also used for permissions).")
-			},
-			{
-				"doctype":"Workflow",
-				label:wn._("Workflow"),
-				"description":wn._("Set workflow rules.")
-			},
-			{
-				"doctype":"Authorization Rule",
-				label:wn._("Authorization Rule"),
-				"description":wn._("Restrict submission rights based on amount")
-			},
-		]
-	},
-	{
-		title: wn._("Data"),
-		icon: "icon-table",
-		items: [
-			{
-				"page":"data-import-tool",
-				label: wn._("Data Import"),
-				"description":wn._("Import data from spreadsheet (csv) files")
-			},
-			{
-				"route":"Form/Global Defaults",
-				doctype: "Global Defaults",
-				label: wn._("Global Defaults"),
-				"description":wn._("Set default values for entry"),
-			},
-			{
-				"route":"Form/Naming Series/Naming Series",
-				doctype: "Naming Series",
-				label: wn._("Manage Numbering Series"),
-				"description":wn._("Set multiple numbering series for transactions")
-			},
-			{
-				"route":"Form/Rename Tool",
-				doctype: "Rename Tool",
-				label: wn._("Rename Tool"),
-				"description":wn._("Rename multiple items in one go")
-			},
-			{
-				"route":"List/File Data",
-				doctype: "File Data",
-				label: wn._("File Manager"),
-				"description":wn._("List, delete uploaded files.")
-			},
-		]
-	},
-	{
-		title: wn._("Branding and Printing"),
-		icon: "icon-print",
-		right: true,
-		items: [
-			{
-				"doctype":"Letter Head",
-				label:wn._("Letter Head"),
-				"description":wn._("Letter heads for print")
-			},
-			{
-				"doctype":"Print Format",
-				label:wn._("Print Format"),
-				"description":wn._("HTML print formats for quotes, invoices etc")
-			},
-			{
-				"doctype":"Print Heading",
-				label:wn._("Print Heading"),
-				"description":wn._("Add headers for standard print formats")
-			},
-		]
-	},
-	{
-		title: wn._("Email Settings"),
-		icon: "icon-envelope",
-		items: [
-			{
-				"route":"Form/Email Settings/Email Settings",
-				doctype:"Email Settings",
-				label: wn._("Email Settings"),
-				"description":wn._("Out going mail server and support ticket mailbox")
-			},
-			{
-				"route":"Form/Sales Email Settings",
-				doctype:"Sales Email Settings",
-				label: wn._("Sales Email Settings"),
-				"description":wn._("Extract Leads from sales email id e.g. sales@example.com")
-			},
-			{
-				"route":"Form/Jobs Email Settings",
-				doctype:"Jobs Email Settings",
-				label: wn._("Jobs Email Settings"),
-				"description":wn._("Extract Job Applicant from jobs email id e.g. jobs@example.com")
-			},
-			{
-				"route":"Form/Notification Control/Notification Control",
-				doctype:"Notification Control",
-				label: wn._("Notification Control"),
-				"description":wn._("Prompt email sending to customers and suppliers"),
-			},
-			{
-				"doctype":"Email Digest",
-				label: wn._("Email Digest"),
-				"description":wn._("Daily, weekly, monthly email Digests")
-			},
-			{
-				"route":"Form/SMS Settings/SMS Settings",
-				doctype:"SMS Settings",
-				label: wn._("SMS Settings"),
-				"description":wn._("Setup outgoing SMS via your bulk SMS provider")
-			},
-			{
-				"route":"Form/SMS Center/SMS Center",
-				doctype:"SMS Center",
-				label: wn._("SMS Center"),
-				"description":wn._("Send bulk SMS to leads, customers, contacts")
-			},
-		]
-	},
-	{
-		title: wn._("Customize"),
-		icon: "icon-wrench",
-		items: [			
-			{
-				"route":"Form/Customize Form/Customize Form",
-				doctype:"Customize Form",
-				label: wn._("Customize Form"),
-				"description":wn._("Change entry properties (hide fields, make mandatory etc)")
-			},
-			{
-				"doctype":"Custom Field",
-				label: wn._("Custom Field"),
-				"description":wn._("Add fields to forms")
-			},
-			{
-				"doctype":"Custom Script",
-				label: wn._("Custom Script"),
-				"description":wn._("Add custom code to forms")
-			},
-			{
-				"route":"Form/Features Setup/Features Setup",
-				"description":wn._("Simplify entry forms by disabling features"),
-				doctype:"Features Setup",
-				label: wn._("Features Setup"),
-			},
-			{
-				"page":"modules_setup",
-				label: wn._("Show / Hide Modules"),
-				"description":wn._("Show, hide modules")
-			},
-		]
-	},
-	{
-		title: wn._("Administration"),
-		icon: "icon-rocket",
-		right: true,
-		items: [
-			{
-				"page":"update-manager",
-				label: wn._("Update This Application"),
-				"description":wn._("Apply latest updates and patches to this app")
-			},
-			{
-				"route":"Form/Backup Manager",
-				doctype:"Backup Manager",
-				label: wn._("Backup Manager"),
-				"description":wn._("Sync backups with remote tools like Dropbox etc.")
-			},
-			{
-				"route":"List/Scheduler Log",
-				doctype:"Scheduler Log",
-				label: wn._("Scheduler Error Log"),
-				"description":wn._("Get a list of errors encountered by the Scheduler")
-			},
-		]
-	},
-]
+	wrapper.appframe.add_module_icon("Setup");
+	
+	var body = $(wrapper).find(".layout-main"),
+		total = 0,
+		completed = 0;
 
-pscript['onload_Setup'] = function(wrapper) {
-	wn.views.moduleview.make(wrapper, "Setup");
-	if(wn.boot.expires_on) {
-		$(wrapper).find(".main-section")
-			.prepend("<div class='alert'>Your ERPNext account will expire on "
-				+ wn.datetime.global_date_format(wn.boot.expires_on) + "</div>");
+	body.html('<div class="progress progress-striped active">\
+		<div class="progress-bar" style="width: 100%;"></div></div>')
+
+	wn.call({
+		method: "setup.page.setup.setup.get",
+		callback: function(r) {
+			if(r.message) {
+				body.empty();
+				if(wn.boot.expires_on) {
+					$(body).prepend("<div class='text-muted' style='text-align:right'>Account expires on "
+							+ wn.datetime.global_date_format(wn.boot.expires_on) + "</div>");
+				}
+
+				$completed = $('<h4>Setup Completed <span class="completed-percent"></span><h4>\
+					<div class="progress"><div class="progress-bar"></div></div>')
+					.appendTo(body);
+
+				$.each(r.message, function(i, item) {
+					render_item(item)
+				});
+				
+				var completed_percent = cint(flt(completed) / total * 100) + "%";
+				$completed
+					.find(".progress-bar")
+					.css({"width": completed_percent});
+				$(body)
+					.find(".completed-percent")
+					.html("(" + completed_percent + ")");
+			}
+		}
+	});
+	
+	var render_item = function(item, dependency) {		
+		if(item.type==="Section") {
+			$("<h3>")
+				.css({"margin": "20px 0px 15px 0px"})
+				.html('<i class="'+item.icon+'"></i> ' + item.title).appendTo(body);
+			return;
+		}
+		var row = $('<div class="row">')
+			.css({
+				"margin-bottom": "7px",
+				"padding-bottom": "7px",
+				"border-bottom": "1px solid #eee"
+			})
+			.appendTo(body);
+
+		$('<div class="col col-lg-1"></div>').appendTo(row);
+			
+		if(item.type==="Link") {
+			var col = $('<div class="col col-lg-5"><b><a href="#'
+				+item.route+'"><i class="'+item.icon+'"></i> '
+				+item.title+'</a></b></div>').appendTo(row);
+			
+		} else {
+			var col = $('<div class="col col-lg-5">\
+					<span class="badge">'+ item.count +'</span>'+
+					' <b>' + (item.title || item.doctype) + '</b>'
+					+'</div>')
+				.appendTo(row);
+
+			if(dependency) 
+				col.addClass("col-offset-1");
+			else
+				$('<div class="col col-lg-1"></div>').appendTo(row);
+
+			col.find(".badge")
+				.css({
+					"background-color": (item.count ? "green" : "orange"),
+					"display": "inline-block",
+					"min-width": "40px"
+				});
+
+			total += 1;
+			if(item.count)
+				completed += 1;
+		}
+			
+		if(item.doctype) {
+			col.find(".badge")
+				.attr("data-doctype", item.doctype)
+				.css({"cursor": "pointer"})
+				.click(function() {
+					wn.set_route("List", $(this).attr("data-doctype"))
+				})
+		}
+		
+		// tree
+		$links = $('<div class="col col-lg-5">').appendTo(row);
+		
+		if(item.tree) {
+			$('<a class="view-link"><i class="icon-sitemap"></i> Browse</a>\
+				<span class="text-muted">|</span> \
+				<a class="import-link"><i class="icon-upload"></i> Import</a>')
+				.appendTo($links)
+
+			$links.find(".view-link")
+				.attr("data-doctype", item.doctype)
+				.click(function() {
+					wn.set_route(item.tree, item.doctype);
+				})
+		} else if(item.single) {
+			$('<a class="view-link"><i class="icon-edit"></i> Edit</a>')
+				.appendTo($links)
+
+			$links.find(".view-link")
+				.attr("data-doctype", item.doctype)
+				.click(function() {
+					wn.set_route("Form", $(this).attr("data-doctype"));
+				})
+		} else if(item.type !== "Link"){
+			$('<a class="new-link"><i class="icon-plus"></i> New</a> \
+				<span class="text-muted">|</span> \
+				<a class="view-link"><i class="icon-list"></i> View</a> \
+				<span class="text-muted">|</span> \
+				<a class="import-link"><i class="icon-upload"></i> Import</a>')
+				.appendTo($links)
+
+			$links.find(".view-link")
+				.attr("data-doctype", item.doctype)
+				.click(function() {
+					if($(this).attr("data-filter")) {
+						wn.route_options = JSON.parse($(this).attr("data-filter"));
+					}
+					wn.set_route("List", $(this).attr("data-doctype"));
+				})
+
+			if(item.filter)
+				$links.find(".view-link").attr("data-filter", JSON.stringify(item.filter))
+
+			if(wn.model.can_create(item.doctype)) {
+				$links.find(".new-link")
+					.attr("data-doctype", item.doctype)
+					.click(function() {
+						new_doc($(this).attr("data-doctype"))
+					})
+			} else {
+				$links.find(".new-link").remove();
+				$links.find(".text-muted:first").remove();
+			}
+
+		}
+
+		$links.find(".import-link")
+			.attr("data-doctype", item.doctype)
+			.click(function() {
+				wn.route_options = {doctype:$(this).attr("data-doctype")}
+				wn.set_route("data-import-tool");
+			})
+			
+		if(item.links) {
+			$.each(item.links, function(i, link) {
+				var newlinks = $('<span class="text-muted"> |</span> \
+				<a class="import-link" href="#'+link.route
+					+'"><i class="'+link.icon+'"></i> '+link.title+'</a>')
+					.appendTo($links)
+			})
+		}
+			
+		if(item.dependencies) {
+			$.each(item.dependencies, function(i, d) {
+				render_item(d, true);
+			})
+		}
 	}
 }
\ No newline at end of file
diff --git a/setup/page/setup/setup.py b/setup/page/setup/setup.py
new file mode 100644
index 0000000..ab2cdb7
--- /dev/null
+++ b/setup/page/setup/setup.py
@@ -0,0 +1,244 @@
+from __future__ import unicode_literals
+import webnotes
+
+items = [
+	{
+		"type": "Section",
+		"title": "Organization",
+		"icon": "icon-building"
+	},
+	{"doctype":"Company"}, 
+	{"doctype":"Fiscal Year"}, 
+	{"doctype":"Currency"}, 
+	{
+		"type": "Section",
+		"title": "Users and Permissions",
+		"icon": "icon-user"
+	},
+	{ 
+		"doctype":"Profile",
+	}, 
+	{ 
+		"doctype":"Role",
+	}, 
+	{ "title": "Permission Manager", 
+		"route": "permission-manager", "type": "Link", "icon": "icon-shield" },
+	{ "title": "User Properties", 
+		"route": "user-properties", "type": "Link", "icon": "icon-user" },
+	{
+		"type": "Section",
+		"title": "Master Data",
+		"icon": "icon-star"
+	},
+	{
+		"doctype": "Item",
+		"dependencies": [
+			{"doctype":"Item Group", "tree": "Sales Browser"}, 
+			{"doctype":"Warehouse"}, 
+			{"doctype":"UOM"}, 
+			{"doctype":"Brand"},
+			{"doctype":"Price List"}, 
+		],
+	},
+	{
+		"doctype": "Customer",
+		"dependencies": [
+			{"doctype":"Customer Group", "tree": "Sales Browser"}, 
+			{"doctype":"Territory", "tree": "Sales Browser"}, 
+			{"doctype":"Sales Person", "tree": "Sales Browser"}, 
+			{"doctype":"Contact"}, 
+			{"doctype":"Address"}, 
+		]
+	},
+	{
+		"doctype": "Supplier",
+		"dependencies": [
+			{"doctype":"Supplier Type"}, 
+			{"doctype":"Contact"}, 
+			{"doctype":"Address"}, 
+		]
+	},
+	{
+		"type": "Section",
+		"title": "Accounts",
+		"icon": "icon-money"
+	},
+	{
+		"doctype": "Account",
+		"tree": "Accounts Browser",
+		"dependencies": [
+			{
+				"title": "Bank Accounts",
+				"doctype":"Account",
+				"filter": {"account_type": "Bank or Cash"}
+			}, 
+			{
+				"title": "Tax Accounts",
+				"doctype":"Account",
+				"filter": {"account_type": "Tax"}
+			},
+		]
+	},
+	{ 
+		"doctype": "Cost Center",
+		"tree": "Accounts Browser",
+	},
+	{ "doctype": "Sales Taxes and Charges Master" },
+	{ "doctype": "Purchase Taxes and Charges Master" },
+	{
+		"type": "Section",
+		"title": "Human Resource",
+		"icon": "icon-group"
+	},
+	{ 
+		"doctype": "Employee",
+		"dependencies": [
+			{ "doctype": "Employment Type" },
+			{ "doctype": "Branch" },
+			{ "doctype": "Department" },
+			{ "doctype": "Designation" },
+			{ "doctype": "Holiday List" },
+			{ "doctype": "Grade" },
+		]
+	 },
+	{ "doctype": "Salary Structure" },
+	{ "doctype": "Leave Allocation" },
+	{ "doctype": "Appraisal Template" },
+	{
+		"type": "Section",
+		"title": "Printing",
+		"icon": "icon-print"
+	},
+	{ "doctype": "Letter Head" },
+	{ "doctype": "Print Heading" },
+	{ "doctype": "Print Format", "filter": {"standard": "No"} },
+	{
+		"type": "Section",
+		"title": "Email",
+		"icon": "icon-envelope-alt"
+	},
+	{ 
+		"title": "Outgoing Email Settings",
+		"doctype": "Email Settings",
+		"single": 1,
+		"query": "select count(*) from tabSingles where doctype='Email Settings' and field='outgoing_mail_server'"
+	},
+	{ 
+		"doctype": "Support Email Settings",
+		"single": 1,
+		"query": "select count(*) from tabSingles where doctype='Email Settings' and field='support_host'"
+	},
+	{ 
+		"doctype": "Sales Email Settings",
+		"single": 1,
+		"query": "select count(*) from tabSingles where doctype='Sales Email Settings' and field='host'"
+	},
+	{ 
+		"doctype": "Jobs Email Settings",
+		"single": 1,
+		"query": "select count(*) from tabSingles where doctype='Jobs Email Settings' and field='host'"
+	},
+	{ 
+		"doctype": "Email Digest",
+	},
+	{ 
+		"doctype": "SMS Settings", 
+		"single": 1,
+	 	"query": "select count(*) from tabSingles where doctype='SMS Settings' and field='sms_gateway_url'"
+	},
+	{
+		"type": "Section",
+		"title": "Opening Accounts and Stock",
+		"icon": "icon-eye-open"
+	},
+	{ "doctype": "Stock Reconciliation" },
+	{ 
+		"doctype": "Journal Voucher",
+		"title": "Opening Accounting Entries",
+		"filter": {
+			"is_opening": "Yes"
+		}
+	},
+	{
+		"type": "Section",
+		"title": "Customization",
+		"icon": "icon-glass"
+	},
+	{ 
+		"doctype": "Customize Form",
+		"single": 1,
+		"query": "select count(distinct doc_type) from `tabProperty Setter`"
+	},
+	{ "doctype": "Workflow" },
+	{ "doctype": "Authorization Rule" },
+	{ "doctype": "Custom Field" },
+	{ "doctype": "Custom Script" },
+	{
+		"type": "Section",
+		"title": "Tools",
+		"icon": "icon-wrench"
+	},
+	{ "title": "Global Settings / Default Values", 
+		"doctype": "Global Defaults", "single": 1,
+	 	"query": """select count(*) from tabSingles where doctype='Global Defaults' 
+		and field not in ('owner', 'creation', 'modified', 'modified_by')"""},
+		
+	{ "title": "Show / Hide Features", 
+		"doctype": "Features Setup", "single": 1,
+	 	"query": """select count(*) from tabSingles where doctype='Features Setup' 
+		and field not in ('owner', 'creation', 'modified', 'modified_by')"""},
+
+	{ "title": "Enable / Disable Email Notifications", 
+		"doctype": "Notification Control", "single": 1,
+	 	"query": """select count(*) from tabSingles where doctype='Notification Control' 
+		and field in ('quotation', 'sales_order', 'sales_invoice', 'purchase_order', 'purchase_receipt', 'expense_claim', 'delivery_note')"""},
+
+	{ "doctype": "File Data", "title": "Uploaded File Attachments" },
+
+	{ "title": "Data Import", 
+		"route": "data-import-tool", "type": "Link", "icon": "icon-upload" },
+	{ "title": "Bulk Rename", 
+		"route": "Form/Rename Tool", "type": "Link", "icon": "icon-upload" },
+	{ "title": "Update Numbering Series", 
+		"route": "Form/Naming Series", "type": "Link", "icon": "icon-sort-by-order" },
+	{ "title": "Show / Hide Modules", 
+		"route": "modules_setup", "type": "Link", "icon": "icon-th" },
+	{ "title": "Send Bulk SMS to Leads / Contacts", 
+		"route": "Form/SMS Center", "type": "Link", "icon": "icon-mobile-phone" },
+	{
+		"type": "Section",
+		"title": "System Administration",
+		"icon": "icon-cog"
+	},
+	{ "title": "Update ERPNext", 
+		"route": "update-manager", "type": "Link", "icon": "icon-rss" },
+	{ "title": "Manage 3rd Party Backups", 
+		"route": "Form/Backup Manager", "type": "Link", "icon": "icon-cloud" },
+	{ "title": "System Scheduler Errors", 
+		"route": "Report/Scheduler Log", "type": "Link", "icon": "icon-exclamation-sign" },
+]
+
+@webnotes.whitelist(allow_roles=["System Manager"])
+def get():
+	for item in items:
+		if item.get("type")=="Section":
+			continue
+		set_count(item)
+		
+		if item.get("dependencies"):
+			for d in item["dependencies"]:
+				set_count(d)
+		
+	return items
+	
+def set_count(item):
+	if "query" in item:
+		item["count"] = webnotes.conn.sql(item["query"])[0][0]
+	elif "filter" in item:
+		key = item["filter"].keys()[0]
+		item["count"] = webnotes.conn.sql("""select count(*) from `tab%s` where
+			%s = %s""" % (item["doctype"], key, "%s"),
+			item["filter"][key])[0][0]
+	elif "doctype" in item:
+		item["count"] = webnotes.conn.sql("select count(*) from `tab%s`" \
+			% item["doctype"])[0][0]
diff --git a/startup/boot.py b/startup/boot.py
index 7d5eb4e..a75c78a 100644
--- a/startup/boot.py
+++ b/startup/boot.py
@@ -22,8 +22,12 @@
 			"Notification Control").get_values()
 				
 		# if no company, show a dialog box to create a new company
-		bootinfo['setup_complete'] = webnotes.conn.sql("""select name from 
-			tabCompany limit 1""") and 'Yes' or 'No'
+		bootinfo["customer_count"] = webnotes.conn.sql("""select count(*) from tabCustomer""")[0][0]
+
+		if not bootinfo["customer_count"]:
+			bootinfo['setup_complete'] = webnotes.conn.sql("""select name from 
+				tabCompany limit 1""") and 'Yes' or 'No'
+		
 		
 		# load subscription info
 		import conf
diff --git a/startup/install.py b/startup/install.py
index 205bee4..89ab290 100644
--- a/startup/install.py
+++ b/startup/install.py
@@ -135,13 +135,7 @@
 			
 		# supplier type
 		{'doctype': 'Supplier Type', 'name': 'Default Supplier Type', 'supplier_type': 'Default Supplier Type'},
-		
-		# Price List
-		{'doctype': 'Price List', 'name': 'Default Price List', 'price_list_name': 'Default Price List',
-			"buying_or_selling": "Selling"},
-		{'doctype': 'Price List', 'name': 'Standard', 'price_list_name': 'Standard',
-			"buying_or_selling": "Selling"},
-				
+
 		# warehouse type
 		{'doctype': 'Warehouse Type', 'name': 'Default Warehouse Type', 'warehouse_type': 'Default Warehouse Type'},
 		{'doctype': 'Warehouse Type', 'name': 'Fixed Asset', 'warehouse_type': 'Fixed Asset'},