[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 datepull/939/head
parent
73f7885f89
commit
d4107dcf38
|
@ -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': [
|
||||||
|
|
|
@ -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':
|
||||||
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':
|
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. """
|
||||||
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:
|
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:
|
||||||
|
|
|
@ -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.
|
||||||
"""
|
"""
|
||||||
query_inject_move_line_centralized = """
|
if self.filter_analytic_tag_ids:
|
||||||
|
query_inject_move_line_centralized = """
|
||||||
|
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
|
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 = """
|
query_select_previous_fy_unaffected_earnings = ''
|
||||||
SELECT sum(aml.balance) as balance
|
q_analytic_tags = ''
|
||||||
FROM account_move_line as aml
|
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 += """
|
||||||
|
INNER JOIN move_lines_on_tags ON ml.id =
|
||||||
|
move_lines_on_tags.ml_id
|
||||||
|
"""
|
||||||
query_select_previous_fy_unaffected_earnings += """
|
query_select_previous_fy_unaffected_earnings += """
|
||||||
WHERE aml.date < %(date_to)s
|
WHERE ml.date < %(date_to)s
|
||||||
AND aml.company_id = %(company_id)s
|
AND ml.company_id = %(company_id)s
|
||||||
AND aml.account_id IN %(account_ids)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(ml.debit) as sum_debit,
|
||||||
sum(aml.credit) as sum_credit,
|
sum(ml.credit) as sum_credit,
|
||||||
sum(aml.balance) as balance
|
sum(ml.balance) as balance
|
||||||
FROM account_move_line as aml
|
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 ml.date <= %(date_to)s
|
||||||
AND aml.company_id = %(company_id)s
|
AND ml.company_id = %(company_id)s
|
||||||
AND aml.account_id = %(unaffected_earnings_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 += """
|
||||||
|
|
|
@ -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},
|
8: {'header': _('Tags'),
|
||||||
9: {'header': _('Debit'),
|
'field': 'tags',
|
||||||
'field': 'debit',
|
'width': 10},
|
||||||
'field_initial_balance': 'initial_debit',
|
9: {'header': _('Rec.'), 'field': 'matching_number', 'width': 5},
|
||||||
'field_final_balance': 'final_debit',
|
10: {'header': _('Debit'),
|
||||||
'type': 'amount',
|
'field': 'debit',
|
||||||
'width': 14},
|
'field_initial_balance': 'initial_debit',
|
||||||
10: {'header': _('Credit'),
|
'field_final_balance': 'final_debit',
|
||||||
|
'type': 'amount',
|
||||||
|
'width': 14},
|
||||||
|
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)],
|
_('Date range filter'),
|
||||||
[_('Target moves filter'),
|
_('From: %s To: %s') % (report.date_from, report.date_to),
|
||||||
_('All posted entries') if report.only_posted_moves else _(
|
],
|
||||||
'All entries')],
|
[
|
||||||
[_('Account balance at 0 filter'),
|
_('Target moves filter'),
|
||||||
_('Hide') if report.hide_account_balance_at_0 else _('Show')],
|
_('All posted entries') if report.only_posted_moves
|
||||||
[_('Centralize filter'),
|
else _('All entries'),
|
||||||
_('Yes') if report.centralize else _('No')],
|
],
|
||||||
[_('Show foreign currency'),
|
[
|
||||||
_('Yes') if report.foreign_currency else _('No')],
|
_('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):
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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')],
|
||||||
]
|
]
|
||||||
|
|
|
@ -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="o.hide_account_at_0">Hide</t>
|
||||||
<t t-if="not o.hide_account_balance_at_0">Show</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-->
|
||||||
|
|
|
@ -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="o.hide_account_at_0">Hide</t>
|
||||||
<t t-if="not o.hide_account_balance_at_0">Show</t>
|
<t t-if="not o.hide_account_at_0">Show</t>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -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', '>=', line.report_id.date_from),
|
||||||
|
('date', '<=', 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"
|
||||||
|
|
|
@ -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)
|
sequence = fields.Integer(index=True, default=1)
|
||||||
level = fields.Integer(index=True, default=0)
|
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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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,
|
||||||
})
|
})
|
||||||
|
|
|
@ -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},
|
{'hide_account_at_0': True},
|
||||||
{'only_posted_moves': True, 'hide_account_balance_at_0': True},
|
{'only_posted_moves': True, 'hide_account_at_0': True},
|
||||||
]
|
]
|
||||||
|
|
|
@ -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,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',
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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"/>
|
<notebook>
|
||||||
<field name="cost_center_ids" nolabel="1" options="{'no_create': True}" groups="analytic.group_analytic_accounting"/>
|
<page string="Filter accounts">
|
||||||
<group/>
|
<group col="4">
|
||||||
<label for="partner_ids"/>
|
<field name="receivable_accounts_only"/>
|
||||||
<field name="partner_ids" nolabel="1" options="{'no_create': True}"/>
|
<field name="payable_accounts_only"/>
|
||||||
<label for="account_journal_ids"/>
|
</group>
|
||||||
<field name="account_journal_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/>
|
<field name="account_ids" nolabel="1" options="{'no_create': True}"/>
|
||||||
<group/>
|
</page>
|
||||||
<label for="account_ids"/>
|
<page string="Filter partners">
|
||||||
<group col="4">
|
<field name="partner_ids" nolabel="1" options="{'no_create': True}"/>
|
||||||
<field name="receivable_accounts_only"/>
|
</page>
|
||||||
<field name="payable_accounts_only"/>
|
<page string="Filter cost centers" groups="analytic.group_analytic_accounting">
|
||||||
</group>
|
<field name="cost_center_ids" nolabel="1" options="{'no_create': True}" groups="analytic.group_analytic_accounting"/>
|
||||||
<field name="account_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/>
|
</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"/>
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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(
|
hide_account_at_0 = fields.Boolean(
|
||||||
string='Hide account ending balance at 0',
|
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)],
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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…
Reference in New Issue