diff --git a/l10n_ro_report_D300/README.rst b/l10n_ro_report_D300/README.rst new file mode 100644 index 000000000..5fb1b043e --- /dev/null +++ b/l10n_ro_report_D300/README.rst @@ -0,0 +1,77 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +===================== +Romania - D300 Report +===================== + +This module allows you to print the D300 report, between 2 dates. +Module gives you results from row 1 to row 34, that you can complete the declaration, +available at http://static.anaf.ro/static/10/Anaf/Declaratii_R/300.html. +You also have an option to detail each row by tax. + +Installation +============ + +To install this module, you need to: + +* clone the branch 11.0 of the repository https://github.com/OCA/l10n-romania +* add the path to this repository in your configuration (addons-path) +* update the module list +* search for "Romania - D300 Report" in your addons +* install the module + +Usage +===== + +For launching the report, you need to go to: +* Accounting -> Reporting -> Romania -> D300 Report +* Choose the dates, tick tax detail for detailed rows and lauch the report + +* The report is available in HTML, PDF, XLSX. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/177/11.0 + +Known issues / Roadmap +====================== + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smash it by providing detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Fekete Mihai + +Do not contact contributors directly about support or help with technical issues. + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/l10n_ro_report_D300/__init__.py b/l10n_ro_report_D300/__init__.py new file mode 100644 index 000000000..5f9d18631 --- /dev/null +++ b/l10n_ro_report_D300/__init__.py @@ -0,0 +1,2 @@ +from . import report +from . import wizards diff --git a/l10n_ro_report_D300/__manifest__.py b/l10n_ro_report_D300/__manifest__.py new file mode 100644 index 000000000..18f728f0a --- /dev/null +++ b/l10n_ro_report_D300/__manifest__.py @@ -0,0 +1,26 @@ +# Copyright 2018 Forest and Biomass Romania +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Romania - D300 Report', + 'summary': 'Romania - D300 Report', + 'version': '11.0.1.0.0', + 'category': 'Localization', + 'author': 'Forest and Biomass Romania, ' + 'Odoo Community Association (OCA)', + 'website': 'https://www.forbiom.eu', + 'license': 'AGPL-3', + 'installable': True, + 'depends': [ + 'l10n_ro', + 'date_range', + 'report_xlsx'], + 'data': [ + "views/layouts.xml", + "views/l10n_ro_report_d300.xml", + "views/l10n_ro_report_d300_template.xml", + "views/l10n_ro_report_d300_view.xml", + "views/report_template.xml", + "wizards/wizard_l10n_ro_report_d300_view.xml", + ], +} diff --git a/l10n_ro_report_D300/report/__init__.py b/l10n_ro_report_D300/report/__init__.py new file mode 100644 index 000000000..91c5e4910 --- /dev/null +++ b/l10n_ro_report_D300/report/__init__.py @@ -0,0 +1,3 @@ +from . import abstract_report_xlsx +from . import l10n_ro_report_D300 +from . import l10n_ro_report_D300_xlsx diff --git a/l10n_ro_report_D300/report/abstract_report_xlsx.py b/l10n_ro_report_D300/report/abstract_report_xlsx.py new file mode 100644 index 000000000..05c978f61 --- /dev/null +++ b/l10n_ro_report_D300/report/abstract_report_xlsx.py @@ -0,0 +1,234 @@ +# Author: Julien Coux +# Copyright 2016 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2018 Forest and Biomass Romania + +# file modified from https://github.com/OCA/account-financial-reporting/ +# tree/11.0/account_financial_report/report +from odoo import models + + +class AbstractReportXslx(models.AbstractModel): + _name = 'report.d300.abstract_report_xlsx' + _inherit = 'report.report_xlsx.abstract' + + def __init__(self, pool, cr): + # main sheet which will contains report + self.sheet = None + + # columns of the report + self.columns = None + + # row_pos must be incremented at each writing lines + self.row_pos = None + + def get_workbook_options(self): + return {'constant_memory': True} + + def generate_xlsx_report(self, workbook, data, objects): + report = objects + + self.row_pos = 0 + + self._define_formats(workbook) + + report_name = self._get_report_name() + filters = self._get_report_filters(report) + self.columns = self._get_report_columns(report) + + self.sheet = workbook.add_worksheet(report_name[:31]) + + self._set_column_width() + + self._write_report_title(workbook, report_name) + + self._write_filters(workbook, filters) + + self._generate_report_content(workbook, report) + + def _define_formats(self, workbook): + """ Add cell formats to current workbook. + Those formats can be used on all cell. + + Available formats are : + * format_bold + * format_right + * format_right_bold_italic + * format_header_left + * format_header_center + * format_header_right + * format_header_amount + * format_amount + * format_percent_bold_italic + """ + self.format_bold = workbook.add_format({'bold': True}) + self.format_right = workbook.add_format({'align': 'right'}) + self.format_right_bold_italic = workbook.add_format( + {'align': 'right', 'bold': True, 'italic': True} + ) + self.format_header_left = workbook.add_format( + {'bold': True, + 'border': True, + 'bg_color': '#FFFFCC'}) + self.format_header_center = workbook.add_format( + {'bold': True, + 'align': 'center', + 'border': True, + 'bg_color': '#FFFFCC'}) + self.format_header_right = workbook.add_format( + {'bold': True, + 'align': 'right', + 'border': True, + 'bg_color': '#FFFFCC'}) + self.format_header_amount = workbook.add_format( + {'bold': True, + 'border': True, + 'bg_color': '#FFFFCC'}) + self.format_header_amount.set_num_format('#,##0.00') + self.format_amount = workbook.add_format() + self.format_amount.set_num_format('#,##0.00') + self.format_percent_bold_italic = workbook.add_format( + {'bold': True, 'italic': True} + ) + self.format_percent_bold_italic.set_num_format('#,##0.00%') + + def _set_column_width(self): + """Set width for all defined columns. + Columns are defined with `_get_report_columns` method. + """ + for position, column in self.columns.items(): + self.sheet.set_column(position, position, column['width']) + + def _write_report_title(self, workbook, title): + """Write report title on current line using all defined columns width. + Columns are defined with `_get_report_columns` method. + """ + self.sheet.merge_range( + self.row_pos, 0, self.row_pos, len(self.columns) - 1, + title, workbook.add_format({'bold': True}) + ) + self.row_pos += 3 + + def _write_filters(self, workbook, filters): + """Write one line per filters on starting on current line. + Columns number for filter name is defined + with `_get_col_count_filter_name` method. + Columns number for filter value is define + with `_get_col_count_filter_value` method. + """ + col_name = 1 + col_count_filter_name = self._get_col_count_filter_name() + col_count_filter_value = self._get_col_count_filter_value() + col_value = col_name + col_count_filter_name + 1 + for title, value in filters: + self.sheet.merge_range( + self.row_pos, col_name, + self.row_pos, col_name + col_count_filter_name - 1, + title, workbook.add_format( + {'bold': True, + 'border': True, + 'bg_color': '#FFFFCC'})) + self.sheet.merge_range( + self.row_pos, col_value, + self.row_pos, col_value + col_count_filter_value - 1, + value) + self.row_pos += 1 + self.row_pos += 2 + + def write_array_title(self, workbook, title): + """Write array title on current line using all defined columns width. + Columns are defined with `_get_report_columns` method. + """ + self.sheet.merge_range( + self.row_pos, 0, self.row_pos, len(self.columns) - 1, + title, workbook.add_format({'bold': True}) + ) + self.row_pos += 1 + + def write_array_header(self, workbook): + """Write array header on current line using all defined columns name. + Columns are defined with `_get_report_columns` method. + """ + for col_pos, column in self.columns.items(): + self.sheet.write(self.row_pos, col_pos, column['header'], + workbook.add_format( + {'bold': True, + 'align': 'center', + 'border': True, + 'bg_color': '#FFFFCC'})) + self.row_pos += 1 + + def write_line(self, workbook, line_object, formats): + """Write a line on current line using all defined columns field name. + Columns are defined with `_get_report_columns` method. + """ + for col_pos, column in self.columns.items(): + value = getattr(line_object, column['field']) + cell_type = column.get('type', 'string') + if cell_type == 'string': + self.sheet.write_string(self.row_pos, col_pos, value or '', + workbook.add_format(formats)) + elif cell_type == 'amount': + self.sheet.write_number( + self.row_pos, col_pos, float(value), + workbook.add_format(formats) + ) + self.row_pos += 1 + + def _generate_report_content(self, workbook, report): + pass + + def _get_report_name(self): + """ + Allow to define the report name. + Report name will be used as sheet name and as report title. + + :return: the report name + """ + raise NotImplementedError() + + def _get_report_columns(self, report): + """ + Allow to define the report columns + which will be used to generate report. + + :return: the report columns as dict + + :Example: + + { + 0: {'header': 'Simple column', + 'field': 'field_name_on_my_object', + 'width': 11}, + 1: {'header': 'Amount column', + 'field': 'field_name_on_my_object', + 'type': 'amount', + 'width': 14}, + } + """ + raise NotImplementedError() + + def _get_report_filters(self, report): + """ + :return: the report filters as list + + :Example: + + [ + ['first_filter_name', 'first_filter_value'], + ['second_filter_name', 'second_filter_value'] + ] + """ + raise NotImplementedError() + + def _get_col_count_filter_name(self): + """ + :return: the columns number used for filter names. + """ + raise NotImplementedError() + + def _get_col_count_filter_value(self): + """ + :return: the columns number used for filter values. + """ + raise NotImplementedError() diff --git a/l10n_ro_report_D300/report/l10n_ro_report_D300.py b/l10n_ro_report_D300/report/l10n_ro_report_D300.py new file mode 100644 index 000000000..d0790ca22 --- /dev/null +++ b/l10n_ro_report_D300/report/l10n_ro_report_D300.py @@ -0,0 +1,286 @@ +# Copyright 2018 Forest and Biomass Romania +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +from odoo.addons.web.controllers.main import clean_action + + +class RomaniaReportD300(models.TransientModel): + _name = "l10n_ro_report_d300" + """ Here, we just define class fields. + For methods, go more bottom at this file. + + The class hierarchy is : + * RomaniaReportD300 + ** RomaniaReportD300TaxTags + *** RomaniaReportD300Tax + """ + + # Filters fields, used for data computation + company_id = fields.Many2one(comodel_name='res.company') + date_from = fields.Date() + date_to = fields.Date() + tax_detail = fields.Boolean('Tax Detail') + + # Data fields, used to browse report data + taxtags_ids = fields.One2many( + comodel_name='l10n_ro_report_d300_taxtag', + inverse_name='report_id' + ) + + +class RomaniaReportD300TaxTag(models.TransientModel): + _name = 'l10n_ro_report_d300_taxtag' + _order = 'code ASC' + + @api.multi + def _compute_move_lines(self): + ml_object = self.env['account.move.line'] + for tag in self: + lines = [] + report = tag.report_id + if report: + taxes = tag.tax_ids.mapped('tax_id').ids + domain = [ + ('tax_line_id', 'in', taxes), + ('tax_exigible', '=', True), + ('date', '<=', report.date_to), + ('date', '>=', report.date_from) + ] + lines = ml_object.search(domain) + tag.move_line_ids = lines if lines else [] + + report_id = fields.Many2one( + comodel_name='l10n_ro_report_d300', + ondelete='cascade', + index=True + ) + + # Data fields, used to keep link with real object + taxtag_id = fields.Many2one( + 'account.account.tag', + index=True + ) + + # Data fields, used for report display + code = fields.Integer() + name = fields.Char() + net = fields.Float(digits=(16, 2)) + tax = fields.Float(digits=(16, 2)) + + # Data fields, used to browse report data + tax_ids = fields.One2many( + comodel_name='l10n_ro_report_d300_tax', + inverse_name='report_tax_id' + ) + + move_line_ids = fields.One2many( + comodel_name='account.move.line', + compute='_compute_move_lines' + ) + + +class RomaniaReportD300Tax(models.TransientModel): + _name = 'l10n_ro_report_d300_tax' + _order = 'name ASC' + + report_tax_id = fields.Many2one( + comodel_name='l10n_ro_report_d300_taxtag', + ondelete='cascade', + index=True + ) + + # Data fields, used to keep link with real object + tax_id = fields.Many2one( + 'account.tax', + index=True + ) + + # Data fields, used for report display + code = fields.Char() + name = fields.Char() + net = fields.Float(digits=(16, 2)) + tax = fields.Float(digits=(16, 2)) + + @api.multi + def _compute_move_lines(self): + ml_object = self.env['account.move.line'] + for tax in self: + lines = [] + report = tax.report_tax_id.report_id + if report: + domain = [ + ('tax_line_id', '=', tax.tax_id.id), + ('tax_exigible', '=', True), + ('date', '<=', report.date_to), + ('date', '>=', report.date_from) + ] + lines = ml_object.search(domain) + tax.move_line_ids = lines if lines else [] + + move_line_ids = fields.One2many( + comodel_name='account.move.line', + inverse_name='tax_line_id', + compute='_compute_move_lines' + ) + + def open_lines(self): + [action] = self.env.ref('account.action_account_moves_all_tree').read() + action['context'] = self.env.context + action['domain'] = [('id', 'in', self.move_line_ids.ids)] + action = clean_action(action) + return action + + +class RomaniaReportD300Compute(models.TransientModel): + """ Here, we just define methods. + For class fields, go more top at this file. + """ + + _inherit = 'l10n_ro_report_d300' + + @api.multi + def print_report(self, report_type='qweb'): + self.ensure_one() + if report_type == 'xlsx': + report_name = 'l10n_ro_report_d300_xlsx' + else: + report_name = 'l10n_ro_report_D300.l10n_ro_report_d300_qweb' + context = dict(self.env.context) + action = self.env['ir.actions.report'].search( + [('report_name', '=', report_name), + ('report_type', '=', report_type)], limit=1) + return action.with_context(context).report_action(self) + + def _get_html(self): + result = {} + rcontext = {} + context = dict(self.env.context) + report = self.browse(context.get('active_id')) + if report: + rcontext['o'] = report + result['html'] = self.env.ref( + 'l10n_ro_report_D300.l10n_ro_report_d300').render( + rcontext) + return result + + @api.model + def get_html(self, given_context=None): + return self.with_context(given_context)._get_html() + + @api.multi + def compute_data_for_report(self): + self.ensure_one() + # Compute report data + self._inject_taxtags_values() + self._inject_tax_values() + # Refresh cache because all data are computed with SQL requests + self.refresh() + + def _inject_taxtags_values(self): + """Inject report values for report_open_items_account.""" + query_inject_taxtags = """ +WITH + taxtags AS + (SELECT coalesce(regexp_replace(replace(tag.name, 'D300', ''), + '[^0-9\.]+', '', 'g')::numeric * 10, 0)::integer AS code, + tag.name, tag.id, + coalesce(sum(movetax.tax_base_amount), 0.00) AS net, + coalesce(sum(movetax.balance), 0.00) AS tax + FROM + account_account_tag AS tag + INNER JOIN account_tax_account_tag AS taxtag + ON tag.id = taxtag.account_account_tag_id + INNER JOIN account_tax AS tax + ON tax.id = taxtag.account_tax_id + INNER JOIN account_move_line AS movetax + ON movetax.tax_line_id = tax.id + INNER JOIN account_move AS move + ON move.id = movetax.move_id + WHERE tag.id is not null AND movetax.tax_exigible + AND move.company_id = %s AND move.date >= %s + AND move.date <= %s AND move.state = 'posted' + GROUP BY tag.id + ORDER BY code, tag.name + ) +INSERT INTO + l10n_ro_report_d300_taxtag + ( + report_id, + create_uid, + create_date, + taxtag_id, + code, + name, + net, tax + ) +SELECT + %s AS report_id, + %s AS create_uid, + NOW() AS create_date, + tag.id, + tag.code, + tag.name, + tag.net, + tag.tax +FROM + taxtags tag + """ + query_inject_taxtags_params = (self.company_id.id, self.date_from, + self.date_to, self.id, self.env.uid) + self.env.cr.execute(query_inject_taxtags, query_inject_taxtags_params) + + def _inject_tax_values(self): + """ Inject report values for report_open_items_partner. """ + # pylint: disable=sql-injection + query_inject_tax = """ +WITH + taxtags_tax AS + ( + SELECT + tag.id AS report_tax_id, '' AS code, + tax.name, tax.id, + coalesce(sum(movetax.tax_base_amount), 0.00) AS net, + coalesce(sum(movetax.balance), 0.00) AS tax + FROM + l10n_ro_report_d300_taxtag AS tag + INNER JOIN account_tax_account_tag AS taxtag + ON tag.taxtag_id = taxtag.account_account_tag_id + INNER JOIN account_tax AS tax + ON tax.id = taxtag.account_tax_id + INNER JOIN account_move_line AS movetax + ON movetax.tax_line_id = tax.id + INNER JOIN account_move AS move + ON move.id = movetax.move_id + WHERE tag.id is not null AND movetax.tax_exigible + AND tag.report_id = %s AND move.company_id = %s + AND move.date >= %s AND move.date <= %s + AND move.state = 'posted' + GROUP BY tag.id, tax.id + ORDER BY tax.name + ) +INSERT INTO + l10n_ro_report_d300_tax + ( + report_tax_id, + create_uid, + create_date, + tax_id, + name, + net, + tax + ) +SELECT + tt.report_tax_id, + %s AS create_uid, + NOW() AS create_date, + tt.id, + tt.name, + tt.net, + tt.tax +FROM + taxtags_tax tt + """ + query_inject_tax_params = (self.id, self.company_id.id, self.date_from, + self.date_to, self.env.uid) + self.env.cr.execute(query_inject_tax, query_inject_tax_params) diff --git a/l10n_ro_report_D300/report/l10n_ro_report_D300_xlsx.py b/l10n_ro_report_D300/report/l10n_ro_report_D300_xlsx.py new file mode 100644 index 000000000..a77d1546d --- /dev/null +++ b/l10n_ro_report_D300/report/l10n_ro_report_D300_xlsx.py @@ -0,0 +1,54 @@ +# Copyright 2018 Forest and Biomass Romania +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, models + + +class RomaniaReportD300Xslx(models.AbstractModel): + _name = 'report.l10n_ro_report_d300_xlsx' + _inherit = 'report.d300.abstract_report_xlsx' + + def _get_report_name(self): + return _('Decont TVA - D300') + + def _get_report_columns(self, report): + return { + 0: {'header': _('Code'), 'field': 'code', + 'type': 'amount', 'width': 5}, + 1: {'header': _('Name'), 'field': 'name', 'width': 100}, + 2: {'header': _('Net'), + 'field': 'net', + 'type': 'amount', + 'width': 14}, + 3: {'header': _('Tax'), + 'field': 'tax', + 'type': 'amount', + 'width': 14}, + } + + def _get_report_filters(self, report): + return [ + [_('Date from'), report.date_from], + [_('Date to'), report.date_to], + ] + + def _get_col_count_filter_name(self): + return 0 + + def _get_col_count_filter_value(self): + return 2 + + def _generate_report_content(self, workbook, report): + # For each taxtag + self.write_array_header(workbook) + for taxtag in report.taxtags_ids: + # Write taxtag line + self.write_line(workbook, taxtag, {'bold': True, 'font_size': 12}) + + # For each tax if detail taxes + if report.tax_detail: + formatline = {'font_color': 'gray', + 'font_size': 10, + 'num_format': '#,##0.00'} + for tax in taxtag.tax_ids: + self.write_line(workbook, tax, formatline) diff --git a/l10n_ro_report_D300/static/description/icon.png b/l10n_ro_report_D300/static/description/icon.png new file mode 100644 index 000000000..7ba9c1019 Binary files /dev/null and b/l10n_ro_report_D300/static/description/icon.png differ diff --git a/l10n_ro_report_D300/static/src/css/report.css b/l10n_ro_report_D300/static/src/css/report.css new file mode 100644 index 000000000..a1e6d0534 --- /dev/null +++ b/l10n_ro_report_D300/static/src/css/report.css @@ -0,0 +1,110 @@ +body, table, td, span, div { + font-family: Helvetica, Arial; +} +.act_as_table { + width: 100% !important; + display: table !important; +} +.act_as_row { + width: 100% !important; + display: table-row !important; + page-break-inside: avoid; +} +.act_as_cell { + display: table-cell !important; + page-break-inside: avoid; +} +.act_as_thead { + display: table-header-group !important; +} +.act_as_tbody { + display: table-row-group !important; +} +.list_table, .data_table, .totals_table{ + width: 100% !important; + table-layout: fixed !important; +} +.act_as_row.labels { + background-color:#F0F0F0 !important; +} +.list_table, .data_table, .totals_table, .list_table .act_as_row { + border-left:0px; + border-right:0px; + text-align:left; + font-size:10px; + padding-right:3px; + padding-left:3px; + padding-top:2px; + padding-bottom:2px; + border-collapse:collapse; +} +.totals_table { + font-weight: bold; + text-align: center; +} +.list_table .act_as_row.labels, .list_table .act_as_row.initial_balance, .list_table .act_as_row.lines { + border-color:grey !important; + border-bottom:1px solid lightGrey !important; +} +.data_table .act_as_cell{ + border: 1px solid lightGrey; + text-align: center; +} +.data_table .act_as_cell, .list_table .act_as_cell, .totals_table .act_as_cell { + word-wrap: break-word; +} +.data_table .act_as_row.labels, .totals_table .act_as_row.labels { + font-weight: bold; +} +.initial_balance .act_as_cell { + font-style:italic; +} +.account_title { + font-size:11px; + font-weight:bold; +} +.account_title.labels { + background-color:#F0F0F0 !important; +} +.act_as_cell.amount { + word-wrap:normal; + text-align:right; +} +.act_as_cell.left { + text-align:left; +} +.act_as_cell.right { + text-align:right; +} +.list_table .act_as_cell{ + padding-left: 5px; +/* border-right:1px solid lightGrey; uncomment to active column lines */ +} +.list_table .act_as_cell.first_column { + padding-left: 0px; +/* border-left:1px solid lightGrey; uncomment to active column lines */ +} +.overflow_ellipsis { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.custom_footer { + font-size:7px !important; +} +.page_break { + page-break-inside: avoid; +} + +.button_row { + padding-bottom: 10px; +} + +.o_l10n_ro_report_d300_page { + background-color: @odoo-view-background-color; + color: @odoo-main-text-color; + padding-top: 10px; + width: 90%; + margin-right: auto; + margin-left: auto; +} diff --git a/l10n_ro_report_D300/static/src/js/l10n_ro_report_d300_backend.js b/l10n_ro_report_D300/static/src/js/l10n_ro_report_d300_backend.js new file mode 100644 index 000000000..75d797ff3 --- /dev/null +++ b/l10n_ro_report_D300/static/src/js/l10n_ro_report_d300_backend.js @@ -0,0 +1,104 @@ +odoo.define('l10n_ro_report_D300.l10n_ro_report_d300_backend', function (require) { +'use strict'; + +var core = require('web.core'); +var Widget = require('web.Widget'); +var ControlPanelMixin = require('web.ControlPanelMixin'); +var ReportWidget = require('l10n_ro_report_D300.l10n_ro_report_d300_widget'); + +var report_backend = Widget.extend(ControlPanelMixin, { + // Stores all the parameters of the action. + events: { + 'click .o_l10n_ro_report_d300_print': 'print', + 'click .o_l10n_ro_report_d300_export': 'export', + }, + init: function(parent, action) { + this.actionManager = parent; + this.given_context = {}; + this.odoo_context = action.context; + this.controller_url = action.context.url; + if (action.context.context) { + this.given_context = action.context.context; + } + this.given_context.active_id = action.context.active_id || action.params.active_id; + this.given_context.model = action.context.active_model || false; + this.given_context.ttype = action.context.ttype || false; + return this._super.apply(this, arguments); + }, + willStart: function() { + return $.when(this.get_html()); + }, + set_html: function() { + var self = this; + var def = $.when(); + if (!this.report_widget) { + this.report_widget = new ReportWidget(this, this.given_context); + def = this.report_widget.appendTo(this.$el); + } + def.then(function () { + self.report_widget.$el.html(self.html); + }); + }, + start: function() { + this.set_html(); + return this._super(); + }, + // Fetches the html and is previous report.context if any, else create it + get_html: function() { + var self = this; + var defs = []; + return this._rpc({ + model: this.given_context.model, + method: 'get_html', + args: [self.given_context], + context: self.odoo_context, + }) + .then(function (result) { + self.html = result.html; + defs.push(self.update_cp()); + return $.when.apply($, defs); + }); + }, + // Updates the control panel and render the elements that have yet to be rendered + update_cp: function() { + if (!this.$buttons) { + + } + var status = { + breadcrumbs: this.actionManager.get_breadcrumbs(), + cp_content: {$buttons: this.$buttons}, + }; + return this.update_control_panel(status); + }, + do_show: function() { + this._super(); + this.update_cp(); + }, + print: function(e) { + var self = this; + this._rpc({ + model: this.given_context.model, + method: 'print_report', + args: [this.given_context.active_id, 'qweb-pdf'], + context: self.odoo_context, + }).then(function(result){ + self.do_action(result); + }); + }, + export: function(e) { + var self = this; + this._rpc({ + model: this.given_context.model, + method: 'print_report', + args: [this.given_context.active_id, 'xlsx'], + context: self.odoo_context, + }) + .then(function(result){ + self.do_action(result); + }); + }, +}); + +core.action_registry.add("l10n_ro_report_d300_backend", report_backend); +return report_backend; +}); diff --git a/l10n_ro_report_D300/static/src/js/l10n_ro_report_d300_widgets.js b/l10n_ro_report_D300/static/src/js/l10n_ro_report_d300_widgets.js new file mode 100644 index 000000000..5a1311ec2 --- /dev/null +++ b/l10n_ro_report_D300/static/src/js/l10n_ro_report_d300_widgets.js @@ -0,0 +1,45 @@ +odoo.define('l10n_ro_report_D300.l10n_ro_report_d300_widget', function +(require) { +'use strict'; + +var core = require('web.core'); +var Widget = require('web.Widget'); + +var D300ReportWidget = Widget.extend({ + events: { + 'click .o_l10n_ro_report_d300_web_action': 'boundLink', + 'click .o_l10n_ro_report_d300_web_action_multi': 'boundLinkmulti', + }, + init: function(parent) { + this._super.apply(this, arguments); + }, + start: function() { + return this._super.apply(this, arguments); + }, + boundLink: function(e) { + var res_model = $(e.target).data('res-model') + var res_id = $(e.target).data('active-id') + return this.do_action({ + type: 'ir.actions.act_window', + res_model: res_model, + res_id: res_id, + views: [[false, 'form']], + target: 'current' + }); + }, + boundLinkmulti: function(e) { + var res_model = $(e.target).data('res-model') + var res_id = $(e.target).data('active-id') + return this.do_action({ + type: 'ir.actions.act_window', + res_model: res_model, + domain: [["id", "in", res_id]], + views: [[false, "list"], [false, "form"]], + target: 'current' + }); + }, +}); + +return D300ReportWidget; + +}); diff --git a/l10n_ro_report_D300/views/l10n_ro_report_d300.xml b/l10n_ro_report_D300/views/l10n_ro_report_d300.xml new file mode 100644 index 000000000..da7221c30 --- /dev/null +++ b/l10n_ro_report_D300/views/l10n_ro_report_d300.xml @@ -0,0 +1,154 @@ + + + + + + + + + diff --git a/l10n_ro_report_D300/views/l10n_ro_report_d300_template.xml b/l10n_ro_report_D300/views/l10n_ro_report_d300_template.xml new file mode 100755 index 000000000..4b9fd63cc --- /dev/null +++ b/l10n_ro_report_D300/views/l10n_ro_report_d300_template.xml @@ -0,0 +1,9 @@ + + + + diff --git a/l10n_ro_report_D300/views/l10n_ro_report_d300_view.xml b/l10n_ro_report_D300/views/l10n_ro_report_d300_view.xml new file mode 100755 index 000000000..3bdd0c629 --- /dev/null +++ b/l10n_ro_report_D300/views/l10n_ro_report_d300_view.xml @@ -0,0 +1,48 @@ + + + + + + + Account financial report qweb paperformat + + custom + 297 + 210 + Portrait + 45 + 8 + 5 + 5 + + 40 + 110 + + + + + + + D300 XLSX + l10n_ro_report_d300 + ir.actions.report + l10n_ro_report_d300_xlsx + xlsx + l10n_ro_report_d300 + + + diff --git a/l10n_ro_report_D300/views/layouts.xml b/l10n_ro_report_D300/views/layouts.xml new file mode 100644 index 000000000..2efb33bff --- /dev/null +++ b/l10n_ro_report_D300/views/layouts.xml @@ -0,0 +1,66 @@ + + + + + + diff --git a/l10n_ro_report_D300/views/report_template.xml b/l10n_ro_report_D300/views/report_template.xml new file mode 100644 index 000000000..b6d5b78ff --- /dev/null +++ b/l10n_ro_report_D300/views/report_template.xml @@ -0,0 +1,27 @@ + + + +