commonified some purchase code, added test case for auto inventory accounting for purchase invoice
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py
index 950cac3..4e53d04 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -35,7 +35,7 @@
 		self.fname = 'entries'
 
 	def get_credit_to(self):
-		acc_head = sql("select name, credit_days from `tabAccount` where (name = %s or (master_name = %s and master_type = 'supplier')) and docstatus != 2", (cstr(self.doc.supplier) + " - " + self.get_company_abbr(),self.doc.supplier))		
+		acc_head = sql("select name, credit_days from `tabAccount` where (name = %s or (master_name = %s and master_type = 'supplier')) and docstatus != 2", (cstr(self.doc.supplier) + " - " + self.company_abbr,self.doc.supplier))		
 
 		ret = {}
 		if acc_head and acc_head[0][0]:
@@ -54,20 +54,32 @@
 			ret['due_date'] = add_days(cstr(self.doc.posting_date), acc and cint(acc[1]) or 0)
 			
 		return ret
-
-	def get_default_values(self,args):
-		import json
-		args = json.loads(args)
-		ret = {}
-		if sql("select name from `tabItem` where name = '%s'" % args['item_code']):
-			if not args['expense_head'] or args['expense_head'] == 'undefined':
-				expense_head = sql("select name from `tabAccount` where account_name in (select purchase_account from `tabItem` where name = '%s')" % args['item_code'])
-				ret['expense_head'] = expense_head and expense_head[0][0] or ''
-			if not args['cost_center'] or args['cost_center'] == 'undefined':
-				cost_center = sql("select cost_center from `tabItem` where name = '%s'" % args['item_code'])
-				ret['cost_center'] = cost_center and cost_center[0][0] or ''
-		return ret
-		 
+		
+	def get_default_values(self, args):
+		if isinstance(args, basestring):
+			import json
+			args = json.loads(args)
+		
+		out = webnotes._dict()
+		
+		item = webnotes.conn.sql("""select name, purchase_account, cost_center,
+			is_stock_item from `tabItem` where name=%s""", args.get("item_code"), as_dict=1)
+		
+		if item and item[0]:
+			item = item[0]
+			
+			if cint(webnotes.defaults.get_global_default("auto_inventory_accounting")) and \
+				item.is_stock_item == "Yes":
+					# unset expense head for stock item and auto inventory accounting
+					out.expense_head = out.cost_center = None
+			else:
+				if not args.get("expense_head"):
+					out.expense_head = item.purchase_account
+				if not args.get("cost_center"):
+					out.cost_center = item.cost_center
+		
+		return out
+			
 	def pull_details(self):
 		if self.doc.purchase_receipt_main:
 			self.validate_duplicate_docname('purchase_receipt')
@@ -86,9 +98,7 @@
 	def get_expense_account(self, doctype):
 		for d in getlist(self.doclist, doctype):			
 			if d.item_code:
-				item = webnotes.conn.sql("select purchase_account, cost_center from tabItem where name = '%s'" %(d.item_code), as_dict=1)
-				d.expense_head = item and item[0]['purchase_account'] or ''
-				d.cost_center = item and item[0]['cost_center'] or ''
+				d.fields.update(self.get_default_values(d.fields))
 
 	def get_advances(self):
 		super(DocType, self).get_advances(self.doc.credit_to, 
@@ -110,9 +120,6 @@
 		ret={'add_tax_rate' :rate and flt(rate[0][0]) or 0 }
 		return ret
 
-	def get_company_abbr(self):
-		return sql("select abbr from tabCompany where name=%s", self.doc.company)[0][0]
-
 	def validate_duplicate_docname(self,doctype):
 		for d in getlist(self.doclist, 'entries'): 
 			if doctype == 'purchase_receipt' and cstr(self.doc.purchase_receipt_main) == cstr(d.purchase_receipt):
@@ -186,7 +193,7 @@
 		if self.doc.supplier and self.doc.credit_to:
 			acc_head = sql("select master_name from `tabAccount` where name = %s", self.doc.credit_to)
 			
-			if (acc_head and cstr(acc_head[0][0]) != cstr(self.doc.supplier)) or (not acc_head and (self.doc.credit_to != cstr(self.doc.supplier) + " - " + self.get_company_abbr())):
+			if (acc_head and cstr(acc_head[0][0]) != cstr(self.doc.supplier)) or (not acc_head and (self.doc.credit_to != cstr(self.doc.supplier) + " - " + self.company_abbr)):
 				msgprint("Credit To: %s do not match with Supplier: %s for Company: %s.\n If both correctly entered, please select Master Type and Master Name in account master." %(self.doc.credit_to,self.doc.supplier,self.doc.company), raise_exception=1)
 				
 	# Check for Stopped PO
@@ -256,11 +263,25 @@
 			raise Exception
 			
 	def set_against_expense_account(self):
-		against_acc = []
-		for d in getlist(self.doclist, 'entries'):
-			if d.expense_account not in against_acc:
-				against_acc.append(d.expense_account)
-		self.doc.against_expense_account = ','.join(against_acc)
+		auto_inventory_accounting = \
+			cint(webnotes.defaults.get_global_default("auto_inventory_accounting"))
+		stock_not_billed_account = "Stock Received But Not Billed - %s" % self.company_abbr
+		
+		against_accounts = []
+		for item in self.doclist.get({"parentfield": "entries"}):
+			if auto_inventory_accounting and item.item_code in self.stock_items:
+				# in case of auto inventory accounting, against expense account is always
+				# Stock Received But Not Billed for a stock item
+				item.expense_head = item.cost_center = None
+				
+				if stock_not_billed_account not in against_accounts:
+					against_accounts.append(stock_not_billed_account)
+			
+			elif item.expense_head not in against_accounts:
+				# if no auto_inventory_accounting or not a stock item
+				against_accounts.append(item.expense_head)
+				
+		self.doc.against_expense_account = ",".join(against_accounts)
 
 	def po_required(self):
 		res = sql("select value from `tabSingles` where doctype = 'Global Defaults' and field = 'po_required'")
@@ -320,6 +341,8 @@
 		 	self.doc.posting_date,'Posting Date')
 		
 		self.validate_write_off_account()
+		
+		self.update_valuation_rate("entries")
 
 	def check_prev_docstatus(self):
 		for d in getlist(self.doclist,'entries'):
@@ -382,11 +405,10 @@
 
 	def make_gl_entries(self, is_cancel = 0):
 		from accounts.general_ledger import make_gl_entries
+		auto_inventory_accounting = \
+			cint(webnotes.defaults.get_global_default("auto_inventory_accounting"))
+		
 		gl_entries = []
-		valuation_tax = 0
-		auto_inventory_accounting = webnotes.conn.get_value("Global Defaults", None, 
-		 	"auto_inventory_accounting")
-		abbr = self.get_company_abbr()
 		
 		# parent's gl entry
 		if self.doc.grand_total:
@@ -402,11 +424,9 @@
 			)
 	
 		# tax table gl entries
-		for tax in getlist(self.doclist, "purchase_tax_details"):
+		valuation_tax = 0
+		for tax in self.doclist.get({"parentfield": "purchase_tax_details"}):
 			if tax.category in ("Total", "Valuation and Total") and flt(tax.tax_amount):
-				valuation_tax += tax.add_deduct_tax == "Add" \
-					and flt(tax.tax_amount) or -1 * flt(tax.tax_amount)
-				
 				gl_entries.append(
 					self.get_gl_dict({
 						"account": tax.account_head,
@@ -417,25 +437,31 @@
 						"cost_center": tax.cost_center
 					}, is_cancel)
 				)
+			
+			# accumulate valuation tax
+			if tax.category in ("Valuation", "Valuation and Total") and flt(tax.tax_amount):
+				valuation_tax += (tax.add_deduct_tax == "Add" and 1 or -1) * flt(tax.tax_amount)
 					
 		# item gl entries
-		stock_item_and_auto_accounting = False
+		stock_item_and_auto_inventory_accounting = False
 		for item in self.doclist.get({"parentfield": "entries"}):
-			if auto_inventory_accounting and flt(item.valuation_rate) and \
-					webnotes.conn.get_value("Item", item.item_code, "is_stock_item")=="Yes":
-				# if auto inventory accounting enabled and stock item, 
-				# then do stock related gl entries, expense will be booked in sales invoice
-				gl_entries.append(
-					self.get_gl_dict({
-						"account": "Stock Received But Not Billed - %s" % (abbr,),
-						"against": self.doc.credit_to,
-						"debit": flt(item.valuation_rate) * flt(item.conversion_factor) \
-							*  item.qty,
-						"remarks": self.doc.remarks or "Accounting Entry for Stock"
-					}, is_cancel)
-				)
-			
-				stock_item_and_auto_accounting = True
+			if auto_inventory_accounting and item.item_code in self.stock_items:
+				if flt(item.valuation_rate):
+					# if auto inventory accounting enabled and stock item, 
+					# then do stock related gl entries
+					# expense will be booked in sales invoice
+					
+					stock_item_and_auto_inventory_accounting = True
+					
+					gl_entries.append(
+						self.get_gl_dict({
+							"account": "Stock Received But Not Billed - %s" % (self.company_abbr,),
+							"against": self.doc.credit_to,
+							"debit": flt(item.valuation_rate) * flt(item.conversion_factor) \
+								*  flt(item.qty),
+							"remarks": self.doc.remarks or "Accounting Entry for Stock"
+						}, is_cancel)
+					)
 			
 			elif flt(item.amount):
 				# if not a stock item or auto inventory accounting disabled, book the expense
@@ -449,13 +475,13 @@
 					}, is_cancel)
 				)
 				
-		if stock_item_and_auto_accounting and valuation_tax:
+		if stock_item_and_auto_inventory_accounting and valuation_tax:
 			# credit valuation tax amount in "Expenses Included In Valuation"
 			# this will balance out valuation amount included in cost of goods sold
 			gl_entries.append(
 				self.get_gl_dict({
-					"account": "Expenses Included In Valuation - %s" % (abbr,),
-					"cost_center": "ERP - %s" % abbr, # to-do
+					"account": "Expenses Included In Valuation - %s" % (self.company_abbr,),
+					"cost_center": "Auto Inventory Accounting - %s" % self.company_abbr,
 					"against": self.doc.credit_to,
 					"credit": valuation_tax,
 					"remarks": self.doc.remarks or "Accounting Entry for Stock"
@@ -464,12 +490,12 @@
 		
 		# writeoff account includes petty difference in the invoice amount 
 		# and the amount that is paid
-		if self.doc.write_off_account and self.doc.write_off_amount:
+		if self.doc.write_off_account and flt(self.doc.write_off_amount):
 			gl_entries.append(
 				self.get_gl_dict({
 					"account": self.doc.write_off_account,
 					"against": self.doc.credit_to,
-					"credit": self.doc.write_off_amount,
+					"credit": flt(self.doc.write_off_amount),
 					"remarks": self.doc.remarks,
 					"cost_center": self.doc.write_off_cost_center
 				}, is_cancel)
@@ -478,7 +504,6 @@
 		if gl_entries:
 			make_gl_entries(gl_entries, cancel=is_cancel)
 
-
 	def check_next_docstatus(self):
 		submit_jv = sql("select t1.name from `tabJournal Voucher` t1,`tabJournal Voucher Detail` t2 where t1.name = t2.parent and t2.against_voucher = '%s' and t1.docstatus = 1" % (self.doc.name))
 		if submit_jv:
diff --git a/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 0944b81..c1c0540 100644
--- a/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -20,11 +20,16 @@
 import webnotes
 import webnotes.model
 import json	
+from webnotes.utils import cint
+import webnotes.defaults
 
 test_dependencies = ["Item", "Cost Center"]
 
 class TestPurchaseInvoice(unittest.TestCase):
 	def test_gl_entries_without_auto_inventory_accounting(self):
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
+		self.assertTrue(not cint(webnotes.defaults.get_global_default("auto_inventory_accounting")))
+		
 		wrapper = webnotes.bean(copy=test_records[0])
 		wrapper.run_method("calculate_taxes_and_totals")
 		wrapper.insert()
@@ -49,7 +54,36 @@
 			self.assertEqual([d.debit, d.credit], expected_gl_entries.get(d.account))
 			
 	def test_gl_entries_with_auto_inventory_accounting(self):
+		print "Testing with auto inventory"
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 1)
+		self.assertEqual(cint(webnotes.defaults.get_global_default("auto_inventory_accounting")), 1)
+		
 		pi = webnotes.bean(copy=test_records[1])
+		pi.run_method("calculate_taxes_and_totals")
+		pi.insert()
+		pi.submit()
+		
+		print "auto inventory submitted"
+		
+		gl_entries = webnotes.conn.sql("""select account, debit, credit
+			from `tabGL Entry` where voucher_type='Purchase Receipt' and voucher_no=%s
+			order by account desc""", pi.doc.name, as_dict=1)
+		self.assertTrue(gl_entries)
+		
+		expected_values = [
+			["_Test Supplier - _TC", 0, 720],
+			["Stock Received But Not Billed - _TC", 750.0, 0],
+			["_Test Account Shipping Charges - _TC", 100.0, 0],
+			["_Test Account VAT - _TC", 120.0, 0],
+			["Expenses Included In Valuation - _TC", 0, 250.0]
+		].sort()
+		
+		for i, gle in enumerate(gl_entries):
+			self.assertEquals(expected_values[i][0], gle.account)
+			self.assertEquals(expected_values[i][1], gle.debit)
+			self.assertEquals(expected_values[i][2], gle.credit)
+		
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
 			
 	def test_purchase_invoice_calculation(self):
 		wrapper = webnotes.bean(copy=test_records[0])
@@ -115,7 +149,8 @@
 			"uom": "_Test UOM",
 			"item_tax_rate": json.dumps({"_Test Account Excise Duty - _TC": 10}),
 			"expense_head": "_Test Account Cost for Goods Sold - _TC",
-			"cost_center": "_Test Cost Center - _TC"
+			"cost_center": "_Test Cost Center - _TC",
+			"conversion_factor": 1.0,
 		
 		},
 		{
@@ -130,7 +165,8 @@
 			"amount": 750,
 			"uom": "_Test UOM",
 			"expense_head": "_Test Account Cost for Goods Sold - _TC",
-			"cost_center": "_Test Cost Center - _TC"
+			"cost_center": "_Test Cost Center - _TC",
+			"conversion_factor": 1.0,
 		},
 		# taxes
 		{
@@ -237,7 +273,8 @@
 			"fiscal_year": "_Test Fiscal Year 2013",
 			"company": "_Test Company",
 			"currency": "INR",
-			"conversion_rate": 1,
+			"conversion_rate": 1.0,
+			"grand_total_import": 0 # for feed
 		},
 		# items
 		{
@@ -245,12 +282,46 @@
 			"parentfield": "entries",
 			"item_code": "_Test Item",
 			"item_name": "_Test Item",
-			"qty": 10,
-			"import_rate": 50,
+			"qty": 10.0,
+			"import_rate": 50.0,
 			"uom": "_Test UOM",
 			"expense_head": "_Test Account Cost for Goods Sold - _TC",
-			"cost_center": "_Test Cost Center - _TC"
-		
+			"cost_center": "_Test Cost Center - _TC",
+			"conversion_factor": 1.0,
+		},
+		# taxes
+		{
+			"doctype": "Purchase Taxes and Charges",
+			"parentfield": "purchase_tax_details",
+			"charge_type": "Actual",
+			"account_head": "_Test Account Shipping Charges - _TC",
+			"cost_center": "_Test Cost Center - _TC",
+			"description": "Shipping Charges",
+			"category": "Valuation and Total",
+			"add_deduct_tax": "Add",
+			"rate": 100.0
+		},
+		{
+			"doctype": "Purchase Taxes and Charges",
+			"parentfield": "purchase_tax_details",
+			"charge_type": "Actual",
+			"account_head": "_Test Account VAT - _TC",
+			"cost_center": "_Test Cost Center - _TC",
+			"description": "VAT",
+			"category": "Total",
+			"add_deduct_tax": "Add",
+			"rate": 120.0
+		},
+		{
+			"doctype": "Purchase Taxes and Charges",
+			"parentfield": "purchase_tax_details",
+			"charge_type": "Actual",
+			"account_head": "_Test Account Customs Duty - _TC",
+			"cost_center": "_Test Cost Center - _TC",
+			"description": "Customs Duty",
+			"category": "Valuation",
+			"add_deduct_tax": "Add",
+			"rate": 150.0
 		},
 	]
 ]
\ No newline at end of file
diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py
index 47a0138..aa52b5e 100644
--- a/controllers/accounts_controller.py
+++ b/controllers/accounts_controller.py
@@ -86,4 +86,11 @@
 				from `tabItem` where name in (%s) and is_stock_item='Yes'""" % \
 				(", ".join((["%s"]*len(item_codes))),), item_codes)]
 
-		return self._stock_items
\ No newline at end of file
+		return self._stock_items
+		
+	@property
+	def company_abbr(self):
+		if not hasattr(self, "_abbr"):
+			self._abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")
+			
+		return self._abbr
\ No newline at end of file
diff --git a/controllers/buying_controller.py b/controllers/buying_controller.py
index 2514bfc..8a230e1 100644
--- a/controllers/buying_controller.py
+++ b/controllers/buying_controller.py
@@ -232,7 +232,7 @@
 		else:
 			self.doc.grand_total = flt(self.doc.net_total,
 				self.precision.main.grand_total)
-			self.doc.grand_total_print = flt(
+			self.doc.grand_total_import = flt(
 				self.doc.grand_total / self.doc.conversion_rate,
 				self.precision.main.grand_total_import)
 
@@ -327,6 +327,16 @@
 				item.item_code in self.stock_items:
 			item.item_tax_amount += flt(current_tax_amount,
 				self.precision.item.item_tax_amount)
+				
+	# update valuation rate
+	def update_valuation_rate(self, parentfield):
+		for d in self.doclist.get({"parentfield": parentfield}):
+			if d.qty:
+				d.valuation_rate = (flt(d.purchase_rate or d.rate)
+					+ (flt(d.item_tax_amount) + flt(d.rm_supp_cost)) / flt(d.qty)
+					) / flt(d.conversion_factor)
+			else:
+				d.valuation_rate = 0.0
 	
 	@property
 	def precision(self):
diff --git a/setup/doctype/company/company.py b/setup/doctype/company/company.py
index 552dae2..9cf722f 100644
--- a/setup/doctype/company/company.py
+++ b/setup/doctype/company/company.py
@@ -211,6 +211,12 @@
 				'company_name':self.doc.name,
 				'group_or_ledger':'Ledger',
 				'parent_cost_center':'Root - ' + self.doc.abbr
+			},
+			{
+				'cost_center_name': 'Auto Inventory Accounting', 
+				'company_name': self.doc.name,
+				'group_or_ledger': 'Ledger',
+				'parent_cost_center': 'Root - ' + self.doc.abbr
 			}
 		]
 		for cc in cc_list:
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index a957468..f3f453e 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -89,16 +89,6 @@
 				webnotes.msgprint("Another Purchase Receipt using the same Challan No. already exists.\
 			Please enter a valid Challan No.", raise_exception=1)
 
-
-	# update valuation rate
-	def update_valuation_rate(self):
-		for d in self.doclist.get({"parentfield": "purchase_receipt_details"}):
-			if d.qty:
-				d.valuation_rate = (flt(d.purchase_rate) + flt(d.item_tax_amount)/flt(d.qty)
-					+ flt(d.rm_supp_cost) / flt(d.qty)) / flt(d.conversion_factor)
-			else:
-				d.valuation_rate = 0.0
-
 	#check in manage account if purchase order required or not.
 	# ====================================================================================
 	def po_required(self):
@@ -134,8 +124,7 @@
 		pc_obj.validate_reference_value(self)
 		self.check_for_stopped_status(pc_obj)
 
-		# update valuation rate
-		self.update_valuation_rate()
+		self.update_valuation_rate("purchase_receipt_details")
 
 
 	# On Update
diff --git a/stock/doctype/purchase_receipt/test_purchase_receipt.py b/stock/doctype/purchase_receipt/test_purchase_receipt.py
index d833d65..f99fe7f 100644
--- a/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -36,7 +36,6 @@
 		
 	def test_purchase_receipt_gl_entry(self):
 		webnotes.defaults.set_global_default("auto_inventory_accounting", 1)
-		
 		self.assertEqual(cint(webnotes.defaults.get_global_default("auto_inventory_accounting")), 1)
 		
 		pr = webnotes.bean(copy=test_records[0])
@@ -47,7 +46,6 @@
 		gl_entries = webnotes.conn.sql("""select account, debit, credit
 			from `tabGL Entry` where voucher_type='Purchase Receipt' and voucher_no=%s
 			order by account desc""", pr.doc.name, as_dict=1)
-			
 		self.assertTrue(gl_entries)
 		
 		stock_in_hand_account = webnotes.conn.get_value("Company", pr.doc.company,