Sale Order Product Recommendation

sale_order_product_recommendation
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_order_product_recommendation
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSOmar (Comunitea), OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds a recommended products wizard to current sale order.

It is based on recent delivered products, and allows the salesman to
quickly know the most sold products for current customer, which results
in an easy to use hint to improve sale.

If you want a better mobile usability, the module is ready to use with
the 'web_widget_numeric_step' module. Just install it and you will get a
better numeric input experience.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
res_config_settings_view_form_sale res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order xpath Inherits sale.view_order_form
Models touched (4)

New fields (2)
  • force_zero_units_included Boolean
  • sale_line_recommendation_domain Char
    default='[]'
Public methods (0)

No public methods.

New fields (6)
  • default_line_amount Integer
    default=15 default_model='sale.order.recommendation' string='Default sale number of recommendations'
  • default_months Float
    default=6 default_model='sale.order.recommendation' string='Default sale recommendation months'
  • default_sale_recommendation_price_origin Selection
    default='pricelist' default_model='sale.order.recommendation' required=True string='Price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • default_use_delivery_address Boolean
    default_model='sale.order.recommendation' string='Use delivery address'
  • force_zero_units_included Boolean
    help='Add recomented products in so even if units included is zero.' readonly=False related='company_id.force_zero_units_included'
  • sale_line_recommendation_domain Char
    help='Domain applied to find SO lines to propose as recommended products.' readonly=False related='company_id.sale_line_recommendation_domain'
Public methods (0)

No public methods.

New fields (7)
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
  • recommendations_order Selection
    default='times_delivered desc' required=True args: [('times_delivered desc', 'Times delivered'), ('units_delivered desc', 'Units delivered'), ('product_categ_complete_name asc', 'Product category'), ('product_default_code asc', 'Product code'), ('product_name asc', 'Product name')]
  • sale_recommendation_price_origin Selection
    default='pricelist' string='Product price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • use_delivery_address Boolean
    string='Use delivery address'
Public methods (3)
  • action_accept(self)
    Propagate recommendations to sale order.
  • action_reset(self)
    Empty the list of recommendations.
  • generate_recommendations(self)
    Generate lines according to context sale order.

New fields (17)
  • currency_id Many2one
    related='product_id.currency_id'
  • image_128 Image
    readonly=True related='product_id.image_128'
  • partner_id Many2one
    related='wizard_id.order_id.partner_id'
  • price_unit Monetary
    compute='_compute_price_unit'
  • pricelist_id Many2one
    related='wizard_id.order_id.pricelist_id'
  • product_categ_complete_name Char
    readonly=True related='product_id.categ_id.complete_name' store=True string='Product category'
  • product_default_code Char
    readonly=True related='product_id.default_code' store=True
  • product_id Many2one → product.product
    args: 'product.product'
  • product_is_favorite Boolean
    readonly=False related='product_id.is_favorite' store=True
  • product_name Char
    readonly=True related='product_id.name'
  • product_uom_readonly Boolean
    related='sale_line_id.product_uom_readonly'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • sale_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_sale_uom_id' readonly=False store=True string='Unit of Measure'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
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/18.0/sale_order_product_recommendation
VERSION
VERSION 1.1.3
CATEGORY
CATEGORYSales
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, David Vidal, oca-ci, Carlos Roca, pilarvargas-tecnativa, Aungkokolin1997
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds a recommended products wizard to current sale order.

It is based on recent delivered products, and allows the salesman to
quickly know the most sold products for current customer, which results
in an easy to use hint to improve sale.

If you want a better mobile usability, the module is ready to use with
the 'web_widget_numeric_step' module. Just install it and you will get a
better numeric input experience.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
res_config_settings_view_form_sale res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order xpath Inherits sale.view_order_form
Models touched (4)

New fields (2)
  • force_zero_units_included Boolean
  • sale_line_recommendation_domain Char
    default='[]'
Public methods (0)

No public methods.

New fields (6)
  • default_line_amount Integer
    default=15 default_model='sale.order.recommendation' string='Default sale number of recommendations'
  • default_months Float
    default=6 default_model='sale.order.recommendation' string='Default sale recommendation months'
  • default_sale_recommendation_price_origin Selection
    default='pricelist' default_model='sale.order.recommendation' required=True string='Price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • default_use_delivery_address Boolean
    default_model='sale.order.recommendation' string='Use delivery address'
  • force_zero_units_included Boolean
    help='Add recomented products in so even if units included is zero.' readonly=False related='company_id.force_zero_units_included'
  • sale_line_recommendation_domain Char
    help='Domain applied to find SO lines to propose as recommended products.' readonly=False related='company_id.sale_line_recommendation_domain'
Public methods (0)

No public methods.

New fields (7)
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
  • recommendations_order Selection
    default='times_delivered desc' required=True args: [('times_delivered desc', 'Times delivered'), ('units_delivered desc', 'Units delivered'), ('product_categ_complete_name asc', 'Product category'), ('product_default_code asc', 'Product code'), ('product_name asc', 'Product name')]
  • sale_recommendation_price_origin Selection
    default='pricelist' string='Product price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • use_delivery_address Boolean
    string='Use delivery address'
Public methods (3)
  • action_accept(self)
    Propagate recommendations to sale order.
  • action_reset(self)
    Empty the list of recommendations.
  • generate_recommendations(self)
    Generate lines according to context sale order.

New fields (18)
  • currency_id Many2one
    related='product_id.currency_id'
  • image_128 Image
    readonly=True related='product_id.image_128'
  • partner_id Many2one
    related='wizard_id.order_id.partner_id'
  • price_unit Monetary
    compute='_compute_price_unit'
  • pricelist_id Many2one
    related='wizard_id.order_id.pricelist_id'
  • product_categ_complete_name Char
    readonly=True related='product_id.categ_id.complete_name' store=True string='Product category'
  • product_default_code Char
    readonly=True related='product_id.default_code' store=True
  • product_id Many2one → product.product
    args: 'product.product'
  • product_is_favorite Boolean
    readonly=False related='product_id.is_favorite' store=True
  • product_name Char
    readonly=True related='product_id.name'
  • product_uom_category_id Many2one
    depends=['product_id'] related='product_id.uom_id.category_id'
  • product_uom_readonly Boolean
    related='sale_line_id.product_uom_readonly'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • sale_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_sale_uom_id' domain="[('category_id', '=', product_uom_category_id)]" readonly=False store=True string='Unit of Measure'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
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/17.0/sale_order_product_recommendation
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSOCA-git-bot, David Vidal, oca-ci, andrel
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:05
ODOO DEPENDENCIES
ODOO DEPENDENCIES 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 a recommended products wizard to current sale order.

It is based on recent delivered products, and allows the salesman to
quickly know the most sold products for current customer, which results
in an easy to use hint to improve sale.

If you want a better mobile usability, the module is ready to use with
the 'web_widget_numeric_step' module. Just install it and you will get a
better numeric input experience.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
res_config_settings_view_form_sale res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order xpath Inherits sale.view_order_form
Models touched (4)

New fields (2)
  • force_zero_units_included Boolean
  • sale_line_recommendation_domain Char
    default='[]'
Public methods (0)

No public methods.

New fields (6)
  • default_line_amount Integer
    default=15 default_model='sale.order.recommendation' string='Default sale number of recommendations'
  • default_months Float
    default=6 default_model='sale.order.recommendation' string='Default sale recommendation months'
  • default_sale_recommendation_price_origin Selection
    default='pricelist' default_model='sale.order.recommendation' required=True string='Price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • default_use_delivery_address Boolean
    default_model='sale.order.recommendation' string='Use delivery address'
  • force_zero_units_included Boolean
    help='Add recomented products in so even if units included is zero.' readonly=False related='company_id.force_zero_units_included'
  • sale_line_recommendation_domain Char
    help='Domain applied to find SO lines to propose as recommended products.' readonly=False related='company_id.sale_line_recommendation_domain'
Public methods (0)

No public methods.

New fields (7)
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
  • recommendations_order Selection
    default='times_delivered desc' required=True args: [('times_delivered desc', 'Times delivered'), ('units_delivered desc', 'Units delivered'), ('product_categ_complete_name asc', 'Product category'), ('product_default_code asc', 'Product code'), ('product_name asc', 'Product name')]
  • sale_recommendation_price_origin Selection
    default='pricelist' string='Product price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • use_delivery_address Boolean
    string='Use delivery address'
Public methods (3)
  • action_accept(self)
    Propagate recommendations to sale order.
  • action_reset(self)
    Empty the list of recommendations.
  • generate_recommendations(self)
    Generate lines according to context sale order.

New fields (17)
  • currency_id Many2one
    related='product_id.currency_id'
  • partner_id Many2one
    related='wizard_id.order_id.partner_id'
  • price_unit Float
    compute='_compute_price_unit' digits='Product Price'
  • pricelist_id Many2one
    related='wizard_id.order_id.pricelist_id'
  • product_categ_complete_name Char
    readonly=True related='product_id.categ_id.complete_name' store=True string='Product category'
  • product_default_code Char
    readonly=True related='product_id.default_code' store=True
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • product_name Char
    name='Product name' readonly=True related='product_id.name' store=True
  • product_priority Selection
    readonly=False related='product_id.priority' store=True
  • product_uom_category_id Many2one
    depends=['product_id'] related='product_id.uom_id.category_id'
  • product_uom_readonly Boolean
    related='sale_line_id.product_uom_readonly'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • sale_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_sale_uom_id' domain="[('category_id', '=', product_uom_category_id)]" readonly=False store=True string='Unit of Measure'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
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/16.0/sale_order_product_recommendation
VERSION
VERSION 3.0.2
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSJairo Llopis, sergio-teruel, Weblate, OCA-git-bot, oca-ci, Telmo Santos, Eduardo De Miguel, sygel, tris
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:45
ODOO DEPENDENCIES
ODOO DEPENDENCIES 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
res_config_settings_view_form_sale res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order xpath Inherits sale.view_order_form
Models touched (4)

New fields (2)
  • force_zero_units_included Boolean
  • sale_line_recommendation_domain Char
    default='[]'
Public methods (0)

No public methods.

New fields (6)
  • default_line_amount Integer
    default=15 default_model='sale.order.recommendation' string='Default sale number of recommendations'
  • default_months Float
    default=6 default_model='sale.order.recommendation' string='Default sale recommendation months'
  • default_sale_recommendation_price_origin Selection
    default='pricelist' default_model='sale.order.recommendation' required=True string='Price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • default_use_delivery_address Boolean
    default_model='sale.order.recommendation' string='Use delivery address'
  • force_zero_units_included Boolean
    help='Add recomented products in so even if units included is zero.' readonly=False related='company_id.force_zero_units_included'
  • sale_line_recommendation_domain Char
    help='Domain applied to find SO lines to propose as recommended products.' readonly=False related='company_id.sale_line_recommendation_domain'
Public methods (0)

No public methods.

New fields (7)
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
  • recommendations_order Selection
    default='times_delivered desc' required=True args: [('times_delivered desc', 'Times delivered'), ('units_delivered desc', 'Units delivered'), ('product_categ_complete_name asc', 'Product category'), ('product_default_code asc', 'Product code'), ('product_name asc', 'Product name')]
  • sale_recommendation_price_origin Selection
    default='pricelist' string='Product price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • use_delivery_address Boolean
    string='Use delivery address'
Public methods (3)
  • action_accept(self)
    Propagate recommendations to sale order.
  • action_reset(self)
    Empty the list of recommendations.
  • generate_recommendations(self)
    Generate lines according to context sale order.

New fields (17)
  • currency_id Many2one
    related='product_id.currency_id'
  • partner_id Many2one
    related='wizard_id.order_id.partner_id'
  • price_unit Monetary
    compute='_compute_price_unit'
  • pricelist_id Many2one
    related='wizard_id.order_id.pricelist_id'
  • product_categ_complete_name Char
    readonly=True related='product_id.categ_id.complete_name' store=True string='Product category'
  • product_default_code Char
    readonly=True related='product_id.default_code' store=True
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • product_name Char
    name='Product name' readonly=True related='product_id.name' store=True
  • product_priority Selection
    readonly=False related='product_id.priority' store=True
  • product_uom_category_id Many2one
    depends=['product_id'] related='product_id.uom_id.category_id'
  • product_uom_readonly Boolean
    related='sale_line_id.product_uom_readonly'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • sale_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_sale_uom_id' domain="[('category_id', '=', product_uom_category_id)]" readonly=False store=True string='Unit of Measure'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
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/15.0/sale_order_product_recommendation
VERSION
VERSION 1.2.2
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSJairo Llopis, sergio-teruel, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, pilarvargas-tecnativa, Cesar Andres Sanchez, Christopher Rogos, josep-tecnativa
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:34
ODOO DEPENDENCIES
ODOO DEPENDENCIES 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
res_config_settings_view_form_sale res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order xpath Inherits sale.view_order_form
Models touched (4)

New fields (4)
  • default_line_amount Integer
    default=15 default_model='sale.order.recommendation' string='Default sale number of recommendations'
  • default_months Float
    default=6 default_model='sale.order.recommendation' string='Default sale recommendation months'
  • default_sale_recommendation_price_origin Selection
    default='pricelist' default_model='sale.order.recommendation' required=True string='Price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • default_use_delivery_address Boolean
    default_model='sale.order.recommendation' string='Use delivery address'
Public methods (0)

No public methods.

New fields (1)
  • product_id Many2one
    index=True
Public methods (0)

No public methods.

New fields (7)
  • last_compute Char
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
  • sale_recommendation_price_origin Selection
    default='pricelist' string='Product price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • use_delivery_address Boolean
    string='Use delivery address'
Public methods (1)
  • action_accept(self)
    Propagate recommendations to sale order.

New fields (11)
  • currency_id Many2one
    related='product_id.currency_id'
  • partner_id Many2one
    related='wizard_id.order_id.partner_id'
  • price_unit Monetary
    compute='_compute_price_unit'
  • pricelist_id Many2one
    related='wizard_id.order_id.pricelist_id'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • sale_uom_id Many2one
    related='sale_line_id.product_uom'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
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/13.0/sale_order_product_recommendation
VERSION
VERSION 3.1.1
CATEGORY
CATEGORYSales
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, mreficent, Alexandre Díaz, OCA Transbot, sergio-teruel, Víctor Martínez, Ernesto Tejeda, Alexandre D. Díaz, oca-travis, OCA-git-bot, Carlos Roca
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:13
ODOO DEPENDENCIES
ODOO DEPENDENCIES 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
res_config_settings_view_form_sale res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order header Inherits sale.view_order_form
Models touched (4)

New fields (4)
  • default_line_amount Integer
    default=15 default_model='sale.order.recommendation' string='Default sale number of recommendations'
  • default_months Float
    default=6 default_model='sale.order.recommendation' string='Default sale recommendation months'
  • default_sale_recommendation_price_origin Selection
    default='pricelist' default_model='sale.order.recommendation' required=True string='Price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • default_use_delivery_address Boolean
    default_model='sale.order.recommendation' string='Use delivery address'
Public methods (0)

No public methods.

New fields (1)
  • product_id Many2one
    index=True
Public methods (0)

No public methods.

New fields (7)
  • last_compute Char
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
  • sale_recommendation_price_origin Selection
    default='pricelist' string='Product price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
  • use_delivery_address Boolean
    string='Use delivery address'
Public methods (1)
  • action_accept(self)
    Propagate recommendations to sale order.

New fields (11)
  • currency_id Many2one
    related='product_id.currency_id'
  • partner_id Many2one
    related='wizard_id.order_id.partner_id'
  • price_unit Monetary
    compute='_compute_price_unit'
  • pricelist_id Many2one
    related='wizard_id.order_id.pricelist_id'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • sale_uom_id Many2one
    related='sale_line_id.product_uom'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
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/12.0/sale_order_product_recommendation
VERSION
VERSION 3.0.2
CATEGORY
CATEGORYSales
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, Denis Roussel, david, Alexandre Díaz, OCA Transbot, sergio-teruel, Víctor Martínez, oca-travis, OCA-git-bot
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 (3)
XML IDNameModelTypeStatus
res_config_settings_view_form_sale res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order header Inherits sale.view_order_form
Models touched (4)

New fields (1)
  • default_sale_recommendation_price_origin Selection
    default='pricelist' default_model='sale.order.recommendation' required=True string='Price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
Public methods (0)

No public methods.

New fields (1)
  • product_id Many2one
    index=True
Public methods (0)

No public methods.

New fields (6)
  • last_compute Char
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
  • sale_recommendation_price_origin Selection
    default='pricelist' string='Product price origin' args: [('pricelist', 'Pricelist'), ('last_sale_price', 'Last sale price')]
Public methods (1)
  • action_accept(self)
    Propagate recommendations to sale order.

New fields (11)
  • currency_id Many2one
    readonly=True related='product_id.currency_id'
  • partner_id Many2one
    readonly=True related='wizard_id.order_id.partner_id'
  • price_unit Monetary
    compute='_compute_price_unit'
  • pricelist_id Many2one
    readonly=True related='wizard_id.order_id.pricelist_id'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • sale_uom_id Many2one
    related='sale_line_id.product_uom'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
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_order_product_recommendation
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYSales
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, Jairo Llopis, david, OCA Transbot, oca-travis, OCA-git-bot, OCA Git Bot, David
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 (2)
XML IDNameModelTypeStatus
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order header Inherits sale.view_order_form
Models touched (2)

New fields (5)
  • last_compute Char
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
Public methods (1)
  • action_accept(self)
    @api.multi
    Propagate recommendations to sale order.

New fields (11)
  • currency_id Many2one
    readonly=True related='product_id.currency_id'
  • is_modified Boolean
  • partner_id Many2one
    readonly=True related='wizard_id.order_id.partner_id'
  • price_unit Monetary
    compute='_compute_price_unit'
  • pricelist_id Many2one
    readonly=True related='wizard_id.order_id.pricelist_id'
  • product_id Many2one → product.product
    string='Product' args: 'product.product'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
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_order_product_recommendation
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSales
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, Carlos Dauden, OCA Transbot, oca-travis
WEBSITE
WEBSITEhttps://www.tecnativa.com/
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 (2)
XML IDNameModelTypeStatus
sale_order_recommendation_view_form Recommended Products for this Customer sale.order.recommendation form New
view_order_form Recommended products button sale.order header Inherits sale.view_order_form
Models touched (2)

New fields (5)
  • last_compute Char
  • line_amount Integer
    default=15 help='The less, the faster they will be found.' required=True args: 'Number of recommendations'
  • line_ids One2many → sale.order.recommendation.line
    args: 'sale.order.recommendation.line', 'wizard_id', 'Products'
  • months Float
    default=6 help='Consider these months backwards to generate recommendations.' required=True
  • order_id Many2one → sale.order
    default=<expr> ondelete='cascade' readonly=True required=True args: 'sale.order', 'Sale Order'
Public methods (2)
  • action_accept(self)
    @api.multi
    Propagate recommendations to sale order.
  • create(self, vals)
    @api.model

New fields (11)
  • currency_id Many2one
    readonly=True related='product_id.currency_id'
  • is_modified Boolean
  • partner_id Many2one
    readonly=True related='wizard_id.order_id.partner_id'
  • price_unit Monetary
    compute='_compute_price_unit'
  • pricelist_id Many2one
    readonly=True related='wizard_id.order_id.pricelist_id'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • sale_line_id Many2one → sale.order.line
    comodel_name='sale.order.line'
  • times_delivered Integer
    readonly=True
  • units_delivered Float
    readonly=True
  • units_included Float
  • wizard_id Many2one → sale.order.recommendation
    ondelete='cascade' readonly=True required=True args: 'sale.order.recommendation', 'Wizard'
Public methods (0)

No public methods.