fix: Get pro-rata depr amount based on correct days

This commit is contained in:
Nabin Hait
2024-04-07 14:08:45 +05:30
parent 81081663c4
commit 10d760089e
2 changed files with 75 additions and 51 deletions

View File

@@ -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,9 +1452,9 @@ 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( get_last_day(
add_months( add_months(
row.depreciation_start_date, row.depreciation_start_date,
@@ -1471,6 +1478,9 @@ def get_straight_line_or_manual_depr_amount(
1, 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,11 +1500,14 @@ 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( )
total_days = (
date_diff(
get_last_day( get_last_day(
add_months( add_months(
row.depreciation_start_date, row.depreciation_start_date,
@@ -1506,6 +1519,9 @@ def get_straight_line_or_manual_depr_amount(
get_last_day(add_months(row.depreciation_start_date, -1 * row.frequency_of_depreciation)), 1 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)

View File

@@ -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 = [