diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py index 640a49e186..69d396e7eb 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 @@ class StockController(AccountsController): # 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 @@ class StockController(AccountsController): 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):