Sales product set

sale_product_set
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/19.0/sale_product_set
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Christopher Rogos
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_set
odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
A **product set** is a list of products which end customers aren't
aware, this list is defined by sales manager.

This module aims to load a product set in a sales order though a wizard. The product set is a list of products and quantities that gets inserted as separate sales order lines.

After a *product set* is added to the sales order, each line can be
updated or removed as any other sales order lines.

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
product_set_add_form_view sale.product.set.wizard.form.view sale.product.set.wizard form New
res_config_settings_inherit_view res.config.settings.inherit.view res.config.settings xpath Inherits sale.res_config_settings_view_form
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set field Inherits product_set.view_product_set_form
view_product_set_line_tree product.set.line.list product.set.line field Inherits product_set.view_product_set_line_tree
Models touched (4)

New fields (1)
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
Public methods (1)
  • prepare_sale_order_line_values(self, order, quantity, sequence=0)

New fields (1)
  • archive_partner_product_sets Boolean
    config_parameter='sale_product_set.archive_partner_product_sets' help='When a partner is archived or un-archived its product sets are archived or un-archived as well.' string='Sync product sets active state with partner'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (3)
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' required=True args: 'sale.order', 'Sale Order'
  • partner_id Many2one
    ondelete='cascade' related='order_id.partner_id'
  • skip_existing_products Boolean
    default=False help='Enable this to not add new lines for products already included in SO lines.'
Public methods (1)
  • add_set(self)
    Add product set, multiplied by quantity in sale order line
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/18.0/sale_product_set
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, juancarlosonate-tecnativa
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_set
odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
A **product set** is a list of products which end customers aren't
aware, this list is defined by sales manager.

This module aims to load a product set in a sales order though a wizard. The product set is a list of products and quantities that gets inserted as separate sales order lines.

After a *product set* is added to the sales order, each line can be
updated or removed as any other sales order lines.

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
product_set_add_form_view sale.product.set.wizard.form.view sale.product.set.wizard form New
res_config_settings_inherit_view res.config.settings.inherit.view res.config.settings xpath Inherits sale.res_config_settings_view_form
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set field Inherits product_set.view_product_set_form
view_product_set_line_tree product.set.line.list product.set.line field Inherits product_set.view_product_set_line_tree
Models touched (4)

New fields (1)
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
Public methods (1)
  • prepare_sale_order_line_values(self, order, quantity, max_sequence=0)

New fields (1)
  • archive_partner_product_sets Boolean
    config_parameter='sale_product_set.archive_partner_product_sets' help='When a partner is archived or un-archived its product sets are archived or un-archived as well.' string='Sync product sets active state with partner'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (3)
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' required=True args: 'sale.order', 'Sale Order'
  • partner_id Many2one
    ondelete='cascade' related='order_id.partner_id'
  • skip_existing_products Boolean
    default=False help='Enable this to not add new lines for products already included in SO lines.'
Public methods (2)
  • add_set(self)
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, set_line, max_sequence=0)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/17.0/sale_product_set
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSale
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Nils Coenen
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:05
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_set
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
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
A **product set** is a list of products which end customers aren't
aware, this list is defined by sales manager.

This module aims to help salesman to quickly create several sale order
lines at once in a quotation.

After a *product set* is added to the sale order, each line can be
updated or removed as any other sale order lines.

This differs from packing products as you don't follow *product set* are
not linked to sale order lines once they are added.

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
product_set_add_form_view sale.product.set.wizard.form.view sale.product.set.wizard form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set field Inherits product_set.view_product_set_form
view_product_set_line_tree product.set.line.tree product.set.line field Inherits product_set.view_product_set_line_tree
Models touched (2)

New fields (1)
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
Public methods (1)
  • prepare_sale_order_line_values(self, order, quantity, max_sequence=0)

New fields (3)
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' required=True args: 'sale.order', 'Sale Order'
  • partner_id Many2one
    ondelete='cascade' related='order_id.partner_id'
  • skip_existing_products Boolean
    default=False help='Enable this to not add new lines for products already included in SO lines.'
Public methods (2)
  • add_set(self)
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, set_line, max_sequence=0)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/16.0/sale_product_set
VERSION
VERSION 3.0.1
CATEGORY
CATEGORYSale
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, pilarvargas-tecnativa, Christopher Rogos, Will Keesler
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:45
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_set
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
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
product_set_add_form_view sale.product.set.wizard.form.view sale.product.set.wizard form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set field Inherits product_set.view_product_set_form
view_product_set_line_tree product.set.line.tree product.set.line field Inherits product_set.view_product_set_line_tree
Models touched (2)

New fields (1)
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
Public methods (1)
  • prepare_sale_order_line_values(self, order, quantity, max_sequence=0)

New fields (3)
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' required=True args: 'sale.order', 'Sale Order'
  • partner_id Many2one
    ondelete='cascade' related='order_id.partner_id'
  • skip_existing_products Boolean
    default=False help='Enable this to not add new lines for products already included in SO lines.'
Public methods (2)
  • add_set(self)
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, set_line, max_sequence=0)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/15.0/sale_product_set
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSale
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSmanu, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:34
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - onchange_helper
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
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
product_set_add_form_view product.set.add.form.view product.set.add form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set form New
view_product_set_line_search product.set.line.search product.set.line search New
view_product_set_line_tree product.set.line.tree product.set.line tree New
view_product_set_search product.set.search product.set search New
view_product_set_tree product.set.tree product.set tree New
Models touched (3)

New fields (6)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> ondelete='cascade' args: 'res.company', 'Company'
  • name Char
    help='Product set name' required=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help="You can attache the set to a specific partner or no one. If you don't specify one, it's going to be available for all of them." index=True ondelete='cascade' required=False
  • ref Char
    copy=False help='Product set internal reference' string='Internal Reference'
  • set_line_ids One2many → product.set.line
    copy=True string='Products' args: 'product.set.line', 'product_set_id'
Public methods (1)
  • name_get(self)

New fields (6)
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' required=True args: 'sale.order', 'Sale Order'
  • partner_id Many2one
    ondelete='cascade' related='order_id.partner_id'
  • product_set_id Many2one → product.set
    ondelete='cascade' required=True args: 'product.set', 'Product set'
  • product_set_line_ids Many2many → product.set.line
    compute='_compute_product_set_line_ids' ondelete='cascade' readonly=False required=True store=True string='Product set lines' args: 'product.set.line'
  • quantity Float
    default=1.0 digits='Product Unit of Measure' required=True
  • skip_existing_products Boolean
    default=False help='Enable this to not add new lines for products already included in SO lines.'
Public methods (2)
  • add_set(self)
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, set_line, max_sequence=0)

New fields (6)
  • active Boolean
    readonly=True related='product_set_id.active' store=True string='Active'
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('sale_ok', '=', True)] required=True string='Product'
  • product_set_id Many2one → product.set
    ondelete='cascade' string='Set' args: 'product.set'
  • quantity Float
    default=1.0 digits='Product Unit of Measure' required=True
  • sequence Integer
    default=0 required=True
Public methods (1)
  • prepare_sale_order_line_values(self, order, quantity, max_sequence=0)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/14.0/sale_product_set
VERSION
VERSION 1.6.0
CATEGORY
CATEGORYSale
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSPedro M. Baeza, Denis Roussel, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Simone Orsi, Anna Janiszewska, oca-ci, Alessandro Uffreduzzi, Hai Lang, Tran Thanh Phuc, oca-git-bot, Mantux11
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - onchange_helper
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
    - sale_management
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
product_set_add_form_view product.set.add.form.view product.set.add form New
res_config_settings_inherit_view res.config.settings.inherit.view res.config.settings xpath Inherits sale.res_config_settings_view_form
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set form New
view_product_set_line_search product.set.line.search product.set.line search New
view_product_set_line_tree product.set.line.tree product.set.line tree New
view_product_set_search product.set.search product.set search New
view_product_set_tree product.set.tree product.set tree New
Models touched (5)

New fields (6)
  • active Boolean
    default=True string='Active'
  • company_id Many2one → res.company
    default=<expr> ondelete='cascade' args: 'res.company', 'Company'
  • name Char
    help='Product set name' required=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help="You can attache the set to a specific partner or no one. If you don't specify one, it's going to be available for all of them." index=True ondelete='cascade' required=False
  • ref Char
    copy=False help='Product set internal reference' string='Internal Reference'
  • set_line_ids One2many → product.set.line
    copy=True string='Products' args: 'product.set.line', 'product_set_id'
Public methods (1)
  • name_get(self)

New fields (6)
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' required=True args: 'sale.order', 'Sale Order'
  • partner_id Many2one
    ondelete='cascade' related='order_id.partner_id'
  • product_set_id Many2one → product.set
    ondelete='cascade' required=True args: 'product.set', 'Product set'
  • product_set_line_ids Many2many → product.set.line
    compute='_compute_product_set_line_ids' ondelete='cascade' readonly=False required=True store=True string='Product set lines' args: 'product.set.line'
  • quantity Float
    default=1.0 digits='Product Unit of Measure' required=True
  • skip_existing_products Boolean
    default=False help='Enable this to not add new lines for products already included in SO lines.'
Public methods (2)
  • add_set(self)
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, set_line, max_sequence=0)

New fields (6)
  • active Boolean
    readonly=True related='product_set_id.active' store=True string='Active'
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('sale_ok', '=', True)] required=True string='Product'
  • product_set_id Many2one → product.set
    ondelete='cascade' string='Set' args: 'product.set'
  • quantity Float
    default=1.0 digits='Product Unit of Measure' required=True string='Quantity'
  • sequence Integer
    default=0 required=True string='Sequence'
Public methods (1)
  • prepare_sale_order_line_values(self, order, quantity, max_sequence=0)

New fields (1)
  • archive_partner_product_sets Boolean
    config_parameter='sale_product_set.archive_partner_product_sets' help='When a partner is archived or un-archived its product sets are archived or un-archived as well.' string='Sync product sets active state with partner'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/13.0/sale_product_set
VERSION
VERSION 1.4.1
CATEGORY
CATEGORYSale
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSPedro M. Baeza, Denis Roussel, Akim Juillerat, OCA Transbot, Víctor Martínez, Thierry Ducrest, oca-travis, Weblate, OCA-git-bot, Simone Orsi, Adrià Gil Sorribes, Carlos Roca
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:13
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - onchange_helper
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 (7)
XML IDNameModelTypeStatus
product_set_add_form_view product.set.add.form.view product.set.add form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set form New
view_product_set_line_search product.set.line.search product.set.line search New
view_product_set_line_tree product.set.line.tree product.set.line tree New
view_product_set_search product.set.search product.set search New
view_product_set_tree product.set.tree product.set tree New
Models touched (3)

New fields (6)
  • active Boolean
    default=True string='Active'
  • company_id Many2one → res.company
    default=<expr> ondelete='cascade' args: 'res.company', 'Company'
  • name Char
    help='Product set name' required=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help="You can attache the set to a specific partner or no one. If you don't specify one, it's going to be available for all of them." index=True ondelete='cascade' required=False
  • ref Char
    copy=False help='Product set internal reference' string='Internal Reference'
  • set_line_ids One2many → product.set.line
    copy=True string='Products' args: 'product.set.line', 'product_set_id'
Public methods (1)
  • name_get(self)

New fields (6)
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' required=True args: 'sale.order', 'Sale Order'
  • partner_id Many2one
    ondelete='cascade' related='order_id.partner_id'
  • product_set_id Many2one → product.set
    ondelete='cascade' required=True args: 'product.set', 'Product set'
  • product_set_line_ids Many2many → product.set.line
    compute='_compute_product_set_line_ids' ondelete='cascade' readonly=False required=True args: 'product.set.line', 'Product set lines'
  • quantity Float
    default=1.0 digits='Product Unit of Measure' required=True
  • skip_existing_products Boolean
    default=False help='Enable this to not add new lines for products already included in SO lines.'
Public methods (2)
  • add_set(self)
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, set_line, max_sequence=0)

New fields (6)
  • active Boolean
    readonly=True related='product_set_id.active' store=True string='Active'
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('sale_ok', '=', True)] required=True string='Product'
  • product_set_id Many2one → product.set
    ondelete='cascade' string='Set' args: 'product.set'
  • quantity Float
    default=1.0 digits='Product Unit of Measure' required=True string='Quantity'
  • sequence Integer
    default=0 required=True string='Sequence'
Public methods (1)
  • prepare_sale_order_line_values(self, order, quantity, max_sequence=0)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/12.0/sale_product_set
VERSION
VERSION 1.3.3
CATEGORY
CATEGORYSale
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSGitHub, Denis Roussel, sbejaoui, OCA Transbot, sergio-teruel, oca-travis, Weblate, OCA-git-bot, Simone Orsi, Carlos Roca
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - decimal_precision
    - uom
    - analytic
    - portal
    - http_routing
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
product_set_add_form_view product.set.add.form.view product.set.add form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set form New
view_product_set_search product.set.search product.set search New
view_product_set_tree product.set.tree product.set tree New
Models touched (3)

New fields (6)
  • active Boolean
    default=True string='Active'
  • company_id Many2one → res.company
    default=<expr> ondelete='cascade' args: 'res.company', 'Company'
  • name Char
    help='Product set name' required=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' help="You can attache the set to a specific partner or no one. If you don't specify one, it's going to be available for all of them." index=True ondelete='cascade' required=False
  • ref Char
    copy=False help='Product set internal reference' string='Internal Reference'
  • set_line_ids One2many → product.set.line
    string='Products' args: 'product.set.line', 'product_set_id'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (5)
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' required=True args: 'sale.order', 'Sale Order'
  • partner_id Many2one
    ondelete='cascade' related='order_id.partner_id'
  • product_set_id Many2one → product.set
    ondelete='cascade' required=True args: 'product.set', 'Product set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True
  • skip_existing_products Boolean
    default=False help='Enable this to not add new lines for products already included in SO lines.'
Public methods (2)
  • add_set(self)
    @api.multi
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, set_line, max_sequence=0)
    @api.multi

New fields (6)
  • active Boolean
    readonly=True related='product_set_id.active' store=True string='Active'
  • discount Float
    default=0.0 digits=dp.get_precision('Discount') string='Discount (%)'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('sale_ok', '=', True)] required=True string='Product'
  • product_set_id Many2one → product.set
    ondelete='cascade' string='Set' args: 'product.set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • sequence Integer
    default=0 required=True string='Sequence'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/11.0/sale_product_set
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYSale
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSPedro M. Baeza, Stéphane Bidoul (ACSONE), OCA Transbot, oca-travis, Weblate, OCA-git-bot, Simone Orsi
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account
    - product
    - decimal_precision
    - analytic
    - web_planner
    - portal
    - http_routing
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
product_set_add_form_view product.set.add.form.view product.set.add form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set form New
view_product_set_search product.set.search product.set search New
view_product_set_tree product.set.tree product.set tree New
Models touched (3)

New fields (2)
  • name Char
    help='Product set name' required=True string='Name'
  • set_line_ids One2many → product.set.line
    string='Products' args: 'product.set.line', 'product_set_id'
Public methods (0)

No public methods.

New fields (2)
  • product_set_id Many2one → product.set
    required=True args: 'product.set', 'Product set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
Public methods (2)
  • add_set(self)
    @api.multi
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, sale_order_id, set, set_line, max_sequence=0)

New fields (5)
  • discount Float
    default=0.0 digits=dp.get_precision('Discount') string='Discount (%)'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('sale_ok', '=', True)] required=True string='Product'
  • product_set_id Many2one → product.set
    ondelete='cascade' string='Set' args: 'product.set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • sequence Integer
    default=0 required=True string='Sequence'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/10.0/sale_product_set
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYSale
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSPedro M. Baeza, Denis Roussel, Stéphane Bidoul (ACSONE), OCA Transbot, Denis Leemann, oca-travis, Weblate, Rafael Blasco
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - web_planner
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
product_set_add_form_view product.set.add.form.view product.set.add form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set form New
view_product_set_search product.set.search product.set search New
view_product_set_tree product.set.tree product.set tree New
Models touched (3)

New fields (3)
  • image Binary
    attachment=True help='Select an image to display for the product set' string='Image'
  • name Char
    help='Product set name' required=True string='Name'
  • set_line_ids One2many → product.set.line
    string='Products' args: 'product.set.line', 'product_set_id'
Public methods (0)

No public methods.

New fields (2)
  • product_set_id Many2one → product.set
    required=True args: 'product.set', 'Product set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
Public methods (2)
  • add_set(self)
    @api.multi
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, sale_order_id, set, set_line, max_sequence=0)

New fields (4)
  • product_id Many2one → product.product
    domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_set_id Many2one → product.set
    ondelete='cascade' string='Set' args: 'product.set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • sequence Integer
    default=0 required=True string='Sequence'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/9.0/sale_product_set
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSPedro M. Baeza, mreficent, Stéphane Bidoul (ACSONE), OCA Transbot, oca-travis, Weblate, Jonathan Nemry (ACSONE)
WEBSITE
WEBSITEhttps://odoo-community.org/
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:15:20
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - web_tip
    - web_planner
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
product_set_add_form_view product.set.add.form.view product.set.add form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set form New
view_product_set_search product.set.search product.set search New
view_product_set_tree product.set.tree product.set tree New
Models touched (3)

New fields (2)
  • name Char
    help='Product set name' required=True
  • set_line_ids One2many → product.set.line
    comodel_name='product.set.line' inverse_name='product_set_id' string='Products'
Public methods (0)

No public methods.

New fields (2)
  • product_set_id Many2one → product.set
    ondelete='cascade' required=True string='Product set' args: 'product.set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True
Public methods (2)
  • add_set(self)
    @api.multi
    Add product set, multiplied by quantity in sale order
  • prepare_sale_order_line_data(self, sale_order_id, set, set_line, max_sequence=0)

New fields (4)
  • product_id Many2one → product.product
    domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_set_id Many2one → product.set
    copy=False index=True ondelete='cascade' readonly=True string='Set' args: 'product.set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True
  • sequence Integer
    default=0 required=True
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/8.0/sale_product_set
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSale
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Anybox
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Anybox
COMMITTERS
COMMITTERSStéphane Bidoul, Pedro M. Baeza, Stéphane Bidoul (ACSONE), Pierre Verkest, OCA Transbot, oca-travis, Weblate, Matjaž Mozetič
WEBSITE
WEBSITEhttp://anybox.fr
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - web_kanban_sparkline
    - account_voucher
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - board
    - edi
    - email_template
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
product_set_add_form_view product.set.add.form.view product.set.add form New
view_order_stock_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_product_set_form product.set.form product.set form New
view_product_set_search product.set.search product.set search New
view_product_set_tree product.set.tree product.set tree New
Models touched (3)

New fields (2)
  • name Char
    help='Product set name' required=True args: 'Name'
  • set_line_ids One2many → product.set.line
    copy=True args: 'product.set.line', 'product_set_id', 'Products'
Public methods (1)
  • copy(self, default=None)
    @api.multi

New fields (2)
  • product_set_id Many2one → product.set
    required=True args: 'product.set', _('Product set')
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True string=_('Quantity')
Public methods (2)
  • add_set(self)
    @api.multi
    Add product set, multiplied by quantity in sale order line
  • prepare_sale_order_line_data(self, sale_order_id, set, set_line, max_sequence=0)

New fields (4)
  • product_id Many2one → product.product
    domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_set_id Many2one → product.set
    ondelete='cascade' args: 'product.set', 'Set'
  • quantity Float
    default=1 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • sequence Integer
    default=0 required=True string='Sequence'
Public methods (0)

No public methods.