Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/home/__init__.py b/home/__init__.py
index e508ac7..9667efd 100644
--- a/home/__init__.py
+++ b/home/__init__.py
@@ -87,5 +87,5 @@
 	doc = controller.doc
 	if method in ['on_update', 'on_submit']:
 		subject, color = feed_dict.get(doc.doctype, [None, None])
-		if subject:			
+		if subject:
 			make_feed('', doc.doctype, doc.name, doc.owner, subject % doc.fields, color)
diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js
index d8b81bd..304947e 100644
--- a/home/page/latest_updates/latest_updates.js
+++ b/home/page/latest_updates/latest_updates.js
@@ -1,4 +1,14 @@
 erpnext.updates = [
+	["28th December 2012", [
+		"Workflow: Added System for Multi-level approval before Submission. \
+			<br>See video at <a href='https://www.youtube.com/watch?v=zuGv59_wJKw' \
+			target='_blank'>https://www.youtube.com/watch?v=zuGv59_wJKw</a>.",
+		"Stock Level Report: New report to see available and estimated qty of stock",
+	]],
+	["27th December 2012", [
+		"Website: Added auto-generated Contact Us and About Us Pages",
+		"Website: Added option to create slideshows and add them to Pages, Products and Product Groups",
+	]],
 	["25th December 2012", [
 		"Stock Balance Report: Inflow, outflow and balance of stock within a defined period",
 		"Stock Reports: Added Brand filter on some of the reports"
diff --git a/hr/doctype/expense_claim/expense_claim.py b/hr/doctype/expense_claim/expense_claim.py
index 9e476e5..b3a132e 100644
--- a/hr/doctype/expense_claim/expense_claim.py
+++ b/hr/doctype/expense_claim/expense_claim.py
@@ -32,6 +32,11 @@
 	def validate(self):
 		# if self.doc.exp_approver == self.doc.owner:
 		# 	webnotes.msgprint("""Self Approval is not allowed.""", raise_exception=1)
+
+		if self.doc.status not in ("Draft", "Approved", "Rejected"):
+			webnotes.msgprint("Status must be one of 'Draft', 'Approved' or 'Rejected'", 
+				raise_exception=True)
+
 		self.validate_fiscal_year()
 		self.validate_exp_details()
 			
diff --git a/hr/doctype/leave_application/leave_application.js b/hr/doctype/leave_application/leave_application.js
index 63b5e6e..3c26a51 100755
--- a/hr/doctype/leave_application/leave_application.js
+++ b/hr/doctype/leave_application/leave_application.js
@@ -47,20 +47,22 @@
 			} else {
 				cur_frm.set_intro("This Leave Application is pending approval. Only the Leave Apporver can update status.")
 				cur_frm.toggle_enable("status", false);
-				if(!doc.__islocal) cur_frm.frm_head.appframe.buttons.Submit.remove();
+				if(!doc.__islocal) {
+					if(cur_frm.frm_head.appframe.buttons.Submit)
+						cur_frm.frm_head.appframe.buttons.Submit.remove();
+				}
 			}
 		} else {
  			if(doc.status=="Approved") {
 				cur_frm.set_intro("Leave application has been approved.");
+				if(cur_frm.doc.docstatus==0) {
+					cur_frm.set_intro("Please submit to update Leave Balance.");
+				}
 			} else if(doc.status=="Rejected") {
 				cur_frm.set_intro("Leave application has been rejected.");
 			}
 		}
-	}
-	
-	if(doc.status=="Approved" && doc.docstatus==0) {
-		cur_frm.savesubmit()
-	}
+	}	
 }
 
 cur_frm.cscript.employee = function (doc, dt, dn){
diff --git a/hr/doctype/leave_application/leave_application.py b/hr/doctype/leave_application/leave_application.py
index d945367..e61f7b5 100755
--- a/hr/doctype/leave_application/leave_application.py
+++ b/hr/doctype/leave_application/leave_application.py
@@ -33,6 +33,9 @@
 	def validate(self):
 		# if self.doc.leave_approver == self.doc.owner:
 		# 	webnotes.msgprint("""Self Approval is not allowed.""", raise_exception=1)
+		if self.doc.status not in ("Open", "Approved", "Rejected"):
+			webnotes.msgprint("Status must be one of 'Open', 'Approved' or 'Rejected'", 
+				raise_exception=True)
 
 		self.validate_to_date()
 		self.validate_balance_leaves()
diff --git a/manufacturing/page/manufacturing_home/manufacturing_home.html b/manufacturing/page/manufacturing_home/manufacturing_home.html
index ec77b91..737a7c1 100644
--- a/manufacturing/page/manufacturing_home/manufacturing_home.html
+++ b/manufacturing/page/manufacturing_home/manufacturing_home.html
@@ -28,7 +28,7 @@
 					<div class="section-item">
 						<a class="section-link" 
 							title = "BOM Replace Tool"
-							href="#!Form/BOM Replace Tool">BOM Replace Tool</a>
+							href="#Form/BOM Replace Tool">BOM Replace Tool</a>
 					</div>
 				</div>
 			</div>
diff --git a/setup/page/setup/setup.html b/setup/page/setup/setup.html
index 1b5e967..1e7607f 100644
--- a/setup/page/setup/setup.html
+++ b/setup/page/setup/setup.html
@@ -4,45 +4,49 @@
 		<div class="setup-column">
 			<h3>Company</h3>
 			<p>
-				<b><a href="#!List/Company">Companies</a></b><br>
+				<b><a href="#List/Company">Companies</a></b><br>
 				<span class="help">List of companies (not customers / suppliers)</span>
 			</p>
 			<p>
-				<b><a href="#!List/Fiscal Year">Fiscal Years</a></b><br>
+				<b><a href="#List/Fiscal Year">Fiscal Years</a></b><br>
 				<span class="help">Financial Years for books of accounts</span>
 			</p>
 			<p>
-				<b><a href="#!List/Currency">Currencies</a></b><br>
+				<b><a href="#List/Currency">Currencies</a></b><br>
 				<span class="help">Currency Master</span>
 			</p>
 		</div>
 		<div class="setup-column">
 			<h3>Users and Permissions</h3>
 			<p>
-				<b><a href="#!List/Profile">Users</a></b><br>
+				<b><a href="#List/Profile">Users</a></b><br>
 				<span class="help">Add/remove users, set roles, passwords etc</span>
 			</p>
 			<p>
-				<b><a href="#!Permission Engine">Permission Manager</a></b><br>
+				<b><a href="#Permission Engine">Permission Manager</a></b><br>
 				<span class="help">Set permissions on transactions / masters</span>
 			</p>
 			<p>
-				<b><a href="#!List/Authorization Rule">Amount based Authorization Rules</a></b><br>
+				<b><a href="#List/Workflow">Workflow Manager</a></b><br>
+				<span class="help">Set workflow rules.</span>
+			</p>
+			<p>
+				<b><a href="#List/Authorization Rule">Amount based Authorization Rules</a></b><br>
 				<span class="help">Restrict submission rights based on amount</span>
 			</p>
 		</div>
 		<div class="setup-column">
 			<h3>Data</h3>
 			<p>
-				<b><a href="#!data-import-tool">Data Import Tool</a></b><br>
+				<b><a href="#data-import-tool">Data Import Tool</a></b><br>
 				<span class="help">Import data from spreadsheet (csv) files</span>
 			</p>
 			<p>
-				<b><a href="#!Form/Global Defaults/Global Defaults">Global Defaults</a></b><br>
+				<b><a href="#Form/Global Defaults/Global Defaults">Global Defaults</a></b><br>
 				<span class="help">Set default values for entry</span>
 			</p>
 			<p>
-				<b><a href="#!Trash">Recycle Bin</a></b><br>
+				<b><a href="#Trash">Recycle Bin</a></b><br>
 				<span class="help">Un-trash items</span>
 			</p>
 			<p>
@@ -53,75 +57,75 @@
 		<div class="setup-column">
 			<h3>Email and Notifications</h3>
 			<p>
-				<b><a href="#!Form/Email Settings/Email Settings">Email Settings</a></b><br>
+				<b><a href="#Form/Email Settings/Email Settings">Email Settings</a></b><br>
 				<span class="help">Out going mail server and support ticket mailbox</span>
 			</p>
 			<p>
-				<b><a href="#!Form/Notification Control/Notification Control">Auto Notifications</a></b><br>
+				<b><a href="#Form/Notification Control/Notification Control">Auto Notifications</a></b><br>
 				<span class="help">Automatic email sending to customers and suppliers</span>
 			</p>
 			<p>
-				<b><a href="#!List/Email Digest">Email Digests</a></b><br>
+				<b><a href="#List/Email Digest">Email Digests</a></b><br>
 				<span class="help">Daily, weekly, monthly email Digests</span>
 			</p>
 			<p>
-				<b><a href="#!Form/SMS Settings/SMS Settings">SMS Setup</a></b><br>
+				<b><a href="#Form/SMS Settings/SMS Settings">SMS Setup</a></b><br>
 				<span class="help">Setup outgoing SMS via your bulk SMS provider</span>
 			</p>
 			<p>
-				<b><a href="#!Form/SMS Center/SMS Center">Send Bulk SMS</a></b><br>
+				<b><a href="#Form/SMS Center/SMS Center">Send Bulk SMS</a></b><br>
 				<span class="help">Send bulk SMS to leads, customers, contacts</span>
 			</p>
 		</div>
 		<div class="setup-column">
 			<h3>Customize ERPNext</h3>
 			<p>
-				<b><a href="#!Form/Customize Form/Customize Form">Customize Forms</a></b><br>
+				<b><a href="#Form/Customize Form/Customize Form">Customize Forms</a></b><br>
 				<span class="help">Change entry properties (hide fields, make mandatory etc)</span>
 			</p>
 			<p>
-				<b><a href="#!List/Custom Field">Custom Fields</a></b><br>
+				<b><a href="#List/Custom Field">Custom Fields</a></b><br>
 				<span class="help">Add fields to forms</span>
 			</p>
 			<p>
-				<b><a href="#!List/Custom Script">Custom Scripts</a></b><br>
+				<b><a href="#List/Custom Script">Custom Scripts</a></b><br>
 				<span class="help">Add custom code to forms</span>
 			</p>
 			<p>
-				<b><a href="#!Form/Features Setup/Features Setup">Disable Features</a></b><br>
+				<b><a href="#Form/Features Setup/Features Setup">Disable Features</a></b><br>
 				<span class="help">Simplify entry forms by disabling features</span>
 			</p>
 			<p>
-				<b><a href="#!modules_setup">Modules Setup</a></b><br>
+				<b><a href="#modules_setup">Modules Setup</a></b><br>
 				<span class="help">Show, hide modules</span>
 			</p>
 			<p>
-				<b><a href="#!Form/Naming Series/Naming Series">Numbering Series</a></b><br>
+				<b><a href="#Form/Naming Series/Naming Series">Numbering Series</a></b><br>
 				<span class="help">Set multiple numbering series for transactions</span>
 			</p>
 		</div>
 		<div class="setup-column">
 			<h3>Branding and Printing</h3>
 			<p>
-				<b><a href="#!List/Letter Head">Letter Heads</a></b><br>
+				<b><a href="#List/Letter Head">Letter Heads</a></b><br>
 				<span class="help">Letter heads for print</span>
 			</p>
 			<p>
-				<b><a href="#!List/Print Format">Print Formats</a></b><br>
+				<b><a href="#List/Print Format">Print Formats</a></b><br>
 				<span class="help">HTML print formats for quotes, invoices etc</span>
 			</p>
 			<p>
-				<b><a href="#!List/Print Heading">Print Headings</a></b><br>
+				<b><a href="#List/Print Heading">Print Headings</a></b><br>
 				<span class="help">Add headers for standard print formats</span>
 			</p>
 			<!--
 			<p>
-				<b><a href="#!Form/Personalize/Personalize">Home Banner</a></b><br>
+				<b><a href="#Form/Personalize/Personalize">Home Banner</a></b><br>
 				<span class="help">Add a home page banner</span>
 			</p>
 			-->
 			<p>
-				<b><a href="#!Form/Style Settings/Style Settings">Style Settings</a></b><br>
+				<b><a href="#Form/Style Settings/Style Settings">Style Settings</a></b><br>
 				<span class="help">Change background fonts etc</span>
 			</p>
 		</div>
diff --git a/stock/doctype/item/item.py b/stock/doctype/item/item.py
index 5b00643..38ff797 100644
--- a/stock/doctype/item/item.py
+++ b/stock/doctype/item/item.py
@@ -128,16 +128,19 @@
 				else:
 					check_list.append(d.tax_type)
 
-	def check_for_active_boms(self, check):
-		if check in ['Is Active', 'Is Purchase Item']:
+	def check_for_active_boms(self, field_label):
+		if field_label in ['Is Active', 'Is Purchase Item']:
 			bom_mat = sql("select distinct t1.parent from `tabBOM Item` t1, `tabBOM` t2 where t1.item_code ='%s' and (t1.bom_no = '' or t1.bom_no is NULL) and t2.name = t1.parent and t2.is_active = 1 and t2.docstatus = 1 and t1.docstatus =1 " % self.doc.name )
 			if bom_mat and bom_mat[0][0]:
-				msgprint("%s should be 'Yes'. As Item %s is present in one or many Active BOMs." % (cstr(check), cstr(self.doc.name)))
+				msgprint("%s should be 'Yes'. As Item %s is present in one or many Active BOMs." % (cstr(field_label), cstr(self.doc.name)))
 				raise Exception
-		if check == 'Is Active' or ( check == 'Is Manufactured Item' and self.doc.is_sub_contracted_item != 'Yes') or (check ==	'Is Sub Contracted Item' and self.doc.is_manufactured_item != 'Yes') :
+		if ((field_label == 'Allow Production Order' 
+				and self.doc.is_sub_contracted_item != 'Yes') 
+				or (field_label == 'Is Sub Contracted Item' 
+				and self.doc.is_manufactured_item != 'Yes')):
 			bom = sql("select name from `tabBOM` where item = '%s' and is_active = 1" % cstr(self.doc.name))
 			if bom and bom[0][0]:
-				msgprint("%s should be 'Yes'. As Item %s is present in one or many Active BOMs." % (cstr(check), cstr(self.doc.name)))
+				msgprint("%s should be 'Yes'. As Item %s is present in one or many Active BOMs." % (cstr(field_label), cstr(self.doc.name)))
 				raise Exception
 				
 	def validate_barcode(self):
@@ -147,24 +150,21 @@
 				msgprint("Barcode: %s already used in item: %s" % (self.doc.barcode, cstr(duplicate[0][0])), raise_exception = 1)
 
 	def validate(self):
-		fl = {'is_manufactured_item'	:'Is Manufactured Item',
+		fl = {'is_manufactured_item'	:'Allow Bill of Materials',
 					'is_sub_contracted_item':'Is Sub Contracted Item',
 					'is_purchase_item'			:'Is Purchase Item',
-					'is_pro_applicable'		 :'Is Pro Applicable'}
+					'is_pro_applicable'		 :'Allow Production Order'}
 		for d in fl:
 			if cstr(self.doc.fields.get(d)) != 'Yes':
-				self.check_for_active_boms(check = fl[d])
+				self.check_for_active_boms(fl[d])
 		self.check_ref_rate_detail()
 		self.fill_customer_code()
 		self.check_item_tax()
 		self.validate_barcode()
-		if not self.doc.min_order_qty:
-			self.doc.min_order_qty = 0
 		self.check_non_asset_warehouse()
 
-		if self.doc.is_pro_applicable and self.doc.is_pro_applicable == 'Yes' and self.doc.is_manufactured_item and self.doc.is_manufactured_item != 'Yes':
-			msgprint("If making Production Order is allowed then, it should also allow to make Bill of Materials. Refer Manufacturing section.")
-			raise Exception
+		if cstr(self.doc.is_manufactured_item) == "No":
+			self.doc.is_pro_applicable = "No"
 
 		if self.doc.is_pro_applicable == 'Yes' and self.doc.is_stock_item == 'No':
 			msgprint("As Production Order can be made for this Item, then Is Stock Item Should be 'Yes' as we maintain it's stock. Refer Manufacturing and Inventory section.", raise_exception=1)
diff --git a/support/doctype/support_ticket/__init__.py b/support/doctype/support_ticket/__init__.py
index 0295e32..da1755f 100644
--- a/support/doctype/support_ticket/__init__.py
+++ b/support/doctype/support_ticket/__init__.py
@@ -89,7 +89,7 @@
 				st.doc.status = 'Open'
 				st.doc.save()
 				
-				update_feed(st.doc, 'on_update')
+				update_feed(st, 'on_update')
 				# extract attachments
 				self.save_attachments(st.doc, mail.attachments)
 				return
@@ -109,21 +109,20 @@
 		d.naming_series = opts and opts.split("\n")[0] or 'SUP'
 		try:
 			d.save(1)
+			try:
+				# extract attachments
+				self.save_attachments(d, mail.attachments)
+			except Exception, e:
+				self.description += "\n\n[Did not pull attachment]"
 		except:
 			d.description = 'Unable to extract message'
 			d.save(1)
-
 		else:
-			# update feed
-			update_feed(d, 'on_update')
-
 			# send auto reply
 			if cint(self.email_settings.send_autoreply):
 				if "mailer-daemon" not in d.raised_by.lower():
 					self.send_auto_reply(d)
 
-			# extract attachments
-			self.save_attachments(d, mail.attachments)
 			
 	def save_attachments(self, doc, attachment_list=[]):
 		"""
diff --git a/support/doctype/support_ticket/support_ticket.py b/support/doctype/support_ticket/support_ticket.py
index 89a58a6..0f4a25e 100644
--- a/support/doctype/support_ticket/support_ticket.py
+++ b/support/doctype/support_ticket/support_ticket.py
@@ -50,11 +50,11 @@
 	
 	def close_ticket(self):
 		webnotes.conn.set(self.doc,'status','Closed')
-		update_feed(self.doc)
+		update_feed(self)
 
 	def reopen_ticket(self):
 		webnotes.conn.set(self.doc,'status','Open')		
-		update_feed(self.doc)
+		update_feed(self)
 		
 	def on_trash(self):
 		webnotes.conn.sql("""update `tabCommunication` set support_ticket=NULL