diff --git a/account_asset_management/__init__.py b/account_asset_management/__init__.py index 9b4296142..7660e7bf6 100644 --- a/account_asset_management/__init__.py +++ b/account_asset_management/__init__.py @@ -1,2 +1,3 @@ from . import models +from . import report from . import wizard diff --git a/account_asset_management/__manifest__.py b/account_asset_management/__manifest__.py index 6fa1cb3b7..116cb9ec1 100644 --- a/account_asset_management/__manifest__.py +++ b/account_asset_management/__manifest__.py @@ -16,6 +16,7 @@ 'data': [ 'security/account_asset_security.xml', 'security/ir.model.access.csv', + 'report/account_asset_report_views.xml', 'wizard/account_asset_compute.xml', 'wizard/account_asset_remove.xml', 'views/account_account.xml', diff --git a/account_asset_management/report/__init__.py b/account_asset_management/report/__init__.py new file mode 100644 index 000000000..d73a2f553 --- /dev/null +++ b/account_asset_management/report/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account_asset_report diff --git a/account_asset_management/report/account_asset_report.py b/account_asset_management/report/account_asset_report.py new file mode 100644 index 000000000..c98f87b00 --- /dev/null +++ b/account_asset_management/report/account_asset_report.py @@ -0,0 +1,91 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +# Copyright 2020 Tecnativa - Pedro M. Baeza + +from odoo import api, fields, models, tools + + +class AssetAssetReport(models.Model): + _name = "account.asset.report" + _description = "Assets Analysis" + _auto = False + + def _selection_state(self): + return self.env["account.asset"].fields_get( + allfields=["state"] + )["state"]["selection"] + + date = fields.Date(readonly=True) + depreciation_date = fields.Date(string='Depreciation Date', readonly=True) + asset_id = fields.Many2one( + comodel_name="account.asset", string="Asset", readonly=True, + ) + asset_profile_id = fields.Many2one( + comodel_name="account.asset.profile", + string="Asset profile", + readonly=True, + ) + partner_id = fields.Many2one( + comodel_name="res.partner", string="Partner", readonly=True) + state = fields.Selection( + selection=lambda self: self._selection_state(), + string="Status", + readonly=True, + ) + depreciation_value = fields.Float( + string="Amount of Depreciation Lines", readonly=True + ) + move_check = fields.Boolean(string="Posted", readonly=True) + depreciation_count = fields.Integer( + string="# of Depreciation Lines", readonly=True, + ) + gross_value = fields.Float(string="Gross Amount", readonly=True) + posted_value = fields.Float(string="Posted Amount", readonly=True) + unposted_value = fields.Float(string="Unposted Amount", readonly=True) + company_id = fields.Many2one( + comodel_name="res.company", string="Company", readonly=True + ) + + @api.model_cr + def init(self): + tools.drop_view_if_exists(self._cr, 'account_asset_report') + self._cr.execute(""" + CREATE OR REPLACE VIEW account_asset_report AS ( + select + min(aal.id) as id, + aal.line_date as depreciation_date, + aa.date_start as date, + (CASE WHEN dlmin.id = min(aal.id) + THEN aa.purchase_value + ELSE 0 + END) as gross_value, + SUM(aal.amount) as depreciation_value, + SUM(CASE WHEN aal.move_check + THEN aal.amount + ELSE 0 + END) as posted_value, + SUM(CASE WHEN NOT aal.move_check + THEN aal.amount + ELSE 0 + END) as unposted_value, + aal.asset_id as asset_id, + aal.move_check as move_check, + aa.profile_id as asset_profile_id, + aa.partner_id as partner_id, + aa.state as state, + count(aal.*) as depreciation_count, + aa.company_id as company_id + FROM account_asset_line aal + LEFT JOIN account_asset aa on aal.asset_id=aa.id + LEFT JOIN ( + SELECT min(d.id) as id, ac.id as ac_id + FROM account_asset_line as d + INNER JOIN account_asset as ac + ON ac.id = d.asset_id AND d.type = 'depreciate' + GROUP BY ac_id + ) AS dlmin on dlmin.ac_id = aa.id + WHERE aal.type = 'depreciate' + GROUP BY + aal.asset_id, aal.line_date, aa.date_start, + aal.move_check, aa.state, aa.profile_id, + aa.partner_id, aa.company_id, aa.id, dlmin.id + )""") diff --git a/account_asset_management/report/account_asset_report_views.xml b/account_asset_management/report/account_asset_report_views.xml new file mode 100644 index 000000000..d972fe10a --- /dev/null +++ b/account_asset_management/report/account_asset_report_views.xml @@ -0,0 +1,69 @@ + + + + account.asset.report + + + + + + + + + + account.asset.report + + + + + + + + + + account.asset.report + + + + + + + + + + + + + + + + + + + + + + + + + + Assets Analysis + account.asset.report + form + pivot,graph + + {'search_default_only_active': 1} + +

+ From this report, you can have an overview on all depreciations. The + search bar can also be used to personalize your assets depreciation reporting. +

+
+
+ + +
diff --git a/account_asset_management/security/ir.model.access.csv b/account_asset_management/security/ir.model.access.csv index 9ea3d8171..a8a2d0acd 100644 --- a/account_asset_management/security/ir.model.access.csv +++ b/account_asset_management/security/ir.model.access.csv @@ -13,3 +13,4 @@ access_account_asset_recompute_trigger_manager,account.asset.recompute.trigger,m access_account_asset_group_invoice,account.asset.group,model_account_asset_group,account.group_account_invoice,1,0,0,0 access_account_asset_group_user,account.asset.group,model_account_asset_group,account.group_account_user,1,0,0,0 access_account_asset_group_manager,account.asset.group,model_account_asset_group,account.group_account_manager,1,1,1,1 +access_account_asset_report,account.asset.report,model_account_asset_report,account.group_account_user,1,0,0,0