Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/accounts/doctype/account/account.py b/accounts/doctype/account/account.py
index 08bf80f..3cd131f 100644
--- a/accounts/doctype/account/account.py
+++ b/accounts/doctype/account/account.py
@@ -207,4 +207,4 @@
 		where group_or_ledger = 'Group' and docstatus != 2 and company = %s
 		and %s like %s order by name limit %s, %s""" % 
 		("%s", searchfield, "%s", "%s", "%s"), 
-		(filters["company"], "%%%s%%" % txt, start, page_len), as_list=1)
+		(filters["company"], "%%%s%%" % txt, start, page_len), as_list=1)
\ No newline at end of file
diff --git a/accounts/doctype/fiscal_year/fiscal_year.txt b/accounts/doctype/fiscal_year/fiscal_year.txt
index 18f20dd..935b76f 100644
--- a/accounts/doctype/fiscal_year/fiscal_year.txt
+++ b/accounts/doctype/fiscal_year/fiscal_year.txt
@@ -1,8 +1,8 @@
 [
  {
-  "creation": "2013-01-10 16:34:06", 
+  "creation": "2013-01-22 16:50:25", 
   "docstatus": 0, 
-  "modified": "2013-01-22 14:46:59", 
+  "modified": "2013-03-13 12:29:40", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -23,7 +23,6 @@
   "permlevel": 0
  }, 
  {
-  "amend": 0, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
@@ -43,22 +42,6 @@
   "name": "Fiscal Year"
  }, 
  {
-  "doctype": "DocField", 
-  "fieldname": "year_details", 
-  "fieldtype": "Section Break", 
-  "label": "Fiscal Year Details", 
-  "oldfieldtype": "Section Break"
- }, 
- {
-  "doctype": "DocField", 
-  "fieldname": "trash_reason", 
-  "fieldtype": "Small Text", 
-  "label": "Trash Reason", 
-  "oldfieldname": "trash_reason", 
-  "oldfieldtype": "Small Text", 
-  "read_only": 1
- }, 
- {
   "description": "For e.g. 2012, 2012-13", 
   "doctype": "DocField", 
   "fieldname": "year", 
@@ -73,6 +56,7 @@
   "fieldname": "year_start_date", 
   "fieldtype": "Date", 
   "label": "Year Start Date", 
+  "no_copy": 1, 
   "oldfieldname": "year_start_date", 
   "oldfieldtype": "Date", 
   "reqd": 1
@@ -84,6 +68,7 @@
   "fieldname": "is_fiscal_year_closed", 
   "fieldtype": "Select", 
   "label": "Year Closed", 
+  "no_copy": 1, 
   "oldfieldname": "is_fiscal_year_closed", 
   "oldfieldtype": "Select", 
   "options": "\nNo\nYes", 
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.js b/accounts/doctype/purchase_invoice/purchase_invoice.js
index f4a2e68..4a1cbba 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -238,8 +238,11 @@
 	refresh_field('entries');
 }
 
-cur_frm.fields_dict['entries'].grid.get_field("cost_center").get_query = function(doc) {
-	return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.docstatus != 2 ORDER BY	`tabCost Center`.`name` ASC LIMIT 50';
+cur_frm.fields_dict["entries"].grid.get_field("cost_center").get_query = function(doc) {
+	return {
+		query: "accounts.utils.get_cost_center_list",
+		filters: { company_name: doc.company}
+	}
 }
 
 cur_frm.cscript.cost_center = function(doc, cdt, cdn){
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index a24e256..5cc09a0 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -271,8 +271,6 @@
 	if (doc.is_opening == 'Yes') unhide_field('aging_date');
 }
 
-/* **************************** TRIGGERS ********************************** */
-
 // Get Items based on SO or DN Selected
 cur_frm.cscript.get_items = function(doc, dt, dn) {
 	var callback = function(r,rt) {
@@ -371,6 +369,18 @@
 	return 'SELECT tabAccount.name FROM tabAccount WHERE (tabAccount.debit_or_credit="Credit" OR tabAccount.account_type = "Income Account") AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus!=2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"';	
 })
 
+// expense account
+cur_frm.fields_dict['entries'].grid.get_field('expense_account').get_query = function(doc) {
+	return {
+		"query": "accounts.utils.get_account_list", 
+		"filters": {
+			"is_pl_account": "Yes",
+			"debit_or_credit": "Debit",
+			"company": doc.company
+		}
+	}
+}
+
 // warehouse in detail table
 //----------------------------
 cur_frm.fields_dict['entries'].grid.get_field('warehouse').get_query= function(doc, cdt, cdn) {
@@ -380,8 +390,11 @@
 
 // Cost Center in Details Table
 // -----------------------------
-cur_frm.fields_dict.entries.grid.get_field("cost_center").get_query = function(doc) {
-	return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.`docstatus`!= 2 ORDER BY	`tabCost Center`.`name` ASC LIMIT 50';
+cur_frm.fields_dict["entries"].grid.get_field("cost_center").get_query = function(doc) {
+	return {
+		query: "accounts.utils.get_cost_center_list",
+		filters: { company_name: doc.company}
+	}
 }
 
 // Sales Order
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index de3ee95..b6b1f0b 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -804,8 +804,9 @@
 		item_buying_amount = 0
 		if stock_ledger_entries:
 			# is pos and update stock
-			item_buying_amount = get_buying_amount(item.item_code, item.warehouse, item.qty, 
+			item_buying_amount = get_buying_amount(item.item_code, item.warehouse, -1*item.qty, 
 				self.doc.doctype, self.doc.name, item.name, stock_ledger_entries, item_sales_bom)
+			item.buying_amount = item_buying_amount > 0 and item_buying_amount or 0
 		elif item.delivery_note and item.dn_detail:
 			# against delivery note
 			dn_item = webnotes.conn.get_value("Delivery Note Item", item.dn_detail, 
diff --git a/accounts/doctype/sales_invoice_item/sales_invoice_item.txt b/accounts/doctype/sales_invoice_item/sales_invoice_item.txt
index ca078b5..6f6ad39 100644
--- a/accounts/doctype/sales_invoice_item/sales_invoice_item.txt
+++ b/accounts/doctype/sales_invoice_item/sales_invoice_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-03-07 11:42:55", 
   "docstatus": 0, 
-  "modified": "2013-03-11 14:58:50", 
+  "modified": "2013-03-18 15:41:19", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -207,14 +207,16 @@
   "width": "120px"
  }, 
  {
+  "depends_on": "eval:sys_defaults.auto_inventory_accounting", 
   "doctype": "DocField", 
   "fieldname": "expense_account", 
   "fieldtype": "Link", 
-  "hidden": 1, 
+  "hidden": 0, 
   "in_filter": 1, 
   "label": "Expense Account", 
   "options": "Account", 
-  "print_hide": 1
+  "print_hide": 1, 
+  "width": "120px"
  }, 
  {
   "doctype": "DocField", 
diff --git a/accounts/report/gross_profit/gross_profit.py b/accounts/report/gross_profit/gross_profit.py
index f1ae00e..2480e17 100644
--- a/accounts/report/gross_profit/gross_profit.py
+++ b/accounts/report/gross_profit/gross_profit.py
@@ -24,8 +24,10 @@
 	data = []
 	for row in delivery_note_items:
 		selling_amount = flt(row.amount)
-		buying_amount = get_buying_amount(row.item_code, row.warehouse, 
-			row.qty, "Delivery Note", row.name, row.item_row, stock_ledger_entries, item_sales_bom)
+		buying_amount = get_buying_amount(row.item_code, row.warehouse, -1*row.qty, 
+			"Delivery Note", row.name, row.item_row, stock_ledger_entries, item_sales_bom)
+		buying_amount = buying_amount > 0 and buying_amount or 0
+		
 		if selling_amount:
 			gross_profit = selling_amount - buying_amount
 			gross_profit_percent = (gross_profit / selling_amount) * 100.0
diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py
index 576921a..66a5d9e 100644
--- a/controllers/accounts_controller.py
+++ b/controllers/accounts_controller.py
@@ -18,6 +18,7 @@
 import webnotes
 from webnotes import msgprint, _
 from webnotes.utils import flt
+
 from utilities.transaction_base import TransactionBase
 
 class AccountsController(TransactionBase):
@@ -73,7 +74,6 @@
 			
 	def get_stock_in_hand_account(self):
 		stock_in_hand_account = webnotes.conn.get_value("Company", self.doc.company, "stock_in_hand_account")
-		
 		if not stock_in_hand_account:
 			msgprint(_("Missing") + ": " 
 				+ _(webnotes.get_doctype("company").get_label("stock_in_hand_account")
diff --git a/controllers/buying_controller.py b/controllers/buying_controller.py
index 2f3128c..03d2a92 100644
--- a/controllers/buying_controller.py
+++ b/controllers/buying_controller.py
@@ -24,9 +24,9 @@
 from setup.utils import get_company_currency
 from webnotes.model.utils import round_floats_in_doc
 
-from controllers.accounts_controller import AccountsController
+from controllers.stock_controller import StockController
 
-class BuyingController(AccountsController):
+class BuyingController(StockController):
 	def validate(self):		
 		if self.meta.get_field("currency"):
 			self.company_currency = get_company_currency(self.doc.company)
diff --git a/controllers/selling_controller.py b/controllers/selling_controller.py
index 40606c3..f9498cb 100644
--- a/controllers/selling_controller.py
+++ b/controllers/selling_controller.py
@@ -19,9 +19,9 @@
 from webnotes.utils import cint
 from setup.utils import get_company_currency
 
-from controllers.accounts_controller import AccountsController
+from controllers.stock_controller import StockController
 
-class SellingController(AccountsController):
+class SellingController(StockController):
 	def validate(self):
 		self.set_total_in_words()
 		
@@ -37,27 +37,4 @@
 				self.doc.grand_total or self.doc.rounded_total, company_currency)
 		if self.meta.get_field("in_words_export"):
 			self.doc.in_words_export = money_in_words(disable_rounded_total and 
-				self.doc.grand_total_export or self.doc.rounded_total_export, self.doc.currency)
-	
-	def get_stock_ledger_entries(self):
-		item_list, warehouse_list = self.get_distinct_item_warehouse()
-		if item_list and warehouse_list:
-			return webnotes.conn.sql("""select item_code, voucher_type, voucher_no,
-				voucher_detail_no, posting_date, posting_time, stock_value,
-				warehouse, actual_qty as qty from `tabStock Ledger Entry` 
-				where ifnull(`is_cancelled`, "No") = "No" and company = %s 
-				and item_code in (%s) and warehouse in (%s)
-				order by item_code desc, warehouse desc, posting_date desc, 
-				posting_time desc, name desc""" % 
-				('%s', ', '.join(['%s']*len(item_list)), ', '.join(['%s']*len(warehouse_list))), 
-				tuple([self.doc.company] + item_list + warehouse_list), as_dict=1)
-
-	def get_distinct_item_warehouse(self):
-		item_list = []
-		warehouse_list = []
-		for item in self.doclist.get({"parentfield": self.fname}) \
-				+ self.doclist.get({"parentfield": "packing_details"}):
-			item_list.append(item.item_code)
-			warehouse_list.append(item.warehouse)
-			
-		return list(set(item_list)), list(set(warehouse_list))
\ No newline at end of file
+				self.doc.grand_total_export or self.doc.rounded_total_export, self.doc.currency)
\ No newline at end of file
diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py
new file mode 100644
index 0000000..3a900aa
--- /dev/null
+++ b/controllers/stock_controller.py
@@ -0,0 +1,71 @@
+# 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 controllers.accounts_controller import AccountsController
+
+class StockController(AccountsController):
+	def make_gl_entries(self, against_stock_account, amount, cost_center=None):
+		stock_in_hand_account = self.get_stock_in_hand_account()
+		
+		if amount:
+			gl_entries = [
+				# stock in hand account
+				self.get_gl_dict({
+					"account": stock_in_hand_account,
+					"against": against_stock_account,
+					"debit": amount,
+					"remarks": self.doc.remarks or "Accounting Entry for Stock",
+				}, self.doc.docstatus == 2),
+				
+				# account against stock in hand
+				self.get_gl_dict({
+					"account": against_stock_account,
+					"against": stock_in_hand_account,
+					"credit": amount,
+					"cost_center": cost_center or None,
+					"remarks": self.doc.remarks or "Accounting Entry for Stock",
+				}, self.doc.docstatus == 2),
+			]
+			from accounts.general_ledger import make_gl_entries
+			make_gl_entries(gl_entries, cancel=self.doc.docstatus == 2)
+			
+		
+	def get_stock_ledger_entries(self, item_list=None, warehouse_list=None):
+		if not (item_list and warehouse_list):
+			item_list, warehouse_list = self.get_distinct_item_warehouse()
+			
+		if item_list and warehouse_list:
+			return webnotes.conn.sql("""select item_code, voucher_type, voucher_no,
+				voucher_detail_no, posting_date, posting_time, stock_value,
+				warehouse, actual_qty as qty from `tabStock Ledger Entry` 
+				where ifnull(`is_cancelled`, "No") = "No" and company = %s 
+				and item_code in (%s) and warehouse in (%s)
+				order by item_code desc, warehouse desc, posting_date desc, 
+				posting_time desc, name desc""" % 
+				('%s', ', '.join(['%s']*len(item_list)), ', '.join(['%s']*len(warehouse_list))), 
+				tuple([self.doc.company] + item_list + warehouse_list), as_dict=1)
+
+	def get_distinct_item_warehouse(self):
+		item_list = []
+		warehouse_list = []
+		for item in self.doclist.get({"parentfield": self.fname}) \
+				+ self.doclist.get({"parentfield": "packing_details"}):
+			item_list.append(item.item_code)
+			warehouse_list.append(item.warehouse)
+			
+		return list(set(item_list)), list(set(warehouse_list))
\ No newline at end of file
diff --git a/setup/doctype/company/company.py b/setup/doctype/company/company.py
index 9cf722f..6ba7985 100644
--- a/setup/doctype/company/company.py
+++ b/setup/doctype/company/company.py
@@ -17,7 +17,7 @@
 from __future__ import unicode_literals
 import webnotes
 
-from webnotes.utils import cstr, set_default
+from webnotes.utils import cstr
 from webnotes.model.doc import Document
 from webnotes.model.code import get_obj
 import webnotes.defaults
@@ -47,10 +47,11 @@
 					['Loans and Advances (Assets)','Current Assets','Group','No','','Debit',self.doc.name,''],
 					['Securities and Deposits','Current Assets','Group','No','','Debit',self.doc.name,''],
 						['Earnest Money','Securities and Deposits','Ledger','No','','Debit',self.doc.name,''],
-					['Stock In Hand','Current Assets','Group','No','','Debit',self.doc.name,''],
-						['Stock','Stock In Hand','Ledger','No','','Debit',self.doc.name,''],
+					['Stock Assets','Current Assets','Group','No','','Debit',self.doc.name,''],
+						['Stock In Hand','Stock Assets','Ledger','No','','Debit',self.doc.name,''],
+						['Stock Delivered But Not Billed', 'Stock Assets', 'Ledger', 
+							'No', '', 'Debit', self.doc.name, ''],
 					['Tax Assets','Current Assets','Group','No','','Debit',self.doc.name,''],
-					['Stock Delivered But Not Billed','Current Assets','Ledger','No','','Debit',self.doc.name,''],
 				['Fixed Assets','Application of Funds (Assets)','Group','No','','Debit',self.doc.name,''],
 					['Capital Equipments','Fixed Assets','Ledger','No','Fixed Asset Account','Debit',self.doc.name,''],
 					['Computers','Fixed Assets','Ledger','No','Fixed Asset Account','Debit',self.doc.name,''],
@@ -62,9 +63,10 @@
 					['Temporary Account (Assets)','Temporary Accounts (Assets)','Ledger','No','','Debit',self.doc.name,''],
 			['Expenses','','Group','Yes','Expense Account','Debit',self.doc.name,''],
 				['Direct Expenses','Expenses','Group','Yes','Expense Account','Debit',self.doc.name,''],
-					['Cost of Goods Sold','Direct Expenses','Ledger','Yes','Expense Account','Debit',self.doc.name,''],
-					['Expenses Included In Valuation','Direct Expenses','Ledger','Yes','Expense Account','Debit',self.doc.name,''],
-					['Stock Adjustment','Direct Expenses','Ledger','Yes','Expense Account','Debit',self.doc.name,''],
+					['Stock Expenses','Direct Expenses','Group','Yes','Expense Account','Debit',self.doc.name,''],
+						['Cost of Goods Sold','Stock Expenses','Ledger','Yes','Expense Account','Debit',self.doc.name,''],
+						['Stock Adjustment','Stock Expenses','Ledger','Yes','Expense Account','Debit',self.doc.name,''],
+						['Expenses Included In Valuation', "Stock Expenses", 'Ledger', 'Yes', 'Expense Account', 'Debit', self.doc.name, ''],
 				['Indirect Expenses','Expenses','Group','Yes','Expense Account','Debit',self.doc.name,''],
 					['Advertising and Publicity','Indirect Expenses','Ledger','Yes','Chargeable','Debit',self.doc.name,''],
 					['Bad Debts Written Off','Indirect Expenses','Ledger','Yes','Expense Account','Debit',self.doc.name,''],
@@ -101,12 +103,14 @@
 					['Shareholders Funds','Capital Account','Group','No','','Credit',self.doc.name,''],
 				['Current Liabilities','Source of Funds (Liabilities)','Group','No','','Credit',self.doc.name,''],
 					['Accounts Payable','Current Liabilities','Group','No','','Credit',self.doc.name,''],
+					['Stock Liabilities','Current Liabilities','Group','No','','Credit',self.doc.name,''],
+						['Stock Received But Not Billed', 'Stock Liabilities', 'Ledger', 
+							'No', '', 'Credit', self.doc.name, ''],					
 					['Duties and Taxes','Current Liabilities','Group','No','','Credit',self.doc.name,''],
 					['Loans (Liabilities)','Current Liabilities','Group','No','','Credit',self.doc.name,''],
 						['Secured Loans','Loans (Liabilities)','Group','No','','Credit',self.doc.name,''],
 						['Unsecured Loans','Loans (Liabilities)','Group','No','','Credit',self.doc.name,''],
 						['Bank Overdraft Account','Loans (Liabilities)','Group','No','','Credit',self.doc.name,''],
-					['Stock Received But Not Billed','Current Liabilities','Ledger','No','','Credit',self.doc.name,''],
 				['Temporary Accounts (Liabilities)','Source of Funds (Liabilities)','Group','No','','Credit',self.doc.name,''],
 					['Temporary Account (Liabilities)','Temporary Accounts (Liabilities)','Ledger','No','','Credit',self.doc.name,'']
 		]
@@ -186,14 +190,30 @@
 			 
 				self.doc.letter_head = header
 
-	# Set default AR and AP group
-	# ---------------------------------------------------
-	def set_default_groups(self):
-		if not self.doc.receivables_group:
-			webnotes.conn.set(self.doc, 'receivables_group', 'Accounts Receivable - '+self.doc.abbr)
-		if not self.doc.payables_group:
-			webnotes.conn.set(self.doc, 'payables_group', 'Accounts Payable - '+self.doc.abbr)
+	def set_default_accounts(self):
+		if not self.doc.receivables_group and webnotes.conn.exists('Account', 
+			'Accounts Receivable - ' + self.doc.abbr):
+				webnotes.conn.set(self.doc, 'receivables_group', 'Accounts Receivable - ' + 
+					self.doc.abbr)
+					
+		if not self.doc.payables_group and webnotes.conn.exists('Account', 
+			'Accounts Payable - ' + self.doc.abbr):
+				webnotes.conn.set(self.doc, 'payables_group', 'Accounts Payable - ' + self.doc.abbr)
 			
+		if not self.doc.stock_delivered_but_not_billed and webnotes.conn.exists("Account", 
+			"Stock Delivered But Not Billed - " + self.doc.abbr):
+				webnotes.conn.set(self.doc, "stock_delivered_but_not_billed", 
+					"Stock Delivered But Not Billed - " + self.doc.abbr)
+					
+		if not self.doc.stock_received_but_not_billed and webnotes.conn.exists("Account", 
+			"Stock Received But Not Billed - " + self.doc.abbr):
+				webnotes.conn.set(self.doc, "stock_received_but_not_billed", 
+					"Stock Received But Not Billed - " + self.doc.abbr)
+		
+		if not self.doc.stock_adjustment_account and webnotes.conn.exists("Account", 
+			"Stock Adjustment - " + self.doc.abbr):
+				webnotes.conn.set(self.doc, "stock_adjustment_account", "Stock Adjustment - " + 
+					self.doc.abbr)
 			
 	# Create default cost center
 	# ---------------------------------------------------
@@ -228,7 +248,7 @@
 			self.doc.name)
 		if not ac:
 			self.create_default_accounts()
-		self.set_default_groups()
+		self.set_default_accounts()
 		cc = sql("select name from `tabCost Center` where cost_center_name = 'Root' and company_name = '%s'"%(self.doc.name))
 		if not cc:
 			self.create_default_cost_center()
@@ -258,9 +278,6 @@
 			#update value as blank for tabSingles Global Defaults
 			sql("update `tabSingles` set value = '' where doctype='Global Defaults' and field = 'default_company' and value = %s", self.doc.name)
 
-		
-	# on rename
-	# ---------
 	def on_rename(self,newdn,olddn):
 		sql("update `tabCompany` set company_name = '%s' where name = '%s'" %(newdn,olddn))	
 		sql("update `tabSingles` set value = %s where doctype='Global Defaults' and field = 'default_company' and value = %s", (newdn, olddn))	
diff --git a/setup/doctype/company/company.txt b/setup/doctype/company/company.txt
index d97cfc3..d8c649f 100644
--- a/setup/doctype/company/company.txt
+++ b/setup/doctype/company/company.txt
@@ -1,8 +1,8 @@
 [
  {
-  "creation": "2013-02-22 01:27:54", 
+  "creation": "2013-02-27 09:38:05", 
   "docstatus": 0, 
-  "modified": "2013-02-26 10:57:39", 
+  "modified": "2013-03-18 16:34:04", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -125,17 +125,6 @@
   "options": "Account"
  }, 
  {
-  "depends_on": "eval:!doc.__islocal", 
-  "description": "This account will be used to maintain value of available stock", 
-  "doctype": "DocField", 
-  "fieldname": "stock_in_hand_account", 
-  "fieldtype": "Link", 
-  "label": "Stock In Hand Account", 
-  "no_copy": 1, 
-  "options": "Account", 
-  "read_only": 0
- }, 
- {
   "doctype": "DocField", 
   "fieldname": "column_break0", 
   "fieldtype": "Column Break", 
@@ -182,6 +171,50 @@
   "options": "\nWarn\nIgnore\nStop"
  }, 
  {
+  "depends_on": "eval:!doc.__islocal && sys_defaults.auto_inventory_accounting", 
+  "doctype": "DocField", 
+  "fieldname": "auto_inventory_accounting_settings", 
+  "fieldtype": "Section Break", 
+  "label": "Auto Inventory Accounting Settings"
+ }, 
+ {
+  "description": "This account will be used to maintain value of available stock", 
+  "doctype": "DocField", 
+  "fieldname": "stock_in_hand_account", 
+  "fieldtype": "Link", 
+  "label": "Stock In Hand Account", 
+  "no_copy": 1, 
+  "options": "Account", 
+  "read_only": 0
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "stock_adjustment_account", 
+  "fieldtype": "Link", 
+  "label": "Stock Adjustment Account", 
+  "options": "Account"
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "col_break23", 
+  "fieldtype": "Column Break", 
+  "width": "50%"
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "stock_delivered_but_not_billed", 
+  "fieldtype": "Link", 
+  "label": "Stock Delivered But Not Billed", 
+  "options": "Account"
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "stock_received_but_not_billed", 
+  "fieldtype": "Link", 
+  "label": "Stock Received But Not Billed", 
+  "options": "Account"
+ }, 
+ {
   "description": "For reference only.", 
   "doctype": "DocField", 
   "fieldname": "company_info", 
diff --git a/stock/doctype/bin/bin.py b/stock/doctype/bin/bin.py
index 37ecf85..204053d 100644
--- a/stock/doctype/bin/bin.py
+++ b/stock/doctype/bin/bin.py
@@ -16,15 +16,8 @@
 
 from __future__ import unicode_literals
 import webnotes
-from webnotes import _
-
-from webnotes.utils import add_days, cint, cstr, flt, now, nowdate, \
-	get_url_to_form, formatdate
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild
-from webnotes.model.bean import copy_doclist
-from webnotes.model.code import get_obj
-from webnotes import msgprint
+from webnotes.utils import add_days, cint,flt, nowdate, get_url_to_form, formatdate
+from webnotes import msgprint, _
 sql = webnotes.conn.sql
 
 import webnotes.defaults
@@ -61,7 +54,7 @@
 			from stock.stock_ledger import update_entries_after
 			
 			if not args.get("posting_date"):
-				posting_date = nowdate()
+				args["posting_date"] = nowdate()
 			
 			# update valuation and qty after transaction for post dated entry
 			update_entries_after({
@@ -108,11 +101,10 @@
 			#check if re-order is required
 			item_reorder = webnotes.conn.get("Item Reorder", 
 				{"parent": self.doc.item_code, "warehouse": self.doc.warehouse})
-			
 			if item_reorder:
 				reorder_level = item_reorder.warehouse_reorder_level
 				reorder_qty = item_reorder.warehouse_reorder_qty
-				material_request_type = item_reorder.material_request_type
+				material_request_type = item_reorder.material_request_type or "Purchase"
 			else:
 				reorder_level, reorder_qty = webnotes.conn.get_value("Item", self.doc.item_code,
 					["re_order_level", "re_order_qty"])
@@ -123,7 +115,7 @@
 					material_request_type)
 
 	def create_material_request(self, doc_type, doc_name, reorder_level, reorder_qty,
-			material_request_type):
+			material_request_type="Purchase"):
 		"""	Create indent on reaching reorder level	"""
 		defaults = webnotes.defaults.get_defaults()
 		item = webnotes.doc("Item", self.doc.item_code)
@@ -151,7 +143,6 @@
 			"qty": reorder_qty,
 			"brand": item.brand,
 		}])
-		
 		mr.insert()
 		mr.submit()
 
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 229ec40..aef7939 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -24,7 +24,6 @@
 
 sql = webnotes.conn.sql
 
-
 from controllers.selling_controller import SellingController
 
 class DocType(SellingController):
@@ -401,9 +400,10 @@
 		
 		if stock_ledger_entries:
 			for item in self.doclist.get({"parentfield": "delivery_note_details"}):
-				item.buying_amount = get_buying_amount(item.item_code, item.warehouse, item.qty, 
+				buying_amount = get_buying_amount(item.item_code, item.warehouse, -1*item.qty, 
 					self.doc.doctype, self.doc.name, item.name, stock_ledger_entries, 
 					item_sales_bom)
+				item.buying_amount = buying_amount > 0 and buying_amount or 0
 				webnotes.conn.set_value("Delivery Note Item", item.name, "buying_amount", 
 					item.buying_amount)
 		
@@ -420,32 +420,11 @@
 		if not cint(webnotes.defaults.get_global_default("auto_inventory_accounting")):
 			return
 		
-		abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")
-		stock_delivered_account = "Stock Delivered But Not Billed - %s" % (abbr,)
-		stock_in_hand_account = self.get_stock_in_hand_account()
-		
+		against_stock_account = "Stock Delivered But Not Billed - %s" % (self.company_abbr,)
 		total_buying_amount = self.get_total_buying_amount()
-		if total_buying_amount:
-			gl_entries = [
-				# credit stock in hand account
-				self.get_gl_dict({
-					"account": stock_in_hand_account,
-					"against": stock_delivered_account,
-					"credit": total_buying_amount,
-					"remarks": self.doc.remarks or "Accounting Entry for Stock",
-				}, self.doc.docstatus == 2),
-				
-				# debit stock received but not billed account
-				self.get_gl_dict({
-					"account": stock_delivered_account,
-					"against": stock_in_hand_account,
-					"debit": total_buying_amount,
-					"remarks": self.doc.remarks or "Accounting Entry for Stock",
-				}, self.doc.docstatus == 2),
-			]
-			from accounts.general_ledger import make_gl_entries
-			make_gl_entries(gl_entries, cancel=self.doc.docstatus == 2)
-			
+		
+		super(DocType, self).make_gl_entries(against_stock_account, -1*total_buying_amount)
+		
 	def get_total_buying_amount(self):
 		total_buying_amount = sum([item.buying_amount for item in 
 			self.doclist.get({"parentfield": "delivery_note_details"})])
diff --git a/stock/doctype/item_reorder/item_reorder.txt b/stock/doctype/item_reorder/item_reorder.txt
index 43ed4fe..b6933c7 100644
--- a/stock/doctype/item_reorder/item_reorder.txt
+++ b/stock/doctype/item_reorder/item_reorder.txt
@@ -1,8 +1,8 @@
 [
  {
-  "creation": "2013-02-22 01:28:01", 
+  "creation": "2013-03-07 11:42:59", 
   "docstatus": 0, 
-  "modified": "2013-03-07 07:03:22", 
+  "modified": "2013-03-19 12:22:44", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -20,7 +20,8 @@
   "parent": "Item Reorder", 
   "parentfield": "fields", 
   "parenttype": "DocType", 
-  "permlevel": 0
+  "permlevel": 0, 
+  "read_only": 0
  }, 
  {
   "doctype": "DocType", 
@@ -38,7 +39,8 @@
   "doctype": "DocField", 
   "fieldname": "warehouse_reorder_level", 
   "fieldtype": "Float", 
-  "label": "Re-order Level"
+  "label": "Re-order Level", 
+  "reqd": 1
  }, 
  {
   "doctype": "DocField", 
@@ -51,6 +53,7 @@
   "fieldname": "material_request_type", 
   "fieldtype": "Select", 
   "label": "Material Request Type", 
-  "options": "Purchase\nTransfer"
+  "options": "Purchase\nTransfer", 
+  "reqd": 1
  }
 ]
\ No newline at end of file
diff --git a/stock/doctype/packing_slip/packing_slip.js b/stock/doctype/packing_slip/packing_slip.js
index a332ca8..706c6f5 100644
--- a/stock/doctype/packing_slip/packing_slip.js
+++ b/stock/doctype/packing_slip/packing_slip.js
@@ -28,18 +28,10 @@
 
 
 // Fetch item details
-cur_frm.cscript.item_code = function(doc, cdt, cdn) {
-	if(locals[cdt][cdn].item_code) {
-		$c_obj(make_doclist(cdt, cdn), 'get_item_details', doc.delivery_note, function(r, rt) {
-			if(r.exc) {
-				msgprint(r.exc);
-			} else {
-				refresh_field('item_details');
-			}
-		});
-	}
-}
-
+cur_frm.add_fetch("item_code", "item_name", "item_name");
+cur_frm.add_fetch("item_code", "stock_uom", "stock_uom");
+cur_frm.add_fetch("item_code", "net_weight", "net_weight");
+cur_frm.add_fetch("item_code", "weight_uom", "weight_uom");
 
 cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
 	if(doc.delivery_note && doc.__islocal) {
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index cce1493..e26c0a6 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -20,8 +20,7 @@
 from webnotes.utils import cstr, flt, cint
 from webnotes.model.bean import getlist
 from webnotes.model.code import get_obj
-from webnotes.model.doc import Document
-from webnotes import msgprint, _
+from webnotes import msgprint
 
 sql = webnotes.conn.sql
 
@@ -319,32 +318,10 @@
 		if not cint(webnotes.defaults.get_global_default("auto_inventory_accounting")):
 			return
 		
-		abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")
-		stock_received_account = "Stock Received But Not Billed - %s" % (abbr,)
-		stock_in_hand_account = self.get_stock_in_hand_account()
-		
+		against_stock_account = "Stock Received But Not Billed - %s" % (self.company_abbr,)
 		total_valuation_amount = self.get_total_valuation_amount()
 		
-		if total_valuation_amount:
-			gl_entries = [
-				# debit stock in hand account
-				self.get_gl_dict({
-					"account": stock_in_hand_account,
-					"against": stock_received_account,
-					"debit": total_valuation_amount,
-					"remarks": self.doc.remarks or "Accounting Entry for Stock",
-				}, self.doc.docstatus == 2),
-			
-				# credit stock received but not billed account
-				self.get_gl_dict({
-					"account": stock_received_account,
-					"against": stock_in_hand_account,
-					"credit": total_valuation_amount,
-					"remarks": self.doc.remarks or "Accounting Entry for Stock",
-				}, self.doc.docstatus == 2),
-			]
-			from accounts.general_ledger import make_gl_entries
-			make_gl_entries(gl_entries, cancel=self.doc.docstatus == 2)
+		super(DocType, self).make_gl_entries(against_stock_account, total_valuation_amount)
 		
 	def get_total_valuation_amount(self):
 		total_valuation_amount = 0.0
diff --git a/stock/doctype/stock_entry/stock_entry.js b/stock/doctype/stock_entry/stock_entry.js
index ba1f648..0a75914 100644
--- a/stock/doctype/stock_entry/stock_entry.js
+++ b/stock/doctype/stock_entry/stock_entry.js
@@ -234,4 +234,11 @@
 
 cur_frm.fields_dict.customer.get_query = erpnext.utils.customer_query;
 
-cur_frm.fields_dict.supplier.get_query = erpnext.utils.supplier_query;
\ No newline at end of file
+cur_frm.fields_dict.supplier.get_query = erpnext.utils.supplier_query;
+
+cur_frm.fields_dict["expense_adjustment_account"].get_query = function(doc) {
+	return {
+		"query": "accounts.utils.get_account_list", 
+		"filters": { "company": doc.company }
+	}
+}
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index cd20266..17e2655 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -26,12 +26,11 @@
 from stock.stock_ledger import get_previous_sle
 import json
 
-
 sql = webnotes.conn.sql
 	
-from controllers.accounts_controller import AccountsController
+from controllers.stock_controller import StockController
 
-class DocType(AccountsController):
+class DocType(StockController):
 	def __init__(self, doc, doclist=[]):
 		self.doc = doc
 		self.doclist = doclist
@@ -168,41 +167,24 @@
 		if not cint(webnotes.defaults.get_global_default("auto_inventory_accounting")):
 			return
 		
-		abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")
-		stock_in_hand_account = self.get_stock_in_hand_account()
-		total_valuation_amount = self.get_total_valuation_amount()
-
-		if total_valuation_amount:
-			gl_entries = [
-				# debit stock in hand account
-				self.get_gl_dict({
-					"account": stock_in_hand_account,
-					"against": "Stock Adjustment - %s" % abbr,
-					"debit": total_valuation_amount,
-					"remarks": self.doc.remarks or "Accounting Entry for Stock",
-				}, self.doc.docstatus == 2),
-				
-				# debit stock received but not billed account
-				self.get_gl_dict({
-					"account": "Stock Adjustment - %s" % abbr,
-					"against": stock_in_hand_account,
-					"credit": total_valuation_amount,
-					"cost_center": "Auto Inventory Accounting - %s" % abbr, 
-					"remarks": self.doc.remarks or "Accounting Entry for Stock",
-				}, self.doc.docstatus == 2),
-			]
-			from accounts.general_ledger import make_gl_entries
-			make_gl_entries(gl_entries, cancel=self.doc.docstatus == 2)
+		if not self.doc.expense_adjustment_account:
+			webnotes.msgprint(_("Please enter Expense/Adjustment Account"), raise_exception=1)
 			
+		cost_center = "Auto Inventory Accounting - %s" % (self.company_abbr,)
+		total_valuation_amount = self.get_total_valuation_amount()
+		
+		super(DocType, self).make_gl_entries(self.doc.expense_adjustment_account, 
+			total_valuation_amount, cost_center)
+		
 	def get_total_valuation_amount(self):
 		total_valuation_amount = 0
 		for item in self.doclist.get({"parentfield": "mtn_details"}):
 			if item.t_warehouse and not item.s_warehouse:
 				total_valuation_amount += flt(item.incoming_rate) * flt(item.transfer_qty)
-				
+			
 			if item.s_warehouse and not item.t_warehouse:
 				total_valuation_amount -= flt(item.incoming_rate) * flt(item.transfer_qty)
-						
+		
 		return total_valuation_amount
 			
 	def get_stock_and_rate(self):
diff --git a/stock/doctype/stock_entry/stock_entry.txt b/stock/doctype/stock_entry/stock_entry.txt
index 2554455..0132652 100644
--- a/stock/doctype/stock_entry/stock_entry.txt
+++ b/stock/doctype/stock_entry/stock_entry.txt
@@ -1,8 +1,8 @@
 [
  {
-  "creation": "2013-01-23 19:57:20", 
+  "creation": "2013-03-07 18:50:32", 
   "docstatus": 0, 
-  "modified": "2013-01-28 17:59:20", 
+  "modified": "2013-03-14 12:25:00", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -60,6 +60,7 @@
   "fieldtype": "Column Break", 
   "oldfieldtype": "Column Break", 
   "print_width": "50%", 
+  "read_only": 0, 
   "width": "50%"
  }, 
  {
@@ -76,6 +77,7 @@
   "oldfieldtype": "Select", 
   "options": "\nSTE", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 1, 
   "search_index": 0
@@ -95,6 +97,7 @@
   "oldfieldtype": "Select", 
   "options": "Material Issue\nMaterial Receipt\nMaterial Transfer\nManufacture/Repack\nSubcontract\nSales Return\nPurchase Return", 
   "print_hide": 0, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 1, 
   "search_index": 0
@@ -105,6 +108,7 @@
   "fieldtype": "Column Break", 
   "oldfieldtype": "Column Break", 
   "print_width": "50%", 
+  "read_only": 0, 
   "width": "50%"
  }, 
  {
@@ -122,6 +126,7 @@
   "oldfieldname": "posting_date", 
   "oldfieldtype": "Date", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 1, 
   "search_index": 1
@@ -138,16 +143,26 @@
   "oldfieldname": "posting_time", 
   "oldfieldtype": "Time", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 1, 
   "search_index": 0
  }, 
  {
+  "depends_on": "eval:sys_defaults.auto_inventory_accounting", 
+  "doctype": "DocField", 
+  "fieldname": "expense_adjustment_account", 
+  "fieldtype": "Link", 
+  "label": "Expense/Adjustment Account", 
+  "options": "Account"
+ }, 
+ {
   "doctype": "DocField", 
   "fieldname": "items_section", 
   "fieldtype": "Section Break", 
   "label": "Items", 
-  "oldfieldtype": "Section Break"
+  "oldfieldtype": "Section Break", 
+  "read_only": 0
  }, 
  {
   "allow_on_submit": 0, 
@@ -163,6 +178,7 @@
   "oldfieldtype": "Link", 
   "options": "Warehouse", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -170,7 +186,8 @@
  {
   "doctype": "DocField", 
   "fieldname": "cb0", 
-  "fieldtype": "Column Break"
+  "fieldtype": "Column Break", 
+  "read_only": 0
  }, 
  {
   "allow_on_submit": 0, 
@@ -186,6 +203,7 @@
   "oldfieldtype": "Link", 
   "options": "Warehouse", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -194,7 +212,8 @@
   "doctype": "DocField", 
   "fieldname": "sb0", 
   "fieldtype": "Section Break", 
-  "options": "Simple"
+  "options": "Simple", 
+  "read_only": 0
  }, 
  {
   "allow_on_submit": 0, 
@@ -209,6 +228,7 @@
   "oldfieldtype": "Table", 
   "options": "Stock Entry Detail", 
   "print_hide": 0, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -221,13 +241,15 @@
   "label": "Get Stock and Rate", 
   "oldfieldtype": "Button", 
   "options": "get_stock_and_rate", 
-  "print_hide": 1
+  "print_hide": 1, 
+  "read_only": 0
  }, 
  {
   "doctype": "DocField", 
   "fieldname": "sb1", 
   "fieldtype": "Section Break", 
-  "label": "Reference"
+  "label": "Reference", 
+  "read_only": 0
  }, 
  {
   "allow_on_submit": 0, 
@@ -243,6 +265,7 @@
   "oldfieldtype": "Link", 
   "options": "Production Order", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 1
@@ -253,7 +276,8 @@
   "fieldname": "bom_no", 
   "fieldtype": "Link", 
   "label": "BOM No", 
-  "options": "BOM"
+  "options": "BOM", 
+  "read_only": 0
  }, 
  {
   "allow_on_submit": 0, 
@@ -269,6 +293,7 @@
   "oldfieldname": "fg_completed_qty", 
   "oldfieldtype": "Currency", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -287,6 +312,7 @@
   "oldfieldtype": "Link", 
   "options": "Delivery Note", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 1
@@ -305,6 +331,7 @@
   "oldfieldtype": "Link", 
   "options": "Purchase Receipt", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 1
@@ -312,7 +339,8 @@
  {
   "doctype": "DocField", 
   "fieldname": "cb1", 
-  "fieldtype": "Column Break"
+  "fieldtype": "Column Break", 
+  "read_only": 0
  }, 
  {
   "default": "1", 
@@ -321,7 +349,8 @@
   "doctype": "DocField", 
   "fieldname": "use_multi_level_bom", 
   "fieldtype": "Check", 
-  "label": "Use Multi-Level BOM"
+  "label": "Use Multi-Level BOM", 
+  "read_only": 0
  }, 
  {
   "allow_on_submit": 0, 
@@ -335,6 +364,7 @@
   "no_copy": 0, 
   "oldfieldtype": "Button", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -348,14 +378,16 @@
   "label": "Sales Invoice No", 
   "no_copy": 1, 
   "options": "Sales Invoice", 
-  "print_hide": 1
+  "print_hide": 1, 
+  "read_only": 0
  }, 
  {
   "depends_on": "eval:(doc.purpose==\"Sales Return\" || doc.purpose==\"Purchase Return\")", 
   "doctype": "DocField", 
   "fieldname": "contact_section", 
   "fieldtype": "Section Break", 
-  "label": "Contact Info"
+  "label": "Contact Info", 
+  "read_only": 0
  }, 
  {
   "allow_on_submit": 0, 
@@ -371,6 +403,7 @@
   "oldfieldtype": "Link", 
   "options": "Supplier", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -406,6 +439,7 @@
   "oldfieldname": "supplier_address", 
   "oldfieldtype": "Small Text", 
   "print_hide": 0, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -424,6 +458,7 @@
   "oldfieldtype": "Link", 
   "options": "Customer", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -459,6 +494,7 @@
   "oldfieldname": "customer_address", 
   "oldfieldtype": "Small Text", 
   "print_hide": 0, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -468,13 +504,15 @@
   "fieldname": "more_info", 
   "fieldtype": "Section Break", 
   "label": "More Info", 
-  "oldfieldtype": "Section Break"
+  "oldfieldtype": "Section Break", 
+  "read_only": 0
  }, 
  {
   "doctype": "DocField", 
   "fieldname": "col4", 
   "fieldtype": "Column Break", 
   "print_width": "50%", 
+  "read_only": 0, 
   "width": "50%"
  }, 
  {
@@ -485,7 +523,8 @@
   "label": "Project Name", 
   "oldfieldname": "project_name", 
   "oldfieldtype": "Link", 
-  "options": "Project"
+  "options": "Project", 
+  "read_only": 0
  }, 
  {
   "allow_on_submit": 0, 
@@ -500,6 +539,7 @@
   "oldfieldtype": "Link", 
   "options": "Print Heading", 
   "print_hide": 0, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -517,6 +557,7 @@
   "oldfieldtype": "Link", 
   "options": "Company", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 1, 
   "search_index": 0
@@ -526,6 +567,7 @@
   "fieldname": "col5", 
   "fieldtype": "Column Break", 
   "print_width": "50%", 
+  "read_only": 0, 
   "width": "50%"
  }, 
  {
@@ -558,6 +600,7 @@
   "oldfieldname": "remarks", 
   "oldfieldtype": "Text", 
   "print_hide": 1, 
+  "read_only": 0, 
   "report_hide": 0, 
   "reqd": 0, 
   "search_index": 0
@@ -569,5 +612,13 @@
  {
   "doctype": "DocPerm", 
   "role": "Manufacturing User"
+ }, 
+ {
+  "doctype": "DocPerm", 
+  "role": "Manufacturing Manager"
+ }, 
+ {
+  "doctype": "DocPerm", 
+  "role": "Material Manager"
  }
 ]
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py
index a4103c3..f193826 100644
--- a/stock/doctype/stock_entry/test_stock_entry.py
+++ b/stock/doctype/stock_entry/test_stock_entry.py
@@ -168,6 +168,7 @@
 			"posting_time": "17:14:24", 
 			"purpose": "Material Receipt",
 			"fiscal_year": "_Test Fiscal Year 2013", 
+			"expense_adjustment_account": "Stock Adjustment - _TC"
 		}, 
 		{
 			"conversion_factor": 1.0, 
@@ -190,6 +191,7 @@
 			"posting_time": "17:15", 
 			"purpose": "Material Issue",
 			"fiscal_year": "_Test Fiscal Year 2013", 
+			"expense_adjustment_account": "Stock Adjustment - _TC"
 		}, 
 		{
 			"conversion_factor": 1.0, 
@@ -212,6 +214,7 @@
 			"posting_time": "17:14:24", 
 			"purpose": "Material Transfer",
 			"fiscal_year": "_Test Fiscal Year 2013", 
+			"expense_adjustment_account": "Stock Adjustment - _TC"
 		}, 
 		{
 			"conversion_factor": 1.0, 
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.js b/stock/doctype/stock_reconciliation/stock_reconciliation.js
index f1508ac..fb4053c 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.js
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.js
@@ -18,6 +18,10 @@
 wn.provide("erpnext.stock");
 
 erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({
+	setup: function() {
+		this.frm.add_fetch("company", "stock_adjustment_account", "expense_account");
+	}, 
+	
 	refresh: function() {
 		if(this.frm.doc.docstatus===0) {
 			this.show_download_template();
@@ -122,4 +126,15 @@
 	},
 });
 
-cur_frm.cscript = new erpnext.stock.StockReconciliation({frm: cur_frm});
\ No newline at end of file
+cur_frm.cscript = new erpnext.stock.StockReconciliation({frm: cur_frm});
+
+cur_frm.fields_dict["expense_account"].get_query = function(doc) {
+	return {
+		"query": "accounts.utils.get_account_list", 
+		"filters": {
+			"is_pl_account": "Yes",
+			"debit_or_credit": "Debit",
+			"company": doc.company
+		}
+	}
+}
\ No newline at end of file
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.py b/stock/doctype/stock_reconciliation/stock_reconciliation.py
index e0f7f09..c2f5a94 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -18,22 +18,26 @@
 import webnotes
 import json
 from webnotes import msgprint, _
-from webnotes.utils import cstr, flt
-from webnotes.model.controller import DocListController
+from webnotes.utils import cstr, flt, cint
 from stock.stock_ledger import update_entries_after
+from controllers.stock_controller import StockController
 
-class DocType(DocListController):
+class DocType(StockController):
 	def setup(self):
 		self.head_row = ["Item Code", "Warehouse", "Quantity", "Valuation Rate"]
+		self.entries = []
 		
 	def validate(self):
 		self.validate_data()
 		
 	def on_submit(self):
 		self.insert_stock_ledger_entries()
+		self.set_stock_value_difference()
+		self.make_gl_entries()
 		
 	def on_cancel(self):
 		self.delete_stock_ledger_entries()
+		self.make_gl_entries()
 		
 	def validate_data(self):
 		if not self.doc.reconciliation_json:
@@ -134,6 +138,7 @@
 		data = json.loads(self.doc.reconciliation_json)
 		for row_num, row in enumerate(data[data.index(self.head_row)+1:]):
 			row = webnotes._dict(zip(row_template, row))
+			row["row_num"] = row_num
 			previous_sle = get_previous_sle({
 				"item_code": row.item_code,
 				"warehouse": row.warehouse,
@@ -162,8 +167,7 @@
 					
 	def sle_for_moving_avg(self, row, previous_sle, change_in_qty, change_in_rate):
 		"""Insert Stock Ledger Entries for Moving Average valuation"""
-		def _get_incoming_rate(qty, valuation_rate, previous_qty,
-				previous_valuation_rate):
+		def _get_incoming_rate(qty, valuation_rate, previous_qty, previous_valuation_rate):
 			if previous_valuation_rate == 0:
 				return flt(valuation_rate)
 			else:
@@ -177,9 +181,9 @@
 			incoming_rate = _get_incoming_rate(flt(row.qty), flt(row.valuation_rate),
 				flt(previous_sle.get("qty_after_transaction")),
 				flt(previous_sle.get("valuation_rate")))
-			
-			self.insert_entries({"actual_qty": change_in_qty, 
-				"incoming_rate": incoming_rate}, row)
+				
+			row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Actual Entry"
+			self.insert_entries({"actual_qty": change_in_qty, "incoming_rate": incoming_rate}, row)
 			
 		elif change_in_rate and flt(previous_sle.get("qty_after_transaction")) > 0:
 			# if no change in qty, but change in rate 
@@ -190,9 +194,11 @@
 				flt(previous_sle.get("valuation_rate")))
 				
 			# +1 entry
+			row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Valuation Adjustment +1"
 			self.insert_entries({"actual_qty": 1, "incoming_rate": incoming_rate}, row)
 			
 			# -1 entry
+			row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Valuation Adjustment -1"
 			self.insert_entries({"actual_qty": -1}, row)
 		
 	def sle_for_fifo(self, row, previous_sle, change_in_qty, change_in_rate):
@@ -206,14 +212,16 @@
 			if previous_stock_queue != [[row.qty, row.valuation_rate]]:
 				# make entry as per attachment
 				if row.qty:
+					row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Actual Entry"
 					self.insert_entries({"actual_qty": row.qty, 
 						"incoming_rate": flt(row.valuation_rate)}, row)
 				
 				# Make reverse entry
 				if previous_stock_qty:
+					row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Reverse Entry"
 					self.insert_entries({"actual_qty": -1 * previous_stock_qty, 
-						"incoming_rate": previous_stock_qty < 0 and \
-						flt(row.valuation_rate) or 0}, row)
+						"incoming_rate": previous_stock_qty < 0 and 
+							flt(row.valuation_rate) or 0}, row)
 					
 					
 		if change_in_qty:
@@ -221,8 +229,7 @@
 				# dont want change in valuation
 				if previous_stock_qty > 0:
 					# set valuation_rate as previous valuation_rate
-					row.valuation_rate = \
-						previous_stock_value / flt(previous_stock_qty)
+					row.valuation_rate = previous_stock_value / flt(previous_stock_qty)
 			
 			_insert_entries()
 					
@@ -234,8 +241,8 @@
 			_insert_entries()
 					
 	def insert_entries(self, opts, row):
-		"""Insert Stock Ledger Entries"""
-		args = {
+		"""Insert Stock Ledger Entries"""		
+		args = webnotes._dict({
 			"doctype": "Stock Ledger Entry",
 			"item_code": row.item_code,
 			"warehouse": row.warehouse,
@@ -243,9 +250,10 @@
 			"posting_time": self.doc.posting_time,
 			"voucher_type": self.doc.doctype,
 			"voucher_no": self.doc.name,
-			"company": webnotes.conn.get_default("company"),
+			"company": self.doc.company,
 			"is_cancelled": "No",
-		}
+			"voucher_detail_no": row.voucher_detail_no
+		})
 		args.update(opts)
 		# create stock ledger entry
 		sle_wrapper = webnotes.bean([args])
@@ -254,17 +262,18 @@
 		
 		# update bin
 		webnotes.get_obj('Warehouse', row.warehouse).update_bin(args)
-
-		return sle_wrapper
+		
+		# append to entries
+		self.entries.append(args)
 		
 	def delete_stock_ledger_entries(self):
 		"""	Delete Stock Ledger Entries related to this Stock Reconciliation
 			and repost future Stock Ledger Entries"""
-			
+					
 		existing_entries = webnotes.conn.sql("""select item_code, warehouse 
-			from `tabStock Ledger Entry` where voucher_type='Stock Reconciliation'
+			from `tabStock Ledger Entry` where voucher_type='Stock Reconciliation' 
 			and voucher_no=%s""", self.doc.name, as_dict=1)
-		
+				
 		# delete entries
 		webnotes.conn.sql("""delete from `tabStock Ledger Entry` 
 			where voucher_type='Stock Reconciliation' and voucher_no=%s""", self.doc.name)
@@ -277,7 +286,33 @@
 				"posting_date": self.doc.posting_date,
 				"posting_time": self.doc.posting_time
 			})
-	
+			
+	def set_stock_value_difference(self):
+		"""stock_value_difference is the increment in the stock value"""
+		from stock.utils import get_buying_amount
+		
+		item_list = [d.item_code for d in self.entries]
+		warehouse_list = [d.warehouse for d in self.entries]
+		stock_ledger_entries = self.get_stock_ledger_entries(item_list, warehouse_list)
+		
+		self.doc.stock_value_difference = 0.0
+		for d in self.entries:
+			self.doc.stock_value_difference -= get_buying_amount(d.item_code, d.warehouse, 
+				d.actual_qty, self.doc.doctype, self.doc.name, d.voucher_detail_no, 
+				stock_ledger_entries)
+		webnotes.conn.set(self.doc, "stock_value_difference", self.doc.stock_value_difference)
+		
+	def make_gl_entries(self):
+		if not cint(webnotes.defaults.get_global_default("auto_inventory_accounting")):
+			return
+		
+		if not self.doc.expense_account:
+			msgprint(_("Please enter Expense Account"), raise_exception=1)
+			
+		cost_center = "Auto Inventory Accounting - %s" % (self.company_abbr,)
+		
+		super(DocType, self).make_gl_entries(self.doc.expense_account, 		
+			self.doc.stock_value_difference, cost_center)
 		
 @webnotes.whitelist()
 def upload():
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.txt b/stock/doctype/stock_reconciliation/stock_reconciliation.txt
index 094e903..9137cae 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.txt
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.txt
@@ -1,8 +1,8 @@
 [
  {
-  "creation": "2013-01-19 10:23:35", 
+  "creation": "2013-01-22 16:50:41", 
   "docstatus": 0, 
-  "modified": "2013-01-22 14:57:24", 
+  "modified": "2013-03-18 12:48:42", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -30,6 +30,7 @@
   "permlevel": 0
  }, 
  {
+  "amend": 1, 
   "cancel": 1, 
   "create": 1, 
   "doctype": "DocPerm", 
@@ -40,6 +41,7 @@
   "permlevel": 0, 
   "read": 1, 
   "report": 1, 
+  "role": "Material Manager", 
   "submit": 1, 
   "write": 1
  }, 
@@ -81,6 +83,22 @@
  }, 
  {
   "doctype": "DocField", 
+  "fieldname": "company", 
+  "fieldtype": "Link", 
+  "label": "Company", 
+  "options": "Company", 
+  "reqd": 1
+ }, 
+ {
+  "depends_on": "eval:sys_defaults.auto_inventory_accounting", 
+  "doctype": "DocField", 
+  "fieldname": "expense_account", 
+  "fieldtype": "Link", 
+  "label": "Expense Account", 
+  "options": "Account"
+ }, 
+ {
+  "doctype": "DocField", 
   "fieldname": "col1", 
   "fieldtype": "Column Break"
  }, 
@@ -119,12 +137,14 @@
   "read_only": 1
  }, 
  {
-  "amend": 0, 
-  "doctype": "DocPerm", 
-  "role": "Material Manager"
+  "doctype": "DocField", 
+  "fieldname": "stock_value_difference", 
+  "fieldtype": "Currency", 
+  "hidden": 1, 
+  "label": "Stock Value Difference", 
+  "print_hide": 1
  }, 
  {
-  "doctype": "DocPerm", 
-  "role": "System Manager"
+  "doctype": "DocPerm"
  }
 ]
\ No newline at end of file
diff --git a/stock/doctype/stock_reconciliation/test_stock_reconciliation.py b/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
index 80579ae..cebc6ff 100644
--- a/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
+++ b/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
@@ -1,40 +1,15 @@
 # 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/>.
-
+# For license information, please see license.txt
 
 from __future__ import unicode_literals
-import unittest
-import webnotes
-from webnotes.tests import insert_test_data
+import webnotes, unittest
 from webnotes.utils import flt
 import json
-
-company = webnotes.conn.get_default("company")
+from accounts.utils import get_fiscal_year
 
 class TestStockReconciliation(unittest.TestCase):
-	def setUp(self):
-		webnotes.conn.begin()
-		self.insert_test_data()
-
-	def tearDown(self):
-		# print "Message Log:", "\n--\n".join(webnotes.message_log)
-		# print "Debug Log:", "\n--\n".join(webnotes.debug_log)
-		webnotes.conn.rollback()
-		
 	def test_reco_for_fifo(self):
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
 		# [[qty, valuation_rate, posting_date, 
 		#		posting_time, expected_stock_value, bin_qty, bin_valuation]]
 		input_data = [
@@ -53,28 +28,32 @@
 		]
 			
 		for d in input_data:
+			self.cleanup_data()
 			self.insert_existing_sle("FIFO")
-			
-			self.submit_stock_reconciliation(d[0], d[1], d[2], d[3])
+			stock_reco = self.submit_stock_reconciliation(d[0], d[1], d[2], d[3])
 		
+			# check stock value
 			res = webnotes.conn.sql("""select stock_value from `tabStock Ledger Entry`
-				where item_code = 'Android Jack D' and warehouse = 'Default Warehouse'
+				where item_code = '_Test Item' and warehouse = '_Test Warehouse'
 				and posting_date = %s and posting_time = %s order by name desc limit 1""", 
 				(d[2], d[3]))
-				
 			self.assertEqual(res and flt(res[0][0]) or 0, d[4])
 			
+			# check bin qty and stock value
 			bin = webnotes.conn.sql("""select actual_qty, stock_value from `tabBin`
-				where item_code = 'Android Jack D' and warehouse = 'Default Warehouse'""")
+				where item_code = '_Test Item' and warehouse = '_Test Warehouse'""")
 			
 			self.assertEqual(bin and [flt(bin[0][0]), flt(bin[0][1])] or [], [d[5], d[6]])
 			
+			# no gl entries
+			gl_entries = webnotes.conn.sql("""select name from `tabGL Entry` 
+				where voucher_type = 'Stock Reconciliation' and voucher_no = %s""",
+				 stock_reco.doc.name)
+			self.assertFalse(gl_entries)
 			
-			self.tearDown()
-			self.setUp()
-					
 		
 	def test_reco_for_moving_average(self):
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
 		# [[qty, valuation_rate, posting_date, 
 		#		posting_time, expected_stock_value, bin_qty, bin_valuation]]
 		input_data = [
@@ -94,95 +73,194 @@
 		]
 		
 		for d in input_data:
+			self.cleanup_data()
 			self.insert_existing_sle("Moving Average")
+			stock_reco = self.submit_stock_reconciliation(d[0], d[1], d[2], d[3])
 			
-			self.submit_stock_reconciliation(d[0], d[1], d[2], d[3])
-		
+			# check stock value in sle
 			res = webnotes.conn.sql("""select stock_value from `tabStock Ledger Entry`
-				where item_code = 'Android Jack D' and warehouse = 'Default Warehouse'
+				where item_code = '_Test Item' and warehouse = '_Test Warehouse'
 				and posting_date = %s and posting_time = %s order by name desc limit 1""", 
 				(d[2], d[3]))
 				
 			self.assertEqual(res and flt(res[0][0], 4) or 0, d[4])
 			
+			# bin qty and stock value
 			bin = webnotes.conn.sql("""select actual_qty, stock_value from `tabBin`
-				where item_code = 'Android Jack D' and warehouse = 'Default Warehouse'""")
+				where item_code = '_Test Item' and warehouse = '_Test Warehouse'""")
 			
 			self.assertEqual(bin and [flt(bin[0][0]), flt(bin[0][1], 4)] or [], 
 				[flt(d[5]), flt(d[6])])
-						
-			self.tearDown()
-			self.setUp()
+				
+			# no gl entries
+			gl_entries = webnotes.conn.sql("""select name from `tabGL Entry` 
+				where voucher_type = 'Stock Reconciliation' and voucher_no = %s""", 
+				stock_reco.doc.name)
+			self.assertFalse(gl_entries)
 			
+	def test_reco_fifo_gl_entries(self):
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 1)
+		
+		# [[qty, valuation_rate, posting_date, 
+		#		posting_time, stock_in_hand_debit]]
+		input_data = [
+			[50, 1000, "2012-12-26", "12:00", 38000], 
+			[5, 1000, "2012-12-26", "12:00", -7000], 
+			[15, 1000, "2012-12-26", "12:00", 3000], 
+			[25, 900, "2012-12-26", "12:00", 10500], 
+			[20, 500, "2012-12-26", "12:00", -2000], 
+			["", 1000, "2012-12-26", "12:05", 3000],
+			[20, "", "2012-12-26", "12:05", 4000],
+			[10, 2000, "2012-12-26", "12:10", 8000],
+			[0, "", "2012-12-26", "12:10", -12000],
+			[50, 1000, "2013-01-01", "12:00", 50000], 
+			[5, 1000, "2013-01-01", "12:00", 5000],
+			[1, 1000, "2012-12-01", "00:00", 1000],
+			
+		]
+			
+		for d in input_data:
+			self.cleanup_data()
+			self.insert_existing_sle("FIFO")
+			stock_reco = self.submit_stock_reconciliation(d[0], d[1], d[2], d[3])
+			
+			# check gl_entries
+			self.check_gl_entries(stock_reco.doc.name, d[4])
+			
+			# cancel
+			stock_reco.cancel()
+			self.check_gl_entries(stock_reco.doc.name, -d[4], True)
+		
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 0)		
+			
+	def test_reco_moving_average_gl_entries(self):
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 1)
+		
+		# [[qty, valuation_rate, posting_date, 
+		#		posting_time, stock_in_hand_debit]]
+		input_data = [
+			[50, 1000, "2012-12-26", "12:00", 36500], 
+			[5, 1000, "2012-12-26", "12:00", -8500], 
+			[15, 1000, "2012-12-26", "12:00", 1500], 
+			[25, 900, "2012-12-26", "12:00", 9000], 
+			[20, 500, "2012-12-26", "12:00", -3500], 
+			["", 1000, "2012-12-26", "12:05", 1500],
+			[20, "", "2012-12-26", "12:05", 4500],
+			[10, 2000, "2012-12-26", "12:10", 6500],
+			[0, "", "2012-12-26", "12:10", -13500],
+			[50, 1000, "2013-01-01", "12:00", 50000], 
+			[5, 1000, "2013-01-01", "12:00", 5000],
+			[1, 1000, "2012-12-01", "00:00", 1000],
+			
+		]
+			
+		for d in input_data:
+			self.cleanup_data()
+			self.insert_existing_sle("Moving Average")
+			stock_reco = self.submit_stock_reconciliation(d[0], d[1], d[2], d[3])
+			
+			# check gl_entries
+			self.check_gl_entries(stock_reco.doc.name, d[4])
+			
+			# cancel
+			stock_reco.cancel()
+			self.check_gl_entries(stock_reco.doc.name, -d[4], True)
+		
+		webnotes.defaults.set_global_default("auto_inventory_accounting", 0)
+
+
+	def cleanup_data(self):
+		webnotes.conn.sql("delete from `tabStock Ledger Entry`")
+		webnotes.conn.sql("delete from tabBin")
+						
 	def submit_stock_reconciliation(self, qty, rate, posting_date, posting_time):
-		return webnotes.bean([{
+		stock_reco = webnotes.bean([{
 			"doctype": "Stock Reconciliation",
-			"name": "RECO-001",
-			"__islocal": 1,
 			"posting_date": posting_date,
 			"posting_time": posting_time,
+			"fiscal_year": get_fiscal_year(posting_date)[0],
+			"company": "_Test Company",
+			"expense_account": "Stock Adjustment - _TC",
 			"reconciliation_json": json.dumps([
 				["Item Code", "Warehouse", "Quantity", "Valuation Rate"],
-				["Android Jack D", "Default Warehouse", qty, rate]
+				["_Test Item", "_Test Warehouse", qty, rate]
 			]),
-		}]).submit()
+		}])
+		stock_reco.insert()
+		stock_reco.submit()
+		return stock_reco
 		
-	def insert_test_data(self):
-		# 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"})
-			
-		# 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")
+	def check_gl_entries(self, voucher_no, stock_value_diff, cancel=None):
+		stock_in_hand_account = webnotes.conn.get_value("Company", "_Test Company", 
+			"stock_in_hand_account")
+		debit_amount = stock_value_diff > 0 and stock_value_diff or 0.0
+		credit_amount = stock_value_diff < 0 and abs(stock_value_diff) or 0.0
+		
+		expected_gl_entries = sorted([
+			[stock_in_hand_account, debit_amount, credit_amount],
+			["Stock Adjustment - _TC", credit_amount, debit_amount]
+		])
+		if cancel:
+			expected_gl_entries = sorted([
+				[stock_in_hand_account, debit_amount, credit_amount],
+				["Stock Adjustment - _TC", credit_amount, debit_amount],
+				[stock_in_hand_account, credit_amount, debit_amount],
+				["Stock Adjustment - _TC", debit_amount, credit_amount]
+			])
+		
+		gl_entries = webnotes.conn.sql("""select account, debit, credit
+			from `tabGL Entry` where voucher_type='Stock Reconciliation' and voucher_no=%s 
+			order by account asc, debit asc""", voucher_no, as_dict=1)
+		self.assertTrue(gl_entries)
+		
+		for i, gle in enumerate(gl_entries):
+			self.assertEquals(expected_gl_entries[i][0], gle.account)
+			self.assertEquals(expected_gl_entries[i][1], gle.debit)
+			self.assertEquals(expected_gl_entries[i][2], gle.credit)
 		
 	def insert_existing_sle(self, valuation_method):
-		webnotes.conn.set_value("Item", "Android Jack D", "valuation_method", valuation_method)
+		webnotes.conn.set_value("Item", "_Test Item", "valuation_method", valuation_method)
 		webnotes.conn.set_default("allow_negative_stock", 1)
 		
 		existing_ledgers = [
 			{
 				"doctype": "Stock Ledger Entry", "__islocal": 1,
 				"voucher_type": "Stock Entry", "voucher_no": "TEST",
-				"item_code": "Android Jack D", "warehouse": "Default Warehouse",
+				"item_code": "_Test Item", "warehouse": "_Test Warehouse",
 				"posting_date": "2012-12-12", "posting_time": "01:00",
-				"actual_qty": 20, "incoming_rate": 1000, "company": company
+				"actual_qty": 20, "incoming_rate": 1000, "company": "_Test Company"
 			},
 			{
 				"doctype": "Stock Ledger Entry", "__islocal": 1,
 				"voucher_type": "Stock Entry", "voucher_no": "TEST",
-				"item_code": "Android Jack D", "warehouse": "Default Warehouse",
+				"item_code": "_Test Item", "warehouse": "_Test Warehouse",
 				"posting_date": "2012-12-15", "posting_time": "02:00",
-				"actual_qty": 10, "incoming_rate": 700, "company": company
+				"actual_qty": 10, "incoming_rate": 700, "company": "_Test Company"
 			},
 			{
 				"doctype": "Stock Ledger Entry", "__islocal": 1,
 				"voucher_type": "Stock Entry", "voucher_no": "TEST",
-				"item_code": "Android Jack D", "warehouse": "Default Warehouse",
+				"item_code": "_Test Item", "warehouse": "_Test Warehouse",
 				"posting_date": "2012-12-25", "posting_time": "03:00",
-				"actual_qty": -15, "company": company
+				"actual_qty": -15, "company": "_Test Company"
 			},
 			{
 				"doctype": "Stock Ledger Entry", "__islocal": 1,
 				"voucher_type": "Stock Entry", "voucher_no": "TEST",
-				"item_code": "Android Jack D", "warehouse": "Default Warehouse",
+				"item_code": "_Test Item", "warehouse": "_Test Warehouse",
 				"posting_date": "2012-12-31", "posting_time": "08:00",
-				"actual_qty": -20, "company": company
+				"actual_qty": -20, "company": "_Test Company"
 			},
 			{
 				"doctype": "Stock Ledger Entry", "__islocal": 1,
 				"voucher_type": "Stock Entry", "voucher_no": "TEST",
-				"item_code": "Android Jack D", "warehouse": "Default Warehouse",
+				"item_code": "_Test Item", "warehouse": "_Test Warehouse",
 				"posting_date": "2013-01-05", "posting_time": "07:00",
-				"actual_qty": 15, "incoming_rate": 1200, "company": company
+				"actual_qty": 15, "incoming_rate": 1200, "company": "_Test Company"
 			},
 		]
 		
-		webnotes.get_obj("Stock Ledger").update_stock(existing_ledgers)
\ No newline at end of file
+		webnotes.get_obj("Stock Ledger").update_stock(existing_ledgers)
+
+		
+test_dependencies = ["Item", "Warehouse"]
\ No newline at end of file
diff --git a/stock/stock_ledger.py b/stock/stock_ledger.py
index 883ced7..d00b243 100644
--- a/stock/stock_ledger.py
+++ b/stock/stock_ledger.py
@@ -71,7 +71,7 @@
 				(qty_after_transaction * valuation_rate) or 0
 		else:
 			stock_value = sum((flt(batch[0]) * flt(batch[1]) for batch in stock_queue))
-						
+			# print sle.posting_date, sle.actual_qty, sle.incoming_rate, stock_queue, stock_value
 		# update current sle
 		webnotes.conn.sql("""update `tabStock Ledger Entry`
 			set qty_after_transaction=%s, valuation_rate=%s, stock_queue=%s,
diff --git a/stock/utils.py b/stock/utils.py
index bf5e2f9..b4d0770 100644
--- a/stock/utils.py
+++ b/stock/utils.py
@@ -165,8 +165,8 @@
 	return wlist
 
 def get_buying_amount(item_code, warehouse, qty, voucher_type, voucher_no, voucher_detail_no, 
-		stock_ledger_entries, item_sales_bom):
-	if item_sales_bom.get(item_code):
+		stock_ledger_entries, item_sales_bom=None):
+	if item_sales_bom and item_sales_bom.get(item_code):
 		# sales bom item
 		buying_amount = 0.0
 		for bom_item in item_sales_bom[item_code]:
@@ -182,13 +182,15 @@
 		stock_ledger_entries):
 	for i, sle in enumerate(stock_ledger_entries):
 		if sle.voucher_type == voucher_type and sle.voucher_no == voucher_no and \
-				len(stock_ledger_entries) > i+1:
-			if (sle.voucher_detail_no == item_row) or \
-				(sle.item_code == item_code and sle.warehouse == warehouse and \
-				abs(flt(sle.qty)) == qty):
-					buying_amount = flt(stock_ledger_entries[i+1].stock_value) - \
-						flt(sle.stock_value)
-					return buying_amount
+			(sle.voucher_detail_no == item_row or (sle.voucher_type != "Stock Reconciliation" 
+			and sle.item_code == item_code and sle.warehouse == warehouse and flt(sle.qty) == qty)):
+				# print "previous_sle", stock_ledger_entries[i+1]
+				# print "current sle", sle
+				previous_stock_value = len(stock_ledger_entries) > i+1 and \
+					flt(stock_ledger_entries[i+1].stock_value) or 0.0
+					
+				buying_amount =  previous_stock_value - flt(sle.stock_value)						
+				return buying_amount
 	return 0.0
 
 def get_sales_bom():