diff --git a/account_financial_report_qweb/README.rst b/account_financial_report_qweb/README.rst index 73a867b5..565db0f1 100644 --- a/account_financial_report_qweb/README.rst +++ b/account_financial_report_qweb/README.rst @@ -1,42 +1,85 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 - -============================= -account_financial_report_qweb -============================= +====================== +QWeb Financial Reports +====================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github + :target: https://github.com/OCA/account-financial-reporting/tree/10.0/account_financial_report_qweb + :alt: OCA/account-financial-reporting +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-financial-reporting-10-0/account-financial-reporting-10-0-account_financial_report_qweb + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/91/10.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds a set of financial reports. They are accessible under Accounting / Reporting / OCA Reports. - General ledger -- Journal Ledger - Trial Balance - Open Items - Aged Partner Balance +- VAT Report +- Journal Ledger + +Currently General ledger, Trial Balance and Open Items are fully compatible with a foreign +currency set up in account in order to display balances. Moreover, any foreign +currency used in account move lines is properly shown. + +In case that in an account has not been configured a second currency foreign +currency balances are not available. + +**Table of contents** + +.. contents:: + :local: + +Changelog +========= -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/91/10.0 +10.0.2.0.0 (2018-11-29) +~~~~~~~~~~~~~~~~~~~~~~~ + +* The Trial Balance now allows to display the hierarchy of accounts +* In the Trial Balance you can apply a filter by hierarchy levels +* In the Journal Ledger the field 'Journal' is now optional 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 smashing it by providing a detailed and welcomed feedback. +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. Credits ======= -Images ------- +Authors +~~~~~~~ -* Odoo Community Association: `Icon `_. +* Camptocamp SA +* initOS GmbH +* redCOR AG +* ACSONE SA/NV Contributors ------------- +~~~~~~~~~~~~ * Jordi Ballester * Yannick Vaucher @@ -53,22 +96,25 @@ Contributors * Julien Coux * Akim Juillerat * Alexis de Lattre +* Mihai Fekete * Benjamin Willig Much of the work in this module was done at a sprint in Sorrento, Italy in April 2016. -Maintainer ----------- +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. 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. +This module is part of the `OCA/account-financial-reporting `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_financial_report_qweb/__manifest__.py b/account_financial_report_qweb/__manifest__.py index b55996e7..5bebc5fd 100644 --- a/account_financial_report_qweb/__manifest__.py +++ b/account_financial_report_qweb/__manifest__.py @@ -5,7 +5,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': 'QWeb Financial Reports', - 'version': '10.0.1.5.3', + 'version': '10.0.2.0.0', 'category': 'Reporting', 'summary': 'OCA Financial Reports', 'author': 'Camptocamp SA,' @@ -16,9 +16,11 @@ "website": "https://odoo-community.org/", 'depends': [ 'account', + 'account_group', # account-financial-tools 'date_range', 'report_xlsx', 'report', + 'web_widget_many2many_tags_multi_selection', ], 'data': [ 'wizard/aged_partner_balance_wizard_view.xml', diff --git a/account_financial_report_qweb/models/account_group.py b/account_financial_report_qweb/models/account_group.py new file mode 100644 index 00000000..307cf45c --- /dev/null +++ b/account_financial_report_qweb/models/account_group.py @@ -0,0 +1,31 @@ +# coding: utf-8 +# Copyright 2018 Eficent +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountGroup(models.Model): + _inherit = 'account.group' + + group_child_ids = fields.One2many( + comodel_name='account.group', + inverse_name='parent_id', + string='Child Groups') + + compute_account_ids = fields.Many2many( + 'account.account', + compute='_compute_group_accounts', + string="Accounts", store=True) + + @api.multi + @api.depends('code_prefix', 'account_ids', 'account_ids.code', + 'group_child_ids', 'group_child_ids.account_ids.code') + def _compute_group_accounts(self): + account_obj = self.env['account.account'] + accounts = account_obj.search([]) + for group in self: + prefix = group.code_prefix if group.code_prefix else group.name + gr_acc = accounts.filtered( + lambda a: a.code.startswith(prefix)).ids + group.compute_account_ids = [(6, 0, gr_acc)] diff --git a/account_financial_report_qweb/readme/CONTRIBUTORS.rst b/account_financial_report_qweb/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..243b6b80 --- /dev/null +++ b/account_financial_report_qweb/readme/CONTRIBUTORS.rst @@ -0,0 +1,20 @@ +* Jordi Ballester +* Yannick Vaucher +* Simone Orsi +* Leonardo Pistone +* Damien Crier +* Andrea Stirpe +* Thomas Rehn +* Andrea Gallina <4everamd@gmail.com> +* Robert Rottermann +* Ciro Urselli +* Francesco Apruzzese +* Lorenzo Battistini +* Julien Coux +* Akim Juillerat +* Alexis de Lattre +* Mihai Fekete +* Benjamin Willig + +Much of the work in this module was done at a sprint in Sorrento, Italy in +April 2016. diff --git a/account_financial_report_qweb/readme/DESCRIPTION.rst b/account_financial_report_qweb/readme/DESCRIPTION.rst new file mode 100644 index 00000000..6dab949f --- /dev/null +++ b/account_financial_report_qweb/readme/DESCRIPTION.rst @@ -0,0 +1,16 @@ +This module adds a set of financial reports. They are accessible under +Accounting / Reporting / OCA Reports. + +- General ledger +- Trial Balance +- Open Items +- Aged Partner Balance +- VAT Report +- Journal Ledger + +Currently General ledger, Trial Balance and Open Items are fully compatible with a foreign +currency set up in account in order to display balances. Moreover, any foreign +currency used in account move lines is properly shown. + +In case that in an account has not been configured a second currency foreign +currency balances are not available. diff --git a/account_financial_report_qweb/readme/HISTORY.rst b/account_financial_report_qweb/readme/HISTORY.rst new file mode 100644 index 00000000..c353a208 --- /dev/null +++ b/account_financial_report_qweb/readme/HISTORY.rst @@ -0,0 +1,9 @@ +10.0.2.0.0 (2018-11-29) +~~~~~~~~~~~~~~~~~~~~~~~ + +* The Trial Balance now allows to display the hierarchy of accounts +* In the Trial Balance you can apply a filter by hierarchy levels +* The Trial Balance shows the unaffected earnings account computed as: + initial balance: sum of past unaffected earnings + P&L result; debit, credit + and period balance: totals only for the unaffected earnings account. +* In the Journal Ledger the field 'Journal' is now optional diff --git a/account_financial_report_qweb/report/abstract_report_xlsx.py b/account_financial_report_qweb/report/abstract_report_xlsx.py index 16114503..275201f2 100644 --- a/account_financial_report_qweb/report/abstract_report_xlsx.py +++ b/account_financial_report_qweb/report/abstract_report_xlsx.py @@ -23,6 +23,7 @@ class AbstractReportXslx(ReportXlsx): # Formats self.format_right = None + self.format_left = None self.format_right_bold_italic = None self.format_bold = None self.format_header_left = None @@ -43,6 +44,7 @@ class AbstractReportXslx(ReportXlsx): self._define_formats(workbook) report_name = self._get_report_name() + report_footer = self._get_report_footer() filters = self._get_report_filters(report) self.columns = self._get_report_columns(report) @@ -57,6 +59,8 @@ class AbstractReportXslx(ReportXlsx): self._generate_report_content(workbook, report) + self._write_report_footer(report_footer) + def add_sheet(self, workbook, sheet_name): return workbook.add_worksheet(sheet_name) @@ -80,6 +84,7 @@ class AbstractReportXslx(ReportXlsx): """ self.format_bold = workbook.add_format({'bold': True}) self.format_right = workbook.add_format({'align': 'right'}) + self.format_left = workbook.add_format({'align': 'left'}) self.format_right_bold_italic = workbook.add_format( {'align': 'right', 'bold': True, 'italic': True} ) @@ -107,6 +112,9 @@ class AbstractReportXslx(ReportXlsx): self.format_amount = workbook.add_format() self.format_amount.set_num_format( '#,##0.'+'0'*currency_id.decimal_places) + self.format_amount_bold = workbook.add_format({'bold': True}) + self.format_amount_bold.set_num_format( + '#,##0.'+'0'*currency_id.decimal_places) self.format_percent_bold_italic = workbook.add_format( {'bold': True, 'italic': True} ) @@ -135,6 +143,18 @@ class AbstractReportXslx(ReportXlsx): ) self.row_pos += 3 + def _write_report_footer(self, footer): + """Write report footer . + Columns are defined with `_get_report_columns` method. + """ + if footer: + self.row_pos += 1 + self.sheet.merge_range( + self.row_pos, 0, self.row_pos, len(self.columns) - 1, + footer, self.format_left + ) + self.row_pos += 1 + def _write_filters(self, filters): """Write one line per filters on starting on current line. Columns number for filter name is defined @@ -188,10 +208,20 @@ class AbstractReportXslx(ReportXlsx): 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 '') + if hasattr(line_object, 'account_group_id') and \ + line_object.account_group_id: + self.sheet.write_string(self.row_pos, col_pos, value or '', + self.format_bold) + else: + self.sheet.write_string(self.row_pos, col_pos, value or '') elif cell_type == 'amount': + if hasattr(line_object, 'account_group_id') and \ + line_object.account_group_id: + cell_format = self.format_amount_bold + else: + cell_format = self.format_amount self.sheet.write_number( - self.row_pos, col_pos, float(value), self.format_amount + self.row_pos, col_pos, float(value), cell_format ) elif cell_type == 'amount_currency': if line_object.currency_id: @@ -288,10 +318,16 @@ class AbstractReportXslx(ReportXlsx): def _get_currency_amt_format(self, line_object): """ Return amount format specific for each currency. """ - format_amt = getattr(self, 'format_amount') + if hasattr(line_object, 'account_group_id') and \ + line_object.account_group_id: + format_amt = getattr(self, 'format_amount_bold') + field_prefix = 'format_amount_bold' + else: + format_amt = getattr(self, 'format_amount') + field_prefix = 'format_amount' if line_object.currency_id: field_name = \ - 'format_amount_%s' % line_object.currency_id.name + '%s_%s' % (field_prefix, line_object.currency_id.name) if hasattr(self, field_name): format_amt = getattr(self, field_name) else: @@ -333,6 +369,13 @@ class AbstractReportXslx(ReportXlsx): """ raise NotImplementedError() + def _get_report_footer(self): + """ + Allow to define the report footer. + :return: the report footer + """ + return False + def _get_report_columns(self, report): """ Allow to define the report columns diff --git a/account_financial_report_qweb/report/general_ledger.py b/account_financial_report_qweb/report/general_ledger.py index a9a79fd3..bb8768e3 100644 --- a/account_financial_report_qweb/report/general_ledger.py +++ b/account_financial_report_qweb/report/general_ledger.py @@ -29,7 +29,7 @@ class GeneralLedgerReport(models.TransientModel): date_to = fields.Date() fy_start_date = fields.Date() only_posted_moves = fields.Boolean() - hide_account_balance_at_0 = fields.Boolean() + hide_account_at_0 = fields.Boolean() foreign_currency = fields.Boolean() show_analytic_tags = fields.Boolean() company_id = fields.Many2one(comodel_name='res.company') @@ -552,7 +552,7 @@ WHERE OR f.balance IS NOT NULL AND f.balance != 0 ) """ - if self.hide_account_balance_at_0: + if self.hide_account_at_0: query_inject_account += """ AND f.balance IS NOT NULL AND f.balance != 0 @@ -613,7 +613,7 @@ AND tuple(self.filter_cost_center_ids.ids), ) query_inject_account_params += ( - self.id or 'NULL', + self.id, self.env.uid, ) self.env.cr.execute(query_inject_account, query_inject_account_params) @@ -934,7 +934,7 @@ WHERE OR f.balance IS NOT NULL AND f.balance != 0 ) """ - if self.hide_account_balance_at_0: + if self.hide_account_at_0: query_inject_partner += """ AND f.balance IS NOT NULL AND f.balance != 0 @@ -1559,224 +1559,208 @@ WHERE } self.env.cr.execute(query_update_analytic_tags, params) - def _get_unaffected_earnings_account_sub_subquery_sum_initial( - self - ): - """ Return subquery used to compute sum amounts on - unaffected earnings accounts """ - sub_subquery_sum_amounts = """ + def _inject_unaffected_earnings_account_values(self): + """Inject the report values of the unaffected earnings account + for report_general_ledger_qweb_account.""" + # Fetch the profit and loss accounts + query_unaffected_earnings_account_ids = """ + SELECT a.id + FROM account_account as a + INNER JOIN account_account_type as at + ON at.id = a.user_type_id + WHERE at.include_initial_balance = FALSE + """ + self.env.cr.execute(query_unaffected_earnings_account_ids) + pl_account_ids = [r[0] for r in self.env.cr.fetchall()] + unaffected_earnings_account_ids = \ + pl_account_ids + [self.unaffected_earnings_account.id] + # Fetch the current fiscal year start date + date = fields.Datetime.from_string(self.date_from) + res = self.company_id.compute_fiscalyear_dates(date) + fy_start_date = res['date_from'] + query_select_previous_fy_unaffected_earnings_params = { + 'date_to': fy_start_date, + 'company_id': self.company_id.id, + 'account_ids': tuple(unaffected_earnings_account_ids), + 'analytic_tag_ids': tuple(self.filter_analytic_tag_ids.ids), + } + query_select_previous_fy_unaffected_earnings = '' + q_analytic_tags = '' + if self.filter_analytic_tag_ids: + q_analytic_tags = """ +WITH move_lines_on_tags AS + ( SELECT - SUM(ml.balance) AS initial_balance, - 0.0 AS final_balance + DISTINCT ml.id AS ml_id FROM account_account a - INNER JOIN - account_account_type at ON a.user_type_id = at.id INNER JOIN account_move_line ml ON a.id = ml.account_id - AND ml.date < %(date_from)s - """ - if self.only_posted_moves: - sub_subquery_sum_amounts += """ INNER JOIN - account_move m ON ml.move_id = m.id AND m.state = 'posted' - """ - if self.filter_cost_center_ids: - sub_subquery_sum_amounts += """ + account_analytic_tag_account_move_line_rel atml + ON atml.account_move_line_id = ml.id INNER JOIN - account_analytic_account aa + account_analytic_tag aat ON - ml.analytic_account_id = aa.id - AND aa.id IN %(cost_center_ids)s - """ - if self.filter_analytic_tag_ids: - sub_subquery_sum_amounts += """ - INNER JOIN - move_lines_on_tags ON ml.id = move_lines_on_tags.ml_id - """ - sub_subquery_sum_amounts += """ + atml.account_analytic_tag_id = aat.id WHERE - a.company_id = %(company_id)s - AND - a.id IN %(unaffected_earnings_account_ids)s + aat.id IN %(analytic_tag_ids)s + ) +""" + query_select_previous_fy_unaffected_earnings += q_analytic_tags + + query_select_previous_fy_unaffected_earnings += """ + SELECT sum(ml.balance) as balance + FROM account_move_line as ml + INNER JOIN account_move as am + ON am.id = ml.move_id + INNER JOIN account_journal j + ON am.journal_id = j.id """ - if self.filter_journal_ids: - sub_subquery_sum_amounts += """ - AND - ml.journal_id in %(filter_journal_ids)s """ - return sub_subquery_sum_amounts - - def _get_unaffected_earnings_account_sub_subquery_sum_final(self): - """ Return subquery used to compute sum amounts on - unaffected earnings accounts """ - - sub_subquery_sum_amounts = """ - SELECT - 0.0 AS initial_balance, - SUM(ml.balance) AS final_balance - """ - sub_subquery_sum_amounts += """ - FROM - account_account a - INNER JOIN - account_account_type at ON a.user_type_id = at.id - INNER JOIN - account_move_line ml - ON a.id = ml.account_id - AND ml.date <= %(date_to)s - """ - if self.only_posted_moves: - sub_subquery_sum_amounts += """ - INNER JOIN - account_move m ON ml.move_id = m.id AND m.state = 'posted' - """ if self.filter_cost_center_ids: - sub_subquery_sum_amounts += """ - INNER JOIN - account_analytic_account aa - ON - ml.analytic_account_id = aa.id - AND aa.id IN %(cost_center_ids)s - """ - if self.filter_analytic_tag_ids: - sub_subquery_sum_amounts += """ - INNER JOIN - move_lines_on_tags ON ml.id = move_lines_on_tags.ml_id + query_select_previous_fy_unaffected_earnings += """ + INNER JOIN account_analytic_account aa + ON aml.analytic_account_id = aa.id + AND aa.id IN %(cost_center_ids)s """ - sub_subquery_sum_amounts += """ - WHERE - a.company_id = %(company_id)s - AND - a.id IN %(unaffected_earnings_account_ids)s + query_select_previous_fy_unaffected_earnings_params[ + 'cost_center_ids'] = tuple(self.filter_cost_center_ids.ids) + if self.filter_analytic_tag_ids: + query_select_previous_fy_unaffected_earnings += """ + INNER JOIN move_lines_on_tags ON ml.id = + move_lines_on_tags.ml_id + """ + query_select_previous_fy_unaffected_earnings += """ + WHERE ml.date < %(date_to)s + AND ml.company_id = %(company_id)s + AND ml.account_id IN %(account_ids)s """ if self.filter_journal_ids: - sub_subquery_sum_amounts += """ - AND - ml.journal_id in %(filter_journal_ids)s - """ - return sub_subquery_sum_amounts - - def _inject_unaffected_earnings_account_values(self): - """Inject the report values of the unaffected earnings account - for report_general_ledger_qweb_account.""" - subquery_sum_amounts = """ + query_select_previous_fy_unaffected_earnings += """ + AND j.id IN %(journal_ids)s + """ + query_select_previous_fy_unaffected_earnings_params[ + 'journal_ids'] = tuple(self.filter_journal_ids.ids) + if self.only_posted_moves: + query_select_previous_fy_unaffected_earnings += """ + AND am.state = 'posted' + """ + self.env.cr.execute( + query_select_previous_fy_unaffected_earnings, + query_select_previous_fy_unaffected_earnings_params) + res = self.env.cr.fetchone() + unaffected_earnings_initial_balance = res[0] or 0.0 + # Now select the current period unaffected earnings, + # excluding the current period P&L. + query_select_period_unaffected_earnings_params = { + 'date_from': self.date_from, + 'date_to': self.date_to, + 'company_id': self.company_id.id, + 'unaffected_earnings_id': self.unaffected_earnings_account.id, + 'analytic_tag_ids': tuple(self.filter_analytic_tag_ids.ids), + } + query_select_period_unaffected_earnings = '' + if self.filter_analytic_tag_ids: + query_select_period_unaffected_earnings += q_analytic_tags + query_select_period_unaffected_earnings += """ SELECT - SUM(COALESCE(sub.initial_balance, 0.0)) AS initial_balance, - SUM(COALESCE(sub.final_balance, 0.0)) AS final_balance - FROM - ( + sum(ml.debit) as sum_debit, + sum(ml.credit) as sum_credit, + sum(ml.balance) as balance + FROM account_move_line as ml + INNER JOIN account_move as am + ON am.id = ml.move_id + INNER JOIN account_journal j + ON am.journal_id = j.id """ - # Initial balances - subquery_sum_amounts += \ - self._get_unaffected_earnings_account_sub_subquery_sum_initial() - subquery_sum_amounts += """ - UNION - """ - subquery_sum_amounts += \ - self._get_unaffected_earnings_account_sub_subquery_sum_final() - subquery_sum_amounts += """ - ) sub + if self.filter_cost_center_ids: + query_select_period_unaffected_earnings += """ + INNER JOIN account_analytic_account aa + ON aml.analytic_account_id = aa.id + AND aa.id IN %(cost_center_ids)s + """ + query_select_period_unaffected_earnings_params[ + 'cost_center_ids'] = tuple(self.filter_cost_center_ids.ids) + if self.filter_analytic_tag_ids: + query_select_period_unaffected_earnings += """ + INNER JOIN move_lines_on_tags + ON ml.id = move_lines_on_tags.ml_id + """ + query_select_period_unaffected_earnings += """ + WHERE am.date >= %(date_from)s + AND ml.date <= %(date_to)s + AND ml.company_id = %(company_id)s + AND ml.account_id = %(unaffected_earnings_id)s """ + if self.filter_journal_ids: + query_select_period_unaffected_earnings += """ + AND j.id IN %(journal_ids)s + """ + query_select_period_unaffected_earnings_params[ + 'journal_ids'] = tuple(self.filter_journal_ids.ids) + if self.only_posted_moves: + query_select_period_unaffected_earnings += """ + AND am.state = 'posted' + """ + self.env.cr.execute(query_select_period_unaffected_earnings, + query_select_period_unaffected_earnings_params) + res = self.env.cr.fetchone() + unaffected_earnings_period_debit = res[0] or 0.0 + unaffected_earnings_period_credit = res[1] or 0.0 + unaffected_earnings_period_balance = res[2] or 0.0 # pylint: disable=sql-injection query_inject_account = """ - WITH - """ - - if self.filter_analytic_tag_ids: - query_inject_account += """ - move_lines_on_tags AS - ( - SELECT - DISTINCT ml.id AS ml_id - FROM - account_account a - INNER JOIN - account_move_line ml - ON a.id = ml.account_id - INNER JOIN - account_analytic_tag_account_move_line_rel atml - ON atml.account_move_line_id = ml.id - INNER JOIN - account_analytic_tag aat - ON - atml.account_analytic_tag_id = aat.id - WHERE - aat.id IN %(analytic_tag_ids)s - ), - """ - - query_inject_account += """ - sum_amounts AS ( """ + subquery_sum_amounts + """ ) - INSERT INTO - report_general_ledger_qweb_account - ( - report_id, - create_uid, - create_date, - account_id, - code, - name, - is_partner_account, - initial_balance, - final_balance, - currency_id + INSERT INTO + report_general_ledger_qweb_account ( + report_id, + create_uid, + create_date, + account_id, + code, + name, + is_partner_account, + initial_debit, + initial_credit, + initial_balance, + final_debit, + final_credit, + final_balance + ) + VALUES ( + %(report_id)s, + %(user_id)s, + NOW(), + %(account_id)s, + %(code)s, + %(name)s, + False, + %(initial_debit)s, + %(initial_credit)s, + %(initial_balance)s, + %(final_debit)s, + %(final_credit)s, + %(final_balance)s ) - SELECT - %(report_id)s AS report_id, - %(user_id)s AS create_uid, - NOW() AS create_date, - a.id AS account_id, - a.code, - a.name, - False AS is_partner_account, - COALESCE(i.initial_balance, 0.0) AS initial_balance, - COALESCE(i.final_balance, 0.0) AS final_balance, - c.id as currency_id - FROM - account_account a - LEFT JOIN - res_currency c ON c.id = a.currency_id, - sum_amounts i - WHERE - a.company_id = %(company_id)s - AND a.id = %(unaffected_earnings_account_id)s - """ - query_inject_account_params = {} - if self.filter_analytic_tag_ids: - query_inject_account_params['analytic_tag_ids'] = \ - tuple(self.filter_analytic_tag_ids.ids) - query_inject_account_params.update({ - 'date_from': self.date_from, - 'date_to': self.date_to, - 'fy_start_date': self.fy_start_date, - }) - if self.filter_cost_center_ids: - query_inject_account_params['cost_center_ids'] = \ - tuple(self.filter_cost_center_ids.ids) - - query_inject_account_params['company_id'] = self.company_id.id - query_inject_account_params['unaffected_earnings_account_id'] = \ - self.unaffected_earnings_account.id - query_inject_account_params['report_id'] = self.id - query_inject_account_params['user_id'] = self.env.uid - - if self.filter_journal_ids: - query_inject_account_params['filter_journal_ids'] = (tuple( - self.filter_journal_ids.ids, - ),) - # Fetch the profit and loss accounts - query_unaffected_earnings_account_ids = """ - SELECT a.id - FROM account_account as a - INNER JOIN account_account_type as at - ON at.id = a.user_type_id - WHERE at.include_initial_balance = FALSE """ - self.env.cr.execute(query_unaffected_earnings_account_ids) - pl_account_ids = [r[0] for r in self.env.cr.fetchall()] - query_inject_account_params['unaffected_earnings_account_ids'] = \ - tuple(pl_account_ids + [self.unaffected_earnings_account.id]) - + initial_debit = unaffected_earnings_initial_balance >= 0 and \ + unaffected_earnings_initial_balance or 0 + initial_credit = unaffected_earnings_initial_balance < 0 and \ + -1 * unaffected_earnings_initial_balance or 0 + final_balance = unaffected_earnings_initial_balance + \ + unaffected_earnings_period_balance + query_inject_account_params = { + 'report_id': self.id, + 'user_id': self.env.uid, + 'account_id': self.unaffected_earnings_account.id, + 'code': self.unaffected_earnings_account.code, + 'name': self.unaffected_earnings_account.name, + 'initial_debit': initial_debit, + 'initial_credit': initial_credit, + 'initial_balance': unaffected_earnings_initial_balance, + 'final_debit': initial_debit + unaffected_earnings_period_debit, + 'final_credit': initial_credit + unaffected_earnings_period_credit, + 'final_balance': final_balance, + } self.env.cr.execute(query_inject_account, query_inject_account_params) diff --git a/account_financial_report_qweb/report/general_ledger_xlsx.py b/account_financial_report_qweb/report/general_ledger_xlsx.py index 314c88c3..e6936e52 100644 --- a/account_financial_report_qweb/report/general_ledger_xlsx.py +++ b/account_financial_report_qweb/report/general_ledger_xlsx.py @@ -89,7 +89,7 @@ class GeneralLedgerXslx(abstract_report_xlsx.AbstractReportXslx): ], [ _('Account balance at 0 filter'), - _('Hide') if report.hide_account_balance_at_0 else _('Show'), + _('Hide') if report.hide_account_at_0 else _('Show'), ], [ _('Centralize filter'), diff --git a/account_financial_report_qweb/report/open_items.py b/account_financial_report_qweb/report/open_items.py index 17f42cab..7d1c879a 100644 --- a/account_financial_report_qweb/report/open_items.py +++ b/account_financial_report_qweb/report/open_items.py @@ -22,7 +22,7 @@ class OpenItemsReport(models.TransientModel): # Filters fields, used for data computation date_at = fields.Date() only_posted_moves = fields.Boolean() - hide_account_balance_at_0 = fields.Boolean() + hide_account_at_0 = fields.Boolean() foreign_currency = fields.Boolean() company_id = fields.Many2one(comodel_name='res.company') filter_account_ids = fields.Many2many(comodel_name='account.account') @@ -188,7 +188,7 @@ class OpenItemsReportCompute(models.TransientModel): self._inject_line_values(only_empty_partner_line=True) self._clean_partners_and_accounts() self._compute_partners_and_accounts_cumul() - if self.hide_account_balance_at_0: + if self.hide_account_at_0: self._clean_partners_and_accounts( only_delete_account_balance_at_0=True ) diff --git a/account_financial_report_qweb/report/open_items_xlsx.py b/account_financial_report_qweb/report/open_items_xlsx.py index 9f6c645d..6a4e1a3e 100644 --- a/account_financial_report_qweb/report/open_items_xlsx.py +++ b/account_financial_report_qweb/report/open_items_xlsx.py @@ -63,7 +63,7 @@ class OpenItemsXslx(abstract_report_xlsx.AbstractReportXslx): _('All posted entries') if report.only_posted_moves else _( 'All entries')], [_('Account balance at 0 filter'), - _('Hide') if report.hide_account_balance_at_0 else _('Show')], + _('Hide') if report.hide_account_at_0 else _('Show')], [_('Show foreign currency'), _('Yes') if report.foreign_currency else _('No')], ] diff --git a/account_financial_report_qweb/report/templates/general_ledger.xml b/account_financial_report_qweb/report/templates/general_ledger.xml index 0e097cba..3d9ebb44 100644 --- a/account_financial_report_qweb/report/templates/general_ledger.xml +++ b/account_financial_report_qweb/report/templates/general_ledger.xml @@ -93,8 +93,8 @@ All entries
- Hide - Show + Hide + Show
Yes diff --git a/account_financial_report_qweb/report/templates/open_items.xml b/account_financial_report_qweb/report/templates/open_items.xml index a136f38d..4f8aebb2 100644 --- a/account_financial_report_qweb/report/templates/open_items.xml +++ b/account_financial_report_qweb/report/templates/open_items.xml @@ -75,8 +75,8 @@ All entries
- Hide - Show + Hide + Show
diff --git a/account_financial_report_qweb/report/templates/trial_balance.xml b/account_financial_report_qweb/report/templates/trial_balance.xml index 45b540db..98fe6230 100644 --- a/account_financial_report_qweb/report/templates/trial_balance.xml +++ b/account_financial_report_qweb/report/templates/trial_balance.xml @@ -27,20 +27,29 @@ -
+
- + - + + + + + + + + + +
@@ -94,13 +103,13 @@
- @@ -126,12 +143,12 @@
Code
-
Account +
Account
-
Partner +
Partner
@@ -141,6 +158,8 @@
Debit
Credit
+ +
Period balance
Ending balance
@@ -170,6 +189,16 @@ + + + + + +
@@ -186,6 +215,16 @@ + + + + + + @@ -214,6 +253,18 @@ + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + +
@@ -311,6 +435,17 @@ + + + + + + - +
@@ -335,9 +470,20 @@
- - + + + + + + + + + + + + +
+ +
+ + + + +
report.show_hierarchy_level: + rec.hide_line = True + class TrialBalanceReportPartner(models.TransientModel): @@ -110,6 +155,7 @@ class TrialBalanceReportPartner(models.TransientModel): initial_balance_foreign_currency = fields.Float(digits=(16, 2)) debit = fields.Float(digits=(16, 2)) credit = fields.Float(digits=(16, 2)) + period_balance = fields.Float(digits=(16, 2)) currency_id = fields.Many2one(comodel_name='res.currency') final_balance = fields.Float(digits=(16, 2)) final_balance_foreign_currency = fields.Float(digits=(16, 2)) @@ -169,7 +215,7 @@ class TrialBalanceReportCompute(models.TransientModel): 'date_from': self.date_from, 'date_to': self.date_to, 'only_posted_moves': self.only_posted_moves, - 'hide_account_balance_at_0': self.hide_account_balance_at_0, + 'hide_account_at_0': self.hide_account_at_0, 'foreign_currency': self.foreign_currency, 'company_id': self.company_id.id, 'filter_account_ids': [(6, 0, account_ids.ids)], @@ -201,8 +247,21 @@ class TrialBalanceReportCompute(models.TransientModel): self._inject_account_values(account_ids) if self.show_partner_details: self._inject_partner_values() - # Refresh cache because all data are computed with SQL requests - self.invalidate_cache() + if not self.filter_account_ids: + if self.hierarchy_on != 'none': + self._inject_account_group_values() + if self.hierarchy_on == 'computed': + self._update_account_group_computed_values() + else: + self._update_account_group_child_values() + self._update_account_sequence() + self._add_account_group_account_values() + self.refresh() + if not self.filter_account_ids and self.hierarchy_on != 'none': + self._compute_group_accounts() + else: + for line in self.account_ids: + line.write({'level': 0}) def _inject_account_values(self, account_ids): """Inject report values for report_trial_balance_qweb_account""" @@ -214,11 +273,13 @@ INSERT INTO create_uid, create_date, account_id, + parent_id, code, name, initial_balance, debit, credit, + period_balance, final_balance, currency_id, initial_balance_foreign_currency, @@ -229,11 +290,13 @@ SELECT %s AS create_uid, NOW() AS create_date, acc.id, + acc.group_id, acc.code, acc.name, coalesce(rag.initial_balance, 0) AS initial_balance, coalesce(rag.final_debit - rag.initial_debit, 0) AS debit, coalesce(rag.final_credit - rag.initial_credit, 0) AS credit, + coalesce(rag.final_balance - rag.initial_balance, 0) AS period_balance, coalesce(rag.final_balance, 0) AS final_balance, rag.currency_id AS currency_id, coalesce(rag.initial_balance_foreign_currency, 0) @@ -247,9 +310,6 @@ FROM WHERE acc.id in %s """ - if self.hide_account_balance_at_0: - query_inject_account += """ AND - final_balance IS NOT NULL AND final_balance != 0""" query_inject_account_params = ( self.id, self.env.uid, @@ -273,6 +333,7 @@ INSERT INTO initial_balance_foreign_currency, debit, credit, + period_balance, final_balance, final_balance_foreign_currency ) @@ -286,6 +347,7 @@ SELECT rpg.initial_balance_foreign_currency AS initial_balance_foreign_currency, rpg.final_debit - rpg.initial_debit AS debit, rpg.final_credit - rpg.initial_credit AS credit, + rpg.final_balance - rpg.initial_balance AS period_balance, rpg.final_balance AS final_balance, rpg.final_balance_foreign_currency AS final_balance_foreign_currency FROM @@ -304,3 +366,207 @@ AND ra.report_id = %s self.id, ) self.env.cr.execute(query_inject_partner, query_inject_partner_params) + + def _inject_account_group_values(self): + """Inject report values for report_trial_balance_qweb_account""" + query_inject_account_group = """ +INSERT INTO + report_trial_balance_qweb_account + ( + report_id, + create_uid, + create_date, + account_group_id, + parent_id, + code, + name, + sequence, + level + ) +SELECT + %s AS report_id, + %s AS create_uid, + NOW() AS create_date, + accgroup.id, + accgroup.parent_id, + coalesce(accgroup.code_prefix, accgroup.name), + accgroup.name, + accgroup.parent_left * 100000, + accgroup.level +FROM + account_group accgroup""" + query_inject_account_params = ( + self.id, + self.env.uid, + ) + self.env.cr.execute(query_inject_account_group, + query_inject_account_params) + + def _update_account_group_child_values(self): + """Compute values for report_trial_balance_qweb_account group + in child.""" + query_update_account_group = """ +WITH computed AS (WITH RECURSIVE cte AS ( + SELECT account_group_id, code, account_group_id AS parent_id, + initial_balance, initial_balance_foreign_currency, debit, credit, + period_balance, final_balance, final_balance_foreign_currency + FROM report_trial_balance_qweb_account + WHERE report_id = %s + GROUP BY report_trial_balance_qweb_account.id + + UNION ALL + SELECT c.account_group_id, c.code, p.account_group_id, + p.initial_balance, p.initial_balance_foreign_currency, p.debit, p.credit, + p.period_balance, p.final_balance, p.final_balance_foreign_currency + FROM cte c + JOIN report_trial_balance_qweb_account p USING (parent_id) + WHERE p.report_id = %s +) +SELECT account_group_id, code, + sum(initial_balance) AS initial_balance, + sum(initial_balance_foreign_currency) AS initial_balance_foreign_currency, + sum(debit) AS debit, + sum(credit) AS credit, + sum(debit) - sum(credit) AS period_balance, + sum(final_balance) AS final_balance, + sum(final_balance_foreign_currency) AS final_balance_foreign_currency +FROM cte +GROUP BY cte.account_group_id, cte.code +ORDER BY account_group_id +) +UPDATE report_trial_balance_qweb_account +SET initial_balance = computed.initial_balance, + initial_balance_foreign_currency = + computed.initial_balance_foreign_currency, + debit = computed.debit, + credit = computed.credit, + period_balance = computed.period_balance, + final_balance = computed.final_balance, + final_balance_foreign_currency = + computed.final_balance_foreign_currency +FROM computed +WHERE report_trial_balance_qweb_account.account_group_id = +computed.account_group_id + AND report_trial_balance_qweb_account.report_id = %s +""" + query_update_account_params = (self.id, self.id, self.id,) + self.env.cr.execute(query_update_account_group, + query_update_account_params) + + def _add_account_group_account_values(self): + """Compute values for report_trial_balance_qweb_account group in + child.""" + query_update_account_group = """ +DROP AGGREGATE IF EXISTS array_concat_agg(anyarray); +CREATE AGGREGATE array_concat_agg(anyarray) ( + SFUNC = array_cat, + STYPE = anyarray +); +WITH aggr AS(WITH computed AS (WITH RECURSIVE cte AS ( + SELECT account_group_id, account_group_id AS parent_id, + ARRAY[account_id]::int[] as child_account_ids + FROM report_trial_balance_qweb_account + WHERE report_id = %s + GROUP BY report_trial_balance_qweb_account.id + + UNION ALL + SELECT c.account_group_id, p.account_group_id, ARRAY[p.account_id]::int[] + FROM cte c + JOIN report_trial_balance_qweb_account p USING (parent_id) + WHERE p.report_id = %s +) +SELECT account_group_id, + array_concat_agg(DISTINCT child_account_ids)::int[] as child_account_ids +FROM cte +GROUP BY cte.account_group_id, cte.child_account_ids +ORDER BY account_group_id +) +SELECT account_group_id, + array_concat_agg(DISTINCT child_account_ids)::int[] + AS child_account_ids from computed +GROUP BY account_group_id) +UPDATE report_trial_balance_qweb_account +SET child_account_ids = aggr.child_account_ids +FROM aggr +WHERE report_trial_balance_qweb_account.account_group_id = + aggr.account_group_id + AND report_trial_balance_qweb_account.report_id = %s +""" + query_update_account_params = (self.id, self.id, self.id,) + self.env.cr.execute(query_update_account_group, + query_update_account_params) + + def _update_account_group_computed_values(self): + """Compute values for report_trial_balance_qweb_account group + in compute.""" + query_update_account_group = """ +WITH RECURSIVE accgroup AS +(SELECT + accgroup.id, + sum(coalesce(ra.initial_balance, 0)) as initial_balance, + sum(coalesce(ra.initial_balance_foreign_currency, 0)) + as initial_balance_foreign_currency, + sum(coalesce(ra.debit, 0)) as debit, + sum(coalesce(ra.credit, 0)) as credit, + sum(coalesce(ra.debit, 0)) - sum(coalesce(ra.credit, 0)) as period_balance, + sum(coalesce(ra.final_balance, 0)) as final_balance, + sum(coalesce(ra.final_balance_foreign_currency, 0)) + as final_balance_foreign_currency + FROM + account_group accgroup + LEFT OUTER JOIN account_account AS acc + ON strpos(acc.code, accgroup.code_prefix) = 1 + LEFT OUTER JOIN report_trial_balance_qweb_account AS ra + ON ra.account_id = acc.id + WHERE ra.report_id = %s + GROUP BY accgroup.id +) +UPDATE report_trial_balance_qweb_account +SET initial_balance = accgroup.initial_balance, + initial_balance_foreign_currency = + accgroup.initial_balance_foreign_currency, + debit = accgroup.debit, + credit = accgroup.credit, + period_balance = accgroup.period_balance, + final_balance = accgroup.final_balance, + final_balance_foreign_currency = + accgroup.final_balance_foreign_currency +FROM accgroup +WHERE report_trial_balance_qweb_account.account_group_id = accgroup.id +""" + query_update_account_params = (self.id,) + self.env.cr.execute(query_update_account_group, + query_update_account_params) + + def _update_account_sequence(self): + """Compute sequence, level for report_trial_balance_qweb_ + account account.""" + query_update_account_group = """ +UPDATE report_trial_balance_qweb_account +SET sequence = newline.sequence + 1, + level = newline.level + 1 +FROM report_trial_balance_qweb_account as newline +WHERE newline.account_group_id = report_trial_balance_qweb_account.parent_id + AND report_trial_balance_qweb_account.report_id = newline.report_id + AND report_trial_balance_qweb_account.account_id is not null + AND report_trial_balance_qweb_account.report_id = %s""" + query_update_account_params = (self.id,) + self.env.cr.execute(query_update_account_group, + query_update_account_params) + + def _compute_group_accounts(self): + groups = self.account_ids.filtered( + lambda a: a.account_group_id is not False) + for group in groups: + if self.hierarchy_on == 'compute': + group.compute_account_ids = \ + group.account_group_id.compute_account_ids + else: + if group.child_account_ids: + chacc = group.child_account_ids.replace( + '}', '').replace('{', '').split(',') + if 'NULL' in chacc: + chacc.remove('NULL') + if chacc: + group.compute_account_ids = [ + (6, 0, [int(g) for g in chacc])] diff --git a/account_financial_report_qweb/report/trial_balance_xlsx.py b/account_financial_report_qweb/report/trial_balance_xlsx.py index c1e5aea4..83901e8b 100644 --- a/account_financial_report_qweb/report/trial_balance_xlsx.py +++ b/account_financial_report_qweb/report/trial_balance_xlsx.py @@ -35,22 +35,26 @@ class TrialBalanceXslx(abstract_report_xlsx.AbstractReportXslx): 'field': 'credit', 'type': 'amount', 'width': 14}, - 5: {'header': _('Ending balance'), + 5: {'header': _('Period balance'), + 'field': 'period_balance', + 'type': 'amount', + 'width': 14}, + 6: {'header': _('Ending balance'), 'field': 'final_balance', 'type': 'amount', 'width': 14}, } if report.foreign_currency: foreign_currency = { - 6: {'header': _('Cur.'), + 7: {'header': _('Cur.'), 'field': 'currency_id', 'field_currency_balance': 'currency_id', 'type': 'many2one', 'width': 7}, - 7: {'header': _('Initial balance'), + 8: {'header': _('Initial balance'), 'field': 'initial_balance_foreign_currency', 'type': 'amount_currency', 'width': 14}, - 8: {'header': _('Ending balance'), + 9: {'header': _('Ending balance'), 'field': 'final_balance_foreign_currency', 'type': 'amount_currency', 'width': 14}, @@ -72,22 +76,26 @@ class TrialBalanceXslx(abstract_report_xlsx.AbstractReportXslx): 'field': 'credit', 'type': 'amount', 'width': 14}, - 4: {'header': _('Ending balance'), + 4: {'header': _('Period balance'), + 'field': 'period_balance', + 'type': 'amount', + 'width': 14}, + 5: {'header': _('Ending balance'), 'field': 'final_balance', 'type': 'amount', 'width': 14}, } if report.foreign_currency: foreign_currency = { - 5: {'header': _('Cur.'), + 6: {'header': _('Cur.'), 'field': 'currency_id', 'field_currency_balance': 'currency_id', 'type': 'many2one', 'width': 7}, - 6: {'header': _('Initial balance'), + 7: {'header': _('Initial balance'), 'field': 'initial_balance_foreign_currency', 'type': 'amount_currency', 'width': 14}, - 7: {'header': _('Ending balance'), + 8: {'header': _('Ending balance'), 'field': 'final_balance_foreign_currency', 'type': 'amount_currency', 'width': 14}, @@ -102,10 +110,13 @@ class TrialBalanceXslx(abstract_report_xlsx.AbstractReportXslx): [_('Target moves filter'), _('All posted entries') if report.only_posted_moves else _('All entries')], - [_('Account balance at 0 filter'), - _('Hide') if report.hide_account_balance_at_0 else _('Show')], + [_('Account at 0 filter'), + _('Hide') if report.hide_account_at_0 else _('Show')], [_('Show foreign currency'), _('Yes') if report.foreign_currency else _('No')], + [_('Limit hierarchy levels'), + _('Level %s' % report.show_hierarchy_level) if + report.limit_hierarchy_level else _('No limit')], ] def _get_col_count_filter_name(self): @@ -121,7 +132,7 @@ class TrialBalanceXslx(abstract_report_xlsx.AbstractReportXslx): self.write_array_header() # For each account - for account in report.account_ids: + for account in report.account_ids.filtered(lambda a: not a.hide_line): if not report.show_partner_details: # Display account lines self.write_line(account, 'account') diff --git a/account_financial_report_qweb/static/description/index.html b/account_financial_report_qweb/static/description/index.html new file mode 100644 index 00000000..01ff2ba3 --- /dev/null +++ b/account_financial_report_qweb/static/description/index.html @@ -0,0 +1,447 @@ + + + + + + +QWeb Financial Reports + + + +
+

QWeb Financial Reports

+ + +

Beta License: AGPL-3 OCA/account-financial-reporting Translate me on Weblate Try me on Runbot

+

This module adds a set of financial reports. They are accessible under +Accounting / Reporting / OCA Reports.

+
    +
  • General ledger
  • +
  • Trial Balance
  • +
  • Open Items
  • +
  • Aged Partner Balance
  • +
  • VAT Report
  • +
  • Journal Ledger
  • +
+

Currently General ledger, Trial Balance and Open Items are fully compatible with a foreign +currency set up in account in order to display balances. Moreover, any foreign +currency used in account move lines is properly shown.

+

In case that in an account has not been configured a second currency foreign +currency balances are not available.

+

Table of contents

+ +
+

Changelog

+
+

10.0.2.0.0 (2018-11-29)

+
    +
  • The Trial Balance now allows to display the hierarchy of accounts
  • +
  • In the Trial Balance you can apply a filter by hierarchy levels
  • +
  • In the Journal Ledger the field ‘Journal’ is now optional
  • +
+
+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp SA
  • +
  • initOS GmbH
  • +
  • redCOR AG
  • +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +

Much of the work in this module was done at a sprint in Sorrento, Italy in +April 2016.

+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

This module is part of the OCA/account-financial-reporting project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/account_financial_report_qweb/tests/test_general_ledger.py b/account_financial_report_qweb/tests/test_general_ledger.py index 127af587..f280015d 100644 --- a/account_financial_report_qweb/tests/test_general_ledger.py +++ b/account_financial_report_qweb/tests/test_general_ledger.py @@ -42,14 +42,14 @@ class TestGeneralLedger(a_t_f_c.AbstractTestForeignCurrency): def _getAdditionalFiltersToBeTested(self): additional_filters = [ {'only_posted_moves': True}, - {'hide_account_balance_at_0': True}, + {'hide_account_at_0': True}, {'centralize': True}, - {'only_posted_moves': True, 'hide_account_balance_at_0': True}, + {'only_posted_moves': True, 'hide_account_at_0': True}, {'only_posted_moves': True, 'centralize': True}, - {'hide_account_balance_at_0': True, 'centralize': True}, + {'hide_account_at_0': True, 'centralize': True}, { 'only_posted_moves': True, - 'hide_account_balance_at_0': True, + 'hide_account_at_0': True, 'centralize': True }, ] @@ -155,7 +155,7 @@ class TestGeneralLedgerReport(common.TransactionCase): 'date_from': self.fy_date_start, 'date_to': self.fy_date_end, 'only_posted_moves': True, - 'hide_account_balance_at_0': False, + 'hide_account_at_0': False, 'company_id': company.id, 'fy_start_date': self.fy_date_start, }) @@ -377,10 +377,10 @@ class TestGeneralLedgerReport(common.TransactionCase): # Check the initial and final balance self.assertEqual(lines['unaffected'].initial_debit, 0) - self.assertEqual(lines['unaffected'].initial_credit, 0) + self.assertEqual(lines['unaffected'].initial_credit, 1000) self.assertEqual(lines['unaffected'].initial_balance, -1000) - self.assertEqual(lines['unaffected'].final_debit, -0) - self.assertEqual(lines['unaffected'].final_credit, 0) + self.assertEqual(lines['unaffected'].final_debit, 0) + self.assertEqual(lines['unaffected'].final_credit, 1000) self.assertEqual(lines['unaffected'].final_balance, -1000) # Add reversale move of the initial move the first day of fiscal year @@ -402,11 +402,11 @@ class TestGeneralLedgerReport(common.TransactionCase): # Check the initial and final balance self.assertEqual(lines['unaffected'].initial_debit, 0) - self.assertEqual(lines['unaffected'].initial_credit, 0) + self.assertEqual(lines['unaffected'].initial_credit, 1000) self.assertEqual(lines['unaffected'].initial_balance, -1000) - self.assertEqual(lines['unaffected'].final_debit, 0) - self.assertEqual(lines['unaffected'].final_credit, 0) - self.assertEqual(lines['unaffected'].final_balance, -1000) + self.assertEqual(lines['unaffected'].final_debit, 1000) + self.assertEqual(lines['unaffected'].final_credit, 1000) + self.assertEqual(lines['unaffected'].final_balance, 0) # Add another move at the end day of fiscal year # to check that it correctly used on report @@ -426,11 +426,11 @@ class TestGeneralLedgerReport(common.TransactionCase): # Check the initial and final balance self.assertEqual(lines['unaffected'].initial_debit, 0) - self.assertEqual(lines['unaffected'].initial_credit, 0) + self.assertEqual(lines['unaffected'].initial_credit, 1000) self.assertEqual(lines['unaffected'].initial_balance, -1000) - self.assertEqual(lines['unaffected'].final_debit, 0) - self.assertEqual(lines['unaffected'].final_credit, 0) - self.assertEqual(lines['unaffected'].final_balance, -4000) + self.assertEqual(lines['unaffected'].final_debit, 1000) + self.assertEqual(lines['unaffected'].final_credit, 4000) + self.assertEqual(lines['unaffected'].final_balance, -3000) def test_04_unaffected_account_balance_2_years(self): # Generate the general ledger line @@ -460,10 +460,10 @@ class TestGeneralLedgerReport(common.TransactionCase): self.assertEqual(len(lines['unaffected']), 1) # Check the initial and final balance - self.assertEqual(lines['unaffected'].initial_debit, 0) + self.assertEqual(lines['unaffected'].initial_debit, 1000) self.assertEqual(lines['unaffected'].initial_credit, 0) self.assertEqual(lines['unaffected'].initial_balance, 1000) - self.assertEqual(lines['unaffected'].final_debit, 0) + self.assertEqual(lines['unaffected'].final_debit, 1000) self.assertEqual(lines['unaffected'].final_credit, 0) self.assertEqual(lines['unaffected'].final_balance, 1000) @@ -493,9 +493,9 @@ class TestGeneralLedgerReport(common.TransactionCase): self.assertEqual(len(lines['unaffected']), 1) # Check the initial and final balance - self.assertEqual(lines['unaffected'].initial_debit, 0) + self.assertEqual(lines['unaffected'].initial_debit, 500) self.assertEqual(lines['unaffected'].initial_credit, 0) self.assertEqual(lines['unaffected'].initial_balance, 500) - self.assertEqual(lines['unaffected'].final_debit, 0) + self.assertEqual(lines['unaffected'].final_debit, 500) self.assertEqual(lines['unaffected'].final_credit, 0) self.assertEqual(lines['unaffected'].final_balance, 500) diff --git a/account_financial_report_qweb/tests/test_open_items.py b/account_financial_report_qweb/tests/test_open_items.py index ce64984b..66b0d151 100644 --- a/account_financial_report_qweb/tests/test_open_items.py +++ b/account_financial_report_qweb/tests/test_open_items.py @@ -37,6 +37,6 @@ class TestOpenItems(a_t_f_c.AbstractTestForeignCurrency): def _getAdditionalFiltersToBeTested(self): return [ {'only_posted_moves': True}, - {'hide_account_balance_at_0': True}, - {'only_posted_moves': True, 'hide_account_balance_at_0': True}, + {'hide_account_at_0': True}, + {'only_posted_moves': True, 'hide_account_at_0': True}, ] diff --git a/account_financial_report_qweb/tests/test_trial_balance.py b/account_financial_report_qweb/tests/test_trial_balance.py index 99a45d94..6dce00b0 100644 --- a/account_financial_report_qweb/tests/test_trial_balance.py +++ b/account_financial_report_qweb/tests/test_trial_balance.py @@ -41,14 +41,14 @@ class TestTrialBalance(a_t_f_c.AbstractTestForeignCurrency): def _getAdditionalFiltersToBeTested(self): return [ {'only_posted_moves': True}, - {'hide_account_balance_at_0': True}, + {'hide_account_at_0': True}, {'show_partner_details': True}, - {'only_posted_moves': True, 'hide_account_balance_at_0': True}, + {'only_posted_moves': True, 'hide_account_at_0': True}, {'only_posted_moves': True, 'show_partner_details': True}, - {'hide_account_balance_at_0': True, 'show_partner_details': True}, + {'hide_account_at_0': True, 'show_partner_details': True}, { 'only_posted_moves': True, - 'hide_account_balance_at_0': True, + 'hide_account_at_0': True, 'show_partner_details': True }, ] diff --git a/account_financial_report_qweb/wizard/aged_partner_balance_wizard.py b/account_financial_report_qweb/wizard/aged_partner_balance_wizard.py index 934e66f1..665eb3c4 100644 --- a/account_financial_report_qweb/wizard/aged_partner_balance_wizard.py +++ b/account_financial_report_qweb/wizard/aged_partner_balance_wizard.py @@ -4,7 +4,6 @@ # Copyright 2016 Camptocamp SA, Onestein B.V. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from datetime import datetime from odoo import api, fields, models from odoo.tools.safe_eval import safe_eval @@ -21,7 +20,7 @@ class AgedPartnerBalance(models.TransientModel): string='Company' ) date_at = fields.Date(required=True, - default=fields.Date.to_string(datetime.today())) + default=fields.Date.context_today) target_move = fields.Selection([('posted', 'All Posted Entries'), ('all', 'All Entries')], string='Target Moves', @@ -54,27 +53,6 @@ class AgedPartnerBalance(models.TransientModel): else: self.account_ids = None - @api.model - def create(self, vals): - """ - This is a workaround for bug https://github.com/odoo/odoo/issues/14761 - This bug impacts M2M fields in wizards filled-up via onchange - It replaces the workaround widget="many2many_tags" on - field name="account_ids" which prevented from selecting several - accounts at the same time (quite useful when you want to select - an interval of accounts for example) - """ - if 'account_ids' in vals and isinstance(vals['account_ids'], list): - account_ids = [] - for account in vals['account_ids']: - if account[0] in (1, 4): - account_ids.append(account[1]) - elif account[0] == 6 and isinstance(account[2], list): - account_ids += account[2] - vals['account_ids'] = [(6, 0, account_ids)] - res = super(AgedPartnerBalance, self).create(vals) - return res - @api.multi def button_export_html(self): self.ensure_one() diff --git a/account_financial_report_qweb/wizard/aged_partner_balance_wizard_view.xml b/account_financial_report_qweb/wizard/aged_partner_balance_wizard_view.xml index b2584dcd..a767b256 100644 --- a/account_financial_report_qweb/wizard/aged_partner_balance_wizard_view.xml +++ b/account_financial_report_qweb/wizard/aged_partner_balance_wizard_view.xml @@ -19,15 +19,16 @@ -
diff --git a/account_financial_report_qweb/wizard/journal_report_wizard.py b/account_financial_report_qweb/wizard/journal_report_wizard.py index b07627e8..24a134da 100644 --- a/account_financial_report_qweb/wizard/journal_report_wizard.py +++ b/account_financial_report_qweb/wizard/journal_report_wizard.py @@ -36,7 +36,7 @@ class JournalReportWizard(models.TransientModel): comodel_name='account.journal', string="Journals", domain="[('company_id', '=', company_id)]", - required=True, + required=False, ) move_target = fields.Selection( selection='_get_move_targets', @@ -119,13 +119,18 @@ class JournalReportWizard(models.TransientModel): @api.multi def _prepare_report_journal(self): self.ensure_one() + journals = self.journal_ids + if not journals: + # Not selecting a journal means that we'll display all journals + journals = self.env['account.journal'].search( + [('company_id', '=', self.company_id.id)]) return { 'date_from': self.date_from, 'date_to': self.date_to, 'move_target': self.move_target, 'foreign_currency': self.foreign_currency, 'company_id': self.company_id.id, - 'journal_ids': [(6, 0, self.journal_ids.ids)], + 'journal_ids': [(6, 0, journals.ids)], 'sort_option': self.sort_option, 'group_option': self.group_option, 'with_account_name': self.with_account_name, diff --git a/account_financial_report_qweb/wizard/open_items_wizard.py b/account_financial_report_qweb/wizard/open_items_wizard.py index 84b35029..5e43f208 100644 --- a/account_financial_report_qweb/wizard/open_items_wizard.py +++ b/account_financial_report_qweb/wizard/open_items_wizard.py @@ -4,7 +4,6 @@ # Copyright 2016 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from datetime import datetime from odoo import models, fields, api from odoo.tools.safe_eval import safe_eval @@ -21,7 +20,7 @@ class OpenItemsReportWizard(models.TransientModel): string='Company' ) date_at = fields.Date(required=True, - default=fields.Date.to_string(datetime.today())) + default=fields.Date.context_today) target_move = fields.Selection([('posted', 'All Posted Entries'), ('all', 'All Entries')], string='Target Moves', @@ -32,7 +31,7 @@ class OpenItemsReportWizard(models.TransientModel): string='Filter accounts', domain=[('reconcile', '=', True)], ) - hide_account_balance_at_0 = fields.Boolean( + hide_account_at_0 = fields.Boolean( string='Hide account ending balance at 0', help='Use this filter to hide an account or a partner ' 'with an ending balance at 0. ' @@ -67,27 +66,6 @@ class OpenItemsReportWizard(models.TransientModel): else: self.account_ids = None - @api.model - def create(self, vals): - """ - This is a workaround for bug https://github.com/odoo/odoo/issues/14761 - This bug impacts M2M fields in wizards filled-up via onchange - It replaces the workaround widget="many2many_tags" on - field name="account_ids" which prevented from selecting several - accounts at the same time (quite useful when you want to select - an interval of accounts for example) - """ - if 'account_ids' in vals and isinstance(vals['account_ids'], list): - account_ids = [] - for account in vals['account_ids']: - if account[0] in (1, 4): - account_ids.append(account[1]) - elif account[0] == 6 and isinstance(account[2], list): - account_ids += account[2] - vals['account_ids'] = [(6, 0, account_ids)] - res = super(OpenItemsReportWizard, self).create(vals) - return res - @api.multi def button_export_html(self): self.ensure_one() @@ -122,7 +100,7 @@ class OpenItemsReportWizard(models.TransientModel): return { 'date_at': self.date_at, 'only_posted_moves': self.target_move == 'posted', - 'hide_account_balance_at_0': self.hide_account_balance_at_0, + 'hide_account_at_0': self.hide_account_at_0, 'foreign_currency': self.foreign_currency, 'company_id': self.company_id.id, 'filter_account_ids': [(6, 0, self.account_ids.ids)], diff --git a/account_financial_report_qweb/wizard/open_items_wizard_view.xml b/account_financial_report_qweb/wizard/open_items_wizard_view.xml index 7f7184e3..3e8c987a 100644 --- a/account_financial_report_qweb/wizard/open_items_wizard_view.xml +++ b/account_financial_report_qweb/wizard/open_items_wizard_view.xml @@ -16,19 +16,20 @@ - + -