Repository
OCA/account-financial-reporting · module folder · Try on Runboat
Module version
Category
Reporting
Folder size
2.85 MB
License
AGPL-3
Application
Yes
Auto-installable
No
Website
https://github.com/OCA/account-financial-reporting
Last tracking update
2026-08-20 23:28:06
Authors
Camptocamp, Odoo Community Association (OCA), initOS GmbH, redCOR AG, ForgeFlow
Maintainers
Camptocamp, Odoo Community Association (OCA), initOS GmbH, redCOR AG, ForgeFlow
Committers
Pedro M. Baeza, Víctor Martínez, micheledic, Weblate, Michele Di Croce, OCA-git-bot, oca-ci, Andrii9090-tecnativa, adrip-s73, eduezerouali-tecnativa, maciej-wichowski, Reyes4711-S73, Asta
Odoo dependencies
OCA/reporting-engine:
OCA/server-ux:
odoo/odoo:
- web
- bus
- uom
Python dependencies
xlrd, xlsxwriter
System dependencies
None
Required by
None
Description
This module adds a set of financial reports. They are accessible under
Invoicing / Reporting / OCA accounting reports.

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

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

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

Invoicing / Settings / Invoicing / OCA Aged Report Configuration you will be able to set
dynamic intervals that will appear on the Aged Partner Balance.
For further information, check CONFIGURE.rst

Code Analysis

Views touched (56)
XML IDNameModelTypeStatus
account_financial_report.html_container account_financial_report.html_container ir.ui.view qweb New
account_financial_report.internal_layout account_financial_report.internal_layout ir.ui.view qweb New
account_financial_report.report_general_ledger_ending_cumul account_financial_report.report_general_ledger_ending_cumul ir.ui.view qweb New
account_financial_report.report_general_ledger_filters account_financial_report.report_general_ledger_filters ir.ui.view qweb New
account_financial_report.report_general_ledger_lines account_financial_report.report_general_ledger_lines ir.ui.view qweb New
account_financial_report.report_journal_all account_financial_report.report_journal_all ir.ui.view qweb New
account_financial_report.report_journal_all_taxes account_financial_report.report_journal_all_taxes ir.ui.view qweb New
account_financial_report.report_journal_ledger_journal account_financial_report.report_journal_ledger_journal ir.ui.view qweb New
account_financial_report.report_journal_ledger_journal_first_line account_financial_report.report_journal_ledger_journal_first_line ir.ui.view qweb New
account_financial_report.report_journal_ledger_journal_table_header account_financial_report.report_journal_ledger_journal_table_header ir.ui.view qweb New
account_financial_report.report_journal_ledger_journal_taxes account_financial_report.report_journal_ledger_journal_taxes ir.ui.view qweb New
account_financial_report.report_journal_move account_financial_report.report_journal_move ir.ui.view qweb New
account_financial_report.report_journal_move_line account_financial_report.report_journal_move_line ir.ui.view qweb New
account_financial_report.report_open_items_base account_financial_report.report_open_items_base ir.ui.view qweb New
account_financial_report.report_open_items_ending_cumul account_financial_report.report_open_items_ending_cumul ir.ui.view qweb New
account_financial_report.report_open_items_filters account_financial_report.report_open_items_filters ir.ui.view qweb New
account_financial_report.report_open_items_lines account_financial_report.report_open_items_lines ir.ui.view qweb New
account_financial_report.report_open_items_lines_header account_financial_report.report_open_items_lines_header ir.ui.view qweb New
account_financial_report.report_trial_balance_account_footer account_financial_report.report_trial_balance_account_footer ir.ui.view qweb New
account_financial_report.report_trial_balance_filters account_financial_report.report_trial_balance_filters ir.ui.view qweb New
account_financial_report.report_trial_balance_line account_financial_report.report_trial_balance_line ir.ui.view qweb New
account_financial_report.report_trial_balance_lines_header account_financial_report.report_trial_balance_lines_header ir.ui.view qweb New
account_financial_report.report_vat_report_base account_financial_report.report_vat_report_base ir.ui.view qweb New
account_financial_report.report_vat_report_filters account_financial_report.report_vat_report_filters ir.ui.view qweb New
aged_partner_balance aged_partner_balance ir.ui.view qweb New
aged_partner_balance_wizard Aged Partner Balance aged.partner.balance.report.wizard form New
aged_partner_report_configuration_form Age partner report configuration form account.age.report.configuration form New
aged_partner_report_configuration_tree Age partner report configuration list account.age.report.configuration list New
general_ledger general_ledger ir.ui.view qweb New
general_ledger_wizard General Ledger general.ledger.report.wizard form New
journal_ledger journal_ledger ir.ui.view qweb New
journal_ledger_wizard Journal Ledger journal.ledger.report.wizard form New
open_items open_items ir.ui.view qweb New
open_items_wizard Open Items open.items.report.wizard form New
report_aged_partner_balance report_aged_partner_balance ir.ui.view qweb New
report_aged_partner_balance_account_ending_cumul report_aged_partner_balance_account_ending_cumul ir.ui.view qweb New
report_aged_partner_balance_base report_aged_partner_balance_base ir.ui.view qweb New
report_aged_partner_balance_filters report_aged_partner_balance_filters ir.ui.view qweb New
report_aged_partner_balance_lines report_aged_partner_balance_lines ir.ui.view qweb New
report_aged_partner_balance_lines_header report_aged_partner_balance_lines_header ir.ui.view qweb New
report_aged_partner_balance_move_lines report_aged_partner_balance_move_lines ir.ui.view qweb New
report_aged_partner_balance_partner_ending_cumul report_aged_partner_balance_partner_ending_cumul ir.ui.view qweb New
report_general_ledger report_general_ledger ir.ui.view qweb New
report_general_ledger_base report_general_ledger_base ir.ui.view qweb New
report_journal_ledger report_journal_ledger ir.ui.view qweb New
report_journal_ledger_base report_journal_ledger_base ir.ui.view qweb New
report_open_items report_open_items ir.ui.view qweb New
report_trial_balance report_trial_balance ir.ui.view qweb New
report_trial_balance_base report_trial_balance_base ir.ui.view qweb New
report_vat_report report_vat_report ir.ui.view qweb New
res_config_settings_view_form res.config.settings form Inherits account.res_config_settings_view_form
trial_balance trial_balance ir.ui.view qweb New
trial_balance_wizard Trial Balance trial.balance.report.wizard form New
vat_report vat_report ir.ui.view qweb New
vat_report_wizard vat_report_wizard_view vat.report.wizard form New
view_account_specific_form account.account.form.inherit account.account form Inherits account.view_account_form
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (28)

New fields (1)
  • centralized Boolean
    help='If flagged, no details will be displayed in the General Ledger report (the webkit one only), only centralized amounts per period.'
Public methods (0)

No public methods.

New fields (3)
  • company_id Many2one → res.company
    default=<expr> readonly=True args: 'res.company'
  • line_ids One2many → account.age.report.configuration.line
    args: 'account.age.report.configuration.line', 'account_age_report_config_id'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • account_age_report_config_id Many2one → account.age.report.configuration
    args: 'account.age.report.configuration'
  • inferior_limit Integer
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (6)
  • account_ids One2many → account.account
    comodel_name='account.account' compute='_compute_account_ids' store=False string='Accounts'
  • complete_code Char
    compute='_compute_complete_code' recursive=True args: 'Full Code'
  • complete_name Char
    compute='_compute_complete_name' recursive=True args: 'Full Name'
  • compute_account_ids Many2many → account.account
    compute='_compute_group_accounts' recursive=True store=False string='Compute accounts' args: 'account.account'
  • group_child_ids One2many → account.group
    comodel_name='account.group' inverse_name='parent_id' string='Child Groups'
  • level Integer
    compute='_compute_level' recursive=True
Public methods (0)

No public methods.

New fields (1)
  • analytic_account_ids Many2many → account.analytic.account
    compute='_compute_analytic_account_ids' store=True args: 'account.analytic.account'
Public methods (2)
  • init(self)
    The join between accounts_partners subquery and account_move_line can be heavy to compute on big databases. Join sample: JOIN account_move_line ml ON ap.account_id = ml.account_id AND ml.date < '2018-12-30' AND ap.partner_id = ml.partner_id AND ap.include_initial_balance = TRUE By adding the following index, performances are strongly increased. :return:
  • search_count(self, domain, limit=None)
    @api.model

New fields (2)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=False string='Company'
  • label_text_limit Integer
    default=40
Public methods (3)
  • button_export_html(self)
  • button_export_pdf(self)
  • button_export_xlsx(self)

New fields (11)
  • account_code_from Many2one → account.account
    comodel_name='account.account' help='Starting account in a range'
  • account_code_to Many2one → account.account
    comodel_name='account.account' help='Ending account in a range'
  • account_ids Many2many → account.account
    comodel_name='account.account' domain=[('reconcile', '=', True)] required=True string='Filter accounts'
  • age_partner_config_id Many2one → account.age.report.configuration
    string='Intervals configuration' args: 'account.age.report.configuration'
  • date_at Date
    default=fields.Date.context_today required=True
  • date_from Date
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' string='Filter partners'
  • payable_accounts_only Boolean
  • receivable_accounts_only Boolean
  • show_move_line_details Boolean
  • target_move Selection
    default='posted' required=True string='Target Moves' args: [('posted', 'All Posted Entries'), ('all', 'All Entries')]
Public methods (4)
  • on_change_account_range(self)
    @api.onchange('account_code_from', 'account_code_to')
  • onchange_account_ids(self)
    @api.onchange('account_ids')
  • onchange_company_id(self)
    @api.onchange('company_id')
    Handle company change.
  • onchange_type_accounts_only(self)
    @api.onchange('receivable_accounts_only', 'payable_accounts_only')
    Handle receivable/payable accounts only change.

New fields (21)
  • account_code_from Many2one → account.account
    comodel_name='account.account' help='Starting account in a range'
  • account_code_to Many2one → account.account
    comodel_name='account.account' help='Ending account in a range'
  • account_ids Many2many → account.account
    comodel_name='account.account' string='Filter accounts'
  • account_journal_ids Many2many → account.journal
    comodel_name='account.journal' string='Filter journals'
  • centralize Boolean
    default=True string='Activate centralization'
  • cost_center_ids Many2many → account.analytic.account
    comodel_name='account.analytic.account' string='Filter cost centers'
  • date_from Date
    default=<expr> required=True
  • date_range_id Many2one → date.range
    comodel_name='date.range' string='Date range'
  • date_to Date
    default=fields.Date.context_today required=True
  • domain Char
    default=[] help='This domain will be used to select specific domain for Journal Items' string='Journal Items Domain'
  • foreign_currency Boolean
    default=<expr> help='Display foreign currency for move lines, unless account currency is not setup through chart of accounts will display initial and final balance in that currency.' string='Show foreign currency'
  • fy_start_date Date
    compute='_compute_fy_start_date'
  • grouped_by Selection
    default='partners' required=True selection=[('none', 'None'), ('partners', 'Partners'), ('taxes', 'Taxes')]
  • hide_account_at_0 Boolean
    help='Use this filter to hide an account or a partner with an ending balance at 0. If partners are filtered, debits and credits totals will not match the trial balance.' string='Hide account ending balance at 0'
  • only_one_unaffected_earnings_account Boolean
    default=<expr> readonly=True
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' default=<expr> string='Filter partners'
  • payable_accounts_only Boolean
  • receivable_accounts_only Boolean
  • show_cost_center Boolean
    default=True string='Show Analytic Account'
  • target_move Selection
    default='posted' required=True string='Target Moves' args: [('posted', 'All Posted Entries'), ('all', 'All Entries')]
  • unaffected_earnings_account Many2one → account.account
    comodel_name='account.account' compute='_compute_unaffected_earnings_account' store=True
Public methods (5)
  • on_change_account_range(self)
    @api.onchange('account_code_from', 'account_code_to')
  • onchange_company_id(self)
    @api.onchange('company_id')
    Handle company change.
  • onchange_date_range_id(self)
    @api.onchange('date_range_id')
    Handle date range change.
  • onchange_partner_ids(self)
    @api.onchange('partner_ids')
    Handle partners change.
  • onchange_type_accounts_only(self)
    @api.onchange('receivable_accounts_only', 'payable_accounts_only')
    Handle receivable/payable accounts only change.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (10)
  • date_from Date
    required=True string='Start date'
  • date_range_id Many2one → date.range
    comodel_name='date.range' string='Date range'
  • date_to Date
    required=True string='End date'
  • foreign_currency Boolean
  • group_option Selection
    default='journal' required=True selection='_get_group_options' string='Group entries by'
  • journal_ids Many2many → account.journal
    comodel_name='account.journal' required=False string='Journals'
  • move_target Selection
    default='posted' required=True selection='_get_move_targets'
  • sort_option Selection
    default='move_name' required=True selection='_get_sort_options' string='Sort entries by'
  • with_account_name Boolean
    default=False
  • with_auto_sequence Boolean
    default=False string='Show Auto Sequence'
Public methods (2)
  • onchange_company_id(self)
    @api.onchange('company_id')
    Handle company change.
  • onchange_date_range_id(self)
    @api.onchange('date_range_id')

New fields (13)
  • account_code_from Many2one → account.account
    comodel_name='account.account'
  • account_code_to Many2one → account.account
    comodel_name='account.account' help='Ending account in a range'
  • account_ids Many2many → account.account
    comodel_name='account.account' domain=[('reconcile', '=', True)] required=True string='Filter accounts'
  • date_at Date
    default=fields.Date.context_today required=True
  • date_from Date
  • foreign_currency Boolean
    default=<expr> help='Display foreign currency for move lines, unless account currency is not setup through chart of accounts will display initial and final balance in that currency.' string='Show foreign currency'
  • grouped_by Selection
    default='partners' selection=[('partners', 'Partners'), ('salesperson', 'Partner Salesperson')]
  • hide_account_at_0 Boolean
    default=True help='Use this filter to hide an account or a partner with an ending balance at 0. If partners are filtered, debits and credits totals will not match the trial balance.' string='Hide account ending balance at 0'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' default=<expr> string='Filter partners'
  • payable_accounts_only Boolean
  • receivable_accounts_only Boolean
  • show_partner_details Boolean
    default=True
  • target_move Selection
    default='posted' required=True string='Target Moves' args: [('posted', 'All Posted Entries'), ('all', 'All Entries')]
Public methods (4)
  • on_change_account_range(self)
    @api.onchange('account_code_from', 'account_code_to')
  • onchange_account_ids(self)
    @api.onchange('account_ids')
  • onchange_company_id(self)
    @api.onchange('company_id')
    Handle company change.
  • onchange_type_accounts_only(self)
    @api.onchange('receivable_accounts_only', 'payable_accounts_only')
    Handle receivable/payable accounts only change.

New fields (0)

No new fields.

Public methods (2)
  • write_account_footer_from_dict(self, report, account, label, field_name, string_format, amount_format, amount_is_percent, report_data)
    Specific function to write account footer for Aged Partner Balance
  • write_ending_balance_from_dict(self, my_object, report_data)
    Specific function to write ending partner balance for Aged Partner Balance

New fields (0)

No new fields.

Public methods (2)
  • write_ending_balance_from_dict(self, my_object, report_data)
    Specific function to write ending balance for General Ledger
  • write_initial_balance_from_dict(self, my_object, report_data)
    Specific function to write initial balance for General Ledger

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write_ending_balance_from_dict(self, my_object, type_object, total_amount, report_data, account_id=False, partner_id=False)
    Specific function to write ending balance for Open Items

New fields (0)

No new fields.

Public methods (3)
  • write_account_footer(self, account, name_value, report_data)
    Specific function to write account footer for Trial Balance
  • write_line(self, line_object, type_object, report_data)
    Write a line on current line using all defined columns field name. Columns are defined with `_get_report_columns` method.
  • write_line_from_dict_order(self, total_amount, partner_data, report_data)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (8)
  • generate_xlsx_report(self, workbook, data, objects)
  • get_workbook_options(self)
  • write_array_header(self, report_data)
    Write array header on current line using all defined columns name. Columns are defined with `_get_report_columns` method.
  • write_array_title(self, title, report_data)
    Write array title on current line using all defined columns width. Columns are defined with `_get_report_columns` method.
  • write_ending_balance_from_dict(self, my_object, name, label, report_data)
    Write a specific ending balance line on current line using defined columns field_final_balance name. Columns are defined with `_get_report_columns` method.
  • write_initial_balance_from_dict(self, my_object, label, report_data)
    Write a specific initial balance line on current line using defined columns field_initial_balance name. Columns are defined with `_get_report_columns` method.
  • write_line_from_dict(self, line_dict, report_data)
    Write a line on current line
  • write_non_standard_column(self, cell_type, col_pos, value)
    Write columns out of the columns type defined here.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • age_partner_config_id Many2one → account.age.report.configuration
    string='Intervals configuration' args: 'account.age.report.configuration'
Public methods (2)
  • get_values(self)
    @api.model
  • set_values(self)

New fields (22)
  • account_code_from Many2one → account.account
    comodel_name='account.account' help='Starting account in a range'
  • account_code_to Many2one → account.account
    comodel_name='account.account' help='Ending account in a range'
  • account_ids Many2many → account.account
    comodel_name='account.account' string='Filter accounts'
  • date_from Date
    required=True
  • date_range_id Many2one → date.range
    comodel_name='date.range' string='Date range'
  • date_to Date
    required=True
  • foreign_currency Boolean
    help='Display foreign currency for move lines, unless account currency is not setup through chart of accounts will display initial and final balance in that currency.' string='Show foreign currency'
  • fy_start_date Date
    compute='_compute_fy_start_date'
  • grouped_by Selection
    default=False selection=[('analytic_account', 'Analytic Account')]
  • hide_account_at_0 Boolean
    default=True help='When this option is enabled, the trial balance will not display accounts that have initial balance = debit = credit = end balance = 0' string='Hide accounts at 0'
  • hide_parent_hierarchy_level Boolean
    default=False args: 'Do not display parent levels'
  • journal_ids Many2many → account.journal
    comodel_name='account.journal'
  • limit_hierarchy_level Boolean
    args: 'Limit hierarchy levels'
  • only_one_unaffected_earnings_account Boolean
    default=<expr> readonly=True
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' string='Filter partners'
  • payable_accounts_only Boolean
  • receivable_accounts_only Boolean
  • show_hierarchy Boolean
    help='Use when your account groups are hierarchical' string='Show hierarchy'
  • show_hierarchy_level Integer
    default=1 args: 'Hierarchy Levels to display'
  • show_partner_details Boolean
  • target_move Selection
    default='posted' required=True string='Target Moves' args: [('posted', 'All Posted Entries'), ('all', 'All Entries')]
  • unaffected_earnings_account Many2one → account.account
    comodel_name='account.account' compute='_compute_unaffected_earnings_account' store=True
Public methods (6)
  • on_change_account_range(self)
    @api.onchange('account_code_from', 'account_code_to')
  • onchange_company_id(self)
    @api.onchange('company_id')
    Handle company change.
  • onchange_date_range_id(self)
    @api.onchange('date_range_id')
    Handle date range change.
  • onchange_grouped_by(self)
    @api.onchange('grouped_by')
  • onchange_show_partner_details(self)
    @api.onchange('show_partner_details')
    Handle partners change.
  • onchange_type_accounts_only(self)
    @api.onchange('receivable_accounts_only', 'payable_accounts_only')
    Handle receivable/payable accounts only change.

New fields (6)
  • based_on Selection
    default='taxtags' required=True args: [('taxtags', 'Tax Tags'), ('taxgroups', 'Tax Groups')]
  • date_from Date
    required=True args: 'Start Date'
  • date_range_id Many2one → date.range
    comodel_name='date.range' string='Date range'
  • date_to Date
    required=True args: 'End Date'
  • target_move Selection
    default='posted' required=True string='Target Moves' args: [('posted', 'All Posted Entries'), ('all', 'All Entries')]
  • tax_detail Boolean
    args: 'Detail Taxes'
Public methods (2)
  • onchange_company_id(self)
    @api.onchange('company_id')
  • onchange_date_range_id(self)
    @api.onchange('date_range_id')
    Handle date range change.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…