Skip to content

Commit

Permalink
feat: asset activity (#36391)
Browse files Browse the repository at this point in the history
* feat: asset activity

* chore: add more actions to asset activity

* chore: fix failing test due to timestamp mismatch error

* chore: rewriting asset activity messages

* chore: add report and add it to workspace

* chore: show user in list view
  • Loading branch information
anandbaburajan authored Aug 1, 2023
1 parent 3f09f81 commit 2ab3d75
Show file tree
Hide file tree
Showing 16 changed files with 329 additions and 8 deletions.
5 changes: 4 additions & 1 deletion erpnext/accounts/doctype/sales_invoice/sales_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
reset_depreciation_schedule,
reverse_depreciation_entry_made_after_disposal,
)
from erpnext.assets.doctype.asset_activity.asset_activity import add_asset_activity
from erpnext.controllers.accounts_controller import validate_account_head
from erpnext.controllers.selling_controller import SellingController
from erpnext.projects.doctype.timesheet.timesheet import get_projectwise_timesheet_data
Expand Down Expand Up @@ -1176,12 +1177,13 @@ def make_item_gl_entries(self, gl_entries):
self.get("posting_date"),
)
asset.db_set("disposal_date", None)
add_asset_activity(asset.name, _("Asset returned"))

if asset.calculate_depreciation:
posting_date = frappe.db.get_value("Sales Invoice", self.return_against, "posting_date")
reverse_depreciation_entry_made_after_disposal(asset, posting_date)
notes = _(
"This schedule was created when Asset {0} was returned after being sold through Sales Invoice {1}."
"This schedule was created when Asset {0} was returned through Sales Invoice {1}."
).format(
get_link_to_form(asset.doctype, asset.name),
get_link_to_form(self.doctype, self.get("name")),
Expand Down Expand Up @@ -1209,6 +1211,7 @@ def make_item_gl_entries(self, gl_entries):
self.get("posting_date"),
)
asset.db_set("disposal_date", self.posting_date)
add_asset_activity(asset.name, _("Asset sold"))

for gle in fixed_asset_gl_entries:
gle["against"] = self.customer
Expand Down
7 changes: 6 additions & 1 deletion erpnext/assets/doctype/asset/asset.json
Original file line number Diff line number Diff line change
Expand Up @@ -533,14 +533,19 @@
"link_doctype": "Asset Depreciation Schedule",
"link_fieldname": "asset"
},
{
"group": "Activity",
"link_doctype": "Asset Activity",
"link_fieldname": "asset"
},
{
"group": "Journal Entry",
"link_doctype": "Journal Entry",
"link_fieldname": "reference_name",
"table_fieldname": "accounts"
}
],
"modified": "2023-07-28 15:47:01.137996",
"modified": "2023-07-28 20:12:44.819616",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset",
Expand Down
33 changes: 31 additions & 2 deletions erpnext/assets/doctype/asset/asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
get_depreciation_accounts,
get_disposal_account_and_cost_center,
)
from erpnext.assets.doctype.asset_activity.asset_activity import add_asset_activity
from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import (
cancel_asset_depr_schedules,
Expand Down Expand Up @@ -59,7 +60,7 @@ def on_submit(self):
self.make_asset_movement()
if not self.booked_fixed_asset and self.validate_make_gl_entry():
self.make_gl_entries()
if not self.split_from:
if self.calculate_depreciation and not self.split_from:
asset_depr_schedules_names = make_draft_asset_depr_schedules_if_not_present(self)
convert_draft_asset_depr_schedules_into_active(self)
if asset_depr_schedules_names:
Expand All @@ -71,6 +72,7 @@ def on_submit(self):
"Asset Depreciation Schedules created:<br>{0}<br><br>Please check, edit if needed, and submit the Asset."
).format(asset_depr_schedules_links)
)
add_asset_activity(self.name, _("Asset submitted"))

def on_cancel(self):
self.validate_cancellation()
Expand All @@ -81,9 +83,10 @@ def on_cancel(self):
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
make_reverse_gl_entries(voucher_type="Asset", voucher_no=self.name)
self.db_set("booked_fixed_asset", 0)
add_asset_activity(self.name, _("Asset cancelled"))

def after_insert(self):
if not self.split_from:
if self.calculate_depreciation and not self.split_from:
asset_depr_schedules_names = make_draft_asset_depr_schedules(self)
asset_depr_schedules_links = get_comma_separated_links(
asset_depr_schedules_names, "Asset Depreciation Schedule"
Expand All @@ -93,6 +96,16 @@ def after_insert(self):
"Asset Depreciation Schedules created:<br>{0}<br><br>Please check, edit if needed, and submit the Asset."
).format(asset_depr_schedules_links)
)
if not frappe.db.exists(
{
"doctype": "Asset Activity",
"asset": self.name,
}
):
add_asset_activity(self.name, _("Asset created"))

def after_delete(self):
add_asset_activity(self.name, _("Asset deleted"))

def validate_asset_and_reference(self):
if self.purchase_invoice or self.purchase_receipt:
Expand Down Expand Up @@ -903,6 +916,13 @@ def update_existing_asset(asset, remaining_qty, new_asset_name):
},
)

add_asset_activity(
asset.name,
_("Asset updated after being split into Asset {0}").format(
get_link_to_form("Asset", new_asset_name)
),
)

for row in asset.get("finance_books"):
value_after_depreciation = flt(
(row.value_after_depreciation * remaining_qty) / asset.asset_quantity
Expand Down Expand Up @@ -970,6 +990,15 @@ def create_new_asset_after_split(asset, split_qty):
(row.expected_value_after_useful_life * split_qty) / asset.asset_quantity
)

new_asset.insert()

add_asset_activity(
new_asset.name,
_("Asset created after being split from Asset {0}").format(
get_link_to_form("Asset", asset.name)
),
)

new_asset.submit()
new_asset.set_status()

Expand Down
5 changes: 5 additions & 0 deletions erpnext/assets/doctype/asset/depreciation.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
get_checks_for_pl_and_bs_accounts,
)
from erpnext.accounts.doctype.journal_entry.journal_entry import make_reverse_journal_entry
from erpnext.assets.doctype.asset_activity.asset_activity import add_asset_activity
from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import (
get_asset_depr_schedule_doc,
get_asset_depr_schedule_name,
Expand Down Expand Up @@ -325,6 +326,8 @@ def scrap_asset(asset_name):
frappe.db.set_value("Asset", asset_name, "journal_entry_for_scrap", je.name)
asset.set_status("Scrapped")

add_asset_activity(asset_name, _("Asset scrapped"))

frappe.msgprint(_("Asset scrapped via Journal Entry {0}").format(je.name))


Expand All @@ -349,6 +352,8 @@ def restore_asset(asset_name):

asset.set_status()

add_asset_activity(asset_name, _("Asset restored"))


def depreciate_asset(asset_doc, date, notes):
asset_doc.flags.ignore_validate_update_after_submit = True
Expand Down
Empty file.
8 changes: 8 additions & 0 deletions erpnext/assets/doctype/asset_activity/asset_activity.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt

// frappe.ui.form.on("Asset Activity", {
// refresh(frm) {

// },
// });
109 changes: 109 additions & 0 deletions erpnext/assets/doctype/asset_activity/asset_activity.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
{
"actions": [],
"creation": "2023-07-28 12:41:13.232505",
"default_view": "List",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"asset",
"column_break_vkdy",
"date",
"column_break_kkxv",
"user",
"section_break_romx",
"subject"
],
"fields": [
{
"fieldname": "asset",
"fieldtype": "Link",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Asset",
"options": "Asset",
"print_width": "165",
"read_only": 1,
"reqd": 1,
"width": "165"
},
{
"fieldname": "column_break_vkdy",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_romx",
"fieldtype": "Section Break"
},
{
"fieldname": "subject",
"fieldtype": "Small Text",
"in_list_view": 1,
"label": "Subject",
"print_width": "518",
"read_only": 1,
"reqd": 1,
"width": "518"
},
{
"default": "now",
"fieldname": "date",
"fieldtype": "Datetime",
"in_list_view": 1,
"label": "Date",
"print_width": "158",
"read_only": 1,
"reqd": 1,
"width": "158"
},
{
"fieldname": "user",
"fieldtype": "Link",
"in_list_view": 1,
"label": "User",
"options": "User",
"print_width": "150",
"read_only": 1,
"reqd": 1,
"width": "150"
},
{
"fieldname": "column_break_kkxv",
"fieldtype": "Column Break"
}
],
"in_create": 1,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2023-08-01 11:09:52.584482",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Activity",
"owner": "Administrator",
"permissions": [
{
"email": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1
},
{
"email": 1,
"read": 1,
"report": 1,
"role": "Accounts User",
"share": 1
},
{
"email": 1,
"read": 1,
"report": 1,
"role": "Quality Manager",
"share": 1
}
],
"sort_field": "modified",
"sort_order": "DESC",
"states": []
}
20 changes: 20 additions & 0 deletions erpnext/assets/doctype/asset_activity/asset_activity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt

import frappe
from frappe.model.document import Document


class AssetActivity(Document):
pass


def add_asset_activity(asset, subject):
frappe.get_doc(
{
"doctype": "Asset Activity",
"asset": asset,
"subject": subject,
"user": frappe.session.user,
}
).insert(ignore_permissions=True, ignore_links=True)
9 changes: 9 additions & 0 deletions erpnext/assets/doctype/asset_activity/test_asset_activity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt

# import frappe
from frappe.tests.utils import FrappeTestCase


class TestAssetActivity(FrappeTestCase):
pass
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
reset_depreciation_schedule,
reverse_depreciation_entry_made_after_disposal,
)
from erpnext.assets.doctype.asset_activity.asset_activity import add_asset_activity
from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
from erpnext.controllers.stock_controller import StockController
from erpnext.setup.doctype.brand.brand import get_brand_defaults
Expand Down Expand Up @@ -519,6 +520,13 @@ def create_target_asset(self):
"fixed_asset_account", item=self.target_item_code, company=asset_doc.company
)

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."
Expand All @@ -542,9 +550,30 @@ def restore_consumed_asset_items(self):

def set_consumed_asset_status(self, asset):
if self.docstatus == 1:
asset.set_status("Capitalized" if self.target_is_fixed_asset else "Decapitalized")
if self.target_is_fixed_asset:
asset.set_status("Capitalized")
add_asset_activity(
asset.name,
_("Asset capitalized after Asset Capitalization {0} was submitted").format(
get_link_to_form("Asset Capitalization", self.name)
),
)
else:
asset.set_status("Decapitalized")
add_asset_activity(
asset.name,
_("Asset decapitalized after Asset Capitalization {0} was submitted").format(
get_link_to_form("Asset Capitalization", self.name)
),
)
else:
asset.set_status()
add_asset_activity(
asset.name,
_("Asset restored after Asset Capitalization {0} was cancelled").format(
get_link_to_form("Asset Capitalization", self.name)
),
)


@frappe.whitelist()
Expand Down
Loading

0 comments on commit 2ab3d75

Please sign in to comment.