[perpetual accounting] gl entry: sync stock and account balance
diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py
index 640a49e..69d396e 100644
--- a/controllers/stock_controller.py
+++ b/controllers/stock_controller.py
@@ -17,28 +17,22 @@
 from __future__ import unicode_literals
 import webnotes
 from webnotes.utils import cint, flt, cstr
+from webnotes import msgprint, _
 import webnotes.defaults
+
 from controllers.accounts_controller import AccountsController
 
 class StockController(AccountsController):
-	def get_gl_entries_for_stock(self, against_stock_account, amount=None, 
-			stock_in_hand_account=None, cost_center=None, warehouse_list=None):
-		if not cost_center:
-			cost_center = self.get_company_default("stock_adjustment_cost_center")
-			
-		acc_diff = {}
-		if warehouse_list:
-			from accounts.utils import get_stock_and_account_difference
-			acc_diff = get_stock_and_account_difference(warehouse_list)
-		elif amount and stock_in_hand_account:
-			acc_diff = {stock_in_hand_account: amount}
-
-		gl_entries = []
-		for account, amount in acc_diff.items():
-			gl_entries += [
+	def get_gl_entries_for_stock(self, against_stock_account, amount, warehouse=None, 
+			stock_in_hand_account=None, cost_center=None):
+		if not stock_in_hand_account and warehouse:
+			stock_in_hand_account = webnotes.conn.get_value("Warehouse", warehouse, "account")
+		
+		if amount:
+			gl_entries = [
 				# stock in hand account
 				self.get_gl_dict({
-					"account": account,
+					"account": stock_in_hand_account,
 					"against": against_stock_account,
 					"debit": amount,
 					"remarks": self.doc.remarks or "Accounting Entry for Stock",
@@ -47,16 +41,38 @@
 				# account against stock in hand
 				self.get_gl_dict({
 					"account": against_stock_account,
-					"against": 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),
 			]
 			
-		return gl_entries
+			return gl_entries
 			
+	def sync_stock_account_balance(self, warehouse_list, cost_center=None, posting_date=None):
+		from accounts.utils import get_stock_and_account_difference
+		acc_diff = get_stock_and_account_difference(warehouse_list)
+		
+		if not cost_center:
+			cost_center = self.get_company_default("cost_center")
+		
+		gl_entries = []
+		for account, diff in acc_diff.items():
+			if diff:
+				stock_adjustment_account = self.get_company_default("stock_adjustment_account")
+				gl_entries += self.get_gl_entries_for_stock(stock_adjustment_account, diff, 
+					stock_in_hand_account=account, cost_center=cost_center)
+					
+		if gl_entries:
+			from accounts.general_ledger import make_gl_entries
+
+			if posting_date:
+				for entries in gl_entries:
+					entries["posting_date"] = posting_date
 			
+			make_gl_entries(gl_entries)
+				
 	def get_sl_entries(self, d, args):		
 		sl_dict = {
 			"item_code": d.item_code,
@@ -84,6 +100,17 @@
 		if sl_entries:
 			from webnotes.model.code import get_obj
 			get_obj('Stock Ledger').update_stock(sl_entries, is_amended)
+			
+	def validate_warehouse_with_company(self, warehouse_list):
+		warehouse_list = list(set(filter(lambda x: x not in ["", None], warehouse_list)))
+		valid_warehouses = webnotes.conn.sql_list("""select name from `tabWarehouse` 
+			where company=%s""", self.doc.company)
+		
+		invalid_warehouses = filter(lambda x: x not in valid_warehouses, warehouse_list)
+		if invalid_warehouses:
+			print invalid_warehouses, valid_warehouses, warehouse_list
+			msgprint(_("Following warehouses not belong to the company") + ": " + 
+				self.doc.company + "\n" + "\n".join(invalid_warehouses), raise_exception=1)
 		
 	def get_stock_ledger_entries(self, item_list=None, warehouse_list=None):
 		if not (item_list and warehouse_list):