Merge branch 'responsive' of github.com:webnotes/erpnext into responsive
diff --git a/accounts/doctype/gl_entry/gl_entry.py b/accounts/doctype/gl_entry/gl_entry.py
index 429cc10..112e449 100644
--- a/accounts/doctype/gl_entry/gl_entry.py
+++ b/accounts/doctype/gl_entry/gl_entry.py
@@ -42,9 +42,9 @@
 		self.check_negative_balance(adv_adj)
 
 		# Update outstanding amt on against voucher
-		if self.doc.against_voucher and self.doc.against_voucher_type not in \
-				('Journal Voucher','POS') and update_outstanding == 'Yes':
-			self.update_outstanding_amt()
+		if self.doc.against_voucher and self.doc.against_voucher_type != "POS" \
+			and update_outstanding == 'Yes':
+				self.update_outstanding_amt()
 
 	def check_mandatory(self):
 		mandatory = ['account','remarks','voucher_type','voucher_no','fiscal_year','company']
@@ -164,16 +164,25 @@
 			and ifnull(is_cancelled,'No') = 'No'""", 
 			(self.doc.against_voucher, self.doc.against_voucher_type))[0][0] or 0.0)
 		
-		if self.doc.against_voucher_type=='Purchase Invoice':
-			# amount to debit
+		if self.doc.against_voucher_type == 'Purchase Invoice':
 			bal = -bal
 			
+		elif self.doc.against_voucher_type == "Journal Voucher":
+			against_voucher_amount = flt(webnotes.conn.sql("""select sum(debit) - sum(credit)
+				from `tabGL Entry` where voucher_type = 'Journal Voucher' and voucher_no = %s
+				and account = %s""", (self.doc.against_voucher, self.doc.account))[0][0])
+			
+			bal = against_voucher_amount + bal
+			if against_voucher_amount < 0:
+				bal = -bal
+			
 		# Validation : Outstanding can not be negative
 		if bal < 0 and self.doc.is_cancelled == 'No':
 			msgprint(_("Outstanding for Voucher ") + self.doc.against_voucher + 
-				_(" will become ") + fmt_money(bal) + _("Outstanding cannot be less than zero. \
+				_(" will become ") + fmt_money(bal) + _(". Outstanding cannot be less than zero. \
 				 	Please match exact outstanding."), raise_exception=1)
 			
 		# Update outstanding amt on against voucher
-		sql("update `tab%s` set outstanding_amount=%s where name='%s'"%
-		 	(self.doc.against_voucher_type, bal, self.doc.against_voucher))
\ No newline at end of file
+		if self.doc.against_voucher_type in ["Sales Invoice", "Purchase Invoice"]:
+			sql("update `tab%s` set outstanding_amount=%s where name='%s'"%
+			 	(self.doc.against_voucher_type, bal, self.doc.against_voucher))
\ No newline at end of file
diff --git a/accounts/doctype/journal_voucher/journal_voucher.py b/accounts/doctype/journal_voucher/journal_voucher.py
index a5a4f10..2c5cd4f 100644
--- a/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/accounts/doctype/journal_voucher/journal_voucher.py
@@ -158,7 +158,7 @@
 		if r:
 			self.doc.remark = ("\n").join(r)
 		else:
-			webnotes.msgprint("Remarks is mandatory", raise_exception=1)
+			webnotes.msgprint("User Remarks is mandatory", raise_exception=1)
 
 	def set_aging_date(self):
 		if self.doc.is_opening != 'Yes':
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py
index 59e66b5..56940fc 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -33,6 +33,28 @@
 		self.doc, self.doclist = d, dl 
 		self.tname = 'Purchase Invoice Item'
 		self.fname = 'entries'
+		self.status_updater = [{
+			'source_dt': 'Purchase Invoice Item',
+			'target_dt': 'Purchase Order Item',
+			'join_field': 'po_detail',
+			'target_field': 'billed_amt',
+			'target_parent_dt': 'Purchase Order',
+			'target_parent_field': 'per_billed',
+			'target_ref_field': 'import_amount',
+			'source_field': 'import_amount',
+			'percent_join_field': 'purchase_order',
+		},
+		{
+			'source_dt': 'Purchase Invoice Item',
+			'target_dt': 'Purchase Receipt Item',
+			'join_field': 'pr_detail',
+			'target_field': 'billed_amt',
+			'target_parent_dt': 'Purchase Receipt',
+			'target_parent_field': 'per_billed',
+			'target_ref_field': 'import_amount',
+			'source_field': 'import_amount',
+			'percent_join_field': 'purchase_receipt',
+		}]
 		
 	def validate(self):
 		super(DocType, self).validate()
@@ -391,8 +413,8 @@
 		self.make_gl_entries()
 				
 		self.update_against_document_in_jv()
-		purchase_controller.update_prevdoc_detail(self, is_submit = 1)
-
+		
+		self.update_prevdoc_status()
 
 	def make_gl_entries(self):
 		from accounts.general_ledger import make_gl_entries
@@ -503,7 +525,8 @@
 	def on_cancel(self):
 		from accounts.utils import remove_against_link_from_jv
 		remove_against_link_from_jv(self.doc.doctype, self.doc.name, "against_voucher")
-		get_obj(dt = 'Purchase Common').update_prevdoc_detail(self, is_submit = 0)
+		
+		self.update_prevdoc_status()
 		
 		self.make_cancel_gl_entries()
 		
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.txt b/accounts/doctype/purchase_invoice/purchase_invoice.txt
index 4647fd2..e8bce65 100755
--- a/accounts/doctype/purchase_invoice/purchase_invoice.txt
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-21 16:16:39", 
   "docstatus": 0, 
-  "modified": "2013-05-28 12:18:35", 
+  "modified": "2013-06-05 14:57:08", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -674,6 +674,32 @@
  }, 
  {
   "doctype": "DocField", 
+  "fieldname": "terms_section_break", 
+  "fieldtype": "Section Break", 
+  "label": "Terms and Conditions"
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "tc_name", 
+  "fieldtype": "Link", 
+  "label": "Select Terms and Conditions", 
+  "options": "Terms and Conditions", 
+  "print_hide": 1
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "get_terms", 
+  "fieldtype": "Button", 
+  "label": "Get Terms and Conditions"
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "terms", 
+  "fieldtype": "Text Editor", 
+  "label": "Terms and Conditions1"
+ }, 
+ {
+  "doctype": "DocField", 
   "fieldname": "more_info", 
   "fieldtype": "Section Break", 
   "label": "More Info", 
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index c5fee16..2d4de49 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -38,6 +38,35 @@
 		self.log = []
 		self.tname = 'Sales Invoice Item'
 		self.fname = 'entries'
+		self.status_updater = [{
+			'source_dt': 'Sales Invoice Item',
+			'target_field': 'billed_amt',
+			'target_ref_field': 'export_amount',
+			'target_dt': 'Sales Order Item',
+			'join_field': 'so_detail',
+			'target_parent_dt': 'Sales Order',
+			'target_parent_field': 'per_billed',
+			'source_field': 'export_amount',
+			'join_field': 'so_detail',
+			'percent_join_field': 'sales_order',
+			'status_field': 'billing_status',
+			'keyword': 'Billed'
+		}, 
+		{
+			'source_dt': 'Sales Invoice Item',
+			'target_dt': 'Delivery Note Item',
+			'join_field': 'dn_detail',
+			'target_field': 'billed_amt',
+			'target_parent_dt': 'Delivery Note',
+			'target_parent_field': 'per_billed',
+			'target_ref_field': 'export_amount',
+			'source_field': 'export_amount',
+			'percent_join_field': 'delivery_note',
+			'status_field': 'billing_status',
+			'keyword': 'Billed',
+			'no_tolerance': True,
+		}]
+		
 
 	def validate(self):
 		super(DocType, self).validate()
@@ -99,7 +128,9 @@
 				
 		self.set_buying_amount()
 		self.check_prev_docstatus()
-		get_obj("Sales Common").update_prevdoc_detail(1,self)
+		
+		self.update_status_updater_args()
+		self.update_prevdoc_status()
 		
 		# this sequence because outstanding may get -ve
 		self.make_gl_entries()
@@ -128,10 +159,30 @@
 		from accounts.utils import remove_against_link_from_jv
 		remove_against_link_from_jv(self.doc.doctype, self.doc.name, "against_invoice")
 
-		sales_com_obj.update_prevdoc_detail(0, self)
+		self.update_status_updater_args()
+		self.update_prevdoc_status()
 		
 		self.make_cancel_gl_entries()
 		
+	def update_status_updater_args(self):
+		if cint(self.doc.is_pos) and cint(self.doc.update_stock):
+			self.status_updater.append({
+				'source_dt':'Sales Invoice Item',
+				'target_dt':'Sales Order Item',
+				'target_parent_dt':'Sales Order',
+				'target_parent_field':'per_delivered',
+				'target_field':'delivered_qty',
+				'target_ref_field':'qty',
+				'source_field':'qty',
+				'join_field':'so_detail',
+				'percent_join_field':'sales_order',
+				'status_field':'delivery_status',
+				'keyword':'Delivered',
+				'second_source_dt': 'Delivery Note Item',
+				'second_source_field': 'qty',
+				'second_join_field': 'prevdoc_detail_docname'
+			})
+		
 	def on_update_after_submit(self):
 		self.validate_recurring_invoice()
 		self.convert_to_recurring()
@@ -196,7 +247,7 @@
 
 			# fetch terms	
 			if self.doc.tc_name and not self.doc.terms:
-				self.get_tc_details()
+				self.doc.terms = webnotes.conn.get_value("Terms and Conditions", self.doc.tc_name, "terms")
 			
 			# fetch charges
 			if self.doc.charge and not len(self.doclist.get({"parentfield": "other_charges"})):
@@ -269,7 +320,7 @@
 			
 		ret = self.get_debit_to()
 		self.doc.debit_to = ret.get('debit_to')
-					
+
 	def get_barcode_details(self, barcode):
 		return get_obj('Sales Common').get_barcode_details(barcode)
 
@@ -288,11 +339,6 @@
 		"""Get Commission rate of Sales Partner"""
 		return get_obj('Sales Common').get_comm_rate(sales_partner, self)	
 	
-	
-	def get_tc_details(self):
-		return get_obj('Sales Common').get_tc_details(self)
-
-
 	def get_advances(self):
 		super(DocType, self).get_advances(self.doc.debit_to, 
 			"Sales Invoice Advance", "advance_adjustment_details", "credit")
@@ -340,17 +386,6 @@
 			from accounts.utils import reconcile_against_document
 			reconcile_against_document(lst)
 			
-	def validate_customer(self):
-		"""	Validate customer name with SO and DN"""
-		for d in getlist(self.doclist,'entries'):
-			dt = d.delivery_note and 'Delivery Note' or d.sales_order and 'Sales Order' or ''
-			if dt:
-				dt_no = d.delivery_note or d.sales_order
-				cust = webnotes.conn.sql("select customer from `tab%s` where name = %s" % (dt, '%s'), dt_no)
-				if cust and cstr(cust[0][0]) != cstr(self.doc.customer):
-					msgprint("Customer %s does not match with customer of %s: %s." %(self.doc.customer, dt, dt_no), raise_exception=1)
-			
-
 	def validate_customer_account(self):
 		"""Validates Debit To Account and Customer Matches"""
 		if self.doc.customer and self.doc.debit_to and not cint(self.doc.is_pos):
@@ -360,6 +395,19 @@
 				(not acc_head and (self.doc.debit_to != cstr(self.doc.customer) + " - " + self.get_company_abbr())):
 				msgprint("Debit To: %s do not match with Customer: %s for Company: %s.\n If both correctly entered, please select Master Type \
 					and Master Name in account master." %(self.doc.debit_to, self.doc.customer,self.doc.company), raise_exception=1)
+			
+
+	def validate_customer(self):
+		"""	Validate customer name with SO and DN"""
+		if self.doc.customer:
+			for d in getlist(self.doclist,'entries'):
+				dt = d.delivery_note and 'Delivery Note' or d.sales_order and 'Sales Order' or ''
+				if dt:
+					dt_no = d.delivery_note or d.sales_order
+					cust = webnotes.conn.get_value(dt, dt_no, "customer")
+					if cust and cstr(cust) != cstr(self.doc.customer):
+						msgprint("Customer %s does not match with customer of %s: %s." 
+							%(self.doc.customer, dt, dt_no), raise_exception=1)
 
 
 	def validate_debit_acc(self):
diff --git a/accounts/doctype/sales_invoice/sales_invoice.txt b/accounts/doctype/sales_invoice/sales_invoice.txt
index 9dcac58..c69cda1 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.txt
+++ b/accounts/doctype/sales_invoice/sales_invoice.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 19:29:05", 
   "docstatus": 0, 
-  "modified": "2013-05-29 18:53:26", 
+  "modified": "2013-06-05 14:42:44", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -31,7 +31,9 @@
   "parent": "Sales Invoice", 
   "parentfield": "permissions", 
   "parenttype": "DocType", 
-  "read": 1
+  "permlevel": 0, 
+  "read": 1, 
+  "report": 1
  }, 
  {
   "doctype": "DocType", 
@@ -727,17 +729,6 @@
   "fieldtype": "Button", 
   "label": "Get Terms and Conditions", 
   "oldfieldtype": "Button", 
-  "options": "get_tc_details", 
-  "print_hide": 1, 
-  "read_only": 0
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "terms_html", 
-  "fieldtype": "HTML", 
-  "label": "Terms and Conditions HTML", 
-  "oldfieldtype": "HTML", 
-  "options": "You can add Terms and Notes that will be printed in the Transaction", 
   "print_hide": 1, 
   "read_only": 0
  }, 
@@ -1308,23 +1299,10 @@
   "report_hide": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Accounts Manager", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Accounts Manager", 
   "submit": 1, 
   "write": 1
@@ -1334,33 +1312,13 @@
   "cancel": 0, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Accounts User", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Accounts User", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "doctype": "DocPerm", 
   "match": "customer", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Customer"
- }, 
- {
-  "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "role": "Retail User"
  }
 ]
\ No newline at end of file
diff --git a/accounts/page/accounts_home/accounts_home.js b/accounts/page/accounts_home/accounts_home.js
index 25ee92c..0300902 100644
--- a/accounts/page/accounts_home/accounts_home.js
+++ b/accounts/page/accounts_home/accounts_home.js
@@ -128,6 +128,16 @@
 		icon: "icon-table",
 		items: [
 			{
+				"label":wn._("Customer Account Head"),
+				route: "query-report/Customer Account Head",
+				doctype: "Account"
+			},
+			{
+				"label":wn._("Supplier Account Head"),
+				route: "query-report/Supplier Account Head",
+				doctype: "Account"
+			},
+			{
 				"label":wn._("General Ledger"),
 				page: "general-ledger"
 			},
@@ -232,6 +242,16 @@
 				route: "query-report/Sales Partners Commission",
 				doctype: "Sales Invoice"
 			},
+			{
+				"label":wn._("Customer Account Head"),
+				route: "query-report/Customer Account Head",
+				doctype: "Account"
+			},
+			{
+				"label":wn._("Item-wise Sales Register"),
+				route: "query-report/Item-wise Sales Register",
+				doctype: "Sales Invoice"
+			},
 		]
 	}
 ]
diff --git a/accounts/report/customer_account_head/__init__.py b/accounts/report/customer_account_head/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/accounts/report/customer_account_head/__init__.py
diff --git a/accounts/report/customer_account_head/customer_account_head.py b/accounts/report/customer_account_head/customer_account_head.py
new file mode 100644
index 0000000..61f8cb2
--- /dev/null
+++ b/accounts/report/customer_account_head/customer_account_head.py
@@ -0,0 +1,49 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute(filters=None):
+	account_map = get_account_map()
+	columns = get_columns(account_map)
+	data = []
+	customers = webnotes.conn.sql("select name from tabCustomer where docstatus < 2")
+	for cust in customers:
+		row = [cust[0]]
+		for company in sorted(account_map):
+			row.append(account_map[company].get(cust[0], ''))
+		data.append(row)
+
+	return columns, data
+
+def get_account_map():
+	accounts = webnotes.conn.sql("""select name, company, master_name 
+		from `tabAccount` where master_type = 'Customer' 
+		and ifnull(master_name, '') != '' and docstatus < 2""", as_dict=1)
+
+	account_map = {}
+	for acc in accounts:
+		account_map.setdefault(acc.company, {}).setdefault(acc.master_name, {})
+		account_map[acc.company][acc.master_name] = acc.name
+
+	return account_map
+
+def get_columns(account_map):
+	columns = ["Customer:Link/Customer:120"] + \
+		[(company + ":Link/Account:120") for company in sorted(account_map)]
+
+	return columns
\ No newline at end of file
diff --git a/accounts/report/customer_account_head/customer_account_head.txt b/accounts/report/customer_account_head/customer_account_head.txt
new file mode 100644
index 0000000..d258fac
--- /dev/null
+++ b/accounts/report/customer_account_head/customer_account_head.txt
@@ -0,0 +1,21 @@
+[
+ {
+  "creation": "2013-06-03 16:17:34", 
+  "docstatus": 0, 
+  "modified": "2013-06-03 16:17:34", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Account", 
+  "report_name": "Customer Account Head", 
+  "report_type": "Script Report"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Customer Account Head"
+ }
+]
\ No newline at end of file
diff --git a/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.txt b/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.txt
index 7a9ec36..6b3bcf7 100644
--- a/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.txt
+++ b/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-28 15:54:16", 
   "docstatus": 0, 
-  "modified": "2013-05-28 16:02:57", 
+  "modified": "2013-06-05 13:01:05", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -11,7 +11,7 @@
   "doctype": "Report", 
   "is_standard": "Yes", 
   "name": "__common__", 
-  "query": "select \n    `tabPurchase Order`.`name` as \"Purchase Order:Link/Purchase Order:120\",\n    `tabPurchase Order`.`transaction_date` as \"Date:Date:100\",\n\t`tabPurchase Order`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Order Item`.`project_name` as \"Project\",\n\t`tabPurchase Order Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Order Item`.qty as \"Qty:Float:100\",\n\t`tabPurchase Order Item`.billed_qty as \"Billed Qty:Float:100\", \n\t(`tabPurchase Order Item`.qty - ifnull(`tabPurchase Order Item`.billed_qty, 0)) as \"Qty to Bill:Float:100\",\n\t`tabPurchase Order Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Order Item`.description as \"Description::200\"\nfrom\n\t`tabPurchase Order`, `tabPurchase Order Item`\nwhere\n\t`tabPurchase Order Item`.`parent` = `tabPurchase Order`.`name`\n\tand `tabPurchase Order`.docstatus = 1\n\tand `tabPurchase Order`.status != \"Stopped\"\n\tand ifnull(`tabPurchase Order Item`.billed_qty, 0) < ifnull(`tabPurchase Order Item`.qty, 0)\norder by `tabPurchase Order`.transaction_date asc", 
+  "query": "select \n    `tabPurchase Order`.`name` as \"Purchase Order:Link/Purchase Order:120\",\n    `tabPurchase Order`.`transaction_date` as \"Date:Date:100\",\n\t`tabPurchase Order`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Order Item`.`project_name` as \"Project\",\n\t`tabPurchase Order Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Order Item`.amount as \"Amount:Currency:100\",\n\t`tabPurchase Order Item`.billed_amt as \"Billed Amount:Currency:100\", \n\t(`tabPurchase Order Item`.amount - ifnull(`tabPurchase Order Item`.billed_amt, 0)) as \"Amount to Bill:Currency:100\",\n\t`tabPurchase Order Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Order Item`.description as \"Description::200\"\nfrom\n\t`tabPurchase Order`, `tabPurchase Order Item`\nwhere\n\t`tabPurchase Order Item`.`parent` = `tabPurchase Order`.`name`\n\tand `tabPurchase Order`.docstatus = 1\n\tand `tabPurchase Order`.status != \"Stopped\"\n\tand ifnull(`tabPurchase Order Item`.billed_amt, 0) < ifnull(`tabPurchase Order Item`.amount, 0)\norder by `tabPurchase Order`.transaction_date asc", 
   "ref_doctype": "Purchase Invoice", 
   "report_name": "Purchase Order Items To Be Billed", 
   "report_type": "Query Report"
diff --git a/accounts/report/received_items_to_be_billed/received_items_to_be_billed.txt b/accounts/report/received_items_to_be_billed/received_items_to_be_billed.txt
index 554e0f0..90617f8 100644
--- a/accounts/report/received_items_to_be_billed/received_items_to_be_billed.txt
+++ b/accounts/report/received_items_to_be_billed/received_items_to_be_billed.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-28 15:57:59", 
   "docstatus": 0, 
-  "modified": "2013-05-28 17:34:05", 
+  "modified": "2013-06-05 12:59:17", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -11,7 +11,7 @@
   "doctype": "Report", 
   "is_standard": "Yes", 
   "name": "__common__", 
-  "query": "select \n    `tabPurchase Receipt`.`name` as \"Purchase Receipt:Link/Purchase Receipt:120\",\n    `tabPurchase Receipt`.`posting_date` as \"Date:Date:100\",\n    `tabPurchase Receipt`.`supplier` as \"Supplier:Link/Supplier:120\",\n    `tabPurchase Receipt Item`.`project_name` as \"Project\",\n\t`tabPurchase Receipt Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Receipt Item`.qty as \"Qty:Float:100\",\n\t`tabPurchase Receipt Item`.billed_qty as \"Billed Qty:Float:100\", \n\t(`tabPurchase Receipt Item`.qty - ifnull(`tabPurchase Receipt Item`.billed_qty, 0)) as \"Qty to Bill:Float:100\",\n\t`tabPurchase Receipt Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Receipt Item`.description as \"Description::200\"\nfrom\n\t`tabPurchase Receipt`, `tabPurchase Receipt Item`\nwhere\n\t`tabPurchase Receipt Item`.`parent` = `tabPurchase Receipt`.`name`\n\tand `tabPurchase Receipt`.docstatus = 1\n\tand `tabPurchase Receipt`.status != \"Stopped\"\n\tand ifnull(`tabPurchase Receipt Item`.billed_qty, 0) < ifnull(`tabPurchase Receipt Item`.qty, 0)\norder by `tabPurchase Receipt`.posting_date asc", 
+  "query": "select \n    `tabPurchase Receipt`.`name` as \"Purchase Receipt:Link/Purchase Receipt:120\",\n    `tabPurchase Receipt`.`posting_date` as \"Date:Date:100\",\n    `tabPurchase Receipt`.`supplier` as \"Supplier:Link/Supplier:120\",\n    `tabPurchase Receipt Item`.`project_name` as \"Project\",\n\t`tabPurchase Receipt Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Receipt Item`.amount as \"Amount:Currency:100\",\n\t`tabPurchase Receipt Item`.billed_amt as \"Billed Amount:Currency:100\", \n\t(`tabPurchase Receipt Item`.amount - ifnull(`tabPurchase Receipt Item`.billed_amt, 0)) as \"Amount to Bill:Currency:100\",\n\t`tabPurchase Receipt Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Receipt Item`.description as \"Description::200\"\nfrom\n\t`tabPurchase Receipt`, `tabPurchase Receipt Item`\nwhere\n\t`tabPurchase Receipt Item`.`parent` = `tabPurchase Receipt`.`name`\n\tand `tabPurchase Receipt`.docstatus = 1\n\tand `tabPurchase Receipt`.status != \"Stopped\"\n\tand ifnull(`tabPurchase Receipt Item`.billed_amt, 0) < ifnull(`tabPurchase Receipt Item`.amount, 0)\norder by `tabPurchase Receipt`.posting_date asc", 
   "ref_doctype": "Purchase Invoice", 
   "report_name": "Received Items To Be Billed", 
   "report_type": "Query Report"
diff --git a/accounts/report/supplier_account_head/__init__.py b/accounts/report/supplier_account_head/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/accounts/report/supplier_account_head/__init__.py
diff --git a/accounts/report/supplier_account_head/supplier_account_head.py b/accounts/report/supplier_account_head/supplier_account_head.py
new file mode 100644
index 0000000..8b55067
--- /dev/null
+++ b/accounts/report/supplier_account_head/supplier_account_head.py
@@ -0,0 +1,49 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute(filters=None):
+	account_map = get_account_map()
+	columns = get_columns(account_map)
+	data = []
+	suppliers = webnotes.conn.sql("select name from tabSupplier where docstatus < 2")
+	for supplier in suppliers:
+		row = [supplier[0]]
+		for company in sorted(account_map):
+			row.append(account_map[company].get(supplier[0], ''))
+		data.append(row)
+
+	return columns, data
+
+def get_account_map():
+	accounts = webnotes.conn.sql("""select name, company, master_name 
+		from `tabAccount` where master_type = 'Supplier' 
+		and ifnull(master_name, '') != '' and docstatus < 2""", as_dict=1)
+
+	account_map = {}
+	for acc in accounts:
+		account_map.setdefault(acc.company, {}).setdefault(acc.master_name, {})
+		account_map[acc.company][acc.master_name] = acc.name
+
+	return account_map
+
+def get_columns(account_map):
+	columns = ["Supplier:Link/Supplier:120"] + \
+		[(company + ":Link/Account:120") for company in sorted(account_map)]
+
+	return columns
\ No newline at end of file
diff --git a/accounts/report/supplier_account_head/supplier_account_head.txt b/accounts/report/supplier_account_head/supplier_account_head.txt
new file mode 100644
index 0000000..b0554e8
--- /dev/null
+++ b/accounts/report/supplier_account_head/supplier_account_head.txt
@@ -0,0 +1,21 @@
+[
+ {
+  "creation": "2013-06-04 12:56:17", 
+  "docstatus": 0, 
+  "modified": "2013-06-04 12:56:46", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Account", 
+  "report_name": "Supplier Account Head", 
+  "report_type": "Script Report"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Supplier Account Head"
+ }
+]
\ No newline at end of file
diff --git a/buying/doctype/purchase_common/purchase_common.js b/buying/doctype/purchase_common/purchase_common.js
index 1bb64e5..dfcafed 100644
--- a/buying/doctype/purchase_common/purchase_common.js
+++ b/buying/doctype/purchase_common/purchase_common.js
@@ -435,7 +435,7 @@
 		$.each(field_label_map, function(fname, label) {
 			$wrapper.find('[data-grid-fieldname="'+fname+'"]').text(label);
 		});
-	}
+	},
 });
 
 // to save previous state of cur_frm.cscript
diff --git a/buying/doctype/purchase_common/purchase_common.py b/buying/doctype/purchase_common/purchase_common.py
index fbda873..7a27d71 100644
--- a/buying/doctype/purchase_common/purchase_common.py
+++ b/buying/doctype/purchase_common/purchase_common.py
@@ -88,13 +88,6 @@
 			msgprint("Supplier : %s does not exists" % (name))
 			raise Exception
 	
-	# Get TERMS AND CONDITIONS
-	# =======================================================================================
-	def get_tc_details(self,obj):
-		r = sql("select terms from `tabTerms and Conditions` where name = %s", obj.doc.tc_name)
-		if r: obj.doc.terms = r[0][0]
-
-
 	# Get Available Qty at Warehouse
 	def get_bin_details( self, arg = ''):
 		arg = eval(arg)
@@ -202,10 +195,11 @@
 					msgprint("Please check Item %s is not present in %s %s ." % (d.item_code, d.prevdoc_doctype, d.prevdoc_docname))
 					raise Exception
 				
-				# Check if Warehouse has been modified.
-				if not cstr(data[0]['warehouse']) == cstr(d.warehouse):
-					msgprint("Please check warehouse %s of Item %s which is not present in %s %s ." % (d.warehouse, d.item_code, d.prevdoc_doctype, d.prevdoc_docname))
-					raise Exception
+				if cstr(data[0]['warehouse']) and \
+						not cstr(data[0]['warehouse']) == cstr(d.warehouse):
+					msgprint("""Please check warehouse %s of Item %s 
+						which is not present in %s %s""" % (d.warehouse, d.item_code, 
+						d.prevdoc_doctype, d.prevdoc_docname), raise_exception=1)
 				
 				#	Check if UOM has been modified.
 				if not cstr(data[0]['uom']) == cstr(d.uom) and not cstr(d.prevdoc_doctype) == 'Material Request':
@@ -436,4 +430,4 @@
 		for d in getlist(obj.doclist, obj.fname):
 			if d.prevdoc_doctype and d.prevdoc_docname:
 				dt = sql("select transaction_date from `tab%s` where name = '%s'" % (d.prevdoc_doctype, d.prevdoc_docname))
-				d.prevdoc_date = dt and dt[0][0].strftime('%Y-%m-%d') or ''
\ No newline at end of file
+				d.prevdoc_date = dt and dt[0][0].strftime('%Y-%m-%d') or ''
diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py
index bf59389..d956971 100644
--- a/buying/doctype/purchase_order/purchase_order.py
+++ b/buying/doctype/purchase_order/purchase_order.py
@@ -102,10 +102,6 @@
 					d.schedule_date = webnotes.conn.get_value("Material Request Item",
 							d.prevdoc_detail_docname, "schedule_date")
 	
-	def get_tc_details(self):
-		"""get terms & conditions"""
-		return get_obj('Purchase Common').get_tc_details(self)
-
 	def get_last_purchase_rate(self):
 		get_obj('Purchase Common').get_last_purchase_rate(self)
 		
diff --git a/buying/doctype/purchase_order/purchase_order.txt b/buying/doctype/purchase_order/purchase_order.txt
index 902329b..b8e1cee 100644
--- a/buying/doctype/purchase_order/purchase_order.txt
+++ b/buying/doctype/purchase_order/purchase_order.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-21 16:16:39", 
   "docstatus": 0, 
-  "modified": "2013-05-28 12:20:33", 
+  "modified": "2013-06-05 14:45:40", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -31,7 +31,9 @@
   "parent": "Purchase Order", 
   "parentfield": "permissions", 
   "parenttype": "DocType", 
-  "read": 1
+  "permlevel": 0, 
+  "read": 1, 
+  "report": 1
  }, 
  {
   "doctype": "DocType", 
@@ -538,17 +540,7 @@
   "fieldname": "get_terms", 
   "fieldtype": "Button", 
   "label": "Get Terms and Conditions", 
-  "oldfieldtype": "Button", 
-  "options": "get_tc_details"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "terms_html", 
-  "fieldtype": "HTML", 
-  "label": "Terms and Conditions HTML", 
-  "oldfieldtype": "HTML", 
-  "options": "You can add Terms and Notes that will be printed in the Transaction", 
-  "print_hide": 1
+  "oldfieldtype": "Button"
  }, 
  {
   "doctype": "DocField", 
@@ -814,41 +806,15 @@
   "cancel": 0, 
   "create": 0, 
   "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
   "role": "Material User", 
   "submit": 0, 
   "write": 0
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
-  "role": "Material User", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Purchase Manager", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Purchase Manager", 
   "submit": 1, 
   "write": 1
@@ -858,26 +824,13 @@
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Purchase User", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "role": "All", 
-  "submit": 0
- }, 
- {
   "doctype": "DocPerm", 
   "match": "supplier", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Supplier"
  }
 ]
\ No newline at end of file
diff --git a/buying/doctype/purchase_order_item/purchase_order_item.txt b/buying/doctype/purchase_order_item/purchase_order_item.txt
index 5d69fb0..c561ed1 100755
--- a/buying/doctype/purchase_order_item/purchase_order_item.txt
+++ b/buying/doctype/purchase_order_item/purchase_order_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 19:29:06", 
   "docstatus": 0, 
-  "modified": "2013-05-28 12:13:21", 
+  "modified": "2013-05-31 14:26:22", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -377,15 +377,12 @@
   "read_only": 1
  }, 
  {
-  "default": "0.00", 
   "doctype": "DocField", 
-  "fieldname": "billed_qty", 
-  "fieldtype": "Float", 
-  "hidden": 0, 
-  "label": "Billed Quantity", 
+  "fieldname": "billed_amt", 
+  "fieldtype": "Currency", 
+  "label": "Billed Amt", 
   "no_copy": 1, 
-  "oldfieldname": "billed_qty", 
-  "oldfieldtype": "Currency", 
+  "options": "currency", 
   "print_hide": 1, 
   "read_only": 1
  }, 
diff --git a/buying/doctype/supplier_quotation/supplier_quotation.txt b/buying/doctype/supplier_quotation/supplier_quotation.txt
index 37e0e3c..1882fb6 100644
--- a/buying/doctype/supplier_quotation/supplier_quotation.txt
+++ b/buying/doctype/supplier_quotation/supplier_quotation.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-21 16:16:45", 
   "docstatus": 0, 
-  "modified": "2013-05-28 12:19:41", 
+  "modified": "2013-06-05 14:46:30", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -31,7 +31,9 @@
   "parent": "Supplier Quotation", 
   "parentfield": "permissions", 
   "parenttype": "DocType", 
-  "read": 1
+  "permlevel": 0, 
+  "read": 1, 
+  "report": 1
  }, 
  {
   "doctype": "DocType", 
@@ -504,17 +506,7 @@
   "fieldname": "get_terms", 
   "fieldtype": "Button", 
   "label": "Get Terms and Conditions", 
-  "oldfieldtype": "Button", 
-  "options": "get_tc_details"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "terms_html", 
-  "fieldtype": "HTML", 
-  "label": "Terms and Conditions HTML", 
-  "oldfieldtype": "HTML", 
-  "options": "You can add Terms and Notes that will be printed in the Transaction", 
-  "print_hide": 1
+  "oldfieldtype": "Button"
  }, 
  {
   "doctype": "DocField", 
@@ -674,8 +666,6 @@
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Manufacturing Manager", 
   "submit": 1, 
   "write": 1
@@ -685,8 +675,6 @@
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Purchase Manager", 
   "submit": 1, 
   "write": 1
@@ -696,8 +684,6 @@
   "cancel": 0, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Purchase User", 
   "submit": 0, 
   "write": 1
@@ -707,8 +693,6 @@
   "cancel": 0, 
   "create": 0, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Material User", 
   "submit": 0, 
   "write": 0
@@ -718,21 +702,8 @@
   "cancel": 0, 
   "create": 0, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Supplier", 
   "submit": 0, 
   "write": 0
- }, 
- {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "All", 
-  "submit": 0, 
-  "write": 0
  }
 ]
\ No newline at end of file
diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py
index b3007fe..f417b31 100644
--- a/controllers/accounts_controller.py
+++ b/controllers/accounts_controller.py
@@ -68,7 +68,7 @@
 				
 			if self.doc.fields.get(tax_master_field):
 				from webnotes.model import default_fields
-				tax_master = webnotes.bean(tax_doctype, self.doc.fields.get(tax_master_field))
+				tax_master = webnotes.bean(tax_doctype + " Master", self.doc.fields.get(tax_master_field))
 				
 				for i, tax in enumerate(tax_master.doclist.get({"parentfield": tax_parentfield})):
 					for fieldname in default_fields:
diff --git a/controllers/buying_controller.py b/controllers/buying_controller.py
index 303eef3..312fb8e 100644
--- a/controllers/buying_controller.py
+++ b/controllers/buying_controller.py
@@ -50,12 +50,12 @@
 		self.set_missing_item_details(get_item_details)
 		
 	def set_supplier_defaults(self):
-		self.get_default_supplier_address(self.doc.fields)
+		self.doc.fields.update(self.get_default_supplier_address(self.doc.fields))
 						
 	def get_purchase_tax_details(self):
 		self.doclist = self.doc.clear_table(self.doclist, "purchase_tax_details")
 		self.set_taxes()
-			
+		
 	def validate_warehouse_belongs_to_company(self):
 		for warehouse, company in webnotes.conn.get_values("Warehouse", 
 			self.doclist.get_distinct_values("warehouse"), "company").items():
@@ -286,4 +286,4 @@
 					from `tabItem` where name in (%s) and is_purchase_item='Yes'""" % \
 					(", ".join((["%s"]*len(item_codes))),), item_codes)]
 
-		return self._purchase_items
+		return self._purchase_items
\ No newline at end of file
diff --git a/controllers/status_updater.py b/controllers/status_updater.py
new file mode 100644
index 0000000..ac06b2e
--- /dev/null
+++ b/controllers/status_updater.py
@@ -0,0 +1,177 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes.utils import flt, cstr
+from webnotes import msgprint
+
+from webnotes.model.controller import DocListController
+
+class StatusUpdater(DocListController):
+	"""
+		Updates the status of the calling records
+		Delivery Note: Update Delivered Qty, Update Percent and Validate over delivery
+		Sales Invoice: Update Billed Amt, Update Percent and Validate over billing
+		Installation Note: Update Installed Qty, Update Percent Qty and Validate over installation
+	"""
+
+	def update_prevdoc_status(self):
+		self.update_qty()
+		self.validate_qty()
+	
+	def validate_qty(self):
+		"""
+			Validates qty at row level
+		"""
+		self.tolerance = {}
+		self.global_tolerance = None
+		
+		for args in self.status_updater:
+			# get unique transactions to update
+			for d in self.doclist:
+				if d.doctype == args['source_dt'] and d.fields.get(args["join_field"]):
+					args['name'] = d.fields[args['join_field']]
+
+					# get all qty where qty > target_field
+					item = webnotes.conn.sql("""select item_code, `%(target_ref_field)s`, 
+						`%(target_field)s`, parenttype, parent from `tab%(target_dt)s` 
+						where `%(target_ref_field)s` < `%(target_field)s` 
+						and name="%(name)s" and docstatus=1""" % args, as_dict=1)
+					if item:
+						item = item[0]
+						item['idx'] = d.idx
+						item['target_ref_field'] = args['target_ref_field'].replace('_', ' ')
+
+						if not item[args['target_ref_field']]:
+							msgprint("""As %(target_ref_field)s for item: %(item_code)s in \
+							%(parenttype)s: %(parent)s is zero, system will not check \
+							over-delivery or over-billed""" % item)
+						elif args.get('no_tolerance'):
+							item['reduce_by'] = item[args['target_field']] - \
+								item[args['target_ref_field']]
+							if item['reduce_by'] > .01:
+								msgprint("""
+									Row #%(idx)s: Max %(target_ref_field)s allowed for <b>Item \
+									%(item_code)s</b> against <b>%(parenttype)s %(parent)s</b> \
+									is <b>""" % item + cstr(item[args['target_ref_field']]) +
+									 """</b>.<br>You must reduce the %(target_ref_field)s by \
+									%(reduce_by)s""" % item, raise_exception=1)
+					
+						else:
+							self.check_overflow_with_tolerance(item, args)
+						
+	def check_overflow_with_tolerance(self, item, args):
+		"""
+			Checks if there is overflow condering a relaxation tolerance
+		"""
+	
+		# check if overflow is within tolerance
+		tolerance = self.get_tolerance_for(item['item_code'])
+		overflow_percent = ((item[args['target_field']] - item[args['target_ref_field']]) / 
+		 	item[args['target_ref_field']]) * 100
+	
+		if overflow_percent - tolerance > 0.01:
+			item['max_allowed'] = flt(item[args['target_ref_field']] * (100+tolerance)/100)
+			item['reduce_by'] = item[args['target_field']] - item['max_allowed']
+		
+			msgprint("""
+				Row #%(idx)s: Max %(target_ref_field)s allowed for <b>Item %(item_code)s</b> \
+				against <b>%(parenttype)s %(parent)s</b> is <b>%(max_allowed)s</b>. 
+				
+				If you want to increase your overflow tolerance, please increase tolerance %% in \
+				Global Defaults or Item master. 
+				
+				Or, you must reduce the %(target_ref_field)s by %(reduce_by)s
+				
+				Also, please check if the order item has already been billed in the Sales Order""" % 
+				item, raise_exception=1)
+				
+	def get_tolerance_for(self, item_code):
+		"""
+			Returns the tolerance for the item, if not set, returns global tolerance
+		"""
+		if self.tolerance.get(item_code): return self.tolerance[item_code]
+		
+		tolerance = flt(webnotes.conn.get_value('Item',item_code,'tolerance') or 0)
+
+		if not tolerance:
+			if self.global_tolerance == None:
+				self.global_tolerance = flt(webnotes.conn.get_value('Global Defaults', None, 
+					'tolerance'))
+			tolerance = self.global_tolerance
+		
+		self.tolerance[item_code] = tolerance
+		return tolerance
+	
+
+	def update_qty(self, change_modified=True):
+		"""
+			Updates qty at row level
+		"""
+		for args in self.status_updater:
+			# condition to include current record (if submit or no if cancel)
+			if self.doc.docstatus == 1:
+				args['cond'] = ' or parent="%s"' % self.doc.name
+			else:
+				args['cond'] = ' and parent!="%s"' % self.doc.name
+			
+			args['modified_cond'] = ''
+			if change_modified:
+				args['modified_cond'] = ', modified = now()'
+		
+			# update quantities in child table
+			for d in self.doclist:
+				if d.doctype == args['source_dt']:
+					# updates qty in the child table
+					args['detail_id'] = d.fields.get(args['join_field'])
+					
+					args['second_source_condition'] = ""
+					if args.get('second_source_dt') and args.get('second_source_field') \
+							and args.get('second_join_field'):
+						args['second_source_condition'] = """ + (select sum(%(second_source_field)s) 
+							from `tab%(second_source_dt)s` 
+							where `%(second_join_field)s`="%(detail_id)s" 
+							and (docstatus=1))""" % args
+			
+					if args['detail_id']:
+						webnotes.conn.sql("""update `tab%(target_dt)s` 
+							set %(target_field)s = (select sum(%(source_field)s) 
+								from `tab%(source_dt)s` where `%(join_field)s`="%(detail_id)s" 
+								and (docstatus=1 %(cond)s)) %(second_source_condition)s
+							where name='%(detail_id)s'""" % args)
+		
+			# get unique transactions to update
+			for name in set([d.fields.get(args['percent_join_field']) for d in self.doclist 
+					if d.doctype == args['source_dt']]):
+				if name:
+					args['name'] = name
+				
+					# update percent complete in the parent table
+					webnotes.conn.sql("""update `tab%(target_parent_dt)s` 
+						set %(target_parent_field)s = (select sum(if(%(target_ref_field)s > 
+							ifnull(%(target_field)s, 0), %(target_field)s, 
+							%(target_ref_field)s))/sum(%(target_ref_field)s)*100 
+							from `tab%(target_dt)s` where parent="%(name)s") %(modified_cond)s
+						where name='%(name)s'""" % args)
+
+					# update field
+					if args.get('status_field'):
+						webnotes.conn.sql("""update `tab%(target_parent_dt)s` 
+							set %(status_field)s = if(ifnull(%(target_parent_field)s,0)<0.001, 
+								'Not %(keyword)s', if(%(target_parent_field)s>=99.99, 
+								'Fully %(keyword)s', 'Partly %(keyword)s'))
+							where name='%(name)s'""" % args)
\ No newline at end of file
diff --git a/manufacturing/doctype/bom/bom.py b/manufacturing/doctype/bom/bom.py
index 5a1d47f..5f64148 100644
--- a/manufacturing/doctype/bom/bom.py
+++ b/manufacturing/doctype/bom/bom.py
@@ -266,22 +266,27 @@
 				for b in boms:
 					if b[0] == self.doc.name:
 						msgprint("""Recursion Occured => '%s' cannot be '%s' of '%s'.
-							""" % (cstr(b), cstr(d[2]), self.doc.name), raise_exception = 1)
+							""" % (cstr(b[0]), cstr(d[2]), self.doc.name), raise_exception = 1)
 					if b[0]:
 						bom_list.append(b[0])
 	
-	def update_cost_and_exploded_items(self):
-		bom_list = self.traverse_tree()
+	def update_cost_and_exploded_items(self, bom_list=[]):
+		bom_list = self.traverse_tree(bom_list)
 		for bom in bom_list:
 			bom_obj = get_obj("BOM", bom, with_children=1)
 			bom_obj.on_update()
 			
-	def traverse_tree(self):
+		return bom_list
+			
+	def traverse_tree(self, bom_list=[]):
 		def _get_children(bom_no):
 			return [cstr(d[0]) for d in webnotes.conn.sql("""select bom_no from `tabBOM Item` 
 				where parent = %s and ifnull(bom_no, '') != ''""", bom_no)]
 				
-		bom_list, count = [self.doc.name], 0		
+		count = 0
+		if self.doc.name not in bom_list:
+			bom_list.append(self.doc.name)
+		
 		while(count < len(bom_list)):
 			for child_bom in _get_children(bom_list[count]):
 				if child_bom not in bom_list:
@@ -325,52 +330,50 @@
 
 	def get_exploded_items(self):
 		""" Get all raw materials including items from child bom"""
-		self.cur_exploded_items = []
+		self.cur_exploded_items = {}
 		for d in getlist(self.doclist, 'bom_materials'):
 			if d.bom_no:
 				self.get_child_exploded_items(d.bom_no, d.qty)
 			else:
-				self.cur_exploded_items.append({
+				self.add_to_cur_exploded_items(webnotes._dict({
 					'item_code'				: d.item_code, 
 					'description'			: d.description, 
 					'stock_uom'				: d.stock_uom, 
 					'qty'					: flt(d.qty),
-					'rate'					: flt(d.rate), 
-					'amount'				: flt(d.amount),
-					'parent_bom'			: d.parent,
-					'mat_detail_no'			: d.name,
-					'qty_consumed_per_unit' : flt(d.qty_consumed_per_unit)
-				})
+					'rate'					: flt(d.rate),
+				}))
+				
+	def add_to_cur_exploded_items(self, args):
+		if self.cur_exploded_items.get(args.item_code):
+			self.cur_exploded_items[args.item_code]["qty"] += args.qty
+		else:
+			self.cur_exploded_items[args.item_code] = args
 	
 	def get_child_exploded_items(self, bom_no, qty):
 		""" Add all items from Flat BOM of child BOM"""
 		
 		child_fb_items = sql("""select item_code, description, stock_uom, qty, rate, 
-			amount, parent_bom, mat_detail_no, qty_consumed_per_unit 
-			from `tabBOM Explosion Item` where parent = '%s' and docstatus = 1""" %
-			bom_no, as_dict = 1)
+			qty_consumed_per_unit from `tabBOM Explosion Item` 
+			where parent = %s and docstatus = 1""", bom_no, as_dict = 1)
+			
 		for d in child_fb_items:
-			self.cur_exploded_items.append({
+			self.add_to_cur_exploded_items(webnotes._dict({
 				'item_code'				: d['item_code'], 
 				'description'			: d['description'], 
 				'stock_uom'				: d['stock_uom'], 
 				'qty'					: flt(d['qty_consumed_per_unit'])*qty,
-				'rate'					: flt(d['rate']), 
-				'amount'				: flt(d['amount']),
-				'parent_bom'			: d['parent_bom'],
-				'mat_detail_no'			: d['mat_detail_no'],
-				'qty_consumed_per_unit' : flt(d['qty_consumed_per_unit'])*qty/flt(self.doc.quantity)
-
-			})
+				'rate'					: flt(d['rate']),
+			}))
 
 	def add_exploded_items(self):
 		"Add items to Flat BOM table"
 		self.doclist = self.doc.clear_table(self.doclist, 'flat_bom_details', 1)
 		for d in self.cur_exploded_items:
-			ch = addchild(self.doc, 'flat_bom_details', 'BOM Explosion Item', 
-				self.doclist)
-			for i in d.keys():
-				ch.fields[i] = d[i]
+			ch = addchild(self.doc, 'flat_bom_details', 'BOM Explosion Item', self.doclist)
+			for i in self.cur_exploded_items[d].keys():
+				ch.fields[i] = self.cur_exploded_items[d][i]
+			ch.amount = flt(ch.qty) * flt(ch.rate)
+			ch.qty_consumed_per_unit = flt(ch.qty) / flt(self.doc.quantity)
 			ch.docstatus = self.doc.docstatus
 			ch.save(1)
 
diff --git a/manufacturing/doctype/bom/test_bom.py b/manufacturing/doctype/bom/test_bom.py
index e742c0c..cb91e78 100644
--- a/manufacturing/doctype/bom/test_bom.py
+++ b/manufacturing/doctype/bom/test_bom.py
@@ -48,134 +48,4 @@
 			"stock_uom": "No."
 		}
 	]
-]
-
-
-
-# import webnotes.model
-# from webnotes.utils import nowdate, flt
-# from accounts.utils import get_fiscal_year
-# from webnotes.model.doclist import DocList
-# import copy
-# 
-# company = webnotes.conn.get_default("company")
-# 
-# 
-# def load_data():
-# 	
-# 	# create default warehouse
-# 	if not webnotes.conn.exists("Warehouse", "Default Warehouse"):
-# 		webnotes.insert({"doctype": "Warehouse", 
-# 			"warehouse_name": "Default Warehouse",
-# 			"warehouse_type": "Stores"})
-# 			
-# 	# create UOM: Nos.
-# 	if not webnotes.conn.exists("UOM", "Nos"):
-# 		webnotes.insert({"doctype": "UOM", "uom_name": "Nos"})
-# 	
-# 	from webnotes.tests import insert_test_data
-# 	# create item groups and items
-# 	insert_test_data("Item Group", 
-# 		sort_fn=lambda ig: (ig[0].get('parent_item_group'), ig[0].get('name')))
-# 	insert_test_data("Item")
-# 
-# base_bom_fg = [
-# 	{"doctype": "BOM", "item": "Android Jack D", "quantity": 1,
-# 		"is_active": "Yes", "is_default": 1, "uom": "Nos"},
-# 	{"doctype": "BOM Operation", "operation_no": 1, "parentfield": "bom_operations",
-# 		"opn_description": "Development", "hour_rate": 10, "time_in_mins": 90}, 
-# 	{"doctype": "BOM Item", "item_code": "Home Desktop 300", "operation_no": 1, 
-# 		"qty": 2, "rate": 20, "stock_uom": "Nos", "parentfield": "bom_materials"},
-# 	{"doctype": "BOM Item", "item_code": "Home Desktop 100", "operation_no": 1, 
-# 		"qty": 1, "rate": 300, "stock_uom": "Nos", "parentfield": "bom_materials"},
-# 	{"doctype": "BOM Item", "item_code": "Nebula 7", "operation_no": 1, 
-# 			"qty": 5, "stock_uom": "Nos", "parentfield": "bom_materials"},
-# ]
-# 
-# base_bom_child = [
-# 	{"doctype": "BOM", "item": "Nebula 7", "quantity": 5,
-# 		"is_active": "Yes", "is_default": 1, "uom": "Nos"},
-# 	{"doctype": "BOM Operation", "operation_no": 1, "parentfield": "bom_operations",
-# 		"opn_description": "Development"}, 
-# 	{"doctype": "BOM Item", "item_code": "Android Jack S", "operation_no": 1, 
-# 		"qty": 10, "stock_uom": "Nos", "parentfield": "bom_materials"}
-# ]
-# 	
-# base_bom_grandchild = [
-# 	{"doctype": "BOM", "item": "Android Jack S", "quantity": 1,
-# 		"is_active": "Yes", "is_default": 1, "uom": "Nos"},
-# 	{"doctype": "BOM Operation", "operation_no": 1, "parentfield": "bom_operations",
-# 		"opn_description": "Development"}, 
-# 	{"doctype": "BOM Item", "item_code": "Home Desktop 300", "operation_no": 1, 
-# 		"qty": 3, "rate": 10, "stock_uom": "Nos", 	"parentfield": "bom_materials"}
-# ]
-# 
-# 
-# class TestPurchaseReceipt(unittest.TestCase):
-# 	def setUp(self):
-# 		webnotes.conn.begin()
-# 		load_data()
-# 		
-# 	def test_bom_validation(self):
-# 		# show throw error bacause bom no missing for sub-assembly item
-# 		bom_fg = copy.deepcopy(base_bom_fg)
-# 		self.assertRaises(webnotes.ValidationError, webnotes.insert, DocList(bom_fg))
-# 
-# 		# main item is not a manufacturing item
-# 		bom_fg = copy.deepcopy(base_bom_fg)
-# 		bom_fg[0]["item"] = "Home Desktop 200"
-# 		bom_fg.pop(4)
-# 		self.assertRaises(webnotes.ValidationError, webnotes.insert, DocList(bom_fg))
-# 		
-# 		# operation no mentioed in material table not matching with operation table
-# 		bom_fg = copy.deepcopy(base_bom_fg)
-# 		bom_fg.pop(4)
-# 		bom_fg[2]["operation_no"] = 2
-# 		self.assertRaises(webnotes.ValidationError, webnotes.insert, DocList(bom_fg))
-# 		
-# 	
-# 	def test_bom(self):
-# 		gc_wrapper = webnotes.insert(DocList(base_bom_grandchild))
-# 		gc_wrapper.submit()
-# 		
-# 		bom_child = copy.deepcopy(base_bom_child)
-# 		bom_child[2]["bom_no"] = gc_wrapper.doc.name
-# 		child_wrapper = webnotes.insert(DocList(bom_child))
-# 		child_wrapper.submit()
-# 		
-# 		bom_fg = copy.deepcopy(base_bom_fg)
-# 		bom_fg[4]["bom_no"] = child_wrapper.doc.name
-# 		fg_wrapper = webnotes.insert(DocList(bom_fg))
-# 		fg_wrapper.load_from_db()
-# 		
-# 		self.check_bom_cost(fg_wrapper)
-# 		
-# 		self.check_flat_bom(fg_wrapper, child_wrapper, gc_wrapper)
-# 		
-# 	def check_bom_cost(self, fg_wrapper):
-# 		expected_values = {
-# 			"operating_cost": 15,
-# 			"raw_material_cost": 640,
-# 			"total_cost": 655
-# 		}
-# 
-# 		for key in expected_values:
-# 			self.assertEqual(flt(expected_values[key]), flt(fg_wrapper.doc.fields.get(key)))
-# 			
-# 	def check_flat_bom(self, fg_wrapper, child_wrapper, gc_wrapper):
-# 		expected_flat_bom_items = {
-# 			("Home Desktop 300", fg_wrapper.doc.name): (2, 20),
-# 			("Home Desktop 100", fg_wrapper.doc.name): (1, 300),
-# 			("Home Desktop 300", gc_wrapper.doc.name): (30, 10)
-# 		}
-# 		
-# 		self.assertEqual(len(fg_wrapper.doclist.get({"parentfield": "flat_bom_details"})), 3)
-# 		
-# 		for key, val in expected_flat_bom_items.items():
-# 			flat_bom = fg_wrapper.doclist.get({"parentfield": "flat_bom_details", 
-# 				"item_code": key[0], "parent_bom": key[1]})[0]
-# 			self.assertEqual(val, (flat_bom.qty, flat_bom.rate))
-# 		
-# 		
-# 	def tearDown(self):
-# 		webnotes.conn.rollback()
\ No newline at end of file
+]
\ No newline at end of file
diff --git a/manufacturing/doctype/bom_explosion_item/bom_explosion_item.txt b/manufacturing/doctype/bom_explosion_item/bom_explosion_item.txt
index 07aad7d..3808cdf 100644
--- a/manufacturing/doctype/bom_explosion_item/bom_explosion_item.txt
+++ b/manufacturing/doctype/bom_explosion_item/bom_explosion_item.txt
@@ -1,8 +1,8 @@
 [
  {
-  "creation": "2013-02-22 01:27:48", 
+  "creation": "2013-03-07 11:42:57", 
   "docstatus": 0, 
-  "modified": "2013-03-07 07:03:18", 
+  "modified": "2013-06-04 13:13:28", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -82,25 +82,6 @@
  }, 
  {
   "doctype": "DocField", 
-  "fieldname": "parent_bom", 
-  "fieldtype": "Link", 
-  "hidden": 0, 
-  "label": "Parent BOM", 
-  "oldfieldname": "parent_bom", 
-  "oldfieldtype": "Link", 
-  "options": "BOM", 
-  "print_width": "250px", 
-  "width": "250px"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "mat_detail_no", 
-  "fieldtype": "Data", 
-  "hidden": 1, 
-  "label": "Mat Detail No"
- }, 
- {
-  "doctype": "DocField", 
   "fieldname": "qty_consumed_per_unit", 
   "fieldtype": "Float", 
   "hidden": 0, 
diff --git a/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py b/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
index 4c9c42d..e69c487 100644
--- a/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
+++ b/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
@@ -29,9 +29,10 @@
 		self.validate_bom()
 		self.update_new_bom()
 		bom_list = self.get_parent_boms()
+		updated_bom = []
 		for bom in bom_list:
 			bom_obj = get_obj("BOM", bom, with_children=1)
-			bom_obj.update_cost_and_exploded_items()
+			updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
 			
 		webnotes.msgprint(_("BOM replaced"))
 
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 1686478..ed7f7bf 100644
--- a/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -241,40 +241,30 @@
 	def get_raw_materials(self, bom_dict):
 		""" Get raw materials considering sub-assembly items 
 			{
-				"item_code": [qty_required, description, stock_uom]
+				"item_code": [qty_required, description, stock_uom, min_order_qty]
 			}
 		"""
 		for bom in bom_dict:
 			if self.doc.use_multi_level_bom:
 				# get all raw materials with sub assembly childs					
-				fl_bom_items = sql("""
-					select 
-						item_code,ifnull(sum(qty_consumed_per_unit),0)*%s as qty, 
-						description, stock_uom, min_order_qty
-					from 
-						( 
-							select distinct fb.name, fb.description, fb.item_code,
-							 	fb.qty_consumed_per_unit, fb.stock_uom, it.min_order_qty 
-							from `tabBOM Explosion Item` fb,`tabItem` it 
-							where it.name = fb.item_code 
-							and ifnull(it.is_pro_applicable, 'No') = 'No'
-							and ifnull(it.is_sub_contracted_item, 'No') = 'No' 
-							and fb.docstatus<2 and fb.parent=%s
-						) a
-					group by item_code,stock_uom
-				""" , (flt(bom_dict[bom]), bom))
+				fl_bom_items = sql("""select fb.item_code, 
+					ifnull(sum(fb.qty_consumed_per_unit), 0)*%s as qty, 
+					fb.description, fb.stock_uom, it.min_order_qty 
+					from `tabBOM Explosion Item` fb,`tabItem` it 
+					where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
+					and ifnull(it.is_sub_contracted_item, 'No') = 'No' 
+					and fb.docstatus<2 and fb.parent=%s
+					group by item_code, stock_uom""", (flt(bom_dict[bom]), bom))
 			else:
 				# Get all raw materials considering SA items as raw materials, 
 				# so no childs of SA items
-				fl_bom_items = sql("""
-					select bom_item.item_code, 
+				fl_bom_items = sql("""select bom_item.item_code, 
 						ifnull(sum(bom_item.qty_consumed_per_unit), 0) * %s, 
 						bom_item.description, bom_item.stock_uom, item.min_order_qty
 					from `tabBOM Item` bom_item, tabItem item
 					where bom_item.parent = %s and bom_item.docstatus < 2 
-					and bom_item.item_code = item.name
-					group by item_code
-				""", (flt(bom_dict[bom]), bom))
+					and bom_item.item_code = item.name 
+					group by item_code""", (flt(bom_dict[bom]), bom))
 			self.make_items_dict(fl_bom_items)
 
 	def make_items_dict(self, item_list):
@@ -317,9 +307,9 @@
 		
 		items_to_be_requested = webnotes._dict()
 		for item in self.item_dict:
-			if flt(self.item_dict[item][0]) > item_projected_qty[item]:
+			if flt(self.item_dict[item][0]) > item_projected_qty.get(item, 0):
 				# shortage
-				requested_qty = flt(self.item_dict[item][0]) - item_projected_qty[item]
+				requested_qty = flt(self.item_dict[item][0]) - item_projected_qty.get(item, 0)
 				# comsider minimum order qty
 				requested_qty = requested_qty > flt(self.item_dict[item][3]) and \
 					requested_qty or flt(self.item_dict[item][3])
@@ -379,4 +369,4 @@
 				webnotes.msgprint("Following Material Request created successfully: \n%s" % 
 					"\n".join(pur_req))
 		else:
-			webnotes.msgprint("Nothing to request")
\ No newline at end of file
+			webnotes.msgprint("Nothing to request")
diff --git a/patches/april_2013/p06_update_file_size.py b/patches/april_2013/p06_update_file_size.py
index 8709c7b..760c3cb 100644
--- a/patches/april_2013/p06_update_file_size.py
+++ b/patches/april_2013/p06_update_file_size.py
@@ -2,11 +2,13 @@
 
 def execute():
 	files_path = webnotes.utils.get_path("public", "files")
+	webnotes.conn.auto_commit_on_many_writes = 1
+
 	for f in webnotes.conn.sql("""select name, file_name from 
 		`tabFile Data`""", as_dict=True):
 		if f.file_name:
 			filepath = os.path.join(files_path, f.file_name)
 			if os.path.exists(filepath):
 				webnotes.conn.set_value("File Data", f.name, "file_size", os.stat(filepath).st_size)
-			
-		
\ No newline at end of file
+				
+	webnotes.conn.auto_commit_on_many_writes = 0
\ No newline at end of file
diff --git a/patches/april_2013/p07_update_file_data_2.py b/patches/april_2013/p07_update_file_data_2.py
index 0cb44d0..548ba6c 100644
--- a/patches/april_2013/p07_update_file_data_2.py
+++ b/patches/april_2013/p07_update_file_data_2.py
@@ -2,6 +2,8 @@
 def execute():
 	from patches.april_2013.p05_update_file_data import update_file_list, get_single_doctypes
 	
+	webnotes.conn.auto_commit_on_many_writes = 1
+	
 	singles = get_single_doctypes()
 	for doctype in webnotes.conn.sql_list("""select table_name from `information_schema`.`columns`
 		where table_schema=%s and column_name='file_list'""", webnotes.conn.cur_db_name):
@@ -13,4 +15,5 @@
 			
 			webnotes.conn.sql("""delete from `tabCustom Field` where fieldname='file_list'
 				and parent=%s""", doctype)
-	
\ No newline at end of file
+	
+	webnotes.conn.auto_commit_on_many_writes = 0
\ No newline at end of file
diff --git a/patches/june_2013/__init__.py b/patches/june_2013/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/patches/june_2013/__init__.py
diff --git a/patches/june_2013/p01_update_bom_exploded_items.py b/patches/june_2013/p01_update_bom_exploded_items.py
new file mode 100644
index 0000000..eff0931
--- /dev/null
+++ b/patches/june_2013/p01_update_bom_exploded_items.py
@@ -0,0 +1,29 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+	updated_bom = []
+	for bom in webnotes.conn.sql("select name from tabBOM where docstatus < 2"):
+		if bom[0] not in updated_bom:
+			try:
+				bom_obj = webnotes.get_obj("BOM", bom[0], with_children=1)
+				updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
+				webnotes.conn.commit()
+			except:
+				pass
\ No newline at end of file
diff --git a/patches/may_2013/p06_update_billed_amt_po_pr.py b/patches/may_2013/p06_update_billed_amt_po_pr.py
new file mode 100644
index 0000000..5084e98
--- /dev/null
+++ b/patches/may_2013/p06_update_billed_amt_po_pr.py
@@ -0,0 +1,24 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+def execute():
+	import webnotes
+	webnotes.reload_doc("buying", "doctype", "purchase_order_item")
+	webnotes.reload_doc("stock", "doctype", "purchase_receipt_item")
+	for pi in webnotes.conn.sql("""select name from `tabPurchase Invoice` where docstatus = 1"""):
+		webnotes.get_obj("Purchase Invoice", pi[0], 
+			with_children=1).update_qty(change_modified=False)
\ No newline at end of file
diff --git a/patches/patch_list.py b/patches/patch_list.py
index e877b92..c15e0c6 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -254,6 +254,8 @@
 	"patches.may_2013.p04_reorder_level",
 	"patches.may_2013.p05_update_cancelled_gl_entries",
 	"patches.may_2013.p06_make_notes",
+	"patches.may_2013.p06_update_billed_amt_po_pr",
 	"patches.may_2013.p07_move_update_stock_to_pos",
 	"patches.may_2013.p08_change_item_wise_tax",
+	"patches.june_2013.p01_update_bom_exploded_items",
 ]
\ No newline at end of file
diff --git a/projects/page/projects_home/projects_home.js b/projects/page/projects_home/projects_home.js
index cfde6b3..fd13a67 100644
--- a/projects/page/projects_home/projects_home.js
+++ b/projects/page/projects_home/projects_home.js
@@ -60,6 +60,11 @@
 				route: "query-report/Daily Time Log Summary",
 				doctype: "Time Log"
 			},
+			{
+				"label":wn._("Project wise Stock Tracking"),
+				route: "query-report/Project wise Stock Tracking",
+				doctype: "Project"
+			},
 		]
 	}]
 
diff --git a/projects/report/project_wise_stock_tracking/__init__.py b/projects/report/project_wise_stock_tracking/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/projects/report/project_wise_stock_tracking/__init__.py
diff --git a/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py b/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
new file mode 100644
index 0000000..7c702e4
--- /dev/null
+++ b/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
@@ -0,0 +1,90 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import webnotes 
+
+def execute(filters=None):
+	columns = get_columns()
+	proj_details = get_project_details()
+	pr_item_map = get_purchased_items_cost()
+	se_item_map = get_issued_items_cost()
+	dn_item_map = get_delivered_items_cost()
+
+	data = []
+	for project in proj_details:
+		data.append([project.name, pr_item_map.get(project.name, 0), 
+			se_item_map.get(project.name, 0), dn_item_map.get(project.name, 0), 
+			project.project_name, project.status, project.company, 
+			project.customer, project.project_value, project.project_start_date, 
+			project.completion_date])
+
+	return columns, data 
+
+def get_columns():
+	return ["Project Id:Link/Project:140", "Cost of Purchased Items:Currency:160",
+		"Cost of Issued Items:Currency:160", "Cost of Delivered Items:Currency:160", 
+		"Project Name::120", "Project Status::120", "Company:Link/Company:100", 
+		"Customer:Link/Customer:140", "Project Value:Currency:120", 
+		"Project Start Date:Date:120", "Completion Date:Date:120"]
+
+def get_project_details():
+	return webnotes.conn.sql(""" select name, project_name, status, company, customer, project_value,
+		project_start_date, completion_date from tabProject where docstatus < 2""", as_dict=1)
+
+def get_purchased_items_cost():
+	pr_items = webnotes.conn.sql("""select project_name, sum(amount) as amount
+		from `tabPurchase Receipt Item` where ifnull(project_name, '') != '' 
+		and docstatus = 1 group by project_name""", as_dict=1)
+
+	pr_item_map = {}
+	for item in pr_items:
+		pr_item_map.setdefault(item.project_name, item.amount)
+
+	return pr_item_map
+
+def get_issued_items_cost():
+	se_items = webnotes.conn.sql("""select se.project_name, sum(se_item.amount) as amount
+		from `tabStock Entry` se, `tabStock Entry Detail` se_item
+		where se.name = se_item.parent and se.docstatus = 1 and ifnull(se_item.t_warehouse, '') = '' 
+		and ifnull(se.project_name, '') != '' group by se.project_name""", as_dict=1)
+
+	se_item_map = {}
+	for item in se_items:
+		se_item_map.setdefault(item.project_name, item.amount)
+
+	return se_item_map
+
+def get_delivered_items_cost():
+	dn_items = webnotes.conn.sql("""select dn.project_name, sum(dn_item.amount) as amount
+		from `tabDelivery Note` dn, `tabDelivery Note Item` dn_item
+		where dn.name = dn_item.parent and dn.docstatus = 1 and ifnull(dn.project_name, '') != ''
+		group by dn.project_name""", as_dict=1)
+
+	si_items = webnotes.conn.sql("""select si.project_name, sum(si_item.amount) as amount
+		from `tabSales Invoice` si, `tabSales Invoice Item` si_item
+		where si.name = si_item.parent and si.docstatus = 1 and ifnull(si.update_stock, 0) = 1 
+		and ifnull(si.is_pos, 0) = 1 and ifnull(si.project_name, '') != ''
+		group by si.project_name""", as_dict=1)
+
+
+	dn_item_map = {}
+	for item in dn_items:
+		dn_item_map.setdefault(item.project_name, item.amount)
+
+	for item in si_items:
+		dn_item_map.setdefault(item.project_name, item.amount)
+
+	return dn_item_map
\ No newline at end of file
diff --git a/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.txt b/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.txt
new file mode 100644
index 0000000..89f5085
--- /dev/null
+++ b/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.txt
@@ -0,0 +1,21 @@
+[
+ {
+  "creation": "2013-06-03 17:37:41", 
+  "docstatus": 0, 
+  "modified": "2013-06-03 17:37:41", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Project", 
+  "report_name": "Project wise Stock Tracking ", 
+  "report_type": "Report Builder"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Project wise Stock Tracking"
+ }
+]
\ No newline at end of file
diff --git a/public/css/splash.css b/public/css/splash.css
index 1519d23..d4f0493 100644
--- a/public/css/splash.css
+++ b/public/css/splash.css
@@ -21,15 +21,16 @@
 
 .splash {
 	margin: auto;
-	width: 160px;
-	height: 160px;
 	position: absolute;
 	top: 0px;
 	left: 0px;
 	right: 0px;
-	bottom: 0px;
-	color: #888;
+	bottom: 30px;
+	width: 160px;
+	height: 160px;
 	text-align: center;
+	color: #888;
+	
 	animation-duration: 1s;
 	animation-name: pulse;
 	animation-iteration-count: infinite;
@@ -39,4 +40,13 @@
 	-webkit-animation-name: pulse;
 	-webkit-animation-iteration-count: infinite;
 	-webkit-animation-direction: alternate;
-}
\ No newline at end of file
+}
+
+.splash:after {
+	content: "erpnext";
+	font-size: 30px;
+	font-weight: 700;
+	font-family: Helvetica, Arial, sans-serif;
+	position: relative;
+	top: -30px;
+}
diff --git a/public/images/splash.svg b/public/images/splash.svg
index 6a4c445..0a48c17 100644
--- a/public/images/splash.svg
+++ b/public/images/splash.svg
@@ -9,15 +9,15 @@
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
    id="svg2"
    version="1.1"
    inkscape:version="0.48.2 r9819"
    sodipodi:docname="erpnext-logo-2013 - flat-ui-colors.svg"
    inkscape:export-filename="/Users/anandpdoshi/Dropbox/erpnext/logo 2013/erpnext-logo-2013 other colors 3.png"
    inkscape:export-xdpi="167.56363"
-   inkscape:export-ydpi="167.56363">
+   inkscape:export-ydpi="167.56363"
+   viewBox="0 0 680 820"
+   preserveAspectRatio="xMidyMid meet">   
   <defs
      id="defs4" />
   <sodipodi:namedview
diff --git a/public/js/transaction.js b/public/js/transaction.js
index 9004a99..b7df5b6 100644
--- a/public/js/transaction.js
+++ b/public/js/transaction.js
@@ -507,4 +507,18 @@
 		item[base_field] = flt(item[print_field] * this.frm.doc.conversion_rate,
 			precision(base_field, item));
 	},
+	
+	get_terms: function() {
+		var me = this;
+		if(this.frm.doc.tc_name) {
+			this.frm.call({
+				method: "webnotes.client.get_value",
+				args: {
+					doctype: "Terms and Conditions",
+					fieldname: "terms",
+					filters: { name: this.frm.doc.tc_name },
+				},
+			});
+		}
+	},
 });
\ No newline at end of file
diff --git a/selling/doctype/installation_note/installation_note.py b/selling/doctype/installation_note/installation_note.py
index ea20d51..9b7344b 100644
--- a/selling/doctype/installation_note/installation_note.py
+++ b/selling/doctype/installation_note/installation_note.py
@@ -21,10 +21,7 @@
 from webnotes.model.bean import getlist
 from webnotes.model.code import get_obj
 from webnotes import msgprint
-from stock.utils import get_valid_serial_nos
-
-sql = webnotes.conn.sql
-	
+from stock.utils import get_valid_serial_nos	
 
 from utilities.transaction_base import TransactionBase
 
@@ -34,6 +31,19 @@
 		self.doclist = doclist
 		self.tname = 'Installation Note Item'
 		self.fname = 'installed_item_details'
+		self.status_updater = [{
+			'source_dt': 'Installation Note Item',
+			'target_dt': 'Delivery Note Item',
+			'target_field': 'installed_qty',
+			'target_ref_field': 'qty',
+			'join_field': 'prevdoc_detail_docname',
+			'target_parent_dt': 'Delivery Note',
+			'target_parent_field': 'per_installed',
+			'source_field': 'qty',
+			'percent_join_field': 'prevdoc_docname',
+			'status_field': 'installation_status',
+			'keyword': 'Installed'
+		}]
 
 	def validate(self):
 		self.validate_fiscal_year()
@@ -45,153 +55,114 @@
 		self.validate_mandatory()
 		self.validate_reference_value()
  
-	
-	#fetch delivery note details
-	#====================================
 	def pull_delivery_note_details(self):
 		self.validate_prev_docname()
-		self.doclist = get_obj('DocType Mapper', 'Delivery Note-Installation Note').dt_map('Delivery Note', 'Installation Note', self.doc.delivery_note_no, self.doc, self.doclist, "[['Delivery Note', 'Installation Note'],['Delivery Note Item', 'Installation Note Item']]")
+		self.doclist = get_obj('DocType Mapper', 'Delivery Note-Installation Note').dt_map(
+			'Delivery Note', 'Installation Note', self.doc.delivery_note_no, 
+			self.doc, self.doclist, "[['Delivery Note', 'Installation Note'], \
+			['Delivery Note Item', 'Installation Note Item']]")
 	
-	# Validates that Delivery Note is not pulled twice 
-	#============================================
 	def validate_prev_docname(self):
 		for d in getlist(self.doclist, 'installed_item_details'): 
 			if self.doc.delivery_note_no == d.prevdoc_docname:
-				msgprint(cstr(self.doc.delivery_note_no) + " delivery note details have already been pulled. ")
-				raise Exception, "Validation Error. "
-	
-	#Fiscal Year Validation
-	#================================
+				msgprint(cstr(self.doc.delivery_note_no) + 
+					" delivery note details have already been pulled", raise_exception=1)
+
 	def validate_fiscal_year(self):
-		get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.inst_date,'Installation Date')
-	
-	#	Validate Mandatory 
-	#===============================
+		get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year, self.doc.inst_date, 
+			'Installation Date')
+
 	def validate_mandatory(self):
-		# Amendment Date
 		if self.doc.amended_from and not self.doc.amendment_date:
 			msgprint("Please Enter Amendment Date")
 			raise Exception, "Validation Error. "
-	
-	# Validate values with reference document
-	#----------------------------------------
+
 	def validate_reference_value(self):
-		get_obj('DocType Mapper', 'Delivery Note-Installation Note', with_children = 1).validate_reference_value(self, self.doc.name)
+		mapper = get_obj('DocType Mapper', 'Delivery Note-Installation Note', with_children = 1)
+		mapper.validate_reference_value(self, self.doc.name)
 	
-	#check if serial no added
-	#-----------------------------
-	def is_serial_no_added(self,item_code,serial_no):
-		ar_required = sql("select has_serial_no from tabItem where name = '%s'" % item_code)
-		ar_required = ar_required and ar_required[0][0] or ''
+	def is_serial_no_added(self, item_code, serial_no):
+		ar_required = webnotes.conn.get_value("Item", item_code, "has_serial_no")
 		if ar_required == 'Yes' and not serial_no:
-			msgprint("Serial No is mandatory for item: "+ item_code)
-			raise Exception
+			msgprint("Serial No is mandatory for item: " + item_code, raise_exception=1)
 		elif ar_required != 'Yes' and cstr(serial_no).strip():
-			msgprint("If serial no required, please select 'Yes' in 'Has Serial No' in Item :"+item_code)
-			raise Exception
+			msgprint("If serial no required, please select 'Yes' in 'Has Serial No' in Item :" + 
+				item_code, raise_exception=1)
 	
-	#check if serial no exist in system
-	#-------------------------------------
 	def is_serial_no_exist(self, item_code, serial_no):
 		for x in serial_no:
-			chk = sql("select name from `tabSerial No` where name =%s", x)
-			if not chk:
-				msgprint("Serial No "+x+" does not exist in the system")
-				raise Exception
+			if not webnotes.conn.exists("Serial No", x):
+				msgprint("Serial No " + x + " does not exist in the system", raise_exception=1)
 	
-	#check if serial no already installed
-	#------------------------------------------
 	def is_serial_no_installed(self,cur_s_no,item_code):
 		for x in cur_s_no:
-			status = sql("select status from `tabSerial No` where name = %s", x)
+			status = webnotes.conn.sql("select status from `tabSerial No` where name = %s", x)
 			status = status and status[0][0] or ''
 			
 			if status == 'Installed':
-				msgprint("Item "+item_code+" with serial no. "+x+" already installed")
-				raise Exception, "Validation Error."
+				msgprint("Item "+item_code+" with serial no. " + x + " already installed", 
+					raise_exception=1)
 	
-	#get list of serial no from previous_doc
-	#----------------------------------------------
-	def get_prevdoc_serial_no(self, prevdoc_detail_docname, prevdoc_docname):
-		res = sql("select serial_no from `tabDelivery Note Item` where name = '%s' and parent ='%s'" % (prevdoc_detail_docname, prevdoc_docname))
-		return get_valid_serial_nos(res[0][0])
+	def get_prevdoc_serial_no(self, prevdoc_detail_docname):
+		serial_nos = webnotes.conn.get_value("Delivery Note Item", 
+			prevdoc_detail_docname, "serial_no")
+		return get_valid_serial_nos(serial_nos)
 		
-	#check if all serial nos from current record exist in resp delivery note
-	#---------------------------------------------------------------------------------
 	def is_serial_no_match(self, cur_s_no, prevdoc_s_no, prevdoc_docname):
-		for x in cur_s_no:
-			if not(x in prevdoc_s_no):
-				msgprint("Serial No. "+x+" not present in the Delivery Note "+prevdoc_docname, raise_exception = 1)
-				raise Exception, "Validation Error."
-	
-	#validate serial number
-	#----------------------------------------
+		for sr in cur_s_no:
+			if sr not in prevdoc_s_no:
+				msgprint("Serial No. " + sr + " is not matching with the Delivery Note " + 
+					prevdoc_docname, raise_exception = 1)
+
 	def validate_serial_no(self):
 		cur_s_no, prevdoc_s_no, sr_list = [], [], []
 		for d in getlist(self.doclist, 'installed_item_details'):
 			self.is_serial_no_added(d.item_code, d.serial_no)
-			
 			if d.serial_no:
-
 				sr_list = get_valid_serial_nos(d.serial_no, d.qty, d.item_code)
 				self.is_serial_no_exist(d.item_code, sr_list)
 				
-				prevdoc_s_no = self.get_prevdoc_serial_no(d.prevdoc_detail_docname, d.prevdoc_docname)
+				prevdoc_s_no = self.get_prevdoc_serial_no(d.prevdoc_detail_docname)
 				if prevdoc_s_no:
 					self.is_serial_no_match(sr_list, prevdoc_s_no, d.prevdoc_docname)
 				
 				self.is_serial_no_installed(sr_list, d.item_code)
 		return sr_list
-	
-	#validate installation date
-	#-------------------------------
+
 	def validate_installation_date(self):
 		for d in getlist(self.doclist, 'installed_item_details'):
 			if d.prevdoc_docname:
-				d_date = sql("select posting_date from `tabDelivery Note` where name=%s", d.prevdoc_docname)
-				d_date = d_date and d_date[0][0] or ''
-				
+				d_date = webnotes.conn.get_value("Delivery Note", d.prevdoc_docname, "posting_date")				
 				if d_date > getdate(self.doc.inst_date):
-					msgprint("Installation Date can not be before Delivery Date "+cstr(d_date)+" for item "+d.item_code)
-					raise Exception
+					msgprint("Installation Date can not be before Delivery Date " + cstr(d_date) + 
+						" for item "+d.item_code, raise_exception=1)
 	
 	def check_item_table(self):
 		if not(getlist(self.doclist, 'installed_item_details')):
-			msgprint("Please fetch items from Delivery Note selected")
-			raise Exception
+			msgprint("Please fetch items from Delivery Note selected", raise_exception=1)
 	
 	def on_update(self):
+		get_obj("Stock Ledger").scrub_serial_nos(self, 'installed_item_details')
 		webnotes.conn.set(self.doc, 'status', 'Draft')
 	
 	def on_submit(self):
 		valid_lst = []
 		valid_lst = self.validate_serial_no()
 		
-		get_obj("Sales Common").update_prevdoc_detail(1,self)
-		
 		for x in valid_lst:
-			wp = sql("select warranty_period from `tabSerial No` where name = '%s'"% x)
-			wp = wp and wp[0][0] or 0
-			if wp:
-				sql("update `tabSerial No` set maintenance_status = 'Under Warranty' where name = '%s'" % x)
-			
-			sql("update `tabSerial No` set status = 'Installed' where name = '%s'" % x)
-		
-		webnotes.conn.set(self.doc, 'status', 'Submitted')
+			if webnotes.conn.get_value("Serial No", x, "warranty_period"):
+				webnotes.conn.set_value("Serial No", x, "maintenance_status", "Under Warranty")
+			webnotes.conn.set_value("Serial No", x, "status", "Installed")
 
+		self.update_prevdoc_status()
+		webnotes.conn.set(self.doc, 'status', 'Submitted')
 	
 	def on_cancel(self):
-		cur_s_no = []
-		sales_com_obj = get_obj(dt = 'Sales Common')
-		sales_com_obj.update_prevdoc_detail(0,self)
-		
 		for d in getlist(self.doclist, 'installed_item_details'):
 			if d.serial_no:
-				#get current list of serial no
-				cur_serial_no = d.serial_no.replace(' ', '')
-				cur_s_no = cur_serial_no.split(',')
-		
-		for x in cur_s_no:
-			sql("update `tabSerial No` set status = 'Delivered' where name = '%s'" % x)
-			
+				d.serial_no = d.serial_no.replace(",", "\n")
+				for sr_no in d.serial_no.split("\n"):
+					webnotes.conn.set_value("Serial No", sr_no, "status", "Delivered")
+
+		self.update_prevdoc_status()
 		webnotes.conn.set(self.doc, 'status', 'Cancelled')
diff --git a/selling/doctype/quotation/quotation.py b/selling/doctype/quotation/quotation.py
index f4c30fc..1151e63 100644
--- a/selling/doctype/quotation/quotation.py
+++ b/selling/doctype/quotation/quotation.py
@@ -95,12 +95,6 @@
 	def get_rate(self,arg):
 		return get_obj('Sales Common').get_rate(arg)
 
-# GET TERMS AND CONDITIONS
-# ====================================================================================
-	def get_tc_details(self):
-		return get_obj('Sales Common').get_tc_details(self)
-
-		
 # VALIDATE
 # ==============================================================================================
 	
diff --git a/selling/doctype/quotation/quotation.txt b/selling/doctype/quotation/quotation.txt
index 322be88..885fc82 100644
--- a/selling/doctype/quotation/quotation.txt
+++ b/selling/doctype/quotation/quotation.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 19:29:08", 
   "docstatus": 0, 
-  "modified": "2013-05-28 14:50:59", 
+  "modified": "2013-06-05 14:43:03", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -591,17 +591,6 @@
   "fieldtype": "Button", 
   "label": "Get Terms and Conditions", 
   "oldfieldtype": "Button", 
-  "options": "get_tc_details", 
-  "read_only": 0
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "terms_html", 
-  "fieldtype": "HTML", 
-  "label": "Terms and Conditions HTML", 
-  "oldfieldtype": "HTML", 
-  "options": "You can add Terms and Notes that will be printed in the Transaction", 
-  "print_hide": 1, 
   "read_only": 0
  }, 
  {
diff --git a/selling/doctype/sales_common/sales_common.py b/selling/doctype/sales_common/sales_common.py
index 5b391bb..5068ad3 100644
--- a/selling/doctype/sales_common/sales_common.py
+++ b/selling/doctype/sales_common/sales_common.py
@@ -81,12 +81,6 @@
 			acc_head = webnotes.conn.sql("select name from `tabAccount` where name = '%s' and docstatus != 2" % (cstr(obj.doc.customer) + " - " + webnotes.conn.get_value('Company', obj.doc.company, 'abbr')))
 			obj.doc.debit_to = acc_head and acc_head[0][0] or ''
 			
-	# Get TERMS AND CONDITIONS
-	# =======================================================================================
-	def get_tc_details(self,obj):
-		r = webnotes.conn.sql("select terms from `tabTerms and Conditions` where name = %s", obj.doc.tc_name)
-		if r: obj.doc.terms = r[0][0]
-
 #---------------------------------------- Get Tax Details -------------------------------#
 	def get_tax_details(self, item_code, obj):
 		import json
diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py
index 79b37be..70d209b 100644
--- a/selling/doctype/sales_order/sales_order.py
+++ b/selling/doctype/sales_order/sales_order.py
@@ -67,9 +67,6 @@
 	def get_rate(self,arg):
 		return get_obj('Sales Common').get_rate(arg)
 
-	def get_tc_details(self):
-		return get_obj('Sales Common').get_tc_details(self)
-
 	def check_maintenance_schedule(self):
 		nm = sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", self.doc.name)
 		nm = nm and nm[0][0] or ''
diff --git a/selling/doctype/sales_order/sales_order.txt b/selling/doctype/sales_order/sales_order.txt
index fb5848f..77fcf11 100644
--- a/selling/doctype/sales_order/sales_order.txt
+++ b/selling/doctype/sales_order/sales_order.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 19:29:08", 
   "docstatus": 0, 
-  "modified": "2013-05-28 15:05:38", 
+  "modified": "2013-06-05 14:47:04", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -32,6 +32,7 @@
   "parent": "Sales Order", 
   "parentfield": "permissions", 
   "parenttype": "DocType", 
+  "permlevel": 0, 
   "read": 1
  }, 
  {
@@ -579,16 +580,6 @@
   "fieldtype": "Button", 
   "label": "Get Terms and Conditions", 
   "oldfieldtype": "Button", 
-  "options": "get_tc_details", 
-  "print_hide": 1
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "terms_html", 
-  "fieldtype": "HTML", 
-  "label": "Terms and Conditions HTML", 
-  "oldfieldtype": "HTML", 
-  "options": "You can add Terms and Notes that will be printed in the Transaction", 
   "print_hide": 1
  }, 
  {
@@ -975,22 +966,10 @@
   "print_hide": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Sales Manager", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
   "report": 1, 
   "role": "Sales Manager", 
   "submit": 1, 
@@ -1001,72 +980,38 @@
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
   "report": 1, 
   "role": "Sales User", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Sales User", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
   "report": 1, 
   "role": "Maintenance Manager", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "role": "Maintenance Manager", 
-  "submit": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
   "report": 1, 
   "role": "Maintenance User", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
   "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "role": "Maintenance User", 
-  "submit": 0
- }, 
- {
-  "doctype": "DocPerm", 
-  "permlevel": 0, 
   "role": "Accounts User"
  }, 
  {
   "doctype": "DocPerm", 
   "match": "customer", 
-  "permlevel": 0, 
   "role": "Customer"
  }
 ]
\ No newline at end of file
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 950d687..fa83571 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -17,7 +17,7 @@
 from __future__ import unicode_literals
 import webnotes
 
-from webnotes.utils import cstr, flt, getdate, cint
+from webnotes.utils import cstr, flt, cint
 from webnotes.model.bean import getlist
 from webnotes.model.code import get_obj
 from webnotes import msgprint, _
@@ -34,6 +34,19 @@
 		self.doclist = doclist
 		self.tname = 'Delivery Note Item'
 		self.fname = 'delivery_note_details'
+		self.status_updater = [{
+			'source_dt': 'Delivery Note Item',
+			'target_dt': 'Sales Order Item',
+			'join_field': 'prevdoc_detail_docname',
+			'target_field': 'delivered_qty',
+			'target_parent_dt': 'Sales Order',
+			'target_parent_field': 'per_delivered',
+			'target_ref_field': 'qty',
+			'source_field': 'qty',
+			'percent_join_field': 'prevdoc_docname',
+			'status_field': 'delivery_status',
+			'keyword': 'Delivered'
+		}]
 		
 	def set_customer_defaults(self):
 		self.get_default_customer_shipping_address()
@@ -78,9 +91,6 @@
 				d.actual_qty = actual_qty and flt(actual_qty[0][0]) or 0
 
 
-	def get_tc_details(self):
-		return get_obj('Sales Common').get_tc_details(self)
-
 	def get_barcode_details(self, barcode):
 		return get_obj('Sales Common').get_barcode_details(barcode)
 
@@ -228,8 +238,8 @@
 		sl_obj.update_serial_record(self, 'delivery_note_details', is_submit = 1, is_incoming = 0)
 		sl_obj.update_serial_record(self, 'packing_details', is_submit = 1, is_incoming = 0)
 		
-		# update delivered qty in sales order
-		get_obj("Sales Common").update_prevdoc_detail(1,self)
+		# update delivered qty in sales order	
+		self.update_prevdoc_status()
 		
 		# create stock ledger entry
 		self.update_stock_ledger(update_stock = 1)
@@ -276,7 +286,8 @@
 		sl.update_serial_record(self, 'delivery_note_details', is_submit = 0, is_incoming = 0)
 		sl.update_serial_record(self, 'packing_details', is_submit = 0, is_incoming = 0)
 		
-		sales_com_obj.update_prevdoc_detail(0,self)
+		self.update_prevdoc_status()
+		
 		self.update_stock_ledger(update_stock = -1)
 		webnotes.conn.set(self.doc, 'status', 'Cancelled')
 		self.cancel_packing_slips()
diff --git a/stock/doctype/delivery_note/delivery_note.txt b/stock/doctype/delivery_note/delivery_note.txt
index 4504db0..f0731ce 100644
--- a/stock/doctype/delivery_note/delivery_note.txt
+++ b/stock/doctype/delivery_note/delivery_note.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 19:29:09", 
   "docstatus": 0, 
-  "modified": "2013-05-28 12:26:04", 
+  "modified": "2013-06-05 14:47:47", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -11,6 +11,7 @@
   "autoname": "naming_series:", 
   "doctype": "DocType", 
   "document_type": "Transaction", 
+  "hide_toolbar": 0, 
   "in_create": 0, 
   "is_submittable": 1, 
   "module": "Stock", 
@@ -32,7 +33,9 @@
   "parent": "Delivery Note", 
   "parentfield": "permissions", 
   "parenttype": "DocType", 
-  "read": 1
+  "permlevel": 0, 
+  "read": 1, 
+  "report": 1
  }, 
  {
   "doctype": "DocType", 
@@ -602,17 +605,6 @@
   "fieldtype": "Button", 
   "label": "Get Terms and Conditions", 
   "oldfieldtype": "Button", 
-  "options": "get_tc_details", 
-  "print_hide": 1, 
-  "read_only": 0
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "terms_html", 
-  "fieldtype": "HTML", 
-  "label": "Terms and Conditions HTML", 
-  "oldfieldtype": "HTML", 
-  "options": "You can add Terms and Notes that will be printed in the Transaction", 
   "print_hide": 1, 
   "read_only": 0
  }, 
@@ -1149,91 +1141,39 @@
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Material User", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Material User", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Material Manager", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Material Manager", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Sales User", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
   "cancel": 0, 
   "create": 0, 
   "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Sales User", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Accounts User", 
   "submit": 0, 
   "write": 0
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "role": "Accounts User", 
-  "submit": 0
- }, 
- {
   "doctype": "DocPerm", 
   "match": "customer_name", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Customer"
  }
 ]
\ No newline at end of file
diff --git a/stock/doctype/material_request/material_request.py b/stock/doctype/material_request/material_request.py
index 9f19a5b..dfed6c4 100644
--- a/stock/doctype/material_request/material_request.py
+++ b/stock/doctype/material_request/material_request.py
@@ -64,11 +64,6 @@
 	def validate_fiscal_year(self):
 		get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Material Request Date')
 
-	# GET TERMS & CONDITIONS
-	#-----------------------------
-	def get_tc_details(self):
-		return get_obj('Purchase Common').get_tc_details(self)
-		
 	# Validate Schedule Date
 	#--------------------------------
 	def validate_schedule_date(self):
diff --git a/stock/doctype/material_request/material_request.txt b/stock/doctype/material_request/material_request.txt
index 545d40f..f8c5226 100644
--- a/stock/doctype/material_request/material_request.txt
+++ b/stock/doctype/material_request/material_request.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-03-07 14:48:38", 
   "docstatus": 0, 
-  "modified": "2013-04-24 10:47:50", 
+  "modified": "2013-06-05 14:46:10", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -26,12 +26,19 @@
   "permlevel": 0
  }, 
  {
+  "amend": 1, 
+  "cancel": 1, 
+  "create": 1, 
   "doctype": "DocPerm", 
   "name": "__common__", 
   "parent": "Material Request", 
   "parentfield": "permissions", 
   "parenttype": "DocType", 
-  "read": 1
+  "permlevel": 0, 
+  "read": 1, 
+  "report": 1, 
+  "submit": 1, 
+  "write": 1
  }, 
  {
   "doctype": "DocType", 
@@ -311,8 +318,7 @@
   "fieldname": "get_terms", 
   "fieldtype": "Button", 
   "label": "Get Terms and Conditions", 
-  "oldfieldtype": "Button", 
-  "options": "get_tc_details"
+  "oldfieldtype": "Button"
  }, 
  {
   "doctype": "DocField", 
@@ -332,89 +338,19 @@
   "print_hide": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
   "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Purchase Manager", 
-  "submit": 0, 
-  "write": 0
+  "role": "Purchase Manager"
  }, 
  {
-  "amend": 1, 
-  "cancel": 1, 
-  "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
-  "role": "Purchase Manager", 
-  "submit": 1, 
-  "write": 1
+  "role": "Material Manager"
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
   "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Material Manager", 
-  "submit": 0, 
-  "write": 0
+  "role": "Material User"
  }, 
  {
-  "amend": 1, 
-  "cancel": 1, 
-  "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
-  "role": "Material Manager", 
-  "submit": 1, 
-  "write": 1
- }, 
- {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Material User", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
-  "amend": 1, 
-  "cancel": 1, 
-  "create": 1, 
-  "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
-  "role": "Material User", 
-  "submit": 1, 
-  "write": 1
- }, 
- {
-  "amend": 1, 
-  "cancel": 1, 
-  "create": 1, 
-  "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
-  "role": "Purchase User", 
-  "submit": 1, 
-  "write": 1
- }, 
- {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "role": "Purchase User", 
-  "submit": 0
+  "role": "Purchase User"
  }
 ]
\ No newline at end of file
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 8e81fa5..f47bdee 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -33,16 +33,21 @@
 		self.tname = 'Purchase Receipt Item'
 		self.fname = 'purchase_receipt_details'
 		self.count = 0
+		self.status_updater = [{
+			'source_dt': 'Purchase Receipt Item',
+			'target_dt': 'Purchase Order Item',
+			'join_field': 'prevdoc_detail_docname',
+			'target_field': 'received_qty',
+			'target_parent_dt': 'Purchase Order',
+			'target_parent_field': 'per_received',
+			'target_ref_field': 'qty',
+			'source_field': 'qty',
+			'percent_join_field': 'prevdoc_docname',
+		}]
 
 	def validate_fiscal_year(self):
 		get_obj(dt = 'Purchase Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.posting_date,'Transaction Date')
 
-	# GET TERMS & CONDITIONS
-	# =====================================================================================
-	def get_tc_details(self):
-		return get_obj('Purchase Common').get_tc_details(self)
-
-
 	# get available qty at warehouse
 	def get_bin_details(self, arg = ''):
 		return get_obj(dt='Purchase Common').get_bin_details(arg)
@@ -243,8 +248,7 @@
 		# Set status as Submitted
 		webnotes.conn.set(self.doc,'status', 'Submitted')
 
-		# Update Previous Doc i.e. update pending_qty and Status accordingly
-		purchase_controller.update_prevdoc_detail(self, is_submit = 1)
+		self.update_prevdoc_status()
 
 		# Update Serial Record
 		get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 1, is_incoming = 1)
@@ -285,8 +289,7 @@
 		# 4.Update Bin
 		self.update_stock(is_submit = 0)
 
-		# 5.Update Material Requests Pending Qty and accordingly it's Status
-		pc_obj.update_prevdoc_detail(self, is_submit = 0)
+		self.update_prevdoc_status()
 
 		# 6. Update last purchase rate
 		pc_obj.update_last_purchase_rate(self, 0)
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.txt b/stock/doctype/purchase_receipt/purchase_receipt.txt
index 4e055dc..96b4141 100755
--- a/stock/doctype/purchase_receipt/purchase_receipt.txt
+++ b/stock/doctype/purchase_receipt/purchase_receipt.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-21 16:16:39", 
   "docstatus": 0, 
-  "modified": "2013-05-28 12:21:17", 
+  "modified": "2013-06-05 14:45:10", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -31,7 +31,9 @@
   "parent": "Purchase Receipt", 
   "parentfield": "permissions", 
   "parenttype": "DocType", 
-  "read": 1
+  "permlevel": 0, 
+  "read": 1, 
+  "report": 1
  }, 
  {
   "doctype": "DocType", 
@@ -553,17 +555,7 @@
   "fieldname": "get_terms", 
   "fieldtype": "Button", 
   "label": "Get Terms and Conditions", 
-  "oldfieldtype": "Button", 
-  "options": "get_tc_details"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "terms_html", 
-  "fieldtype": "HTML", 
-  "label": "Terms and Conditions HTML", 
-  "oldfieldtype": "HTML", 
-  "options": "You can add Terms and Notes that will be printed in the Transaction", 
-  "print_hide": 1
+  "oldfieldtype": "Button"
  }, 
  {
   "doctype": "DocField", 
@@ -890,45 +882,19 @@
   "read_only": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Material Manager", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Material Manager", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "report": 0, 
-  "role": "Material User", 
-  "submit": 0, 
-  "write": 0
- }, 
- {
   "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Material User", 
   "submit": 1, 
   "write": 1
@@ -938,26 +904,13 @@
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Purchase User", 
   "submit": 1, 
   "write": 1
  }, 
  {
-  "amend": 0, 
-  "cancel": 0, 
-  "create": 0, 
-  "doctype": "DocPerm", 
-  "permlevel": 1, 
-  "role": "Purchase User", 
-  "submit": 0
- }, 
- {
   "doctype": "DocPerm", 
   "match": "supplier", 
-  "permlevel": 0, 
-  "report": 1, 
   "role": "Supplier"
  }
 ]
\ No newline at end of file
diff --git a/stock/doctype/purchase_receipt/purchase_receipt_list.js b/stock/doctype/purchase_receipt/purchase_receipt_list.js
index d20c352..c80f6ae 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt_list.js
+++ b/stock/doctype/purchase_receipt/purchase_receipt_list.js
@@ -6,7 +6,7 @@
 	group_by: "`tabPurchase Receipt`.name",
 	prepare_data: function(data) {
 		if(data.purchase_order_no) {
-			data.purchase_order_no = data.purchase_order_no.split(",");
+			data.purchase_order_no = $.unique(data.purchase_order_no.split(","));
 			var po_list = [];
 			$.each(data.purchase_order_no, function(i, v){
 				if(po_list.indexOf(v)==-1) po_list.push(
diff --git a/stock/doctype/purchase_receipt_item/purchase_receipt_item.txt b/stock/doctype/purchase_receipt_item/purchase_receipt_item.txt
index 9f7d72c..6a35c47 100755
--- a/stock/doctype/purchase_receipt_item/purchase_receipt_item.txt
+++ b/stock/doctype/purchase_receipt_item/purchase_receipt_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-24 19:29:10", 
   "docstatus": 0, 
-  "modified": "2013-05-28 12:13:59", 
+  "modified": "2013-05-31 14:26:41", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -453,18 +453,14 @@
   "width": "150px"
  }, 
  {
-  "default": "0.00", 
   "doctype": "DocField", 
-  "fieldname": "billed_qty", 
-  "fieldtype": "Float", 
-  "label": "Billed Quantity", 
+  "fieldname": "billed_amt", 
+  "fieldtype": "Currency", 
+  "label": "Billed Amt", 
   "no_copy": 1, 
-  "oldfieldname": "billed_qty", 
-  "oldfieldtype": "Currency", 
+  "options": "currency", 
   "print_hide": 1, 
-  "print_width": "100px", 
-  "read_only": 1, 
-  "width": "100px"
+  "read_only": 1
  }, 
  {
   "doctype": "DocField", 
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index 57fc351..d2f25f0 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -505,17 +505,13 @@
 		
 		if self.doc.use_multi_level_bom:
 			# get all raw materials with sub assembly childs					
-			fl_bom_sa_child_item = sql("""select 
-					item_code,ifnull(sum(qty_consumed_per_unit),0)*%s as qty,
-					description,stock_uom 
-				from (	select distinct fb.name, fb.description, fb.item_code,
-							fb.qty_consumed_per_unit, fb.stock_uom 
-						from `tabBOM Explosion Item` fb,`tabItem` it 
-						where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
-						and ifnull(it.is_sub_contracted_item, 'No') = 'No' and fb.docstatus<2 
-						and fb.parent=%s
-					) a
-				group by item_code, stock_uom""" , (qty, self.doc.bom_no), as_dict=1)
+			fl_bom_sa_child_item = sql("""select fb.item_code, 
+				ifnull(sum(fb.qty_consumed_per_unit),0)*%s as qty, fb.description, fb.stock_uom 
+				from `tabBOM Explosion Item` fb,`tabItem` it 
+				where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
+				and ifnull(it.is_sub_contracted_item, 'No') = 'No' and fb.docstatus < 2 
+				and fb.parent=%s group by item_code, stock_uom""", 
+				(qty, self.doc.bom_no), as_dict=1)
 			
 			if fl_bom_sa_child_item:
 				_make_items_dict(fl_bom_sa_child_item)
@@ -523,10 +519,10 @@
 			# Get all raw materials considering multi level BOM, 
 			# if multi level bom consider childs of Sub-Assembly items
 			fl_bom_sa_items = sql("""select item_code,
-				ifnull(sum(qty_consumed_per_unit), 0) * '%s' as qty,
+				ifnull(sum(qty_consumed_per_unit), 0) *%s as qty,
 				description, stock_uom from `tabBOM Item` 
-				where parent = '%s' and docstatus < 2 
-				group by item_code""" % (qty, self.doc.bom_no), as_dict=1)
+				where parent = %s and docstatus < 2 
+				group by item_code""", (qty, self.doc.bom_no), as_dict=1)
 			
 			if fl_bom_sa_items:
 				_make_items_dict(fl_bom_sa_items)
diff --git a/stock/report/batch_wise_balance_history/__init__.py b/stock/report/batch_wise_balance_history/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/stock/report/batch_wise_balance_history/__init__.py
diff --git a/stock/report/batch_wise_balance_history/batch_wise_balance_history.js b/stock/report/batch_wise_balance_history/batch_wise_balance_history.js
new file mode 100644
index 0000000..0ba1938
--- /dev/null
+++ b/stock/report/batch_wise_balance_history/batch_wise_balance_history.js
@@ -0,0 +1,39 @@
+wn.query_reports["Batch-Wise Balance History"] = {
+	"filters": [
+		{
+			"fieldname":"item_code",
+			"label": "Item",
+			"fieldtype": "Link",
+			"options": "Item",
+			"width": "80"
+		},
+		{
+			"fieldname":"warehouse",
+			"label": "Warehouse",
+			"fieldtype": "Link",
+			"options": "Warehouse",
+			"width": "80"
+		},
+		{
+			"fieldname":"batch_no",
+			"label": "Batch",
+			"fieldtype": "Link",
+			"options": "Batch",
+			"width": "80"
+		},
+		{
+			"fieldname":"from_date",
+			"label": "From Date",
+			"fieldtype": "Date",
+			"width": "80",
+			"default": sys_defaults.year_start_date,
+		},
+		{
+			"fieldname":"to_date",
+			"label": "To Date",
+			"fieldtype": "Date",
+			"width": "80",
+			"default": wn.datetime.get_today()
+		}
+	]
+}
\ No newline at end of file
diff --git a/stock/report/batch_wise_balance_history/batch_wise_balance_history.py b/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
new file mode 100644
index 0000000..ca3e775
--- /dev/null
+++ b/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
@@ -0,0 +1,109 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes.utils import flt
+
+def execute(filters=None):
+	if not filters: filters = {}
+	
+	columns = get_columns(filters)
+	item_map = get_item_details(filters)
+	iwb_map = get_item_warehouse_batch_map(filters)
+	
+	data = []
+	for item in sorted(iwb_map):
+		for wh in sorted(iwb_map[item]):
+			for batch in sorted(iwb_map[item][wh]):
+				qty_dict = iwb_map[item][wh][batch]
+				data.append([item, item_map[item]["item_name"], 
+					item_map[item]["description"], wh, batch, 
+					qty_dict.opening_qty, qty_dict.in_qty, 
+					qty_dict.out_qty, qty_dict.bal_qty
+				])
+	
+	return columns, data
+
+def get_columns(filters):
+	"""return columns based on filters"""
+	
+	columns = ["Item:Link/Item:100"] + ["Item Name::150"] + ["Description::150"] + \
+	["Warehouse:Link/Warehouse:100"] + ["Batch:Link/Batch:100"] + ["Opening Qty::90"] + \
+	["In Qty::80"] + ["Out Qty::80"] + ["Balance Qty::90"]
+
+	return columns
+
+def get_conditions(filters):
+	conditions = ""
+	if filters.get("item_code"):
+		conditions += " and item_code='%s'" % filters["item_code"]
+
+	if filters.get("warehouse"):
+		conditions += " and warehouse='%s'" % filters["warehouse"]
+
+	if filters.get("batch_no"):
+		conditions += " and batch_no='%s'" % filters["batch_no"]
+
+	if not filters.get("from_date"):
+		webnotes.msgprint("Please enter From Date", raise_exception=1)
+
+	if filters.get("to_date"):
+		conditions += " and posting_date <= '%s'" % filters["to_date"]
+	else:
+		webnotes.msgprint("Please enter To Date", raise_exception=1)
+		
+	return conditions
+
+#get all details
+def get_stock_ledger_entries(filters):
+	conditions = get_conditions(filters)
+	return webnotes.conn.sql("""select item_code, batch_no, warehouse, 
+		posting_date, actual_qty 
+		from `tabStock Ledger Entry` 
+		where ifnull(is_cancelled, 'No') = 'No' %s order by item_code, warehouse""" %
+		conditions, as_dict=1)
+
+def get_item_warehouse_batch_map(filters):
+	sle = get_stock_ledger_entries(filters)
+	iwb_map = {}
+
+	for d in sle:
+		iwb_map.setdefault(d.item_code, {}).setdefault(d.warehouse, {})\
+			.setdefault(d.batch_no, webnotes._dict({
+				"opening_qty": 0.0, "in_qty": 0.0, "out_qty": 0.0, "bal_qty": 0.0
+			}))
+		qty_dict = iwb_map[d.item_code][d.warehouse][d.batch_no]
+		if d.posting_date < filters["from_date"]:
+			qty_dict.opening_qty += flt(d.actual_qty)
+		elif d.posting_date >= filters["from_date"] and d.posting_date <= filters["to_date"]:
+			if flt(d.actual_qty) > 0:
+				qty_dict.in_qty += flt(d.actual_qty)
+			else:
+				qty_dict.out_qty += abs(flt(d.actual_qty))
+
+		qty_dict.bal_qty += flt(d.actual_qty)
+
+	return iwb_map
+
+def get_item_details(filters):
+	if filters.get("item_code"):
+		conditions = " and name = '%s'" % filters["item_code"]
+	item_map = {}
+	for d in webnotes.conn.sql("select name, item_name, description from tabItem", as_dict=1):
+		item_map.setdefault(d.name, d)
+
+	return item_map
\ No newline at end of file
diff --git a/stock/report/batch_wise_balance_history/batch_wise_balance_history.txt b/stock/report/batch_wise_balance_history/batch_wise_balance_history.txt
new file mode 100644
index 0000000..9e795b9
--- /dev/null
+++ b/stock/report/batch_wise_balance_history/batch_wise_balance_history.txt
@@ -0,0 +1,21 @@
+[
+ {
+  "creation": "2013-06-04 11:03:47", 
+  "docstatus": 0, 
+  "modified": "2013-06-04 19:32:27", 
+  "modified_by": "Administrator", 
+  "owner": "Administrator"
+ }, 
+ {
+  "doctype": "Report", 
+  "is_standard": "Yes", 
+  "name": "__common__", 
+  "ref_doctype": "Stock Ledger Entry", 
+  "report_name": "Batch-Wise Balance History", 
+  "report_type": "Script Report"
+ }, 
+ {
+  "doctype": "Report", 
+  "name": "Batch-Wise Balance History"
+ }
+]
\ No newline at end of file
diff --git a/utilities/transaction_base.py b/utilities/transaction_base.py
index 3571215..29e74a9 100644
--- a/utilities/transaction_base.py
+++ b/utilities/transaction_base.py
@@ -20,9 +20,9 @@
 from webnotes.utils import load_json, cstr, flt, now_datetime
 from webnotes.model.doc import addchild
 
-from webnotes.model.controller import DocListController
+from controllers.status_updater import StatusUpdater
 
-class TransactionBase(DocListController):
+class TransactionBase(StatusUpdater):
 	def get_default_address_and_contact(self, party_type):
 		"""get a dict of default field values of address and contact for a given party type
 			party_type can be one of: customer, supplier"""
diff --git a/website/doctype/website_script/website_script.py b/website/doctype/website_script/website_script.py
index 928aa9f..60403d4 100644
--- a/website/doctype/website_script/website_script.py
+++ b/website/doctype/website_script/website_script.py
@@ -5,4 +5,9 @@
 
 class DocType:
 	def __init__(self, d, dl):
-		self.doc, self.doclist = d, dl
\ No newline at end of file
+		self.doc, self.doclist = d, dl
+		
+	def on_update(self):
+		# make js and css
+		from website.helpers.make_web_include_files import make
+		make()
\ No newline at end of file