mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-21 14:09:19 +00:00
* fix(stock): ignore fetching warehouse account for asset items (cherry picked from commit6fe08428c1) * test(stock): add test to create pr for asset item without checking the stock account (cherry picked from commit8cf4402823) --------- Co-authored-by: Sudharsanan11 <sudharsananashok1975@gmail.com>
This commit is contained in:
@@ -1977,7 +1977,7 @@ def create_asset_category(enable_cwip=1):
|
|||||||
asset_category.insert()
|
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")
|
meta = frappe.get_meta("Asset")
|
||||||
naming_series = meta.get_field("naming_series").options.splitlines()[0] or "ACC-ASS-.YYYY.-"
|
naming_series = meta.get_field("naming_series").options.splitlines()[0] or "ACC-ASS-.YYYY.-"
|
||||||
try:
|
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_code": item_code or "Macbook Pro",
|
||||||
"item_name": "Macbook Pro",
|
"item_name": "Macbook Pro",
|
||||||
"description": "Macbook Pro Retina Display",
|
"description": "Macbook Pro Retina Display",
|
||||||
"asset_category": "Computers",
|
"asset_category": asset_category or "Computers",
|
||||||
"item_group": "All Item Groups",
|
"item_group": "All Item Groups",
|
||||||
"stock_uom": "Nos",
|
"stock_uom": "Nos",
|
||||||
"is_stock_item": 0,
|
"is_stock_item": 0,
|
||||||
|
|||||||
@@ -269,14 +269,15 @@ class StockController(AccountsController):
|
|||||||
)
|
)
|
||||||
|
|
||||||
is_asset_pr = any(d.get("is_fixed_asset") for d in self.get("items"))
|
is_asset_pr = any(d.get("is_fixed_asset") for d in self.get("items"))
|
||||||
|
need_inventory_map = (self.get_stock_items() or self.get("packed_items")) and (
|
||||||
if (
|
|
||||||
cint(erpnext.is_perpetual_inventory_enabled(self.company))
|
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()
|
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 self.docstatus == 1:
|
||||||
if not gl_entries:
|
if not gl_entries:
|
||||||
gl_entries = (
|
gl_entries = (
|
||||||
|
|||||||
@@ -5487,6 +5487,147 @@ class TestPurchaseReceipt(ERPNextTestSuite):
|
|||||||
"Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", original_value
|
"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():
|
def prepare_data_for_internal_transfer():
|
||||||
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
|
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
|
||||||
|
|||||||
Reference in New Issue
Block a user