From 5e5b5cfa0cb9f11f33a959c0a334240133fed50d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 16 May 2026 11:52:23 +0000 Subject: [PATCH] fix(stock): ignore fetching warehouse account for asset items (backport #54403) (#54961) * fix(stock): ignore fetching warehouse account for asset items (cherry picked from commit 6fe08428c13ee7839d640f347851cb8668d50607) * test(stock): add test to create pr for asset item without checking the stock account (cherry picked from commit 8cf4402823525e9053fe99f1ab8d50b1890871cb) --------- Co-authored-by: Sudharsanan11 --- erpnext/assets/doctype/asset/test_asset.py | 4 +- erpnext/controllers/stock_controller.py | 11 +- .../purchase_receipt/test_purchase_receipt.py | 141 ++++++++++++++++++ 3 files changed, 149 insertions(+), 7 deletions(-) diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 852a28f9948..424bf9bac87 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -1977,7 +1977,7 @@ def create_asset_category(enable_cwip=1): asset_category.insert() -def create_fixed_asset_item(item_code=None, auto_create_assets=1, is_grouped_asset=0): +def create_fixed_asset_item(item_code=None, auto_create_assets=1, is_grouped_asset=0, asset_category=None): meta = frappe.get_meta("Asset") naming_series = meta.get_field("naming_series").options.splitlines()[0] or "ACC-ASS-.YYYY.-" try: @@ -1987,7 +1987,7 @@ def create_fixed_asset_item(item_code=None, auto_create_assets=1, is_grouped_ass "item_code": item_code or "Macbook Pro", "item_name": "Macbook Pro", "description": "Macbook Pro Retina Display", - "asset_category": "Computers", + "asset_category": asset_category or "Computers", "item_group": "All Item Groups", "stock_uom": "Nos", "is_stock_item": 0, diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 5e883a6695c..7e3f00774fe 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -269,14 +269,15 @@ class StockController(AccountsController): ) is_asset_pr = any(d.get("is_fixed_asset") for d in self.get("items")) - - if ( + need_inventory_map = (self.get_stock_items() or self.get("packed_items")) and ( cint(erpnext.is_perpetual_inventory_enabled(self.company)) - or provisional_accounting_for_non_stock_items - or is_asset_pr - ): + ) + + inventory_account_map = frappe._dict() + if need_inventory_map: inventory_account_map = self.get_inventory_account_map() + if need_inventory_map or provisional_accounting_for_non_stock_items or is_asset_pr: if self.docstatus == 1: if not gl_entries: gl_entries = ( diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 6cb75bc5312..66e228d7e90 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -5487,6 +5487,147 @@ class TestPurchaseReceipt(ERPNextTestSuite): "Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", original_value ) + def test_purchase_receipt_gl_entries_for_asset_item(self): + from erpnext.assets.doctype.asset.test_asset import create_fixed_asset_item + + # Create a Company without Stock Accounts Linked. + company = frappe.get_doc( + { + "doctype": "Company", + "company_name": "Asset Company", + "country": "India", + "default_currency": "INR", + } + ).insert() + + stock_accounts = ( + company.default_inventory_account, + company.stock_adjustment_account, + company.stock_received_but_not_billed, + ) + + company.update( + {"stock_in_hand_account": "", "stock_adjustment_account": "", "stock_received_but_not_billed": ""} + ).save() + + for account in stock_accounts: + frappe.db.delete("Account", account) + + asset_category = create_asset_category_for_pr_test() + asset_item = create_fixed_asset_item( + item_code="Test Fixed Asset Item for PR GL Test", asset_category=asset_category.name + ) + arnb_account = frappe.db.get_value("Company", company.name, "asset_received_but_not_billed") + + # Purchase Receipt should be able to create even without any stock accounts linked to company + pr = make_purchase_receipt( + item_code=asset_item.name, warehouse="Stores - AC", qty=1, rate=10000, company=company.name + ) + + gl_entries = get_gl_entries("Purchase Receipt", pr.name) + + self.assertTrue(gl_entries) + gl_accounts = [d.account for d in gl_entries] + + # The fixed asset account set on the item row must be debited + asset_expense_account = pr.items[0].expense_account + self.assertIn(asset_expense_account, gl_accounts) + + # Asset Received But Not Billed must be credited + self.assertIn(arnb_account, gl_accounts) + + # No Stock-type account should appear — the inventory account map is not + # needed and must not be consulted for an asset-only receipt + for entry in gl_entries: + account_type = frappe.db.get_value("Account", entry.account, "account_type") + self.assertNotEqual(account_type, "Stock") + + pr.cancel() + + def test_purchase_receipt_gl_entries_with_mixed_asset_and_stock_items(self): + from erpnext.assets.doctype.asset.test_asset import create_fixed_asset_item + + company = frappe.get_doc( + { + "doctype": "Company", + "company_name": "Asset Company", + "country": "India", + "default_currency": "INR", + } + ).insert() + + asset_category = create_asset_category_for_pr_test() + asset_item = create_fixed_asset_item( + item_code="Test Fixed Asset Item for PR GL Test", asset_category=asset_category.name + ) + arnb_account = frappe.db.get_value("Company", company.name, "asset_received_but_not_billed") + + pr = make_purchase_receipt( + item_code=asset_item.name, + qty=1, + rate=10000, + warehouse="Stores - AC", + do_not_save=True, + company=company.name, + ) + pr.append( + "items", + { + "item_code": "_Test Item", + "warehouse": "Stores - AC", + "qty": 5, + "received_qty": 5, + "rejected_qty": 0, + "rate": 50, + "uom": "_Test UOM", + "stock_uom": "_Test UOM", + "conversion_factor": 1.0, + "cost_center": frappe.get_cached_value("Company", pr.company, "cost_center"), + }, + ) + pr.insert() + pr.submit() + + gl_entries = get_gl_entries("Purchase Receipt", pr.name) + self.assertTrue(gl_entries) + + gl_accounts = [d.account for d in gl_entries] + self.assertIn(arnb_account, gl_accounts) + + # The fixed asset account set on the item row must be debited + asset_expense_account = pr.items[0].expense_account + self.assertIn(asset_expense_account, gl_accounts) + + # Asset Received But Not Billed must be credited + self.assertIn(asset_category.accounts[0].fixed_asset_account, gl_accounts) + + # Stock Accounts should be used for Stock Items + self.assertIn(company.stock_received_but_not_billed, gl_accounts) + self.assertIn(company.default_inventory_account, gl_accounts) + pr.cancel() + + +def create_asset_category_for_pr_test(): + category_name = "Test Asset Category for PR" + + asset_category = frappe.get_doc( + { + "doctype": "Asset Category", + "asset_category_name": category_name, + "enable_cwip_accounting": 0, + "depreciation_method": "Straight Line", + "total_number_of_depreciations": 12, + "frequency_of_depreciation": 1, + "accounts": [ + { + "company_name": "Asset Company", + "fixed_asset_account": "Electronic Equipment - AC", + } + ], + } + ).insert() + return asset_category + def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier