diff --git a/project_report_pdf/README.rst b/project_report_pdf/README.rst new file mode 100644 index 000000000..f2a85f326 --- /dev/null +++ b/project_report_pdf/README.rst @@ -0,0 +1,26 @@ +Project Report v10 +================== +PDF and XLS Reports for Project Module. + + +Features +======== +* Project Tasks & Issues Report XLS [With advanced Filtration] +* Project Tasks & Issues Report PDF [With advanced Filtration] + +Installation +============ +To install this module, you need also the **report_xlsx** +module located in: +https://github.com/OCA/reporting-engine/tree/9.0/report_xlsx + +Credits +======= +Cybrosys Techno Solutions + +Author +------ +* Developer v9: Avinash Nk @ cybrosys +* Developer v10: Treesa @ cybrosys +* Guidance: Nilmar Shereef @ cybrosys, shereef@cybrosys.in + diff --git a/project_report_pdf/__init__.py b/project_report_pdf/__init__.py new file mode 100644 index 000000000..cbe5bf6c1 --- /dev/null +++ b/project_report_pdf/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +import models +import report diff --git a/project_report_pdf/__manifest__.py b/project_report_pdf/__manifest__.py new file mode 100644 index 000000000..808a8bc2c --- /dev/null +++ b/project_report_pdf/__manifest__.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +{ + 'name': 'Project Report XLS & PDF', + 'version': '10.0.1.0.0', + "category": "Project", + 'author': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'maintainer': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'summary': """Advanced PDF & XLS Reports for Project With Filtrations""", + 'depends': ['base', 'project', 'project_issue', 'report_xlsx'], + 'license': 'AGPL-3', + 'data': [ + 'views/wizard_report.xml', + 'views/project_report_pdf_view.xml', + 'views/project_report_button.xml', + 'views/project_report.xml' + ], + 'images': ['static/description/banner.jpg'], + 'installable': True, + 'auto_install': False, +} diff --git a/project_report_pdf/models/__init__.py b/project_report_pdf/models/__init__.py new file mode 100644 index 000000000..4dbc1e29c --- /dev/null +++ b/project_report_pdf/models/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +import project_report +import project_report_parser diff --git a/project_report_pdf/models/project_report.py b/project_report_pdf/models/project_report.py new file mode 100644 index 000000000..90d91f1aa --- /dev/null +++ b/project_report_pdf/models/project_report.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +from odoo import models, fields, api, _ + + +class ProjectReportButton(models.TransientModel): + _name = 'wizard.project.report' + + task_select = fields.Boolean(string="Task", default=True) + issue_select = fields.Boolean(string="Issue", default=True) + partner_select = fields.Many2many('res.users', string='Assigned to') + stage_select = fields.Many2many('project.task.type', string="Stage") + + @api.multi + def print_project_report_pdf(self): + + active_record = self._context['active_id'] + record = self.env['project.project'].browse(active_record) + return self.env['report'].get_action(record, "project_report_pdf.project_report_template") + + @api.multi + def print_project_report_xls(self): + context = self._context + datas = {'ids': context.get('active_ids', [])} + datas['model'] = 'project.project' + datas['form'] = self.read()[0] + for field in datas['form'].keys(): + if isinstance(datas['form'][field], tuple): + datas['form'][field] = datas['form'][field][0] + return {'type': 'ir.actions.report.xml', + 'report_name': 'project_report_pdf.project_report_xls.xlsx', + 'datas': datas, + 'name': 'Project Report' + } diff --git a/project_report_pdf/models/project_report_parser.py b/project_report_pdf/models/project_report_parser.py new file mode 100644 index 000000000..1cc270136 --- /dev/null +++ b/project_report_pdf/models/project_report_parser.py @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from odoo.http import request +from odoo import models, api + + +class ProjectReportParser(models.AbstractModel): + _name = 'report.project_report_pdf.project_report_template' + + def get_task_model(self, name): + wizard_record = request.env['wizard.project.report'].search([])[-1] + task_obj = request.env['project.task'] + users_selected = [] + stages_selected = [] + current_task_obj = [] + for elements in wizard_record.partner_select: + users_selected.append(elements.id) + for elements in wizard_record.stage_select: + stages_selected.append(elements.id) + if len(wizard_record.partner_select) == 0: + if len(wizard_record.stage_select) == 0: + current_task = task_obj.search([('project_id', '=', name)]) + for i in current_task: + vals = { + 'name': i.name, + 'user_id': i.user_id.name, + 'stage_id': i.stage_id.name, + } + current_task_obj.append(vals) + return current_task_obj + else: + current_task = task_obj.search([('project_id', '=', name), ('stage_id', 'in', stages_selected)]) + for i in current_task: + vals = { + 'name': i.name, + 'user_id': i.user_id.name, + 'stage_id': i.stage_id.name, + } + current_task_obj.append(vals) + return current_task_obj + else: + if len(wizard_record.stage_select) == 0: + current_task = task_obj.search([('project_id', '=', name), ('user_id', 'in', users_selected)]) + for i in current_task: + vals = { + 'name': i.name, + 'user_id': i.user_id.name, + 'stage_id': i.stage_id.name, + } + current_task_obj.append(vals) + return current_task_obj + else: + current_task = task_obj.search( + [('project_id', '=', name), ('user_id', 'in', users_selected), ('stage_id', 'in', stages_selected)]) + for i in current_task: + vals = { + 'name': i.name, + 'user_id': i.user_id.name, + 'stage_id': i.stage_id.name, + } + current_task_obj.append(vals) + return current_task_obj + + def get_issue_model(self, name): + wizard_record = request.env['wizard.project.report'].search([])[-1] + issue_obj = request.env['project.issue'] + task_obj = issue_obj + users_selected = [] + stages_selected = [] + current_task_obj = [] + for elements in wizard_record.partner_select: + users_selected.append(elements.id) + for elements in wizard_record.stage_select: + stages_selected.append(elements.id) + if len(wizard_record.partner_select) == 0: + if len(wizard_record.stage_select) == 0: + current_task = task_obj.search([('project_id', '=', name)]) + for i in current_task: + vals = { + 'name': i.name, + 'user_id': i.user_id.name, + 'stage_id': i.stage_id.name, + } + current_task_obj.append(vals) + return current_task_obj + else: + current_task = task_obj.search([('project_id', '=', name), ('stage_id', 'in', stages_selected)]) + for i in current_task: + vals = { + 'name': i.name, + 'user_id': i.user_id.name, + 'stage_id': i.stage_id.name, + } + current_task_obj.append(vals) + return current_task_obj + else: + if len(wizard_record.stage_select) == 0: + current_task = task_obj.search([('project_id', '=', name), ('user_id', 'in', users_selected)]) + for i in current_task: + vals = { + 'name': i.name, + 'user_id': i.user_id.name, + 'stage_id': i.stage_id.name, + } + current_task_obj.append(vals) + return current_task_obj + else: + current_task = task_obj.search( + [('project_id', '=', name), ('user_id', 'in', users_selected), ('stage_id', 'in', stages_selected)]) + for i in current_task: + vals = { + 'name': i.name, + 'user_id': i.user_id.name, + 'stage_id': i.stage_id.name, + } + current_task_obj.append(vals) + return current_task_obj + + def get_list_model_task(self, name): + wizard_record = request.env['wizard.project.report'].search([])[-1] + if wizard_record.task_select: + return 2 + else: + return 3 + + def get_list_model_issue(self, name): + wizard_record = request.env['wizard.project.report'].search([])[-1] + if wizard_record.issue_select: + return 2 + else: + return 3 + + @api.model + def render_html(self, docids, data=None): + self.model = self.env.context.get('active_model') + model = self.env['project.project'].search([('id', '=', docids)]) + get_task_model = self.get_task_model(docids), + get_issue_model = self.get_issue_model(docids), + get_list_model_task = self.get_list_model_task(docids), + get_list_model_issue = self.get_list_model_issue(docids), + docargs = { + 'doc': model, + 'get_task_model': get_task_model, + 'get_issue_model': get_issue_model, + 'get_list_model_task': get_list_model_task[0], + 'get_list_model_issue': get_list_model_issue[0], + } + + return self.env['report'].render('project_report_pdf.project_report_template', docargs) + diff --git a/project_report_pdf/report/__init__.py b/project_report_pdf/report/__init__.py new file mode 100644 index 000000000..17bf0eb86 --- /dev/null +++ b/project_report_pdf/report/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +import project_report_xls diff --git a/project_report_pdf/report/project_report_xls.py b/project_report_pdf/report/project_report_xls.py new file mode 100644 index 000000000..487be9f3f --- /dev/null +++ b/project_report_pdf/report/project_report_xls.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +from odoo.addons.report_xlsx.report.report_xlsx import ReportXlsx + + +class ProjectReportXls(ReportXlsx): + + def generate_xlsx_report(self, workbook, data, lines): + + sheet = workbook.add_worksheet("Project Report") + format1 = workbook.add_format({'font_size': 22, 'bg_color': '#D3D3D3'}) + format4 = workbook.add_format({'font_size': 22}) + format2 = workbook.add_format({'font_size': 12, 'bold': True, 'bg_color': '#D3D3D3'}) + format3 = workbook.add_format({'font_size': 10}) + format5 = workbook.add_format({'font_size': 10, 'bg_color': '#FFFFFF'}) + format7 = workbook.add_format({'font_size': 10, 'bg_color': '#FFFFFF'}) + format6 = workbook.add_format({'font_size': 22, 'bg_color': '#FFFFFF'}) + format7.set_align('center') + sheet.merge_range('A1:B1', lines.company_id.name, format5) + sheet.merge_range('A2:B2', lines.company_id.street, format5) + sheet.write('A3', lines.company_id.city, format5) + sheet.write('B3', lines.company_id.zip, format5) + sheet.merge_range('A4:B4', lines.company_id.state_id.name, format5) + sheet.merge_range('A5:B5', lines.company_id.country_id.name, format5) + sheet.merge_range('G1:H1', lines.company_id.rml_header1, format5) + sheet.merge_range(5, 0, 6, 1, "Project :", format1) + sheet.merge_range(5, 2, 6, 7, lines.name, format1) + sheet.merge_range('A8:B8', "Project Manager :", format5) + sheet.merge_range('C8:D8', lines.user_id.name, format5) + if lines.date_start: + date_start = lines.date_start + else: + date_start = "" + if lines.date: + date_end = lines.date + else: + date_end = "" + sheet.merge_range('A9:B9', "Start Date :", format5) + sheet.merge_range('C9:D9', date_start, format5) + sheet.merge_range('A10:B10', "End Date :", format5) + sheet.merge_range('C10:D10', date_end, format5) + row_number = 10 + + sheet.merge_range(0, 2, 4, 5, "", format5) + sheet.merge_range(1, 6, 4, 7, "", format5) + sheet.merge_range(7, 4, 9, 7, "", format5) + + if data['form']['task_select'] == True : + + sheet.merge_range(10, 4, 11, 7, "", format5) + sheet.merge_range(row_number, 0, row_number+1, 3, "Open Tasks", format4) + row_number += 2 + task_obj = self.env['project.task'] + if len(data['form']['partner_select']) == 0: + if len(data['form']['stage_select']) == 0: + current_task_obj = task_obj.search([('project_id', '=', lines.id)]) + else: + current_task_obj = task_obj.search( + [('project_id', '=', lines.id), ('stage_id', 'in', data['form']['stage_select'])]) + else: + if len(data['form']['stage_select']) == 0: + current_task_obj = task_obj.search( + [('project_id', '=', lines.id), ('user_id', 'in', data['form']['partner_select'])]) + else: + current_task_obj = task_obj.search( + [('project_id', '=', lines.id), ('user_id', 'in', data['form']['partner_select']), + ('stage_id', 'in', data['form']['stage_select'])]) + + sheet.merge_range(row_number, 0, row_number, 3, "Tasks", format2) + sheet.merge_range(row_number, 4, row_number, 5, "Assigned", format2) + sheet.merge_range(row_number, 6, row_number, 7, "Stage", format2) + for records in current_task_obj: + row_number += 1 + if records.user_id.name: + user_name = records.user_id.name + else: + user_name = "" + sheet.merge_range(row_number, 0, row_number, 3, records.name, format3) + sheet.merge_range(row_number, 4, row_number, 5, user_name, format3) + sheet.merge_range(row_number, 6, row_number, 7, records.stage_id.name, format3) + row_number += 1 + if data['form']['issue_select'] == True : + + row_number += 1 + sheet.merge_range(row_number-1, 0, row_number-1, 7, "", format4) + sheet.merge_range(row_number, 4, row_number + 1, 7, "", format5) + sheet.merge_range(row_number, 0, row_number+1, 3, "Open Issues", format6) + row_number += 2 + task_obj = self.env['project.issue'] + + + if len(data['form']['partner_select']) == 0: + if len(data['form']['stage_select']) == 0: + current_task_obj = task_obj.search([('project_id', '=', lines.id)]) + else: + current_task_obj = task_obj.search( + [('project_id', '=', lines.id), ('stage_id', 'in', data['form']['stage_select'])]) + else: + if len(data['form']['stage_select']) == 0: + current_task_obj = task_obj.search( + [('project_id', '=', lines.id), ('user_id', 'in', data['form']['partner_select'])]) + else: + current_task_obj = task_obj.search( + [('project_id', '=', lines.id), ('user_id', 'in', data['form']['partner_select']), + ('stage_id', 'in', data['form']['stage_select'])]) + + sheet.merge_range(row_number, 0, row_number, 3, "Issues", format2) + sheet.merge_range(row_number, 4, row_number, 5, "Assigned", format2) + sheet.merge_range(row_number, 6, row_number, 7, "Stage", format2) + for records in current_task_obj: + row_number += 1 + if records.user_id.name: + user_name = records.user_id.name + else: + user_name = "" + sheet.merge_range(row_number, 0, row_number, 3, records.name, format3) + sheet.merge_range(row_number, 4, row_number, 5, user_name, format3) + sheet.merge_range(row_number, 6, row_number, 7, records.stage_id.name, format3) + row_number += 2 + sheet.merge_range(row_number, 0, row_number, 1, lines.company_id.phone, format7) + sheet.merge_range(row_number, 2, row_number, 4, lines.company_id.email, format7) + sheet.merge_range(row_number, 5, row_number, 7, lines.company_id.website, format7) + + +ProjectReportXls('report.project_report_pdf.project_report_xls.xlsx', 'project.project') diff --git a/project_report_pdf/static/description/banner.jpg b/project_report_pdf/static/description/banner.jpg new file mode 100644 index 000000000..9507a8730 Binary files /dev/null and b/project_report_pdf/static/description/banner.jpg differ diff --git a/project_report_pdf/static/description/cybro_logo.png b/project_report_pdf/static/description/cybro_logo.png new file mode 100644 index 000000000..bb309114c Binary files /dev/null and b/project_report_pdf/static/description/cybro_logo.png differ diff --git a/project_report_pdf/static/description/icon.png b/project_report_pdf/static/description/icon.png new file mode 100644 index 000000000..9eaea5ed1 Binary files /dev/null and b/project_report_pdf/static/description/icon.png differ diff --git a/project_report_pdf/static/description/index.html b/project_report_pdf/static/description/index.html new file mode 100644 index 000000000..798faabdb --- /dev/null +++ b/project_report_pdf/static/description/index.html @@ -0,0 +1,129 @@ +
+
+

Project Report PDF & XLS

+

This Module Gives You The PDF and XLS Report of + Project.

+

Cybrosys Technologies , www.cybrosys.com

+
+
+
+ This report prints the Tasks and Issues Related to the Project. + You can filter the report based on Tasks or Issues, Assigned User + and Stage of the Task/Issue +
+
+
+
+ ☛ Installation : You need report_xlsx module to run this properly. More details see the README.rst file of this module. +
+
+
+
+

+ Go to Project -> Project. +

+ And then Select One Project.Then you can see a print button. + Click that button. +

+
+
+
+ +
+
+
+
+ +
+
+
+

+ Then a wizard will open. You can filter the project report + by selecting the Appropriate options from the wizard. + if you don't select "Assigned to" & "Stage" in the wizard, + then system automatically select all the users and stages. +

+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+

+ * PDF Report Of Data Import/Export Plugin Project.(Both Tasks and Issues) +

+
+
+
+
+
+
+

+ * PDF Report Of Data Import/Export Plugin Project.(Issues Only) +

+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+

+ * XLS Report Of Data Import/Export Plugin Project.(Both Tasks and Issues) +

+
+
+
+
+
+
+

+ * XLS Report Of Data Import/Export Plugin Project.(Issues Only) +

+
+
+
+ +
+
+
+
+
+

Need Any Help?

+ + +
diff --git a/project_report_pdf/static/description/screen_shot_modules_location.png b/project_report_pdf/static/description/screen_shot_modules_location.png new file mode 100644 index 000000000..3bc4f41c9 Binary files /dev/null and b/project_report_pdf/static/description/screen_shot_modules_location.png differ diff --git a/project_report_pdf/static/description/screen_shot_pdf_report.png b/project_report_pdf/static/description/screen_shot_pdf_report.png new file mode 100644 index 000000000..cd7ab25c1 Binary files /dev/null and b/project_report_pdf/static/description/screen_shot_pdf_report.png differ diff --git a/project_report_pdf/static/description/screen_shot_pdf_report_2.png b/project_report_pdf/static/description/screen_shot_pdf_report_2.png new file mode 100644 index 000000000..e00e8eeb7 Binary files /dev/null and b/project_report_pdf/static/description/screen_shot_pdf_report_2.png differ diff --git a/project_report_pdf/static/description/screen_shot_wizard.png b/project_report_pdf/static/description/screen_shot_wizard.png new file mode 100644 index 000000000..f7e1f5200 Binary files /dev/null and b/project_report_pdf/static/description/screen_shot_wizard.png differ diff --git a/project_report_pdf/static/description/screen_shot_xls_report.png b/project_report_pdf/static/description/screen_shot_xls_report.png new file mode 100644 index 000000000..55ee8c8f8 Binary files /dev/null and b/project_report_pdf/static/description/screen_shot_xls_report.png differ diff --git a/project_report_pdf/static/description/screen_shot_xls_report_2.png b/project_report_pdf/static/description/screen_shot_xls_report_2.png new file mode 100644 index 000000000..7a4066297 Binary files /dev/null and b/project_report_pdf/static/description/screen_shot_xls_report_2.png differ diff --git a/project_report_pdf/views/project_report.xml b/project_report_pdf/views/project_report.xml new file mode 100644 index 000000000..be774a951 --- /dev/null +++ b/project_report_pdf/views/project_report.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/project_report_pdf/views/project_report_button.xml b/project_report_pdf/views/project_report_button.xml new file mode 100644 index 000000000..1a2127ef6 --- /dev/null +++ b/project_report_pdf/views/project_report_button.xml @@ -0,0 +1,16 @@ + + + + + project_report_pdf_inherited.form + project.project + + + +
+
+
+
+
+
\ No newline at end of file diff --git a/project_report_pdf/views/project_report_pdf_view.xml b/project_report_pdf/views/project_report_pdf_view.xml new file mode 100644 index 000000000..20403ee36 --- /dev/null +++ b/project_report_pdf/views/project_report_pdf_view.xml @@ -0,0 +1,76 @@ + + + + \ No newline at end of file diff --git a/project_report_pdf/views/wizard_report.xml b/project_report_pdf/views/wizard_report.xml new file mode 100644 index 000000000..93dabf0f1 --- /dev/null +++ b/project_report_pdf/views/wizard_report.xml @@ -0,0 +1,39 @@ + + + + + report_wizard_view_form.form + wizard.project.report + +
+ + + + + + + + + + + + +
+
+
+
+
+ +
+
\ No newline at end of file