| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/account-financial-tools |
| GIT | |
| GIT | https://github.com/OCA/account-financial-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/account-financial-tools/tree/18.0/account_spread_cost_revenue |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Accounting & Finance |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Onestein |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Onestein |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Anusha |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/account-financial-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:30:07 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - account - base_setup - base - web - onboarding - product - bus - web_tour - html_editor - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Allows to spread costs or revenues over a customizable periods, to even out cost or invoice spikes. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_account_spread |
account.spread | form | New | |
view_account_spread_invoice_line_link_wizard |
account.spread.invoice.line.link.wizard | form | New | |
view_account_spread_search |
account.spread | search | New | |
view_account_spread_template |
account.spread.template | form | New | |
view_account_spread_template_tree |
account.spread.template | list | New | |
view_account_spread_tree |
account.spread | list | New | |
view_company_form |
res.company | xpath | Inherits base.view_company_form | |
view_invoice_spread |
account.move | xpath | Inherits account.view_move_form |
No new fields.
Public methods (2)action_post(self)
button_cancel(self)
spread_check
Selection
compute='_compute_spread_check'
args: [('linked', 'Linked'), ('unlinked', 'Unlinked'), ('unavailable', 'Unavailable')]
spread_id
Many2one → account.spread
copy=False
string='Spread Board'
args: 'account.spread'
create_auto_spread(self)
spread_details(self)
write(self, vals)
active
Boolean
default=True
all_posted
Boolean
compute='_compute_all_posted'
store=True
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
credit_account_id
Many2one → account.account
compute='_compute_credit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
currency_id
Many2one → res.currency
default=<expr>
required=True
args: 'res.currency'
days_calc
Boolean
default=False
help='Use number of days to calculate amount'
string='Calculate by days'
debit_account_id
Many2one → account.account
compute='_compute_debit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
display_create_all_moves
Boolean
compute='_compute_display_create_all_moves'
display_move_line_auto_post
Boolean
compute='_compute_display_move_line_auto_post'
string='Display Button Auto-post lines'
display_recompute_buttons
Boolean
compute='_compute_display_recompute_buttons'
estimated_amount
Float
digits='Account'
invoice_id
Many2one
related='invoice_line_id.move_id'
store=True
invoice_line_id
Many2one → account.move.line
compute='_compute_invoice_line'
inverse='_inverse_invoice_line'
store=True
string='Invoice line'
args: 'account.move.line'
invoice_line_ids
One2many → account.move.line
copy=False
string='Invoice Lines'
args: 'account.move.line', 'spread_id'
invoice_type
Selection
required=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
is_credit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
is_debit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
journal_id
Many2one → account.journal
check_company=True
compute='_compute_journal_id'
domain="[('id', 'in', suitable_journal_ids)]"
precompute=True
readonly=False
required=True
store=True
args: 'account.journal'
line_ids
One2many → account.spread.line
string='Spread Lines'
args: 'account.spread.line', 'spread_id'
move_line_auto_post
Boolean
default=True
args: 'Auto-post lines'
name
Char
required=True
period_number
Integer
default=12
help='Define the number of spread lines'
required=True
string='Number of Repetitions'
period_type
Selection
default='month'
help='Period length for the entries'
required=True
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
posted_amount
Float
compute='_compute_amounts'
digits='Account'
spread_date
Date
default=time.strftime('%Y-01-01')
required=True
string='Start Date'
spread_type
Selection
compute='_compute_spread_type'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
suitable_journal_ids
Many2many → account.journal
compute='_compute_suitable_journal_ids'
args: 'account.journal'
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
total_amount
Float
compute='_compute_amounts'
digits='Account'
unposted_amount
Float
compute='_compute_amounts'
digits='Account'
unspread_amount
Float
compute='_compute_amounts'
digits='Account'
use_invoice_line_account
Boolean
action_recalculate_spread(self)
action_undo_spread(self)
action_unlink_invoice_line(self)
compute_spread_board(self)
create_all_moves(self)
default_get(self, fields)
default_journal(self, company_id)
onchange_template(self)
open_posted_view(self)
reconcile_spread_moves(self)
unlink(self)
company_id
Many2one → res.company
required=True
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/revenue account'
args: 'account.account'
invoice_id
Many2one
related='invoice_line_id.move_id'
invoice_line_id
Many2one → account.move.line
ondelete='cascade'
required=True
args: 'account.move.line'
invoice_type
Selection
compute='_compute_invoice_type'
store=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
store=True
string='Balance sheet account / Spread account'
args: 'account.account'
spread_action_type
Selection
default=<expr>
selection=<expr>
spread_id
Many2one → account.spread
domain="[('id', 'in', spread_invoice_type_domain_ids)]"
string='Spread Board'
args: 'account.spread'
spread_invoice_type_domain_ids
One2many → account.spread
compute='_compute_spread_invoice_type_domain'
args: 'account.spread'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
store=True
string='Spread Journal'
args: 'account.journal'
spread_type
Selection
compute='_compute_invoice_type'
store=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
confirm(self)
amount
Float
digits='Account'
required=True
date
Date
required=True
move_id
Many2one → account.move
string='Journal Entry'
args: 'account.move'
name
Char
spread_id
Many2one → account.spread
ondelete='cascade'
args: 'account.spread'
create_and_reconcile_moves(self)
create_move(self)
open_move(self)
unlink_move(self)
auto_spread
Boolean
help='If checked, provide option to auto create spread during invoice validation, based on product/account/analytic in invoice line.'
string='Auto assign template on invoice validate'
auto_spread_ids
One2many → account.spread.template.auto
comodel_name='account.spread.template.auto'
inverse_name='template_id'
string='Auto Spread On'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
days_calc
Boolean
default=False
help='Use number of days to calculate amount'
string='Calculate by days'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/Revenue Account'
args: 'account.account'
name
Char
required=True
period_number
Integer
help='Define the number of spread lines'
string='Number of Repetitions'
period_type
Selection
help='Period length for the entries'
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
required=False
store=True
string='Spread Balance Sheet Account'
args: 'account.account'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
required=True
store=True
string='Journal'
args: 'account.journal'
spread_type
Selection
default='sale'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
start_date
Date
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
string='Invoice account as spread account'
default_get(self, fields)
account_id
Many2one → account.account
comodel_name='account.account'
string='Account'
company_id
Many2one
related='template_id.company_id'
store=True
name
Char
default='/'
required=True
product_id
Many2one → product.product
comodel_name='product.product'
string='Product'
template_id
Many2one → account.spread.template
comodel_name='account.spread.template'
index=True
ondelete='cascade'
required=True
string='Spread Template'
No public methods.
allow_spread_planning
Boolean
default=True
help='Disable this option if you do not want to allow the spreading before the invoice is validated.'
auto_archive_spread
Boolean
help='Enable this option if you want the cron job to automatically archive the spreads when all lines are posted.'
args: 'Auto-archive spread'
default_spread_expense_account_id
Many2one → account.account
string='Expense Spread Account'
args: 'account.account'
default_spread_expense_journal_id
Many2one → account.journal
string='Expense Spread Journal'
args: 'account.journal'
default_spread_revenue_account_id
Many2one → account.account
string='Revenue Spread Account'
args: 'account.account'
default_spread_revenue_journal_id
Many2one → account.journal
string='Revenue Spread Journal'
args: 'account.journal'
force_move_auto_post
Boolean
help='Enable this option if you want to post automatically the accounting moves of all the spreads.'
args: 'Auto-post spread lines'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/account-financial-tools |
| GIT | |
| GIT | https://github.com/OCA/account-financial-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/account-financial-tools/tree/17.0/account_spread_cost_revenue |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Accounting & Finance |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Onestein |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Onestein |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Antoni Marroig Campomar |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/account-financial-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:20:01 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - account - base_setup - base - web - onboarding - product - bus - web_tour - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Allows to spread costs or revenues over a customizable periods, to even out cost or invoice spikes. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_account_spread |
account.spread | form | New | |
view_account_spread_invoice_line_link_wizard |
account.spread.invoice.line.link.wizard | form | New | |
view_account_spread_search |
account.spread | search | New | |
view_account_spread_template |
account.spread.template | form | New | |
view_account_spread_template_tree |
account.spread.template | tree | New | |
view_account_spread_tree |
account.spread | tree | New | |
view_company_form |
res.company | xpath | Inherits base.view_company_form | |
view_invoice_spread |
account.move | xpath | Inherits account.view_move_form |
No new fields.
Public methods (2)action_post(self)
button_cancel(self)
spread_check
Selection
compute='_compute_spread_check'
args: [('linked', 'Linked'), ('unlinked', 'Unlinked'), ('unavailable', 'Unavailable')]
spread_id
Many2one → account.spread
copy=False
string='Spread Board'
args: 'account.spread'
create_auto_spread(self)
spread_details(self)
write(self, vals)
active
Boolean
default=True
all_posted
Boolean
compute='_compute_all_posted'
store=True
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
credit_account_id
Many2one → account.account
compute='_compute_credit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
currency_id
Many2one → res.currency
default=<expr>
required=True
args: 'res.currency'
days_calc
Boolean
default=False
help='Use number of days to calculate amount'
string='Calculate by days'
debit_account_id
Many2one → account.account
compute='_compute_debit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
display_create_all_moves
Boolean
compute='_compute_display_create_all_moves'
display_move_line_auto_post
Boolean
compute='_compute_display_move_line_auto_post'
string='Display Button Auto-post lines'
display_recompute_buttons
Boolean
compute='_compute_display_recompute_buttons'
estimated_amount
Float
digits='Account'
invoice_id
Many2one
related='invoice_line_id.move_id'
store=True
invoice_line_id
Many2one → account.move.line
compute='_compute_invoice_line'
inverse='_inverse_invoice_line'
store=True
string='Invoice line'
args: 'account.move.line'
invoice_line_ids
One2many → account.move.line
copy=False
string='Invoice Lines'
args: 'account.move.line', 'spread_id'
invoice_type
Selection
required=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
is_credit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
is_debit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
journal_id
Many2one → account.journal
check_company=True
compute='_compute_journal_id'
domain="[('id', 'in', suitable_journal_ids)]"
precompute=True
readonly=False
required=True
store=True
args: 'account.journal'
line_ids
One2many → account.spread.line
string='Spread Lines'
args: 'account.spread.line', 'spread_id'
move_line_auto_post
Boolean
default=True
args: 'Auto-post lines'
name
Char
required=True
period_number
Integer
default=12
help='Define the number of spread lines'
required=True
string='Number of Repetitions'
period_type
Selection
default='month'
help='Period length for the entries'
required=True
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
posted_amount
Float
compute='_compute_amounts'
digits='Account'
spread_date
Date
default=time.strftime('%Y-01-01')
required=True
string='Start Date'
spread_type
Selection
compute='_compute_spread_type'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
suitable_journal_ids
Many2many → account.journal
compute='_compute_suitable_journal_ids'
args: 'account.journal'
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
total_amount
Float
compute='_compute_amounts'
digits='Account'
unposted_amount
Float
compute='_compute_amounts'
digits='Account'
unspread_amount
Float
compute='_compute_amounts'
digits='Account'
use_invoice_line_account
Boolean
action_recalculate_spread(self)
action_undo_spread(self)
action_unlink_invoice_line(self)
compute_spread_board(self)
create_all_moves(self)
default_get(self, fields)
default_journal(self, company_id)
onchange_template(self)
open_posted_view(self)
reconcile_spread_moves(self)
unlink(self)
company_id
Many2one → res.company
required=True
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/revenue account'
args: 'account.account'
invoice_id
Many2one
related='invoice_line_id.move_id'
invoice_line_id
Many2one → account.move.line
ondelete='cascade'
required=True
args: 'account.move.line'
invoice_type
Selection
compute='_compute_invoice_type'
store=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
store=True
string='Balance sheet account / Spread account'
args: 'account.account'
spread_action_type
Selection
default=_selection_default_spread_action_type
selection=_selection_spread_action_type
spread_id
Many2one → account.spread
domain="[('id', 'in', spread_invoice_type_domain_ids)]"
string='Spread Board'
args: 'account.spread'
spread_invoice_type_domain_ids
One2many → account.spread
compute='_compute_spread_invoice_type_domain'
args: 'account.spread'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
store=True
string='Spread Journal'
args: 'account.journal'
spread_type
Selection
compute='_compute_invoice_type'
store=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
confirm(self)
amount
Float
digits='Account'
required=True
date
Date
required=True
move_id
Many2one → account.move
string='Journal Entry'
args: 'account.move'
name
Char
spread_id
Many2one → account.spread
ondelete='cascade'
args: 'account.spread'
create_and_reconcile_moves(self)
create_move(self)
open_move(self)
unlink_move(self)
auto_spread
Boolean
help='If checked, provide option to auto create spread during invoice validation, based on product/account/analytic in invoice line.'
string='Auto assign template on invoice validate'
auto_spread_ids
One2many → account.spread.template.auto
comodel_name='account.spread.template.auto'
inverse_name='template_id'
string='Auto Spread On'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
days_calc
Boolean
default=False
help='Use number of days to calculate amount'
string='Calculate by days'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/Revenue Account'
args: 'account.account'
name
Char
required=True
period_number
Integer
help='Define the number of spread lines'
string='Number of Repetitions'
period_type
Selection
help='Period length for the entries'
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
required=False
store=True
string='Spread Balance Sheet Account'
args: 'account.account'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
required=True
store=True
string='Journal'
args: 'account.journal'
spread_type
Selection
default='sale'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
start_date
Date
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
string='Invoice account as spread account'
default_get(self, fields)
account_id
Many2one → account.account
comodel_name='account.account'
string='Account'
company_id
Many2one
related='template_id.company_id'
store=True
name
Char
default='/'
required=True
product_id
Many2one → product.product
comodel_name='product.product'
string='Product'
template_id
Many2one → account.spread.template
comodel_name='account.spread.template'
index=True
ondelete='cascade'
required=True
string='Spread Template'
No public methods.
allow_spread_planning
Boolean
default=True
help='Disable this option if you do not want to allow the spreading before the invoice is validated.'
auto_archive_spread
Boolean
help='Enable this option if you want the cron job to automatically archive the spreads when all lines are posted.'
args: 'Auto-archive spread'
default_spread_expense_account_id
Many2one → account.account
string='Expense Spread Account'
args: 'account.account'
default_spread_expense_journal_id
Many2one → account.journal
string='Expense Spread Journal'
args: 'account.journal'
default_spread_revenue_account_id
Many2one → account.account
string='Revenue Spread Account'
args: 'account.account'
default_spread_revenue_journal_id
Many2one → account.journal
string='Revenue Spread Journal'
args: 'account.journal'
force_move_auto_post
Boolean
help='Enable this option if you want to post automatically the accounting moves of all the spreads.'
args: 'Auto-post spread lines'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/account-financial-tools |
| GIT | |
| GIT | https://github.com/OCA/account-financial-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/account-financial-tools/tree/16.0/account_spread_cost_revenue |
| VERSION | |
| VERSION | 1.0.1 |
| CATEGORY | |
| CATEGORY | Accounting & Finance |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Onestein |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Onestein |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, Andrea Stirpe, oca-ci, Kitti U |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/account-financial-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:53:47 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - account - base_setup - base - web - product - bus - web_tour - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_account_spread |
account.spread | form | New | |
view_account_spread_invoice_line_link_wizard |
account.spread.invoice.line.link.wizard | form | New | |
view_account_spread_search |
account.spread | search | New | |
view_account_spread_template |
account.spread.template | form | New | |
view_account_spread_template_tree |
account.spread.template | tree | New | |
view_account_spread_tree |
account.spread | tree | New | |
view_company_form |
res.company | xpath | Inherits base.view_company_form | |
view_invoice_spread |
account.move | xpath | Inherits account.view_move_form |
No new fields.
Public methods (2)action_post(self)
button_cancel(self)
spread_check
Selection
compute='_compute_spread_check'
args: [('linked', 'Linked'), ('unlinked', 'Unlinked'), ('unavailable', 'Unavailable')]
spread_id
Many2one → account.spread
copy=False
string='Spread Board'
args: 'account.spread'
create_auto_spread(self)
spread_details(self)
write(self, vals)
active
Boolean
default=True
all_posted
Boolean
compute='_compute_all_posted'
store=True
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
credit_account_id
Many2one → account.account
compute='_compute_credit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
currency_id
Many2one → res.currency
default=<expr>
required=True
args: 'res.currency'
days_calc
Boolean
default=False
help='Use number of days to calculate amount'
string='Calculate by days'
debit_account_id
Many2one → account.account
compute='_compute_debit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
display_create_all_moves
Boolean
compute='_compute_display_create_all_moves'
display_move_line_auto_post
Boolean
compute='_compute_display_move_line_auto_post'
string='Display Button Auto-post lines'
display_recompute_buttons
Boolean
compute='_compute_display_recompute_buttons'
estimated_amount
Float
digits='Account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.move_id'
store=True
invoice_line_id
Many2one → account.move.line
compute='_compute_invoice_line'
inverse='_inverse_invoice_line'
store=True
string='Invoice line'
args: 'account.move.line'
invoice_line_ids
One2many → account.move.line
copy=False
string='Invoice Lines'
args: 'account.move.line', 'spread_id'
invoice_type
Selection
required=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
is_credit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
is_debit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
journal_id
Many2one → account.journal
check_company=True
compute='_compute_journal_id'
domain="[('id', 'in', suitable_journal_ids)]"
precompute=True
readonly=False
required=True
store=True
args: 'account.journal'
line_ids
One2many → account.spread.line
string='Spread Lines'
args: 'account.spread.line', 'spread_id'
move_line_auto_post
Boolean
default=True
args: 'Auto-post lines'
name
Char
required=True
period_number
Integer
default=12
help='Define the number of spread lines'
required=True
string='Number of Repetitions'
period_type
Selection
default='month'
help='Period length for the entries'
required=True
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
posted_amount
Float
compute='_compute_amounts'
digits='Account'
spread_date
Date
default=time.strftime('%Y-01-01')
required=True
string='Start Date'
spread_type
Selection
compute='_compute_spread_type'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
suitable_journal_ids
Many2many → account.journal
compute='_compute_suitable_journal_ids'
args: 'account.journal'
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
total_amount
Float
compute='_compute_amounts'
digits='Account'
unposted_amount
Float
compute='_compute_amounts'
digits='Account'
unspread_amount
Float
compute='_compute_amounts'
digits='Account'
use_invoice_line_account
Boolean
action_recalculate_spread(self)
action_undo_spread(self)
action_unlink_invoice_line(self)
compute_spread_board(self)
create_all_moves(self)
default_get(self, fields)
default_journal(self, company_id)
onchange_template(self)
open_posted_view(self)
reconcile_spread_moves(self)
unlink(self)
company_id
Many2one → res.company
required=True
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/revenue account'
args: 'account.account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.move_id'
invoice_line_id
Many2one → account.move.line
ondelete='cascade'
readonly=True
required=True
args: 'account.move.line'
invoice_type
Selection
compute='_compute_invoice_type'
store=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
store=True
string='Balance sheet account / Spread account'
args: 'account.account'
spread_action_type
Selection
default=_selection_default_spread_action_type
selection=_selection_spread_action_type
spread_id
Many2one → account.spread
domain="[('id', 'in', spread_invoice_type_domain_ids)]"
string='Spread Board'
args: 'account.spread'
spread_invoice_type_domain_ids
One2many → account.spread
compute='_compute_spread_invoice_type_domain'
args: 'account.spread'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
store=True
string='Spread Journal'
args: 'account.journal'
spread_type
Selection
compute='_compute_invoice_type'
store=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
confirm(self)
amount
Float
digits='Account'
required=True
date
Date
required=True
move_id
Many2one → account.move
readonly=True
string='Journal Entry'
args: 'account.move'
name
Char
readonly=True
args: 'Description'
spread_id
Many2one → account.spread
ondelete='cascade'
args: 'account.spread'
create_and_reconcile_moves(self)
create_move(self)
open_move(self)
unlink_move(self)
auto_spread
Boolean
help='If checked, provide option to auto create spread during invoice validation, based on product/account/analytic in invoice line.'
string='Auto assign template on invoice validate'
auto_spread_ids
One2many → account.spread.template.auto
comodel_name='account.spread.template.auto'
inverse_name='template_id'
string='Auto Spread On'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
days_calc
Boolean
default=False
help='Use number of days to calculate amount'
string='Calculate by days'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/Revenue Account'
args: 'account.account'
name
Char
required=True
period_number
Integer
help='Define the number of spread lines'
string='Number of Repetitions'
period_type
Selection
help='Period length for the entries'
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
required=False
store=True
string='Spread Balance Sheet Account'
args: 'account.account'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
required=True
store=True
string='Journal'
args: 'account.journal'
spread_type
Selection
default='sale'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
start_date
Date
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
string='Invoice account as spread account'
default_get(self, fields)
account_id
Many2one → account.account
comodel_name='account.account'
string='Account'
company_id
Many2one
related='template_id.company_id'
store=True
name
Char
default='/'
required=True
product_id
Many2one → product.product
comodel_name='product.product'
string='Product'
template_id
Many2one → account.spread.template
comodel_name='account.spread.template'
index=True
ondelete='cascade'
required=True
string='Spread Template'
No public methods.
allow_spread_planning
Boolean
default=True
help='Disable this option if you do not want to allow the spreading before the invoice is validated.'
auto_archive_spread
Boolean
help='Enable this option if you want the cron job to automatically archive the spreads when all lines are posted.'
args: 'Auto-archive spread'
default_spread_expense_account_id
Many2one → account.account
string='Expense Spread Account'
args: 'account.account'
default_spread_expense_journal_id
Many2one → account.journal
string='Expense Spread Journal'
args: 'account.journal'
default_spread_revenue_account_id
Many2one → account.account
string='Revenue Spread Account'
args: 'account.account'
default_spread_revenue_journal_id
Many2one → account.journal
string='Revenue Spread Journal'
args: 'account.journal'
force_move_auto_post
Boolean
help='Enable this option if you want to post automatically the accounting moves of all the spreads.'
args: 'Auto-post spread lines'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/account-financial-tools |
| GIT | |
| GIT | https://github.com/OCA/account-financial-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/account-financial-tools/tree/15.0/account_spread_cost_revenue |
| VERSION | |
| VERSION | 1.0.1 |
| CATEGORY | |
| CATEGORY | Accounting & Finance |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Onestein |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Onestein |
| COMMITTERS | |
| COMMITTERS | manu, Weblate, OCA-git-bot, oca-ci, Saran440 |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/account-financial-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:46:34 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - account - base_setup - base - web - product - bus - web_tour - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_account_spread |
account.spread | form | New | |
view_account_spread_account_manager |
account.spread | tree | Inherits view_account_spread | |
view_account_spread_invoice_line_link_wizard |
account.spread.invoice.line.link.wizard | form | New | |
view_account_spread_search |
account.spread | search | New | |
view_account_spread_template |
account.spread.template | form | New | |
view_account_spread_template_tree |
account.spread.template | tree | New | |
view_account_spread_tree |
account.spread | tree | New | |
view_company_form |
res.company | xpath | Inherits base.view_company_form | |
view_invoice_spread |
account.move | xpath | Inherits account.view_move_form |
No new fields.
Public methods (2)action_post(self)
button_cancel(self)
spread_check
Selection
compute='_compute_spread_check'
args: [('linked', 'Linked'), ('unlinked', 'Unlinked'), ('unavailable', 'Unavailable')]
spread_id
Many2one → account.spread
copy=False
string='Spread Board'
args: 'account.spread'
create_auto_spread(self)
spread_details(self)
write(self, vals)
account_analytic_id
Many2one → account.analytic.account
string='Analytic Account'
args: 'account.analytic.account'
active
Boolean
default=True
all_posted
Boolean
compute='_compute_all_posted'
store=True
analytic_tag_ids
Many2many → account.analytic.tag
string='Analytic Tags'
args: 'account.analytic.tag'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
credit_account_id
Many2one → account.account
compute='_compute_credit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
currency_id
Many2one → res.currency
default=<expr>
required=True
args: 'res.currency'
days_calc
Boolean
default=False
help='Use number of days to calculate amount'
string='Calculate by days'
debit_account_id
Many2one → account.account
compute='_compute_debit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
display_create_all_moves
Boolean
compute='_compute_display_create_all_moves'
display_move_line_auto_post
Boolean
compute='_compute_display_move_line_auto_post'
string='Display Button Auto-post lines'
display_recompute_buttons
Boolean
compute='_compute_display_recompute_buttons'
estimated_amount
Float
digits='Account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.move_id'
store=True
invoice_line_id
Many2one → account.move.line
compute='_compute_invoice_line'
inverse='_inverse_invoice_line'
store=True
string='Invoice line'
args: 'account.move.line'
invoice_line_ids
One2many → account.move.line
copy=False
string='Invoice Lines'
args: 'account.move.line', 'spread_id'
invoice_type
Selection
required=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
is_credit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
is_debit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
journal_id
Many2one → account.journal
compute='_compute_journal_id'
readonly=False
required=True
store=True
args: 'account.journal'
line_ids
One2many → account.spread.line
string='Spread Lines'
args: 'account.spread.line', 'spread_id'
move_line_auto_post
Boolean
default=True
args: 'Auto-post lines'
name
Char
required=True
period_number
Integer
default=12
help='Define the number of spread lines'
required=True
string='Number of Repetitions'
period_type
Selection
default='month'
help='Period length for the entries'
required=True
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
posted_amount
Float
compute='_compute_amounts'
digits='Account'
spread_date
Date
default=time.strftime('%Y-01-01')
required=True
string='Start Date'
spread_type
Selection
compute='_compute_spread_type'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
total_amount
Float
compute='_compute_amounts'
digits='Account'
unposted_amount
Float
compute='_compute_amounts'
digits='Account'
unspread_amount
Float
compute='_compute_amounts'
digits='Account'
use_invoice_line_account
Boolean
action_recalculate_spread(self)
action_undo_spread(self)
action_unlink_invoice_line(self)
compute_spread_board(self)
create_all_moves(self)
default_get(self, fields)
default_journal(self, company_id)
onchange_template(self)
open_reconcile_view(self)
reconcile_spread_moves(self)
unlink(self)
company_id
Many2one → res.company
required=True
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/revenue account'
args: 'account.account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.move_id'
invoice_line_id
Many2one → account.move.line
ondelete='cascade'
readonly=True
required=True
args: 'account.move.line'
invoice_type
Selection
compute='_compute_invoice_type'
store=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
store=True
string='Balance sheet account / Spread account'
args: 'account.account'
spread_action_type
Selection
default=_selection_default_spread_action_type
selection=_selection_spread_action_type
spread_id
Many2one → account.spread
domain="[('id', 'in', spread_invoice_type_domain_ids)]"
string='Spread Board'
args: 'account.spread'
spread_invoice_type_domain_ids
One2many → account.spread
compute='_compute_spread_invoice_type_domain'
args: 'account.spread'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
store=True
string='Spread Journal'
args: 'account.journal'
spread_type
Selection
compute='_compute_invoice_type'
store=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
confirm(self)
amount
Float
digits='Account'
required=True
date
Date
required=True
move_id
Many2one → account.move
readonly=True
string='Journal Entry'
args: 'account.move'
name
Char
readonly=True
args: 'Description'
spread_id
Many2one → account.spread
ondelete='cascade'
args: 'account.spread'
create_and_reconcile_moves(self)
create_move(self)
open_move(self)
unlink_move(self)
auto_spread
Boolean
help='If checked, provide option to auto create spread during invoice validation, based on product/account/analytic in invoice line.'
string='Auto assign template on invoice validate'
auto_spread_ids
One2many → account.spread.template.auto
comodel_name='account.spread.template.auto'
inverse_name='template_id'
string='Auto Spread On'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
days_calc
Boolean
default=False
help='Use number of days to calculate amount'
string='Calculate by days'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/Revenue Account'
args: 'account.account'
name
Char
required=True
period_number
Integer
help='Define the number of spread lines'
string='Number of Repetitions'
period_type
Selection
help='Period length for the entries'
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
required=False
store=True
string='Spread Balance Sheet Account'
args: 'account.account'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
required=True
store=True
string='Journal'
args: 'account.journal'
spread_type
Selection
default='sale'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
start_date
Date
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
string='Invoice account as spread account'
default_get(self, fields)
account_id
Many2one → account.account
comodel_name='account.account'
string='Account'
analytic_account_id
Many2one → account.analytic.account
comodel_name='account.analytic.account'
string='Analytic'
company_id
Many2one
related='template_id.company_id'
store=True
name
Char
default='/'
required=True
product_id
Many2one → product.product
comodel_name='product.product'
string='Product'
template_id
Many2one → account.spread.template
comodel_name='account.spread.template'
index=True
ondelete='cascade'
required=True
string='Spread Template'
No public methods.
allow_spread_planning
Boolean
default=True
help='Disable this option if you do not want to allow the spreading before the invoice is validated.'
auto_archive_spread
Boolean
help='Enable this option if you want the cron job to automatically archive the spreads when all lines are posted.'
args: 'Auto-archive spread'
default_spread_expense_account_id
Many2one → account.account
string='Expense Spread Account'
args: 'account.account'
default_spread_expense_journal_id
Many2one → account.journal
string='Expense Spread Journal'
args: 'account.journal'
default_spread_revenue_account_id
Many2one → account.account
string='Revenue Spread Account'
args: 'account.account'
default_spread_revenue_journal_id
Many2one → account.journal
string='Revenue Spread Journal'
args: 'account.journal'
force_move_auto_post
Boolean
help='Enable this option if you want to post automatically the accounting moves of all the spreads.'
args: 'Auto-post spread lines'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/account-financial-tools |
| GIT | |
| GIT | https://github.com/OCA/account-financial-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/account-financial-tools/tree/14.0/account_spread_cost_revenue |
| VERSION | |
| VERSION | 1.0.1 |
| CATEGORY | |
| CATEGORY | Accounting & Finance |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Onestein |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Onestein |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, sergiocorato, oca-ci, Saran440 |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/account-financial-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:41:00 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - account - base_setup - base - web - product - bus - web_tour - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
account spread | ir.ui.view | qweb | Inherits web.assets_backend |
view_account_spread |
account.spread | form | New | |
view_account_spread_account_manager |
account.spread | tree | Inherits view_account_spread | |
view_account_spread_invoice_line_link_wizard |
account.spread.invoice.line.link.wizard | form | New | |
view_account_spread_search |
account.spread | search | New | |
view_account_spread_template |
account.spread.template | form | New | |
view_account_spread_template_tree |
account.spread.template | tree | New | |
view_account_spread_tree |
account.spread | tree | New | |
view_company_form |
res.company | xpath | Inherits base.view_company_form | |
view_invoice_spread |
account.move | xpath | Inherits account.view_move_form |
No new fields.
Public methods (2)action_post(self)
button_cancel(self)
spread_check
Selection
compute='_compute_spread_check'
args: [('linked', 'Linked'), ('unlinked', 'Unlinked'), ('unavailable', 'Unavailable')]
spread_id
Many2one → account.spread
copy=False
string='Spread Board'
args: 'account.spread'
create_auto_spread(self)
spread_details(self)
write(self, vals)
account_analytic_id
Many2one → account.analytic.account
string='Analytic Account'
args: 'account.analytic.account'
active
Boolean
default=True
all_posted
Boolean
compute='_compute_all_posted'
store=True
analytic_tag_ids
Many2many → account.analytic.tag
string='Analytic Tags'
args: 'account.analytic.tag'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
credit_account_id
Many2one → account.account
compute='_compute_credit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
currency_id
Many2one → res.currency
default=<expr>
required=True
args: 'res.currency'
debit_account_id
Many2one → account.account
compute='_compute_debit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
display_create_all_moves
Boolean
compute='_compute_display_create_all_moves'
display_move_line_auto_post
Boolean
compute='_compute_display_move_line_auto_post'
string='Display Button Auto-post lines'
display_recompute_buttons
Boolean
compute='_compute_display_recompute_buttons'
estimated_amount
Float
digits='Account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.move_id'
store=True
invoice_line_id
Many2one → account.move.line
compute='_compute_invoice_line'
inverse='_inverse_invoice_line'
store=True
string='Invoice line'
args: 'account.move.line'
invoice_line_ids
One2many → account.move.line
copy=False
string='Invoice Lines'
args: 'account.move.line', 'spread_id'
invoice_type
Selection
required=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
is_credit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
is_debit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
journal_id
Many2one → account.journal
compute='_compute_journal_id'
readonly=False
required=True
store=True
args: 'account.journal'
line_ids
One2many → account.spread.line
string='Spread Lines'
args: 'account.spread.line', 'spread_id'
move_line_auto_post
Boolean
default=True
args: 'Auto-post lines'
name
Char
required=True
period_number
Integer
default=12
help='Define the number of spread lines'
required=True
string='Number of Repetitions'
period_type
Selection
default='month'
help='Period length for the entries'
required=True
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
posted_amount
Float
compute='_compute_amounts'
digits='Account'
spread_date
Date
default=time.strftime('%Y-01-01')
required=True
string='Start Date'
spread_type
Selection
compute='_compute_spread_type'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
total_amount
Float
compute='_compute_amounts'
digits='Account'
unposted_amount
Float
compute='_compute_amounts'
digits='Account'
unspread_amount
Float
compute='_compute_amounts'
digits='Account'
use_invoice_line_account
Boolean
action_recalculate_spread(self)
action_undo_spread(self)
action_unlink_invoice_line(self)
compute_spread_board(self)
create_all_moves(self)
default_get(self, fields)
default_journal(self, company_id)
onchange_template(self)
open_reconcile_view(self)
reconcile_spread_moves(self)
unlink(self)
company_id
Many2one → res.company
required=True
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/revenue account'
args: 'account.account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.move_id'
invoice_line_id
Many2one → account.move.line
ondelete='cascade'
readonly=True
required=True
args: 'account.move.line'
invoice_type
Selection
compute='_compute_invoice_type'
store=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
store=True
string='Balance sheet account / Spread account'
args: 'account.account'
spread_action_type
Selection
default=_selection_default_spread_action_type
selection=_selection_spread_action_type
spread_id
Many2one → account.spread
domain="[('id', 'in', spread_invoice_type_domain_ids)]"
string='Spread Board'
args: 'account.spread'
spread_invoice_type_domain_ids
One2many → account.spread
compute='_compute_spread_invoice_type_domain'
args: 'account.spread'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
store=True
string='Spread Journal'
args: 'account.journal'
spread_type
Selection
compute='_compute_invoice_type'
store=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
confirm(self)
amount
Float
digits='Account'
required=True
date
Date
required=True
move_id
Many2one → account.move
readonly=True
string='Journal Entry'
args: 'account.move'
name
Char
readonly=True
args: 'Description'
spread_id
Many2one → account.spread
ondelete='cascade'
args: 'account.spread'
create_and_reconcile_moves(self)
create_move(self)
open_move(self)
unlink_move(self)
auto_spread
Boolean
help='If checked, provide option to auto create spread during invoice validation, based on product/account/analytic in invoice line.'
string='Auto assign template on invoice validate'
auto_spread_ids
One2many → account.spread.template.auto
comodel_name='account.spread.template.auto'
inverse_name='template_id'
string='Auto Spread On'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/Revenue Account'
args: 'account.account'
name
Char
required=True
period_number
Integer
help='Define the number of spread lines'
string='Number of Repetitions'
period_type
Selection
help='Period length for the entries'
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
required=False
store=True
string='Spread Balance Sheet Account'
args: 'account.account'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
required=True
store=True
string='Journal'
args: 'account.journal'
spread_type
Selection
default='sale'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
start_date
Date
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
string='Invoice account as spread account'
default_get(self, fields)
account_id
Many2one → account.account
comodel_name='account.account'
string='Account'
analytic_account_id
Many2one → account.analytic.account
comodel_name='account.analytic.account'
string='Analytic'
company_id
Many2one
related='template_id.company_id'
store=True
name
Char
default='/'
required=True
product_id
Many2one → product.product
comodel_name='product.product'
string='Product'
template_id
Many2one → account.spread.template
comodel_name='account.spread.template'
index=True
ondelete='cascade'
required=True
string='Spread Template'
No public methods.
allow_spread_planning
Boolean
default=True
help='Disable this option if you do not want to allow the spreading before the invoice is validated.'
auto_archive_spread
Boolean
help='Enable this option if you want the cron job to automatically archive the spreads when all lines are posted.'
args: 'Auto-archive spread'
default_spread_expense_account_id
Many2one → account.account
string='Expense Spread Account'
args: 'account.account'
default_spread_expense_journal_id
Many2one → account.journal
string='Expense Spread Journal'
args: 'account.journal'
default_spread_revenue_account_id
Many2one → account.account
string='Revenue Spread Account'
args: 'account.account'
default_spread_revenue_journal_id
Many2one → account.journal
string='Revenue Spread Journal'
args: 'account.journal'
force_move_auto_post
Boolean
help='Enable this option if you want to post automatically the accounting moves of all the spreads.'
args: 'Auto-post spread lines'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/account-financial-tools |
| GIT | |
| GIT | https://github.com/OCA/account-financial-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/account-financial-tools/tree/13.0/account_spread_cost_revenue |
| VERSION | |
| VERSION | 1.0.1 |
| CATEGORY | |
| CATEGORY | Accounting & Finance |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Onestein |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Onestein |
| COMMITTERS | |
| COMMITTERS | Andrea, Víctor Martínez, João Marques, oca-travis, Weblate, OCA-git-bot |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/account-financial-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:34:13 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - account - base_setup - base - web - product - bus - web_tour - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
account spread | ir.ui.view | qweb | Inherits web.assets_backend |
view_account_spread |
account.spread | form | New | |
view_account_spread_account_manager |
account.spread | tree | Inherits view_account_spread | |
view_account_spread_invoice_line_link_wizard |
account.spread.invoice.line.link.wizard | form | New | |
view_account_spread_search |
account.spread | search | New | |
view_account_spread_template |
account.spread.template | form | New | |
view_account_spread_template_tree |
account.spread.template | tree | New | |
view_account_spread_tree |
account.spread | tree | New | |
view_company_form |
res.company | xpath | Inherits base.view_company_form | |
view_invoice_spread |
account.move | xpath | Inherits account.view_move_form |
No new fields.
Public methods (2)action_post(self)
button_cancel(self)
spread_check
Selection
compute='_compute_spread_check'
args: [('linked', 'Linked'), ('unlinked', 'Unlinked'), ('unavailable', 'Unavailable')]
spread_id
Many2one → account.spread
copy=False
string='Spread Board'
args: 'account.spread'
create_auto_spread(self)
spread_details(self)
write(self, vals)
account_analytic_id
Many2one → account.analytic.account
string='Analytic Account'
args: 'account.analytic.account'
active
Boolean
default=True
all_posted
Boolean
compute='_compute_all_posted'
store=True
analytic_tag_ids
Many2many → account.analytic.tag
string='Analytic Tags'
args: 'account.analytic.tag'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
credit_account_id
Many2one → account.account
compute='_compute_credit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
currency_id
Many2one → res.currency
default=<expr>
required=True
args: 'res.currency'
debit_account_id
Many2one → account.account
compute='_compute_debit_account_id'
readonly=False
required=True
store=True
args: 'account.account'
display_create_all_moves
Boolean
compute='_compute_display_create_all_moves'
display_move_line_auto_post
Boolean
compute='_compute_display_move_line_auto_post'
string='Display Button Auto-post lines'
display_recompute_buttons
Boolean
compute='_compute_display_recompute_buttons'
estimated_amount
Float
digits='Account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.move_id'
store=True
invoice_line_id
Many2one → account.move.line
compute='_compute_invoice_line'
inverse='_inverse_invoice_line'
store=True
string='Invoice line'
args: 'account.move.line'
invoice_line_ids
One2many → account.move.line
copy=False
string='Invoice Lines'
args: 'account.move.line', 'spread_id'
invoice_type
Selection
required=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
is_credit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
is_debit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
journal_id
Many2one → account.journal
compute='_compute_journal_id'
readonly=False
required=True
store=True
args: 'account.journal'
line_ids
One2many → account.spread.line
string='Spread Lines'
args: 'account.spread.line', 'spread_id'
move_line_auto_post
Boolean
default=True
args: 'Auto-post lines'
name
Char
required=True
period_number
Integer
default=12
help='Define the number of spread lines'
required=True
string='Number of Repetitions'
period_type
Selection
default='month'
help='Period length for the entries'
required=True
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
posted_amount
Float
compute='_compute_amounts'
digits='Account'
spread_date
Date
default=time.strftime('%Y-01-01')
required=True
string='Start Date'
spread_type
Selection
compute='_compute_spread_type'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
total_amount
Float
compute='_compute_amounts'
digits='Account'
unposted_amount
Float
compute='_compute_amounts'
digits='Account'
unspread_amount
Float
compute='_compute_amounts'
digits='Account'
use_invoice_line_account
Boolean
action_recalculate_spread(self)
action_undo_spread(self)
action_unlink_invoice_line(self)
compute_spread_board(self)
create_all_moves(self)
default_get(self, fields)
default_journal(self, company_id)
onchange_template(self)
open_reconcile_view(self)
reconcile_spread_moves(self)
unlink(self)
company_id
Many2one → res.company
required=True
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/revenue account'
args: 'account.account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.move_id'
invoice_line_id
Many2one → account.move.line
ondelete='cascade'
readonly=True
required=True
args: 'account.move.line'
invoice_type
Selection
compute='_compute_invoice_type'
store=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
store=True
string='Balance sheet account / Spread account'
args: 'account.account'
spread_action_type
Selection
default=_selection_default_spread_action_type
selection=_selection_spread_action_type
spread_id
Many2one → account.spread
domain="[('id', 'in', spread_invoice_type_domain_ids)]"
string='Spread Board'
args: 'account.spread'
spread_invoice_type_domain_ids
One2many → account.spread
compute='_compute_spread_invoice_type_domain'
args: 'account.spread'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
store=True
string='Spread Journal'
args: 'account.journal'
spread_type
Selection
compute='_compute_invoice_type'
store=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
confirm(self)
amount
Float
digits='Account'
required=True
date
Date
required=True
move_id
Many2one → account.move
readonly=True
string='Journal Entry'
args: 'account.move'
name
Char
readonly=True
args: 'Description'
spread_id
Many2one → account.spread
ondelete='cascade'
args: 'account.spread'
create_and_reconcile_moves(self)
create_move(self)
open_move(self)
unlink_move(self)
auto_spread
Boolean
help='If checked, provide option to auto create spread during invoice validation, based on product/account/analytic in invoice line.'
string='Auto assign template on invoice validate'
auto_spread_ids
One2many → account.spread.template.auto
comodel_name='account.spread.template.auto'
inverse_name='template_id'
string='Auto Spread On'
company_id
Many2one → res.company
default=<expr>
required=True
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/Revenue Account'
args: 'account.account'
name
Char
required=True
period_number
Integer
help='Define the number of spread lines'
string='Number of Repetitions'
period_type
Selection
help='Period length for the entries'
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
spread_account_id
Many2one → account.account
compute='_compute_spread_account'
readonly=False
required=False
store=True
string='Spread Balance Sheet Account'
args: 'account.account'
spread_journal_id
Many2one → account.journal
compute='_compute_spread_journal'
readonly=False
required=True
store=True
string='Journal'
args: 'account.journal'
spread_type
Selection
default='sale'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
start_date
Date
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
string='Invoice account as spread account'
default_get(self, fields)
account_id
Many2one → account.account
comodel_name='account.account'
string='Account'
analytic_account_id
Many2one → account.analytic.account
comodel_name='account.analytic.account'
string='Analytic'
company_id
Many2one
related='template_id.company_id'
store=True
name
Char
default='/'
required=True
product_id
Many2one → product.product
comodel_name='product.product'
string='Product'
template_id
Many2one → account.spread.template
comodel_name='account.spread.template'
index=True
ondelete='cascade'
required=True
string='Spread Template'
No public methods.
allow_spread_planning
Boolean
default=True
help='Disable this option if you do not want to allow the spreading before the invoice is validated.'
auto_archive_spread
Boolean
help='Enable this option if you want the cron job to automatically archive the spreads when all lines are posted.'
args: 'Auto-archive spread'
default_spread_expense_account_id
Many2one → account.account
string='Expense Spread Account'
args: 'account.account'
default_spread_expense_journal_id
Many2one → account.journal
string='Expense Spread Journal'
args: 'account.journal'
default_spread_revenue_account_id
Many2one → account.account
string='Revenue Spread Account'
args: 'account.account'
default_spread_revenue_journal_id
Many2one → account.journal
string='Revenue Spread Journal'
args: 'account.journal'
force_move_auto_post
Boolean
help='Enable this option if you want to post automatically the accounting moves of all the spreads.'
args: 'Auto-post spread lines'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/account-financial-tools |
| GIT | |
| GIT | https://github.com/OCA/account-financial-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/account-financial-tools/tree/12.0/account_spread_cost_revenue |
| VERSION | |
| VERSION | 1.2.1 |
| CATEGORY | |
| CATEGORY | Accounting & Finance |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Onestein |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Onestein |
| COMMITTERS | |
| COMMITTERS | GitHub, Andrea, OCA Transbot, oca-travis, Weblate, OCA-git-bot, sergiocorato, antonio, Kitti U |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/account-financial-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:29:18 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - account - base_setup - base - web - product - decimal_precision - bus - web_tour - uom - analytic - portal - http_routing - digest |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
account spread | ir.ui.view | qweb | Inherits web.assets_backend |
view_account_spread |
account.spread | form | New | |
view_account_spread_account_manager |
account.spread | tree | Inherits view_account_spread | |
view_account_spread_invoice_line_link_wizard |
account.spread.invoice.line.link.wizard | form | New | |
view_account_spread_search |
account.spread | search | New | |
view_account_spread_template |
account.spread.template | form | New | |
view_account_spread_template_tree |
account.spread.template | tree | New | |
view_account_spread_tree |
account.spread | tree | New | |
view_company_form |
res.company | xpath | Inherits base.view_company_form | |
view_customer_invoice_spread |
account.invoice | xpath | Inherits account.invoice_form | |
view_supplier_invoice_spread |
account.invoice | xpath | Inherits account.invoice_supplier_form |
No new fields.
Public methods (4)action_cancel(self)
action_invoice_open(self)
action_move_create(self)
invoice_line_move_line_get(self)
spread_check
Selection
compute='_compute_spread_check'
args: [('linked', 'Linked'), ('unlinked', 'Unlinked'), ('unavailable', 'Unavailable')]
spread_id
Many2one → account.spread
copy=False
string='Spread Board'
args: 'account.spread'
create_auto_spread(self)
spread_details(self)
account_analytic_id
Many2one → account.analytic.account
string='Analytic Account'
args: 'account.analytic.account'
active
Boolean
default=True
all_posted
Boolean
compute='_compute_amounts'
store=True
analytic_tag_ids
Many2many → account.analytic.tag
string='Analytic Tags'
args: 'account.analytic.tag'
company_id
Many2one → res.company
default=<expr>
required=True
string='Company'
args: 'res.company'
credit_account_id
Many2one → account.account
required=True
string='Credit Account'
args: 'account.account'
currency_id
Many2one → res.currency
default=<expr>
required=True
string='Currency'
args: 'res.currency'
debit_account_id
Many2one → account.account
required=True
string='Debit Account'
args: 'account.account'
display_create_all_moves
Boolean
compute='_compute_display_create_all_moves'
string='Display Button All Moves'
display_move_line_auto_post
Boolean
compute='_compute_display_move_line_auto_post'
string='Display Button Auto-post lines'
display_recompute_buttons
Boolean
compute='_compute_display_recompute_buttons'
string='Display Buttons Recompute'
estimated_amount
Float
digits=dp.get_precision('Account')
invoice_id
Many2one
readonly=True
related='invoice_line_id.invoice_id'
store=True
string='Invoice'
invoice_line_id
Many2one → account.invoice.line
compute='_compute_invoice_line'
inverse='_inverse_invoice_line'
store=True
string='Invoice line'
args: 'account.invoice.line'
invoice_line_ids
One2many → account.invoice.line
copy=False
string='Invoice Lines'
args: 'account.invoice.line', 'spread_id'
invoice_type
Selection
required=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
is_credit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
is_debit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
journal_id
Many2one → account.journal
required=True
string='Journal'
args: 'account.journal'
line_ids
One2many → account.spread.line
string='Spread Lines'
args: 'account.spread.line', 'spread_id'
move_line_auto_post
Boolean
default=True
args: 'Auto-post lines'
name
Char
required=True
period_number
Integer
default=12
help='Define the number of spread lines'
required=True
string='Number of Repetitions'
period_type
Selection
default='month'
help='Period length for the entries'
required=True
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
posted_amount
Float
compute='_compute_amounts'
digits=dp.get_precision('Account')
spread_date
Date
default=time.strftime('%Y-01-01')
required=True
string='Start Date'
spread_type
Selection
compute='_compute_spread_type'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
total_amount
Float
compute='_compute_amounts'
digits=dp.get_precision('Account')
unposted_amount
Float
compute='_compute_amounts'
digits=dp.get_precision('Account')
unspread_amount
Float
compute='_compute_amounts'
digits=dp.get_precision('Account')
use_invoice_line_account
Boolean
string="Use invoice line's account"
action_recalculate_spread(self)
action_undo_spread(self)
action_unlink_invoice_line(self)
compute_spread_board(self)
create_all_moves(self)
default_get(self, fields)
onchange_invoice_type(self)
onchange_template(self)
open_reconcile_view(self)
reconcile_spread_moves(self)
unlink(self)
company_id
Many2one → res.company
required=True
string='Company'
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/revenue account'
args: 'account.account'
invoice_id
Many2one
readonly=True
related='invoice_line_id.invoice_id'
invoice_line_id
Many2one → account.invoice.line
ondelete='cascade'
readonly=True
required=True
string='Invoice Line'
args: 'account.invoice.line'
invoice_type
Selection
compute='_compute_invoice_type'
store=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
spread_account_id
Many2one → account.account
store=True
string='Balance sheet account / Spread account'
args: 'account.account'
spread_action_type
Selection
default=_selection_default_spread_action_type
selection=_selection_spread_action_type
spread_id
Many2one → account.spread
string='Spread Board'
args: 'account.spread'
spread_journal_id
Many2one → account.journal
store=True
string='Spread Journal'
args: 'account.journal'
spread_type
Selection
compute='_compute_invoice_type'
store=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
string="Use invoice line's account"
confirm(self)
onchange_invoice_type(self)
amount
Float
digits=dp.get_precision('Account')
required=True
date
Date
required=True
move_id
Many2one → account.move
readonly=True
string='Journal Entry'
args: 'account.move'
name
Char
readonly=True
args: 'Description'
spread_id
Many2one → account.spread
ondelete='cascade'
string='Spread Board'
args: 'account.spread'
create_and_reconcile_moves(self)
create_move(self)
open_move(self)
unlink_move(self)
auto_spread
Boolean
help='If checked, provide option to auto create spread during invoice validation, based on product/account/analytic in invoice line.'
string='Auto assign template on invoice validate'
auto_spread_ids
One2many → account.spread.template.auto
comodel_name='account.spread.template.auto'
inverse_name='template_id'
string='Auto Spread On'
company_id
Many2one → res.company
default=<expr>
required=True
string='Company'
args: 'res.company'
exp_rev_account_id
Many2one → account.account
help='Optional account to overwrite the existing expense/revenue account'
string='Expense/Revenue Account'
args: 'account.account'
name
Char
required=True
period_number
Integer
help='Define the number of spread lines'
string='Number of Repetitions'
period_type
Selection
help='Period length for the entries'
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
spread_account_id
Many2one → account.account
required=False
string='Spread Balance Sheet Account'
args: 'account.account'
spread_journal_id
Many2one → account.journal
required=True
string='Journal'
args: 'account.journal'
spread_type
Selection
default='sale'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
start_date
Date
use_invoice_line_account
Boolean
help="Use invoice line's account as Balance sheet / spread account.\nIn this case, user need to select expense/revenue account too."
string='Invoice account as spread account'
default_get(self, fields)
onchange_spread_type(self)
account_id
Many2one → account.account
comodel_name='account.account'
string='Account'
analytic_account_id
Many2one → account.analytic.account
comodel_name='account.analytic.account'
string='Analytic'
company_id
Many2one
related='template_id.company_id'
store=True
name
Char
default='/'
required=True
product_id
Many2one → product.product
comodel_name='product.product'
string='Product'
template_id
Many2one → account.spread.template
comodel_name='account.spread.template'
index=True
ondelete='cascade'
required=True
string='Spread Template'
No public methods.
allow_spread_planning
Boolean
default=True
help='Disable this option if you do not want to allow the spreading before the invoice is validated.'
auto_archive
Boolean
help='Enable this option if you want the cron job to automatically archive the spreads when all lines are posted.'
args: 'Auto-archive spread'
default_spread_expense_account_id
Many2one → account.account
string='Expense Spread Account'
args: 'account.account'
default_spread_expense_journal_id
Many2one → account.journal
string='Expense Spread Journal'
args: 'account.journal'
default_spread_revenue_account_id
Many2one → account.account
string='Revenue Spread Account'
args: 'account.account'
default_spread_revenue_journal_id
Many2one → account.journal
string='Revenue Spread Journal'
args: 'account.journal'
force_move_auto_post
Boolean
help='Enable this option if you want to post automatically the accounting moves of all the spreads.'
args: 'Auto-post spread lines'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/account-financial-tools |
| GIT | |
| GIT | https://github.com/OCA/account-financial-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/account-financial-tools/tree/11.0/account_spread_cost_revenue |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Accounting & Finance |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Onestein |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Onestein |
| COMMITTERS | |
| COMMITTERS | Andrea, OCA Transbot, oca-travis, OCA-git-bot |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/account-financial-tools/ |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:23:58 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - account - base_setup - base - web - product - decimal_precision - bus - web_tour - analytic - web_planner - portal - http_routing |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
account spread | ir.ui.view | qweb | Inherits web.assets_backend |
view_account_spread |
account.spread | form | New | |
view_account_spread_account_manager |
account.spread | tree | Inherits view_account_spread | |
view_account_spread_invoice_line_link_wizard |
account.spread.invoice.line.link.wizard | form | New | |
view_account_spread_search |
account.spread | search | New | |
view_account_spread_template |
account.spread.template | form | New | |
view_account_spread_template_tree |
account.spread.template | tree | New | |
view_account_spread_tree |
account.spread | tree | New | |
view_company_form |
res.company | xpath | Inherits base.view_company_form | |
view_customer_invoice_spread |
account.invoice | xpath | Inherits account.invoice_form | |
view_supplier_invoice_spread |
account.invoice | xpath | Inherits account.invoice_supplier_form |
No new fields.
Public methods (3)action_cancel(self)
action_move_create(self)
invoice_line_move_line_get(self)
spread_check
Selection
compute='_compute_spread_check'
args: [('linked', 'Linked'), ('unlinked', 'Unlinked'), ('unavailable', 'Unavailable')]
spread_id
Many2one → account.spread
copy=False
string='Spread Board'
args: 'account.spread'
spread_details(self)
account_analytic_id
Many2one → account.analytic.account
string='Analytic Account'
args: 'account.analytic.account'
active
Boolean
default=True
all_posted
Boolean
compute='_compute_amounts'
store=True
analytic_tag_ids
Many2many → account.analytic.tag
string='Analytic Tags'
args: 'account.analytic.tag'
company_id
Many2one → res.company
default=<expr>
required=True
string='Company'
args: 'res.company'
credit_account_id
Many2one → account.account
required=True
string='Credit Account'
args: 'account.account'
currency_id
Many2one → res.currency
default=<expr>
required=True
string='Currency'
args: 'res.currency'
debit_account_id
Many2one → account.account
required=True
string='Debit Account'
args: 'account.account'
display_create_all_moves
Boolean
compute='_compute_display_create_all_moves'
string='Display Button All Moves'
display_move_line_auto_post
Boolean
compute='_compute_display_move_line_auto_post'
string='Display Button Auto-post lines'
display_recompute_buttons
Boolean
compute='_compute_display_recompute_buttons'
string='Display Buttons Recompute'
estimated_amount
Float
digits=dp.get_precision('Account')
invoice_id
Many2one
readonly=True
related='invoice_line_id.invoice_id'
store=True
string='Invoice'
invoice_line_id
Many2one → account.invoice.line
compute='_compute_invoice_line'
inverse='_inverse_invoice_line'
store=True
string='Invoice line'
args: 'account.invoice.line'
invoice_line_ids
One2many → account.invoice.line
copy=False
string='Invoice Lines'
args: 'account.invoice.line', 'spread_id'
invoice_type
Selection
required=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
is_credit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
is_debit_account_deprecated
Boolean
compute='_compute_deprecated_accounts'
journal_id
Many2one → account.journal
required=True
string='Journal'
args: 'account.journal'
line_ids
One2many → account.spread.line
string='Spread Lines'
args: 'account.spread.line', 'spread_id'
move_line_auto_post
Boolean
default=True
args: 'Auto-post lines'
name
Char
required=True
period_number
Integer
default=12
help='Define the number of spread lines'
required=True
string='Number of Repetitions'
period_type
Selection
default='month'
help='Period length for the entries'
required=True
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
posted_amount
Float
compute='_compute_amounts'
digits=dp.get_precision('Account')
spread_date
Date
default=time.strftime('%Y-01-01')
required=True
string='Start Date'
spread_type
Selection
compute='_compute_spread_type'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
total_amount
Float
compute='_compute_amounts'
digits=dp.get_precision('Account')
unposted_amount
Float
compute='_compute_amounts'
digits=dp.get_precision('Account')
unspread_amount
Float
compute='_compute_amounts'
digits=dp.get_precision('Account')
action_recalculate_spread(self)
action_undo_spread(self)
action_unlink_invoice_line(self)
compute_spread_board(self)
create_all_moves(self)
default_get(self, fields)
onchange_invoice_type(self)
onchange_template(self)
open_reconcile_view(self)
reconcile_spread_moves(self)
unlink(self)
company_id
Many2one → res.company
required=True
string='Company'
args: 'res.company'
invoice_id
Many2one
readonly=True
related='invoice_line_id.invoice_id'
invoice_line_id
Many2one → account.invoice.line
ondelete='cascade'
readonly=True
required=True
string='Invoice Line'
args: 'account.invoice.line'
invoice_type
Selection
compute='_compute_invoice_type'
store=True
args: [('out_invoice', 'Customer Invoice'), ('in_invoice', 'Vendor Bill'), ('out_refund', 'Customer Credit Note'), ('in_refund', 'Vendor Credit Note')]
spread_account_id
Many2one → account.account
store=True
string='Balance sheet account / Spread account'
args: 'account.account'
spread_action_type
Selection
default=_selection_default_spread_action_type
selection=_selection_spread_action_type
spread_id
Many2one → account.spread
string='Spread Board'
args: 'account.spread'
spread_journal_id
Many2one → account.journal
store=True
string='Spread Journal'
args: 'account.journal'
spread_type
Selection
compute='_compute_invoice_type'
store=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
template_id
Many2one → account.spread.template
string='Spread Template'
args: 'account.spread.template'
confirm(self)
onchange_invoice_type(self)
amount
Float
digits=dp.get_precision('Account')
required=True
date
Date
required=True
move_id
Many2one → account.move
readonly=True
string='Journal Entry'
args: 'account.move'
name
Char
readonly=True
args: 'Description'
spread_id
Many2one → account.spread
ondelete='cascade'
string='Spread Board'
args: 'account.spread'
create_and_reconcile_moves(self)
create_move(self)
open_move(self)
unlink_move(self)
company_id
Many2one → res.company
default=<expr>
required=True
string='Company'
args: 'res.company'
name
Char
required=True
period_number
Integer
help='Define the number of spread lines'
string='Number of Repetitions'
period_type
Selection
help='Period length for the entries'
args: [('month', 'Month'), ('quarter', 'Quarter'), ('year', 'Year')]
spread_account_id
Many2one → account.account
required=True
string='Spread Balance Sheet Account'
args: 'account.account'
spread_journal_id
Many2one → account.journal
required=True
string='Journal'
args: 'account.journal'
spread_type
Selection
default='sale'
required=True
args: [('sale', 'Customer'), ('purchase', 'Supplier')]
start_date
Date
default_get(self, fields)
onchange_spread_type(self)
allow_spread_planning
Boolean
default=True
help='Disable this option if you do not want to allow the spreading before the invoice is validated.'
auto_archive
Boolean
help='Enable this option if you want the cron job to automatically archive the spreads when all lines are posted.'
args: 'Auto-archive spread'
default_spread_expense_account_id
Many2one → account.account
string='Expense Spread Account'
args: 'account.account'
default_spread_expense_journal_id
Many2one → account.journal
string='Expense Spread Journal'
args: 'account.journal'
default_spread_revenue_account_id
Many2one → account.account
string='Revenue Spread Account'
args: 'account.account'
default_spread_revenue_journal_id
Many2one → account.journal
string='Revenue Spread Journal'
args: 'account.journal'
force_move_auto_post
Boolean
help='Enable this option if you want to post automatically the accounting moves of all the spreads.'
args: 'Auto-post spread lines'
No public methods.
| STATUS | |
|---|---|
| STATUS | Open migration PR - not merged yet for this version |
| REPOSITORY | |
| REPOSITORY | OCA/account-financial-tools |
| PULL REQUEST | |
| PULL REQUEST | [19.0][MIG] account_spread_cost_revenue: Migration to 19.0 (#2208) |