From 61e3c87b7620e08fff3b1c0d388573ab61809c2f Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Mon, 7 Nov 2022 17:41:03 +0100 Subject: [PATCH] [FIX] assets_management: Consider depreciation of all previous years --- assets_management/readme/CONTRIBUTORS.rst | 3 + assets_management/report/asset_journal.py | 7 ++ assets_management/report/asset_previsional.py | 7 ++ .../tests/test_assets_management.py | 93 +++++++++++++++++++ 4 files changed, 110 insertions(+) diff --git a/assets_management/readme/CONTRIBUTORS.rst b/assets_management/readme/CONTRIBUTORS.rst index 909bfb572ab6..590545f2f237 100644 --- a/assets_management/readme/CONTRIBUTORS.rst +++ b/assets_management/readme/CONTRIBUTORS.rst @@ -2,5 +2,8 @@ * Silvio Gregorini * Stefano Pezzini * Lorenzo Battistini +* `TAKOBI `_: + + * Simone Rubino Base icon made by `surang `_ from `www.flaticon.com `_. diff --git a/assets_management/report/asset_journal.py b/assets_management/report/asset_journal.py index c616ba21d8ae..1f9ce9e2fa3f 100644 --- a/assets_management/report/asset_journal.py +++ b/assets_management/report/asset_journal.py @@ -1,5 +1,6 @@ # Author(s): Silvio Gregorini (silviogregorini@openforce.it) # Copyright 2019 Openforce Srls Unipersonale (www.openforce.it) +# Copyright 2022 Simone Rubino - TAKOBI # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from collections import OrderedDict @@ -360,6 +361,12 @@ def generate_totals(self): if fy_start <= report_date <= fy_end: totals_by_dep_type[dep_type][fname] += \ line_curr.compute(last_line[fname], curr) + elif fy_end < report_date: + totals_by_dep_type[dep_type][fname] += \ + line_curr.compute( + last_line['amount_depreciation_fund_curr_year'], + curr, + ) elif fname in ( 'amount_in_total', 'amount_out_total', diff --git a/assets_management/report/asset_previsional.py b/assets_management/report/asset_previsional.py index fa25a817bc87..c7fe662bc533 100644 --- a/assets_management/report/asset_previsional.py +++ b/assets_management/report/asset_previsional.py @@ -1,5 +1,6 @@ # Author(s): Silvio Gregorini (silviogregorini@openforce.it) # Copyright 2019 Openforce Srls Unipersonale (www.openforce.it) +# Copyright 2022 Simone Rubino - TAKOBI # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from collections import OrderedDict @@ -391,6 +392,12 @@ def generate_totals(self): if fy_start <= report_date <= fy_end: totals_by_dep_type[dep_type][fname] += \ line_curr.compute(last_line[fname], curr) + elif fy_end < report_date: + totals_by_dep_type[dep_type][fname] += \ + line_curr.compute( + last_line['amount_depreciation_fund_curr_year'], + curr, + ) elif fname in ( 'amount_in_total', 'amount_out_total', diff --git a/assets_management/tests/test_assets_management.py b/assets_management/tests/test_assets_management.py index cc1a10a1c410..049d1f5c753b 100644 --- a/assets_management/tests/test_assets_management.py +++ b/assets_management/tests/test_assets_management.py @@ -1,6 +1,10 @@ # Copyright 2021 Sergio Corato +# Copyright 2022 Simone Rubino - TAKOBI # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from datetime import date + from odoo import fields +from odoo.fields import first from odoo.tests.common import TransactionCase from dateutil.relativedelta import relativedelta @@ -75,3 +79,92 @@ def test_create_depreciation(self): wiz_vals['context'] ).create({}) wiz.do_generate() + + def _civil_depreciate_asset(self, asset): + # Keep only one civil depreciation + civil_depreciation_type = self.env.ref( + 'assets_management.ad_type_civilistico') + civil_depreciation = first(asset.depreciation_ids.filtered( + lambda d: d.type_id == civil_depreciation_type + )) + (asset.depreciation_ids - civil_depreciation).unlink() + + civil_depreciation.line_ids = [ + (5, 0, 0), + (0, 0, { + 'name': '2019', + 'date': date(2019, 12, 31), + 'move_type': 'depreciated', + 'amount': 500, + }), + (0, 0, { + 'name': '2020', + 'date': date(2020, 12, 31), + 'move_type': 'depreciated', + 'amount': 500, + }), + ] + return True + + def _generate_fiscal_years(self, start_date, end_date): + fiscal_years = range( + start_date.year, + end_date.year, + ) + fiscal_years_values = list() + for fiscal_year in fiscal_years: + fiscal_year_values = { + "name": "Fiscal Year %d" % fiscal_year, + "date_from": date(fiscal_year, 1, 1), + "date_to": date(fiscal_year, 12, 31), + } + fiscal_years_values.append(fiscal_year_values) + return self.env['account.fiscal.year'].create(fiscal_years_values) + + def _get_report_values(self, report_type): + if report_type == 'previsional': + wizard_model = 'wizard.asset.previsional.report' + report_model = 'report_asset_previsional' + export_method = 'export_asset_previsional_report' + elif report_type == 'journal': + wizard_model = 'wizard.asset.journal.report' + report_model = 'report_asset_journal' + export_method = 'export_asset_journal_report' + else: + raise Exception("Report can only be 'journal' or 'previsional'") + return export_method, report_model, wizard_model + + def _get_report(self, report_date, report_type): + export_method, report_model, wizard_model = \ + self._get_report_values(report_type) + + wiz = self.env[wizard_model].create({ + 'date': report_date, + }) + report_result = getattr(wiz, export_method)() + report_ids = report_result['context']['active_ids'] + report = self.env[report_model].browse(report_ids) + return report + + def test_journal_prev_year(self): + """ + Previous year depreciation considers depreciation of all previous years + """ + # Arrange: Create an asset bought in 2019 + # and totally depreciated in 2019 and 2020 + asset = self._create_asset() + purchase_date = date(2019, 1, 1) + asset.purchase_date = purchase_date + self.assertEqual(asset.purchase_amount, 1000) + self._civil_depreciate_asset(asset) + self.assertEqual(asset.state, 'totally_depreciated') + + # Act: Generate the asset journal report for 2022 + report_date = date(2022, 11, 7) + self._generate_fiscal_years(purchase_date, report_date) + report = self._get_report(report_date, 'journal') + + # Assert: The previous year depreciation counts.the depreciation of 2020 + total = report.report_total_ids + self.assertEqual(total.amount_depreciation_fund_curr_year, 1000) + self.assertEqual(total.amount_depreciation_fund_prev_year, 1000)