[stock] [feature] added project to stock ledger entry and updated stock balance report
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index 9b5c80c..4b92643 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -608,22 +608,23 @@
 	def make_sl_entry(self, d, wh, qty, in_value, update_stock):
 		st_uom = webnotes.conn.sql("select stock_uom from `tabItem` where name = '%s'"%d['item_code'])
 		self.values.append({
-			'item_code'					 : d['item_code'],
-			'warehouse'					 : wh,
-			'transaction_date'			: getdate(self.doc.modified).strftime('%Y-%m-%d'),
-			'posting_date'				: self.doc.posting_date,
-			'posting_time'				: self.doc.posting_time,
-			'voucher_type'				: 'Sales Invoice',
-			'voucher_no'					: cstr(self.doc.name),
-			'voucher_detail_no'	 		: cstr(d['name']), 
-			'actual_qty'					: qty, 
-			'stock_uom'					 : st_uom and st_uom[0][0] or '',
-			'incoming_rate'			 : in_value,
-			'company'						 : self.doc.company,
-			'fiscal_year'				 : self.doc.fiscal_year,
-			'is_cancelled'				: (update_stock==1) and 'No' or 'Yes',
-			'batch_no'						: cstr(d['batch_no']),
-			'serial_no'					 : d['serial_no']
+			'item_code'			: d['item_code'],
+			'warehouse'			: wh,
+			'transaction_date'	: getdate(self.doc.modified).strftime('%Y-%m-%d'),
+			'posting_date'		: self.doc.posting_date,
+			'posting_time'		: self.doc.posting_time,
+			'voucher_type'		: 'Sales Invoice',
+			'voucher_no'		: cstr(self.doc.name),
+			'voucher_detail_no'	: cstr(d['name']), 
+			'actual_qty'		: qty, 
+			'stock_uom'			: st_uom and st_uom[0][0] or '',
+			'incoming_rate'		: in_value,
+			'company'			: self.doc.company,
+			'fiscal_year'		: self.doc.fiscal_year,
+			'is_cancelled'		: (update_stock==1) and 'No' or 'Yes',
+			'batch_no'			: cstr(d['batch_no']),
+			'serial_no'			: d['serial_no'],
+			"project"			: self.doc.project_name
 		})			
 
 	def update_stock_ledger(self, update_stock):
diff --git a/patches/march_2013/p07_update_project_in_stock_ledger.py b/patches/march_2013/p07_update_project_in_stock_ledger.py
new file mode 100644
index 0000000..ad4d639
--- /dev/null
+++ b/patches/march_2013/p07_update_project_in_stock_ledger.py
@@ -0,0 +1,42 @@
+import webnotes
+
+def execute():
+	webnotes.reload_doc("stock", "doctype", "stock_ledger_entry")
+	
+	# from stock entry
+	webnotes.conn.sql("""update 
+		`tabStock Ledger Entry` sle, 
+		`tabStock Entry` st
+	set sle.project = st.project_name
+	where
+	 	sle.voucher_type = "Stock Entry"
+		and sle.voucher_no = st.name""")
+			
+	# from purchase
+	webnotes.conn.sql("""update 
+		`tabStock Ledger Entry` sle, 
+		`tabPurchase Receipt Item` pri
+	set sle.project = pri.project_name
+	where
+	 	sle.voucher_type = "Purchase Receipt"
+		and sle.voucher_detail_no = pri.name""")
+
+	# from delivery note
+	webnotes.conn.sql("""update 
+		`tabStock Ledger Entry` sle, 
+		`tabDelivery Note` dn
+	set sle.project = dn.project_name
+	where
+	 	sle.voucher_type = "Delivery Note"
+		and sle.voucher_no = dn.name""")
+		
+	# from pos invoice
+	webnotes.conn.sql("""update 
+		`tabStock Ledger Entry` sle, 
+		`tabSales Invoice` si
+	set sle.project = si.project_name
+	where
+	 	sle.voucher_type = "Sales Invoice"
+		and sle.voucher_no = si.name""")
+	
+	
\ No newline at end of file
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 9c0d9b8..fc9855d 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -214,5 +214,7 @@
 	"patches.march_2013.p04_pos_update_stock_check",
 	"patches.march_2013.p05_payment_reconciliation",
 	"patches.march_2013.p06_remove_sales_purchase_return_tool",
-	"execute:webnotes.bean('Global Defaults').save()"
+	"execute:webnotes.bean('Global Defaults').save()",
+	"patches.march_2013.p07_update_project_in_stock_ledger",
+	"execute:webnotes.bean('Style Settings').save() #2013-03-25",
 ]
\ No newline at end of file
diff --git a/startup/report_data_map.py b/startup/report_data_map.py
index f914277..501db4f 100644
--- a/startup/report_data_map.py
+++ b/startup/report_data_map.py
@@ -80,6 +80,11 @@
 		"conditions": ["docstatus < 2"],
 		"order_by": "name"
 	},
+	"Project": {
+		"columns": ["name"],
+		"conditions": ["docstatus < 2"],
+		"order_by": "name"
+	},
 	"Warehouse": {
 		"columns": ["name"],
 		"conditions": ["docstatus < 2"],
@@ -87,13 +92,14 @@
 	},
 	"Stock Ledger Entry": {
 		"columns": ["name", "posting_date", "posting_time", "item_code", "warehouse", 
-			"actual_qty as qty", "voucher_type", "voucher_no", 
+			"actual_qty as qty", "voucher_type", "voucher_no", "project",
 			"ifnull(incoming_rate,0) as incoming_rate", "stock_uom", "serial_no"],
 		"conditions": ["ifnull(is_cancelled, 'No')='No'"],
 		"order_by": "posting_date, posting_time, name",
 		"links": {
 			"item_code": ["Item", "name"],
-			"warehouse": ["Warehouse", "name"]
+			"warehouse": ["Warehouse", "name"],
+			"project": ["Project", "name"]
 		},
 		"force_index": "posting_sort_index"
 	},
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 5e3c9e9..90b0ba7 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -387,7 +387,8 @@
 			'fiscal_year'				: self.doc.fiscal_year,
 			'is_cancelled'				: (update_stock==1) and 'No' or 'Yes',
 			'batch_no'					: d['batch_no'],
-			'serial_no'					: d['serial_no']
+			'serial_no'					: d['serial_no'],
+			"project"					: self.doc.project_name
 		})
 
 
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 7949a1c..4a52a5f 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -196,21 +196,22 @@
 			serial_no = cstr(d.serial_no).strip()
 
 		self.values.append({
-			'item_code'					: d.fields.has_key('item_code') and d.item_code or d.rm_item_code,
-			'warehouse'					: wh,
-			'posting_date'				: self.doc.posting_date,
-			'posting_time'				: self.doc.posting_time,
-			'voucher_type'				: 'Purchase Receipt',
-			'voucher_no'				: self.doc.name,
-			'voucher_detail_no'			: d.name,
-			'actual_qty'				: qty,
-			'stock_uom'					: d.stock_uom,
-			'incoming_rate'				: in_value,
-			'company'					: self.doc.company,
-			'fiscal_year'				: self.doc.fiscal_year,
-			'is_cancelled'				: (is_submit==1) and 'No' or 'Yes',
-			'batch_no'					: cstr(d.batch_no).strip(),
-			'serial_no'					: serial_no
+			'item_code'			: d.fields.has_key('item_code') and d.item_code or d.rm_item_code,
+			'warehouse'			: wh,
+			'posting_date'		: self.doc.posting_date,
+			'posting_time'		: self.doc.posting_time,
+			'voucher_type'		: 'Purchase Receipt',
+			'voucher_no'		: self.doc.name,
+			'voucher_detail_no'	: d.name,
+			'actual_qty'		: qty,
+			'stock_uom'			: d.stock_uom,
+			'incoming_rate'		: in_value,
+			'company'			: self.doc.company,
+			'fiscal_year'		: self.doc.fiscal_year,
+			'is_cancelled'		: (is_submit==1) and 'No' or 'Yes',
+			'batch_no'			: cstr(d.batch_no).strip(),
+			'serial_no'			: serial_no,
+			"project"			: d.project_name
 			})
 
 
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index f54ce60..e79e989 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -604,7 +604,8 @@
 			'company': self.doc.company,
 			'is_cancelled': (is_cancelled ==1) and 'Yes' or 'No',
 			'batch_no': cstr(d.batch_no).strip(),
-			'serial_no': cstr(d.serial_no).strip()
+			'serial_no': cstr(d.serial_no).strip(),
+			"project": self.doc.project_name
 		})
 	
 	def get_cust_values(self):
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
index 9551b59..6bcd758 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
@@ -1,8 +1,8 @@
 [
  {
-  "creation": "2013-01-14 16:33:26", 
+  "creation": "2013-01-29 19:25:42", 
   "docstatus": 0, 
-  "modified": "2013-01-29 16:27:57", 
+  "modified": "2013-03-25 16:04:59", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -24,13 +24,9 @@
   "parent": "Stock Ledger Entry", 
   "parentfield": "fields", 
   "parenttype": "DocType", 
-  "permlevel": 0, 
-  "read_only": 1
+  "permlevel": 0
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
   "doctype": "DocPerm", 
   "name": "__common__", 
   "parent": "Stock Ledger Entry", 
@@ -39,9 +35,7 @@
   "permlevel": 0, 
   "read": 1, 
   "report": 1, 
-  "role": "Material User", 
-  "submit": 0, 
-  "write": 0
+  "submit": 0
  }, 
  {
   "doctype": "DocType", 
@@ -57,6 +51,7 @@
   "oldfieldtype": "Link", 
   "options": "Item", 
   "print_width": "100px", 
+  "read_only": 1, 
   "reqd": 0, 
   "search_index": 1, 
   "width": "100px"
@@ -68,6 +63,7 @@
   "in_filter": 0, 
   "label": "Serial No", 
   "print_width": "100px", 
+  "read_only": 1, 
   "search_index": 0, 
   "width": "100px"
  }, 
@@ -77,7 +73,8 @@
   "fieldtype": "Data", 
   "label": "Batch No", 
   "oldfieldname": "batch_no", 
-  "oldfieldtype": "Data"
+  "oldfieldtype": "Data", 
+  "read_only": 1
  }, 
  {
   "doctype": "DocField", 
@@ -89,6 +86,7 @@
   "oldfieldtype": "Link", 
   "options": "Warehouse", 
   "print_width": "100px", 
+  "read_only": 1, 
   "search_index": 1, 
   "width": "100px"
  }, 
@@ -101,6 +99,7 @@
   "oldfieldname": "warehouse_type", 
   "oldfieldtype": "Select", 
   "options": "link:Warehouse Type", 
+  "read_only": 1, 
   "search_index": 0
  }, 
  {
@@ -113,6 +112,7 @@
   "oldfieldname": "posting_date", 
   "oldfieldtype": "Date", 
   "print_width": "100px", 
+  "read_only": 1, 
   "reqd": 0, 
   "search_index": 1, 
   "width": "100px"
@@ -126,6 +126,7 @@
   "oldfieldname": "posting_time", 
   "oldfieldtype": "Time", 
   "print_width": "100px", 
+  "read_only": 1, 
   "search_index": 0, 
   "width": "100px"
  }, 
@@ -138,6 +139,7 @@
   "oldfieldname": "voucher_type", 
   "oldfieldtype": "Data", 
   "print_width": "150px", 
+  "read_only": 1, 
   "search_index": 0, 
   "width": "150px"
  }, 
@@ -150,6 +152,7 @@
   "oldfieldname": "voucher_no", 
   "oldfieldtype": "Data", 
   "print_width": "150px", 
+  "read_only": 1, 
   "search_index": 0, 
   "width": "150px"
  }, 
@@ -161,6 +164,7 @@
   "oldfieldname": "voucher_detail_no", 
   "oldfieldtype": "Data", 
   "print_width": "150px", 
+  "read_only": 1, 
   "width": "150px"
  }, 
  {
@@ -172,6 +176,7 @@
   "oldfieldname": "actual_qty", 
   "oldfieldtype": "Currency", 
   "print_width": "150px", 
+  "read_only": 1, 
   "width": "150px"
  }, 
  {
@@ -181,7 +186,8 @@
   "label": "Incoming Rate", 
   "oldfieldname": "incoming_rate", 
   "oldfieldtype": "Currency", 
-  "options": "Company:company:default_currency"
+  "options": "Company:company:default_currency", 
+  "read_only": 1
  }, 
  {
   "doctype": "DocField", 
@@ -191,6 +197,7 @@
   "oldfieldname": "stock_uom", 
   "oldfieldtype": "Data", 
   "print_width": "150px", 
+  "read_only": 1, 
   "width": "150px"
  }, 
  {
@@ -202,6 +209,7 @@
   "oldfieldname": "bin_aqat", 
   "oldfieldtype": "Currency", 
   "print_width": "150px", 
+  "read_only": 1, 
   "width": "150px"
  }, 
  {
@@ -213,6 +221,7 @@
   "oldfieldtype": "Currency", 
   "options": "Company:company:default_currency", 
   "print_width": "150px", 
+  "read_only": 1, 
   "width": "150px"
  }, 
  {
@@ -222,7 +231,8 @@
   "label": "Stock Value", 
   "oldfieldname": "stock_value", 
   "oldfieldtype": "Currency", 
-  "options": "Company:company:default_currency"
+  "options": "Company:company:default_currency", 
+  "read_only": 1
  }, 
  {
   "doctype": "DocField", 
@@ -234,11 +244,19 @@
   "oldfieldname": "fcfs_stack", 
   "oldfieldtype": "Text", 
   "print_hide": 1, 
+  "read_only": 1, 
   "report_hide": 1, 
   "search_index": 0
  }, 
  {
   "doctype": "DocField", 
+  "fieldname": "project", 
+  "fieldtype": "Link", 
+  "label": "Project", 
+  "options": "Project"
+ }, 
+ {
+  "doctype": "DocField", 
   "fieldname": "company", 
   "fieldtype": "Select", 
   "in_filter": 1, 
@@ -247,6 +265,7 @@
   "oldfieldtype": "Data", 
   "options": "link:Company", 
   "print_width": "150px", 
+  "read_only": 1, 
   "search_index": 0, 
   "width": "150px"
  }, 
@@ -259,6 +278,7 @@
   "oldfieldname": "fiscal_year", 
   "oldfieldtype": "Data", 
   "print_width": "150px", 
+  "read_only": 1, 
   "search_index": 0, 
   "width": "150px"
  }, 
@@ -272,10 +292,20 @@
   "oldfieldtype": "Select", 
   "options": "\nYes\nNo", 
   "print_width": "100px", 
+  "read_only": 1, 
   "search_index": 0, 
   "width": "100px"
  }, 
  {
-  "doctype": "DocPerm"
+  "amend": 0, 
+  "cancel": 0, 
+  "create": 0, 
+  "doctype": "DocPerm", 
+  "role": "Material User", 
+  "write": 0
+ }, 
+ {
+  "doctype": "DocPerm", 
+  "role": "Accounts Manager"
  }
 ]
\ No newline at end of file
diff --git a/stock/page/stock_balance/stock_balance.js b/stock/page/stock_balance/stock_balance.js
index 47a3344..163b74f 100644
--- a/stock/page/stock_balance/stock_balance.js
+++ b/stock/page/stock_balance/stock_balance.js
@@ -35,7 +35,7 @@
 		this._super(wrapper, {
 			title: "Stock Balance",
 			doctypes: ["Item", "Item Group", "Warehouse", "Stock Ledger Entry", "Brand",
-				"Stock Entry"],
+				"Stock Entry", "Project"],
 		});
 	},
 	setup_columns: function() {
@@ -76,6 +76,10 @@
 			default_value: "Select Warehouse...", filter: function(val, item, opts, me) {
 				return me.apply_zero_filter(val, item, opts, me);
 			}},
+		{fieldtype:"Select", label: "Project", link:"Project", 
+			default_value: "Select Project...", filter: function(val, item, opts, me) {
+				return me.apply_zero_filter(val, item, opts, me);
+			}, link_formatter: {filter_input: "project"}},
 		{fieldtype:"Date", label: "From Date"},
 		{fieldtype:"Label", label: "To"},
 		{fieldtype:"Date", label: "To Date"},
@@ -105,7 +109,8 @@
 			var sl = data[i];
 			var sl_posting_date = dateutil.str_to_obj(sl.posting_date);
 			
-			if(me.is_default("warehouse") ? true : me.warehouse == sl.warehouse) {
+			if((me.is_default("warehouse") ? true : me.warehouse == sl.warehouse) &&
+				(me.is_default("project") ? true : me.project == sl.project)) {
 				var item = me.item_by_name[sl.item_code];
 				var wh = me.get_item_warehouse(sl.warehouse, sl.item_code);
 				var valuation_method = item.valuation_method ? 
diff --git a/website/doctype/style_settings/custom_template.css b/website/doctype/style_settings/custom_template.css
index 712c748..e2c0db5 100644
--- a/website/doctype/style_settings/custom_template.css
+++ b/website/doctype/style_settings/custom_template.css
@@ -69,7 +69,6 @@
 .navbar-inverse .navbar-inner {
     background-color: #{{ doc.top_bar_background or "444444"}};
     background-repeat: repeat-x;
-	border-color: transparent;
 	background-image: none;
 }
 
diff --git a/website/doctype/style_settings/style_settings.py b/website/doctype/style_settings/style_settings.py
index 71478a4..58dca7b 100644
--- a/website/doctype/style_settings/style_settings.py
+++ b/website/doctype/style_settings/style_settings.py
@@ -85,7 +85,7 @@
 				"UPPERCASE": "uppercase",
 				"Title Case":"capitalize",
 				"lowercase": "lowercase"
-			}[self.doc.heading_text_as]
+			}.get(self.doc.heading_text_as) or ""
 		
 		self.doc.at_import = ""
 		for f in fonts: