From 0a3899b72c8d1927abaf81edbe4a1de2f2da7aa8 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Wed, 2 Nov 2016 15:24:20 +0100 Subject: [PATCH] [FIX] account_asset: first depreciation amount When an asset is set as Prorata Temporis, with a one month period, the first depreciation amount is computed on the basis of the remaining days in the purchase year. This doesn't make sense for a monthly depreciation. This commit makes the distinction between a monthly and a yearly depreciation. In the case of a monthly depreciation, the remaining days in the purchase month are taken into account. opw-690034 --- addons/account_asset/account_asset.py | 25 +++++++++++++++---- .../account_asset/tests/test_account_asset.py | 2 +- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/addons/account_asset/account_asset.py b/addons/account_asset/account_asset.py index 25b5d1b2d6f..faf0efc85fe 100644 --- a/addons/account_asset/account_asset.py +++ b/addons/account_asset/account_asset.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- +import calendar from datetime import date, datetime from dateutil.relativedelta import relativedelta from openerp import api, fields, models, _ from openerp.exceptions import UserError, ValidationError from openerp.tools import DEFAULT_SERVER_DATE_FORMAT as DF -from openerp.tools import float_compare +from openerp.tools import float_compare, float_is_zero class AccountAssetCategory(models.Model): @@ -129,14 +130,26 @@ class AccountAssetAsset(models.Model): if self.prorata: amount = amount_to_depr / self.method_number if sequence == 1: - days = (self.company_id.compute_fiscalyear_dates(depreciation_date)['date_to'] - depreciation_date).days + 1 - amount = (amount_to_depr / self.method_number) / total_days * days + if self.method_period % 12 != 0: + date = datetime.strptime(self.date, '%Y-%m-%d') + month_days = calendar.monthrange(date.year, date.month)[1] + days = month_days - date.day + 1 + amount = (amount_to_depr / self.method_number) / month_days * days + else: + days = (self.company_id.compute_fiscalyear_dates(depreciation_date)['date_to'] - depreciation_date).days + 1 + amount = (amount_to_depr / self.method_number) / total_days * days elif self.method == 'degressive': amount = residual_amount * self.method_progress_factor if self.prorata: if sequence == 1: - days = (self.company_id.compute_fiscalyear_dates(depreciation_date)['date_to'] - depreciation_date).days + 1 - amount = (residual_amount * self.method_progress_factor) / total_days * days + if self.method_period % 12 != 0: + date = datetime.strptime(self.date, '%Y-%m-%d') + month_days = calendar.monthrange(date.year, date.month)[1] + days = month_days - date.day + 1 + amount = (residual_amount * self.method_progress_factor) / month_days * days + else: + days = (self.company_id.compute_fiscalyear_dates(depreciation_date)['date_to'] - depreciation_date).days + 1 + amount = (residual_amount * self.method_progress_factor) / total_days * days return amount def _compute_board_undone_dotation_nb(self, depreciation_date, total_days): @@ -189,6 +202,8 @@ class AccountAssetAsset(models.Model): sequence = x + 1 amount = self._compute_board_amount(sequence, residual_amount, amount_to_depr, undone_dotation_number, posted_depreciation_line_ids, total_days, depreciation_date) amount = self.currency_id.round(amount) + if float_is_zero(amount, precision_rounding=self.currency_id.rounding): + continue residual_amount -= amount vals = { 'amount': amount, diff --git a/addons/account_asset/tests/test_account_asset.py b/addons/account_asset/tests/test_account_asset.py index dce2cda9d19..6bcfb16806e 100644 --- a/addons/account_asset/tests/test_account_asset.py +++ b/addons/account_asset/tests/test_account_asset.py @@ -61,7 +61,7 @@ class TestAccountAsset(common.TransactionCase): asset_modify_number_0.with_context({'active_id': account_asset_asset_office0.id}).modify() # I check the proper depreciation lines created. - self.assertEqual(account_asset_asset_office0.method_number, len(account_asset_asset_office0.depreciation_line_ids) - 1) + self.assertEqual(account_asset_asset_office0.method_number, len(account_asset_asset_office0.depreciation_line_ids)) # I compute a asset on period. context = {