diff --git a/erpnext/public/css/erpnext.css b/erpnext/public/css/erpnext.css
index 13fdcf1..460efbf 100644
--- a/erpnext/public/css/erpnext.css
+++ b/erpnext/public/css/erpnext.css
@@ -356,3 +356,12 @@
   border-radius: 3px;
   color: #fff;
 }
+.leaderboard .result {
+  border-top: 1px solid #d1d8dd;
+}
+.leaderboard .list-item {
+  padding-left: 45px;
+}
+.leaderboard .list-item_content {
+  padding-right: 45px;
+}
diff --git a/erpnext/public/less/erpnext.less b/erpnext/public/less/erpnext.less
index de46c53..d0c4841 100644
--- a/erpnext/public/less/erpnext.less
+++ b/erpnext/public/less/erpnext.less
@@ -423,4 +423,19 @@
 	padding: 5px 9px;
 	border-radius: 3px;
 	color: #fff;
+
+}
+
+// Leaderboard
+
+.leaderboard {
+	.result {
+		border-top: 1px solid #d1d8dd;
+	}
+	.list-item {
+		padding-left: 45px;
+	}
+	.list-item_content {
+		padding-right: 45px;
+	}
 }
\ No newline at end of file
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.html b/erpnext/utilities/page/leaderboard/leaderboard.html
deleted file mode 100644
index 8df2247..0000000
--- a/erpnext/utilities/page/leaderboard/leaderboard.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<div class="frappe-list-area">
-	<div class="frappe-list">
-		<div class="list-filters">
-			<div class="list-filter-item">
-				<select class="form-control select-doctype">
-					{% for (var i=0; i < doctypes.length; i++) { %}
-						<option value="{{doctypes[i]}}">{{ doctypes[i] }}</option>
-					{% } %}
-				</select>
-			</div>
-
-			<div class="list-filter-item">
-				<select class="form-control select-time">
-					{% for (var i=0; i < timelines.length; i++) { %}
-						<option value="{{timelines[i]}}">{{ timelines[i] }}</option>
-					{% } %}
-				</select>
-			</div>
-		</div>
-		<div class="leaderboard">
-		</div>
-	</div>
-</div>
\ No newline at end of file
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.js b/erpnext/utilities/page/leaderboard/leaderboard.js
index eed9bd1..0d16ab0 100644
--- a/erpnext/utilities/page/leaderboard/leaderboard.js
+++ b/erpnext/utilities/page/leaderboard/leaderboard.js
@@ -1,114 +1,166 @@
+frappe.pages["leaderboard"].on_page_load = function (wrapper) {
+	frappe.leaderboard = new frappe.Leaderboard(wrapper);
+}
 
 frappe.Leaderboard = Class.extend({
 
 	init: function (parent) {
-		this.page = frappe.ui.make_app_page({
+		frappe.ui.make_app_page({
 			parent: parent,
 			title: "Leaderboard",
-			single_column: true
+			single_column: false
 		});
 
+		this.parent = parent;
+		this.page = this.parent.page;
+		this.page.sidebar.html(`<ul class="module-sidebar-nav overlay-sidebar nav nav-pills nav-stacked"></ul>`);
+		this.$sidebar_list = this.page.sidebar.find('ul');
+
 		// const list of doctypes
 		this.doctypes = ["Customer", "Item", "Supplier", "Sales Partner"];
-		this.timelines = ["Week", "Month", "Quarter", "Year"];
+		this.timespans = ["Week", "Month", "Quarter", "Year"];
 		this.desc_fields = ["total_amount", "total_request", "annual_billing", "commission_rate"];
 		this.filters = {
-			"Customer": this.map_array(["title", "total_amount", "total_item_purchased", "modified"]),
-			"Item": this.map_array(["title", "total_request", "total_purchase", "avg_price", "modified"]),
-			"Supplier": this.map_array(["title", "annual_billing", "total_unpaid", "modified"]),
-			"Sales Partner": this.map_array(["title", "commission_rate", "target_qty", "target_amount", "modified"]),
+			"Customer": ["total_amount", "total_item_purchased"],
+			"Item": ["total_request", "total_purchase", "avg_price"],
+			"Supplier": ["annual_billing", "total_unpaid"],
+			"Sales Partner": ["commission_rate", "target_qty", "target_amount"],
 		};
 
 		// for saving current selected filters
-		const _selected_filter = this.filters[this.doctypes[0]];
+		// TODO: revert to 0 index for doctype and timespan, and remove preset down
+		const _initial_doctype = this.doctypes[0];
+		const _initial_timespan = this.timespans[0];
+		const _initial_filter = this.filters[_initial_doctype];
+
 		this.options = {
-			selected_doctype: this.doctypes[0],
-			selected_filter: _selected_filter,
-			selected_filter_item: _selected_filter[1],
-			selected_timeline: this.timelines[0],
+			selected_doctype: _initial_doctype,
+			selected_filter: _initial_filter,
+			selected_filter_item: _initial_filter[0],
+			selected_timespan: _initial_timespan,
 		};
 
 		this.message = null;
 		this.make();
 	},
 
-
-
 	make: function () {
 		var me = this;
 
-		var $leaderboard = $(frappe.render_template("leaderboard", this)).appendTo(this.page.main);
+		var $container = $(`<div class="leaderboard page-main-content">
+			<div class="leaderboard-graph"></div>
+			<div class="leaderboard-list"></div>
+		</div>`).appendTo(this.page.main);
 
-		// events
-		$leaderboard.find(".select-doctype")
-			.on("change", function () {
-				me.options.selected_doctype = this.value;
-				me.options.selected_filter = me.filters[this.value];
-				me.options.selected_filter_item = me.filters[this.value][1];
-				me.make_request($leaderboard);
-			});
+		this.$graph_area = $container.find('.leaderboard-graph');
 
-		$leaderboard.find(".select-time")
-			.on("change", function () {
-				me.options.selected_timeline = this.value;
-				me.make_request($leaderboard);
-			});
+		this.doctypes.map(doctype => {
+			this.get_sidebar_item(doctype).appendTo(this.$sidebar_list);
+		});
+
+		this.timespan_select = this.page.add_select(__("Timespan"),
+			this.timespans.map(d => {
+				return {"label": __(d), value: d }
+			})
+		);
+
+		// this.timespan_select.val(this.timespans[1]);
+
+		this.type_select = this.page.add_select(__("Type"),
+			me.options.selected_filter.map(d => {
+				return {"label": __(frappe.model.unscrub(d)), value: d }
+			})
+		);
+
+		this.$sidebar_list.on('click', 'li', function(e) {
+			let $li = $(this);
+			let doctype = $li.find('span').html();
+
+			me.options.selected_doctype = doctype;
+			me.options.selected_filter = me.filters[doctype];
+			me.options.selected_filter_item = me.filters[doctype][0];
+
+			me.type_select.empty().add_options(
+				me.options.selected_filter.map(d => {
+					return {"label": __(frappe.model.unscrub(d)), value: d }
+				})
+			);
+
+			me.$sidebar_list.find('li').removeClass('active');
+			$li.addClass('active');
+
+			me.make_request($container);
+		});
+
+		this.timespan_select.on("change", function() {
+			me.options.selected_timespan = this.value;
+			me.make_request($container);
+		});
+
+		this.type_select.on("change", function() {
+			me.options.selected_filter_item = this.value
+			me.make_request($container);
+		});
 
 		// now get leaderboard
-		me.make_request($leaderboard);
+		this.$sidebar_list.find('li:first').trigger('click');
 	},
 
-	make_request: function ($leaderboard) {
+	make_request: function ($container) {
 		var me = this;
 
 		frappe.model.with_doctype(me.options.selected_doctype, function () {
-			me.get_leaderboard(me.get_leaderboard_data, $leaderboard);
+			me.get_leaderboard(me.get_leaderboard_data, $container);
 		});
 	},
 
-	get_leaderboard: function (notify, $leaderboard) {
+	get_leaderboard: function (notify, $container, start=0) {
 		var me = this;
 
 		frappe.call({
 			method: "erpnext.utilities.page.leaderboard.leaderboard.get_leaderboard",
 			args: {
-				obj: JSON.stringify(me.options)
+				doctype: me.options.selected_doctype,
+				timespan: me.options.selected_timespan,
+				field: me.options.selected_filter_item,
+				start: start
 			},
-			callback: function (res) {
-				console.log(res)
-				notify(me, res, $leaderboard);
+			callback: function (r) {
+				let results = r.message || [];
+
+				let graph_items = results.slice(0, 10);
+
+				me.$graph_area.show().empty();
+				let args = {
+					parent: me.$graph_area,
+					y: [
+						{
+							color: 'light-green',
+							values: graph_items.map(d=>d.value),
+							formatted: graph_items.map(d=>d[me.options.selected_filter_item])
+						}
+					],
+					x: {
+						values: graph_items.map(d=>d.name)
+					},
+					mode: 'bar',
+					height: 140
+				};
+				new frappe.ui.Graph(args);
+
+				notify(me, r, $container);
 			}
 		});
 	},
 
-	get_leaderboard_data: function (me, res, $leaderboard) {
+	get_leaderboard_data: function (me, res, $container) {
 		if (res && res.message) {
 			me.message = null;
-			$leaderboard.find(".leaderboard").html(me.render_list_view(res.message));
-
-			// event to change arrow
-			$leaderboard.find(".leaderboard-item")
-				.click(function () {
-					const field = this.innerText.trim().toLowerCase().replace(new RegExp(" ", "g"), "_");
-					if (field && field !== "title") {
-						const _selected_filter_item = me.options.selected_filter
-							.filter(i => i.field === field);
-						if (_selected_filter_item.length > 0) {
-							me.options.selected_filter_item = _selected_filter_item[0];
-							me.options.selected_filter_item.value = _selected_filter_item[0].value === "ASC" ? "DESC" : "ASC";
-
-							const new_class_name = `icon-${me.options.selected_filter_item.field} fa fa-chevron-${me.options.selected_filter_item.value === "ASC" ? "up" : "down"}`;
-							$leaderboard.find(`.icon-${me.options.selected_filter_item.field}`)
-								.attr("class", new_class_name);
-
-							// now make request to web
-							me.make_request($leaderboard);
-						}
-					}
-				});
+			$container.find(".leaderboard-list").html(me.render_list_view(res.message));
 		} else {
+			me.$graph_area.hide();
 			me.message = "No items found.";
-			$leaderboard.find(".leaderboard").html(me.render_list_view());
+			$container.find(".leaderboard-list").html(me.render_list_view());
 		}
 	},
 
@@ -129,7 +181,7 @@
 
 		var html =
 			`${me.render_list_header()}
-			 ${me.render_list_result(items)}`;
+			${me.render_list_result(items)}`;
 
 		return html;
 	},
@@ -137,23 +189,21 @@
 	render_list_header: function () {
 		var me = this;
 		const _selected_filter = me.options.selected_filter
-			.map(i => me.map_field(i.field)).slice(1);
+			.map(i => frappe.model.unscrub(i));
+		const fields = ['name', me.options.selected_filter_item];
 
 		const html =
 			`<div class="list-headers">
 				<div class="list-item list-item--head" data-list-renderer="${"List"}">
 					${
-					me.options.selected_filter
-						.map(filter => {
-							const col = me.map_field(filter.field);
+					fields.map(filter => {
+							const col = frappe.model.unscrub(filter);
 							return (
 								`<div class="leaderboard-item list-item_content ellipsis text-muted list-item__content--flex-2
-									header-btn-base ${(col !== "Title" && col !== "Modified") ? "hidden-xs" : ""}
+									header-btn-base
 									${(col && _selected_filter.indexOf(col) !== -1) ? "text-right" : ""}">
 									<span class="list-col-title ellipsis">
 										${col}
-										<i class="${"icon-" + filter.field} fa ${filter.value === "ASC" ? "fa-chevron-up" : "fa-chevron-down"}"
-											style="${col === "Title" ? "display:none;" : ""}"></i>
 									</span>
 								</div>`);
 						}).join("")
@@ -166,9 +216,18 @@
 	render_list_result: function (items) {
 		var me = this;
 
-		let _html = items.map((item) => {
+		let _html = items.map((item, index) => {
 			const $value = $(me.get_item_html(item));
-			const $item_container = $(`<div class="list-item-container">`).append($value);
+
+			let item_class = "";
+			if(index == 0) {
+				item_class = "first";
+			} else if (index == 1) {
+				item_class = "second";
+			} else if(index == 2) {
+				item_class = "third";
+			}
+			const $item_container = $(`<div class="list-item-container  ${item_class}">`).append($value);
 			return $item_container[0].outerHTML;
 		}).join("");
 
@@ -186,10 +245,10 @@
 		var me = this;
 
 		let html =
-			`<div class="no-result text-center" style="${me.message ? "" : "display:none;"}">   
+			`<div class="no-result text-center" style="${me.message ? "" : "display:none;"}">
 				<div class="msg-box no-border">
 					<p>No Item found</p>
-				</div>  
+				</div>
 			</div>`;
 
 		return html;
@@ -198,25 +257,25 @@
 	get_item_html: function (item) {
 		var me = this;
 		const _selected_filter = me.options.selected_filter
-			.map(i => me.map_field(i.field)).slice(1);
+			.map(i => frappe.model.unscrub(i));
+		const fields = ['name', me.options.selected_filter_item];
 
 		const html =
 			`<div class="list-item">
 				${
-			me.options.selected_filter
-				.map(filter => {
-					const col = me.map_field(filter.field);
-					let val = item[filter.field];
+			fields.map(filter => {
+					const col = frappe.model.unscrub(filter);
+					let val = item[filter];
 					if (col === "Modified") {
 						val = comment_when(val);
 					}
 					return (
 						`<div class="list-item_content ellipsis list-item__content--flex-2
-							${(col !== "Title" && col !== "Modified") ? "hidden-xs" : ""}
+							${(col !== "Name" && col !== "Modified") ? "hidden-xs" : ""}
 							${(col && _selected_filter.indexOf(col) !== -1) ? "text-right" : ""}">
 							${
-								col === "Title"	
-									? `<a class="grey list-id ellipsis" href="${item["href"]}"> ${val} </a>` 
+								col === "Name"
+									? `<a class="grey list-id ellipsis" href="${item["href"]}"> ${val} </a>`
 									: `<span class="text-muted ellipsis"> ${val}</span>`
 							}
 						</div>`);
@@ -227,22 +286,10 @@
 		return html;
 	},
 
-	map_field: function (field) {
-		return field.replace(new RegExp("_", "g"), " ").replace(/(^|\s)[a-z]/g, f => f.toUpperCase())
-	},
-
-	map_array: function (_array) {
-		var me = this;
-		return _array.map((str) => {
-			let value = me.desc_fields.indexOf(str) > -1 ? "DESC" : "ASC";
-			return {
-				field: str,
-				value: value
-			};
-		});
+	get_sidebar_item: function(item) {
+		return $(`<li class="strong module-sidebar-item">
+			<a class="module-link">
+			<span>${ item }</span></a>
+		</li>`);
 	}
 });
-
-frappe.pages["leaderboard"].on_page_load = function (wrapper) {
-	frappe.leaderboard = new frappe.Leaderboard(wrapper);
-}
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.json b/erpnext/utilities/page/leaderboard/leaderboard.json
index 8cba765..8ccef7d 100644
--- a/erpnext/utilities/page/leaderboard/leaderboard.json
+++ b/erpnext/utilities/page/leaderboard/leaderboard.json
@@ -4,7 +4,7 @@
  "docstatus": 0, 
  "doctype": "Page", 
  "idx": 0, 
- "modified": "2017-06-06 02:54:27.504048", 
+ "modified": "2017-09-12 14:05:26.422064", 
  "modified_by": "Administrator", 
  "module": "Utilities", 
  "name": "leaderboard", 
@@ -15,5 +15,5 @@
  "standard": "Yes", 
  "style": null, 
  "system_page": 0, 
- "title": "LeaderBoard"
+ "title": "Leaderboard"
 }
\ No newline at end of file
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.py b/erpnext/utilities/page/leaderboard/leaderboard.py
index 0a75410..50e8abf 100644
--- a/erpnext/utilities/page/leaderboard/leaderboard.py
+++ b/erpnext/utilities/page/leaderboard/leaderboard.py
@@ -5,69 +5,156 @@
 import frappe
 import json
 from operator import itemgetter
-from frappe.utils import add_to_date
+from frappe.utils import add_to_date, fmt_money
 from erpnext.accounts.party import get_dashboard_info
 from erpnext.accounts.utils import get_currency_precision
 
 @frappe.whitelist()
-def get_leaderboard(obj):
+def get_leaderboard(doctype, timespan, field, start=0):
 	"""return top 10 items for that doctype based on conditions"""
-	obj = frappe._dict(json.loads(obj))
 
-	doctype = obj.selected_doctype
-	timeline = obj.selected_timeline
-	filters = {"modified":(">=", get_date_from_string(timeline))}
+	print('doctype', doctype, timespan, field, start)
+
+	filters = {"modified":(">=", get_date_from_string(timespan))}
 	items = []
 	if doctype == "Customer":
-		items = get_all_customers(doctype, filters, [])
+		items = get_all_customers(doctype, filters, [], field)
 	elif  doctype == "Item":
-		items = get_all_items(doctype, filters, [])
+		items = get_all_items(doctype, filters, [], field)
 	elif  doctype == "Supplier":
-		items = get_all_suppliers(doctype, filters, [])
+		items = get_all_suppliers(doctype, filters, [], field)
 	elif  doctype == "Sales Partner":
-		items = get_all_sales_partner(doctype, filters, [])
-	
+		items = get_all_sales_partner(doctype, filters, [], field)
+
 	if len(items) > 0:
-		return filter_leaderboard_items(obj, items)
+		return items
 	return []
 
+def get_all_customers(doctype, filters, items, field, start=0, limit=20):
+	"""return all customers"""
 
-# filters start
-def filter_leaderboard_items(obj, items):
-	"""return items based on seleted filters"""
-	
-	reverse = False if obj.selected_filter_item and obj.selected_filter_item["value"] == "ASC" else True
-	# key : (x[field1], x[field2]) while sorting on 2 values
-	filtered_list = []
-	selected_field = obj.selected_filter_item and obj.selected_filter_item["field"]
-	if selected_field:
-		filtered_list  = sorted(items, key=itemgetter(selected_field), reverse=reverse)
-		value = items[0].get(selected_field)
+	x = frappe.get_list(doctype, filters=filters, limit_start=start, limit_page_length=limit)
 
-		allowed = isinstance(value, unicode) or isinstance(value, str)
-		# now sort by length
-		if allowed and '$' in value:
-			filtered_list.sort(key= lambda x: len(x[selected_field]), reverse=reverse)
-	
-	# return only 10 items'
-	return filtered_list[:10]
+	for val in x:
+		y = dict(frappe.db.sql('''select name, grand_total from `tabSales Invoice` where customer = %s''', (val.name)))
+		invoice_list = y.keys()
+		if len(invoice_list) > 0:
+			item_count = frappe.db.sql('''select count(name) from `tabSales Invoice Item` where parent in (%s)''' % ", ".join(
+				['%s'] * len(invoice_list)), tuple(invoice_list))
 
-# filters end
+			value = 0
+			if(field=="total_amount"):
+				value = sum(y.values())
+			elif(field=="total_item_purchased"):
+				value = sum(destructure_tuple_of_tuples(item_count))
+
+			item_obj = {"name": val.name,
+				"total_amount": get_formatted_value(sum(y.values())),
+				"total_item_purchased": sum(destructure_tuple_of_tuples(item_count)),
+				"href":"#Form/Customer/" + val.name,
+				"value": value}
+			items.append(item_obj)
+
+	items.sort(key=lambda k: k['value'], reverse=True)
+	return items
+
+def get_all_items(doctype, filters, items, field, start=0, limit=20):
+	"""return all items"""
+
+	x = frappe.get_list(doctype, filters=filters, limit_start=start, limit_page_length=limit)
+	for val in x:
+		data = frappe.db.sql('''select item_code from `tabMaterial Request Item` where item_code = %s''', (val.name), as_list=1)
+		requests = destructure_tuple_of_tuples(data)
+		data = frappe.db.sql('''select price_list_rate from `tabItem Price` where item_code = %s''', (val.name), as_list=1)
+		avg_price = get_avg(destructure_tuple_of_tuples(data))
+		data = frappe.db.sql('''select item_code from `tabPurchase Invoice Item` where item_code = %s''', (val.name), as_list=1)
+		purchases = destructure_tuple_of_tuples(data)
+
+		value = 0
+		if(field=="total_request"):
+			value = len(requests)
+		elif(field=="total_purchase"):
+			value = len(purchases)
+		elif(field=="avg_price"):
+			value=avg_price
+		item_obj = {"name": val.name,
+			"total_request":len(requests),
+			"total_purchase": len(purchases),
+			"avg_price": get_formatted_value(avg_price),
+			"href":"#Form/Item/" + val.name,
+			"value": value}
+		items.append(item_obj)
+
+	print(items)
+
+	items.sort(key=lambda k: k['value'], reverse=True)
+	return items
+
+def get_all_suppliers(doctype, filters, items, field, start=0, limit=20):
+	"""return all suppliers"""
+
+	x = frappe.get_list(doctype, filters=filters, limit_start=start, limit_page_length=limit)
+
+	for val in x:
+
+		info = get_dashboard_info(doctype, val.name)
+		value = 0
+		if(field=="annual_billing"):
+			value = info["billing_this_year"]
+		elif(field=="total_unpaid"):
+			value = abs(info["total_unpaid"])
+
+		item_obj = {"name": val.name,
+			"annual_billing":  get_formatted_value(info["billing_this_year"]),
+			"total_unpaid": get_formatted_value(abs(info["total_unpaid"])),
+			"href":"#Form/Supplier/" + val.name,
+			"value": value}
+		items.append(item_obj)
+
+	items.sort(key=lambda k: k['value'], reverse=True)
+	return items
+
+def get_all_sales_partner(doctype, filters, items, field, start=0, limit=20):
+	"""return all sales partner"""
+
+	x = frappe.get_list(doctype, fields=["name", "commission_rate", "modified"], filters=filters, limit_start=start, limit_page_length=limit)
+	for val in x:
+		y = frappe.db.sql('''select target_qty, target_amount from `tabTarget Detail` where parent = %s''', (val.name), as_dict=1)
+		target_qty = sum([f["target_qty"] for f in y])
+		target_amount = sum([f["target_amount"] for f in y])
+
+		value = 0
+		if(field=="commission_rate"):
+			value = val.commission_rate
+		elif(field=="target_qty"):
+			value = target_qty
+		elif(field=="target_amount"):
+			value = target_qty
+
+		item_obj = {"name": val.name,
+			"commission_rate": get_formatted_value(val.commission_rate, False),
+			"target_qty": target_qty,
+			"target_amount": get_formatted_value(target_qty),
+			"href":"#Form/Sales Partner/" + val.name,
+			"value": value}
+		items.append(item_obj)
+
+	items.sort(key=lambda k: k['value'], reverse=True)
+	return items
 
 
-# utils start
 def destructure_tuple_of_tuples(tup_of_tup):
 	"""return tuple(tuples) as list"""
 	return [y for x in tup_of_tup for y in x]
 
-def get_date_from_string(seleted_timeline):
+def get_date_from_string(seleted_timespan):
 	"""return string for ex:this week as date:string"""
 	days = months = years = 0
-	if "month" == seleted_timeline.lower():
+	if "month" == seleted_timespan.lower():
 		months = -1
-	elif "quarter" == seleted_timeline.lower():
+	elif "quarter" == seleted_timespan.lower():
 		months = -3
-	elif "year" == seleted_timeline.lower():
+	elif "year" == seleted_timespan.lower():
 		years = -1
 	else:
 		days = -7
@@ -76,7 +163,7 @@
 
 def get_filter_list(selected_filter):
 	"""return list of keys"""
-	return map((lambda y : y["field"]), filter(lambda x : not (x["field"] == "title" or x["field"] == "modified"), selected_filter))
+	return map((lambda y : y["field"]), filter(lambda x : not (x["field"] == "name" or x["field"] == "modified"), selected_filter))
 
 def get_avg(items):
 	"""return avg of list items"""
@@ -87,96 +174,9 @@
 
 def get_formatted_value(value, add_symbol=True):
 	"""return formatted value"""
-	currency_precision = get_currency_precision() or 2
 	if not add_symbol:
-		return '{:.{pre}f}'.format(value, pre=currency_precision)
-	
-	company = frappe.db.get_default("company") or frappe.get_all("Company")[0].name
-	currency = frappe.get_doc("Company", company).default_currency or frappe.boot.sysdefaults.currency;
-	currency_symbol = frappe.db.get_value("Currency", currency, "symbol")
-	return  currency_symbol + ' ' + '{:.{pre}f}'.format(value, pre=currency_precision)
-
-# utils end
-
-
-# get data
-def get_all_customers(doctype, filters, items, start=0, limit=100):
-	"""return all customers"""
-
-	x = frappe.get_list(doctype, fields=["name", "modified"], filters=filters, limit_start=start, limit_page_length=limit)
-	
-	for val in x:
-		y = dict(frappe.db.sql('''select name, grand_total from `tabSales Invoice` where customer = %s''', (val.name)))
-		invoice_list = y.keys()
-		if len(invoice_list) > 0:
-			item_count = frappe.db.sql('''select count(name) from `tabSales Invoice Item` where parent in (%s)''' % ", ".join(
-				['%s'] * len(invoice_list)), tuple(invoice_list))
-			items.append({"title": val.name,
-				"total_amount": get_formatted_value(sum(y.values())),
-				"href":"#Form/Customer/" + val.name,
-				"total_item_purchased": sum(destructure_tuple_of_tuples(item_count)),
-				"modified": str(val.modified)})
-	if len(x) > 99:
-		start = start + 1
-		return get_all_customers(doctype, filters, items, start=start)
-	else:
-		return items
-
-def get_all_items(doctype, filters, items, start=0, limit=100):
-	"""return all items"""
-
-	x = frappe.get_list(doctype, fields=["name", "modified"], filters=filters, limit_start=start, limit_page_length=limit)
-	for val in x:
-		data = frappe.db.sql('''select item_code from `tabMaterial Request Item` where item_code = %s''', (val.name), as_list=1)
-		requests = destructure_tuple_of_tuples(data)
-		data = frappe.db.sql('''select price_list_rate from `tabItem Price` where item_code = %s''', (val.name), as_list=1)
-		avg_price = get_avg(destructure_tuple_of_tuples(data))
-		data = frappe.db.sql('''select item_code from `tabPurchase Invoice Item` where item_code = %s''', (val.name), as_list=1)
-		purchases = destructure_tuple_of_tuples(data)
-		
-		items.append({"title": val.name,
-			"total_request":len(requests),
-			"total_purchase": len(purchases), "href":"#Form/Item/" + val.name,
-			"avg_price": get_formatted_value(avg_price),
-			"modified": val.modified})
-	if len(x) > 99:
-		return get_all_items(doctype, filters, items, start=start)
-	else:
-		return items
-
-def get_all_suppliers(doctype, filters, items, start=0, limit=100):
-	"""return all suppliers"""
-
-	x = frappe.get_list(doctype, fields=["name", "modified"], filters=filters, limit_start=start, limit_page_length=limit)
-	
-	for val in x:
-		info = get_dashboard_info(doctype, val.name)
-		items.append({"title": val.name,
-		"annual_billing":  get_formatted_value(info["billing_this_year"]),
-		"total_unpaid": get_formatted_value(abs(info["total_unpaid"])),
-		"href":"#Form/Supplier/" + val.name,
-		"modified": val.modified})
-
-	if len(x) > 99:
-		return get_all_suppliers(doctype, filters, items, start=start)
-	else:
-		return items
-
-def get_all_sales_partner(doctype, filters, items, start=0, limit=100):
-	"""return all sales partner"""
-	
-	x = frappe.get_list(doctype, fields=["name", "commission_rate", "modified"], filters=filters, limit_start=start, limit_page_length=limit)
-	for val in x:
-		y = frappe.db.sql('''select target_qty, target_amount from `tabTarget Detail` where parent = %s''', (val.name), as_dict=1)
-		target_qty = sum([f["target_qty"] for f in y])
-		target_amount = sum([f["target_amount"] for f in y])
-		items.append({"title": val.name,
-			"commission_rate": get_formatted_value(val.commission_rate, False),
-			"target_qty": target_qty,
-			"target_amount": get_formatted_value(target_amount),
-			"href":"#Form/Sales Partner/" + val.name,
-			"modified": val.modified})
-	if len(x) > 99:
-		return get_all_sales_partner(doctype, filters, items, start=start)
-	else:
-		return items
\ No newline at end of file
+		return '{:.{pre}f}'.format(value, pre=(get_currency_precision() or 2))
+	currency_precision = get_currency_precision() or 2
+	company = frappe.db.get_default("company")
+	currency = frappe.get_doc("Company", company).default_currency or frappe.boot.sysdefaults.currency
+	return fmt_money(value, currency_precision, currency)
diff --git a/erpnext/utilities/page/leaderboard/leaderboard_main_head.html b/erpnext/utilities/page/leaderboard/leaderboard_main_head.html
deleted file mode 100644
index 257d4ed..0000000
--- a/erpnext/utilities/page/leaderboard/leaderboard_main_head.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<div class="list-item__content ellipsis text-muted list-item__content--flex-2
-	{% if(col !== "Title" && col !== "Modified") { %}
-		hidden-xs
-	{% } %}
-	{% if(col && selected_filter.indexOf(col) !== -1) { %}text-right{% } %}">
-	
-	<span class="list-col-title ellipsis">{{col}}</span>
-</div>
\ No newline at end of file
diff --git a/erpnext/utilities/page/leaderboard/leaderboard_row_head.html b/erpnext/utilities/page/leaderboard/leaderboard_row_head.html
deleted file mode 100644
index 5a4e1dd..0000000
--- a/erpnext/utilities/page/leaderboard/leaderboard_row_head.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<div class="list-item list-item--head" data-list-renderer="{{__(" List ")}}">
-	{{ main }}
-</div>
\ No newline at end of file
