diff --git a/mis_builder/models/mis_report_instance.py b/mis_builder/models/mis_report_instance.py index 6afb21b1a..b4a616720 100644 --- a/mis_builder/models/mis_report_instance.py +++ b/mis_builder/models/mis_report_instance.py @@ -277,11 +277,11 @@ def _compute_dates(self): comodel_name="mis.report.instance.period", compute="_compute_allowed_cmpcol_ids" ) # filters - analytic_account_id = fields.Many2one( + analytic_account_ids = fields.Many2one( comodel_name="account.analytic.account", - string="Analytic Account", + string="Analytic Accounts", help=( - "Filter column on journal entries that match this analytic account." + "Filter column on journal entries that have one of these analytic accounts." "This filter is combined with a AND with the report-level filters " "and cannot be modified in the preview." ), @@ -422,8 +422,8 @@ def _get_additional_move_line_filter(self): self.report_instance_id.target_move, aml_model_name ) ) - if self.analytic_account_id: - domain.append(("analytic_account_id", "=", self.analytic_account_id.id)) + if self.analytic_account_ids: + domain.append(("analytic_account_id", "in", self.analytic_account_ids.ids)) if self.analytic_group_id: domain.append( ("analytic_account_id.group_id", "=", self.analytic_group_id.id) @@ -572,8 +572,8 @@ def _compute_pivot_date(self): date_from = fields.Date(string="From") date_to = fields.Date(string="To") temporary = fields.Boolean(default=False) - analytic_account_id = fields.Many2one( - comodel_name="account.analytic.account", string="Analytic Account" + analytic_account_ids = fields.Many2many( + comodel_name="account.analytic.account", string="Analytic Accounts" ) analytic_group_id = fields.Many2one( comodel_name="account.analytic.group", @@ -618,14 +618,15 @@ def _compute_query_company_ids(self): @api.model def get_filter_descriptions_from_context(self): filters = self.env.context.get("mis_report_filters", {}) - analytic_account_id = filters.get("analytic_account_id", {}).get("value") + analytic_account_ids = filters.get("analytic_account_ids", {}).get("value") filter_descriptions = [] - if analytic_account_id: - analytic_account = self.env["account.analytic.account"].browse( - analytic_account_id + if analytic_account_ids: + analytic_accounts = self.env["account.analytic.account"].browse( + analytic_account_ids ) filter_descriptions.append( - _("Analytic Account: %s") % analytic_account.display_name + _("Analytic Accounts: %s") + % ", ".join(analytic_accounts.mapped("display_name")) ) analytic_group_id = filters.get("analytic_account_id.group_id", {}).get("value") if analytic_group_id: @@ -713,10 +714,10 @@ def _onchange_dates(self): def _add_analytic_filters_to_context(self, context): self.ensure_one() - if self.analytic_account_id: + if self.analytic_account_ids: context["mis_report_filters"]["analytic_account_id"] = { - "value": self.analytic_account_id.id, - "operator": "=", + "value": self.analytic_account_ids.ids, + "operator": "in", } if self.analytic_group_id: context["mis_report_filters"]["analytic_account_id.group_id"] = { diff --git a/mis_builder/static/src/js/mis_report_widget.js b/mis_builder/static/src/js/mis_report_widget.js index fedfe9032..6cf2584fb 100644 --- a/mis_builder/static/src/js/mis_report_widget.js +++ b/mis_builder/static/src/js/mis_report_widget.js @@ -31,9 +31,9 @@ odoo.define("mis_builder.widget", function (require) { self._super.apply(self, arguments); StandaloneFieldManagerMixin.init.call(self); self.model = new BasicModel(self); // For FieldManagerMixin - self.analytic_account_id_domain = []; // TODO unused for now - self.analytic_account_id_label = _t("Analytic Account Filter"); - self.analytic_account_id_m2o = undefined; // Field widget + self.analytic_account_ids_domain = []; // TODO unused for now + self.analytic_account_ids_label = _t("Analytic Accounts Filter"); + self.analytic_account_ids_m2m = undefined; // Field widget self.analytic_group_id_domain = []; // TODO unused for now self.analytic_group_filter_name = "analytic_account_id.group_id"; self.analytic_group_id_label = _t("Analytic Account Group"); @@ -174,8 +174,8 @@ odoo.define("mis_builder.widget", function (require) { if (self.has_group_analytic_accounting) { fields.push({ relation: "account.analytic.account", - type: "many2one", - name: "filter_analytic_account_id", + type: "many2many", + name: "filter_analytic_account_ids", value: self._getFilterValue("analytic_account_id"), }); fields.push({ @@ -215,27 +215,28 @@ odoo.define("mis_builder.widget", function (require) { var self = this; if (self.has_group_analytic_accounting) { - self.analytic_account_id_m2o = new relational_fields.FieldMany2One( - self, - "filter_analytic_account_id", - record, - { - mode: "edit", - attrs: { - placeholder: self.analytic_account_id_label, - options: { - no_create: "True", - no_open: "True", + self.analytic_account_ids_m2m = + new relational_fields.FieldMany2ManyTags( + self, + "filter_analytic_account_ids", + record, + { + mode: "edit", + attrs: { + placeholder: self.analytic_account_ids_label, + options: { + no_create: "True", + no_open: "True", + }, }, - }, - } - ); + } + ); self._registerWidget( record.id, - self.analytic_account_id_m2o.name, - self.analytic_account_id_m2o + self.analytic_account_ids_m2m.name, + self.analytic_account_ids_m2m ); - self.analytic_account_id_m2o.appendTo(self.getMisBuilderFilterBox()); + self.analytic_account_ids_m2m.appendTo(self.getMisBuilderFilterBox()); self.analytic_group_id_m2o = new relational_fields.FieldMany2One( self, @@ -298,6 +299,12 @@ odoo.define("mis_builder.widget", function (require) { var self = this; var defs = []; + if (self.has_group_analytic_accounting) { + var dataPointAnalytic = record.data.filter_analytic_account_ids; + dataPointAnalytic.fieldsInfo.default.display_name = {}; + defs.push(self.model.reload(dataPointAnalytic.id)); + } + if (self.has_group_analytic_tags) { var dataPoint = record.data.filter_analytic_tag_ids; dataPoint.fieldsInfo.default.display_name = {}; @@ -339,12 +346,15 @@ odoo.define("mis_builder.widget", function (require) { arguments ); - if (self.analytic_account_id_m2o !== undefined) { - if (self.analytic_account_id_m2o.value) { + if (self.analytic_account_ids_m2m !== undefined) { + if ( + self.analytic_account_ids_m2m.value && + self.analytic_account_ids_m2m.value.res_ids.length > 0 + ) { self._setFilterValue( "analytic_account_id", - self.analytic_account_id_m2o.value.res_id, - "=" + self.analytic_account_ids_m2m.value.res_ids, + "in" ); } else { self._setFilterValue("analytic_account_id", undefined); diff --git a/mis_builder/tests/test_analytic_filters.py b/mis_builder/tests/test_analytic_filters.py index eb4bc511e..62dff5084 100644 --- a/mis_builder/tests/test_analytic_filters.py +++ b/mis_builder/tests/test_analytic_filters.py @@ -13,13 +13,13 @@ def setUp(self): def test_context_with_filters(self): aaa = self.env["account.analytic.account"].search([], limit=1) mri = self.env["mis.report.instance"].new() - mri.analytic_account_id = False + mri.analytic_account_ids = False mri.analytic_group_id = False assert mri._context_with_filters().get("mis_report_filters") == {} - mri.analytic_account_id = aaa + mri.analytic_account_ids = aaa mri.analytic_group_id = self.aag assert mri._context_with_filters().get("mis_report_filters") == { - "analytic_account_id": {"value": aaa.id, "operator": "="}, + "analytic_account_id": {"value": [aaa.id], "operator": "in"}, "analytic_account_id.group_id": {"value": self.aag.id, "operator": "="}, } # test _context_with_filters does nothing is a filter is already diff --git a/mis_builder/views/mis_report_instance.xml b/mis_builder/views/mis_report_instance.xml index 484ade846..7d1e6cc3b 100644 --- a/mis_builder/views/mis_report_instance.xml +++ b/mis_builder/views/mis_report_instance.xml @@ -172,8 +172,9 @@ widget="many2many_tags" /> - +