chore: refactor more functions to use new depr schedule
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index b8f368a..6a248b0 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -8,15 +8,14 @@
import frappe
from frappe import _
from frappe.utils import (
- add_days,
add_months,
cint,
date_diff,
flt,
get_datetime,
get_last_day,
- is_last_day_of_the_month,
getdate,
+ is_last_day_of_the_month,
month_diff,
nowdate,
today,
@@ -28,13 +27,13 @@
get_depreciation_accounts,
get_disposal_account_and_cost_center,
)
+from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import (
- make_draft_asset_depreciation_schedules,
- get_asset_depreciation_schedule_name,
convert_draft_asset_depreciation_schedules_into_active,
+ get_asset_depreciation_schedule,
+ make_draft_asset_depreciation_schedules,
update_draft_asset_depreciation_schedules,
)
-from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
from erpnext.controllers.accounts_controller import AccountsController
@@ -245,9 +244,7 @@
return value_after_depreciation
def get_from_date(self, finance_book):
- asset_depr_schedule_name = get_asset_depreciation_schedule_name(
- self.name, finance_book
- )
+ asset_depr_schedule_name = get_asset_depreciation_schedule(self.name, finance_book)
if not asset_depr_schedule_name:
return self.available_for_use_date
@@ -358,7 +355,7 @@
return depreciation_amount_for_last_row
def get_depreciation_amount_for_first_row(self, finance_book):
- asset_depr_schedule_name = get_asset_depreciation_schedule_name(self.name, finance_book)
+ asset_depr_schedule_name = get_asset_depreciation_schedule(self.name, finance_book)
asset_depr_schedule = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule_name)
@@ -369,9 +366,7 @@
def validate_expected_value_after_useful_life(self):
for row in self.get("finance_books"):
- asset_depr_schedule_name = get_asset_depreciation_schedule_name(
- self.name, row.finance_book
- )
+ asset_depr_schedule_name = get_asset_depreciation_schedule(self.name, row.finance_book)
if not asset_depr_schedule_name:
return
@@ -379,8 +374,7 @@
asset_depr_schedule = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule_name)
accumulated_depreciation_after_full_schedule = [
- d.accumulated_depreciation_amount
- for d in asset_depr_schedule.get("depreciation_schedule")
+ d.accumulated_depreciation_amount for d in asset_depr_schedule.get("depreciation_schedule")
]
if accumulated_depreciation_after_full_schedule:
@@ -430,9 +424,7 @@
def delete_depreciation_entries(self):
for row in self.get("finance_books"):
- asset_depr_schedule_name = get_asset_depreciation_schedule_name(
- self.name, row.finance_book
- )
+ asset_depr_schedule_name = get_asset_depreciation_schedule(self.name, row.finance_book)
if not asset_depr_schedule_name:
return
diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py
index 9794170..49f167e 100644
--- a/erpnext/assets/doctype/asset/depreciation.py
+++ b/erpnext/assets/doctype/asset/depreciation.py
@@ -10,6 +10,9 @@
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_depreciation_schedule.asset_depreciation_schedule import (
+ make_temp_asset_depreciation_schedule,
+)
def post_depreciation_entries(date=None, commit=True):
@@ -499,24 +502,27 @@
def get_value_after_depreciation_on_disposal_date(asset, disposal_date, finance_book=None):
asset_doc = frappe.get_doc("Asset", asset)
- if asset_doc.calculate_depreciation:
- asset_doc.prepare_depreciation_data(getdate(disposal_date))
-
- finance_book_id = 1
- if finance_book:
- for fb in asset_doc.finance_books:
- if fb.finance_book == finance_book:
- finance_book_id = fb.idx
- break
-
- asset_schedules = [
- sch for sch in asset_doc.schedules if cint(sch.finance_book_id) == finance_book_id
- ]
- accumulated_depr_amount = asset_schedules[-1].accumulated_depreciation_amount
-
- return flt(
- flt(asset_doc.gross_purchase_amount) - accumulated_depr_amount,
- asset_doc.precision("gross_purchase_amount"),
- )
- else:
+ if not asset_doc.calculate_depreciation:
return flt(asset_doc.value_after_depreciation)
+
+ idx = 1
+ if finance_book:
+ for d in asset.finance_books:
+ if d.finance_book == finance_book:
+ idx = d.idx
+ break
+
+ row = asset_doc.finance_books[idx - 1]
+
+ temp_asset_depreciation_schedule = make_temp_asset_depreciation_schedule(
+ asset_doc, row, getdate(disposal_date)
+ )
+
+ depr_schedule = temp_asset_depreciation_schedule.get("depreciation_schedule")
+
+ accumulated_depr_amount = depr_schedule[-1].accumulated_depreciation_amount
+
+ return flt(
+ flt(asset_doc.gross_purchase_amount) - accumulated_depr_amount,
+ asset_doc.precision("gross_purchase_amount"),
+ )
diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
index ae3707b..9df4241 100644
--- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
+++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
@@ -2,6 +2,7 @@
# For license information, please see license.txt
import frappe
+from frappe.model.document import Document
from frappe.utils import (
add_days,
add_months,
@@ -9,9 +10,8 @@
date_diff,
flt,
get_last_day,
- is_last_day_of_the_month
+ is_last_day_of_the_month,
)
-from frappe.model.document import Document
import erpnext
@@ -20,37 +20,47 @@
pass
-def make_draft_asset_depreciation_schedules(asset):
- for row in asset.get("finance_books"):
+def make_draft_asset_depreciation_schedules(asset_doc, date_of_disposal=None, date_of_return=None):
+ for row in asset_doc.get("finance_books"):
asset_depr_schedule = frappe.new_doc("Asset Depreciation Schedule")
- prepare_draft_asset_depreciation_schedule_data(asset_depr_schedule, asset, row)
-
-
-def update_draft_asset_depreciation_schedules(asset):
- for row in asset.get("finance_books"):
- asset_depr_schedule_name = get_asset_depreciation_schedule_name(
- asset.name, row.finance_book
+ prepare_draft_asset_depreciation_schedule_data(
+ asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return
)
+ asset_depr_schedule.insert()
+
+
+def update_draft_asset_depreciation_schedules(
+ asset_doc, date_of_disposal=None, date_of_return=None
+):
+ for row in asset_doc.get("finance_books"):
+ asset_depr_schedule_name = get_asset_depreciation_schedule(asset_doc.name, row.finance_book)
+
if not asset_depr_schedule_name:
return
asset_depr_schedule = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule_name)
- prepare_draft_asset_depreciation_schedule_data(asset_depr_schedule, asset, row)
+ prepare_draft_asset_depreciation_schedule_data(
+ asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return
+ )
+
+ asset_depr_schedule.save()
-def prepare_draft_asset_depreciation_schedule_data(asset_depr_schedule, asset, row):
- set_draft_asset_depreciation_schedule_details(asset_depr_schedule, asset.name, row)
- make_depreciation_schedule(asset_depr_schedule, asset, row)
- set_accumulated_depreciation(asset_depr_schedule, asset, row)
-
- asset_depr_schedule.save()
+def prepare_draft_asset_depreciation_schedule_data(
+ asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return
+):
+ set_draft_asset_depreciation_schedule_details(asset_depr_schedule, asset_doc.name, row)
+ make_depreciation_schedule(asset_depr_schedule, asset_doc, row, date_of_disposal)
+ set_accumulated_depreciation(
+ asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return
+ )
-def set_draft_asset_depreciation_schedule_details(asset_depr_schedule, asset_name, row):
- asset_depr_schedule.asset = asset_name
+def set_draft_asset_depreciation_schedule_details(asset_depr_schedule, asset, row):
+ asset_depr_schedule.asset = asset
asset_depr_schedule.finance_book = row.finance_book
asset_depr_schedule.depreciation_method = row.depreciation_method
asset_depr_schedule.total_number_of_depreciations = row.total_number_of_depreciations
@@ -60,11 +70,9 @@
asset_depr_schedule.status = "Draft"
-def convert_draft_asset_depreciation_schedules_into_active(asset):
- for row in asset.get("finance_books"):
- asset_depr_schedule_name = get_asset_depreciation_schedule_name(
- asset.name, row.finance_book
- )
+def convert_draft_asset_depreciation_schedules_into_active(asset_doc):
+ for row in asset_doc.get("finance_books"):
+ asset_depr_schedule_name = get_asset_depreciation_schedule(asset_doc.name, row.finance_book)
if not asset_depr_schedule_name:
return
@@ -77,50 +85,63 @@
def make_new_active_asset_depreciation_schedules_from_existing(
- asset, date_of_disposal=None, date_of_return=None
+ asset_doc, date_of_disposal=None, date_of_return=None, notes=None
):
- for row in asset.get("finance_books"):
- old_asset_depr_schedule_name = get_asset_depreciation_schedule_name(
- asset.name, row.finance_book
- )
+ for row in asset_doc.get("finance_books"):
+ old_asset_depr_schedule_name = get_asset_depreciation_schedule(asset_doc.name, row.finance_book)
if not old_asset_depr_schedule_name:
return
old_asset_depr_schedule = frappe.get_doc(
- "Asset Depreciation Schedule",
- old_asset_depr_schedule_name
+ "Asset Depreciation Schedule", old_asset_depr_schedule_name
)
asset_depr_schedule = frappe.copy_doc(old_asset_depr_schedule, ignore_no_copy=False)
- make_depreciation_schedule(asset_depr_schedule, asset, row, date_of_disposal)
- set_accumulated_depreciation(asset_depr_schedule, asset, row, date_of_disposal, date_of_return)
+ make_depreciation_schedule(asset_depr_schedule, asset_doc, row, date_of_disposal)
+ set_accumulated_depreciation(
+ asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return
+ )
- asset_depr_schedule.save()
+ asset_depr_schedule.notes = notes
+
+ asset_depr_schedule.submit()
-def make_depreciation_schedule(asset_depr_schedule, asset, row, date_of_disposal=None):
+def make_temp_asset_depreciation_schedule(
+ asset_doc, row, date_of_disposal=None, date_of_return=None
+):
+ asset_depr_schedule = frappe.new_doc("Asset Depreciation Schedule")
+
+ prepare_draft_asset_depreciation_schedule_data(
+ asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return
+ )
+
+ return asset_depr_schedule
+
+
+def get_asset_depreciation_schedule(asset, finance_book):
+ return frappe.db.get_value(
+ doctype="Asset Depreciation Schedule",
+ filters=[
+ ["asset", "=", asset],
+ ["finance_book", "=", finance_book],
+ ["docstatus", "<", 2],
+ ],
+ )
+
+
+def make_depreciation_schedule(asset_depr_schedule, asset_doc, row, date_of_disposal):
if row.depreciation_method != "Manual" and not asset_depr_schedule.get("depreciation_schedule"):
asset_depr_schedule.depreciation_schedule = []
- if not asset.available_for_use_date:
+ if not asset_doc.available_for_use_date:
return
start = clear_depreciation_schedule(asset_depr_schedule)
- _make_depreciation_schedule(asset_depr_schedule, asset, row, start, date_of_disposal)
-
-
-def get_asset_depreciation_schedule_name(asset_name, finance_book):
- return frappe.db.get_value(
- doctype="Asset Depreciation Schedule",
- filters=[
- ["asset", "=", asset_name],
- ["finance_book", "=", finance_book],
- ["docstatus", "<", 2],
- ]
- )
+ _make_depreciation_schedule(asset_depr_schedule, asset_doc, row, start, date_of_disposal)
def clear_depreciation_schedule(asset_depr_schedule):
@@ -152,17 +173,17 @@
return start
-def _make_depreciation_schedule(asset_depr_schedule, asset, row, start, date_of_disposal):
- asset.validate_asset_finance_books(row)
+def _make_depreciation_schedule(asset_depr_schedule, asset_doc, row, start, date_of_disposal):
+ asset_doc.validate_asset_finance_books(row)
- value_after_depreciation = asset._get_value_after_depreciation(row)
+ value_after_depreciation = asset_doc._get_value_after_depreciation(row)
row.value_after_depreciation = value_after_depreciation
number_of_pending_depreciations = cint(row.total_number_of_depreciations) - cint(
- asset.number_of_depreciations_booked
+ asset_doc.number_of_depreciations_booked
)
- has_pro_rata = asset.check_is_pro_rata(row)
+ has_pro_rata = asset_doc.check_is_pro_rata(row)
if has_pro_rata:
number_of_pending_depreciations += 1
@@ -174,12 +195,10 @@
if skip_row:
continue
- depreciation_amount = get_depreciation_amount(asset, value_after_depreciation, row)
+ depreciation_amount = get_depreciation_amount(asset_doc, value_after_depreciation, row)
if not has_pro_rata or n < cint(number_of_pending_depreciations) - 1:
- schedule_date = add_months(
- row.depreciation_start_date, n * cint(row.frequency_of_depreciation)
- )
+ schedule_date = add_months(row.depreciation_start_date, n * cint(row.frequency_of_depreciation))
if should_get_last_day:
schedule_date = get_last_day(schedule_date)
@@ -190,8 +209,8 @@
# if asset is being sold or scrapped
if date_of_disposal:
- from_date = asset.get_from_date(row.finance_book)
- depreciation_amount, days, months = asset.get_pro_rata_amt(
+ from_date = asset_doc.get_from_date(row.finance_book)
+ depreciation_amount, days, months = asset_doc.get_pro_rata_amt(
row, depreciation_amount, from_date, date_of_disposal
)
@@ -208,11 +227,11 @@
break
# For first row
- if has_pro_rata and not asset.opening_accumulated_depreciation and n == 0:
+ if has_pro_rata and not asset_doc.opening_accumulated_depreciation and n == 0:
from_date = add_days(
- asset.available_for_use_date, -1
+ asset_doc.available_for_use_date, -1
) # needed to calc depr amount for available_for_use_date too
- depreciation_amount, days, months = asset.get_pro_rata_amt(
+ depreciation_amount, days, months = asset_doc.get_pro_rata_amt(
row, depreciation_amount, from_date, row.depreciation_start_date
)
@@ -223,20 +242,20 @@
# For last row
elif has_pro_rata and n == cint(number_of_pending_depreciations) - 1:
- if not asset.flags.increase_in_asset_life:
+ if not asset_doc.flags.increase_in_asset_life:
# In case of increase_in_asset_life, the asset.to_date is already set on asset_repair submission
- asset.to_date = add_months(
- asset.available_for_use_date,
- (n + asset.number_of_depreciations_booked) * cint(row.frequency_of_depreciation),
+ asset_doc.to_date = add_months(
+ asset_doc.available_for_use_date,
+ (n + asset_doc.number_of_depreciations_booked) * cint(row.frequency_of_depreciation),
)
depreciation_amount_without_pro_rata = depreciation_amount
- depreciation_amount, days, months = asset.get_pro_rata_amt(
- row, depreciation_amount, schedule_date, asset.to_date
+ depreciation_amount, days, months = asset_doc.get_pro_rata_amt(
+ row, depreciation_amount, schedule_date, asset_doc.to_date
)
- depreciation_amount = asset.get_adjusted_depreciation_amount(
+ depreciation_amount = asset_doc.get_adjusted_depreciation_amount(
depreciation_amount_without_pro_rata, depreciation_amount, row.finance_book
)
@@ -246,7 +265,9 @@
if not depreciation_amount:
continue
- value_after_depreciation -= flt(depreciation_amount, asset.precision("gross_purchase_amount"))
+ value_after_depreciation -= flt(
+ depreciation_amount, asset_doc.precision("gross_purchase_amount")
+ )
# Adjust depreciation amount in the last period based on the expected value after useful life
if row.expected_value_after_useful_life and (
@@ -271,19 +292,19 @@
@erpnext.allow_regional
-def get_depreciation_amount(asset, depreciable_value, row):
+def get_depreciation_amount(asset_doc, depreciable_value, row):
if row.depreciation_method in ("Straight Line", "Manual"):
# if the Depreciation Schedule is being prepared for the first time
- if not asset.flags.increase_in_asset_life:
+ if not asset_doc.flags.increase_in_asset_life:
depreciation_amount = (
- flt(asset.gross_purchase_amount) - flt(row.expected_value_after_useful_life)
+ flt(asset_doc.gross_purchase_amount) - flt(row.expected_value_after_useful_life)
) / flt(row.total_number_of_depreciations)
# if the Depreciation Schedule is being modified after Asset Repair
else:
depreciation_amount = (
flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)
- ) / (date_diff(asset.to_date, asset.available_for_use_date) / 365)
+ ) / (date_diff(asset_doc.to_date, asset_doc.available_for_use_date) / 365)
else:
depreciation_amount = flt(depreciable_value * (flt(row.rate_of_depreciation) / 100))
@@ -296,7 +317,7 @@
depreciation_amount,
depreciation_method,
finance_book,
- finance_book_id
+ finance_book_id,
):
asset_depr_schedule.append(
"depreciation_schedule",
@@ -312,14 +333,15 @@
def set_accumulated_depreciation(
asset_depr_schedule,
- asset,
+ asset_doc,
row,
date_of_disposal=None,
date_of_return=None,
- ignore_booked_entry=False
+ ignore_booked_entry=False,
):
straight_line_idx = [
- d.idx for d in asset_depr_schedule.get("depreciation_schedule")
+ d.idx
+ for d in asset_depr_schedule.get("depreciation_schedule")
if d.depreciation_method == "Straight Line"
]
finance_books = []
@@ -329,8 +351,8 @@
continue
if int(d.finance_book_id) not in finance_books:
- accumulated_depreciation = flt(asset.opening_accumulated_depreciation)
- value_after_depreciation = flt(asset.get_value_after_depreciation(d.finance_book_id))
+ accumulated_depreciation = flt(asset_doc.opening_accumulated_depreciation)
+ value_after_depreciation = flt(asset_doc.get_value_after_depreciation(d.finance_book_id))
finance_books.append(int(d.finance_book_id))
depreciation_amount = flt(d.depreciation_amount, d.precision("depreciation_amount"))
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index d5913c5..ca6225f 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -8,6 +8,9 @@
import erpnext
from erpnext.accounts.general_ledger import make_gl_entries
from erpnext.assets.doctype.asset.asset import get_asset_account
+from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import (
+ get_asset_depreciation_schedule,
+)
from erpnext.controllers.accounts_controller import AccountsController
@@ -279,8 +282,11 @@
asset.number_of_depreciations_booked
)
+ asset_depr_schedule = get_asset_depreciation_schedule(asset.name, row.finance_book)
+ depr_schedule = asset_depr_schedule.get("depreciation_schedule")
+
# the Schedule Date in the final row of the old Depreciation Schedule
- last_schedule_date = asset.schedules[len(asset.schedules) - 1].schedule_date
+ last_schedule_date = asset_depr_schedule[len(asset_depr_schedule) - 1].schedule_date
# the Schedule Date in the final row of the new Depreciation Schedule
asset.to_date = add_months(last_schedule_date, extra_months)
@@ -310,8 +316,11 @@
asset.number_of_depreciations_booked
)
+ asset_depr_schedule = get_asset_depreciation_schedule(asset.name, row.finance_book)
+ depr_schedule = asset_depr_schedule.get("depreciation_schedule")
+
# the Schedule Date in the final row of the modified Depreciation Schedule
- last_schedule_date = asset.schedules[len(asset.schedules) - 1].schedule_date
+ last_schedule_date = asset_depr_schedule[len(asset_depr_schedule) - 1].schedule_date
# the Schedule Date in the final row of the original Depreciation Schedule
asset.to_date = add_months(last_schedule_date, -extra_months)