sales analytics based on sales order/delivery note/sales invoice
diff --git a/selling/page/sales_analytics/sales_analytics.js b/selling/page/sales_analytics/sales_analytics.js
index 3d54203..499c6c0 100644
--- a/selling/page/sales_analytics/sales_analytics.js
+++ b/selling/page/sales_analytics/sales_analytics.js
@@ -34,8 +34,10 @@
 			page: wrapper,
 			parent: $(wrapper).find('.layout-main'),
 			appframe: wrapper.appframe,
-			doctypes: ["Item", "Item Group", "Customer", "Customer Group", "Company",
-				"Sales Invoice", "Sales Invoice Item", "Territory"],
+			doctypes: ["Item", "Item Group", "Customer", "Customer Group", "Company", "Territory", 
+				"Fiscal Year", "Sales Invoice", "Sales Invoice Item", 
+				"Sales Order", "Sales Order Item[Sales Analytics]", 
+				"Delivery Note", "Delivery Note Item[Sales Analytics]"],
 			tree_grid: { show: true }
 		});
 		
@@ -45,13 +47,7 @@
 				show: true, 
 				item_key: "customer",
 				parent_field: "parent_customer_group", 
-				formatter: function(item) {
-					// return repl('<a href="#Report2/stock-invoices/customer=%(enc_value)s">%(value)s</a>', {
-					// 		value: item.name,
-					// 		enc_value: encodeURIComponent(item.name)
-					// 	});
-					return item.name;
-				}
+				formatter: function(item) { return item.name; }
 			},
 			"Customer": {
 				label: "Customer",
@@ -110,6 +106,8 @@
 			filter: function(val, item, opts, me) {
 				return me.apply_zero_filter(val, item, opts, me);
 			}},
+		{fieldtype:"Select", label: "Based On", options:["Sales Invoice", 
+			"Sales Order", "Delivery Note"]},
 		{fieldtype:"Select", label: "Value or Qty", options:["Value", "Quantity"]},
 		{fieldtype:"Select", label: "Company", link:"Company", 
 			default_value: "Select Company..."},
@@ -132,6 +130,10 @@
 		this.filter_inputs.tree_type.change(function() {
 			me.filter_inputs.refresh.click();
 		});
+		
+		this.filter_inputs.based_on.change(function() {
+			me.filter_inputs.refresh.click();
+		});
 
 		this.show_zero_check()		
 		this.setup_plot_check();
@@ -143,8 +145,6 @@
 	prepare_data: function() {
 		var me = this;
 		if (!this.tl) {
-			this.make_transaction_list("Sales Invoice", "Sales Invoice Item");
-
 			// add 'Not Set' Customer & Item
 			// (Customer / Item are not mandatory!!)
 			wn.report_dump.data["Customer"].push({
@@ -160,6 +160,10 @@
 				id: "Not Set",
 			});
 		}
+
+		if (!this.tl || !this.tl[this.based_on]) {
+			this.make_transaction_list(this.based_on, this.based_on + " Item");
+		}
 		
 		if(!this.data || me.item_type != me.tree_type) {
 			if(me.tree_type=='Customer') {
@@ -214,11 +218,12 @@
 		var to_date = dateutil.str_to_obj(this.to_date);
 		var is_val = this.value_or_qty == 'Value';
 		
-		$.each(this.tl, function(i, tl) {
+		$.each(this.tl[this.based_on], function(i, tl) {
 			if (me.is_default('company') ? true : me.apply_filter(tl, "company")) { 
 				var posting_date = dateutil.str_to_obj(tl.posting_date);
 				if (posting_date >= from_date && posting_date <= to_date) {
-					var item = me.item_by_name[tl[me.tree_grid.item_key]] || me.item_by_name['Not Set'];
+					var item = me.item_by_name[tl[me.tree_grid.item_key]] || 
+						me.item_by_name['Not Set'];
 					item[me.column_map[tl.posting_date].field] += (is_val ? tl.amount : tl.qty);
 				}
 			}
diff --git a/startup/report_data_map.py b/startup/report_data_map.py
index 06bbf44..feffae7 100644
--- a/startup/report_data_map.py
+++ b/startup/report_data_map.py
@@ -134,6 +134,7 @@
 			"warehouse": ["Warehouse", "name"]
 		},
 	},
+	
 	"Sales Order Item": {
 		"columns": ["item_code", "(ifnull(qty, 0) - ifnull(delivered_qty, 0)) as qty", 
 			"reserved_warehouse as warehouse"],
@@ -185,6 +186,42 @@
 			"item_code": ["Item", "name"]
 		}
 	},
+	"Sales Order": {
+		"columns": ["name", "customer", "transaction_date as posting_date", "company"],
+		"conditions": ["docstatus=1"],
+		"order_by": "transaction_date",
+		"links": {
+			"customer": ["Customer", "name"],
+			"company":["Company", "name"]
+		}
+	},
+	"Sales Order Item[Sales Analytics]": {
+		"columns": ["parent", "item_code", "qty", "amount"],
+		"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
+		"order_by": "parent",
+		"links": {
+			"parent": ["Sales Order", "name"],
+			"item_code": ["Item", "name"]
+		}
+	},
+	"Delivery Note": {
+		"columns": ["name", "customer", "posting_date", "company"],
+		"conditions": ["docstatus=1"],
+		"order_by": "posting_date",
+		"links": {
+			"customer": ["Customer", "name"],
+			"company":["Company", "name"]
+		}
+	},
+	"Delivery Note Item[Sales Analytics]": {
+		"columns": ["parent", "item_code", "qty", "amount"],
+		"conditions": ["docstatus=1", "ifnull(parent, '')!=''"],
+		"order_by": "parent",
+		"links": {
+			"parent": ["Delivery Note", "name"],
+			"item_code": ["Item", "name"]
+		}
+	},
 	"Supplier": {
 		"columns": ["name", "if(supplier_name=name, '', supplier_name) as supplier_name", 
 			"supplier_type as parent_supplier_type"],