From 6d7b0ce794a9522ae9d5dac440063ae21c8f0aad Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 15 Jun 2017 11:09:27 +0530 Subject: [PATCH] Warehouse Account Linking (#9292) * [enhance] Added account in the warehouse * documentation * patch to move account head from account to warehouse * fixed test cases * Fixes in warehouse-account linking * minor fix in test case --- erpnext/accounts/doctype/account/account.json | 34 +---- erpnext/accounts/doctype/account/account.py | 41 ------ .../accounts/doctype/account/account_tree.js | 10 -- .../chart_of_accounts/chart_of_accounts.py | 2 +- .../ae_uae_chart_template_standard.json | 1 - .../verified/fr_chart_of_accounts.json | 5 +- .../in_standard_chart_of_accounts.json | 5 +- .../verified/sg_default_coa.json | 5 +- .../verified/sg_fnb_coa.json | 5 +- .../verified/standard_chart_of_accounts.py | 4 +- .../accounts/doctype/account/test_account.py | 23 ++++ .../accounts_settings/accounts_settings.py | 14 +- .../journal_entry/test_journal_entry.py | 4 +- .../mode_of_payment/mode_of_payment.py | 3 +- .../purchase_invoice/purchase_invoice.py | 8 +- .../purchase_invoice/test_purchase_invoice.py | 9 +- .../sales_invoice/test_sales_invoice.py | 7 +- erpnext/accounts/general_ledger.py | 2 +- erpnext/accounts/utils.py | 26 ++-- erpnext/controllers/accounts_controller.py | 4 +- erpnext/controllers/stock_controller.py | 36 ++---- .../company_default_inventory_account.png | Bin 0 -> 37318 bytes .../assets/img/accounts/inventory_account.png | Bin 0 -> 49575 bytes erpnext/docs/license.html | 4 +- .../perpetual-inventory.md | 27 ++-- erpnext/patches.txt | 3 +- .../v7_0/create_warehouse_nestedset.py | 3 +- .../repost_future_gle_for_purchase_invoice.py | 5 +- ...from_account_to_warehouse_for_inventory.py | 15 +++ erpnext/setup/doctype/company/company.js | 3 +- erpnext/setup/doctype/company/company.json | 40 +++++- erpnext/setup/doctype/company/company.py | 12 +- erpnext/setup/doctype/company/test_company.py | 2 +- erpnext/stock/__init__.py | 38 ++++++ .../delivery_note/test_delivery_note.py | 27 +++- .../test_landed_cost_voucher.py | 29 +++-- .../purchase_receipt/purchase_receipt.py | 10 +- .../purchase_receipt/test_purchase_receipt.py | 29 +++-- .../doctype/stock_entry/test_stock_entry.py | 47 ++++--- .../stock/doctype/warehouse/test_warehouse.py | 40 +++--- erpnext/stock/doctype/warehouse/warehouse.js | 19 +-- .../stock/doctype/warehouse/warehouse.json | 12 +- erpnext/stock/doctype/warehouse/warehouse.py | 120 +----------------- 43 files changed, 336 insertions(+), 397 deletions(-) create mode 100644 erpnext/docs/assets/img/accounts/company_default_inventory_account.png create mode 100644 erpnext/docs/assets/img/accounts/inventory_account.png create mode 100644 erpnext/patches/v8_0/move_account_head_from_account_to_warehouse_for_inventory.py diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index 3c9f2338c53..0489f9a5f08 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -1,5 +1,6 @@ { "allow_copy": 1, + "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, "beta": 0, @@ -402,35 +403,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "warehouse", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Warehouse", - "length": 0, - "no_copy": 0, - "options": "Warehouse", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -545,18 +517,18 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-money", "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-02-17 16:22:49.249075", + "modified": "2017-04-21 17:22:41.150984", "modified_by": "Administrator", "module": "Accounts", "name": "Account", diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index 189d37754fc..0787a1f5e83 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -35,7 +35,6 @@ class Account(Document): self.validate_group_or_ledger() self.set_root_and_report_type() self.validate_mandatory() - self.validate_warehouse_account() self.validate_frozen_accounts_modifier() self.validate_balance_must_be_debit_or_credit() self.validate_account_currency() @@ -162,46 +161,6 @@ class Account(Document): if not self.report_type: throw(_("Report Type is mandatory")) - def validate_warehouse_account(self): - '''If perpetual inventory is set, and warehouse is linked, - the account balance and stock balance as of now must always match. - ''' - from erpnext.accounts.utils import get_balance_on - from erpnext.stock.utils import get_stock_value_on - if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): - return - - if self.account_type == "Stock": - if self.is_group == 0 and not self.warehouse: - frappe.throw(_("Warehouse is mandatory for non group Accounts of type Stock")) - - if self.warehouse: - # company must be same - if frappe.get_value('Warehouse', self.warehouse, 'company') != self.company: - frappe.throw(_("Warehouse company must be same as Account company")) - - # balance must be same - stock_balance = get_stock_value_on(self.warehouse) - if self.is_new(): - account_balance = 0.0 - else: - account_balance = get_balance_on(self.name) - - if account_balance != stock_balance: - frappe.throw(_('Account balance ({0}) for {1} and stock value ({2}) for warehouse {3} must be same') - .format(fmt_money(account_balance, currency=self.account_currency), self.name, - fmt_money(stock_balance, currency=self.account_currency), self.warehouse)) - - elif self.warehouse: - self.warehouse = None - - def validate_warehouse(self, warehouse): - lft, rgt = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"]) - - if lft and rgt: - if frappe.db.sql_list("""select sle.name from `tabStock Ledger Entry` sle where exists (select wh.name from - tabWarehouse wh where lft >= %s and rgt <= %s and sle.warehouse = wh.name)""", (lft, rgt)): - throw(_("Stock entries exist against Warehouse {0}, hence you cannot re-assign or modify it").format(warehouse)) def update_nsm_model(self): """update lft, rgt indices for nested set model""" diff --git a/erpnext/accounts/doctype/account/account_tree.js b/erpnext/accounts/doctype/account/account_tree.js index 2cfafd1eefb..b803984183c 100644 --- a/erpnext/accounts/doctype/account/account_tree.js +++ b/erpnext/accounts/doctype/account/account_tree.js @@ -37,16 +37,6 @@ frappe.treeview_settings["Account"] = { }, {fieldtype:'Float', fieldname:'tax_rate', label:__('Tax Rate'), depends_on: 'eval:doc.is_group==0&&doc.account_type=="Tax"'}, - {fieldtype:'Link', fieldname:'warehouse', label:__('Warehouse'), options:"Warehouse", - depends_on: 'eval:(!doc.is_group&&doc.account_type=="Stock")', - get_query: function() { - return { - filters:{ - "company": frappe.treeview_settings.filters["company"] - } - } - } - }, {fieldtype:'Link', fieldname:'account_currency', label:__('Currency'), options:"Currency", description: __("Optional. Sets company's default currency, if not specified.")} ], diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py index a5c551fc8cd..adb7bc13385 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py +++ b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py @@ -117,7 +117,7 @@ def get_charts_for_country(country): def get_account_tree_from_existing_company(existing_company): all_accounts = frappe.get_all('Account', - filters={'company': existing_company, "warehouse": ""}, + filters={'company': existing_company}, fields = ["name", "account_name", "parent_account", "account_type", "is_group", "root_type", "tax_rate"], order_by="lft, rgt") diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json index 9d610dce3b0..cae4c3c9b86 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ae_uae_chart_template_standard.json @@ -88,7 +88,6 @@ "Items Delivered to Customs on temprary Base": {} }, "Stock in Hand": { - "is_group": 1, "account_type": "Stock" } }, diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_chart_of_accounts.json index 834cf3d2632..ec1281085b9 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_chart_of_accounts.json @@ -65,8 +65,9 @@ "account_type": "Fixed Asset" }, "Stock": { - "account_type": "Stock", - "is_group": 1 + "Stock in Hand": { + "account_type": "Stock" + } }, "root_type": "Asset" }, diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json index b3c789162e2..2f5dbf3a53b 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json @@ -26,8 +26,9 @@ "Earnest Money": {} }, "Stock Assets": { - "account_type": "Stock", - "is_group": 1 + "Stock in Hand": { + "account_type": "Stock" + } }, "Tax Assets": { "is_group": 1 diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/sg_default_coa.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/sg_default_coa.json index 976150f1280..594ab99984c 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/sg_default_coa.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/sg_default_coa.json @@ -40,8 +40,9 @@ "Rental Deposits": {} }, "Stock Assets": { - "is_group": 1, - "account_type": "Stock" + "Stock in Hand": { + "account_type": "Stock" + } }, "Tax Assets": { "GST-Input": {} diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/sg_fnb_coa.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/sg_fnb_coa.json index 15c2468492e..444465d5406 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/sg_fnb_coa.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/sg_fnb_coa.json @@ -40,8 +40,9 @@ "Rental Deposits": {} }, "Stock Assets": { - "account_type": "Stock", - "is_group": 1 + "Stock in Hand": { + "account_type": "Stock" + } }, "Tax Assets": { "GST-Input": {} diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py index 1a541cafc23..5452040fb6c 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py @@ -30,8 +30,10 @@ def get(): _("Earnest Money"): {} }, _("Stock Assets"): { + _("Stock In Hand"): { + "account_type": "Stock" + }, "account_type": "Stock", - "is_group": 1 }, _("Tax Assets"): { "is_group": 1 diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py index 5744721875d..c60944315e8 100644 --- a/erpnext/accounts/doctype/account/test_account.py +++ b/erpnext/accounts/doctype/account/test_account.py @@ -3,6 +3,8 @@ from __future__ import unicode_literals import frappe +from erpnext.stock import get_warehouse_account, get_company_default_inventory_account + def _make_test_records(verbose): from frappe.test_runner import make_test_objects @@ -63,3 +65,24 @@ def _make_test_records(verbose): } for account_name, parent_account, is_group, account_type, currency in accounts]) return test_objects + +def get_inventory_account(company, warehouse=None): + account = None + if warehouse: + account = get_warehouse_account(warehouse, company) + else: + account = get_company_default_inventory_account(company) + + return account + +def create_account(**kwargs): + account = frappe.get_doc(dict( + doctype = "Account", + account_name = kwargs.get('account_name'), + account_type = kwargs.get('account_type'), + parent_account = kwargs.get('parent_account'), + company = kwargs.get('company') + )) + + account.save() + return account.name diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py index 52e1b638715..42467558c89 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py @@ -20,15 +20,9 @@ class AccountsSettings(Document): company.flags.ignore_permissions = True company.save() - # Create account head for warehouses - warehouse_list = frappe.db.sql("""select name, company from tabWarehouse - where disabled=0""", as_dict=1) - warehouse_with_no_company = [d.name for d in warehouse_list if not d.company] + # validate warehouse linked to company + warehouse_with_no_company = frappe.db.sql_list("""select name from tabWarehouse + where disabled=0 and company is null or company = ''""") if warehouse_with_no_company: frappe.throw(_("Company is missing in warehouses {0}") - .format(comma_and(warehouse_with_no_company))) - - for wh in warehouse_list: - wh_doc = frappe.get_doc("Warehouse", wh.name) - wh_doc.flags.ignore_permissions = True - wh_doc.save() + .format(comma_and(warehouse_with_no_company))) \ No newline at end of file diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py index bf7261af9e3..49367abb6a5 100644 --- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import unittest, frappe from frappe.utils import flt +from erpnext.accounts.doctype.account.test_account import get_inventory_account from erpnext.exceptions import InvalidAccountCurrency @@ -83,7 +84,8 @@ class TestJournalEntry(unittest.TestCase): jv = frappe.copy_doc(test_records[0]) jv.get("accounts")[0].update({ - "account": "_Test Warehouse - _TC", + "account": get_inventory_account('_Test Company'), + "company": "_Test Company", "party_type": None, "party": None }) diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py index 36d54b6e004..fcf94ce98a9 100644 --- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py +++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py @@ -25,4 +25,5 @@ class ModeofPayment(Document): for entry in self.accounts: """Error when Company of Ledger account doesn't match with Company Selected""" if frappe.db.get_value("Account", entry.default_account, "company") != entry.company: - frappe.throw(_("Account does not match with Company")) + frappe.throw(_("Account {0} does not match with Company {1} in Mode of Account: {2}") + .format(entry.default_account, entry.company, self.name)) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 530d08a62d1..273ca22a654 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -11,7 +11,7 @@ from erpnext.controllers.buying_controller import BuyingController from erpnext.accounts.party import get_party_account, get_due_date from erpnext.accounts.utils import get_account_currency, get_fiscal_year from erpnext.stock.doctype.purchase_receipt.purchase_receipt import update_billed_amount_based_on_po -from erpnext.controllers.stock_controller import get_warehouse_account +from erpnext.stock import get_warehouse_account_map from erpnext.accounts.general_ledger import make_gl_entries, merge_similar_entries, delete_gl_entries from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt from erpnext.buying.utils import check_for_closed_status @@ -172,7 +172,7 @@ class PurchaseInvoice(BuyingController): if self.update_stock: self.validate_item_code() self.validate_warehouse() - warehouse_account = get_warehouse_account() + warehouse_account = get_warehouse_account_map() for item in self.get("items"): # in case of auto inventory accounting, @@ -185,7 +185,7 @@ class PurchaseInvoice(BuyingController): not frappe.db.get_value("Purchase Order Item", item.po_detail, "delivered_by_supplier")): if self.update_stock: - item.expense_account = warehouse_account[item.warehouse]["name"] + item.expense_account = warehouse_account[item.warehouse]["account"] else: item.expense_account = stock_not_billed_account @@ -377,7 +377,7 @@ class PurchaseInvoice(BuyingController): # item gl entries stock_items = self.get_stock_items() expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation") - warehouse_account = get_warehouse_account() + warehouse_account = get_warehouse_account_map() for item in self.get("items"): if flt(item.base_net_amount): diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index dffe72eac3a..1eadd3b7888 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -12,6 +12,7 @@ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_per test_records as pr_test_records from erpnext.exceptions import InvalidCurrency from erpnext.stock.doctype.stock_entry.test_stock_entry import get_qty_after_transaction +from erpnext.accounts.doctype.account.test_account import get_inventory_account test_dependencies = ["Item", "Cost Center"] test_ignore = ["Serial No"] @@ -357,10 +358,11 @@ class TestPurchaseInvoice(unittest.TestCase): order by account asc""", pi.name, as_dict=1) self.assertTrue(gl_entries) + stock_in_hand_account = get_inventory_account(pi.company, pi.get("items")[0].warehouse) expected_gl_entries = dict((d[0], d) for d in [ [pi.credit_to, 0.0, 250.0], - [pi.items[0].warehouse, 250.0, 0.0] + [stock_in_hand_account, 250.0, 0.0] ]) for i, gle in enumerate(gl_entries): @@ -377,12 +379,13 @@ class TestPurchaseInvoice(unittest.TestCase): sum(credit) as credit, debit_in_account_currency, credit_in_account_currency from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s group by account, voucher_no order by account asc;""", pi.name, as_dict=1) - + + stock_in_hand_account = get_inventory_account(pi.company, pi.get("items")[0].warehouse) self.assertTrue(gl_entries) expected_gl_entries = dict((d[0], d) for d in [ [pi.credit_to, 250.0, 250.0], - [pi.items[0].warehouse, 250.0, 0.0], + [stock_in_hand_account, 250.0, 0.0], ["Cash - _TC", 0.0, 250.0] ]) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 8335879554e..dde7e550df3 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -12,6 +12,7 @@ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_per from erpnext.exceptions import InvalidAccountCurrency, InvalidCurrency from erpnext.stock.doctype.serial_no.serial_no import SerialNoWarehouseError from frappe.model.naming import make_autoname +from erpnext.accounts.doctype.account.test_account import get_inventory_account class TestSalesInvoice(unittest.TestCase): def make(self): @@ -582,7 +583,7 @@ class TestSalesInvoice(unittest.TestCase): order by account asc, debit asc""", si.name, as_dict=1) self.assertTrue(gl_entries) - stock_in_hand = frappe.db.get_value("Account", {"warehouse": "_Test Warehouse - _TC"}) + stock_in_hand = get_inventory_account('_Test Company') expected_gl_entries = sorted([ [si.debit_to, 630.0, 0.0], @@ -837,11 +838,11 @@ class TestSalesInvoice(unittest.TestCase): ["incoming_rate", "stock_value_difference"]) self.assertEquals(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3))) - + stock_in_hand_account = get_inventory_account('_Test Company', si1.items[0].warehouse) # Check gl entry gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Sales Invoice", - "voucher_no": si1.name, "account": "_Test Warehouse - _TC"}, "debit") + "voucher_no": si1.name, "account": stock_in_hand_account}, "debit") self.assertEquals(gle_warehouse_amount, stock_value_difference) diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index c9345f2cafc..5541cc05f65 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -104,7 +104,7 @@ def validate_account_for_auto_accounting_for_stock(gl_map): if cint(frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock")) \ and gl_map[0].voucher_type=="Journal Entry": aii_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount - where account_type = 'Stock' and (warehouse != '' and warehouse is not null) and is_group=0""")] + where account_type = 'Stock' and is_group=0""")] for entry in gl_map: if entry.account in aii_accounts: diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 1721fa996fe..560ba4df935 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -216,7 +216,8 @@ def get_count_on(account, fieldname, date): else: dr_or_cr = "debit" if fieldname == "invoiced_amount" else "credit" cr_or_dr = "credit" if fieldname == "invoiced_amount" else "debit" - select_fields = "ifnull(sum(credit-debit),0)" if fieldname == "invoiced_amount" else "ifnull(sum(debit-credit),0)" + select_fields = "ifnull(sum(credit-debit),0)" \ + if fieldname == "invoiced_amount" else "ifnull(sum(debit-credit),0)" if ((not gle.against_voucher) or (gle.against_voucher_type in ["Sales Order", "Purchase Order"]) or (gle.against_voucher==gle.voucher_no and gle.get(dr_or_cr) > 0)): @@ -224,8 +225,10 @@ def get_count_on(account, fieldname, date): SELECT {0} FROM `tabGL Entry` gle WHERE docstatus < 2 and posting_date <= %(date)s and against_voucher = %(voucher_no)s - and party = %(party)s and name != %(name)s""".format(select_fields), - {"date": date, "voucher_no": gle.voucher_no, "party": gle.party, "name": gle.name})[0][0] + and party = %(party)s and name != %(name)s""" + .format(select_fields), + {"date": date, "voucher_no": gle.voucher_no, + "party": gle.party, "name": gle.name})[0][0] outstanding_amount = flt(gle.get(dr_or_cr)) - flt(gle.get(cr_or_dr)) - payment_amount currency_precision = get_currency_precision() or 2 @@ -519,20 +522,19 @@ def fix_total_debit_credit(): def get_stock_and_account_difference(account_list=None, posting_date=None): from erpnext.stock.utils import get_stock_value_on + from erpnext.stock import get_warehouse_account_map if not posting_date: posting_date = nowdate() difference = {} + warehouse_account = get_warehouse_account_map() - account_warehouse = dict(frappe.db.sql("""select name, warehouse from tabAccount - where account_type = 'Stock' and (warehouse is not null and warehouse != '') and is_group=0 - and name in (%s)""" % ', '.join(['%s']*len(account_list)), account_list)) - - for account, warehouse in account_warehouse.items(): - account_balance = get_balance_on(account, posting_date, in_account_currency=False) - stock_value = get_stock_value_on(warehouse, posting_date) - if abs(flt(stock_value) - flt(account_balance)) > 0.005: - difference.setdefault(account, flt(stock_value) - flt(account_balance)) + for warehouse, account_data in warehouse_account.items(): + if account_data.get('account') in account_list: + account_balance = get_balance_on(account_data.get('account'), posting_date, in_account_currency=False) + stock_value = get_stock_value_on(warehouse, posting_date) + if abs(flt(stock_value) - flt(account_balance)) > 0.005: + difference.setdefault(account, flt(stock_value) - flt(account_balance)) return difference diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 3a3e873eae8..ba38b1fedb0 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -274,7 +274,9 @@ class AccountsController(TransactionBase): if not account_currency: account_currency = get_account_currency(gl_dict.account) - if self.doctype not in ["Journal Entry", "Period Closing Voucher", "Payment Entry"]: + if gl_dict.account and self.doctype not in ["Journal Entry", + "Period Closing Voucher", "Payment Entry"]: + self.validate_account_currency(gl_dict.account, account_currency) set_balance_in_account_currency(gl_dict, account_currency, self.get("conversion_rate"), self.company_currency) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 3649cc119d1..822712fa4da 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -10,6 +10,7 @@ from erpnext.accounts.utils import get_fiscal_year from erpnext.accounts.general_ledger import make_gl_entries, delete_gl_entries, process_gl_map from erpnext.controllers.accounts_controller import AccountsController from erpnext.stock.stock_ledger import get_valuation_rate +from erpnext.stock import get_warehouse_account_map class StockController(AccountsController): def validate(self): @@ -21,7 +22,7 @@ class StockController(AccountsController): delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): - warehouse_account = get_warehouse_account() + warehouse_account = get_warehouse_account_map() if self.docstatus==1: if not gl_entries: @@ -37,7 +38,7 @@ class StockController(AccountsController): default_cost_center=None): if not warehouse_account: - warehouse_account = get_warehouse_account() + warehouse_account = get_warehouse_account_map() sle_map = self.get_stock_ledger_details() voucher_details = self.get_voucher_details(default_expense_account, default_cost_center, sle_map) @@ -66,7 +67,7 @@ class StockController(AccountsController): sle = self.update_stock_ledger_entries(sle) gl_list.append(self.get_gl_dict({ - "account": warehouse_account[sle.warehouse]["name"], + "account": warehouse_account[sle.warehouse]["account"], "against": item_row.expense_account, "cost_center": item_row.cost_center, "remarks": self.get("remarks") or "Accounting Entry for Stock", @@ -76,7 +77,7 @@ class StockController(AccountsController): # to target warehouse / expense account gl_list.append(self.get_gl_dict({ "account": item_row.expense_account, - "against": warehouse_account[sle.warehouse]["name"], + "against": warehouse_account[sle.warehouse]["account"], "cost_center": item_row.cost_center, "remarks": self.get("remarks") or "Accounting Entry for Stock", "credit": flt(sle.stock_value_difference, 2), @@ -88,10 +89,7 @@ class StockController(AccountsController): if warehouse_with_no_account: for wh in warehouse_with_no_account: if frappe.db.get_value("Warehouse", wh, "company"): - frappe.throw(_("Warehouse {0} is not linked to any account, please create/link the corresponding (Asset) account for the warehouse.").format(wh)) - - msgprint(_("No accounting entries for the following warehouses") + ": \n" + - "\n".join(warehouse_with_no_account)) + frappe.throw(_("Warehouse {0} is not linked to any account, please mention the account in the warehouse record or set default inventory account in company {1}.").format(wh, self.company)) return process_gl_map(gl_list) @@ -341,7 +339,7 @@ def update_gl_entries_after(posting_date, posting_time, for_warehouses=None, for where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no)) if not warehouse_account: - warehouse_account = get_warehouse_account() + warehouse_account = get_warehouse_account_map() future_stock_vouchers = get_future_stock_vouchers(posting_date, posting_time, for_warehouses, for_items) gle = get_voucherwise_gl_entries(future_stock_vouchers, posting_date) @@ -405,22 +403,4 @@ def get_voucherwise_gl_entries(future_stock_vouchers, posting_date): tuple([posting_date] + [d[1] for d in future_stock_vouchers]), as_dict=1): gl_entries.setdefault((d.voucher_type, d.voucher_no), []).append(d) - return gl_entries - -def get_warehouse_account(): - if not frappe.flags.warehouse_account_map or frappe.flags.in_test: - warehouse_account = frappe._dict() - - for d in frappe.db.sql("""select - warehouse, name, account_currency - from - tabAccount - where - account_type = 'Stock' - and (warehouse is not null and warehouse != '') - and is_group=0 """, as_dict=1): - warehouse_account.setdefault(d.warehouse, d) - - frappe.flags.warehouse_account_map = warehouse_account - - return frappe.flags.warehouse_account_map + return gl_entries \ No newline at end of file diff --git a/erpnext/docs/assets/img/accounts/company_default_inventory_account.png b/erpnext/docs/assets/img/accounts/company_default_inventory_account.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce2867c353849a72e15f7ff36a49ebd84243a5f GIT binary patch literal 37318 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%0D%iDA0~)fcDr?y17)} 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 My85}Sb4q9e04pbM#{d8T literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/accounts/inventory_account.png b/erpnext/docs/assets/img/accounts/inventory_account.png new file mode 100644 index 0000000000000000000000000000000000000000..e085f5ba83053b6aa3c39e2749e853e0b24df5c9 GIT binary patch literal 49575 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 RJVyReRnod!q-YWH{{T|fAuj*` literal 0 HcmV?d00001 diff --git a/erpnext/docs/license.html b/erpnext/docs/license.html index 4740c5c1455..1d50b78b305 100644 --- a/erpnext/docs/license.html +++ b/erpnext/docs/license.html @@ -640,8 +640,8 @@ attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

-
    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
+
    <one line="" to="" give="" the="" program's="" name="" and="" a="" brief="" idea="" of="" what="" it="" does.="">
+    Copyright (C) <year>  <name of="" author="">
 
     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
diff --git a/erpnext/docs/user/manual/en/stock/accounting-of-inventory-stock/perpetual-inventory.md b/erpnext/docs/user/manual/en/stock/accounting-of-inventory-stock/perpetual-inventory.md
index 84fe5451745..02fb1b9bf21 100644
--- a/erpnext/docs/user/manual/en/stock/accounting-of-inventory-stock/perpetual-inventory.md
+++ b/erpnext/docs/user/manual/en/stock/accounting-of-inventory-stock/perpetual-inventory.md
@@ -6,21 +6,28 @@ On receipt of items in a particular warehouse, the balance in the Warehouse Acco
 
 ##Activation
 
-  1. Setup the following default accounts for each Company. These accounts are created automatically in the new ERPNext accounts.
-
-    * Stock Received But Not Billed
-    * Stock Adjustment Account
-    * Expenses Included In Valuation
-    * Cost Center
-	
-  2. Ensure each Warehouse is an Account in the Chart of Accounts master. As per the default configuration, Accounts for Warehouse are created under `Assets > Current Asset > Stock Assets > (Warehouse)`
-
-  3. Activate Perpetual Inventory
+  * Activate Perpetual Inventory
 
 	 > Explore > Accounts > Accounts Settings > "Make Accounting Entry For Every Stock Movement"
 
 Perpetual Inventory
 
+  * Setup the following default accounts for each Company. These accounts are created automatically in the new ERPNext accounts.
+
+	* Default Inventory Account
+    * Stock Received But Not Billed
+    * Stock Adjustment Account
+    * Expenses Included In Valuation
+    * Cost Center
+
+Perpetual Inventory
+
+  * If user wants to set an individual account for each warehouse, create account head for each account under `Assets > Current Asset > Stock Assets > (Warehouse)` and set it on the respective warehouse under field 'Account'.
+
+Perpetual Inventory
+
+  * For stock transactions, general ledger entries made against the account head set on the warehouse, if user had not set the account for the warhouse then system gets the account head from the parent warehouse. If account had not set for parent warehouse then system gets the account(Default Inventory Account) from the company master.
+
 * * *
 
 ##Example
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index fbd04a141a8..8680fc124cc 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -8,7 +8,7 @@ erpnext.patches.v4_0.apply_user_permissions
 erpnext.patches.v4_0.move_warehouse_user_to_restrictions
 erpnext.patches.v4_0.global_defaults_to_system_settings
 erpnext.patches.v4_0.update_incharge_name_to_sales_person_in_maintenance_schedule
-execute:frappe.reload_doc('stock', 'doctype', 'warehouse')
+execute:frappe.reload_doc('stock', 'doctype', 'warehouse') # 2017-04-24
 execute:frappe.reload_doc('accounts', 'doctype', 'sales_invoice') # 2016-08-31
 execute:frappe.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-29
 execute:frappe.reload_doc('selling', 'doctype', 'quotation') # 2014-01-29
@@ -401,3 +401,4 @@ erpnext.patches.v8_0.delete_schools_depricated_doctypes
 erpnext.patches.v8_0.update_customer_pos_id
 erpnext.patches.v8_0.rename_items_in_status_field_of_material_request
 erpnext.patches.v8_0.delete_bin_indexes
+erpnext.patches.v8_0.move_account_head_from_account_to_warehouse_for_inventory
diff --git a/erpnext/patches/v7_0/create_warehouse_nestedset.py b/erpnext/patches/v7_0/create_warehouse_nestedset.py
index 8ae86f7f27b..8c52c3ea3d6 100644
--- a/erpnext/patches/v7_0/create_warehouse_nestedset.py
+++ b/erpnext/patches/v7_0/create_warehouse_nestedset.py
@@ -90,8 +90,7 @@ def create_default_warehouse_group(company=None, stock_account_group=None, ignor
 		"warehouse_name": _("All Warehouses"),
 		"is_group": 1,
 		"company": company.name if company else "",
-		"parent_warehouse": "",
-		"create_account_under": stock_account_group
+		"parent_warehouse": ""
 	})
 
 	if ignore_mandatory:
diff --git a/erpnext/patches/v7_0/repost_future_gle_for_purchase_invoice.py b/erpnext/patches/v7_0/repost_future_gle_for_purchase_invoice.py
index f0874a18cd6..f5aee1558ab 100644
--- a/erpnext/patches/v7_0/repost_future_gle_for_purchase_invoice.py
+++ b/erpnext/patches/v7_0/repost_future_gle_for_purchase_invoice.py
@@ -4,7 +4,8 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import cint
-from erpnext.controllers.stock_controller import get_warehouse_account, update_gl_entries_after
+from erpnext.stock import get_warehouse_account_map
+from erpnext.controllers.stock_controller import update_gl_entries_after
 
 def execute():
 	if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
@@ -13,7 +14,7 @@ def execute():
 	frappe.reload_doc('accounts', 'doctype', 'sales_invoice')
 	
 	frappe.reload_doctype("Purchase Invoice")	
-	wh_account = get_warehouse_account()
+	wh_account = get_warehouse_account_map()
 	
 	for pi in frappe.get_all("Purchase Invoice", filters={"docstatus": 1, "update_stock": 1}):
 		pi_doc = frappe.get_doc("Purchase Invoice", pi.name)
diff --git a/erpnext/patches/v8_0/move_account_head_from_account_to_warehouse_for_inventory.py b/erpnext/patches/v8_0/move_account_head_from_account_to_warehouse_for_inventory.py
new file mode 100644
index 00000000000..09fbd76523a
--- /dev/null
+++ b/erpnext/patches/v8_0/move_account_head_from_account_to_warehouse_for_inventory.py
@@ -0,0 +1,15 @@
+# Copyright (c) 2017, Frappe and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+	frappe.reload_doctype("Warehouse")
+	frappe.db.sql("""
+		update 
+			`tabWarehouse` 
+		set 
+			account = (select name from `tabAccount` 
+				where account_type = 'Stock' and 
+				warehouse = `tabWarehouse`.name and is_group = 0)""")
\ No newline at end of file
diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js
index 9e8bbe5698f..0c55ec4c391 100644
--- a/erpnext/setup/doctype/company/company.js
+++ b/erpnext/setup/doctype/company/company.js
@@ -15,7 +15,7 @@ frappe.ui.form.on("Company", {
 
 		frm.toggle_display('address_html', !frm.doc.__islocal);
 		if(!frm.doc.__islocal) {
-			frappe.geo.render_address_and_contact(frm);
+			frappe.contacts.render_address_and_contact(frm);
 
 			frm.toggle_enable("default_currency", (frm.doc.__onload &&
 				!frm.doc.__onload.transactions_exist));
@@ -148,6 +148,7 @@ erpnext.company.setup_queries = function(frm) {
 			{"root_type": "Asset", "account_type": "Accumulated Depreciation"}],
 		["depreciation_expense_account", {"root_type": "Expense", "account_type": "Depreciation"}],
 		["disposal_account", {"report_type": "Profit and Loss"}],
+		["default_inventory_account", {"account_type": "Stock"}],
 		["cost_center", {}],
 		["round_off_cost_center", {}],
 		["depreciation_cost_center", {}]
diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json
index c5e8c5c7023..cd11057624e 100644
--- a/erpnext/setup/doctype/company/company.json
+++ b/erpnext/setup/doctype/company/company.json
@@ -1128,20 +1128,21 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "fieldname": "stock_received_but_not_billed", 
+   "fieldname": "default_inventory_account", 
    "fieldtype": "Link", 
    "hidden": 0, 
-   "ignore_user_permissions": 1, 
+   "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
-   "label": "Stock Received But Not Billed", 
+   "label": "Default Inventory Account", 
    "length": 0, 
-   "no_copy": 1, 
+   "no_copy": 0, 
    "options": "Account", 
    "permlevel": 0, 
+   "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
    "read_only": 0, 
@@ -1213,6 +1214,35 @@
   }, 
   {
    "allow_bulk_edit": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "stock_received_but_not_billed", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 1, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Stock Received But Not Billed", 
+   "length": 0, 
+   "no_copy": 1, 
+   "options": "Account", 
+   "permlevel": 0, 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
@@ -1747,7 +1777,7 @@
  "istable": 0, 
  "max_attachments": 0, 
  "menu_index": 0, 
- "modified": "2017-05-09 11:06:33.629948", 
+ "modified": "2017-06-14 11:06:33.629948", 
  "modified_by": "Administrator", 
  "module": "Setup", 
  "name": "Company", 
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index d7aa7184914..0ddadf0ba69 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -50,9 +50,11 @@ class Company(Document):
 			frappe.throw(_("Abbreviation already used for another company"))
 
 	def validate_default_accounts(self):
-		for field in ["default_bank_account", "default_cash_account", "default_receivable_account", "default_payable_account",
-			"default_expense_account", "default_income_account", "stock_received_but_not_billed",
-			"stock_adjustment_account", "expenses_included_in_valuation", "default_payroll_payable_account"]:
+		for field in ["default_bank_account", "default_cash_account", 
+			"default_receivable_account", "default_payable_account", 
+			"default_expense_account", "default_income_account", 
+			"stock_received_but_not_billed", "stock_adjustment_account", 
+			"expenses_included_in_valuation", "default_payroll_payable_account"]:
 				if self.get(field):
 					for_company = frappe.db.get_value("Account", self.get(field), "company")
 					if for_company != self.name:
@@ -111,8 +113,7 @@ class Company(Document):
 						"is_group": wh_detail["is_group"],
 						"company": self.name,
 						"parent_warehouse": "{0} - {1}".format(_("All Warehouses"), self.abbr) \
-							if not wh_detail["is_group"] else "",
-						"create_account_under": stock_group
+							if not wh_detail["is_group"] else ""
 					})
 					warehouse.flags.ignore_permissions = True
 					warehouse.insert()
@@ -147,6 +148,7 @@ class Company(Document):
 
 		if cint(frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock")):
 			self._set_default_account("stock_received_but_not_billed", "Stock Received But Not Billed")
+			self._set_default_account("default_inventory_account", "Stock")
 			self._set_default_account("stock_adjustment_account", "Stock Adjustment")
 			self._set_default_account("expenses_included_in_valuation", "Expenses Included In Valuation")
 			self._set_default_account("default_expense_account", "Cost of Goods Sold")
diff --git a/erpnext/setup/doctype/company/test_company.py b/erpnext/setup/doctype/company/test_company.py
index 4b864c4ca16..7f23bf13ebb 100644
--- a/erpnext/setup/doctype/company/test_company.py
+++ b/erpnext/setup/doctype/company/test_company.py
@@ -74,7 +74,7 @@ class TestCompany(unittest.TestCase):
 							"company": template,
 							"account_type": account_type
 						}
-						if account_type in ["Bank", "Cash", "Stock"]:
+						if account_type in ["Bank", "Cash"]:
 							filters["is_group"] = 1
 
 						self.assertTrue(frappe.get_all("Account", filters))
diff --git a/erpnext/stock/__init__.py b/erpnext/stock/__init__.py
index eb5c5d937f6..e4474151f6b 100644
--- a/erpnext/stock/__init__.py
+++ b/erpnext/stock/__init__.py
@@ -1,4 +1,6 @@
 from __future__ import unicode_literals
+import frappe
+
 install_docs = [
 	{"doctype":"Role", "role_name":"Stock Manager", "name":"Stock Manager"},
 	{"doctype":"Role", "role_name":"Item Manager", "name":"Item Manager"},
@@ -8,3 +10,39 @@ install_docs = [
 	{"doctype":"Item Group", "item_group_name":"Default", 
 		"parent_item_group":"All Item Groups", "is_group": 0},
 ]
+
+def get_warehouse_account_map():
+	if not frappe.flags.warehouse_account_map or frappe.flags.in_test:
+		warehouse_account = frappe._dict()
+
+		for d in frappe.get_all('Warehouse', filters = {"is_group": 0},
+			fields = ["name", "account", "parent_warehouse", "company"]):
+			if not d.account:
+				d.account = get_warehouse_account(d.name, d.company)
+
+			if d.account:
+				d.account_currency = frappe.db.get_value('Account', d.account, 'account_currency')
+				warehouse_account.setdefault(d.name, d)
+			
+		frappe.flags.warehouse_account_map = warehouse_account
+	return frappe.flags.warehouse_account_map
+
+def get_warehouse_account(warehouse, company):
+	lft, rgt = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"])
+	account = frappe.db.sql("""
+		select
+			account from `tabWarehouse`
+		where
+			lft <= %s and rgt >= %s and company = %s
+			and account is not null and ifnull(account, '') !=''
+		order by lft desc limit 1""", (lft, rgt, company), as_list=1)
+
+	account = account[0][0] if account else None
+	
+	if not account:
+		account = get_company_default_inventory_account(company)
+	
+	return account
+	
+def get_company_default_inventory_account(company):
+	return frappe.db.get_value('Company', company, 'default_inventory_account')
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
index fdb6ac93bd0..4a1c08af67a 100644
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
@@ -19,8 +19,19 @@ from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos, SerialNoWa
 from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation \
 	import create_stock_reconciliation, set_valuation_method
 from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order, create_dn_against_so
+from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account
 
 class TestDeliveryNote(unittest.TestCase):
+	def tearDown(self):
+		target_warehouse = "_Test Warehouse 1 - _TC"
+		company = "_Test Company"
+		if not frappe.db.exists("Account", target_warehouse):
+			parent_account = frappe.db.get_value('Account', 
+				{'company': company, 'is_group':1, 'account_type': 'Stock'},'name')
+			account = create_account(account_name="_Test Warehouse 1", \
+				account_type="Stock", parent_account= parent_account, company=company)
+			frappe.db.set_value('Warehouse', target_warehouse, 'account', account)
+
 	def test_over_billing_against_dn(self):
 		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
 
@@ -63,7 +74,7 @@ class TestDeliveryNote(unittest.TestCase):
 
 		make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100)
 
-		stock_in_hand_account = frappe.db.get_value("Account", {"warehouse": "_Test Warehouse - _TC"})
+		stock_in_hand_account = get_inventory_account('_Test Company')
 		prev_bal = get_balance_on(stock_in_hand_account)
 
 		dn = create_delivery_note()
@@ -113,7 +124,7 @@ class TestDeliveryNote(unittest.TestCase):
 		make_stock_entry(item_code="_Test Item Home Desktop 100",
 			target="_Test Warehouse - _TC", qty=10, basic_rate=100)
 
-		stock_in_hand_account = frappe.db.get_value("Account", {"warehouse": "_Test Warehouse - _TC"})
+		stock_in_hand_account = get_inventory_account('_Test Company')
 		prev_bal = get_balance_on(stock_in_hand_account)
 
 		dn = create_delivery_note(item_code="_Test Product Bundle Item")
@@ -212,9 +223,10 @@ class TestDeliveryNote(unittest.TestCase):
 			["incoming_rate", "stock_value_difference"])
 
 		self.assertEquals(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3)))
+		stock_in_hand_account = get_inventory_account('_Test Company', dn1.items[0].warehouse)
 
 		gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn1.name, "account": "_Test Warehouse - _TC"}, "debit")
+			"voucher_no": dn1.name, "account": stock_in_hand_account}, "debit")
 
 		self.assertEquals(gle_warehouse_amount, stock_value_difference)
 
@@ -250,10 +262,11 @@ class TestDeliveryNote(unittest.TestCase):
 			["incoming_rate", "stock_value_difference"])
 
 		self.assertEquals(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3)))
+		stock_in_hand_account = get_inventory_account('_Test Company', dn1.items[0].warehouse)
 
 		# Check gl entry for warehouse
 		gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn1.name, "account": "_Test Warehouse - _TC"}, "debit")
+			"voucher_no": dn1.name, "account": stock_in_hand_account}, "debit")
 
 		self.assertEquals(gle_warehouse_amount, stock_value_difference)
 
@@ -282,10 +295,11 @@ class TestDeliveryNote(unittest.TestCase):
 			["incoming_rate", "stock_value_difference"])
 
 		self.assertEquals(incoming_rate, 100)
+		stock_in_hand_account = get_inventory_account('_Test Company', dn1.items[0].warehouse)
 
 		# Check gl entry for warehouse
 		gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note",
-			"voucher_no": dn1.name, "account": "_Test Warehouse - _TC"}, "debit")
+			"voucher_no": dn1.name, "account": stock_in_hand_account}, "debit")
 
 		self.assertEquals(gle_warehouse_amount, 1400)
 
@@ -339,7 +353,6 @@ class TestDeliveryNote(unittest.TestCase):
 				target=warehouse, qty=100, rate=100)
 
 		opening_qty_test_warehouse_1 = get_qty_after_transaction(warehouse="_Test Warehouse 1 - _TC")
-
 		dn = create_delivery_note(item_code="_Test Product Bundle Item",
 			qty=5, rate=500, target_warehouse="_Test Warehouse 1 - _TC", do_not_submit=True)
 
@@ -390,7 +403,7 @@ class TestDeliveryNote(unittest.TestCase):
 			and warehouse='_Test Warehouse - _TC'""", dn.name)[0][0])
 
 		expected_values = {
-			"_Test Warehouse - _TC": [0.0, stock_value_difference],
+			"Stock In Hand - _TC": [0.0, stock_value_difference],
 			"_Test Warehouse 1 - _TC": [stock_value_difference, 0.0]
 		}
 		for i, gle in enumerate(gl_entries):
diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
index eb8f8b84f0a..bad3bacd5d0 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
@@ -9,6 +9,7 @@ from frappe.utils import flt
 from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt \
 	import set_perpetual_inventory, get_gl_entries, test_records as pr_test_records, make_purchase_receipt
 from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
+from erpnext.accounts.doctype.account.test_account import get_inventory_account
 
 class TestLandedCostVoucher(unittest.TestCase):
 	def test_landed_cost_voucher(self):
@@ -46,16 +47,23 @@ class TestLandedCostVoucher(unittest.TestCase):
 
 		self.assertTrue(gl_entries)
 
-		stock_in_hand_account = pr.get("items")[0].warehouse
-		fixed_asset_account = pr.get("items")[1].warehouse
+		stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse)
+		fixed_asset_account = get_inventory_account(pr.company, pr.get("items")[1].warehouse)  
 
-
-		expected_values = {
-			stock_in_hand_account: [400.0, 0.0],
-			fixed_asset_account: [400.0, 0.0],
-			"Stock Received But Not Billed - _TC": [0.0, 500.0],
-			"Expenses Included In Valuation - _TC": [0.0, 300.0]
-		}
+		if stock_in_hand_account == fixed_asset_account:
+			expected_values = {
+				stock_in_hand_account: [800.0, 0.0],
+				"Stock Received But Not Billed - _TC": [0.0, 500.0],
+				"Expenses Included In Valuation - _TC": [0.0, 300.0]
+			}
+			
+		else:
+			expected_values = {
+				stock_in_hand_account: [400.0, 0.0],
+				fixed_asset_account: [400.0, 0.0],
+				"Stock Received But Not Billed - _TC": [0.0, 500.0],
+				"Expenses Included In Valuation - _TC": [0.0, 300.0]
+			}
 
 		for gle in gl_entries:
 			self.assertEquals(expected_values[gle.account][0], gle.debit)
@@ -99,9 +107,10 @@ class TestLandedCostVoucher(unittest.TestCase):
 		gl_entries = get_gl_entries("Purchase Invoice", pi.name)
 
 		self.assertTrue(gl_entries)
+		stock_in_hand_account = get_inventory_account(pi.company, pi.get("items")[0].warehouse)
 
 		expected_values = {
-			pi.get("items")[0].warehouse: [300.0, 0.0],
+			stock_in_hand_account: [300.0, 0.0],
 			"Creditors - _TC": [0.0, 250.0],
 			"Expenses Included In Valuation - _TC": [0.0, 50.0]
 		}
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index c11965e2560..647eb67a45b 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -189,7 +189,7 @@ class PurchaseReceipt(BuyingController):
 					if not stock_value_diff:
 						continue
 					gl_entries.append(self.get_gl_dict({
-						"account": warehouse_account[d.warehouse]["name"],
+						"account": warehouse_account[d.warehouse]["account"],
 						"against": stock_rbnb,
 						"cost_center": d.cost_center,
 						"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
@@ -200,7 +200,7 @@ class PurchaseReceipt(BuyingController):
 					stock_rbnb_currency = get_account_currency(stock_rbnb)
 					gl_entries.append(self.get_gl_dict({
 						"account": stock_rbnb,
-						"against": warehouse_account[d.warehouse]["name"],
+						"against": warehouse_account[d.warehouse]["account"],
 						"cost_center": d.cost_center,
 						"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
 						"credit": flt(d.base_net_amount, d.precision("base_net_amount")),
@@ -214,7 +214,7 @@ class PurchaseReceipt(BuyingController):
 					if flt(d.landed_cost_voucher_amount):
 						gl_entries.append(self.get_gl_dict({
 							"account": expenses_included_in_valuation,
-							"against": warehouse_account[d.warehouse]["name"],
+							"against": warehouse_account[d.warehouse]["account"],
 							"cost_center": d.cost_center,
 							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
 							"credit": flt(d.landed_cost_voucher_amount),
@@ -225,7 +225,7 @@ class PurchaseReceipt(BuyingController):
 					if flt(d.rm_supp_cost) and warehouse_account.get(self.supplier_warehouse):
 						gl_entries.append(self.get_gl_dict({
 							"account": warehouse_account[self.supplier_warehouse]["name"],
-							"against": warehouse_account[d.warehouse]["name"],
+							"against": warehouse_account[d.warehouse]["account"],
 							"cost_center": d.cost_center,
 							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
 							"credit": flt(d.rm_supp_cost)
@@ -246,7 +246,7 @@ class PurchaseReceipt(BuyingController):
 
 						gl_entries.append(self.get_gl_dict({
 							"account": loss_account,
-							"against": warehouse_account[d.warehouse]["name"],
+							"against": warehouse_account[d.warehouse]["account"],
 							"cost_center": d.cost_center,
 							"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
 							"debit": divisional_loss,
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 7fe2722bae3..4ea0add97da 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -9,6 +9,7 @@ import frappe.defaults
 from frappe.utils import cint, flt, cstr, today
 from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice
 from erpnext import set_perpetual_inventory
+from erpnext.accounts.doctype.account.test_account import get_inventory_account
 
 class TestPurchaseReceipt(unittest.TestCase):
 	def setUp(self):
@@ -59,17 +60,22 @@ class TestPurchaseReceipt(unittest.TestCase):
 
 		self.assertTrue(gl_entries)
 
-		stock_in_hand_account = frappe.db.get_value("Account",
-			{"warehouse": pr.get("items")[0].warehouse})
-		fixed_asset_account = frappe.db.get_value("Account",
-			{"warehouse": pr.get("items")[1].warehouse})
+		stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse)
+		fixed_asset_account = get_inventory_account(pr.company, pr.get("items")[1].warehouse)
 
-		expected_values = {
-			stock_in_hand_account: [375.0, 0.0],
-			fixed_asset_account: [375.0, 0.0],
-			"Stock Received But Not Billed - _TC": [0.0, 500.0],
-			"Expenses Included In Valuation - _TC": [0.0, 250.0]
-		}
+		if stock_in_hand_account == fixed_asset_account:
+			expected_values = {
+				stock_in_hand_account: [750.0, 0.0],
+				"Stock Received But Not Billed - _TC": [0.0, 500.0],
+				"Expenses Included In Valuation - _TC": [0.0, 250.0]
+			}
+		else:
+			expected_values = {
+				stock_in_hand_account: [375.0, 0.0],
+				fixed_asset_account: [375.0, 0.0],
+				"Stock Received But Not Billed - _TC": [0.0, 500.0],
+				"Expenses Included In Valuation - _TC": [0.0, 250.0]
+			}
 
 		for gle in gl_entries:
 			self.assertEquals(expected_values[gle.account][0], gle.debit)
@@ -141,9 +147,10 @@ class TestPurchaseReceipt(unittest.TestCase):
 		gl_entries = get_gl_entries("Purchase Receipt", return_pr.name)
 
 		self.assertTrue(gl_entries)
+		stock_in_hand_account = get_inventory_account(return_pr.company)
 
 		expected_values = {
-			"_Test Warehouse - _TC": [0.0, 100.0],
+			stock_in_hand_account: [0.0, 100.0],
 			"Stock Received But Not Billed - _TC": [100.0, 0.0],
 		}
 
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index b16dee940dc..2451a9b2c98 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -13,6 +13,7 @@ from erpnext.stock.stock_ledger import get_previous_sle
 from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import create_stock_reconciliation
 from frappe.tests.test_permissions import set_user_permission_doctypes
 from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
+from erpnext.accounts.doctype.account.test_account import get_inventory_account
 
 def get_sle(**args):
 	condition, values = "", []
@@ -127,9 +128,7 @@ class TestStockEntry(unittest.TestCase):
 		mr = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC",
 			qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC")
 
-		stock_in_hand_account = frappe.db.get_value("Account", {"account_type": "Stock",
-			"warehouse": mr.get("items")[0].t_warehouse})
-
+		stock_in_hand_account = get_inventory_account(mr.company, mr.get("items")[0].t_warehouse)
 		self.check_stock_ledger_entries("Stock Entry", mr.name,
 			[["_Test Item", "_Test Warehouse - _TC", 50.0]])
 
@@ -160,9 +159,7 @@ class TestStockEntry(unittest.TestCase):
 		self.check_stock_ledger_entries("Stock Entry", mi.name,
 			[["_Test Item", "_Test Warehouse - _TC", -40.0]])
 
-		stock_in_hand_account = frappe.db.get_value("Account", {"account_type": "Stock",
-			"warehouse": "_Test Warehouse - _TC"})
-
+		stock_in_hand_account = get_inventory_account(mi.company, "_Test Warehouse - _TC")
 		stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
 			"voucher_no": mi.name}, "stock_value_difference"))
 
@@ -192,21 +189,25 @@ class TestStockEntry(unittest.TestCase):
 		self.check_stock_ledger_entries("Stock Entry", mtn.name,
 			[["_Test Item", "_Test Warehouse - _TC", -45.0], ["_Test Item", "_Test Warehouse 1 - _TC", 45.0]])
 
-		stock_in_hand_account = frappe.db.get_value("Account", {"account_type": "Stock",
-			"warehouse": mtn.get("items")[0].s_warehouse})
-
-		fixed_asset_account = frappe.db.get_value("Account", {"account_type": "Stock",
-			"warehouse": mtn.get("items")[0].t_warehouse})
-
-		stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
-			"voucher_no": mtn.name, "warehouse": "_Test Warehouse - _TC"}, "stock_value_difference"))
-
-		self.check_gl_entries("Stock Entry", mtn.name,
-			sorted([
-				[stock_in_hand_account, 0.0, stock_value_diff],
-				[fixed_asset_account, stock_value_diff, 0.0],
-			])
-		)
+		stock_in_hand_account = get_inventory_account(mtn.company, mtn.get("items")[0].s_warehouse)
+		
+		fixed_asset_account = get_inventory_account(mtn.company, mtn.get("items")[0].t_warehouse)
+			
+		if stock_in_hand_account == fixed_asset_account:
+			# no gl entry as both source and target warehouse has linked to same account.
+			self.assertFalse(frappe.db.sql("""select * from `tabGL Entry`
+				where voucher_type='Stock Entry' and voucher_no=%s""", mtn.name))
+			
+		else:
+			stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
+				"voucher_no": mtn.name, "warehouse": "_Test Warehouse - _TC"}, "stock_value_difference"))
+		
+			self.check_gl_entries("Stock Entry", mtn.name,
+				sorted([
+					[stock_in_hand_account, 0.0, stock_value_diff],
+					[fixed_asset_account, stock_value_diff, 0.0],
+				])
+			)
 
 		mtn.cancel()
 		self.assertFalse(frappe.db.sql("""select * from `tabStock Ledger Entry`
@@ -260,9 +261,7 @@ class TestStockEntry(unittest.TestCase):
 		repack.insert()
 		repack.submit()
 
-		stock_in_hand_account = frappe.db.get_value("Account", {"account_type": "Stock",
-			"warehouse": repack.get("items")[1].t_warehouse})
-
+		stock_in_hand_account = get_inventory_account(repack.company, repack.get("items")[1].t_warehouse)
 		rm_stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry",
 			"voucher_no": repack.name, "item_code": "_Test Item"}, "stock_value_difference"))
 
diff --git a/erpnext/stock/doctype/warehouse/test_warehouse.py b/erpnext/stock/doctype/warehouse/test_warehouse.py
index 31d1926cfa3..d010313534b 100644
--- a/erpnext/stock/doctype/warehouse/test_warehouse.py
+++ b/erpnext/stock/doctype/warehouse/test_warehouse.py
@@ -6,6 +6,7 @@ from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
 from frappe.utils import cint
 from erpnext import set_perpetual_inventory
 from frappe.test_runner import make_test_records
+from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account
 
 import frappe
 import unittest
@@ -33,21 +34,16 @@ class TestWarehouse(unittest.TestCase):
 	def test_warehouse_renaming(self):
 		set_perpetual_inventory(1)
 		create_warehouse("Test Warehouse for Renaming 1")
-
-		self.assertTrue(frappe.db.exists("Account", "Test Warehouse for Renaming 1 - _TC"))
-		self.assertTrue(frappe.db.get_value("Account",
-			filters={"warehouse": "Test Warehouse for Renaming 1 - _TC"}))
+		account = get_inventory_account("_Test Company", "Test Warehouse for Renaming 1 - _TC")
+		self.assertTrue(frappe.db.get_value("Warehouse", filters={"account": account}))
 
 		# Rename with abbr
 		if frappe.db.exists("Warehouse", "Test Warehouse for Renaming 2 - _TC"):
 			frappe.delete_doc("Warehouse", "Test Warehouse for Renaming 2 - _TC")
 		rename_doc("Warehouse", "Test Warehouse for Renaming 1 - _TC", "Test Warehouse for Renaming 2 - _TC")
 
-		self.assertTrue(frappe.db.exists("Account", "Test Warehouse for Renaming 2 - _TC"))
-		self.assertTrue(frappe.db.get_value("Account",
-			filters={"warehouse": "Test Warehouse for Renaming 2 - _TC"}))
-		self.assertFalse(frappe.db.get_value("Account",
-			filters={"warehouse": "Test Warehouse for Renaming 1 - _TC"}))
+		self.assertTrue(frappe.db.get_value("Warehouse",
+			filters={"account": "Test Warehouse for Renaming 1 - _TC"}))
 
 		# Rename without abbr
 		if frappe.db.exists("Warehouse", "Test Warehouse for Renaming 3 - _TC"):
@@ -55,19 +51,14 @@ class TestWarehouse(unittest.TestCase):
 
 		rename_doc("Warehouse", "Test Warehouse for Renaming 2 - _TC", "Test Warehouse for Renaming 3")
 
-		self.assertTrue(frappe.db.exists("Account", "Test Warehouse for Renaming 3 - _TC"))
-		self.assertTrue(frappe.db.get_value("Account",
-			filters={"warehouse": "Test Warehouse for Renaming 3 - _TC"}))
+		self.assertTrue(frappe.db.get_value("Warehouse",
+			filters={"account": "Test Warehouse for Renaming 1 - _TC"}))
 
 		# Another rename with multiple dashes
 		if frappe.db.exists("Warehouse", "Test - Warehouse - Company - _TC"):
 			frappe.delete_doc("Warehouse", "Test - Warehouse - Company - _TC")
 		rename_doc("Warehouse", "Test Warehouse for Renaming 3 - _TC", "Test - Warehouse - Company")
 
-		self.assertTrue(frappe.db.exists("Account", "Test - Warehouse - Company - _TC"))
-		self.assertTrue(frappe.db.get_value("Account", filters={"warehouse": "Test - Warehouse - Company - _TC"}))
-		self.assertFalse(frappe.db.get_value("Account", filters={"warehouse": "Test Warehouse for Renaming 3 - _TC"}))
-
 	def test_warehouse_merging(self):
 		set_perpetual_inventory(1)
 
@@ -96,10 +87,8 @@ class TestWarehouse(unittest.TestCase):
 
 		self.assertEqual(bin_qty, existing_bin_qty)
 
-		self.assertFalse(frappe.db.exists("Account", "Test Warehouse for Merging 1 - _TC"))
-		self.assertTrue(frappe.db.exists("Account", "Test Warehouse for Merging 2 - _TC"))
-		self.assertTrue(frappe.db.get_value("Account",
-			filters={"warehouse": "Test Warehouse for Merging 2 - _TC"}))
+		self.assertTrue(frappe.db.get_value("Warehouse",
+			filters={"account": "Test Warehouse for Merging 2 - _TC"}))
 
 def create_warehouse(warehouse_name):
 	if not frappe.db.exists("Warehouse", warehouse_name + " - _TC"):
@@ -107,8 +96,13 @@ def create_warehouse(warehouse_name):
 		w.warehouse_name = warehouse_name
 		w.parent_warehouse = "_Test Warehouse Group - _TC"
 		w.company = "_Test Company"
+		make_account_for_warehouse(warehouse_name, w)
+		w.account = warehouse_name + " - _TC"
 		w.save()
 
-	if not frappe.get_value('Account', dict(warehouse=warehouse_name + ' - _TC')):
-		print 'Warehouse {0} not linked'.format(warehouse_name)
-
+def make_account_for_warehouse(warehouse_name, warehouse_obj):
+	if not frappe.db.exists("Account", warehouse_name + " - _TC"):
+		parent_account = frappe.db.get_value('Account', 
+			{'company': warehouse_obj.company, 'is_group':1, 'account_type': 'Stock'},'name')
+		account = create_account(account_name=warehouse_name, \
+				account_type="Stock", parent_account= parent_account, company=warehouse_obj.company)
\ No newline at end of file
diff --git a/erpnext/stock/doctype/warehouse/warehouse.js b/erpnext/stock/doctype/warehouse/warehouse.js
index 8a9ecbd109c..5c23a9729a8 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.js
+++ b/erpnext/stock/doctype/warehouse/warehouse.js
@@ -28,7 +28,7 @@ frappe.ui.form.on("Warehouse", {
 				function() { convert_to_group_or_ledger(frm); }, 'fa fa-retweet', 'btn-default')
 		}
 		
-		cur_frm.toggle_enable(['is_group', 'company'], false);
+		frm.toggle_enable(['is_group', 'company'], false);
 
 		frm.fields_dict['parent_warehouse'].get_query = function(doc) {
 			return {
@@ -37,17 +37,18 @@ frappe.ui.form.on("Warehouse", {
 				}
 			}
 		}
-	}
-});
 
-cur_frm.set_query("create_account_under", function() {
-	return {
-		filters: {
-			"company": cur_frm.doc.company,
-			'is_group': 1
+		frm.fields_dict['account'].get_query = function(doc) {
+			return {
+				filters: {
+					"is_group": 0,
+					"account_type": "Stock",
+					"company": frm.doc.company
+				}
+			}
 		}
 	}
-})
+});
 
 function convert_to_group_or_ledger(frm){
 	frappe.call({
diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json
index 9beea6c734d..275bdefcf1f 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.json
+++ b/erpnext/stock/doctype/warehouse/warehouse.json
@@ -1,5 +1,6 @@
 {
  "allow_copy": 0, 
+ "allow_guest_to_view": 0, 
  "allow_import": 1, 
  "allow_rename": 1, 
  "beta": 0, 
@@ -193,9 +194,7 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "depends_on": "eval:sys_defaults.auto_accounting_for_stock", 
-   "description": "Account for the warehouse (Perpetual Inventory) will be created under this Account.", 
-   "fieldname": "create_account_under", 
+   "fieldname": "account", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
@@ -204,11 +203,12 @@
    "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
-   "label": "Parent Account", 
+   "label": "Account", 
    "length": 0, 
    "no_copy": 0, 
    "options": "Account", 
    "permlevel": 0, 
+   "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
    "read_only": 0, 
@@ -666,18 +666,18 @@
    "unique": 0
   }
  ], 
+ "has_web_view": 0, 
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "icon": "fa fa-building", 
  "idx": 1, 
  "image_view": 0, 
  "in_create": 0, 
- "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2017-02-20 13:27:03.696714", 
+ "modified": "2017-04-21 16:49:19.018576", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Warehouse", 
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index 15c5e2acb36..b0335d7d3f2 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -4,8 +4,9 @@
 from __future__ import unicode_literals
 import frappe, erpnext
 from frappe.utils import cint, validate_email_add
-from frappe import throw, msgprint, _
+from frappe import throw, _
 from frappe.utils.nestedset import NestedSet
+from erpnext.stock import get_warehouse_account
 
 class Warehouse(NestedSet):
 	nsm_parent_field = 'parent_warehouse'
@@ -20,8 +21,7 @@ class Warehouse(NestedSet):
 
 	def onload(self):
 		'''load account name for General Ledger Report'''
-		account = frappe.db.get_value("Account", {
-			"account_type": "Stock", "company": self.company, "warehouse": self.name, "is_group": 0})
+		account = self.account or get_warehouse_account(self.name, self.company)
 
 		if account:
 			self.set_onload('account', account)
@@ -30,77 +30,9 @@ class Warehouse(NestedSet):
 		if self.email_id:
 			validate_email_add(self.email_id, True)
 
-		self.update_parent_account()
-
-	def update_parent_account(self):
-		if not getattr(self, "__islocal", None) \
-			and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) \
-			and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")):
-
-				self.validate_parent_account()
-
-				warehouse_account = frappe.db.get_value("Account",
-					{"account_type": "Stock", "company": self.company, "warehouse": self.name, "is_group": 0},
-					["name", "parent_account"])
-
-				if warehouse_account and warehouse_account[1] != self.create_account_under:
-					acc_doc = frappe.get_doc("Account", warehouse_account[0])
-					acc_doc.parent_account = self.create_account_under
-					acc_doc.save()
-
 	def on_update(self):
-		self.create_account_head()
 		self.update_nsm_model()
 
-	def create_account_head(self):
-		'''Create new account head if there is no account linked to this Warehouse'''
-		from erpnext.accounts.doctype.account.account import BalanceMismatchError
-		if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
-			if not self.get_account():
-				if self.get("__islocal") or not frappe.db.get_value(
-						"Stock Ledger Entry", {"warehouse": self.name}):
-
-					self.validate_parent_account()
-					ac_doc = frappe.get_doc({
-						"doctype": "Account",
-						'account_name': self.warehouse_name,
-						'parent_account': self.parent_warehouse if self.parent_warehouse \
-							else self.create_account_under,
-						'is_group': self.is_group,
-						'company':self.company,
-						"account_type": "Stock",
-						"warehouse": self.name,
-						"freeze_account": "No"
-					})
-					ac_doc.flags.ignore_permissions = True
-					ac_doc.flags.ignore_mandatory = True
-					try:
-						ac_doc.insert()
-						msgprint(_("Account head {0} created").format(ac_doc.name), indicator='green', alert=True)
-
-					except frappe.DuplicateEntryError:
-						msgprint(_("Please create an Account for this Warehouse and link it. This cannot be done automatically as an account with name {0} already exists").format(frappe.bold(self.name)),
-							indicator='orange')
-
-					except BalanceMismatchError:
-						msgprint(_("Cannot automatically create Account as there is already stock balance in the Account. You must create a matching account before you can make an entry on this warehouse"))
-
-	def validate_parent_account(self):
-		if not self.company:
-			frappe.throw(_("Warehouse {0}: Company is mandatory").format(self.name))
-
-		if not self.create_account_under:
-			parent_account = frappe.db.sql("""select name from tabAccount
-				where account_type='Stock' and company=%s and is_group=1
-				and (warehouse is null or warehouse = '')""", self.company)
-
-			if parent_account:
-				frappe.db.set_value("Warehouse", self.name, "create_account_under", parent_account[0][0])
-				self.create_account_under = parent_account[0][0]
-		elif frappe.db.get_value("Account", self.create_account_under, "company") != self.company:
-			frappe.throw(_("Warehouse {0}: Parent account {1} does not bolong to the company {2}")
-				.format(self.name, self.create_account_under, self.company))
-
 	def update_nsm_model(self):
 		frappe.utils.nestedset.update_nsm(self)
 
@@ -115,10 +47,6 @@ class Warehouse(NestedSet):
 			else:
 				frappe.db.sql("delete from `tabBin` where name = %s", d['name'])
 
-		warehouse_account = self.get_account()
-		if warehouse_account:
-			frappe.delete_doc("Account", warehouse_account)
-
 		if self.check_if_sle_exists():
 			throw(_("Warehouse can not be deleted as stock ledger entry exists for this warehouse."))
 
@@ -146,36 +74,8 @@ class Warehouse(NestedSet):
 			if self.company != frappe.db.get_value("Warehouse", new_warehouse, "company"):
 				frappe.throw(_("Both Warehouse must belong to same Company"))
 
-		self.rename_account_for(old_name, new_warehouse, merge)
-
 		return new_warehouse
 
-	def rename_account_for(self, old_name, new_name, merge):
-		old_account_name = frappe.get_value('Account', dict(warehouse=old_name))
-
-		if old_account_name:
-			if not merge:
-				# old account name is same as old name, so rename the account too
-				if old_account_name == erpnext.encode_company_abbr(old_name, self.company):
-					frappe.rename_doc("Account", old_account_name, new_name)
-			else:
-				# merge
-				target_account = frappe.get_value('Account', dict(warehouse=new_name))
-				if target_account:
-					# target warehouse has account, merge into target account
-					frappe.rename_doc("Account", old_account_name,
-						target_account, merge=True)
-				else:
-					# target warehouse does not have account, use this account
-					frappe.rename_doc("Account", old_account_name,
-						new_name, merge=False)
-
-					# rename link
-					frappe.db.set_value('Account', new_name, 'warehouse', new_name)
-
-	def get_account(self):
-		return frappe.get_value('Account', dict(warehouse=self.name))
-
 	def after_rename(self, old_name, new_name, merge=False):
 		new_warehouse_name = self.get_new_warehouse_name_without_abbr(new_name)
 		self.db_set("warehouse_name", new_warehouse_name)
@@ -222,12 +122,6 @@ class Warehouse(NestedSet):
 		elif self.check_if_sle_exists():
 			throw(_("Warehouses with existing transaction can not be converted to ledger."))
 		else:
-			account_name = self.get_account()
-			if account_name:
-				doc = frappe.get_doc("Account", account_name)
-				doc.warehouse = self.name
-				doc.convert_group_to_ledger()
-
 			self.is_group = 0
 			self.save()
 			return 1
@@ -236,12 +130,6 @@ class Warehouse(NestedSet):
 		if self.check_if_sle_exists():
 			throw(_("Warehouses with existing transaction can not be converted to group."))
 		else:
-			account_name = self.get_account()
-			if account_name:
-				doc = frappe.get_doc("Account", account_name)
-				doc.flags.exclude_account_type_check = True
-				doc.convert_ledger_to_group()
-
 			self.is_group = 1
 			self.save()
 			return 1
@@ -285,4 +173,4 @@ def add_node():
 @frappe.whitelist()
 def convert_to_group_or_ledger():
 	args = frappe.form_dict
-	return frappe.get_doc("Warehouse", args.docname).convert_to_group_or_ledger()
+	return frappe.get_doc("Warehouse", args.docname).convert_to_group_or_ledger()
\ No newline at end of file