Account commissions OCA

account_commission_oca
REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/19.0/account_commission_oca
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, arantxa-s73, Pablo Cortés
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/commission:
    - commission_oca
odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - html_editor
    - uom
    - analytic
    - portal
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds the function to calculate commissions in invoices
(account moves).

It also allows to create vendor bills from settlements for external
agents.

This module depends on the commission module.

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
commission_form commissions form commission xpath Inherits commission_oca.commission_form
commission_make_invoice_form Make invoices commission.make.invoice form New
invoice_line_agent_tree account.invoice.line.agent list New
report_settlement_document report_settlement_document ir.ui.view qweb Inherits commission_oca.report_settlement_document
view_account_invoice_filter_agent view_account_invoice_filter_agent account.move field Inherits account.view_account_invoice_filter
view_in_invoice_bill_tree_inherit account.out.invoice.list account.move field Inherits account.view_in_invoice_bill_tree
view_invoice_commission_analysis_graph invoice.commission.analysis.graph invoice.commission.analysis.report graph New
view_invoice_commission_analysis_pivot invoice.commission.analysis.pivot invoice.commission.analysis.report pivot New
view_invoice_commission_analysis_search invoice.commission.analysis.search invoice.commission.analysis.report search New
view_move_form account.invoice.form.agent account.move xpath Inherits account.view_move_form
view_move_line_form account.move.line xpath Inherits account.view_move_line_form
view_settlement_form Settlements - Add invoice stuff commission.settlement button Inherits commission_oca.view_settlement_form
view_settlement_line_tree_inherit Settlement lines commission.settlement.line xpath Inherits commission_oca.view_settlement_line_tree
view_settlement_tree Settlements list - Invoice decoration commission.settlement list Inherits commission_oca.view_settlement_tree
Models touched (9)

New fields (7)
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company' store=True
  • currency_id Many2one
    related='object_id.currency_id'
  • invoice_date Date
    readonly=True related='invoice_id.invoice_date' store=True string='Invoice date'
  • invoice_id Many2one → account.move
    comodel_name='account.move' related='object_id.move_id' store=True string='Invoice'
  • object_id Many2one → account.move.line
    comodel_name='account.move.line'
  • settled Boolean
    compute='_compute_settled' store=True
  • settlement_line_ids One2many → commission.settlement.line
    comodel_name='commission.settlement.line' inverse_name='invoice_agent_line_id'
Public methods (0)

No public methods.

New fields (4)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
  • partner_agent_ids Many2many → res.partner
    comodel_name='res.partner' compute='_compute_agents' search='_search_agents' string='Agents'
  • settlement_count Integer
    compute='_compute_settlement'
  • settlement_ids One2many → commission.settlement
    compute='_compute_settlement' string='Settlements' args: 'commission.settlement'
Public methods (5)
  • action_post(self)
    Put settlements associated to the invoices in invoiced state.
  • action_view_settlement(self)
  • button_cancel(self)
    Check settled lines and put settlements associated to the invoices in exception.
  • recompute_lines_agents(self)
  • unlink(self)
    Put 'invoiced' settlements associated to the invoices back in settled state.

New fields (3)
  • agent_ids One2many → account.invoice.line.agent
    comodel_name='account.invoice.line.agent'
  • any_settled Boolean
    compute='_compute_any_settled'
  • settlement_id Many2one → commission.settlement
    comodel_name='commission.settlement' copy=False help='Settlement that generates this invoice line'
Public methods (0)

No public methods.

New fields (1)
  • invoice_state Selection
    default='open' help="Select the invoice status for settling the commissions:\n* 'Invoice Based': Commissions are settled when the invoice is issued.\n* 'Payment Based': Commissions are settled when the invoice is paid." string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one → res.company
    comodel_name='res.company' readonly=True related='journal_id.company_id'
  • date Date
    default=fields.Date.context_today
  • from_settlement Boolean
    default=<expr>
  • grouped Boolean
    string='Group invoices'
  • journal_id Many2one → account.journal
    comodel_name='account.journal' default=<expr> domain="[('type', '=', 'purchase')]" required=True
  • product_id Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • settlement_ids Many2many → commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='commission.settlement' default=<expr> domain="[('state', '=', 'settled'),('agent_type', '=', 'agent'),('company_id', '=', company_id)]" relation='commission_make_invoice_settlement_rel'
Public methods (1)
  • button_create(self)

New fields (1)
  • settlement_type Selection
    ondelete={'sale_invoice': 'cascade'} selection_add=[('sale_invoice', 'Sales Invoices')]
Public methods (0)

No public methods.

New fields (4)
  • invoice_id Many2one → account.move
    comodel_name='account.move' compute='_compute_invoice_id' store=True string='Generated Invoice'
  • invoice_line_ids One2many → account.move.line
    comodel_name='account.move.line' inverse_name='settlement_id' readonly=True string='Generated invoice lines'
  • settlement_type Selection
    ondelete={'sale_invoice': 'set default'} selection_add=[('sale_invoice', 'Sales Invoices')]
  • state Selection
    ondelete={'invoiced': 'set default', 'except_invoice': 'set default'} selection_add=[('invoiced', 'Invoiced'), ('except_invoice', 'Invoice exception')]
Public methods (5)
  • action_cancel(self)
    Check if any settlement has been invoiced.
  • action_draft(self)
  • action_invoice(self)
  • make_invoices(self, journal, product, date=False, grouped=False)
  • unlink(self)

New fields (2)
  • invoice_agent_line_id Many2one → account.invoice.line.agent
    comodel_name='account.invoice.line.agent'
  • invoice_line_id Many2one → account.move.line
    comodel_name='account.move.line' related='invoice_agent_line_id.object_id' store=True string='Source invoice line'
Public methods (0)

No public methods.

New fields (17)
  • agent_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • amount Float
    readonly=True
  • balance Float
    readonly=True
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Category of Product'
  • commission_id Many2one → commission
    readonly=True args: 'commission', 'Commission'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_invoice Date
    readonly=True args: 'Invoice Date'
  • invoice_line_id Many2one → account.move.line
    readonly=True args: 'account.move.line'
  • invoice_state Selection
    readonly=True selection='_get_selection_invoice_state' string='Invoice Status'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • percentage Integer
    readonly=True args: 'Percentage of commission'
  • price_subtotal Float
    readonly=True args: 'Subtotal'
  • price_unit Float
    readonly=True args: 'Unit Price'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • quantity Float
    readonly=True args: '# of Qty'
  • settled Boolean
    readonly=True
  • uom_id Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
Public methods (1)
  • init(self)
    @api.model
REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/18.0/account_commission_oca
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSales Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSJordiMForgeFlow, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/commission:
    - commission_oca
odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - 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
This module adds the function to calculate commissions in invoices
(account moves).

It also allows to create vendor bills from settlements for external
agents.

This module depends on the commission module.

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
commission_form commissions form commission xpath Inherits commission_oca.commission_form
commission_make_invoice_form Make invoices commission.make.invoice form New
invoice_line_agent_tree account.invoice.line.agent list New
report_settlement_document report_settlement_document ir.ui.view qweb Inherits commission_oca.report_settlement_document
view_account_invoice_filter_agent view_account_invoice_filter_agent account.move field Inherits account.view_account_invoice_filter
view_in_invoice_bill_tree_inherit account.out.invoice.list account.move field Inherits account.view_in_invoice_bill_tree
view_invoice_commission_analysis_graph invoice.commission.analysis.graph invoice.commission.analysis.report graph New
view_invoice_commission_analysis_pivot invoice.commission.analysis.pivot invoice.commission.analysis.report pivot New
view_invoice_commission_analysis_search invoice.commission.analysis.search invoice.commission.analysis.report search New
view_move_form account.invoice.form.agent account.move xpath Inherits account.view_move_form
view_move_line_form account.move.line xpath Inherits account.view_move_line_form
view_settlement_form Settlements - Add invoice stuff commission.settlement button Inherits commission_oca.view_settlement_form
view_settlement_line_tree_inherit Settlement lines commission.settlement.line xpath Inherits commission_oca.view_settlement_line_tree
view_settlement_tree Settlements list - Invoice decoration commission.settlement list Inherits commission_oca.view_settlement_tree
Models touched (9)

New fields (7)
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company' store=True
  • currency_id Many2one
    related='object_id.currency_id'
  • invoice_date Date
    readonly=True related='invoice_id.invoice_date' store=True string='Invoice date'
  • invoice_id Many2one → account.move
    comodel_name='account.move' related='object_id.move_id' store=True string='Invoice'
  • object_id Many2one → account.move.line
    comodel_name='account.move.line'
  • settled Boolean
    compute='_compute_settled' store=True
  • settlement_line_ids One2many → commission.settlement.line
    comodel_name='commission.settlement.line' inverse_name='invoice_agent_line_id'
Public methods (0)

No public methods.

New fields (4)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
  • partner_agent_ids Many2many → res.partner
    comodel_name='res.partner' compute='_compute_agents' search='_search_agents' string='Agents'
  • settlement_count Integer
    compute='_compute_settlement'
  • settlement_ids One2many → commission.settlement
    compute='_compute_settlement' string='Settlements' args: 'commission.settlement'
Public methods (5)
  • action_post(self)
    Put settlements associated to the invoices in invoiced state.
  • action_view_settlement(self)
  • button_cancel(self)
    Check settled lines and put settlements associated to the invoices in exception.
  • recompute_lines_agents(self)
  • unlink(self)
    Put 'invoiced' settlements associated to the invoices back in settled state.

New fields (3)
  • agent_ids One2many → account.invoice.line.agent
    comodel_name='account.invoice.line.agent'
  • any_settled Boolean
    compute='_compute_any_settled'
  • settlement_id Many2one → commission.settlement
    comodel_name='commission.settlement' copy=False help='Settlement that generates this invoice line'
Public methods (0)

No public methods.

New fields (1)
  • invoice_state Selection
    default='open' help="Select the invoice status for settling the commissions:\n* 'Invoice Based': Commissions are settled when the invoice is issued.\n* 'Payment Based': Commissions are settled when the invoice is paid." string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
Public methods (0)

No public methods.

New fields (7)
  • company_id Many2one → res.company
    comodel_name='res.company' readonly=True related='journal_id.company_id'
  • date Date
    default=fields.Date.context_today
  • from_settlement Boolean
    default=<expr>
  • grouped Boolean
    string='Group invoices'
  • journal_id Many2one → account.journal
    comodel_name='account.journal' default=<expr> domain="[('type', '=', 'purchase')]" required=True
  • product_id Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • settlement_ids Many2many → commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='commission.settlement' default=<expr> domain="[('state', '=', 'settled'),('agent_type', '=', 'agent'),('company_id', '=', company_id)]" relation='commission_make_invoice_settlement_rel'
Public methods (1)
  • button_create(self)

New fields (1)
  • settlement_type Selection
    ondelete={'sale_invoice': 'cascade'} selection_add=[('sale_invoice', 'Sales Invoices')]
Public methods (0)

No public methods.

New fields (4)
  • invoice_id Many2one → account.move
    comodel_name='account.move' compute='_compute_invoice_id' store=True string='Generated Invoice'
  • invoice_line_ids One2many → account.move.line
    comodel_name='account.move.line' inverse_name='settlement_id' readonly=True string='Generated invoice lines'
  • settlement_type Selection
    ondelete={'sale_invoice': 'set default'} selection_add=[('sale_invoice', 'Sales Invoices')]
  • state Selection
    ondelete={'invoiced': 'set default', 'except_invoice': 'set default'} selection_add=[('invoiced', 'Invoiced'), ('except_invoice', 'Invoice exception')]
Public methods (5)
  • action_cancel(self)
    Check if any settlement has been invoiced.
  • action_draft(self)
  • action_invoice(self)
  • make_invoices(self, journal, product, date=False, grouped=False)
  • unlink(self)
    Allow to delete only cancelled settlements.

New fields (2)
  • invoice_agent_line_id Many2one → account.invoice.line.agent
    comodel_name='account.invoice.line.agent'
  • invoice_line_id Many2one → account.move.line
    comodel_name='account.move.line' related='invoice_agent_line_id.object_id' store=True string='Source invoice line'
Public methods (0)

No public methods.

New fields (17)
  • agent_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • amount Float
    readonly=True
  • balance Float
    readonly=True
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Category of Product'
  • commission_id Many2one → commission
    readonly=True args: 'commission', 'Commission'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_invoice Date
    readonly=True args: 'Invoice Date'
  • invoice_line_id Many2one → account.move.line
    readonly=True args: 'account.move.line'
  • invoice_state Selection
    readonly=True selection='_get_selection_invoice_state' string='Invoice Status'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • percentage Integer
    readonly=True args: 'Percentage of commission'
  • price_subtotal Float
    readonly=True args: 'Subtotal'
  • price_unit Float
    readonly=True args: 'Unit Price'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • quantity Float
    readonly=True args: '# of Qty'
  • settled Boolean
    readonly=True
  • uom_id Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
Public methods (1)
  • init(self)
    @api.model