Sales commissions

sale_commission
REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/17.0/sale_commission
VERSION
VERSION 1.1.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
COMMITTERSWeblate, OCA-git-bot, oca-ci, Christian-RB, ambientWave
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:04
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/commission:
    - account_commission
    - commission
odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds the function to calculate commissions in sales orders.

Commission lines assigned to sales order lines will be passed to the
corresponding invoice lines.

Creating settlements directly from the sales order lines is outside the
scope of this module.

This module depends on the account_commission module.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
view_order_agent_form_inherit sale.agent.order.inherit.form sale.order xpath Inherits sale.view_order_form
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_sales_order_filter_agent view_sales_order_filter_agent sale.order field Inherits sale.view_sales_order_filter
Models touched (3)

New fields (2)
  • 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'
Public methods (2)
  • recompute_lines_agents(self)
  • recompute_lines_agents_amount(self)

New fields (1)
  • agent_ids One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent'
Public methods (0)

No public methods.

New fields (1)
  • object_id Many2one → sale.order.line
    comodel_name='sale.order.line'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/16.0/sale_commission
VERSION
VERSION 1.0.3
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
COMMITTERSPedro M. Baeza, Weblate, OCA-git-bot, David, Ethan Hildick, oca-ci, Christian-RB
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/commission:
    - account_commission
    - commission
odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
view_order_agent_form_inherit sale.agent.order.inherit.form sale.order xpath Inherits sale.view_order_form
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_sales_order_filter_agent view_sales_order_filter_agent sale.order field Inherits sale.view_sales_order_filter
Models touched (3)

New fields (2)
  • 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'
Public methods (2)
  • recompute_lines_agents(self)
  • recompute_lines_agents_amount(self)

New fields (1)
  • agent_ids One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent'
Public methods (0)

No public methods.

New fields (1)
  • object_id Many2one → sale.order.line
    comodel_name='sale.order.line'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/15.0/sale_commission
VERSION
VERSION 2.1.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
COMMITTERSPedro M. Baeza, Yoshi Tashiro, Weblate, OCA-git-bot, David, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:33
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/commission:
    - account_commission
    - commission
odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
view_order_agent_form_inherit sale.agent.order.inherit.form sale.order xpath Inherits sale.view_order_form
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_sales_order_filter_agent view_sales_order_filter_agent sale.order field Inherits sale.view_sales_order_filter
Models touched (3)

New fields (2)
  • 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'
Public methods (1)
  • recompute_lines_agents(self)

New fields (1)
  • agent_ids One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent'
Public methods (0)

No public methods.

New fields (1)
  • object_id Many2one → sale.order.line
    comodel_name='sale.order.line'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/14.0/sale_commission
VERSION
VERSION 1.10.2
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
COMMITTERSeLBati, Maxime Chambreuil, Enric Tobella, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Alfredo Zamora, Oihane Crucelaegui, Ethan Hildick, oca-ci, Alessandro Uffreduzzi, Neto, stenex, Ilyas, Olga Marco, oca-git-bot, Zar21, Alessio Renda, PicchiSeba, Felipe
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - sale_management
    - sale
    - sales_team
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
invoice_line_agent_tree account.invoice.line.agent tree New
product_template_form_view_commission product.template.common.form.commission product.template label Inherits product.product_template_form_view
report_settlement report_settlement ir.ui.view qweb New
res_partner_view_search res.partner.select res.partner filter Inherits account.res_partner_view_search
sale_commission_form Sales commissions form sale.commission form New
sale_commission_make_invoice_form Make invoices sale.commission.make.invoice form New
sale_commission_tree Sales commissions tree sale.commission tree New
view_account_invoice_filter_agent view_account_invoice_filter_agent account.move field Inherits account.view_account_invoice_filter
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_order_agent_form_inherit sale.agent.order.inherit.form sale.order xpath Inherits sale.view_order_form
view_partner_form_agent res.partner.form.agent res.partner xpath Inherits base.view_partner_form
view_sale_commission_analysis_graph sale.commission.analysis.graph sale.commission.analysis.report graph New
view_sale_commission_analysis_pivot sale.commission.analysis.pivot sale.commission.analysis.report pivot New
view_sale_commission_analysis_search sale.commission.analysis.search sale.commission.analysis.report search New
view_sale_commission_mixin_agent_only sale.commission.mixin form New
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_sales_order_filter_agent view_sales_order_filter_agent sale.order field Inherits sale.view_sales_order_filter
view_settled_wizard Select period to settle sale.commission.make.settle form New
view_settlement_form Settlements sale.commission.settlement form New
view_settlement_line_graph sale.commission.settlement.line.graph sale.commission.settlement.line graph New
view_settlement_line_search sale.commission.settlement.line.search sale.commission.settlement.line search New
view_settlement_line_tree Settlement lines sale.commission.settlement.line tree New
view_settlement_search sale.commission.settlement.search sale.commission.settlement search New
view_settlement_tree Settlements tree sale.commission.settlement tree New
Models touched (17)

New fields (7)
  • agent_line Many2many → sale.commission.settlement.line
    column1='agent_line_id' column2='settlement_id' comodel_name='sale.commission.settlement.line' copy=False relation='settlement_agent_line_rel'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company' store=True
  • currency_id Many2one
    readonly=True 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
Public methods (0)

No public methods.

New fields (2)
  • 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'
Public methods (5)
  • action_post(self)
    Put settlements associated to the invoices in invoiced state.
  • button_cancel(self)
    Put settlements associated to the invoices in exception and check settled lines
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
    Inject in this method the needed context for not removing other possible context values.
  • 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 → sale.commission.settlement
    comodel_name='sale.commission.settlement' copy=False help='Settlement that generates this invoice line'
Public methods (0)

No public methods.

New fields (1)
  • commission_free Boolean
    default=False string='Free of commission'
Public methods (0)

No public methods.

New fields (6)
  • agent Boolean
    help='Check this field if the partner is a creditor or an agent.' string='Creditor/Agent'
  • agent_ids Many2many → res.partner
    column1='partner_id' column2='agent_id' comodel_name='res.partner' domain=[('agent', '=', True)] readonly=False relation='partner_agent_rel' string='Agents'
  • agent_type Selection
    default='agent' selection=[('agent', 'External agent')] string='Type'
  • commission_id Many2one → sale.commission
    comodel_name='sale.commission' help='This is the default commission used in the sales where this agent is assigned. It can be changed on each operation if needed.' string='Commission'
  • settlement Selection
    default='monthly' selection=[('biweekly', 'Bi-weekly'), ('monthly', 'Monthly'), ('quaterly', 'Quarterly'), ('semi', 'Semi-annual'), ('annual', 'Annual')] string='Settlement period'
  • settlement_ids One2many → sale.commission.settlement
    comodel_name='sale.commission.settlement' inverse_name='agent_id' readonly=True
Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True
  • amount_base_type Selection
    default='gross_amount' help="Select the base amount for computing the percentage:\n* 'Sale/Invoice Amount': percentage is computed from the amount put on sales order/invoice.\n* 'Margin (Amount - Cost)': percentage is computed from the profit only, taken the cost from the product." required=True selection=[('gross_amount', 'Sale/Invoice Amount'), ('net_amount', 'Margin (Amount - Cost)')] string='Base'
  • commission_type Selection
    default='fixed' help='Select the percentage type of the commission:\n* \'Fixed percentage\': all commissions are computed with a fixed percentage. You can fill the percentage in the field "Fixed percentage".\n* \'By sections\': percentage varies depending amount intervals. You can fill intervals and percentages in the section "Rate definition".' required=True selection=[('fixed', 'Fixed percentage'), ('section', 'By sections')] string='Type'
  • fix_qty Float
    string='Fixed percentage'
  • 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 (or refunded)." required=True string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
  • name Char
    required=True args: 'Name'
  • section_ids One2many → sale.commission.section
    comodel_name='sale.commission.section' inverse_name='commission_id' string='Sections'
Public methods (1)
  • calculate_section(self, base)

New fields (17)
  • agent_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • amount Float
    readonly=True args: 'Amount'
  • balance Float
    readonly=True string='Balance'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Category of Product'
  • commission_id Many2one → sale.commission
    readonly=True args: 'sale.commission', 'Sale commission'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_invoice Date
    readonly=True args: 'Date Invoice'
  • invoice_line_id Many2one → account.move.line
    readonly=True args: 'account.move.line', 'Invoice 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: 'Price subtotal'
  • price_unit Float
    readonly=True args: 'Price unit'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • quantity Float
    readonly=True args: '# of Qty'
  • settled Boolean
    readonly=True args: 'Settled'
  • uom_id Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
Public methods (1)
  • init(self)
    @api.model

New fields (5)
  • agent_id Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]" ondelete='restrict' required=True
  • amount Monetary
    compute='_compute_amount' store=True string='Commission Amount'
  • commission_id Many2one → sale.commission
    comodel_name='sale.commission' compute='_compute_commission_id' copy=True ondelete='restrict' readonly=False required=True store=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency'
  • object_id Many2one → sale.commission.mixin
    comodel_name='sale.commission.mixin' copy=False ondelete='cascade' required=True string='Parent'
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=_default_from_settlement
  • grouped Boolean
    string='Group invoices'
  • journal_id Many2one → account.journal
    comodel_name='account.journal' default=_default_journal_id domain="[('type', '=', 'purchase')]" required=True
  • product_id Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • settlement_ids Many2many → sale.commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='sale.commission.settlement' default=_default_settlement_ids domain="[('state', '=', 'settled'),('agent_type', '=', 'agent'),('company_id', '=', company_id)]" relation='sale_commission_make_invoice_settlement_rel'
Public methods (2)
  • button_create(self)
  • create_settlements_and_invoices(self)

New fields (3)
  • agent_ids Many2many → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • date_payment_to Date
    default=fields.Date.today() help='For payment-based commissions, settlements will be created for payments with date up to the one set in this field.' args: 'Payment date up to'
  • date_to Date
    default=fields.Date.today() help='For invoice-based commissions, settlements will be created for invoices with date up to the one set in this field.' required=True args: 'Invoice date up to'
Public methods (1)
  • action_settle(self)

New fields (4)
  • agent_ids One2many → sale.commission.line.mixin
    comodel_name='sale.commission.line.mixin' compute='_compute_agent_ids' copy=True help='Agents/Commissions related to the invoice line.' inverse_name='object_id' readonly=False store=True string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
  • commission_status Char
    compute='_compute_commission_status' string='Commission'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
Public methods (2)
  • button_edit_agents(self)
  • recompute_agents(self)

New fields (4)
  • amount_from Float
    string='From'
  • amount_to Float
    string='To'
  • commission_id Many2one → sale.commission
    string='Commission' args: 'sale.commission'
  • percent Float
    required=True string='Percent'
Public methods (0)

No public methods.

New fields (12)
  • agent_id Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • agent_type Selection
    related='agent_id.agent_type'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency' default=_default_currency readonly=True
  • date_from Date
    string='From'
  • date_to Date
    string='To'
  • invoice_id Many2one → account.move
    comodel_name='account.move' compute='_compute_invoice_id' store=True
  • invoice_line_ids One2many → account.move.line
    comodel_name='account.move.line' inverse_name='settlement_id' readonly=True string='Generated invoice'
  • line_ids One2many → sale.commission.settlement.line
    comodel_name='sale.commission.settlement.line' inverse_name='settlement_id' readonly=True string='Settlement lines'
  • name Char
    args: 'Name'
  • state Selection
    default='settled' readonly=True selection=[('settled', 'Settled'), ('invoiced', 'Invoiced'), ('cancel', 'Canceled'), ('except_invoice', 'Invoice exception')] string='State'
  • total Float
    compute='_compute_total' readonly=True store=True
Public methods (4)
  • action_cancel(self)
  • action_invoice(self)
  • make_invoices(self, journal, product, date=False, grouped=False)
  • unlink(self)
    Allow to delete only cancelled settlements

New fields (9)
  • agent_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='agent_line.agent_id' store=True
  • agent_line Many2many → account.invoice.line.agent
    column1='settlement_id' column2='agent_line_id' comodel_name='account.invoice.line.agent' relation='settlement_agent_line_rel' required=True
  • commission_id Many2one → sale.commission
    comodel_name='sale.commission' related='agent_line.commission_id'
  • company_id Many2one → res.company
    comodel_name='res.company' related='settlement_id.company_id'
  • currency_id Many2one
    readonly=True related='agent_line.currency_id' store=True
  • date Date
    related='agent_line.invoice_date' store=True
  • invoice_line_id Many2one → account.move.line
    comodel_name='account.move.line' related='agent_line.object_id' store=True string='Source invoice line'
  • settled_amount Monetary
    readonly=True related='agent_line.amount' store=True
  • settlement_id Many2one → sale.commission.settlement
    ondelete='cascade' readonly=True required=True args: 'sale.commission.settlement'
Public methods (0)

No public methods.

New fields (2)
  • 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'
Public methods (1)
  • recompute_lines_agents(self)

New fields (1)
  • agent_ids One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent'
Public methods (0)

No public methods.

New fields (2)
  • currency_id Many2one
    related='object_id.currency_id'
  • object_id Many2one → sale.order.line
    comodel_name='sale.order.line'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/13.0/sale_commission
VERSION
VERSION 1.8.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
COMMITTERSeLBati, Renato Lima, Pedro M. Baeza, Jairo Llopis, Enric Tobella, OCA Transbot, Víctor Martínez, João Marques, oca-travis, Weblate, OCA-git-bot, oca-ci, SilvioGregorini, ao-landoo, Olga Marco, Denny Biasiolli
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:12
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - sale_management
    - sale
    - sales_team
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
invoice_line_agent_tree account.invoice.line.agent tree New
product_template_form_view_commission product.template.common.form.commission product.template label Inherits product.product_template_form_view
report_settlement report_settlement ir.ui.view qweb New
res_partner_view_search res.partner.select res.partner filter Inherits account.res_partner_view_search
sale_commission_form Sales commissions form sale.commission form New
sale_commission_make_invoice_form Make invoices sale.commission.make.invoice form New
sale_commission_tree Sales commissions tree sale.commission tree 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_order_agent_form_inherit sale.agent.order.inherit.form sale.order xpath Inherits sale.view_order_form
view_partner_form_agent res.partner.form.agent res.partner xpath Inherits base.view_partner_form
view_sale_commission_analysis_graph sale.commission.analysis.graph sale.commission.analysis.report graph New
view_sale_commission_analysis_pivot sale.commission.analysis.pivot sale.commission.analysis.report pivot New
view_sale_commission_analysis_search sale.commission.analysis.search sale.commission.analysis.report search New
view_sale_commission_mixin_agent_only sale.commission.mixin form New
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_settled_wizard Select period to settle sale.commission.make.settle form New
view_settlement_form Settlements sale.commission.settlement form New
view_settlement_line_graph sale.commission.settlement.line.graph sale.commission.settlement.line graph New
view_settlement_line_search sale.commission.settlement.line.search sale.commission.settlement.line search New
view_settlement_line_tree Settlement lines sale.commission.settlement.line tree New
view_settlement_search sale.commission.settlement.search sale.commission.settlement search New
view_settlement_tree Settlements tree sale.commission.settlement tree New
Models touched (17)

New fields (7)
  • agent_line Many2many → sale.commission.settlement.line
    column1='agent_line_id' column2='settlement_id' comodel_name='sale.commission.settlement.line' copy=False relation='settlement_agent_line_rel'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company' store=True
  • currency_id Many2one
    readonly=True related='object_id.currency_id'
  • invoice_date Date
    readonly=True related='invoice_id.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
Public methods (0)

No public methods.

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (4)
  • button_cancel(self)
    Put settlements associated to the invoices in exception and check settled lines
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
    Inject in this method the needed context for not removing other possible context values.
  • post(self)
    Put settlements associated to the invoices in invoiced state.
  • recompute_lines_agents(self)

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 → sale.commission.settlement
    comodel_name='sale.commission.settlement' copy=False help='Settlement that generates this invoice line'
Public methods (0)

No public methods.

New fields (1)
  • commission_free Boolean
    default=False string='Free of commission'
Public methods (0)

No public methods.

New fields (6)
  • agent Boolean
    help='Check this field if the partner is a creditor or an agent.' string='Creditor/Agent'
  • agent_ids Many2many → res.partner
    column1='partner_id' column2='agent_id' comodel_name='res.partner' domain=[('agent', '=', True)] readonly=False relation='partner_agent_rel' string='Agents'
  • agent_type Selection
    default='agent' selection=[('agent', 'External agent')] string='Type'
  • commission_id Many2one → sale.commission
    comodel_name='sale.commission' help='This is the default commission used in the sales where this agent is assigned. It can be changed on each operation if needed.' string='Commission'
  • settlement Selection
    default='monthly' selection=[('biweekly', 'Bi-weekly'), ('monthly', 'Monthly'), ('quaterly', 'Quarterly'), ('semi', 'Semi-annual'), ('annual', 'Annual')] string='Settlement period'
  • settlement_ids One2many → sale.commission.settlement
    comodel_name='sale.commission.settlement' inverse_name='agent_id' readonly=True
Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True
  • amount_base_type Selection
    default='gross_amount' required=True selection=[('gross_amount', 'Gross Amount'), ('net_amount', 'Net Amount')] string='Base'
  • commission_type Selection
    default='fixed' required=True selection=[('fixed', 'Fixed percentage'), ('section', 'By sections')] string='Type'
  • fix_qty Float
    string='Fixed percentage'
  • invoice_state Selection
    default='open' required=True string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
  • name Char
    required=True args: 'Name'
  • section_ids One2many → sale.commission.section
    comodel_name='sale.commission.section' inverse_name='commission_id' string='Sections'
Public methods (1)
  • calculate_section(self, base)

New fields (17)
  • agent_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • amount Float
    readonly=True args: 'Amount'
  • balance Float
    readonly=True string='Balance'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Category of Product'
  • commission_id Many2one → sale.commission
    readonly=True args: 'sale.commission', 'Sale commission'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_invoice Date
    readonly=True args: 'Date Invoice'
  • invoice_line_id Many2one → account.move.line
    readonly=True args: 'account.move.line', 'Invoice 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: 'Price subtotal'
  • price_unit Float
    readonly=True args: 'Price unit'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • quantity Float
    readonly=True args: '# of Qty'
  • settled Boolean
    readonly=True args: 'Settled'
  • uom_id Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
Public methods (1)
  • init(self)
    @api.model

New fields (5)
  • agent_id Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]" ondelete='restrict' required=True
  • amount Monetary
    compute='_compute_amount' store=True string='Commission Amount'
  • commission_id Many2one → sale.commission
    comodel_name='sale.commission' compute='_compute_commission_id' copy=True ondelete='restrict' readonly=False required=True store=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency'
  • object_id Many2one → sale.commission.mixin
    comodel_name='sale.commission.mixin' copy=False ondelete='cascade' required=True string='Parent'
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=_default_from_settlement
  • grouped Boolean
    string='Group invoices'
  • journal_id Many2one → account.journal
    comodel_name='account.journal' default=_default_journal_id domain="[('type', '=', 'purchase')]" required=True
  • product_id Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • settlement_ids Many2many → sale.commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='sale.commission.settlement' default=_default_settlement_ids domain="[('state', '=', 'settled'),('agent_type', '=', 'agent'),('company_id', '=', company_id)]" relation='sale_commission_make_invoice_settlement_rel'
Public methods (1)
  • button_create(self)

New fields (2)
  • agent_ids Many2many → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • date_to Date
    default=fields.Date.today() required=True args: 'Up to'
Public methods (1)
  • action_settle(self)

New fields (4)
  • agent_ids One2many → sale.commission.line.mixin
    comodel_name='sale.commission.line.mixin' compute='_compute_agent_ids' copy=True help='Agents/Commissions related to the invoice line.' inverse_name='object_id' readonly=False store=True string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
  • commission_status Char
    compute='_compute_commission_status' string='Commission'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
Public methods (2)
  • button_edit_agents(self)
  • recompute_agents(self)

New fields (4)
  • amount_from Float
    string='From'
  • amount_to Float
    string='To'
  • commission_id Many2one → sale.commission
    string='Commission' args: 'sale.commission'
  • percent Float
    required=True string='Percent'
Public methods (0)

No public methods.

New fields (12)
  • agent_id Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • agent_type Selection
    related='agent_id.agent_type'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency' default=_default_currency readonly=True
  • date_from Date
    string='From'
  • date_to Date
    string='To'
  • invoice_id Many2one → account.move
    comodel_name='account.move' compute='_compute_invoice_id' store=True
  • invoice_line_ids One2many → account.move.line
    comodel_name='account.move.line' inverse_name='settlement_id' readonly=True string='Generated invoice'
  • line_ids One2many → sale.commission.settlement.line
    comodel_name='sale.commission.settlement.line' inverse_name='settlement_id' readonly=True string='Settlement lines'
  • name Char
    args: 'Name'
  • state Selection
    default='settled' readonly=True selection=[('settled', 'Settled'), ('invoiced', 'Invoiced'), ('cancel', 'Canceled'), ('except_invoice', 'Invoice exception')] string='State'
  • total Float
    compute='_compute_total' readonly=True store=True
Public methods (4)
  • action_cancel(self)
  • action_invoice(self)
  • make_invoices(self, journal, product, date=False, grouped=False)
  • unlink(self)
    Allow to delete only cancelled settlements

New fields (9)
  • agent_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='agent_line.agent_id' store=True
  • agent_line Many2many → account.invoice.line.agent
    column1='settlement_id' column2='agent_line_id' comodel_name='account.invoice.line.agent' relation='settlement_agent_line_rel' required=True
  • commission_id Many2one → sale.commission
    comodel_name='sale.commission' related='agent_line.commission_id'
  • company_id Many2one → res.company
    comodel_name='res.company' related='settlement_id.company_id'
  • currency_id Many2one
    readonly=True related='agent_line.currency_id' store=True
  • date Date
    related='agent_line.invoice_date' store=True
  • invoice_line_id Many2one → account.move.line
    comodel_name='account.move.line' related='agent_line.object_id' store=True string='Source invoice line'
  • settled_amount Monetary
    readonly=True related='agent_line.amount' store=True
  • settlement_id Many2one → sale.commission.settlement
    ondelete='cascade' readonly=True required=True args: 'sale.commission.settlement'
Public methods (0)

No public methods.

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (1)
  • recompute_lines_agents(self)

New fields (1)
  • agent_ids One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent'
Public methods (0)

No public methods.

New fields (2)
  • currency_id Many2one
    related='object_id.currency_id'
  • object_id Many2one → sale.order.line
    comodel_name='sale.order.line'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/12.0/sale_commission
VERSION
VERSION 3.3.3
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
COMMITTERSeLBati, Renato Lima, Pedro M. Baeza, GitHub, Jairo Llopis, tafaRU, OCA Transbot, oca-travis, Weblate, OCA-git-bot, SimoRubi, Simone Rubino, oca-ci, Jaime Arroyo, SilvioGregorini, Rubén Cerdà, ferran-S73, stenex
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:16
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - http_routing
    - digest
    - sale_management
    - sale
    - sales_team
    - payment
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (28)
XML IDNameModelTypeStatus
invoice_form_agent account.invoice.form.agent account.invoice field Inherits account.invoice_form
invoice_line_agent_tree account.invoice.line.agent.tree account.invoice.line.agent tree New
invoice_line_form_agent account.invoice.line.form.agent account.invoice.line field Inherits account.view_invoice_line_form
product_template_form_view_commission product.template.common.form.commission product.template label Inherits product.product_template_form_view
report_settlement report_settlement ir.ui.view qweb New
sale_commission_form Sales commissions form sale.commission form New
sale_commission_make_invoice_form Make invoices sale.commission.make.invoice form New
sale_commission_tree Sales commissions tree sale.commission tree New
view_account_invoice_filter_agent view_account_invoice_filter_agent account.invoice field Inherits account.view_account_invoice_filter
view_order_agent_form_inherit sale.agent.order.inherit.form sale.order xpath Inherits sale.view_order_form
view_partner_form_agent res.partner.form.agent res.partner xpath Inherits base.view_partner_form
view_res_partner_filter res.partner.select res.partner filter Inherits base.view_res_partner_filter
view_sale_commission_analysis_graph sale.commission.analysis.graph sale.commission.analysis.report graph New
view_sale_commission_analysis_pivot sale.commission.analysis.pivot sale.commission.analysis.report pivot New
view_sale_commission_analysis_search sale.commission.analysis.search sale.commission.analysis.report search New
view_sale_commission_mixin_agent_only sale.commission.mixin form New
view_sale_order_commission_analysis_graph sale.order.commission.analysis.graph sale.order.commission.analysis.report graph New
view_sale_order_commission_analysis_pivot sale.order.commission.analysis.pivot sale.order.commission.analysis.report pivot New
view_sale_order_commission_analysis_search sale.order.commission.analysis.search sale.order.commission.analysis.report search New
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_sales_order_filter_agent view_sales_order_filter_agent sale.order field Inherits sale.view_sales_order_filter
view_settled_wizard Select period to settle sale.commission.make.settle form New
view_settlement_form Settlements sale.commission.settlement form New
view_settlement_line_graph sale.commission.settlement.line.graph sale.commission.settlement.line graph New
view_settlement_line_search sale.commission.settlement.line.search sale.commission.settlement.line search New
view_settlement_line_tree Settlement lines sale.commission.settlement.line tree New
view_settlement_search sale.commission.settlement.search sale.commission.settlement search New
view_settlement_tree Settlements tree sale.commission.settlement tree New
Models touched (18)

New fields (2)
  • agent_ids Many2many → res.partner
    compute='_compute_agents' search='_search_agents' string='Agents' args: 'res.partner'
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (3)
  • action_cancel(self)
    Put settlements associated to the invoices in exception and check settled lines
  • invoice_validate(self)
    Put settlements associated to the invoices in invoiced state.
  • recompute_lines_agents(self)

New fields (2)
  • agents One2many → account.invoice.line.agent
    comodel_name='account.invoice.line.agent'
  • any_settled Boolean
    compute='_compute_any_settled'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    Add agents for records created from automations instead of UI.

New fields (7)
  • agent_line Many2many → sale.commission.settlement.line
    column1='agent_line_id' column2='settlement_id' comodel_name='sale.commission.settlement.line' copy=False relation='settlement_agent_line_rel'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company' store=True
  • currency_id Many2one
    readonly=True related='object_id.currency_id'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='object_id.invoice_id' store=True string='Invoice'
  • invoice_date Date
    readonly=True related='invoice.date_invoice' store=True string='Invoice date'
  • object_id Many2one → account.invoice.line
    comodel_name='account.invoice.line' oldname='invoice_line'
  • settled Boolean
    compute='_compute_settled' store=True
Public methods (0)

No public methods.

New fields (1)
  • commission_free Boolean
    default=False string='Free of commission'
Public methods (0)

No public methods.

New fields (6)
  • agent Boolean
    help='Check this field if the partner is a creditor or an agent.' string='Creditor/Agent'
  • agent_type Selection
    default='agent' selection=[('agent', 'External agent')] string='Type'
  • agents Many2many → res.partner
    column1='partner_id' column2='agent_id' comodel_name='res.partner' domain=[('agent', '=', True)] relation='partner_agent_rel'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' help='This is the default commission used in the sales where this agent is assigned. It can be changed on each operation if needed.' string='Commission'
  • settlement Selection
    default='monthly' selection=[('monthly', 'Monthly'), ('quaterly', 'Quarterly'), ('semi', 'Semi-annual'), ('annual', 'Annual')] string='Settlement period'
  • settlements One2many → sale.commission.settlement
    comodel_name='sale.commission.settlement' inverse_name='agent' readonly=True
Public methods (5)
  • create(self, vals)
    @api.model
    Propagate agents from parent to child
  • default_get(self, fields_list)
    @api.model
  • onchange_agent_type(self)
    @api.onchange('agent_type')
  • onchange_parent_id(self)
    @api.onchange('parent_id')
    Change agents if the parent company changes.
  • write(self, vals)
    @api.multi
    Propagate agents change in the parent partner to the child contacts.

New fields (8)
  • active Boolean
    default=True
  • amount_base_type Selection
    default='gross_amount' required=True selection=[('gross_amount', 'Gross Amount'), ('net_amount', 'Net Amount')] string='Base'
  • commission_type Selection
    default='fixed' required=True selection=[('fixed', 'Fixed percentage'), ('section', 'By sections')] string='Type'
  • fix_qty Float
    string='Fixed percentage'
  • invoice_state Selection
    default='open' required=True string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
  • name Char
    required=True args: 'Name'
  • sections One2many → sale.commission.section
    comodel_name='sale.commission.section' inverse_name='commission'
  • settlements Many2many → sale.commission.settlement
    comodel_name='sale.commission.settlement'
Public methods (1)
  • calculate_section(self, base)
    @api.multi

New fields (17)
  • agent_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • amount Float
    readonly=True args: 'Amount'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Category of Product'
  • commission_id Many2one → sale.commission
    readonly=True args: 'sale.commission', 'Sale commission'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_invoice Date
    readonly=True args: 'Date Invoice'
  • invoice_line_id Many2one → account.invoice.line
    readonly=True args: 'account.invoice.line', 'Invoice 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: 'Price subtotal'
  • price_subtotal_signed Float
    readonly=True string='Price subtotal signed'
  • price_unit Float
    readonly=True args: 'Price unit'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • quantity Float
    readonly=True args: '# of Qty'
  • settled Boolean
    readonly=True args: 'Settled'
  • uom_id Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
Public methods (1)
  • init(self)
    @api.model

New fields (5)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]" ondelete='restrict' required=True
  • amount Monetary
    compute='_compute_amount' store=True string='Commission Amount'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' ondelete='restrict' required=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency'
  • object_id Many2one → sale.commission.mixin
    comodel_name='sale.commission.mixin' copy=False ondelete='cascade' required=True string='Parent'
Public methods (1)
  • onchange_agent(self)
    @api.onchange('agent')

New fields (6)
  • company_id Many2one → res.company
    comodel_name='res.company' readonly=True related='journal.company_id'
  • date Date
  • from_settlement Boolean
    default=_default_from_settlement
  • journal Many2one → account.journal
    comodel_name='account.journal' default=_default_journal domain="[('type', '=', 'purchase')]" required=True
  • product Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • settlements Many2many → sale.commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='sale.commission.settlement' default=_default_settlements domain="[('state', '=', 'settled'),('agent_type', '=', 'agent'),('company_id', '=', company_id)]" relation='sale_commission_make_invoice_settlement_rel'
Public methods (1)
  • button_create(self)
    @api.multi

New fields (2)
  • agents Many2many → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • date_to Date
    default=fields.Date.today() required=True args: 'Up to'
Public methods (1)
  • action_settle(self)
    @api.multi

New fields (4)
  • agents One2many → sale.commission.line.mixin
    comodel_name='sale.commission.line.mixin' copy=True default=<expr> help='Agents/Commissions related to the invoice line.' inverse_name='object_id' string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
  • commission_status Char
    compute='_compute_commission_status' string='Commission'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
Public methods (2)
  • button_edit_agents(self)
  • recompute_agents(self)
    Force a recomputation of the agents according prepare method.

New fields (4)
  • amount_from Float
    string='From'
  • amount_to Float
    string='To'
  • commission Many2one → sale.commission
    string='Commission' args: 'sale.commission'
  • percent Float
    required=True string='Percent'
Public methods (0)

No public methods.

New fields (11)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • agent_type Selection
    related='agent.agent_type'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency' default=_default_currency readonly=True
  • date_from Date
    string='From'
  • date_to Date
    string='To'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' readonly=True string='Generated invoice'
  • lines One2many → sale.commission.settlement.line
    comodel_name='sale.commission.settlement.line' inverse_name='settlement' readonly=True string='Settlement lines'
  • name Char
    args: 'Name'
  • state Selection
    default='settled' readonly=True selection=[('settled', 'Settled'), ('invoiced', 'Invoiced'), ('cancel', 'Canceled'), ('except_invoice', 'Invoice exception')] string='State'
  • total Float
    compute='_compute_total' readonly=True store=True
Public methods (5)
  • action_cancel(self)
    @api.multi
  • action_invoice(self)
    @api.multi
  • create_invoice_header(self, journal, date)
    Hook that can be used in order to group invoices or find open invoices
  • make_invoices(self, journal, product, date=False)
    @api.multi
  • unlink(self)
    @api.multi
    Allow to delete only cancelled settlements

New fields (10)
  • agent Many2one → res.partner
    comodel_name='res.partner' readonly=True related='agent_line.agent' store=True
  • agent_line Many2many → account.invoice.line.agent
    column1='settlement_id' column2='agent_line_id' comodel_name='account.invoice.line.agent' relation='settlement_agent_line_rel' required=True
  • commission Many2one → sale.commission
    comodel_name='sale.commission' related='agent_line.commission'
  • company_id Many2one → res.company
    comodel_name='res.company' related='settlement.company_id'
  • currency_id Many2one
    readonly=True related='agent_line.currency_id' store=True
  • date Date
    related='agent_line.invoice_date' store=True
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='invoice_line.invoice_id' store=True string='Invoice'
  • invoice_line Many2one → account.invoice.line
    comodel_name='account.invoice.line' related='agent_line.object_id' store=True
  • settled_amount Monetary
    readonly=True related='agent_line.amount' store=True
  • settlement Many2one → sale.commission.settlement
    ondelete='cascade' readonly=True required=True args: 'sale.commission.settlement'
Public methods (0)

No public methods.

New fields (2)
  • agent_ids Many2many → res.partner
    compute='_compute_agents' search='_search_agents' string='Agents' args: 'res.partner'
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (2)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
    Add to the existing context of the field `order_line` "partner_id" key for avoiding to be replaced by other view inheritance. We have to do this processing in text mode without evaling context, as it can contain JS stuff.
  • recompute_lines_agents(self)

New fields (16)
  • agent_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • amount Float
    readonly=True args: 'Amount'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Category of Product'
  • commission_id Many2one → sale.commission
    readonly=True args: 'sale.commission', 'Sale commission'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_order Date
    readonly=True args: 'Order Date'
  • order_line_id Many2one → sale.order.line
    readonly=True args: 'sale.order.line', 'Order line'
  • order_state Selection
    readonly=True selection='_get_selection_order_state' string='Order 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: 'Price subtotal'
  • price_unit Float
    readonly=True args: 'Price unit'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • quantity Float
    readonly=True args: '# of Qty'
  • salesman_id Many2one → res.users
    readonly=True string='Salesperson' args: 'res.users'
  • uom_id Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
Public methods (1)
  • init(self)
    @api.model

New fields (1)
  • agents One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent' string='Agents & commissions'
Public methods (1)
  • create(self, vals)
    @api.model
    Add agents for records created from automations instead of UI.

New fields (2)
  • currency_id Many2one
    readonly=True related='object_id.currency_id'
  • object_id Many2one → sale.order.line
    comodel_name='sale.order.line' oldname='sale_line'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/11.0/sale_commission
VERSION
VERSION 2.3.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
COMMITTERSDavide Corio, Pedro M. Baeza, GitHub, Enric Tobella, Stéphane Bidoul (ACSONE), Jordi Ballester Alomar, Alex Comba, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Levent Karakaş, Oihane Crucelaegui, rgarnau, javierjcf, ernesto, etobella, rodrigo, acm1pt-colorado
WEBSITE
WEBSITEhttps://github.com/OCA/commission
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - analytic
    - web_planner
    - portal
    - http_routing
    - sale_management
    - sale
    - sales_team
    - account_invoicing
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
invoice_form_agent account.invoice.form.agent account.invoice field Inherits account.invoice_form
invoice_line_agent_tree account.invoice.line.agent.tree account.invoice.line.agent tree New
invoice_line_form_agent account.invoice.line.form.agent account.invoice.line field Inherits account.view_invoice_line_form
product_template_form_view_commission product.template.common.form.commission product.template label Inherits product.product_template_form_view
report_settlement report_settlement ir.ui.view qweb New
sale_commission_form Sales commissions form sale.commission form New
sale_commission_make_invoice_form Make invoices sale.commission.make.invoice form New
sale_commission_tree Sales commissions tree sale.commission tree New
view_order_agent_form_inherit sale.agent.order.inherit.form sale.order xpath Inherits sale.view_order_form
view_partner_form_agent res.partner.form.agent res.partner xpath Inherits base.view_partner_form
view_res_partner_filter res.partner.select res.partner filter Inherits base.view_res_partner_filter
view_sale_commission_analysis_graph sale.commission.analysis.graph sale.commission.analysis.report graph New
view_sale_commission_analysis_pivot sale.commission.analysis.pivot sale.commission.analysis.report pivot New
view_sale_commission_analysis_search sale.commission.analysis.search sale.commission.analysis.report search New
view_sale_commission_mixin_agent_only sale.commission.mixin form New
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_settled_wizard Select period to settle sale.commission.make.settle form New
view_settlement_form Settlements sale.commission.settlement form New
view_settlement_line_graph sale.commission.settlement.line.graph sale.commission.settlement.line graph New
view_settlement_line_search sale.commission.settlement.line.search sale.commission.settlement.line search New
view_settlement_line_tree Settlement lines sale.commission.settlement.line tree New
view_settlement_search sale.commission.settlement.search sale.commission.settlement search New
view_settlement_tree Settlements tree sale.commission.settlement tree New
Models touched (17)

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (3)
  • action_cancel(self)
    Put settlements associated to the invoices in exception.
  • invoice_validate(self)
    Put settlements associated to the invoices in invoiced state.
  • recompute_lines_agents(self)

New fields (2)
  • agents One2many → account.invoice.line.agent
    comodel_name='account.invoice.line.agent'
  • any_settled Boolean
    compute='_compute_any_settled'
Public methods (1)
  • create(self, vals)
    @api.model
    Add agents for records created from automations instead of UI.

New fields (7)
  • agent_line Many2many → sale.commission.settlement.line
    column1='agent_line_id' column2='settlement_id' comodel_name='sale.commission.settlement.line' copy=False relation='settlement_agent_line_rel'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company' store=True
  • currency_id Many2one
    readonly=True related='object_id.currency_id'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='object_id.invoice_id' store=True string='Invoice'
  • invoice_date Date
    readonly=True related='invoice.date_invoice' store=True string='Invoice date'
  • object_id Many2one → account.invoice.line
    comodel_name='account.invoice.line' oldname='invoice_line'
  • settled Boolean
    compute='_compute_settled' store=True
Public methods (0)

No public methods.

New fields (1)
  • commission_free Boolean
    default=False string='Free of commission'
Public methods (0)

No public methods.

New fields (6)
  • agent Boolean
    help='Check this field if the partner is a creditor or an agent.' string='Creditor/Agent'
  • agent_type Selection
    default='agent' required=True selection=[('agent', 'External agent')] string='Type'
  • agents Many2many → res.partner
    column1='partner_id' column2='agent_id' comodel_name='res.partner' domain=[('agent', '=', True)] relation='partner_agent_rel'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' help='This is the default commission used in the sales where this agent is assigned. It can be changed on each operation if needed.' string='Commission'
  • settlement Selection
    default='monthly' required=True selection=[('monthly', 'Monthly'), ('quaterly', 'Quarterly'), ('semi', 'Semi-annual'), ('annual', 'Annual')] string='Settlement period'
  • settlements One2many → sale.commission.settlement
    comodel_name='sale.commission.settlement' inverse_name='agent' readonly=True
Public methods (5)
  • create(self, vals)
    @api.model
    Propagate agents from parent to child
  • default_get(self, fields_list)
    @api.model
  • onchange_agent_type(self)
    @api.onchange('agent_type')
  • onchange_parent_id(self)
    @api.onchange('parent_id')
    Change agents if the parent company changes.
  • write(self, vals)
    @api.multi
    Propagate agents change in the parent partner to the child contacts.

New fields (8)
  • active Boolean
    default=True
  • amount_base_type Selection
    default='gross_amount' required=True selection=[('gross_amount', 'Gross Amount'), ('net_amount', 'Net Amount')] string='Base'
  • commission_type Selection
    default='fixed' required=True selection=[('fixed', 'Fixed percentage'), ('section', 'By sections')] string='Type'
  • fix_qty Float
    string='Fixed percentage'
  • invoice_state Selection
    default='open' required=True string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
  • name Char
    required=True args: 'Name'
  • sections One2many → sale.commission.section
    comodel_name='sale.commission.section' inverse_name='commission'
  • settlements Many2many → sale.commission.settlement
    comodel_name='sale.commission.settlement'
Public methods (1)
  • calculate_section(self, base)
    @api.multi

New fields (16)
  • agent_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • amount Float
    readonly=True args: 'Amount'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Category of Product'
  • commission_id Many2one → sale.commission
    readonly=True args: 'sale.commission', 'Sale commission'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_invoice Date
    readonly=True args: 'Date Invoice'
  • invoice_line_id Many2one → account.invoice.line
    readonly=True args: 'account.invoice.line', 'Invoice 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: 'Price subtotal'
  • price_unit Float
    readonly=True args: 'Price unit'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • quantity Float
    readonly=True args: '# of Qty'
  • settled Boolean
    readonly=True args: 'Settled'
  • uom_id Many2one → product.uom
    readonly=True args: 'product.uom', 'Unit of Measure'
Public methods (1)
  • init(self)
    @api.model

New fields (5)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]" ondelete='restrict' required=True
  • amount Monetary
    compute='_compute_amount' store=True string='Commission Amount'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' ondelete='restrict' required=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency'
  • object_id Many2one → sale.commission.mixin
    comodel_name='sale.commission.mixin' copy=False ondelete='cascade' required=True string='Parent'
Public methods (1)
  • onchange_agent(self)
    @api.onchange('agent')

New fields (6)
  • company_id Many2one → res.company
    comodel_name='res.company' readonly=True related='journal.company_id'
  • date Date
  • from_settlement Boolean
    default=_default_from_settlement
  • journal Many2one → account.journal
    comodel_name='account.journal' default=_default_journal domain="[('type', '=', 'purchase')]" required=True
  • product Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • settlements Many2many → sale.commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='sale.commission.settlement' default=_default_settlements domain="[('state', '=', 'settled'),('agent_type', '=', 'agent'),('company_id', '=', company_id)]" relation='sale_commission_make_invoice_settlement_rel'
Public methods (1)
  • button_create(self)
    @api.multi

New fields (2)
  • agents Many2many → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • date_to Date
    default=fields.Date.today() required=True args: 'Up to'
Public methods (1)
  • action_settle(self)
    @api.multi

New fields (4)
  • agents One2many → sale.commission.line.mixin
    comodel_name='sale.commission.line.mixin' copy=True default=<expr> help='Agents/Commissions related to the invoice line.' inverse_name='object_id' string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
  • commission_status Char
    compute='_compute_commission_status' string='Commission'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
Public methods (2)
  • button_edit_agents(self)
  • recompute_agents(self)
    Force a recomputation of the agents according prepare method.

New fields (4)
  • amount_from Float
    string='From'
  • amount_to Float
    string='To'
  • commission Many2one → sale.commission
    string='Commission' args: 'sale.commission'
  • percent Float
    required=True string='Percent'
Public methods (0)

No public methods.

New fields (11)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • agent_type Selection
    related='agent.agent_type'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency' default=_default_currency readonly=True
  • date_from Date
    string='From'
  • date_to Date
    string='To'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' readonly=True string='Generated invoice'
  • lines One2many → sale.commission.settlement.line
    comodel_name='sale.commission.settlement.line' inverse_name='settlement' readonly=True string='Settlement lines'
  • name Char
    args: 'Name'
  • state Selection
    default='settled' readonly=True selection=[('settled', 'Settled'), ('invoiced', 'Invoiced'), ('cancel', 'Canceled'), ('except_invoice', 'Invoice exception')] string='State'
  • total Float
    compute='_compute_total' readonly=True store=True
Public methods (5)
  • action_cancel(self)
    @api.multi
  • action_invoice(self)
    @api.multi
  • create_invoice_header(self, journal, date)
    Hook that can be used in order to group invoices or find open invoices
  • make_invoices(self, journal, product, date=False)
    @api.multi
  • unlink(self)
    @api.multi
    Allow to delete only cancelled settlements

New fields (10)
  • agent Many2one → res.partner
    comodel_name='res.partner' readonly=True related='agent_line.agent' store=True
  • agent_line Many2many → account.invoice.line.agent
    column1='settlement_id' column2='agent_line_id' comodel_name='account.invoice.line.agent' relation='settlement_agent_line_rel' required=True
  • commission Many2one → sale.commission
    comodel_name='sale.commission' related='agent_line.commission'
  • company_id Many2one → res.company
    comodel_name='res.company' readonly=True related='settlement.company_id'
  • currency_id Many2one
    readonly=True related='agent_line.currency_id' store=True
  • date Date
    related='agent_line.invoice_date' store=True
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='invoice_line.invoice_id' store=True string='Invoice'
  • invoice_line Many2one → account.invoice.line
    comodel_name='account.invoice.line' related='agent_line.object_id' store=True
  • settled_amount Monetary
    readonly=True related='agent_line.amount' store=True
  • settlement Many2one → sale.commission.settlement
    ondelete='cascade' readonly=True required=True args: 'sale.commission.settlement'
Public methods (0)

No public methods.

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (2)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
    Add to the existing context of the field `order_line` "partner_id" key for avoiding to be replaced by other view inheritance. We have to do this processing in text mode without evaling context, as it can contain JS stuff.
  • recompute_lines_agents(self)

New fields (1)
  • agents One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent' string='Agents & commissions'
Public methods (1)
  • create(self, vals)
    @api.model
    Add agents for records created from automations instead of UI.

New fields (2)
  • currency_id Many2one
    readonly=True related='object_id.currency_id'
  • object_id Many2one → sale.order.line
    comodel_name='sale.order.line' oldname='sale_line'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/10.0/sale_commission
VERSION
VERSION 2.6.0
CATEGORY
CATEGORYSales Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, Agile Business Group
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, Agile Business Group
COMMITTERS
COMMITTERSeLBati, Pedro M. Baeza, GitHub, Carlos Dauden, OCA Transbot, hurrinico, oca-travis, Weblate, OCA-git-bot, Hendrix Costa, SimoRubi, javierjcf
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - report
    - analytic
    - web_planner
    - sale
    - sales_team
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
invoice_form_agent account.invoice.form.agent account.invoice field Inherits account.invoice_form
invoice_line_agent_tree account.invoice.line.agent.tree account.invoice.line.agent tree New
invoice_line_form_agent account.invoice.line.form.agent account.invoice.line field Inherits account.view_invoice_line_form
product_template_form_view_commission product.template.common.form.commission product.template label Inherits product.product_template_form_view
report_settlement report_settlement ir.ui.view qweb New
sale_commission_form Sales commissions form sale.commission form New
sale_commission_make_invoice_form Make invoices sale.commission.make.invoice form New
sale_commission_tree Sales commissions tree sale.commission tree New
view_account_invoice_filter Commission filter on account invoices account.invoice search Inherits account.view_account_invoice_filter
view_order_agent_form_inherit sale.agent.order.inherit.form sale.order xpath Inherits sale.view_order_form
view_partner_form_agent res.partner.form.agent res.partner xpath Inherits base.view_partner_form
view_res_partner_filter res.partner.select res.partner filter Inherits base.view_res_partner_filter
view_sale_commission_analysis_graph sale.commission.analysis.graph sale.commission.analysis.report graph New
view_sale_commission_analysis_pivot sale.commission.analysis.pivot sale.commission.analysis.report pivot New
view_sale_commission_analysis_search sale.commission.analysis.search sale.commission.analysis.report search New
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_sales_order_filter Commission filter on sale orders sale.order search Inherits sale.view_sales_order_filter
view_settled_wizard Select period to settle sale.commission.make.settle form New
view_settlement_form Settlements sale.commission.settlement form New
view_settlement_line_graph sale.commission.settlement.line.graph sale.commission.settlement.line graph New
view_settlement_line_pivot sale.commission.settlement.line.pivot sale.commission.settlement.line pivot New
view_settlement_line_search sale.commission.settlement.line.search sale.commission.settlement.line search New
view_settlement_line_tree Settlement lines sale.commission.settlement.line tree New
view_settlement_search sale.commission.settlement.search sale.commission.settlement search New
view_settlement_tree Settlements tree sale.commission.settlement tree New
Models touched (17)

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (3)
  • action_cancel(self)
    Put settlements associated to the invoices in exception.
  • invoice_validate(self)
    Put settlements associated to the invoices again in invoice.
  • recompute_lines_agents(self)

New fields (1)
  • agents One2many → account.invoice.line.agent
    comodel_name='account.invoice.line.agent'
Public methods (0)

No public methods.

New fields (9)
  • agent_line Many2many → sale.commission.settlement.line
    column1='agent_line_id' column2='settlement_id' comodel_name='sale.commission.settlement.line' copy=False relation='settlement_agent_line_rel'
  • amount Float
    compute='_compute_amount' store=True string='Amount settled'
  • company_id Many2one
    readonly=True related='object_id.company_id' store=True
  • currency_id Many2one
    readonly=True related='object_id.currency_id'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='object_id.invoice_id' store=True string='Invoice'
  • invoice_date Date
    readonly=True related='invoice.date_invoice' store=True string='Invoice date'
  • object_id Many2one → account.invoice.line
    comodel_name='account.invoice.line' oldname='invoice_line'
  • product Many2one → product.product
    comodel_name='product.product' related='object_id.product_id'
  • settled Boolean
    compute='_compute_settled' copy=False store=True
Public methods (0)

No public methods.

New fields (1)
  • commission_free Boolean
    default=False string='Free of commission'
Public methods (0)

No public methods.

New fields (6)
  • agent Boolean
    help='Check this field if the partner is a creditor or an agent.' string='Creditor/Agent'
  • agent_type Selection
    default='agent' required=True selection=[('agent', 'External agent')] string='Type'
  • agents Many2many → res.partner
    column1='partner_id' column2='agent_id' comodel_name='res.partner' domain=[('agent', '=', True)] relation='partner_agent_rel'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' help='This is the default commission used in the sales where this agent is assigned. It can be changed on each operation if needed.' string='Commission'
  • settlement Selection
    default='monthly' required=True selection=[('monthly', 'Monthly'), ('quaterly', 'Quarterly'), ('semi', 'Semi-annual'), ('annual', 'Annual')] string='Settlement period'
  • settlements One2many → sale.commission.settlement
    comodel_name='sale.commission.settlement' inverse_name='agent' readonly=True
Public methods (1)
  • onchange_agent_type(self)
    @api.onchange('agent_type')

New fields (8)
  • active Boolean
    default=True
  • amount_base_type Selection
    default='gross_amount' required=True selection=[('gross_amount', 'Gross Amount'), ('net_amount', 'Net Amount')] string='Base'
  • commission_type Selection
    default='fixed' required=True selection=[('fixed', 'Fixed percentage'), ('section', 'By sections')] string='Type'
  • fix_qty Float
    string='Fixed percentage'
  • invoice_state Selection
    default='open' required=True string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
  • name Char
    required=True args: 'Name'
  • sections One2many → sale.commission.section
    comodel_name='sale.commission.section' inverse_name='commission'
  • settlements Many2many → sale.commission.settlement
    comodel_name='sale.commission.settlement'
Public methods (1)
  • calculate_section(self, base)
    @api.multi

New fields (16)
  • agent_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Agent'
  • amount Float
    readonly=True args: 'Amount'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Category of Product'
  • commission_id Many2one → sale.commission
    readonly=True args: 'sale.commission', 'Sale commission'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_invoice Date
    readonly=True args: 'Date Invoice'
  • invoice_line_id Many2one → account.invoice.line
    readonly=True args: 'account.invoice.line', 'Invoice 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: 'Price subtotal'
  • price_unit Float
    readonly=True args: 'Price unit'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • quantity Float
    readonly=True args: '# of Qty'
  • settled Boolean
    readonly=True args: 'Settled'
  • uom_id Many2one → product.uom
    readonly=True args: 'product.uom', 'Unit of Measure'
Public methods (1)
  • init(self)
    @api.model

New fields (3)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]" ondelete='restrict' required=True
  • commission Many2one → sale.commission
    comodel_name='sale.commission' ondelete='restrict' required=True
  • object_id Many2one → sale.commission.mixin
    comodel_name='sale.commission.mixin' copy=False ondelete='cascade' required=True string='Parent'
Public methods (1)
  • onchange_agent(self)
    @api.onchange('agent')

New fields (5)
  • date Date
  • from_settlement Boolean
    default=_default_from_settlement
  • journal Many2one → account.journal
    comodel_name='account.journal' default=_default_journal domain="[('type', '=', 'purchase')]" required=True
  • product Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • settlements Many2many → sale.commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='sale.commission.settlement' default=_default_settlements domain="[('state', '=', 'settled')]" relation='sale_commission_make_invoice_settlement_rel'
Public methods (1)
  • button_create(self)
    @api.multi

New fields (2)
  • agents Many2many → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • date_to Date
    default=fields.Date.today() required=True args: 'Up to'
Public methods (1)
  • action_settle(self)
    @api.multi

New fields (4)
  • agents One2many → sale.commission.line.mixin
    comodel_name='sale.commission.line.mixin' copy=True default=_default_agents help='Agents/Commissions related to the invoice line.' inverse_name='object_id' string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
  • commission_status Char
    compute='_compute_commission_status' string='Commission'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
Public methods (3)
  • create(self, vals)
    @api.model
    Workaround for https://github.com/odoo/odoo/issues/17618.
  • recompute_agents(self)
    Force a recomputation of the agents according prepare method.
  • write(self, vals)
    Workaround for https://github.com/odoo/odoo/issues/17618.

New fields (4)
  • amount_from Float
    string='From'
  • amount_to Float
    string='To'
  • commission Many2one → sale.commission
    string='Commission' args: 'sale.commission'
  • percent Float
    required=True string='Percent'
Public methods (0)

No public methods.

New fields (11)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • agent_type Selection
    related='agent.agent_type'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency' default=_default_currency readonly=True
  • date_from Date
    string='From'
  • date_to Date
    string='To'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' readonly=True string='Generated invoice'
  • lines One2many → sale.commission.settlement.line
    comodel_name='sale.commission.settlement.line' inverse_name='settlement' readonly=True string='Settlement lines'
  • name Char
    args: 'Name'
  • state Selection
    default='settled' readonly=True selection=[('settled', 'Settled'), ('invoiced', 'Invoiced'), ('cancel', 'Canceled'), ('except_invoice', 'Invoice exception')] string='State'
  • total Float
    compute='_compute_total' readonly=True store=True
Public methods (5)
  • action_cancel(self)
    @api.multi
  • action_invoice(self)
    @api.multi
  • create_invoice_header(self, journal, date)
    Hook that can be used in order to group invoices or find open invoices
  • make_invoices(self, journal, product, date=False)
    @api.multi
  • unlink(self)
    @api.multi
    Allow to delete only cancelled settlements

New fields (10)
  • agent Many2one → res.partner
    comodel_name='res.partner' readonly=True related='agent_line.agent' store=True
  • agent_line Many2many → account.invoice.line.agent
    column1='settlement_id' column2='agent_line_id' comodel_name='account.invoice.line.agent' relation='settlement_agent_line_rel' required=True
  • commission Many2one → sale.commission
    comodel_name='sale.commission' related='agent_line.commission'
  • company_id Many2one → res.company
    comodel_name='res.company' related='settlement.company_id'
  • currency_id Many2one
    readonly=True related='agent_line.currency_id' store=True
  • date Date
    related='agent_line.invoice_date' store=True
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='invoice_line.invoice_id' store=True string='Invoice'
  • invoice_line Many2one → account.invoice.line
    comodel_name='account.invoice.line' related='agent_line.object_id' store=True
  • settled_amount Float
    readonly=True related='agent_line.amount' store=True
  • settlement Many2one → sale.commission.settlement
    ondelete='cascade' readonly=True required=True args: 'sale.commission.settlement'
Public methods (0)

No public methods.

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (2)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
    Add to the existing context of the field `order_line` "partner_id" key for avoiding to be replaced by other view inheritance. We have to do this processing in text mode without evaling context, as it can contain JS stuff.
  • recompute_lines_agents(self)

New fields (1)
  • agents One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent'
Public methods (0)

No public methods.

New fields (2)
  • amount Float
    compute='_compute_amount' store=True
  • object_id Many2one → sale.order.line
    comodel_name='sale.order.line' oldname='sale_line'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/9.0/sale_commission
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYSales Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Pexego, Abstract, Serv. Tecnol. Avanzados - Pedro M. Baeza, Avanzosc, Savoir-faire linux
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Pexego, Abstract, Serv. Tecnol. Avanzados - Pedro M. Baeza, Avanzosc, Savoir-faire linux
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Stéphane Bidoul (ACSONE), OCA Transbot, oca-travis, Weblate, Oihane Crucelaegui, Hugo Rodrigues
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:15:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - account
    - base_setup
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - report
    - analytic
    - web_tip
    - web_planner
    - sale
    - sales_team
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (19)
XML IDNameModelTypeStatus
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
invoice_form_agent account.invoice.form.agent account.invoice field Inherits account.invoice_form
invoice_line_agent_tree account.invoice.line.agent.tree account.invoice.line.agent tree New
invoice_line_form_agent account.invoice.line.form.agent account.invoice.line field Inherits account.view_invoice_line_form
product_template_form_view_commission product.template.common.form.commission product.template label Inherits product.product_template_form_view
sale_commission_form Sales commissions form sale.commission form New
sale_commission_make_invoice_form Make invoices sale.commission.make.invoice form New
sale_commission_tree Sales commissions tree sale.commission tree New
view_order_agent_form_inherit sale.agent.order.inherit.form sale.order field Inherits sale.view_order_form
view_partner_form_agent res.partner.form.agent res.partner xpath Inherits base.view_partner_form
view_res_partner_filter res.partner.select res.partner filter Inherits base.view_res_partner_filter
view_sale_order_line_tree sale.order.line.agent.tree sale.order.line.agent tree New
view_settled_wizard Select period to settle sale.commission.make.settle form New
view_settlement_form Settlements sale.commission.settlement form New
view_settlement_line_graph sale.commission.settlement.line.graph sale.commission.settlement.line graph New
view_settlement_line_search sale.commission.settlement.line.search sale.commission.settlement.line search New
view_settlement_line_tree Settlement lines sale.commission.settlement.line tree New
view_settlement_search sale.commission.settlement.search sale.commission.settlement search New
view_settlement_tree Settlements tree sale.commission.settlement tree New
Models touched (14)

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (2)
  • action_cancel(self)
    @api.multi
    Put settlements associated to the invoices in exception.
  • invoice_validate(self)
    @api.multi
    Put settlements associated to the invoices again in invoice.

New fields (2)
  • agents One2many → account.invoice.line.agent
    comodel_name='account.invoice.line.agent' copy=True default=_default_agents help='Agents/Commissions related to the invoice line.' inverse_name='invoice_line' string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
Public methods (0)

No public methods.

New fields (9)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]" ondelete='restrict' required=True
  • agent_line Many2many → sale.commission.settlement.line
    column1='agent_line_id' column2='settlement_id' comodel_name='sale.commission.settlement.line' copy=False relation='settlement_agent_line_rel'
  • amount Float
    compute='_compute_amount' store=True string='Amount settled'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' ondelete='restrict' required=True
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='invoice_line.invoice_id' store=True string='Invoice'
  • invoice_date Date
    readonly=True related='invoice.date_invoice' store=True string='Invoice date'
  • invoice_line Many2one → account.invoice.line
    comodel_name='account.invoice.line' copy=False ondelete='cascade' required=True
  • product Many2one → product.product
    comodel_name='product.product' related='invoice_line.product_id'
  • settled Boolean
    compute='_compute_settled' copy=False store=True
Public methods (1)
  • onchange_agent(self)
    @api.onchange('agent')

New fields (1)
  • commission_free Boolean
    default=False string='Free of commission'
Public methods (0)

No public methods.

New fields (6)
  • agent Boolean
    help='Check this field if the partner is a creditor or an agent.' string='Creditor/Agent'
  • agent_type Selection
    default='agent' required=True selection=[('agent', 'External agent')] string='Type'
  • agents Many2many → res.partner
    column1='partner_id' column2='agent_id' comodel_name='res.partner' domain="[('agent', '=', True)]" relation='partner_agent_rel'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' help='This is the default commission used in the sales where this agent is assigned. It can be changed on each operation if needed.' string='Commission'
  • settlement Selection
    default='monthly' required=True selection=[('monthly', 'Monthly'), ('quaterly', 'Quarterly'), ('semi', 'Semi-annual'), ('annual', 'Annual')] string='Settlement period'
  • settlements One2many → sale.commission.settlement
    comodel_name='sale.commission.settlement' inverse_name='agent' readonly=True
Public methods (1)
  • onchange_agent_type(self)
    @api.onchange('agent_type')

New fields (7)
  • active Boolean
    default=True
  • amount_base_type Selection
    default='gross_amount' required=True selection=[('gross_amount', 'Gross Amount'), ('net_amount', 'Net Amount')] string='Base'
  • commission_type Selection
    default='fixed' required=True selection=[('fixed', 'Fixed percentage'), ('section', 'By sections')] string='Type'
  • fix_qty Float
    string='Fixed percentage'
  • invoice_state Selection
    default='open' required=True string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
  • name Char
    required=True args: 'Name'
  • sections One2many → sale.commission.section
    comodel_name='sale.commission.section' inverse_name='commission'
Public methods (1)
  • calculate_section(self, base)
    @api.multi

New fields (5)
  • date Date
  • from_settlement Boolean
    default=_default_from_settlement
  • journal Many2one → account.journal
    comodel_name='account.journal' default=_default_journal domain="[('type', '=', 'purchase')]" required=True
  • product Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • settlements Many2many → sale.commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='sale.commission.settlement' default=_default_settlements domain="[('state', '=', 'settled')]" relation='sale_commission_make_invoice_settlement_rel'
Public methods (1)
  • button_create(self)
    @api.multi

New fields (2)
  • agents Many2many → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • date_to Date
    default=fields.Date.today() required=True args: 'Up to'
Public methods (1)
  • action_settle(self)
    @api.multi

New fields (4)
  • amount_from Float
    string='From'
  • amount_to Float
    string='To'
  • commission Many2one → sale.commission
    string='Commission' args: 'sale.commission'
  • percent Float
    required=True string='Percent'
Public methods (0)

No public methods.

New fields (9)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • agent_type Selection
    related='agent.agent_type'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' default=_default_currency readonly=True
  • date_from Date
    string='From'
  • date_to Date
    string='To'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' readonly=True string='Generated invoice'
  • lines One2many → sale.commission.settlement.line
    comodel_name='sale.commission.settlement.line' inverse_name='settlement' readonly=True string='Settlement lines'
  • state Selection
    default='settled' readonly=True selection=[('settled', 'Settled'), ('invoiced', 'Invoiced'), ('cancel', 'Canceled'), ('except_invoice', 'Invoice exception')] string='State'
  • total Float
    compute='_compute_total' readonly=True store=True
Public methods (4)
  • action_cancel(self)
    @api.multi
  • action_invoice(self)
    @api.multi
  • make_invoices(self, journal, product, date=False)
    @api.multi
  • unlink(self)
    @api.multi
    Allow to delete only cancelled settlements

New fields (8)
  • agent Many2one → res.partner
    comodel_name='res.partner' readonly=True related='agent_line.agent' store=True
  • agent_line Many2many → account.invoice.line.agent
    column1='settlement_id' column2='agent_line_id' comodel_name='account.invoice.line.agent' relation='settlement_agent_line_rel' required=True
  • commission Many2one → sale.commission
    comodel_name='sale.commission' related='agent_line.commission'
  • date Date
    related='agent_line.invoice_date' store=True
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='invoice_line.invoice_id' store=True string='Invoice'
  • invoice_line Many2one → account.invoice.line
    comodel_name='account.invoice.line' related='agent_line.invoice_line' store=True
  • settled_amount Float
    readonly=True related='agent_line.amount' store=True
  • settlement Many2one → sale.commission.settlement
    ondelete='cascade' readonly=True required=True args: 'sale.commission.settlement'
Public methods (0)

No public methods.

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (0)

No public methods.

New fields (2)
  • agents One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent' copy=True default=_default_agents inverse_name='sale_line' readonly=True string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
Public methods (0)

No public methods.

New fields (4)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True')]" ondelete='restrict' required=True
  • amount Float
    compute='_compute_amount' store=True
  • commission Many2one → sale.commission
    comodel_name='sale.commission' ondelete='restrict' required=True
  • sale_line Many2one → sale.order.line
    comodel_name='sale.order.line' ondelete='cascade' required=True
Public methods (1)
  • onchange_agent(self)
    @api.onchange('agent')
REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/8.0/sale_commission
VERSION
VERSION 3.1.1
CATEGORY
CATEGORYSales Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Pexego, Abstract, Avanzosc, Savoire-faire linux
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Pexego, Abstract, Avanzosc, Savoire-faire linux
COMMITTERS
COMMITTERSStéphane Bidoul, Yannick Vaucher, Alexandre Fayolle, Holger Brunn, Pedro M. Baeza, GitHub, Stéphane Bidoul (ACSONE), OCA Transbot, PabloCM, Danimar Ribeiro, Nicola Malcontenti, oca-travis, Weblate, Daniel-CA, oihane, sergio, Iván Todorovich, Magno Costa - Akretion, Hendrix Costa, Nicolas Mac Rouillon, Giorgio Borelli, jesusVMayor
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:21
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_widget_one2many_tags
odoo/odoo:
    - base
    - account
    - base_setup
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - report
    - analytic
    - board
    - edi
    - email_template
    - sale
    - sales_team
    - web_kanban_sparkline
    - account_voucher
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (20)
XML IDNameModelTypeStatus
invoice_form_agent account.invoice field Inherits account.invoice_form
invoice_line_agent_form account.invoice.line.agent form New
invoice_line_agent_tree account.invoice.line.agent tree New
invoice_line_form_agent account.invoice.line field Inherits account.view_invoice_line_form
product_template_form_view_commission product.template.common.form.commission product.template label Inherits product.product_template_form_view
sale_commission_form Sales commissions form sale.commission form New
sale_commission_make_invoice_form Make invoices sale.commission.make.invoice form New
sale_commission_tree Sales commissions tree sale.commission tree New
view_order_agent_form_inherit sale.order field Inherits sale.view_order_form
view_partner_form_agent res.partner.form.agent res.partner xpath Inherits base.view_partner_form
view_res_partner_filter res.partner.select res.partner filter Inherits base.view_res_partner_filter
view_sale_order_line_form sale.order.line.agent form New
view_sale_order_line_tree sale.order.line.agent tree New
view_settled_wizard Select period to settle sale.commission.make.settle form New
view_settlement_form Settlements sale.commission.settlement form New
view_settlement_line_graph sale.commission.settlement.line.graph sale.commission.settlement.line graph New
view_settlement_line_search sale.commission.settlement.line.search sale.commission.settlement.line search New
view_settlement_line_tree Settlement lines sale.commission.settlement.line tree New
view_settlement_search sale.commission.settlement.search sale.commission.settlement search New
view_settlement_tree Settlements tree sale.commission.settlement tree New
Models touched (14)

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (2)
  • action_cancel(self)
    @api.multi
    Put settlements associated to the invoices in exception.
  • invoice_validate(self)
    @api.multi
    Put settlements associated to the invoices again in invoice.

New fields (2)
  • agents One2many → account.invoice.line.agent
    comodel_name='account.invoice.line.agent' copy=True default=_default_agents help='Agents/Commissions related to the invoice line.' inverse_name='invoice_line' string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
Public methods (0)

No public methods.

New fields (10)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]" ondelete='restrict' required=True
  • agent_line Many2many → sale.commission.settlement.line
    column1='agent_line_id' column2='settlement_id' comodel_name='sale.commission.settlement.line' copy=False relation='settlement_agent_line_rel'
  • amount Float
    compute='_compute_amount' store=True string='Amount settled'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' ondelete='restrict' required=True
  • company_id Many2one → res.company
    related='invoice.company_id' store=True args: 'res.company', 'Company'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='invoice_line.invoice_id' store=True string='Invoice'
  • invoice_date Date
    readonly=True related='invoice.date_invoice' store=True string='Invoice date'
  • invoice_line Many2one → account.invoice.line
    comodel_name='account.invoice.line' copy=False ondelete='cascade' required=True
  • product Many2one → product.product
    comodel_name='product.product' related='invoice_line.product_id'
  • settled Boolean
    compute='_compute_settled' copy=False store=True
Public methods (2)
  • name_get(self)
    @api.multi
  • onchange_agent(self)
    @api.onchange('agent')

New fields (1)
  • commission_free Boolean
    default=False string='Free of commission'
Public methods (0)

No public methods.

New fields (6)
  • agent Boolean
    help='Check this field if the partner is a creditor or an agent.' string='Creditor/Agent'
  • agent_type Selection
    default='agent' required=True selection=[('agent', 'External agent')] string='Type'
  • agents Many2many → res.partner
    column1='partner_id' column2='agent_id' comodel_name='res.partner' domain="[('agent', '=', True)]" relation='partner_agent_rel'
  • commission Many2one → sale.commission
    comodel_name='sale.commission' help='This is the default commission used in the sales where this agent is assigned. It can be changed on each operation if needed.' string='Commission'
  • settlement Selection
    default='monthly' required=True selection=[('monthly', 'Monthly'), ('quaterly', 'Quarterly'), ('semi', 'Semi-annual'), ('annual', 'Annual')] string='Settlement period'
  • settlements One2many → sale.commission.settlement
    comodel_name='sale.commission.settlement' inverse_name='agent' readonly=True
Public methods (1)
  • onchange_agent_type(self)
    @api.onchange('agent_type')

New fields (8)
  • active Boolean
    default=True
  • amount_base_type Selection
    default='gross_amount' required=True selection=[('gross_amount', 'Gross Amount'), ('net_amount', 'Net Amount')] string='Base'
  • commission_type Selection
    default='fixed' required=True selection=[('fixed', 'Fixed percentage'), ('section', 'By sections')] string='Type'
  • company_id Many2one → res.company
    default=_get_default_company_id string='Company' args: 'res.company'
  • fix_qty Float
    string='Fixed percentage'
  • invoice_state Selection
    default='open' required=True string='Invoice Status' args: [('open', 'Invoice Based'), ('paid', 'Payment Based')]
  • name Char
    required=True args: 'Name'
  • sections One2many → sale.commission.section
    comodel_name='sale.commission.section' inverse_name='commission'
Public methods (1)
  • calculate_section(self, base)
    @api.multi

New fields (6)
  • date Date
  • from_settlement Boolean
    default=_default_from_settlement
  • journal Many2one → account.journal
    comodel_name='account.journal' default=_default_journal domain="[('type', '=', 'purchase')]" required=True
  • product Many2one → product.product
    comodel_name='product.product' required=True string='Product for invoicing'
  • refund_journal Many2one → account.journal
    comodel_name='account.journal' default=_default_refund_journal domain="[('type', '=', 'purchase_refund')]" required=True string='Refund Journal'
  • settlements Many2many → sale.commission.settlement
    column1='wizard_id' column2='settlement_id' comodel_name='sale.commission.settlement' default=_default_settlements domain="[('state', '=', 'settled')]" relation='sale_commission_make_invoice_settlement_rel'
Public methods (1)
  • button_create(self)
    @api.multi

New fields (2)
  • agents Many2many → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • date_to Date
    default=fields.Date.today() required=True args: 'Up to'
Public methods (1)
  • action_settle(self)
    @api.multi

New fields (4)
  • amount_from Float
    string='From'
  • amount_to Float
    string='To'
  • commission Many2one → sale.commission
    string='Commission' args: 'sale.commission'
  • percent Float
    required=True string='Percent'
Public methods (0)

No public methods.

New fields (10)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True)]"
  • agent_type Selection
    related='agent.agent_type'
  • company_id Many2one → res.company
    args: 'res.company', 'Company'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' default=_default_currency readonly=True
  • date_from Date
    string='From'
  • date_to Date
    string='To'
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' readonly=True string='Generated invoice'
  • lines One2many → sale.commission.settlement.line
    comodel_name='sale.commission.settlement.line' inverse_name='settlement' readonly=True string='Settlement lines'
  • state Selection
    default='settled' readonly=True selection=[('settled', 'Settled'), ('invoiced', 'Invoiced'), ('cancel', 'Canceled'), ('except_invoice', 'Invoice exception')] string='State'
  • total Float
    compute='_compute_total' readonly=True store=True
Public methods (4)
  • action_cancel(self)
    @api.multi
  • action_invoice(self)
    @api.multi
  • make_invoices(self, journal, refund_journal, product, date=False)
    @api.multi
  • unlink(self)
    @api.multi
    Allow to delete only cancelled settlements

New fields (9)
  • agent Many2one → res.partner
    comodel_name='res.partner' readonly=True related='agent_line.agent' store=True
  • agent_line Many2many → account.invoice.line.agent
    column1='settlement_id' column2='agent_line_id' comodel_name='account.invoice.line.agent' relation='settlement_agent_line_rel' required=True
  • commission Many2one → sale.commission
    comodel_name='sale.commission' related='agent_line.commission'
  • company_id Many2one → res.company
    related='settlement.company_id' store=True args: 'res.company', 'Company'
  • date Date
    related='agent_line.invoice_date' store=True
  • invoice Many2one → account.invoice
    comodel_name='account.invoice' related='invoice_line.invoice_id' store=True string='Invoice'
  • invoice_line Many2one → account.invoice.line
    comodel_name='account.invoice.line' related='agent_line.invoice_line' store=True
  • settled_amount Float
    readonly=True related='agent_line.amount' store=True
  • settlement Many2one → sale.commission.settlement
    ondelete='cascade' readonly=True required=True args: 'sale.commission.settlement'
Public methods (0)

No public methods.

New fields (1)
  • commission_total Float
    compute='_compute_commission_total' store=True string='Commissions'
Public methods (0)

No public methods.

New fields (2)
  • agents One2many → sale.order.line.agent
    comodel_name='sale.order.line.agent' copy=True default=_default_agents inverse_name='sale_line' readonly=True string='Agents & commissions'
  • commission_free Boolean
    readonly=True related='product_id.commission_free' store=True string='Comm. free'
Public methods (0)

No public methods.

New fields (4)
  • agent Many2one → res.partner
    comodel_name='res.partner' domain="[('agent', '=', True')]" ondelete='restrict' required=True
  • amount Float
    compute='_compute_amount' store=True
  • commission Many2one → sale.commission
    comodel_name='sale.commission' ondelete='restrict' required=True
  • sale_line Many2one → sale.order.line
    comodel_name='sale.order.line' ondelete='cascade' required=True
Public methods (2)
  • name_get(self)
    @api.multi
  • onchange_agent(self)
    @api.onchange('agent')
REPOSITORY
REPOSITORYOCA/commission
GIT
GIThttps://github.com/OCA/commission.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/commission/tree/7.0/sale_commission
VERSION
VERSION 1.1
CATEGORY
CATEGORYGeneric Modules/Sales & Purchases
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Pexego
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Pexego
COMMITTERS
COMMITTERSDavide Corio, Alexandre Fayolle, Joao Alfredo Gama Batista, Sandy Carter, Maxime Chambreuil, Pedro M. Baeza, marta pexego, Luis Felipe Mileo, Alex Comba, Launchpad Translations on behalf of openerp-icm
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:07:13
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - account
    - base_setup
    - web_kanban
    - web
    - product
    - process
    - decimal_precision
    - mail
    - analytic
    - board
    - edi
    - email_template
    - sale
    - account_voucher
    - hr
    - resource
    - stock
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Sales commissions
=================

This modules allow you to define sales agents and assign customers to them.
You can then generate the supplier invoices to pay their commissions.

Video : http://www.youtube.com/watch?v=NDqRnF1qKS0

Contributors
============
Davide Corio <davide.corio@domsense.com>
Joao Alfredo Gama Batista <joao.gama@savoirfairelinux.com>
Sandy Carter <sandy.carter@savoirfairelinux.com>
    

Code Analysis

Views touched (33)
XML IDNameModelTypeStatus
commission_form Commissions commission form New
commission_tree commission.tree commission tree New
invoice_form_add_agent_field account.invoice.form.add_agent_field account.invoice field Inherits account.invoice_form
invoice_form_add_code_country account.invoice.form.add_code_country account.invoice field Inherits account.invoice_tree
invoice_line_agent_form invoice.line.agent.form invoice.line.agent form New
invoice_line_agent_tree invoice.line.agent.tree invoice.line.agent tree New
invoice_line_form_agent account.invoice.line.agent.form account.invoice.line field Inherits account.view_invoice_line_form
invoice_supplier_form_add_agent_field account.invoice.supplier.form.add_agent_field account.invoice field Inherits account.invoice_supplier_form
product_normal_form_view_exclude_commisions product.normal.form.exclude_commissions product.product field Inherits product.product_normal_form_view
sale_order_agent_comision_form sale.order.agent.comision.form. sale.order.agent form New
stock_picking_form_add_agent_field stock.picking.form.add_agent_field stock.picking field Inherits stock.view_picking_out_form
view_order_agent_form_inherit sale.agent.order.inherit.form sale.order field Inherits sale.view_order_form
view_partner_agent_comision_form partner.agent.comision.form.inherit res.partner.agent form New
view_partner_agent_comision_tree partner.agent.comision.tree.inherit res.partner.agent tree New
view_partner_form_add_agent res.partner.form.add_agent res.partner xpath Inherits base.view_partner_form
view_partner_form_add_agents res.partner.form.add_agents res.partner field Inherits view_partner_form_add_agent
view_recalculate_commision_wizard Select period to recalculate recalculate.commission.wizard form New
view_sale_agen_search model commission.sale.agent.search sale.agent search New
view_sale_agent_comision_tree sale.agent.comision.tree sale.order.agent tree New
view_saleagent_form saleagent.info.form sale.agent form New
view_saleagent_tree saleagent.info.tree sale.agent tree New
view_settled_invoice Make invoices settled.invoice.wizard form New
view_settled_invoice_agent_form Settled_invoice_agent_form settled.invoice.agent form New
view_settled_invoice_agent_tree Settled_invoice_agent_tree settled.invoice.agent tree New
view_settled_invoice_summary_search commission.settled.invoice.summary.search settled.invoice.agent search New
view_settled_wizard Select period to settle settled.wizard form New
view_settlement_agent_form Settlement Agent settlement.agent form New
view_settlement_agent_search commission.settlement.agent.summary.search settlement.agent search New
view_settlement_agent_tree Settlement_agent_tree settlement.agent tree New
view_settlement_form Settlements settlement form New
view_settlement_line_tree Settlement Lines settlement.line tree New
view_settlement_search settlement.search settlement search New
view_settlement_tree settlements_tree settlement tree New
Models touched (20)

New fields (0)

No new fields.

Public methods (1)
  • onchange_partner_id(self, cr, uid, ids, type, part, date_invoice=False, payment_term=False, partner_bank_id=False, company_id=False, context=None)
    Al cambiar la empresa nos treamos el representante asociado a la empresa

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • calcula_tramos(self, cr, uid, ids, base, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • calculate_commission(self, cr, uid, ids, context=None)
  • onchange_agent_id(self, cr, uid, ids, agent_id, context=None)
    al cambiar el agente se le carga la comisión
  • onchange_commission_id(self, cr, uid, ids, agent_id, commission_id, context=None)
    alerta al usuario sobre la comisión elegida

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • action_cancel(self, cr, uid, ids, connect=None, context=None)
    Cancel Calculation
  • recalculate_exec(self, cr, uid, ids, context=None)
    se ejecuta correctamente desde dos.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • name_get(self, cr, uid, ids, context=None)
    devuelve como nombre del agente del partner el nombre del agente
  • onchange_agent_id(self, cr, uid, ids, agent_id, context=None)
    al cambiar el agente cargamos sus comisión
  • onchange_commission_id(self, cr, uid, ids, agent_id=False, commission_id=False, context=None)
    al cambiar la comisión comprobamos la selección

New fields (0)

No new fields.

Public methods (1)
  • calcula_tramos(self, cr, uid, ids, base, context=None)
    calcula los tramos por factura

New fields (0)

No new fields.

Public methods (4)
  • action_ship_create(self, cr, uid, ids, context=None)
    extend this method to add agent_id to picking
  • create(self, cr, uid, values, context=None)
  • onchange_partner_id(self, cr, uid, ids, part, context=None)
    heredamos el evento de cambio del campo partner_id para actualizar el campo agent_id
  • write(self, cr, uid, ids, values, context=None)

New fields (0)

No new fields.

Public methods (3)
  • name_get(self, cr, uid, ids, context=None)
    devuelve como nombre del agente del partner el nombre del agente
  • onchange_agent_id(self, cr, uid, ids, agent_id, context=None)
    al cambiar el agente cargamos sus comisión
  • onchange_commission_id(self, cr, uid, ids, agent_id=False, commission_id=False, context=None)
    al cambiar la comisión comprobamos la selección

New fields (0)

No new fields.

Public methods (1)
  • invoice_line_create(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (1)
  • init(self, cr)

New fields (0)

No new fields.

Public methods (1)
  • create_invoice(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (2)
  • action_cancel(self, cr, uid, ids, connect=None, context=None)
    Cancel Liquidation
  • settlement_exec(self, cr, uid, ids, context=None)
    se ejecuta correctamente desde dos.

New fields (0)

No new fields.

Public methods (4)
  • action_cancel(self, cr, uid, ids, context=None)
    Cancel the liquidation
  • action_invoice_create(self, cursor, user, ids, journal_id, product_id, context=None)
  • calcula(self, cr, uid, ids, agent_ids, date_from, date_to, context=None)
    genera una entrada de liquidación por agente
  • unlink(self, cr, uid, ids, context=None)
    permite borrar liquidaciones canceladas

New fields (0)

No new fields.

Public methods (3)
  • action_invoice_create(self, cr, uid, ids, journal_id, product_id, context=None)
    Return ids of created invoices for the settlements
  • calcula(self, cr, uid, ids, date_from, date_to, context=None)
  • get_currency_id(self, cr, uid, picking, context=None)

New fields (0)

No new fields.

Public methods (1)
  • calcula(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.