diff --git a/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/accounts/doctype/purchase_invoice/test_purchase_invoice.py
new file mode 100644
index 0000000..5781e3b
--- /dev/null
+++ b/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -0,0 +1,275 @@
+# 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 unittest
+import webnotes
+import webnotes.model
+from webnotes.utils import nowdate
+from accounts.utils import get_fiscal_year
+
+from stock.doctype.purchase_receipt import test_purchase_receipt
+
+company = webnotes.conn.get_default("company")
+abbr = webnotes.conn.get_value("Company", company, "abbr")
+
+def load_data():
+	test_purchase_receipt.load_data()
+	
+	webnotes.insert({"doctype": "Account", "account_name": "Excise Duty",
+		"parent_account": "Tax Assets - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+	
+	webnotes.insert({"doctype": "Account", "account_name": "Education Cess",
+		"parent_account": "Tax Assets - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+	
+	webnotes.insert({"doctype": "Account", "account_name": "S&H Education Cess",
+		"parent_account": "Tax Assets - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+		
+	webnotes.insert({"doctype": "Account", "account_name": "CST",
+		"parent_account": "Direct Expenses - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+		
+	webnotes.insert({"doctype": "Account", "account_name": "Discount",
+		"parent_account": "Direct Expenses - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+		
+	from webnotes.model.doc import Document
+	item = Document("Item", "Home Desktop 100")
+	
+	# excise duty
+	item_tax = item.addchild("item_tax", "Item Tax")
+	item_tax.tax_type = "Excise Duty - %s" % abbr
+	item_tax.tax_rate = 10
+	item_tax.save()
+
+import json	
+purchase_invoice_doclist = [
+	# parent
+	{
+		"doctype": "Purchase Invoice", 
+		"credit_to": "East Wind Inc. - %s" % abbr,
+		"supplier_name": "East Wind Inc.",
+		"naming_series": "BILL", "posting_date": nowdate(),
+		"company": company, "fiscal_year": webnotes.conn.get_default("fiscal_year"), 
+		"currency": webnotes.conn.get_default("currency"), "conversion_rate": 1,
+		'grand_total_import': 0
+	},
+	# items
+	{
+		"doctype": "Purchase Invoice Item", 
+		"item_code": "Home Desktop 100", "qty": 10, "import_rate": 50,
+		"parentfield": "entries", 
+		"uom": "Nos", "item_tax_rate": json.dumps({"Excise Duty - %s" % abbr: 10})
+	},
+	{
+		"doctype": "Purchase Invoice Item", 
+		"item_code": "Home Desktop 200", "qty": 5, "import_rate": 150,
+		"parentfield": "entries", 
+		"uom": "Nos"
+	},
+	# taxes
+	{
+		"doctype": "Purchase Taxes and Charges", "charge_type": "Actual",
+		"account_head": "Shipping Charges - %s" % abbr, "rate": 100, 
+		"category": "Valuation and Total", "parentfield": "purchase_tax_details",
+		"cost_center": "Default Cost Center - %s" % abbr
+	},
+	{
+		"doctype": "Purchase Taxes and Charges", "charge_type": "On Net Total",
+		"account_head": "Customs Duty - %s" % abbr, "rate": 10,
+		"category": "Valuation", "parentfield": "purchase_tax_details",
+		"cost_center": "Default Cost Center - %s" % abbr
+	},
+	{
+		"doctype": "Purchase Taxes and Charges", "charge_type": "On Net Total",
+		"account_head": "Excise Duty - %s" % abbr, "rate": 12,
+		"category": "Total", "parentfield": "purchase_tax_details"
+	},
+	{
+		"doctype": "Purchase Taxes and Charges", "charge_type": "On Previous Row Amount",
+		"account_head": "Education Cess - %s" % abbr, "rate": 2, "row_id": 3,
+		"category": "Total", "parentfield": "purchase_tax_details"
+	},
+	{
+		"doctype": "Purchase Taxes and Charges", "charge_type": "On Previous Row Amount",
+		"account_head": "S&H Education Cess - %s" % abbr, "rate": 1, "row_id": 3,
+		"category": "Total", "parentfield": "purchase_tax_details"
+	},
+	{
+		"doctype": "Purchase Taxes and Charges", "charge_type": "On Previous Row Total",
+		"account_head": "CST - %s" % abbr, "rate": 2, "row_id": 5,
+		"category": "Total", "parentfield": "purchase_tax_details",
+		"cost_center": "Default Cost Center - %s" % abbr
+	},
+	{
+		"doctype": "Purchase Taxes and Charges", "charge_type": "On Net Total",
+		"account_head": "VAT - Test - %s" % abbr, "rate": 12.5,
+		"category": "Total", "parentfield": "purchase_tax_details"
+	},
+	{
+		"doctype": "Purchase Taxes and Charges", "charge_type": "On Previous Row Total",
+		"account_head": "Discount - %s" % abbr, "rate": -10, "row_id": 7,
+		"category": "Total", "parentfield": "purchase_tax_details",
+		"cost_center": "Default Cost Center - %s" % abbr
+	},
+]
+
+class TestPurchaseReceipt(unittest.TestCase):
+	def setUp(self):
+		webnotes.conn.begin()
+		load_data()
+		webnotes.conn.set_value("Global Defaults", None, "automatic_inventory_accounting", 1)
+
+	def test_purchase_invoice(self):
+		from webnotes.model.doclist import DocList
+		controller = webnotes.insert(DocList(purchase_invoice_doclist))
+		controller.load_from_db()
+		
+		from controllers.tax_controller import TaxController
+		tax_controller = TaxController(controller.doc, controller.doclist)
+		tax_controller.item_table_field = "entries"
+		tax_controller.calculate_taxes_and_totals()
+		
+		controller.doc = tax_controller.doc
+		controller.doclist = tax_controller.doclist
+		
+		controller.save()
+		controller.load_from_db()
+		dl = controller.doclist
+
+		# test net total
+		self.assertEqual(dl[0].net_total, 1250)
+		
+		# test tax amounts and totals
+		expected_values = [
+			["Shipping Charges - %s" % abbr, 100, 1350],
+			["Customs Duty - %s" % abbr, 125, 1350],
+			["Excise Duty - %s" % abbr, 140, 1490],
+			["Education Cess - %s" % abbr, 2.8, 1492.8],
+			["S&H Education Cess - %s" % abbr, 1.4, 1494.2],
+			["CST - %s" % abbr, 29.88, 1524.08],
+			["VAT - Test - %s" % abbr, 156.25, 1680.33],
+			["Discount - %s" % abbr, -168.03, 1512.30],
+		]		
+		for i, tax in enumerate(dl.get({"parentfield": "purchase_tax_details"})):
+			# print tax.account_head, tax.tax_amount, tax.total
+			self.assertEqual(tax.account_head, expected_values[i][0])
+			self.assertEqual(tax.tax_amount, expected_values[i][1])
+			self.assertEqual(tax.total, expected_values[i][2])
+		
+		# test item tax amount
+		expected_values = [
+			["Home Desktop 100", 90],
+			["Home Desktop 200", 135]
+		]
+		for i, item in enumerate(dl.get({"parentfield": "purchase_invoice_items"})):
+			self.assertEqual(item.item_code, expected_values[i][0])
+			self.assertEqual(item.item_tax_amount, expected_values[i][1])
+			
+	def test_purchase_invoice_having_zero_amount_items(self):
+		from webnotes.model.doclist import DocList
+		sample_purchase_invoice_doclist = [] + purchase_invoice_doclist
+		
+		# set rate and amount as 0
+		sample_purchase_invoice_doclist[1]["import_rate"] = 0
+		sample_purchase_invoice_doclist[2]["import_rate"] = 0
+		
+		
+		controller = webnotes.insert(DocList(sample_purchase_invoice_doclist))
+		controller.load_from_db()
+		
+		from controllers.tax_controller import TaxController
+		tax_controller = TaxController(controller.doc, controller.doclist)
+		tax_controller.item_table_field = "entries"
+		tax_controller.calculate_taxes_and_totals()
+		
+		controller.doc = tax_controller.doc
+		controller.doclist = tax_controller.doclist
+		
+		controller.save()
+		controller.load_from_db()
+		dl = controller.doclist
+		
+		# test net total
+		self.assertEqual(dl[0].net_total, 0)
+		
+		# test tax amounts and totals
+		expected_values = [
+			["Shipping Charges - %s" % abbr, 100, 100],
+			["Customs Duty - %s" % abbr, 0, 100],
+			["Excise Duty - %s" % abbr, 0, 100],
+			["Education Cess - %s" % abbr, 0, 100],
+			["S&H Education Cess - %s" % abbr, 0, 100],
+			["CST - %s" % abbr, 2, 102],
+			["VAT - Test - %s" % abbr, 0, 102],
+			["Discount - %s" % abbr, -10.2, 91.8],
+		]
+		for i, tax in enumerate(dl.get({"parentfield": "purchase_tax_details"})):
+			# print tax.account_head, tax.tax_amount, tax.total
+			self.assertEqual(tax.account_head, expected_values[i][0])
+			self.assertEqual(tax.tax_amount, expected_values[i][1])
+			self.assertEqual(tax.total, expected_values[i][2])
+		
+		# test item tax amount
+		expected_values = [
+			["Home Desktop 100", 0],
+			["Home Desktop 200", 0]
+		]
+		for i, item in enumerate(dl.get({"parentfield": "purchase_invoice_items"})):
+			self.assertEqual(item.item_code, expected_values[i][0])
+			self.assertEqual(item.item_tax_amount, expected_values[i][1])
+		
+	def atest_gl_entries(self):
+		from webnotes.model.doclist import DocList
+		controller = webnotes.insert(DocList(purchase_invoice_doclist))
+		
+		from controllers.tax_controller import TaxController
+		tax_controller = TaxController(controller.doc, controller.doclist)
+		tax_controller.item_table_field = "entries"
+		tax_controller.calculate_taxes_and_totals()
+
+		controller.doc = tax_controller.doc
+		controller.doclist = tax_controller.doclist
+
+		controller.submit()
+		controller.load_from_db()
+		dl = controller.doclist
+		
+		expected_values = {
+			"East Wind Inc. - %s" % abbr : [0, 1512.30],
+			"Shipping Charges - %s" % abbr : [100, 0],
+			"Excise Duty - %s" % abbr : [140, 0],
+			"Education Cess - %s" % abbr : [2.8, 0],
+			"S&H Education Cess - %s" % abbr : [1.4, 0],
+			"CST - %s" % abbr : [29.88, 0],
+			"VAT - Test - %s" % abbr : [156.25, 0],
+			"Discount - %s" % abbr : [0, 168.03],
+			"Stock Received But Not Billed - %s" % abbr : [1475, 0],
+			"Expenses Included In Valuation - %s" % abbr : [0, 225]
+		}
+		gl_entries = webnotes.conn.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type = 'Purchase Invoice' and voucher_no = %s""", dl[0].name, as_dict=1)
+		for d in gl_entries:
+			self.assertEqual(d["debit"], expected_values.get(d['account'])[0])
+			self.assertEqual(d["credit"], expected_values.get(d['account'])[1])
+			
+		
+	def tearDown(self):
+		webnotes.conn.rollback()
\ No newline at end of file
diff --git a/accounts/doctype/sales_invoice/test_sales_invoice.py b/accounts/doctype/sales_invoice/test_sales_invoice.py
new file mode 100644
index 0000000..fd91b9e
--- /dev/null
+++ b/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -0,0 +1,534 @@
+# 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 unittest
+import webnotes
+import webnotes.model
+from webnotes.model.doclist import DocList
+from webnotes.utils import nowdate
+from accounts.utils import get_fiscal_year
+
+from stock.doctype.purchase_receipt import test_purchase_receipt
+
+company = webnotes.conn.get_default("company")
+abbr = webnotes.conn.get_value("Company", company, "abbr")
+
+def load_data():
+	test_purchase_receipt.load_data()
+	
+	# create customer group
+	webnotes.insert({"doctype": "Customer Group",
+		"customer_group_name": "Default Customer Group",
+		"parent_customer_group": "All Customer Groups", "is_group": "No"})
+	
+	# create customer
+	webnotes.insert({"doctype": "Customer", "customer_name": "West Wind Inc.",
+		"customer_type": "Company", "territory": "Default",
+		"customer_group": "Default Customer Group", "company": company,
+		"credit_days": 0, "credit_limit": 0})
+	
+	webnotes.insert({"doctype": "Account", "account_name": "Excise Duty",
+		"parent_account": "Tax Assets - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+	
+	webnotes.insert({"doctype": "Account", "account_name": "Education Cess",
+		"parent_account": "Tax Assets - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+	
+	webnotes.insert({"doctype": "Account", "account_name": "S&H Education Cess",
+		"parent_account": "Tax Assets - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+		
+	webnotes.insert({"doctype": "Account", "account_name": "CST",
+		"parent_account": "Direct Expenses - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+		
+	webnotes.insert({"doctype": "Account", "account_name": "adj_rate",
+		"parent_account": "Direct Expenses - %s" % abbr, "company": company,
+		"group_or_ledger": "Ledger"})
+		
+	from webnotes.model.doc import Document
+	item = Document("Item", "Home Desktop 100")
+	
+	# excise duty
+	item_tax = item.addchild("item_tax", "Item Tax")
+	item_tax.tax_type = "Excise Duty - %s" % abbr
+	item_tax.tax_rate = 10
+	item_tax.save()
+
+import json	
+sales_invoice_doclist = [
+	# parent
+	{
+		"doctype": "Sales Invoice", 
+		"debit_to": "West Wind Inc. - %s" % abbr,
+		"customer_name": "West Wind Inc.",
+		"naming_series": "INV", "posting_date": nowdate(),
+		"company": company, "fiscal_year": webnotes.conn.get_default("fiscal_year"), 
+		"currency": webnotes.conn.get_default("currency"), "conversion_rate": 1.0,
+		"price_list_currency": webnotes.conn.get_default("currency"),
+		"plc_conversion_rate": 1.0,
+		"grand_total_export": 0
+	},
+	# items
+	{
+		"doctype": "Sales Invoice Item", "warehouse": "Default Warehouse",
+		"item_code": "Home Desktop 100", "qty": 10, "export_rate": 50,
+		"parentfield": "sales_invoice_items",
+		"uom": "Nos", "item_tax_rate": json.dumps({"Excise Duty - %s" % abbr: 10})
+	},
+	{
+		"doctype": "Sales Invoice Item", "warehouse": "Default Warehouse",
+		"item_code": "Home Desktop 200", "qty": 5, "export_rate": 150,
+		"parentfield": "sales_invoice_items",
+		"uom": "Nos"
+	},
+	# taxes
+	{
+		"doctype": "Sales Taxes and Charges", "charge_type": "Actual",
+		"account_head": "Shipping Charges - %s" % abbr, "rate": 100, 
+		"parentfield": "other_charges",
+		"cost_center_other_charges": "Default Cost Center - %s" % abbr
+	},
+	{
+		"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+		"account_head": "Customs Duty - %s" % abbr, "rate": 10,
+		"parentfield": "other_charges",
+		"cost_center_other_charges": "Default Cost Center - %s" % abbr
+	},
+	{
+		"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+		"account_head": "Excise Duty - %s" % abbr, "rate": 12,
+		"parentfield": "other_charges"
+	},
+	{
+		"doctype": "Sales Taxes and Charges", "charge_type": "On Previous Row Amount",
+		"account_head": "Education Cess - %s" % abbr, "rate": 2, "row_id": 3,
+		"parentfield": "other_charges"
+	},
+	{
+		"doctype": "Sales Taxes and Charges", "charge_type": "On Previous Row Amount",
+		"account_head": "S&H Education Cess - %s" % abbr, "rate": 1, "row_id": 3,
+		"parentfield": "other_charges"
+	},
+	{
+		"doctype": "Sales Taxes and Charges", "charge_type": "On Previous Row Total",
+		"account_head": "CST - %s" % abbr, "rate": 2, "row_id": 5,
+		"parentfield": "other_charges",
+		"cost_center_other_charges": "Default Cost Center - %s" % abbr
+	},
+	{
+		"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+		"account_head": "VAT - Test - %s" % abbr, "rate": 12.5,
+		"parentfield": "other_charges"
+	},
+	{
+		"doctype": "Sales Taxes and Charges", "charge_type": "On Previous Row Total",
+		"account_head": "adj_rate - %s" % abbr, "rate": -10, "row_id": 7,
+		"parentfield": "other_charges",
+		"cost_center_other_charges": "Default Cost Center - %s" % abbr
+	},
+]
+
+class TestSalesInvoice(unittest.TestCase):
+	def setUp(self):
+		webnotes.conn.begin()
+		load_data()
+		webnotes.conn.set_value("Global Defaults", None, "automatic_inventory_accounting", 1)
+
+	def test_sales_invoice(self):
+		from webnotes.model.doclist import DocList
+		doclist = [] + [d.copy() for d in sales_invoice_doclist]
+		controller = webnotes.insert(DocList(doclist))
+		controller.load_from_db()
+		
+		from controllers.tax_controller import TaxController
+		tax_controller = TaxController(controller.doc, controller.doclist)
+		tax_controller.item_table_field = "entries"
+		tax_controller.calculate_taxes_and_totals()
+		
+		controller.doc = tax_controller.doc
+		controller.doclist = tax_controller.doclist
+		
+		controller.save()
+		controller.load_from_db()
+		dl = controller.doclist
+
+		# test net total
+		self.assertEqual(dl[0].net_total, 1250)
+		
+		# test item values calculation
+		expected_values = [
+			{
+				"item_code": "Home Desktop 100",
+				"ref_rate": 50,
+				"adj_rate": 0,
+				"export_amount": 500,
+				"base_ref_rate": 50,
+				"basic_rate": 50,
+				"amount": 500
+			},
+			{
+				"item_code": "Home Desktop 200",
+				"ref_rate": 150,
+				"adj_rate": 0,
+				"export_amount": 750,
+				"base_ref_rate": 150,
+				"basic_rate": 150,
+				"amount": 750
+			},
+		]
+		for i, item in enumerate(dl.get({"parentfield": "sales_invoice_items"})):
+			for key, val in expected_values[i].items():
+				self.assertEqual(item.fields.get(key), val)
+		
+		# test tax amounts and totals
+		expected_values = [
+			["Shipping Charges - %s" % abbr, 100, 1350],
+			["Customs Duty - %s" % abbr, 125, 1475],
+			["Excise Duty - %s" % abbr, 140, 1615],
+			["Education Cess - %s" % abbr, 2.8, 1617.8],
+			["S&H Education Cess - %s" % abbr, 1.4, 1619.2],
+			["CST - %s" % abbr, 32.38, 1651.58],
+			["VAT - Test - %s" % abbr, 156.25, 1807.83],
+			["adj_rate - %s" % abbr, -180.78, 1627.05],
+		]		
+		for i, tax in enumerate(dl.get({"parentfield": "other_charges"})):
+			# print tax.account_head, tax.tax_amount, tax.total
+			self.assertEqual(tax.account_head, expected_values[i][0])
+			self.assertEqual(tax.tax_amount, expected_values[i][1])
+			self.assertEqual(tax.total, expected_values[i][2])
+			
+	def test_inclusive_rate_validations(self):
+		doclist = [] + [d.copy() for d in sales_invoice_doclist]
+		doclist[1]["export_rate"] = 62.5
+		doclist[2]["export_rate"] = 191
+		for i in [3, 5, 6, 7, 8, 9]:
+			doclist[i]["included_in_print_rate"] = 1
+		
+		# tax type "Actual" cannot be inclusive
+		self.assertRaises(webnotes.ValidationError, webnotes.insert,
+			DocList(doclist))
+		
+		doclist[3]["included_in_print_rate"] = 0
+		# taxes above included type 'On Previous Row Total' should also be included
+		self.assertRaises(webnotes.ValidationError, webnotes.insert,
+			DocList(doclist))
+	
+	def test_sales_invoice_with_inclusive_tax(self):
+		doclist = [
+			# parent
+			{
+				"doctype": "Sales Invoice", 
+				"debit_to": "West Wind Inc. - %s" % abbr,
+				"customer_name": "West Wind Inc.",
+				"naming_series": "INV", "posting_date": nowdate(),
+				"company": company,
+				"fiscal_year": webnotes.conn.get_default("fiscal_year"), 
+				"currency": webnotes.conn.get_default("currency"),
+				"price_list_currency": webnotes.conn.get_default("currency"),
+				"conversion_rate": 1.0, "plc_conversion_rate": 1.0,
+				"grand_total_export": 0
+			},
+			# items
+			{
+				"doctype": "Sales Invoice Item", "warehouse": "Default Warehouse",
+				"item_code": "Home Desktop 100", "qty": 10, "export_rate": 62.503,
+				"parentfield": "sales_invoice_items",
+				"uom": "Nos", "item_tax_rate": json.dumps({"Excise Duty - %s" % abbr: 10})
+			},
+			{
+				"doctype": "Sales Invoice Item", "warehouse": "Default Warehouse",
+				"item_code": "Home Desktop 200", "qty": 5, "export_rate": 190.6608,
+				"parentfield": "sales_invoice_items",
+				"uom": "Nos"
+			},
+			# taxes
+			{
+				"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+				"account_head": "Excise Duty - %s" % abbr, "rate": 12,
+				"parentfield": "other_charges", "included_in_print_rate": 1
+			},
+			{
+				"doctype": "Sales Taxes and Charges",
+				"charge_type": "On Previous Row Amount",
+				"account_head": "Education Cess - %s" % abbr, "rate": 2, "row_id": 1,
+				"parentfield": "other_charges", "included_in_print_rate": 1
+			},
+			{
+				"doctype": "Sales Taxes and Charges",
+				"charge_type": "On Previous Row Amount",
+				"account_head": "S&H Education Cess - %s" % abbr, "rate": 1, "row_id": 1,
+				"parentfield": "other_charges", "included_in_print_rate": 1
+			},
+			{
+				"doctype": "Sales Taxes and Charges", 
+				"charge_type": "On Previous Row Total",
+				"account_head": "CST - %s" % abbr, "rate": 2, "row_id": 3,
+				"parentfield": "other_charges", "included_in_print_rate": 1,
+				"cost_center_other_charges": "Default Cost Center - %s" % abbr
+			},
+			{
+				"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+				"account_head": "VAT - Test - %s" % abbr, "rate": 12.5,
+				"parentfield": "other_charges", "included_in_print_rate": 1
+			},
+			{
+				"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+				"account_head": "Customs Duty - %s" % abbr, "rate": 10,
+				"parentfield": "other_charges",
+				"cost_center_other_charges": "Default Cost Center - %s" % abbr
+			},
+			{
+				"doctype": "Sales Taxes and Charges", "charge_type": "Actual",
+				"account_head": "Shipping Charges - %s" % abbr, "rate": 100, 
+				"parentfield": "other_charges",
+				"cost_center_other_charges": "Default Cost Center - %s" % abbr
+			},
+			{
+				"doctype": "Sales Taxes and Charges",
+				"charge_type": "On Previous Row Total",
+				"account_head": "adj_rate - %s" % abbr, "rate": -10, "row_id": 7,
+				"parentfield": "other_charges",
+				"cost_center_other_charges": "Default Cost Center - %s" % abbr
+			},
+		]
+		
+		controller = webnotes.insert(DocList(doclist))
+		controller.load_from_db()
+		
+		from controllers.tax_controller import TaxController
+		tax_controller = TaxController(controller.doc, controller.doclist)
+		tax_controller.item_table_field = "entries"
+		tax_controller.calculate_taxes_and_totals()
+		
+		controller.doc = tax_controller.doc
+		controller.doclist = tax_controller.doclist
+		
+		controller.save()
+		controller.load_from_db()
+		dl = controller.doclist
+
+		# test item values calculation
+		expected_values = [
+			{
+				"item_code": "Home Desktop 100",
+				"ref_rate": 62.503,
+				"adj_rate": 0,
+				"export_amount": 625.03,
+				"base_ref_rate": 50,
+				"basic_rate": 50,
+				"amount": 500
+			},
+			{
+				"item_code": "Home Desktop 200",
+				"ref_rate": 190.6608,
+				"adj_rate": 0,
+				"export_amount": 953.3,
+				"base_ref_rate": 150,
+				"basic_rate": 150,
+				"amount": 750
+			},
+		]
+		for i, item in enumerate(dl.get({"parentfield": "sales_invoice_items"})):
+			for key, val in expected_values[i].items():
+				self.assertEqual(item.fields.get(key), val)
+		
+		# test tax amounts and totals
+		expected_values = [
+			["Excise Duty - %s" % abbr, 140, 1390, 0, 1578.33],
+			["Education Cess - %s" % abbr, 2.8, 1392.8, 0, 1578.33],
+			["S&H Education Cess - %s" % abbr, 1.4, 1394.2, 0, 1578.33],
+			["CST - %s" % abbr, 27.88, 1422.08, 0, 1578.33],
+			["VAT - Test - %s" % abbr, 156.25, 1578.33, 0, 1578.33],
+			["Customs Duty - %s" % abbr, 125, 1703.33, 125, 1703.33],
+			["Shipping Charges - %s" % abbr, 100, 1803.33, 100, 1803.33],
+			["adj_rate - %s" % abbr, -180.33, 1623, -180.33, 1623],
+		]		
+		for i, tax in enumerate(dl.get({"parentfield": "other_charges"})):
+			# print tax.account_head, tax.tax_amount, tax.total, tax.tax_amount_print, \
+			# 	tax.total_print
+			self.assertEqual(tax.account_head, expected_values[i][0])
+			self.assertEqual(tax.tax_amount, expected_values[i][1])
+			self.assertEqual(tax.total, expected_values[i][2])
+			# self.assertEqual(tax.tax_amount_print, expected_values[i][3])
+			self.assertEqual(tax.total_print, expected_values[i][4])
+			
+		# test net total
+		self.assertEqual(dl[0].net_total, 1250)
+		self.assertEqual(dl[0].net_total_print, 1578.33)
+
+		# # test grand total
+		self.assertEqual(dl[0].grand_total, 1623)
+		self.assertEqual(dl[0].grand_total_export, 1623)
+		
+	def test_usd_sales_invoice_with_inclusive_tax(self):
+		# print
+		# print "-"*80
+		# print "test_usd_sales_invoice_with_inclusive_tax"
+		# print "-"*80
+		
+		# Note: below values were obtained through manual calculation and verified by test
+		
+		doclist = [
+			# parent
+			{
+				"doctype": "Sales Invoice", 
+				"debit_to": "West Wind Inc. - %s" % abbr,
+				"customer_name": "West Wind Inc.",
+				"naming_series": "INV", "posting_date": nowdate(),
+				"company": company,
+				"fiscal_year": webnotes.conn.get_default("fiscal_year"), 
+				"currency": "USD", "price_list_currency": "USD", "conversion_rate": 50.0,
+				"plc_conversion_rate": 50.0, "grand_total_export": 0
+			},
+			# items
+			{
+				"doctype": "Sales Invoice Item", "warehouse": "Default Warehouse",
+				"item_code": "Home Desktop 100", "qty": 10, "export_rate": 50,
+				"adj_rate": 10, "parentfield": "sales_invoice_items",
+				"uom": "Nos", "item_tax_rate": json.dumps({"Excise Duty - %s" % abbr: 10})
+			},
+			{
+				"doctype": "Sales Invoice Item", "warehouse": "Default Warehouse",
+				"item_code": "Home Desktop 200", "qty": 5, "export_rate": 150,
+				"adj_rate": 20, "parentfield": "sales_invoice_items",
+				"uom": "Nos"
+			},
+			# taxes
+			{
+				"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+				"account_head": "Excise Duty - %s" % abbr, "rate": 12,
+				"parentfield": "other_charges", "included_in_print_rate": 1
+			},
+			{
+				"doctype": "Sales Taxes and Charges",
+				"charge_type": "On Previous Row Amount",
+				"account_head": "Education Cess - %s" % abbr, "rate": 2, "row_id": 1,
+				"parentfield": "other_charges", "included_in_print_rate": 1
+			},
+			{
+				"doctype": "Sales Taxes and Charges",
+				"charge_type": "On Previous Row Amount",
+				"account_head": "S&H Education Cess - %s" % abbr, "rate": 1, "row_id": 1,
+				"parentfield": "other_charges", "included_in_print_rate": 1
+			},
+			{
+				"doctype": "Sales Taxes and Charges", 
+				"charge_type": "On Previous Row Total",
+				"account_head": "CST - %s" % abbr, "rate": 2, "row_id": 3,
+				"parentfield": "other_charges", "included_in_print_rate": 1,
+				"cost_center_other_charges": "Default Cost Center - %s" % abbr
+			},
+			{
+				"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+				"account_head": "VAT - Test - %s" % abbr, "rate": 12.5,
+				"parentfield": "other_charges", "included_in_print_rate": 1
+			},
+			{
+				"doctype": "Sales Taxes and Charges", "charge_type": "On Net Total",
+				"account_head": "Customs Duty - %s" % abbr, "rate": 10,
+				"parentfield": "other_charges",
+				"cost_center_other_charges": "Default Cost Center - %s" % abbr
+			},
+			{
+				"doctype": "Sales Taxes and Charges", "charge_type": "Actual",
+				"account_head": "Shipping Charges - %s" % abbr, "rate": 100, 
+				"parentfield": "other_charges",
+				"cost_center_other_charges": "Default Cost Center - %s" % abbr
+			},
+			{
+				"doctype": "Sales Taxes and Charges",
+				"charge_type": "On Previous Row Total",
+				"account_head": "adj_rate - %s" % abbr, "rate": -10, "row_id": 7,
+				"parentfield": "other_charges",
+				"cost_center_other_charges": "Default Cost Center - %s" % abbr
+			},
+		]
+		
+		controller = webnotes.insert(DocList(doclist))
+		controller.load_from_db()
+		
+		from controllers.tax_controller import TaxController
+		tax_controller = TaxController(controller.doc, controller.doclist)
+		tax_controller.item_table_field = "entries"
+		tax_controller.calculate_taxes_and_totals()
+		
+		controller.doc = tax_controller.doc
+		controller.doclist = tax_controller.doclist
+		
+		controller.save()
+		controller.load_from_db()
+		dl = controller.doclist
+
+		# test item values calculation
+		expected_values = [
+			{
+				"item_code": "Home Desktop 100",
+				"ref_rate": 55.5556,
+				"adj_rate": 10,
+				"export_amount": 500,
+				"base_ref_rate": 2222.1156,
+				"basic_rate": 1999.904,
+				"amount": 19999.04
+			},
+			{
+				"item_code": "Home Desktop 200",
+				"ref_rate": 187.5,
+				"adj_rate": 20,
+				"export_amount": 750,
+				"base_ref_rate": 7375.664,
+				"basic_rate": 5900.5312,
+				"amount": 29502.66
+			},
+		]
+		for i, item in enumerate(dl.get({"parentfield": "sales_invoice_items"})):
+			for key, val in expected_values[i].items():
+				self.assertEqual(item.fields.get(key), val)
+		
+		# test tax amounts and totals
+		expected_values = [
+			["Excise Duty - %s" % abbr, 5540.22, 55041.92, 0, 1250],
+			["Education Cess - %s" % abbr, 110.81, 55152.73, 0, 1250],
+			["S&H Education Cess - %s" % abbr, 55.4, 55208.13, 0, 1250],
+			["CST - %s" % abbr, 1104.16, 56312.29, 0, 1250],
+			["VAT - Test - %s" % abbr, 6187.71, 62500, 0, 1250],
+			["Customs Duty - %s" % abbr, 4950.17, 67450.17, 99.01, 1349.01],
+			["Shipping Charges - %s" % abbr, 5000, 72450.17, 100, 1449.01],
+			["adj_rate - %s" % abbr, -7245.01, 65205.16, -144.9, 1304.11],
+		]		
+		for i, tax in enumerate(dl.get({"parentfield": "other_charges"})):
+			# print tax.account_head, tax.tax_amount, tax.total, tax.tax_amount_print, \
+			# 	tax.total_print
+			self.assertEqual(tax.account_head, expected_values[i][0])
+			self.assertEqual(tax.tax_amount, expected_values[i][1])
+			self.assertEqual(tax.total, expected_values[i][2])
+			# self.assertEqual(tax.tax_amount_print, expected_values[i][3])
+			self.assertEqual(tax.total_print, expected_values[i][4])
+			
+		# test net total
+		self.assertEqual(dl[0].net_total, 49501.7)
+		self.assertEqual(dl[0].net_total_print, 1250)
+
+		# # test grand total
+		self.assertEqual(dl[0].grand_total, 65205.16)
+		self.assertEqual(dl[0].grand_total_export, 1304.11)
+		
+
+	def tearDown(self):
+		webnotes.conn.rollback()
\ No newline at end of file
diff --git a/controllers/tax_controller.py b/controllers/tax_controller.py
index d19a729..7aa8e23 100644
--- a/controllers/tax_controller.py
+++ b/controllers/tax_controller.py
@@ -136,7 +136,7 @@
 			self.doc.net_total += item.amount
 			self.doc.fields[self.fmap.net_total_print] += \
 				item.fields.get(self.fmap.print_amount)
-
+				
 		self.doc.net_total = flt(self.doc.net_total, self.precision.main.net_total)
 		self.doc.fields[self.fmap.net_total_print] = \
 			flt(self.doc.fields.get(self.fmap.net_total_print),
@@ -269,7 +269,7 @@
 		self.doc.rounded_total = round(self.doc.grand_total)
 		self.doc.fields[self.fmap.rounded_total_print] = \
 			round(self.doc.fields.get(self.fmap.grand_total_print))
-		
+			
 	def set_amount_in_words(self):
 		from webnotes.utils import money_in_words
 		base_currency = webnotes.conn.get_value("Company", self.doc.currency,
@@ -434,12 +434,23 @@
 			return tax.rate
 			
 	def cleanup(self):
+		def _del(f, doc):
+			if f in doc.fields:
+				del doc.fields[f]
+			elif self.fmap.get(f) and self.fmap.get(f) in doc.fields:
+				del doc.fields[self.fmap.get(f)]
+		
 		for f in ["taxes_and_charges_total_print", "rounded_total_in_words_print",
-				"rounded_total_print", "rounded_total_in_words"]:
-			del self.doc.fields[self.fmap.get(f) or f]
+				"rounded_total_print", "rounded_total_in_words", "rounded_total"]:
+			_del(f, self.doc)
 		
 		for f in ["grand_total_print_for_current_item", "tax_amount_print",
 				"grand_total_for_current_item", "tax_amount_for_current_item",
 				"total_print"]:
 			for doc in self.doclist.get({"parentfield": self.fmap.taxes_and_charges}):
-				del doc.fields[self.fmap.get(f) or f]
+				_del(f, doc)
+			
+		for f in ["item_tax_amount"]:
+			for doc in self.doclist.get({"parentfield": self.item_table_field}):
+				_del(f, doc)
+				
diff --git a/controllers/transaction_controller.py b/controllers/transaction_controller.py
index a7dbde1..07fdc67 100644
--- a/controllers/transaction_controller.py
+++ b/controllers/transaction_controller.py
@@ -90,6 +90,7 @@
 					
 					"plc_exchange_rate": "plc_conversion_rate",
 					"tax_calculation": "other_charges_calculation",
+					"cost_center": "cost_center_other_charges",
 				})
 			else:
 				self._fmap = webnotes.DictObj({
@@ -113,5 +114,10 @@
 					
 					"valuation_tax_amount": "item_tax_amount"
 				})
+				
+				if self.doc.doctype == "Purchase Invoice":
+					self._fmap.update({
+						"rate": "rate"
+					})
 			
 		return self._fmap or webnotes.DictObj()
\ No newline at end of file
diff --git a/setup/doctype/authorization_control/authorization_control.py b/setup/doctype/authorization_control/authorization_control.py
index 360a4d0..9e0d979 100644
--- a/setup/doctype/authorization_control/authorization_control.py
+++ b/setup/doctype/authorization_control/authorization_control.py
@@ -42,13 +42,14 @@
 			max_amount = max(amt_list)
 			
 			app_dtl = sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and company = %s %s" % ('%s', '%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on, company))
+			
 			if not app_dtl:
 				app_dtl = sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and ifnull(company,'') = '' %s" % ('%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on)) 
 			for d in app_dtl:
 				if(d[0]): appr_users.append(d[0])
 				if(d[1]): appr_roles.append(d[1])
-
-			if not has_common(appr_roles, webnotes.user.get_roles()) and not has_common(appr_users, session['user']):
+			
+			if not has_common(appr_roles, webnotes.user.get_roles()) and not has_common(appr_users, [session['user']]):
 				msg, add_msg = '',''
 				if max_amount:
 					dcc = TransactionBase().get_company_currency(self.doc.company)
@@ -79,6 +80,7 @@
 		if chk == 1:
 			if based_on == 'Itemwise Discount': add_cond2 += " and ifnull(master_name,'') = ''"
 			appr = sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and company = %s and docstatus != 2 %s %s" % ('%s', '%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on, company))
+			
 			if not appr:
 				appr = sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and ifnull(company,'') = '' and docstatus != 2 %s %s"% ('%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on))
 			self.get_appr_user_role(appr, doctype_name, total, based_on, cond+add_cond2, item, company)
@@ -109,8 +111,6 @@
 	# Check Approving Authority for transactions other than expense voucher and Appraisal
 	# -------------------------
 	def validate_approving_authority(self, doctype_name,company, total, doc_obj = ''):
-		if doctype_name == 'Purchase Invoice': doctype_name = 'Purchase Invoice'
-		elif doctype_name == 'Sales Invoice': doctype_name = 'Sales Invoice'
 		av_dis = 0
 		if doc_obj:
 			ref_rate, basic_rate = 0, 0
