Merge branch 'develop' into fix_asset_sold_status
diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json
index 991df4e..f0505ff 100644
--- a/erpnext/assets/doctype/asset/asset.json
+++ b/erpnext/assets/doctype/asset/asset.json
@@ -388,7 +388,7 @@
"in_standard_filter": 1,
"label": "Status",
"no_copy": 1,
- "options": "Draft\nSubmitted\nPartially Depreciated\nFully Depreciated\nSold\nScrapped\nIn Maintenance\nOut of Order\nIssue\nReceipt",
+ "options": "Draft\nSubmitted\nPartially Depreciated\nFully Depreciated\nSold\nScrapped\nIn Maintenance\nOut of Order\nIssue\nReceipt\nCapitalized\nDecapitalized",
"read_only": 1
},
{
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 8ac7ed6..e953333 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -654,7 +654,7 @@
self.db_set("status", status)
def get_status(self):
- """Returns status based on whether it is draft, submitted, scrapped or depreciated"""
+ """Returns status based on whether it is draft, submitted, sold, scrapped or depreciated"""
if self.docstatus == 0:
status = "Draft"
elif self.docstatus == 1:
@@ -676,6 +676,21 @@
status = "Cancelled"
return status
+ def is_sold(self):
+ item = frappe.qb.DocType("Sales Invoice Item").as_("item")
+ si = frappe.qb.DocType("Sales Invoice").as_("si")
+
+ asset_sales_invoice = (
+ frappe.qb.from_(item)
+ .select(item.parent)
+ .inner_join(si)
+ .on(item.parent == si.name)
+ .where(item.asset == self.name)
+ .where(si.docstatus == 1)
+ ).run()
+
+ return True if asset_sales_invoice else False
+
def get_default_finance_book_idx(self):
if not self.get("default_finance_book") and self.company:
self.default_finance_book = erpnext.get_default_finance_book(self.company)
@@ -828,7 +843,9 @@
def update_maintenance_status():
- assets = frappe.get_all("Asset", filters={"docstatus": 1, "maintenance_required": 1})
+ assets = frappe.get_all(
+ "Asset", filters={"docstatus": 1, "maintenance_required": 1, "disposal_date": ("is", "not set")}
+ )
for asset in assets:
asset = frappe.get_doc("Asset", asset.name)
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index f72b524..ccd19ad 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -16,7 +16,11 @@
)
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
-from erpnext.assets.doctype.asset.asset import make_sales_invoice, split_asset
+from erpnext.assets.doctype.asset.asset import (
+ make_sales_invoice,
+ split_asset,
+ update_maintenance_status,
+)
from erpnext.assets.doctype.asset.depreciation import (
post_depreciation_entries,
restore_asset,
@@ -300,6 +304,34 @@
si.cancel()
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Partially Depreciated")
+ def test_asset_with_maintenance_required_status_after_sale(self):
+ asset = create_asset(
+ calculate_depreciation=1,
+ available_for_use_date="2020-06-06",
+ purchase_date="2020-01-01",
+ expected_value_after_useful_life=10000,
+ total_number_of_depreciations=3,
+ frequency_of_depreciation=10,
+ maintenance_required=1,
+ depreciation_start_date="2020-12-31",
+ submit=1,
+ )
+
+ post_depreciation_entries(date="2021-01-01")
+
+ si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company")
+ si.customer = "_Test Customer"
+ si.due_date = nowdate()
+ si.get("items")[0].rate = 25000
+ si.insert()
+ si.submit()
+
+ self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
+
+ update_maintenance_status()
+
+ self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
+
def test_asset_splitting(self):
asset = create_asset(
calculate_depreciation=1,
@@ -1418,6 +1450,7 @@
"number_of_depreciations_booked": args.number_of_depreciations_booked or 0,
"gross_purchase_amount": args.gross_purchase_amount or 100000,
"purchase_receipt_amount": args.purchase_receipt_amount or 100000,
+ "maintenance_required": args.maintenance_required or 0,
"warehouse": args.warehouse or "_Test Warehouse - _TC",
"available_for_use_date": args.available_for_use_date or "2020-06-06",
"location": args.location or "Test Location",