mirror of
https://github.com/frappe/erpnext.git
synced 2026-03-19 10:14:59 +00:00
fix: Get pro-rata depr amount based on correct days
This commit is contained in:
@@ -437,6 +437,7 @@ class Asset(AccountsController):
|
|||||||
depreciation_amount,
|
depreciation_amount,
|
||||||
from_date,
|
from_date,
|
||||||
date_of_disposal,
|
date_of_disposal,
|
||||||
|
original_schedule_date=schedule_date,
|
||||||
)
|
)
|
||||||
|
|
||||||
if depreciation_amount > 0:
|
if depreciation_amount > 0:
|
||||||
@@ -1118,14 +1119,20 @@ class Asset(AccountsController):
|
|||||||
return flt((100 * (1 - depreciation_rate)), float_precision)
|
return flt((100 * (1 - depreciation_rate)), float_precision)
|
||||||
|
|
||||||
def get_pro_rata_amt(
|
def get_pro_rata_amt(
|
||||||
self, row, depreciation_amount, from_date, to_date, has_wdv_or_dd_non_yearly_pro_rata=False
|
self,
|
||||||
|
row,
|
||||||
|
depreciation_amount,
|
||||||
|
from_date,
|
||||||
|
to_date,
|
||||||
|
has_wdv_or_dd_non_yearly_pro_rata=False,
|
||||||
|
original_schedule_date=None,
|
||||||
):
|
):
|
||||||
days = date_diff(to_date, from_date)
|
days = date_diff(to_date, from_date)
|
||||||
months = month_diff(to_date, from_date)
|
months = month_diff(to_date, from_date)
|
||||||
if has_wdv_or_dd_non_yearly_pro_rata:
|
if has_wdv_or_dd_non_yearly_pro_rata:
|
||||||
total_days = get_total_days(to_date, 12)
|
total_days = get_total_days(original_schedule_date or to_date, 12)
|
||||||
else:
|
else:
|
||||||
total_days = get_total_days(to_date, row.frequency_of_depreciation)
|
total_days = get_total_days(original_schedule_date or to_date, row.frequency_of_depreciation)
|
||||||
|
|
||||||
return (depreciation_amount * flt(days)) / flt(total_days), days, months
|
return (depreciation_amount * flt(days)) / flt(total_days), days, months
|
||||||
|
|
||||||
@@ -1445,32 +1452,35 @@ def get_straight_line_or_manual_depr_amount(
|
|||||||
# if the Depreciation Schedule is being modified after Asset Value Adjustment due to decrease in asset value
|
# if the Depreciation Schedule is being modified after Asset Value Adjustment due to decrease in asset value
|
||||||
elif asset.flags.decrease_in_asset_value_due_to_value_adjustment:
|
elif asset.flags.decrease_in_asset_value_due_to_value_adjustment:
|
||||||
if row.daily_prorata_based:
|
if row.daily_prorata_based:
|
||||||
daily_depr_amount = (
|
amount = flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)
|
||||||
flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)
|
total_days = (
|
||||||
) / date_diff(
|
date_diff(
|
||||||
get_last_day(
|
|
||||||
add_months(
|
|
||||||
row.depreciation_start_date,
|
|
||||||
flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked - 1)
|
|
||||||
* row.frequency_of_depreciation,
|
|
||||||
)
|
|
||||||
),
|
|
||||||
add_days(
|
|
||||||
get_last_day(
|
get_last_day(
|
||||||
add_months(
|
add_months(
|
||||||
row.depreciation_start_date,
|
row.depreciation_start_date,
|
||||||
flt(
|
flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked - 1)
|
||||||
row.total_number_of_depreciations
|
|
||||||
- asset.number_of_depreciations_booked
|
|
||||||
- number_of_pending_depreciations
|
|
||||||
- 1
|
|
||||||
)
|
|
||||||
* row.frequency_of_depreciation,
|
* row.frequency_of_depreciation,
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
1,
|
add_days(
|
||||||
),
|
get_last_day(
|
||||||
|
add_months(
|
||||||
|
row.depreciation_start_date,
|
||||||
|
flt(
|
||||||
|
row.total_number_of_depreciations
|
||||||
|
- asset.number_of_depreciations_booked
|
||||||
|
- number_of_pending_depreciations
|
||||||
|
- 1
|
||||||
|
)
|
||||||
|
* row.frequency_of_depreciation,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
+ 1
|
||||||
)
|
)
|
||||||
|
daily_depr_amount = amount / total_days
|
||||||
|
|
||||||
to_date = get_last_day(
|
to_date = get_last_day(
|
||||||
add_months(row.depreciation_start_date, schedule_idx * row.frequency_of_depreciation)
|
add_months(row.depreciation_start_date, schedule_idx * row.frequency_of_depreciation)
|
||||||
@@ -1490,22 +1500,28 @@ def get_straight_line_or_manual_depr_amount(
|
|||||||
# if the Depreciation Schedule is being prepared for the first time
|
# if the Depreciation Schedule is being prepared for the first time
|
||||||
else:
|
else:
|
||||||
if row.daily_prorata_based:
|
if row.daily_prorata_based:
|
||||||
daily_depr_amount = (
|
|
||||||
|
amount = (
|
||||||
flt(asset.gross_purchase_amount)
|
flt(asset.gross_purchase_amount)
|
||||||
- flt(asset.opening_accumulated_depreciation)
|
- flt(asset.opening_accumulated_depreciation)
|
||||||
- flt(row.expected_value_after_useful_life)
|
- flt(row.expected_value_after_useful_life)
|
||||||
) / date_diff(
|
|
||||||
get_last_day(
|
|
||||||
add_months(
|
|
||||||
row.depreciation_start_date,
|
|
||||||
flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked - 1)
|
|
||||||
* row.frequency_of_depreciation,
|
|
||||||
)
|
|
||||||
),
|
|
||||||
add_days(
|
|
||||||
get_last_day(add_months(row.depreciation_start_date, -1 * row.frequency_of_depreciation)), 1
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
|
total_days = (
|
||||||
|
date_diff(
|
||||||
|
get_last_day(
|
||||||
|
add_months(
|
||||||
|
row.depreciation_start_date,
|
||||||
|
flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked - 1)
|
||||||
|
* row.frequency_of_depreciation,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
add_days(
|
||||||
|
get_last_day(add_months(row.depreciation_start_date, -1 * row.frequency_of_depreciation)), 1
|
||||||
|
),
|
||||||
|
)
|
||||||
|
+ 1
|
||||||
|
)
|
||||||
|
daily_depr_amount = amount / total_days
|
||||||
|
|
||||||
to_date = get_last_day(
|
to_date = get_last_day(
|
||||||
add_months(row.depreciation_start_date, schedule_idx * row.frequency_of_depreciation)
|
add_months(row.depreciation_start_date, schedule_idx * row.frequency_of_depreciation)
|
||||||
|
|||||||
@@ -219,7 +219,11 @@ class TestAsset(AssetSetup):
|
|||||||
asset.precision("gross_purchase_amount"),
|
asset.precision("gross_purchase_amount"),
|
||||||
)
|
)
|
||||||
pro_rata_amount, _, _ = asset.get_pro_rata_amt(
|
pro_rata_amount, _, _ = asset.get_pro_rata_amt(
|
||||||
asset.finance_books[0], 9000, get_last_day(add_months(purchase_date, 1)), date
|
asset.finance_books[0],
|
||||||
|
9000,
|
||||||
|
get_last_day(add_months(purchase_date, 1)),
|
||||||
|
date,
|
||||||
|
original_schedule_date=get_last_day(nowdate()),
|
||||||
)
|
)
|
||||||
pro_rata_amount = flt(pro_rata_amount, asset.precision("gross_purchase_amount"))
|
pro_rata_amount = flt(pro_rata_amount, asset.precision("gross_purchase_amount"))
|
||||||
self.assertEquals(
|
self.assertEquals(
|
||||||
@@ -287,7 +291,11 @@ class TestAsset(AssetSetup):
|
|||||||
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
|
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
|
||||||
|
|
||||||
pro_rata_amount, _, _ = asset.get_pro_rata_amt(
|
pro_rata_amount, _, _ = asset.get_pro_rata_amt(
|
||||||
asset.finance_books[0], 9000, get_last_day(add_months(purchase_date, 1)), date
|
asset.finance_books[0],
|
||||||
|
9000,
|
||||||
|
get_last_day(add_months(purchase_date, 1)),
|
||||||
|
date,
|
||||||
|
original_schedule_date=get_last_day(nowdate()),
|
||||||
)
|
)
|
||||||
pro_rata_amount = flt(pro_rata_amount, asset.precision("gross_purchase_amount"))
|
pro_rata_amount = flt(pro_rata_amount, asset.precision("gross_purchase_amount"))
|
||||||
|
|
||||||
@@ -349,7 +357,7 @@ class TestAsset(AssetSetup):
|
|||||||
|
|
||||||
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
|
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
|
||||||
|
|
||||||
expected_values = [["2023-03-31", 12000, 36000], ["2023-05-23", 1742.47, 37742.47]]
|
expected_values = [["2023-03-31", 12000, 36000], ["2023-05-23", 1737.7, 37737.7]]
|
||||||
|
|
||||||
for i, schedule in enumerate(asset.schedules):
|
for i, schedule in enumerate(asset.schedules):
|
||||||
self.assertEqual(getdate(expected_values[i][0]), schedule.schedule_date)
|
self.assertEqual(getdate(expected_values[i][0]), schedule.schedule_date)
|
||||||
@@ -360,7 +368,7 @@ class TestAsset(AssetSetup):
|
|||||||
expected_gle = (
|
expected_gle = (
|
||||||
(
|
(
|
||||||
"_Test Accumulated Depreciations - _TC",
|
"_Test Accumulated Depreciations - _TC",
|
||||||
37742.47,
|
37737.7,
|
||||||
0.0,
|
0.0,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
@@ -371,7 +379,7 @@ class TestAsset(AssetSetup):
|
|||||||
(
|
(
|
||||||
"_Test Gain/Loss on Asset Disposal - _TC",
|
"_Test Gain/Loss on Asset Disposal - _TC",
|
||||||
0.0,
|
0.0,
|
||||||
17742.47,
|
17737.7,
|
||||||
),
|
),
|
||||||
("Debtors - _TC", 40000.0, 0.0),
|
("Debtors - _TC", 40000.0, 0.0),
|
||||||
)
|
)
|
||||||
@@ -691,18 +699,18 @@ class TestDepreciationMethods(AssetSetup):
|
|||||||
)
|
)
|
||||||
|
|
||||||
expected_schedules = [
|
expected_schedules = [
|
||||||
["2023-01-31", 1021.98, 1021.98],
|
["2023-01-31", 1019.18, 1019.18],
|
||||||
["2023-02-28", 923.08, 1945.06],
|
["2023-02-28", 920.55, 1939.73],
|
||||||
["2023-03-31", 1021.98, 2967.04],
|
["2023-03-31", 1019.18, 2958.91],
|
||||||
["2023-04-30", 989.01, 3956.05],
|
["2023-04-30", 986.3, 3945.21],
|
||||||
["2023-05-31", 1021.98, 4978.03],
|
["2023-05-31", 1019.18, 4964.39],
|
||||||
["2023-06-30", 989.01, 5967.04],
|
["2023-06-30", 986.3, 5950.69],
|
||||||
["2023-07-31", 1021.98, 6989.02],
|
["2023-07-31", 1019.18, 6969.87],
|
||||||
["2023-08-31", 1021.98, 8011.0],
|
["2023-08-31", 1019.18, 7989.05],
|
||||||
["2023-09-30", 989.01, 9000.01],
|
["2023-09-30", 986.3, 8975.35],
|
||||||
["2023-10-31", 1021.98, 10021.99],
|
["2023-10-31", 1019.18, 9994.53],
|
||||||
["2023-11-30", 989.01, 11011.0],
|
["2023-11-30", 986.3, 10980.83],
|
||||||
["2023-12-31", 989.0, 12000.0],
|
["2023-12-31", 1019.17, 12000.0],
|
||||||
]
|
]
|
||||||
|
|
||||||
schedules = [
|
schedules = [
|
||||||
|
|||||||
Reference in New Issue
Block a user