diff --git a/mis_builder/models/mis_report_instance.py b/mis_builder/models/mis_report_instance.py index a1c12637c..c7309a066 100644 --- a/mis_builder/models/mis_report_instance.py +++ b/mis_builder/models/mis_report_instance.py @@ -781,7 +781,6 @@ def print_pdf(self): ) def export_xls(self): - self.ensure_one() return self.env.ref("mis_builder.xls_export").report_action( self, data=dict(dummy=True) ) # required to propagate context @@ -1010,3 +1009,10 @@ def _compute_user_can_edit_annotation(self): self.user_can_edit_annotation = self.env.user.has_group( "mis_builder.group_edit_annotation" ) + + def _get_xlsx_report_name(self): + self.ensure_one() + return "{} - {}".format( + self.name, + ", ".join([a.name for a in self.query_company_ids]), + ) diff --git a/mis_builder/report/mis_report_instance_xlsx.py b/mis_builder/report/mis_report_instance_xlsx.py index 9eaa0c1c7..23ccffb06 100644 --- a/mis_builder/report/mis_report_instance_xlsx.py +++ b/mis_builder/report/mis_report_instance_xlsx.py @@ -34,17 +34,18 @@ def _mis_builder_add_annotation(self, sheet, cell, row_pos, col_pos, notes): if cell and (annotation := notes.get(cell.cell_id, {}).get("text")): sheet.write_comment(row_pos, col_pos, annotation) - def generate_xlsx_report(self, workbook, data, objects): + def _get_worksheet_name(self, mis_instance): + return mis_instance._get_xlsx_report_name()[:31] + + def _generate_xlsx_one_report(self, workbook, mis_instance): # get the computed result of the report - matrix = objects._compute_matrix() - notes = objects.get_notes_by_cell_id() + matrix = mis_instance._compute_matrix() + notes = mis_instance.get_notes_by_cell_id() style_obj = self.env["mis.report.style"] # create worksheet - report_name = "{} - {}".format( - objects[0].name, ", ".join([a.name for a in objects[0].query_company_ids]) - ) - sheet = workbook.add_worksheet(report_name[:31]) + worksheet_name = self._get_worksheet_name(mis_instance) + sheet = workbook.add_worksheet(worksheet_name) row_pos = 0 col_pos = 0 # width of the labels column @@ -57,13 +58,14 @@ def generate_xlsx_report(self, workbook, data, objects): header_format = workbook.add_format( {"bold": True, "align": "center", "bg_color": "#F0EEEE"} ) + report_name = mis_instance._get_xlsx_report_name() sheet.write(row_pos, 0, report_name, bold) row_pos += 2 # filters - filter_descriptions = objects.get_filter_descriptions() + filter_descriptions = mis_instance.get_filter_descriptions() if filter_descriptions: - for filter_description in objects.get_filter_descriptions(): + for filter_description in mis_instance.get_filter_descriptions(): sheet.write(row_pos, 0, filter_description) row_pos += 1 row_pos += 1 @@ -88,7 +90,9 @@ def generate_xlsx_report(self, workbook, data, objects): else: sheet.write(row_pos, col_pos, label, header_format) col_width[col_pos] = max( - col_width[col_pos], len(col.label or ""), len(col.description or "") + col_width[col_pos], + len(col.label or ""), + len(col.description or ""), ) col_pos += col.colspan row_pos += 1 @@ -184,3 +188,9 @@ def generate_xlsx_report(self, workbook, data, objects): min_col_pos = min(col_width.keys()) max_col_pos = max(col_width.keys()) sheet.set_column(min_col_pos, max_col_pos, data_col_width * COL_WIDTH) + + return sheet + + def generate_xlsx_report(self, workbook, data, objects): + for instance in objects: + self._generate_xlsx_one_report(workbook, instance) diff --git a/mis_builder/report/mis_report_instance_xlsx.xml b/mis_builder/report/mis_report_instance_xlsx.xml index 6059075b3..d6427196c 100644 --- a/mis_builder/report/mis_report_instance_xlsx.xml +++ b/mis_builder/report/mis_report_instance_xlsx.xml @@ -8,4 +8,15 @@ xlsx mis_report_instance + + + Export XLS + + + list + code + + action = records.export_xls() + + diff --git a/mis_builder/tests/test_mis_report_instance.py b/mis_builder/tests/test_mis_report_instance.py index 42937d38d..cd5e37d40 100644 --- a/mis_builder/tests/test_mis_report_instance.py +++ b/mis_builder/tests/test_mis_report_instance.py @@ -355,6 +355,27 @@ def setUp(self): ) ) + # create a duplicate of first instance with different period + self.report_instance_4 = self.env["mis.report.instance"].create( + dict( + name="test instance", + report_id=self.report.id, + company_id=self.env.ref("base.main_company").id, + period_ids=[ + ( + 0, + 0, + dict( + name="p2", + mode="fix", + manual_date_from="2015-01-01", + manual_date_to="2015-12-31", + ), + ), + ], + ) + ) + def test_compute(self): matrix = self.report_instance._compute_matrix() for row in matrix.iter_rows(): @@ -512,6 +533,16 @@ def test_xlsx(self): report_type="xlsx", ) + def test_xlsx_multiple_instances(self): + self.report_instance.export_xls() # get action + test_reports.try_report( + self.env.cr, + self.env.uid, + "mis_builder.mis_report_instance_xlsx", + [self.report_instance.id, self.report_instance_4.id], + report_type="xlsx", + ) + def test_get_kpis_by_account_id(self): account_ids = ( self.env["account.account"]