Browse Source

[account_financial_report][IMP] Adds the following:

All reports:
- Rename field to hide accounts at 0 to 'hide_account_at_0'
Trial Balance:
- Add possibility to filter by hierarchy levels
- XLSX format will show the hierarchy levels in bold

General Ledger:
- Add the possibility to filter by analytic tags
- Fixes an error on the default date
Journal Ledger:
- The filter on Journals is now optional. If the user does not choose
a journal, by default it will display all journals.

Aged Partner Balance:
- Fixes an error on the default date
pull/559/head
Jordi Ballester Alomar 6 years ago
committed by Pedro M. Baeza
parent
commit
1e9346884e
  1. 3
      account_financial_report/__manifest__.py
  2. 23
      account_financial_report/report/abstract_report_xlsx.py
  3. 361
      account_financial_report/report/general_ledger.py
  4. 51
      account_financial_report/report/general_ledger_xlsx.py
  5. 4
      account_financial_report/report/open_items.py
  6. 2
      account_financial_report/report/open_items_xlsx.py
  7. 26
      account_financial_report/report/templates/general_ledger.xml
  8. 4
      account_financial_report/report/templates/open_items.xml
  9. 28
      account_financial_report/report/templates/trial_balance.xml
  10. 42
      account_financial_report/report/trial_balance.py
  11. 5
      account_financial_report/report/trial_balance_xlsx.py
  12. 41
      account_financial_report/tests/test_general_ledger.py
  13. 4
      account_financial_report/tests/test_open_items.py
  14. 20
      account_financial_report/tests/test_trial_balance.py
  15. 3
      account_financial_report/wizard/aged_partner_balance_wizard.py
  16. 13
      account_financial_report/wizard/general_ledger_wizard.py
  17. 27
      account_financial_report/wizard/general_ledger_wizard_view.xml
  18. 9
      account_financial_report/wizard/journal_ledger_wizard.py
  19. 9
      account_financial_report/wizard/open_items_wizard.py
  20. 2
      account_financial_report/wizard/open_items_wizard_view.xml
  21. 17
      account_financial_report/wizard/trial_balance_wizard.py
  22. 3
      account_financial_report/wizard/trial_balance_wizard_view.xml

3
account_financial_report/__manifest__.py

@ -4,12 +4,13 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{ {
'name': 'Account Financial Reports', 'name': 'Account Financial Reports',
'version': '11.0.2.2.2',
'version': '11.0.2.3.1',
'category': 'Reporting', 'category': 'Reporting',
'summary': 'OCA Financial Reports', 'summary': 'OCA Financial Reports',
'author': 'Camptocamp SA,' 'author': 'Camptocamp SA,'
'initOS GmbH,' 'initOS GmbH,'
'redCOR AG,' 'redCOR AG,'
'Eficent,'
'Odoo Community Association (OCA)', 'Odoo Community Association (OCA)',
"website": "https://odoo-community.org/", "website": "https://odoo-community.org/",
'depends': [ 'depends': [

23
account_financial_report/report/abstract_report_xlsx.py

@ -103,6 +103,9 @@ class AbstractReportXslx(models.AbstractModel):
self.format_amount = workbook.add_format() self.format_amount = workbook.add_format()
self.format_amount.set_num_format( self.format_amount.set_num_format(
'#,##0.'+'0'*currency_id.decimal_places) '#,##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( self.format_percent_bold_italic = workbook.add_format(
{'bold': True, 'italic': True} {'bold': True, 'italic': True}
) )
@ -190,10 +193,20 @@ class AbstractReportXslx(models.AbstractModel):
self.sheet.write_string( self.sheet.write_string(
self.row_pos, col_pos, value.name or '', self.format_right) self.row_pos, col_pos, value.name or '', self.format_right)
elif cell_type == 'string': elif cell_type == 'string':
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 '') self.sheet.write_string(self.row_pos, col_pos, value or '')
elif cell_type == 'amount': 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.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': elif cell_type == 'amount_currency':
if line_object.currency_id: if line_object.currency_id:
@ -291,10 +304,16 @@ class AbstractReportXslx(models.AbstractModel):
def _get_currency_amt_format(self, line_object): def _get_currency_amt_format(self, line_object):
""" Return amount format specific for each currency. """ """ Return amount format specific for each currency. """
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') format_amt = getattr(self, 'format_amount')
field_prefix = 'format_amount'
if line_object.currency_id: if line_object.currency_id:
field_name = \ field_name = \
'format_amount_%s' % line_object.currency_id.name
'%s_%s' % (field_prefix, line_object.currency_id.name)
if hasattr(self, field_name): if hasattr(self, field_name):
format_amt = getattr(self, field_name) format_amt = getattr(self, field_name)
else: else:

361
account_financial_report/report/general_ledger.py

@ -29,14 +29,18 @@ class GeneralLedgerReport(models.TransientModel):
date_to = fields.Date() date_to = fields.Date()
fy_start_date = fields.Date() fy_start_date = fields.Date()
only_posted_moves = fields.Boolean() only_posted_moves = fields.Boolean()
hide_account_balance_at_0 = fields.Boolean()
hide_account_at_0 = fields.Boolean()
foreign_currency = fields.Boolean() foreign_currency = fields.Boolean()
show_analytic_tags = fields.Boolean()
company_id = fields.Many2one(comodel_name='res.company') company_id = fields.Many2one(comodel_name='res.company')
filter_account_ids = fields.Many2many(comodel_name='account.account') filter_account_ids = fields.Many2many(comodel_name='account.account')
filter_partner_ids = fields.Many2many(comodel_name='res.partner') filter_partner_ids = fields.Many2many(comodel_name='res.partner')
filter_cost_center_ids = fields.Many2many( filter_cost_center_ids = fields.Many2many(
comodel_name='account.analytic.account' comodel_name='account.analytic.account'
) )
filter_analytic_tag_ids = fields.Many2many(
comodel_name='account.analytic.tag',
)
filter_journal_ids = fields.Many2many( filter_journal_ids = fields.Many2many(
comodel_name='account.journal', comodel_name='account.journal',
) )
@ -194,6 +198,7 @@ class GeneralLedgerReportMoveLine(models.TransientModel):
partner = fields.Char() partner = fields.Char()
label = fields.Char() label = fields.Char()
cost_center = fields.Char() cost_center = fields.Char()
tags = fields.Char()
matching_number = fields.Char() matching_number = fields.Char()
debit = fields.Float(digits=(16, 2)) debit = fields.Float(digits=(16, 2))
credit = fields.Float(digits=(16, 2)) credit = fields.Float(digits=(16, 2))
@ -278,6 +283,10 @@ class GeneralLedgerReportCompute(models.TransientModel):
if self.centralize: if self.centralize:
self._inject_line_centralized_values() self._inject_line_centralized_values()
if self.show_analytic_tags:
# Compute analytic tags
self._compute_analytic_tags()
# Refresh cache because all data are computed with SQL requests # Refresh cache because all data are computed with SQL requests
self.invalidate_cache() self.invalidate_cache()
@ -336,6 +345,11 @@ class GeneralLedgerReportCompute(models.TransientModel):
ml.analytic_account_id = aa.id ml.analytic_account_id = aa.id
AND aa.id IN %s AND aa.id IN %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 += """ sub_subquery_sum_amounts += """
LEFT JOIN LEFT JOIN
res_currency c ON a.currency_id = c.id res_currency c ON a.currency_id = c.id
@ -392,7 +406,11 @@ WITH
FROM FROM
account_account a account_account a
""" """
if self.filter_partner_ids or self.filter_cost_center_ids:
if (
self.filter_partner_ids or
self.filter_cost_center_ids or
self.filter_analytic_tag_ids
):
query_inject_account += """ query_inject_account += """
INNER JOIN INNER JOIN
account_move_line ml ON a.id = ml.account_id account_move_line ml ON a.id = ml.account_id
@ -410,6 +428,17 @@ WITH
ml.analytic_account_id = aa.id ml.analytic_account_id = aa.id
AND aa.id IN %s AND aa.id IN %s
""" """
if self.filter_analytic_tag_ids:
query_inject_account += """
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
AND aat.id IN %s
"""
query_inject_account += """ query_inject_account += """
WHERE WHERE
a.company_id = %s a.company_id = %s
@ -425,11 +454,40 @@ WITH
AND AND
p.id IN %s p.id IN %s
""" """
if self.filter_partner_ids or self.filter_cost_center_ids:
if (
self.filter_partner_ids or
self.filter_cost_center_ids or
self.filter_analytic_tag_ids
):
query_inject_account += """ query_inject_account += """
GROUP BY GROUP BY
a.id a.id
""" """
query_inject_account += """
),
"""
if self.filter_analytic_tag_ids:
query_inject_account += """
move_lines_on_tags AS
(
SELECT
DISTINCT ml.id AS ml_id
FROM
accounts 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 %s
),
"""
init_subquery = self._get_final_account_sub_subquery_sum_amounts( init_subquery = self._get_final_account_sub_subquery_sum_amounts(
date_included=False date_included=False
@ -439,7 +497,6 @@ WITH
) )
query_inject_account += """ query_inject_account += """
),
initial_sum_amounts AS ( """ + init_subquery + """ ), initial_sum_amounts AS ( """ + init_subquery + """ ),
final_sum_amounts AS ( """ + final_subquery + """ ) final_sum_amounts AS ( """ + final_subquery + """ )
INSERT INTO INSERT INTO
@ -497,7 +554,7 @@ WHERE
OR f.balance IS NOT NULL AND f.balance != 0 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 += """ query_inject_account += """
AND AND
f.balance IS NOT NULL AND f.balance != 0 f.balance IS NOT NULL AND f.balance != 0
@ -507,6 +564,10 @@ AND
query_inject_account_params += ( query_inject_account_params += (
tuple(self.filter_cost_center_ids.ids), tuple(self.filter_cost_center_ids.ids),
) )
if self.filter_analytic_tag_ids:
query_inject_account_params += (
tuple(self.filter_analytic_tag_ids.ids),
)
query_inject_account_params += ( query_inject_account_params += (
self.company_id.id, self.company_id.id,
self.unaffected_earnings_account.id, self.unaffected_earnings_account.id,
@ -519,6 +580,10 @@ AND
query_inject_account_params += ( query_inject_account_params += (
tuple(self.filter_partner_ids.ids), tuple(self.filter_partner_ids.ids),
) )
if self.filter_analytic_tag_ids:
query_inject_account_params += (
tuple(self.filter_analytic_tag_ids.ids),
)
query_inject_account_params += ( query_inject_account_params += (
self.date_from, self.date_from,
self.fy_start_date, self.fy_start_date,
@ -619,6 +684,11 @@ AND
ml.analytic_account_id = aa.id ml.analytic_account_id = aa.id
AND aa.id IN %s AND aa.id IN %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 += """ sub_subquery_sum_amounts += """
GROUP BY GROUP BY
ap.account_id, ap.partner_id, c.id ap.account_id, ap.partner_id, c.id
@ -706,6 +776,17 @@ WITH
ml.analytic_account_id = aa.id ml.analytic_account_id = aa.id
AND aa.id IN %s AND aa.id IN %s
""" """
if self.filter_analytic_tag_ids:
query_inject_partner += """
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
AND aat.id IN %s
"""
query_inject_partner += """ query_inject_partner += """
WHERE WHERE
ra.report_id = %s ra.report_id = %s
@ -750,6 +831,31 @@ WITH
p.id, p.id,
at.include_initial_balance at.include_initial_balance
), ),
"""
if self.filter_analytic_tag_ids:
query_inject_partner += """
move_lines_on_tags AS
(
SELECT
DISTINCT ml.id AS ml_id
FROM
accounts_partners ap
INNER JOIN
account_move_line ml
ON ap.account_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 %s
),
"""
query_inject_partner += """
initial_sum_amounts AS ( """ + init_subquery + """ ), initial_sum_amounts AS ( """ + init_subquery + """ ),
final_sum_amounts AS ( """ + final_subquery + """ ) final_sum_amounts AS ( """ + final_subquery + """ )
INSERT INTO INSERT INTO
@ -829,7 +935,7 @@ WHERE
OR f.balance IS NOT NULL AND f.balance != 0 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 += """ query_inject_partner += """
AND AND
f.balance IS NOT NULL AND f.balance != 0 f.balance IS NOT NULL AND f.balance != 0
@ -839,6 +945,10 @@ AND
query_inject_partner_params += ( query_inject_partner_params += (
tuple(self.filter_cost_center_ids.ids), tuple(self.filter_cost_center_ids.ids),
) )
if self.filter_analytic_tag_ids:
query_inject_partner_params += (
tuple(self.filter_analytic_tag_ids.ids),
)
query_inject_partner_params += ( query_inject_partner_params += (
self.id, self.id,
) )
@ -846,6 +956,10 @@ AND
query_inject_partner_params += ( query_inject_partner_params += (
tuple(self.filter_partner_ids.ids), tuple(self.filter_partner_ids.ids),
) )
if self.filter_analytic_tag_ids:
query_inject_partner_params += (
tuple(self.filter_analytic_tag_ids.ids),
)
query_inject_partner_params += ( query_inject_partner_params += (
self.date_from, self.date_from,
self.fy_start_date, self.fy_start_date,
@ -898,7 +1012,45 @@ AND
The "only_empty_partner_line" value is used The "only_empty_partner_line" value is used
to compute data without partner. to compute data without partner.
""" """
query_inject_move_line = """
query_inject_move_line = ""
if self.filter_analytic_tag_ids:
query_inject_move_line += """
WITH
move_lines_on_tags AS
(
SELECT
DISTINCT ml.id AS ml_id
FROM
"""
if is_account_line:
query_inject_move_line += """
report_general_ledger_account ra
"""
elif is_partner_line:
query_inject_move_line += """
report_general_ledger_partner rp
INNER JOIN
report_general_ledger_account ra
ON rp.report_account_id = ra.id
"""
query_inject_move_line += """
INNER JOIN
account_move_line ml
ON ra.account_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
ra.report_id = %s
AND
aat.id IN %s
)
"""
query_inject_move_line += """
INSERT INTO INSERT INTO
report_general_ledger_move_line report_general_ledger_move_line
( (
@ -1072,6 +1224,11 @@ INNER JOIN
LEFT JOIN LEFT JOIN
account_analytic_account aa ON ml.analytic_account_id = aa.id account_analytic_account aa ON ml.analytic_account_id = aa.id
""" """
if self.filter_analytic_tag_ids:
query_inject_move_line += """
INNER JOIN
move_lines_on_tags ON ml.id = move_lines_on_tags.ml_id
"""
query_inject_move_line += """ query_inject_move_line += """
WHERE WHERE
ra.report_id = %s ra.report_id = %s
@ -1132,7 +1289,13 @@ ORDER BY
a.code, ml.date, ml.id a.code, ml.date, ml.id
""" """
query_inject_move_line_params = (
query_inject_move_line_params = ()
if self.filter_analytic_tag_ids:
query_inject_move_line_params += (
self.id,
tuple(self.filter_analytic_tag_ids.ids),
)
query_inject_move_line_params += (
self.env.uid, self.env.uid,
) )
if self.filter_cost_center_ids: if self.filter_cost_center_ids:
@ -1164,8 +1327,36 @@ ORDER BY
Only centralized accounts are computed. Only centralized accounts are computed.
""" """
if self.filter_analytic_tag_ids:
query_inject_move_line_centralized = """ query_inject_move_line_centralized = """
WITH WITH
move_lines_on_tags AS
(
SELECT
DISTINCT ml.id AS ml_id
FROM
report_general_ledger_account ra
INNER JOIN
account_move_line ml
ON ra.account_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
ra.report_id = %s
AND
aat.id IN %s
),
"""
else:
query_inject_move_line_centralized = """
WITH
"""
query_inject_move_line_centralized += """
move_lines AS move_lines AS
( (
SELECT SELECT
@ -1196,6 +1387,11 @@ WITH
ml.analytic_account_id = aa.id ml.analytic_account_id = aa.id
AND aa.id IN %s AND aa.id IN %s
""" """
if self.filter_analytic_tag_ids:
query_inject_move_line_centralized += """
INNER JOIN
move_lines_on_tags ON ml.id = move_lines_on_tags.ml_id
"""
query_inject_move_line_centralized += """ query_inject_move_line_centralized += """
WHERE WHERE
ra.report_id = %s ra.report_id = %s
@ -1267,6 +1463,11 @@ ORDER BY
""" """
query_inject_move_line_centralized_params = () query_inject_move_line_centralized_params = ()
if self.filter_analytic_tag_ids:
query_inject_move_line_centralized_params += (
self.id,
tuple(self.filter_analytic_tag_ids.ids),
)
if self.filter_cost_center_ids: if self.filter_cost_center_ids:
query_inject_move_line_centralized_params += ( query_inject_move_line_centralized_params += (
tuple(self.filter_cost_center_ids.ids), tuple(self.filter_cost_center_ids.ids),
@ -1287,6 +1488,76 @@ ORDER BY
query_inject_move_line_centralized_params query_inject_move_line_centralized_params
) )
def _compute_analytic_tags(self):
""" Compute "tags" column"""
query_update_analytic_tags = """
UPDATE
report_general_ledger_move_line
SET
tags = tags_values.tags
FROM
(
(
SELECT
rml.id AS report_id,
array_to_string(array_agg(t.name ORDER BY t.name), ',') AS tags
FROM
account_move_line ml
INNER JOIN
report_general_ledger_move_line rml
ON ml.id = rml.move_line_id
INNER JOIN
report_general_ledger_account ra
ON rml.report_account_id = ra.id
INNER JOIN
account_analytic_tag_account_move_line_rel tml
ON ml.id = tml.account_move_line_id
INNER JOIN
account_analytic_tag t
ON tml.account_analytic_tag_id = t.id
WHERE
ra.report_id = %(report_id)s
GROUP BY
rml.id,
ml.id
)
UNION
(
SELECT
rml.id AS report_id,
array_to_string(array_agg(t.name ORDER BY t.name), ',') AS tags
FROM
account_move_line ml
INNER JOIN
report_general_ledger_move_line rml
ON ml.id = rml.move_line_id
INNER JOIN
report_general_ledger_partner rp
ON rml.report_partner_id = rp.id
INNER JOIN
report_general_ledger_account ra
ON rp.report_account_id = ra.id
INNER JOIN
account_analytic_tag_account_move_line_rel tml
ON ml.id = tml.account_move_line_id
INNER JOIN
account_analytic_tag t
ON tml.account_analytic_tag_id = t.id
WHERE
ra.report_id = %(report_id)s
GROUP BY
rml.id,
ml.id
)
) AS tags_values
WHERE
report_general_ledger_move_line.id = tags_values.report_id
"""
params = {
'report_id': self.id,
}
self.env.cr.execute(query_update_analytic_tags, params)
def _inject_unaffected_earnings_account_values(self): def _inject_unaffected_earnings_account_values(self):
"""Inject the report values of the unaffected earnings account """Inject the report values of the unaffected earnings account
for report_general_ledger_account.""" for report_general_ledger_account."""
@ -1310,12 +1581,39 @@ ORDER BY
'date_to': fy_start_date, 'date_to': fy_start_date,
'company_id': self.company_id.id, 'company_id': self.company_id.id,
'account_ids': tuple(unaffected_earnings_account_ids), 'account_ids': tuple(unaffected_earnings_account_ids),
'analytic_tag_ids': tuple(self.filter_analytic_tag_ids.ids),
} }
query_select_previous_fy_unaffected_earnings = """
SELECT sum(aml.balance) as balance
FROM account_move_line as aml
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
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_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 INNER JOIN account_move as am
ON am.id = aml.move_id
ON am.id = ml.move_id
INNER JOIN account_journal j INNER JOIN account_journal j
ON am.journal_id = j.id ON am.journal_id = j.id
""" """
@ -1327,11 +1625,15 @@ ORDER BY
""" """
query_select_previous_fy_unaffected_earnings_params[ query_select_previous_fy_unaffected_earnings_params[
'cost_center_ids'] = tuple(self.filter_cost_center_ids.ids) 'cost_center_ids'] = tuple(self.filter_cost_center_ids.ids)
if self.filter_analytic_tag_ids:
query_select_previous_fy_unaffected_earnings += """ query_select_previous_fy_unaffected_earnings += """
WHERE aml.date < %(date_to)s
AND aml.company_id = %(company_id)s
AND aml.account_id IN %(account_ids)s
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: if self.filter_journal_ids:
query_select_previous_fy_unaffected_earnings += """ query_select_previous_fy_unaffected_earnings += """
@ -1355,15 +1657,19 @@ ORDER BY
'date_to': self.date_to, 'date_to': self.date_to,
'company_id': self.company_id.id, 'company_id': self.company_id.id,
'unaffected_earnings_id': self.unaffected_earnings_account.id, 'unaffected_earnings_id': self.unaffected_earnings_account.id,
'analytic_tag_ids': tuple(self.filter_analytic_tag_ids.ids),
} }
query_select_period_unaffected_earnings = """
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 SELECT
sum(aml.debit) as sum_debit,
sum(aml.credit) as sum_credit,
sum(aml.balance) as balance
FROM account_move_line as aml
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 INNER JOIN account_move as am
ON am.id = aml.move_id
ON am.id = ml.move_id
INNER JOIN account_journal j INNER JOIN account_journal j
ON am.journal_id = j.id ON am.journal_id = j.id
""" """
@ -1375,11 +1681,16 @@ ORDER BY
""" """
query_select_period_unaffected_earnings_params[ query_select_period_unaffected_earnings_params[
'cost_center_ids'] = tuple(self.filter_cost_center_ids.ids) '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 += """ query_select_period_unaffected_earnings += """
WHERE am.date >= %(date_from)s WHERE am.date >= %(date_from)s
AND aml.date <= %(date_to)s
AND aml.company_id = %(company_id)s
AND aml.account_id = %(unaffected_earnings_id)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: if self.filter_journal_ids:
query_select_period_unaffected_earnings += """ query_select_period_unaffected_earnings += """

51
account_financial_report/report/general_ledger_xlsx.py

@ -28,20 +28,23 @@ class GeneralLedgerXslx(models.AbstractModel):
7: {'header': _('Cost center'), 7: {'header': _('Cost center'),
'field': 'cost_center', 'field': 'cost_center',
'width': 15}, 'width': 15},
8: {'header': _('Rec.'), 'field': 'matching_number', 'width': 5},
9: {'header': _('Debit'),
8: {'header': _('Tags'),
'field': 'tags',
'width': 10},
9: {'header': _('Rec.'), 'field': 'matching_number', 'width': 5},
10: {'header': _('Debit'),
'field': 'debit', 'field': 'debit',
'field_initial_balance': 'initial_debit', 'field_initial_balance': 'initial_debit',
'field_final_balance': 'final_debit', 'field_final_balance': 'final_debit',
'type': 'amount', 'type': 'amount',
'width': 14}, 'width': 14},
10: {'header': _('Credit'),
11: {'header': _('Credit'),
'field': 'credit', 'field': 'credit',
'field_initial_balance': 'initial_credit', 'field_initial_balance': 'initial_credit',
'field_final_balance': 'final_credit', 'field_final_balance': 'final_credit',
'type': 'amount', 'type': 'amount',
'width': 14}, 'width': 14},
11: {'header': _('Cumul. Bal.'),
12: {'header': _('Cumul. Bal.'),
'field': 'cumul_balance', 'field': 'cumul_balance',
'field_initial_balance': 'initial_balance', 'field_initial_balance': 'initial_balance',
'field_final_balance': 'final_balance', 'field_final_balance': 'final_balance',
@ -50,11 +53,11 @@ class GeneralLedgerXslx(models.AbstractModel):
} }
if report.foreign_currency: if report.foreign_currency:
foreign_currency = { foreign_currency = {
12: {'header': _('Cur.'),
13: {'header': _('Cur.'),
'field': 'currency_id', 'field': 'currency_id',
'field_currency_balance': 'currency_id', 'field_currency_balance': 'currency_id',
'type': 'many2one', 'width': 7}, 'type': 'many2one', 'width': 7},
13: {'header': _('Amount cur.'),
14: {'header': _('Amount cur.'),
'field': 'amount_currency', 'field': 'amount_currency',
'field_initial_balance': 'field_initial_balance':
'initial_balance_foreign_currency', 'initial_balance_foreign_currency',
@ -68,17 +71,31 @@ class GeneralLedgerXslx(models.AbstractModel):
def _get_report_filters(self, report): def _get_report_filters(self, report):
return [ return [
[_('Date range filter'),
_('From: %s To: %s') % (report.date_from, report.date_to)],
[_('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')],
[_('Centralize filter'),
_('Yes') if report.centralize else _('No')],
[_('Show foreign currency'),
_('Yes') if report.foreign_currency else _('No')],
[
_('Date range filter'),
_('From: %s To: %s') % (report.date_from, report.date_to),
],
[
_('Target moves filter'),
_('All posted entries') if report.only_posted_moves
else _('All entries'),
],
[
_('Account balance at 0 filter'),
_('Hide') if report.hide_account_at_0 else _('Show'),
],
[
_('Centralize filter'),
_('Yes') if report.centralize else _('No'),
],
[
_('Show analytic tags'),
_('Yes') if report.show_analytic_tags else _('No'),
],
[
_('Show foreign currency'),
_('Yes') if report.foreign_currency else _('No')
],
] ]
def _get_col_count_filter_name(self): def _get_col_count_filter_name(self):

4
account_financial_report/report/open_items.py

@ -22,7 +22,7 @@ class OpenItemsReport(models.TransientModel):
# Filters fields, used for data computation # Filters fields, used for data computation
date_at = fields.Date() date_at = fields.Date()
only_posted_moves = fields.Boolean() only_posted_moves = fields.Boolean()
hide_account_balance_at_0 = fields.Boolean()
hide_account_at_0 = fields.Boolean()
foreign_currency = fields.Boolean() foreign_currency = fields.Boolean()
company_id = fields.Many2one(comodel_name='res.company') company_id = fields.Many2one(comodel_name='res.company')
filter_account_ids = fields.Many2many(comodel_name='account.account') 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._inject_line_values(only_empty_partner_line=True)
self._clean_partners_and_accounts() self._clean_partners_and_accounts()
self._compute_partners_and_accounts_cumul() self._compute_partners_and_accounts_cumul()
if self.hide_account_balance_at_0:
if self.hide_account_at_0:
self._clean_partners_and_accounts( self._clean_partners_and_accounts(
only_delete_account_balance_at_0=True only_delete_account_balance_at_0=True
) )

2
account_financial_report/report/open_items_xlsx.py

@ -59,7 +59,7 @@ class OpenItemsXslx(models.AbstractModel):
_('All posted entries') if report.only_posted_moves else _( _('All posted entries') if report.only_posted_moves else _(
'All entries')], 'All entries')],
[_('Account balance at 0 filter'), [_('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'), [_('Show foreign currency'),
_('Yes') if report.foreign_currency else _('No')], _('Yes') if report.foreign_currency else _('No')],
] ]

26
account_financial_report/report/templates/general_ledger.xml

@ -13,6 +13,7 @@
<template id="report_general_ledger_base"> <template id="report_general_ledger_base">
<!-- Saved flag fields into variables, used to define columns display --> <!-- Saved flag fields into variables, used to define columns display -->
<t t-set="show_analytic_tags" t-value="o.show_analytic_tags"/>
<t t-set="show_cost_center" t-value="o.show_cost_center"/> <t t-set="show_cost_center" t-value="o.show_cost_center"/>
<t t-set="foreign_currency" t-value="o.foreign_currency"/> <t t-set="foreign_currency" t-value="o.foreign_currency"/>
<!-- Defines global variables used by internal layout --> <!-- Defines global variables used by internal layout -->
@ -81,6 +82,7 @@
<div class="act_as_cell">Target moves filter</div> <div class="act_as_cell">Target moves filter</div>
<div class="act_as_cell">Account balance at 0 filter</div> <div class="act_as_cell">Account balance at 0 filter</div>
<div class="act_as_cell">Centralize filter</div> <div class="act_as_cell">Centralize filter</div>
<div class="act_as_cell">Show analytic tags</div>
</div> </div>
<div class="act_as_row"> <div class="act_as_row">
<div class="act_as_cell"> <div class="act_as_cell">
@ -91,13 +93,17 @@
<t t-if="not o.only_posted_moves">All entries</t> <t t-if="not o.only_posted_moves">All entries</t>
</div> </div>
<div class="act_as_cell"> <div class="act_as_cell">
<t t-if="o.hide_account_balance_at_0">Hide</t>
<t t-if="not o.hide_account_balance_at_0">Show</t>
<t t-if="o.hide_account_at_0">Hide</t>
<t t-if="not o.hide_account_at_0">Show</t>
</div> </div>
<div class="act_as_cell"> <div class="act_as_cell">
<t t-if="o.centralize">Yes</t> <t t-if="o.centralize">Yes</t>
<t t-if="not o.centralize">No</t> <t t-if="not o.centralize">No</t>
</div> </div>
<div class="act_as_cell">
<t t-if="o.show_analytic_tags">Yes</t>
<t t-if="not o.show_analytic_tags">No</t>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -130,6 +136,10 @@
<div class="act_as_cell" style="width: 8.03%;">Cost <div class="act_as_cell" style="width: 8.03%;">Cost
center</div> center</div>
</t> </t>
<t t-if="show_analytic_tags">
<!--## analytic tags-->
<div class="act_as_cell" style="width: 4.75%;">Tags</div>
</t>
<!--## matching_number--> <!--## matching_number-->
<div class="act_as_cell" style="width: 2.41%;">Rec.</div> <div class="act_as_cell" style="width: 2.41%;">Rec.</div>
<!--## debit--> <!--## debit-->
@ -167,6 +177,10 @@
<!--## cost_center--> <!--## cost_center-->
<div class="act_as_cell"/> <div class="act_as_cell"/>
</t> </t>
<t t-if="show_analytic_tags">
<!--## analytic tags-->
<div class="act_as_cell"></div>
</t>
<!--## matching_number--> <!--## matching_number-->
<div class="act_as_cell"/> <div class="act_as_cell"/>
<!--## debit--> <!--## debit-->
@ -381,6 +395,10 @@
</span> </span>
</div> </div>
</t> </t>
<t t-if="show_analytic_tags">
<!--## analytic tags-->
<div class="act_as_cell left"><span t-field="line.tags"/></div>
</t>
<!--## matching_number--> <!--## matching_number-->
<div class="act_as_cell"> <div class="act_as_cell">
<t t-set="res_model" t-value="'account.full.reconcile'"/> <t t-set="res_model" t-value="'account.full.reconcile'"/>
@ -475,6 +493,10 @@
<!--## cost_center--> <!--## cost_center-->
<div class="act_as_cell" style="width: 8.03%"/> <div class="act_as_cell" style="width: 8.03%"/>
</t> </t>
<t t-if="show_analytic_tags">
<!--## analytic tags-->
<div class="act_as_cell" style="width: 4.75%;"></div>
</t>
<!--## matching_number--> <!--## matching_number-->
<div class="act_as_cell" style="width: 2.41%;"/> <div class="act_as_cell" style="width: 2.41%;"/>
<!--## debit--> <!--## debit-->

4
account_financial_report/report/templates/open_items.xml

@ -80,8 +80,8 @@
<t t-if="not o.only_posted_moves">All entries</t> <t t-if="not o.only_posted_moves">All entries</t>
</div> </div>
<div class="act_as_cell"> <div class="act_as_cell">
<t t-if="o.hide_account_balance_at_0">Hide</t>
<t t-if="not o.hide_account_balance_at_0">Show</t>
<t t-if="o.hide_account_at_0">Hide</t>
<t t-if="not o.hide_account_at_0">Show</t>
</div> </div>
</div> </div>
</div> </div>

28
account_financial_report/report/templates/trial_balance.xml

@ -18,6 +18,8 @@
<!-- Defines global variables used by internal layout --> <!-- Defines global variables used by internal layout -->
<t t-set="title">Trial Balance</t> <t t-set="title">Trial Balance</t>
<t t-set="company_name" t-value="o.company_id.name"/> <t t-set="company_name" t-value="o.company_id.name"/>
<t t-set="res_company" t-value="o.company_id"/>
<div class="page"> <div class="page">
<!-- Display filters --> <!-- Display filters -->
<t t-call="account_financial_report.report_trial_balance_filters"/> <t t-call="account_financial_report.report_trial_balance_filters"/>
@ -30,7 +32,7 @@
<t t-call="account_financial_report.report_trial_balance_lines_header"/> <t t-call="account_financial_report.report_trial_balance_lines_header"/>
<!-- Display each lines --> <!-- Display each lines -->
<t t-foreach="o.account_ids" t-as="line">
<t t-foreach="o.account_ids.filtered(lambda a: not a.hide_line)" t-as="line">
<t t-set="type" t-value='"account_type"'/> <t t-set="type" t-value='"account_type"'/>
<!-- Adapt --> <!-- Adapt -->
<t t-set="style" t-value="'font-size:8px;'"/> <t t-set="style" t-value="'font-size:8px;'"/>
@ -38,7 +40,7 @@
<t t-if="o.hide_account_at_0"> <t t-if="o.hide_account_at_0">
<t t-set="style" t-value="'font-size: 14px;'"/> <t t-set="style" t-value="'font-size: 14px;'"/>
</t> </t>
<t t-if="not o.hide_account_at_0">
<t t-if="o.hierarchy_on != 'none'">
<t t-set="style" t-value="'font-size: ' + str(14 - line.level) + 'px; margin-left: ' + str(line.level * 4) + 'px;'"/> <t t-set="style" t-value="'font-size: ' + str(14 - line.level) + 'px; margin-left: ' + str(line.level * 4) + 'px;'"/>
</t> </t>
<t t-if="line.account_group_id"> <t t-if="line.account_group_id">
@ -107,6 +109,7 @@
<div class="act_as_cell">Date range filter</div> <div class="act_as_cell">Date range filter</div>
<div class="act_as_cell">Target moves filter</div> <div class="act_as_cell">Target moves filter</div>
<div class="act_as_cell">Account balance at 0 filter</div> <div class="act_as_cell">Account balance at 0 filter</div>
<div class="act_as_cell">Limit hierarchy levels</div>
</div> </div>
<div class="act_as_row"> <div class="act_as_row">
<div class="act_as_cell"> <div class="act_as_cell">
@ -120,6 +123,14 @@
<t t-if="o.hide_account_at_0">Hide</t> <t t-if="o.hide_account_at_0">Hide</t>
<t t-if="not o.hide_account_at_0">Show</t> <t t-if="not o.hide_account_at_0">Show</t>
</div> </div>
<div class="act_as_cell">
<t t-if="o.limit_hierarchy_level">
Level <span t-field="o.show_hierarchy_level"/>
</t>
<t t-if="not o.limit_hierarchy_level">
No limit
</t>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -381,6 +392,19 @@
<t t-att-style="style" t-raw="line.period_balance" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></a> <t t-att-style="style" t-raw="line.period_balance" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></a>
</span> </span>
</t> </t>
<t t-if="line.account_group_id">
<t t-set="domain"
t-value="[('account_id', 'in', line.compute_account_ids.ids),
('date', '&gt;=', line.report_id.date_from),
('date', '&lt;=', line.report_id.date_to)]"/>
<span>
<a t-att-data-domain="domain"
t-att-data-res-model="'account.move.line'"
class="o_account_financial_reports_web_action_multi"
t-att-style="style">
<t t-att-style="style" t-raw="line.period_balance" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></a>
</span>
</t>
</t> </t>
<t t-if="type == 'partner_type'"> <t t-if="type == 'partner_type'">
<t t-set="domain" <t t-set="domain"

42
account_financial_report/report/trial_balance.py

@ -44,7 +44,9 @@ class TrialBalanceReport(models.TransientModel):
No hierarchy: Use to display just the accounts, without any grouping. No hierarchy: Use to display just the accounts, without any grouping.
""", """,
) )
limit_hierarchy_level = fields.Boolean('Limit hierarchy levels')
show_hierarchy_level = fields.Integer('Hierarchy Levels to display',
default=1)
# General Ledger Report Data fields, # General Ledger Report Data fields,
# used as base for compute the data reports # used as base for compute the data reports
general_ledger_id = fields.Many2one( general_ledger_id = fields.Many2one(
@ -68,10 +70,10 @@ class TrialBalanceReportAccount(models.TransientModel):
ondelete='cascade', ondelete='cascade',
index=True index=True
) )
hide_line = fields.Boolean(compute='_compute_hide_line')
# Data fields, used to keep link with real object # Data fields, used to keep link with real object
sequence = fields.Integer(index=True, default=0)
level = fields.Integer(index=True, default=0)
sequence = fields.Integer(index=True, default=1)
level = fields.Integer(index=True, default=1)
# Data fields, used to keep link with real object # Data fields, used to keep link with real object
account_id = fields.Many2one( account_id = fields.Many2one(
@ -112,6 +114,21 @@ class TrialBalanceReportAccount(models.TransientModel):
inverse_name='report_account_id' inverse_name='report_account_id'
) )
@api.multi
def _compute_hide_line(self):
for rec in self:
report = rec.report_id
rec.hide_line = False
if report.hide_account_at_0 and (
not rec.initial_balance and
not rec.final_balance and
not rec.debit and
not rec.credit):
rec.hide_line = True
elif report.limit_hierarchy_level and \
rec.level > report.show_hierarchy_level:
rec.hide_line = True
class TrialBalanceReportPartner(models.TransientModel): class TrialBalanceReportPartner(models.TransientModel):
_name = 'report_trial_balance_partner' _name = 'report_trial_balance_partner'
@ -243,15 +260,6 @@ class TrialBalanceReportCompute(models.TransientModel):
else: else:
for line in self.account_ids: for line in self.account_ids:
line.write({'level': 0}) line.write({'level': 0})
if self.hide_account_at_0:
self.env.cr.execute("""
DELETE FROM report_trial_balance_account
WHERE report_id=%s
AND (initial_balance IS NULL OR initial_balance = 0)
AND (debit IS NULL OR debit = 0)
AND (credit IS NULL OR credit = 0)
AND (final_balance IS NULL OR final_balance = 0)
""", [self.id])
def _inject_account_values(self, account_ids): def _inject_account_values(self, account_ids):
"""Inject report values for report_trial_balance_account""" """Inject report values for report_trial_balance_account"""
@ -398,7 +406,7 @@ FROM
WITH computed AS (WITH RECURSIVE cte AS ( WITH computed AS (WITH RECURSIVE cte AS (
SELECT account_group_id, code, account_group_id AS parent_id, SELECT account_group_id, code, account_group_id AS parent_id,
initial_balance, initial_balance_foreign_currency, debit, credit, initial_balance, initial_balance_foreign_currency, debit, credit,
final_balance, final_balance_foreign_currency
period_balance, final_balance, final_balance_foreign_currency
FROM report_trial_balance_account FROM report_trial_balance_account
WHERE report_id = %s WHERE report_id = %s
GROUP BY report_trial_balance_account.id GROUP BY report_trial_balance_account.id
@ -406,7 +414,7 @@ WITH computed AS (WITH RECURSIVE cte AS (
UNION ALL UNION ALL
SELECT c.account_group_id, c.code, p.account_group_id, SELECT c.account_group_id, c.code, p.account_group_id,
p.initial_balance, p.initial_balance_foreign_currency, p.debit, p.credit, p.initial_balance, p.initial_balance_foreign_currency, p.debit, p.credit,
p.final_balance, p.final_balance_foreign_currency
p.period_balance, p.final_balance, p.final_balance_foreign_currency
FROM cte c FROM cte c
JOIN report_trial_balance_account p USING (parent_id) JOIN report_trial_balance_account p USING (parent_id)
WHERE p.report_id = %s WHERE p.report_id = %s
@ -416,6 +424,7 @@ SELECT account_group_id, code,
sum(initial_balance_foreign_currency) AS initial_balance_foreign_currency, sum(initial_balance_foreign_currency) AS initial_balance_foreign_currency,
sum(debit) AS debit, sum(debit) AS debit,
sum(credit) AS credit, sum(credit) AS credit,
sum(debit) - sum(credit) AS period_balance,
sum(final_balance) AS final_balance, sum(final_balance) AS final_balance,
sum(final_balance_foreign_currency) AS final_balance_foreign_currency sum(final_balance_foreign_currency) AS final_balance_foreign_currency
FROM cte FROM cte
@ -428,6 +437,7 @@ SET initial_balance = computed.initial_balance,
computed.initial_balance_foreign_currency, computed.initial_balance_foreign_currency,
debit = computed.debit, debit = computed.debit,
credit = computed.credit, credit = computed.credit,
period_balance = computed.period_balance,
final_balance = computed.final_balance, final_balance = computed.final_balance,
final_balance_foreign_currency = final_balance_foreign_currency =
computed.final_balance_foreign_currency computed.final_balance_foreign_currency
@ -491,6 +501,7 @@ WITH RECURSIVE accgroup AS
as initial_balance_foreign_currency, as initial_balance_foreign_currency,
sum(coalesce(ra.debit, 0)) as debit, sum(coalesce(ra.debit, 0)) as debit,
sum(coalesce(ra.credit, 0)) as credit, 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, 0)) as final_balance,
sum(coalesce(ra.final_balance_foreign_currency, 0)) sum(coalesce(ra.final_balance_foreign_currency, 0))
as final_balance_foreign_currency as final_balance_foreign_currency
@ -509,6 +520,7 @@ SET initial_balance = accgroup.initial_balance,
accgroup.initial_balance_foreign_currency, accgroup.initial_balance_foreign_currency,
debit = accgroup.debit, debit = accgroup.debit,
credit = accgroup.credit, credit = accgroup.credit,
period_balance = accgroup.period_balance,
final_balance = accgroup.final_balance, final_balance = accgroup.final_balance,
final_balance_foreign_currency = final_balance_foreign_currency =
accgroup.final_balance_foreign_currency accgroup.final_balance_foreign_currency

5
account_financial_report/report/trial_balance_xlsx.py

@ -109,6 +109,9 @@ class TrialBalanceXslx(models.AbstractModel):
_('Hide') if report.hide_account_at_0 else _('Show')], _('Hide') if report.hide_account_at_0 else _('Show')],
[_('Show foreign currency'), [_('Show foreign currency'),
_('Yes') if report.foreign_currency else _('No')], _('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): def _get_col_count_filter_name(self):
@ -124,7 +127,7 @@ class TrialBalanceXslx(models.AbstractModel):
self.write_array_header() self.write_array_header()
# For each account # 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: if not report.show_partner_details:
# Display account lines # Display account lines
self.write_line(account, 'account') self.write_line(account, 'account')

41
account_financial_report/tests/test_general_ledger.py

@ -39,19 +39,48 @@ class TestGeneralLedger(a_t_f_c.AbstractTestForeignCurrency):
} }
def _getAdditionalFiltersToBeTested(self): def _getAdditionalFiltersToBeTested(self):
return [
additional_filters = [
{'only_posted_moves': True}, {'only_posted_moves': True},
{'hide_account_balance_at_0': True},
{'hide_account_at_0': True},
{'centralize': 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}, {'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, 'only_posted_moves': True,
'hide_account_balance_at_0': True,
'hide_account_at_0': True,
'centralize': True 'centralize': True
}, },
] ]
# Add `show_analytic_tags` filter on each cases
additional_filters_with_show_tags = []
for additional_filter in additional_filters:
additional_filter['show_analytic_tags'] = True
additional_filters_with_show_tags.append(
additional_filter
)
additional_filters += additional_filters_with_show_tags
# Add `filter_analytic_tag_ids` filter on each cases
analytic_tag = self.env['account.analytic.tag'].create({
'name': 'TEST tag'
})
# Define all move lines on this tag
# (this test just check with the all filters, all works technically)
move_lines = self.env['account.move.line'].search([])
move_lines.write({
'analytic_tag_ids': [(6, False, analytic_tag.ids)],
})
additional_filters_with_filter_tags = []
for additional_filter in additional_filters:
additional_filter['filter_analytic_tag_ids'] = [
(6, False, analytic_tag.ids)
]
additional_filters_with_filter_tags.append(
additional_filter
)
additional_filters += additional_filters_with_filter_tags
return additional_filters
class TestGeneralLedgerReport(common.TransactionCase): class TestGeneralLedgerReport(common.TransactionCase):
@ -120,7 +149,7 @@ class TestGeneralLedgerReport(common.TransactionCase):
'date_from': self.fy_date_start, 'date_from': self.fy_date_start,
'date_to': self.fy_date_end, 'date_to': self.fy_date_end,
'only_posted_moves': True, 'only_posted_moves': True,
'hide_account_balance_at_0': False,
'hide_account_at_0': False,
'company_id': company.id, 'company_id': company.id,
'fy_start_date': self.fy_date_start, 'fy_start_date': self.fy_date_start,
}) })

4
account_financial_report/tests/test_open_items.py

@ -36,6 +36,6 @@ class TestOpenItems(a_t_f_c.AbstractTestForeignCurrency):
def _getAdditionalFiltersToBeTested(self): def _getAdditionalFiltersToBeTested(self):
return [ return [
{'only_posted_moves': True}, {'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},
] ]

20
account_financial_report/tests/test_trial_balance.py

@ -41,20 +41,20 @@ class TestTrialBalance(a_t_f_c.AbstractTestForeignCurrency):
def _getAdditionalFiltersToBeTested(self): def _getAdditionalFiltersToBeTested(self):
return [ return [
{'only_posted_moves': True}, {'only_posted_moves': True},
{'hide_account_balance_at_0': True},
{'hide_account_at_0': True},
{'show_partner_details': True}, {'show_partner_details': True},
{'hierarchy_on': 'computed'}, {'hierarchy_on': 'computed'},
{'hierarchy_on': 'relation'}, {'hierarchy_on': 'relation'},
{'only_posted_moves': True, 'hide_account_balance_at_0': True,
{'only_posted_moves': True, 'hide_account_at_0': True,
'hierarchy_on': 'computed'}, 'hierarchy_on': 'computed'},
{'only_posted_moves': True, 'hide_account_balance_at_0': True,
{'only_posted_moves': True, 'hide_account_at_0': True,
'hierarchy_on': 'relation'}, 'hierarchy_on': 'relation'},
{'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}, {'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, 'only_posted_moves': True,
'hide_account_balance_at_0': True,
'hide_account_at_0': True,
'show_partner_details': True 'show_partner_details': True
}, },
] ]
@ -170,7 +170,7 @@ class TestTrialBalanceReport(common.TransactionCase):
'date_from': self.date_start, 'date_from': self.date_start,
'date_to': self.date_end, 'date_to': self.date_end,
'only_posted_moves': True, 'only_posted_moves': True,
'hide_account_balance_at_0': False,
'hide_account_at_0': False,
'hierarchy_on': hierarchy_on, 'hierarchy_on': hierarchy_on,
'company_id': company.id, 'company_id': company.id,
'fy_start_date': self.fy_date_start, 'fy_start_date': self.fy_date_start,
@ -528,7 +528,7 @@ class TestTrialBalanceReport(common.TransactionCase):
'date_from': self.date_start, 'date_from': self.date_start,
'date_to': self.date_end, 'date_to': self.date_end,
'only_posted_moves': True, 'only_posted_moves': True,
'hide_account_balance_at_0': False,
'hide_account_at_0': False,
'hierarchy_on': 'none', 'hierarchy_on': 'none',
'company_id': company.id, 'company_id': company.id,
'fy_start_date': self.fy_date_start, 'fy_start_date': self.fy_date_start,
@ -570,7 +570,7 @@ class TestTrialBalanceReport(common.TransactionCase):
'date_from': self.date_start, 'date_from': self.date_start,
'date_to': self.date_end, 'date_to': self.date_end,
'only_posted_moves': True, 'only_posted_moves': True,
'hide_account_balance_at_0': False,
'hide_account_at_0': False,
'hierarchy_on': 'none', 'hierarchy_on': 'none',
'company_id': company.id, 'company_id': company.id,
'fy_start_date': self.fy_date_start, 'fy_start_date': self.fy_date_start,
@ -613,7 +613,7 @@ class TestTrialBalanceReport(common.TransactionCase):
'date_from': self.date_start, 'date_from': self.date_start,
'date_to': self.date_end, 'date_to': self.date_end,
'only_posted_moves': True, 'only_posted_moves': True,
'hide_account_balance_at_0': False,
'hide_account_at_0': False,
'hierarchy_on': 'none', 'hierarchy_on': 'none',
'company_id': company.id, 'company_id': company.id,
'fy_start_date': self.fy_date_start, 'fy_start_date': self.fy_date_start,

3
account_financial_report/wizard/aged_partner_balance_wizard.py

@ -3,7 +3,6 @@
# Copyright 2016 Camptocamp SA, Onestein B.V. # Copyright 2016 Camptocamp SA, Onestein B.V.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # 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 import api, fields, models
from odoo.tools.safe_eval import safe_eval from odoo.tools.safe_eval import safe_eval
from odoo.tools import pycompat from odoo.tools import pycompat
@ -21,7 +20,7 @@ class AgedPartnerBalanceWizard(models.TransientModel):
string='Company' string='Company'
) )
date_at = fields.Date(required=True, 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'), target_move = fields.Selection([('posted', 'All Posted Entries'),
('all', 'All Entries')], ('all', 'All Entries')],
string='Target Moves', string='Target Moves',

13
account_financial_report/wizard/general_ledger_wizard.py

@ -41,19 +41,26 @@ class GeneralLedgerReportWizard(models.TransientModel):
) )
centralize = fields.Boolean(string='Activate centralization', centralize = fields.Boolean(string='Activate centralization',
default=True) default=True)
hide_account_balance_at_0 = fields.Boolean(
hide_account_at_0 = fields.Boolean(
string='Hide account ending balance at 0', string='Hide account ending balance at 0',
help='Use this filter to hide an account or a partner ' help='Use this filter to hide an account or a partner '
'with an ending balance at 0. ' 'with an ending balance at 0. '
'If partners are filtered, ' 'If partners are filtered, '
'debits and credits totals will not match the trial balance.' 'debits and credits totals will not match the trial balance.'
) )
show_analytic_tags = fields.Boolean(
string='Show analytic tags',
)
receivable_accounts_only = fields.Boolean() receivable_accounts_only = fields.Boolean()
payable_accounts_only = fields.Boolean() payable_accounts_only = fields.Boolean()
partner_ids = fields.Many2many( partner_ids = fields.Many2many(
comodel_name='res.partner', comodel_name='res.partner',
string='Filter partners', string='Filter partners',
) )
analytic_tag_ids = fields.Many2many(
comodel_name='account.analytic.tag',
string='Filter accounts',
)
account_journal_ids = fields.Many2many( account_journal_ids = fields.Many2many(
comodel_name='account.journal', comodel_name='account.journal',
string='Filter journals', string='Filter journals',
@ -156,12 +163,14 @@ class GeneralLedgerReportWizard(models.TransientModel):
'date_from': self.date_from, 'date_from': self.date_from,
'date_to': self.date_to, 'date_to': self.date_to,
'only_posted_moves': self.target_move == 'posted', '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, 'foreign_currency': self.foreign_currency,
'show_analytic_tags': self.show_analytic_tags,
'company_id': self.company_id.id, 'company_id': self.company_id.id,
'filter_account_ids': [(6, 0, self.account_ids.ids)], 'filter_account_ids': [(6, 0, self.account_ids.ids)],
'filter_partner_ids': [(6, 0, self.partner_ids.ids)], 'filter_partner_ids': [(6, 0, self.partner_ids.ids)],
'filter_cost_center_ids': [(6, 0, self.cost_center_ids.ids)], 'filter_cost_center_ids': [(6, 0, self.cost_center_ids.ids)],
'filter_analytic_tag_ids': [(6, 0, self.analytic_tag_ids.ids)],
'filter_journal_ids': [(6, 0, self.account_journal_ids.ids)], 'filter_journal_ids': [(6, 0, self.account_journal_ids.ids)],
'centralize': self.centralize, 'centralize': self.centralize,
'fy_start_date': self.fy_start_date, 'fy_start_date': self.fy_start_date,

27
account_financial_report/wizard/general_ledger_wizard_view.xml

@ -21,24 +21,29 @@
<group name="other_filters"> <group name="other_filters">
<field name="target_move" widget="radio"/> <field name="target_move" widget="radio"/>
<field name="centralize"/> <field name="centralize"/>
<field name="hide_account_balance_at_0"/>
<field name="hide_account_at_0"/>
<field name="foreign_currency"/> <field name="foreign_currency"/>
<field name="show_analytic_tags"/>
</group> </group>
</group> </group>
<label for="cost_center_ids" groups="analytic.group_analytic_accounting"/>
<field name="cost_center_ids" nolabel="1" options="{'no_create': True}" groups="analytic.group_analytic_accounting"/>
<group/>
<label for="partner_ids"/>
<field name="partner_ids" nolabel="1" options="{'no_create': True}"/>
<label for="account_journal_ids"/>
<field name="account_journal_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/>
<group/>
<label for="account_ids"/>
<notebook>
<page string="Filter accounts">
<group col="4"> <group col="4">
<field name="receivable_accounts_only"/> <field name="receivable_accounts_only"/>
<field name="payable_accounts_only"/> <field name="payable_accounts_only"/>
</group> </group>
<field name="account_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/>
<field name="account_ids" nolabel="1" options="{'no_create': True}"/>
</page>
<page string="Filter partners">
<field name="partner_ids" nolabel="1" options="{'no_create': True}"/>
</page>
<page string="Filter cost centers" groups="analytic.group_analytic_accounting">
<field name="cost_center_ids" nolabel="1" options="{'no_create': True}" groups="analytic.group_analytic_accounting"/>
</page>
<page string="Filter analytic tags">
<field name="analytic_tag_ids" nolabel="1" options="{'no_create': True}"/>
</page>
</notebook>
</div> </div>
<div attrs="{'invisible': [('not_only_one_unaffected_earnings_account', '=', False)]}"> <div attrs="{'invisible': [('not_only_one_unaffected_earnings_account', '=', False)]}">
<field name="not_only_one_unaffected_earnings_account" invisible="1"/> <field name="not_only_one_unaffected_earnings_account" invisible="1"/>

9
account_financial_report/wizard/journal_ledger_wizard.py

@ -38,7 +38,7 @@ class JournalLedgerReportWizard(models.TransientModel):
comodel_name='account.journal', comodel_name='account.journal',
string="Journals", string="Journals",
domain="[('company_id', '=', company_id)]", domain="[('company_id', '=', company_id)]",
required=True,
required=False,
) )
move_target = fields.Selection( move_target = fields.Selection(
selection='_get_move_targets', selection='_get_move_targets',
@ -121,13 +121,18 @@ class JournalLedgerReportWizard(models.TransientModel):
@api.multi @api.multi
def _prepare_report_journal_ledger(self): def _prepare_report_journal_ledger(self):
self.ensure_one() 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 { return {
'date_from': self.date_from, 'date_from': self.date_from,
'date_to': self.date_to, 'date_to': self.date_to,
'move_target': self.move_target, 'move_target': self.move_target,
'foreign_currency': self.foreign_currency, 'foreign_currency': self.foreign_currency,
'company_id': self.company_id.id, '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, 'sort_option': self.sort_option,
'group_option': self.group_option, 'group_option': self.group_option,
'with_account_name': self.with_account_name, 'with_account_name': self.with_account_name,

9
account_financial_report/wizard/open_items_wizard.py

@ -3,7 +3,6 @@
# Copyright 2016 Camptocamp SA # Copyright 2016 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # 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 import models, fields, api
from odoo.tools.safe_eval import safe_eval from odoo.tools.safe_eval import safe_eval
from odoo.tools import pycompat from odoo.tools import pycompat
@ -21,7 +20,7 @@ class OpenItemsReportWizard(models.TransientModel):
string='Company' string='Company'
) )
date_at = fields.Date(required=True, 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'), target_move = fields.Selection([('posted', 'All Posted Entries'),
('all', 'All Entries')], ('all', 'All Entries')],
string='Target Moves', string='Target Moves',
@ -32,8 +31,8 @@ class OpenItemsReportWizard(models.TransientModel):
string='Filter accounts', string='Filter accounts',
domain=[('reconcile', '=', True)], domain=[('reconcile', '=', True)],
) )
hide_account_balance_at_0 = fields.Boolean(
string='Hide account ending balance at 0',
hide_account_at_0 = fields.Boolean(
string='Hide account ending balance at 0', default=True,
help='Use this filter to hide an account or a partner ' help='Use this filter to hide an account or a partner '
'with an ending balance at 0. ' 'with an ending balance at 0. '
'If partners are filtered, ' 'If partners are filtered, '
@ -102,7 +101,7 @@ class OpenItemsReportWizard(models.TransientModel):
return { return {
'date_at': self.date_at, 'date_at': self.date_at,
'only_posted_moves': self.target_move == 'posted', '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, 'foreign_currency': self.foreign_currency,
'company_id': self.company_id.id, 'company_id': self.company_id.id,
'filter_account_ids': [(6, 0, self.account_ids.ids)], 'filter_account_ids': [(6, 0, self.account_ids.ids)],

2
account_financial_report/wizard/open_items_wizard_view.xml

@ -16,7 +16,7 @@
</group> </group>
<group name="other_filters"> <group name="other_filters">
<field name="target_move" widget="radio"/> <field name="target_move" widget="radio"/>
<field name="hide_account_balance_at_0"/>
<field name="hide_account_at_0"/>
<field name="foreign_currency"/> <field name="foreign_currency"/>
</group> </group>
</group> </group>

17
account_financial_report/wizard/trial_balance_wizard.py

@ -1,11 +1,13 @@
# Author: Julien Coux # Author: Julien Coux
# Copyright 2016 Camptocamp SA # Copyright 2016 Camptocamp SA
# Copyright 2017 Akretion - Alexis de Lattre # Copyright 2017 Akretion - Alexis de Lattre
# Copyright 2018 Eficent Business and IT Consuting Services, S.L.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models, fields, api
from odoo import api, fields, models, _
from odoo.tools.safe_eval import safe_eval from odoo.tools.safe_eval import safe_eval
from odoo.tools import pycompat from odoo.tools import pycompat
from odoo.exceptions import UserError
class TrialBalanceReportWizard(models.TransientModel): class TrialBalanceReportWizard(models.TransientModel):
@ -44,6 +46,9 @@ class TrialBalanceReportWizard(models.TransientModel):
No hierarchy: Use to display just the accounts, without any grouping. No hierarchy: Use to display just the accounts, without any grouping.
""", """,
) )
limit_hierarchy_level = fields.Boolean('Limit hierarchy levels')
show_hierarchy_level = fields.Integer('Hierarchy Levels to display',
default=1)
account_ids = fields.Many2many( account_ids = fields.Many2many(
comodel_name='account.account', comodel_name='account.account',
string='Filter accounts', string='Filter accounts',
@ -77,6 +82,14 @@ class TrialBalanceReportWizard(models.TransientModel):
'will display initial and final balance in that currency.' 'will display initial and final balance in that currency.'
) )
@api.multi
@api.constrains('hierarchy_on', 'show_hierarchy_level')
def _check_show_hierarchy_level(self):
for rec in self:
if rec.hierarchy_on != 'none' and rec.show_hierarchy_level <= 0:
raise UserError(_('The hierarchy level to filter on must be '
'greater than 0.'))
@api.depends('date_from') @api.depends('date_from')
def _compute_fy_start_date(self): def _compute_fy_start_date(self):
for wiz in self.filtered('date_from'): for wiz in self.filtered('date_from'):
@ -168,6 +181,8 @@ class TrialBalanceReportWizard(models.TransientModel):
'filter_journal_ids': [(6, 0, self.journal_ids.ids)], 'filter_journal_ids': [(6, 0, self.journal_ids.ids)],
'fy_start_date': self.fy_start_date, 'fy_start_date': self.fy_start_date,
'hierarchy_on': self.hierarchy_on, 'hierarchy_on': self.hierarchy_on,
'limit_hierarchy_level': self.limit_hierarchy_level,
'show_hierarchy_level': self.show_hierarchy_level,
'show_partner_details': self.show_partner_details, 'show_partner_details': self.show_partner_details,
} }

3
account_financial_report/wizard/trial_balance_wizard_view.xml

@ -23,6 +23,8 @@
<field name="hide_account_at_0"/> <field name="hide_account_at_0"/>
<field name="show_partner_details"/> <field name="show_partner_details"/>
<field name="hierarchy_on" widget="radio" attrs="{'invisible':[('show_partner_details','=',True)]}"/> <field name="hierarchy_on" widget="radio" attrs="{'invisible':[('show_partner_details','=',True)]}"/>
<field name="limit_hierarchy_level" attrs="{'invisible':['|', ('hierarchy_on','=','none'),('show_partner_details','=',True)]}"/>
<field name="show_hierarchy_level" attrs="{'invisible':[('limit_hierarchy_level','=', False)]}"/>
<field name="foreign_currency"/> <field name="foreign_currency"/>
</group> </group>
</group> </group>
@ -31,6 +33,7 @@
<label for="journal_ids"/> <label for="journal_ids"/>
<field name="journal_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/> <field name="journal_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/>
<group attrs="{'invisible':[('show_partner_details','!=',True)]}"/> <group attrs="{'invisible':[('show_partner_details','!=',True)]}"/>
<div/>
<label for="account_ids"/> <label for="account_ids"/>
<group col="4"> <group col="4">
<field name="receivable_accounts_only"/> <field name="receivable_accounts_only"/>

Loading…
Cancel
Save