Skip to content

fix(UI): better ui/ux in asset capitalization #47676

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions erpnext/assets/doctype/asset/asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,14 +208,11 @@ def on_cancel(self):
add_asset_activity(self.name, _("Asset cancelled"))

def after_insert(self):
if (
not frappe.db.exists(
{
"doctype": "Asset Activity",
"asset": self.name,
}
)
and not self.flags.asset_created_via_asset_capitalization
if not frappe.db.exists(
{
"doctype": "Asset Activity",
"asset": self.name,
}
):
add_asset_activity(self.name, _("Asset created"))

Expand Down Expand Up @@ -1006,7 +1003,6 @@ def create_asset_capitalization(company, asset, asset_name, item_code):
{
"target_asset": asset,
"company": company,
"capitalization_method": "Choose a WIP composite asset",
"target_asset_name": asset_name,
"target_item_code": item_code,
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,7 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s
}

target_asset() {
if (
this.frm.doc.target_asset &&
this.frm.doc.capitalization_method === "Choose a WIP composite asset"
) {
if (this.frm.doc.target_asset) {
this.set_consumed_stock_items_tagged_to_wip_composite_asset(this.frm.doc.target_asset);
this.get_target_asset_details();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,16 @@
"field_order": [
"title",
"naming_series",
"capitalization_method",
"target_item_code",
"target_item_name",
"target_asset",
"target_asset_name",
"target_item_code",
"finance_book",
"target_qty",
"target_asset_location",
"column_break_9",
"company",
"posting_date",
"posting_time",
"set_posting_time",
"finance_book",
"target_batch_no",
"target_serial_no",
"amended_from",
Expand Down Expand Up @@ -54,20 +51,12 @@
"label": "Title"
},
{
"depends_on": "eval:(doc.target_item_code && !doc.__islocal && doc.capitalization_method !== 'Choose a WIP composite asset') || doc.capitalization_method=='Create a new composite asset'",
"depends_on": "eval:(doc.target_item_code && !doc.__islocal)",
"fieldname": "target_item_code",
"fieldtype": "Link",
"in_standard_filter": 1,
"label": "Target Item Code",
"mandatory_depends_on": "eval:doc.capitalization_method=='Create a new composite asset'",
"options": "Item"
},
{
"depends_on": "eval:doc.target_item_code && doc.target_item_name != doc.target_item_code",
"fetch_from": "target_item_code.item_name",
"fieldname": "target_item_name",
"fieldtype": "Data",
"label": "Target Item Name",
"options": "Item",
"read_only": 1
},
{
Expand All @@ -80,18 +69,14 @@
"read_only": 1
},
{
"depends_on": "eval:(doc.target_asset && !doc.__islocal) || doc.capitalization_method=='Choose a WIP composite asset'",
"fieldname": "target_asset",
"fieldtype": "Link",
"in_standard_filter": 1,
"label": "Target Asset",
"mandatory_depends_on": "eval:doc.capitalization_method=='Choose a WIP composite asset'",
"no_copy": 1,
"options": "Asset",
"read_only_depends_on": "eval:doc.capitalization_method=='Create a new composite asset'"
"options": "Asset"
},
{
"depends_on": "eval:(doc.target_asset_name && !doc.__islocal) || (doc.target_asset && doc.capitalization_method=='Choose a WIP composite asset')",
"fetch_from": "target_asset.asset_name",
"fieldname": "target_asset_name",
"fieldtype": "Data",
Expand Down Expand Up @@ -176,7 +161,9 @@
"default": "1",
"fieldname": "target_qty",
"fieldtype": "Float",
"label": "Target Qty"
"hidden": 1,
"label": "Target Qty",
"read_only": 1
},
{
"default": "0",
Expand Down Expand Up @@ -298,26 +285,12 @@
"label": "Target Fixed Asset Account",
"options": "Account",
"read_only": 1
},
{
"depends_on": "eval:doc.capitalization_method=='Create a new composite asset'",
"fieldname": "target_asset_location",
"fieldtype": "Link",
"label": "Target Asset Location",
"mandatory_depends_on": "eval:doc.capitalization_method=='Create a new composite asset'",
"options": "Location"
},
{
"fieldname": "capitalization_method",
"fieldtype": "Select",
"label": "Capitalization Method",
"options": "\nCreate a new composite asset\nChoose a WIP composite asset"
}
],
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2025-01-08 13:14:33.008458",
"modified": "2025-05-20 15:15:12.110035",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Capitalization",
Expand Down Expand Up @@ -355,10 +328,11 @@
"write": 1
}
],
"row_format": "Dynamic",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"title_field": "title",
"track_changes": 1,
"track_seen": 1
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ class AssetCapitalization(StockController):
amended_from: DF.Link | None
asset_items: DF.Table[AssetCapitalizationAssetItem]
asset_items_total: DF.Currency
capitalization_method: DF.Literal["", "Create new composite asset", "Use existing composite asset"]
company: DF.Link
cost_center: DF.Link | None
finance_book: DF.Link | None
Expand All @@ -83,7 +82,6 @@ class AssetCapitalization(StockController):
stock_items: DF.Table[AssetCapitalizationStockItem]
stock_items_total: DF.Currency
target_asset: DF.Link | None
target_asset_location: DF.Link | None
target_asset_name: DF.Data | None
target_batch_no: DF.Link | None
target_fixed_asset_account: DF.Link | None
Expand All @@ -92,7 +90,6 @@ class AssetCapitalization(StockController):
target_incoming_rate: DF.Currency
target_is_fixed_asset: DF.Check
target_item_code: DF.Link | None
target_item_name: DF.Data | None
target_qty: DF.Float
target_serial_no: DF.SmallText | None
title: DF.Data | None
Expand All @@ -118,7 +115,7 @@ def on_update(self):

def before_submit(self):
self.validate_source_mandatory()
self.create_target_asset()
# self.create_target_asset()

def on_submit(self):
self.make_bundle_using_old_serial_batch_fields()
Expand All @@ -143,7 +140,7 @@ def on_cancel(self):
self.update_target_asset()

def set_title(self):
self.title = self.target_asset_name or self.target_item_name or self.target_item_code
self.title = self.target_asset_name or self.target_item_code

def set_missing_values(self, for_validate=False):
target_item_details = get_target_item_details(self.target_item_code, self.company)
Expand Down Expand Up @@ -301,16 +298,7 @@ def validate_service_item(self):
d.cost_center = frappe.get_cached_value("Company", self.company, "cost_center")

def validate_source_mandatory(self):
if self.capitalization_method == "Create a new composite asset" and not (
self.get("stock_items") or self.get("asset_items")
):
frappe.throw(
_(
"Consumed Stock Items or Consumed Asset Items are mandatory for creating new composite asset"
)
)

elif not (self.get("stock_items") or self.get("asset_items") or self.get("service_items")):
if not (self.get("stock_items") or self.get("asset_items") or self.get("service_items")):
frappe.throw(
_(
"Consumed Stock Items, Consumed Asset Items or Consumed Service Items is mandatory for Capitalization"
Expand Down Expand Up @@ -559,49 +547,7 @@ def get_gl_entries_for_target_item(self, gl_entries, target_account, target_agai
)
)

def create_target_asset(self):
if self.capitalization_method != "Create a new composite asset":
return

total_target_asset_value = flt(self.total_value, self.precision("total_value"))

asset_doc = frappe.new_doc("Asset")
asset_doc.company = self.company
asset_doc.item_code = self.target_item_code
asset_doc.is_composite_asset = 1
asset_doc.location = self.target_asset_location
asset_doc.available_for_use_date = self.posting_date
asset_doc.purchase_date = self.posting_date
asset_doc.gross_purchase_amount = total_target_asset_value
asset_doc.purchase_amount = total_target_asset_value
asset_doc.flags.ignore_validate = True
asset_doc.flags.asset_created_via_asset_capitalization = True
asset_doc.insert()

self.target_asset = asset_doc.name

self.target_fixed_asset_account = get_asset_category_account(
"fixed_asset_account", item=self.target_item_code, company=asset_doc.company
)
asset_doc.set_status("Work In Progress")

add_asset_activity(
asset_doc.name,
_("Asset created after Asset Capitalization {0} was submitted").format(
get_link_to_form("Asset Capitalization", self.name)
),
)

frappe.msgprint(
_("Asset {0} has been created. Please set the depreciation details if any and submit it.").format(
get_link_to_form("Asset", asset_doc.name)
)
)

def update_target_asset(self):
if self.capitalization_method != "Choose a WIP composite asset":
return

total_target_asset_value = flt(self.total_value, self.precision("total_value"))
asset_doc = frappe.get_doc("Asset", self.target_asset)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,16 @@ def test_capitalization_with_perpetual_inventory(self):
company=company,
)

wip_composite_asset = create_asset(
asset_name="Asset Capitalization WIP Composite Asset",
is_composite_asset=1,
warehouse="Stores - TCP1",
company=company,
)

# Create and submit Asset Captitalization
asset_capitalization = create_asset_capitalization(
capitalization_method="Create a new composite asset",
target_item_code="Macbook Pro",
target_asset=wip_composite_asset.name,
target_asset_location="Test Location",
stock_qty=stock_qty,
stock_rate=stock_rate,
Expand Down Expand Up @@ -148,10 +154,16 @@ def test_capitalization_with_periodical_inventory(self):
company=company,
)

wip_composite_asset = create_asset(
asset_name="Asset Capitalization WIP Composite Asset",
is_composite_asset=1,
warehouse="Stores - TCP1",
company=company,
)

# Create and submit Asset Captitalization
asset_capitalization = create_asset_capitalization(
capitalization_method="Create a new composite asset",
target_item_code="Macbook Pro",
target_asset=wip_composite_asset.name,
target_asset_location="Test Location",
stock_qty=stock_qty,
stock_rate=stock_rate,
Expand Down Expand Up @@ -240,7 +252,6 @@ def test_capitalization_with_wip_composite_asset(self):

# Create and submit Asset Captitalization
asset_capitalization = create_asset_capitalization(
capitalization_method="Choose a WIP composite asset",
target_asset=wip_composite_asset.name,
target_asset_location="Test Location",
stock_qty=stock_qty,
Expand All @@ -251,7 +262,6 @@ def test_capitalization_with_wip_composite_asset(self):
)

# Test Asset Capitalization values
self.assertEqual(asset_capitalization.capitalization_method, "Choose a WIP composite asset")
self.assertEqual(asset_capitalization.target_qty, 1)

self.assertEqual(asset_capitalization.stock_items[0].valuation_rate, stock_rate)
Expand Down Expand Up @@ -310,7 +320,6 @@ def test_capitalize_only_service_item(self):

# Create and submit Asset Captitalization
asset_capitalization = create_asset_capitalization(
capitalization_method="Choose a WIP composite asset",
target_asset=wip_composite_asset.name,
target_asset_location="Test Location",
service_qty=service_qty,
Expand Down Expand Up @@ -362,7 +371,6 @@ def create_asset_capitalization(**args):
asset_capitalization = frappe.new_doc("Asset Capitalization")
asset_capitalization.update(
{
"capitalization_method": args.capitalization_method or None,
"company": company,
"posting_date": args.posting_date or now.strftime("%Y-%m-%d"),
"posting_time": args.posting_time or now.strftime("%H:%M:%S.%f"),
Expand Down
Loading