[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):