Product Margin Classification

product_margin_classification
REPOSITORY
REPOSITORYOCA/margin-analysis
GIT
GIThttps://github.com/OCA/margin-analysis.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/margin-analysis/tree/16.0/product_margin_classification
VERSION
VERSION 1.3.1
CATEGORY
CATEGORYAccount
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), GRAP
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), GRAP
COMMITTERS
COMMITTERSSylvain LE GAL, GitHub, Weblate, OCA-git-bot, Carmen Bianca BAKKER, oca-ci, hugues de keyzer, Simon Hick, Alicia Garzo Moreno
WEBSITE
WEBSITEhttps://github.com/OCA/margin-analysis
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:54
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 (6)
XML IDNameModelTypeStatus
view_product_margin_classification_form product.margin.classification form New
view_product_margin_classification_tree product.margin.classification tree New
view_product_product_form product.product label Inherits product.product_normal_form_view
view_product_product_search product.product field Inherits product.product_search_form_view
view_product_product_tree product.product tree New
view_product_template_form product.template label Inherits product.product_template_only_form_view
Models touched (3)

New fields (12)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • markup Float
    digits='Margin Rate' help='Value that help you to compute the sale price, based on your cost, as defined: Sale Price = (Cost * (100 + Markup)) / 100\nIt is computed with the following formula Markup = 100 * (Sale Price - Cost) / Cost' required=True
  • name Char
    required=True
  • price_round Float
    default=<expr> digits='Product Price' help='Sets the price so that it is a multiple of this value.\nRounding is applied after the margin and before the surcharge.\nTo have prices that end in 9.99, set rounding 1, surcharge -0.01' string='Price Rounding'
  • price_surcharge Float
    digits='Product Price' help='Specify the fixed amount to add or substract(if negative) to the amount calculated with the discount.'
  • product_correct_price_qty Integer
    compute='_compute_product_different_price_qty' string='Total Products With Correct Price'
  • product_ids One2many → product.product
    comodel_name='product.product' inverse_name='margin_classification_id' string='Products'
  • product_incorrect_price_qty Integer
    compute='_compute_product_different_price_qty' string='Total Products With Incorrect Price'
  • product_qty Integer
    compute='_compute_product_qty' store=True string='Products Quantity'
  • product_too_cheap_qty Integer
    compute='_compute_product_different_price_qty' string='Total Products Too Cheap'
  • product_too_expensive_qty Integer
    compute='_compute_product_different_price_qty' string='Total Products Too Expensive'
  • profit_margin Float
    compute='_compute_profit_margin' digits='Margin Rate' help="Also called 'Net margin' or 'Net Profit Ratio'.\nIt is computed with the following formula Profit Margin = 100 * (Sale Price - Cost) / Sale Price" inverse='_inverse_profit_margin'
Public methods (3)
  • apply_theoretical_price(self)
  • apply_theoretical_price_too_cheap(self)
  • apply_theoretical_price_too_expensive(self)

New fields (4)
  • margin_classification_id Many2one → product.margin.classification
    comodel_name='product.margin.classification' string='Margin Classification'
  • margin_state Selection
    compute='_compute_theoretical_multi' selection=MARGIN_STATE_SELECTION store=True string='Theoretical Price State'
  • theoretical_difference Float
    compute='_compute_theoretical_multi' digits='Product Price' store=True
  • theoretical_price Float
    compute='_compute_theoretical_multi' digits='Product Price' store=True
Public methods (4)
  • apply_theoretical_price(self)
  • apply_theoretical_price_too_cheap(self)
  • apply_theoretical_price_too_expensive(self)
  • use_theoretical_price(self)

New fields (4)
  • margin_classification_id Many2one → product.margin.classification
    comodel_name='product.margin.classification' compute='_compute_theoretical_multi_template' inverse='_inverse_margin_classification_id' search='_search_margin_classification_id' string='Margin Classification'
  • margin_state Selection
    compute='_compute_theoretical_multi_template' selection=MARGIN_STATE_SELECTION string='Theoretical Price State'
  • theoretical_difference Float
    compute='_compute_theoretical_multi_template' digits='Product Price'
  • theoretical_price Float
    compute='_compute_theoretical_multi_template' digits='Product Price'
Public methods (4)
  • apply_theoretical_price(self)
  • apply_theoretical_price_too_cheap(self)
  • apply_theoretical_price_too_expensive(self)
  • use_theoretical_price(self)
REPOSITORY
REPOSITORYOCA/margin-analysis
GIT
GIThttps://github.com/OCA/margin-analysis.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/margin-analysis/tree/12.0/product_margin_classification
VERSION
VERSION 1.0.4
CATEGORY
CATEGORYAccount
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), GRAP
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), GRAP
COMMITTERS
COMMITTERSSylvain LE GAL, oca-travis, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/margin-analysis
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:22
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 (6)
XML IDNameModelTypeStatus
view_product_margin_classification_form product.margin.classification form New
view_product_margin_classification_tree product.margin.classification tree New
view_product_product_form product.product field Inherits product.product_normal_form_view
view_product_product_search product.product field Inherits product.product_search_form_view
view_product_product_tree product.product tree New
view_product_template_form product.template field Inherits product.product_template_only_form_view
Models touched (3)

New fields (12)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • markup Float
    digits=dp.get_precision('Margin Rate') help='Value that help you to compute the sale price, based on your cost, as defined: Sale Price = (Cost * (100 + Markup)) / 100\nIt is computed with the following formula Markup = 100 * (Sale Price - Cost) / Cost' required=True string='Markup'
  • name Char
    required=True string='Name'
  • price_round Float
    default=<expr> digits=dp.get_precision('Product Price') help='Sets the price so that it is a multiple of this value.\nRounding is applied after the margin and before the surcharge.\nTo have prices that end in 9.99, set rounding 1, surcharge -0.01' string='Price Rounding'
  • price_surcharge Float
    digits=dp.get_precision('Product Price') help='Specify the fixed amount to add or substract(if negative) to the amount calculated with the discount.' string='Price Surcharge'
  • product_correct_price_qty Integer
    compute='_compute_product_different_price_qty' string='Total Products With Correct Price'
  • product_ids One2many → product.product
    comodel_name='product.product' inverse_name='margin_classification_id' string='Products'
  • product_incorrect_price_qty Integer
    compute='_compute_product_different_price_qty' string='Total Products With Incorrect Price'
  • product_qty Integer
    compute='_compute_product_qty' store=True string='Products Quantity'
  • product_too_cheap_qty Integer
    compute='_compute_product_different_price_qty' string='Total Products Too Cheap'
  • product_too_expensive_qty Integer
    compute='_compute_product_different_price_qty' string='Total Products Too Expensive'
  • profit_margin Float
    compute='_compute_profit_margin' digits=dp.get_precision('Margin Rate') help="Also called 'Net margin' or 'Net Profit Ratio'.\nIt is computed with the following formula Profit Margin = 100 * (Sale Price - Cost) / Sale Price" inverse='_inverse_profit_margin' string='Profit Margin'
Public methods (3)
  • apply_theoretical_price(self)
    @api.multi
  • apply_theoretical_price_too_cheap(self)
    @api.multi
  • apply_theoretical_price_too_expensive(self)
    @api.multi

New fields (4)
  • margin_classification_id Many2one → product.margin.classification
    comodel_name='product.margin.classification' string='Margin Classification'
  • margin_state Selection
    compute='_compute_theoretical_multi' selection=MARGIN_STATE_SELECTION store=True string='Theoretical Price State'
  • theoretical_difference Float
    compute='_compute_theoretical_multi' digits=dp.get_precision('Product Price') store=True string='Theoretical Difference'
  • theoretical_price Float
    compute='_compute_theoretical_multi' digits=dp.get_precision('Product Price') store=True string='Theoretical Price'
Public methods (1)
  • use_theoretical_price(self)
    @api.multi

New fields (4)
  • margin_classification_id Many2one → product.margin.classification
    comodel_name='product.margin.classification' readonly=False related='product_variant_ids.margin_classification_id' string='Margin Classification'
  • margin_state Selection
    related='product_variant_ids.margin_state' selection=MARGIN_STATE_SELECTION string='Theoretical Price State'
  • theoretical_difference Float
    digits=dp.get_precision('Product Price') related='product_variant_ids.theoretical_difference' string='Theoretical Difference'
  • theoretical_price Float
    digits=dp.get_precision('Product Price') related='product_variant_ids.theoretical_price' string='Theoretical Price'
Public methods (1)
  • use_theoretical_price(self)
    @api.multi
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/10.0/product_margin_classification
VERSION
VERSION 2.0.2
CATEGORY
CATEGORYAccount
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), GRAP
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), GRAP
COMMITTERS
COMMITTERSDenis Roussel, Francisco Fernández @PlanetaTIC, OCA Transbot, Miquel Raïch, oca-travis, Weblate, OCA-git-bot
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
view_product_margin_classification_form product.margin.classification form New
view_product_margin_classification_tree product.margin.classification tree New
view_product_template_form product.template field Inherits product.product_template_form_view
view_product_template_search product.template field Inherits product.product_template_search_view
view_product_template_tree product.template tree New
Models touched (3)

New fields (12)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • markup Float
    digits=dp.get_precision('Margin Rate') help='Value that help you to compute the sale price, based on your cost, as defined: Sale Price = (Cost * (100 + Markup)) / 100\nIt is computed with the following formula Markup = 100 * (Sale Price - Cost) / Cost' old_name='margin' required=True string='Markup'
  • name Char
    required=True string='Name'
  • price_round Float
    default=<expr> digits=dp.get_precision('Product Price') help='Sets the price so that it is a multiple of this value.\nRounding is applied after the margin and before the surcharge.\nTo have prices that end in 9.99, set rounding 1, surcharge -0.01' string='Price Rounding'
  • price_surcharge Float
    digits=dp.get_precision('Product Price') help='Specify the fixed amount to add or substract(if negative) to the amount calculated with the discount.' string='Price Surcharge'
  • profit_margin Float
    compute='_compute_profit_margin' digits=dp.get_precision('Margin Rate') help="Also called 'Net margin' or 'Net Profit Ratio'.\nIt is computed with the following formula Profit Margin = 100 * (Sale Price - Cost) / Sale Price" inverse='_inverse_profit_margin' string='Profit Margin'
  • template_correct_price_qty Integer
    compute='_compute_template_different_price_qty' store=True string='Total Products With Correct Price'
  • template_ids One2many → product.template
    comodel_name='product.template' inverse_name='margin_classification_id' string='Products'
  • template_incorrect_price_qty Integer
    compute='_compute_template_different_price_qty' store=True string='Total Products With Incorrect Price'
  • template_qty Integer
    compute='_compute_template_qty' store=True string='Products Quantity'
  • template_too_cheap_qty Integer
    compute='_compute_template_different_price_qty' store=True string='Total Products Too Cheap'
  • template_too_expensive_qty Integer
    compute='_compute_template_different_price_qty' store=True string='Total Products Too Expensive'
Public methods (3)
  • apply_theoretical_price(self)
    @api.multi
  • apply_theoretical_price_too_cheap(self)
    @api.multi
  • apply_theoretical_price_too_expensive(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • use_theoretical_price_variant(self)
    @api.multi

New fields (4)
  • margin_classification_id Many2one → product.margin.classification
    comodel_name='product.margin.classification' string='Margin Classification'
  • margin_state Selection
    compute='_compute_theoretical_multi' selection=MARGIN_STATE_SELECTION store=True string='Theoretical Price State'
  • theoretical_difference Float
    compute='_compute_theoretical_multi' digits=dp.get_precision('Product Price') store=True string='Theoretical Difference'
  • theoretical_price Float
    compute='_compute_theoretical_multi' digits=dp.get_precision('Product Price') store=True string='Theoretical Price'
Public methods (1)
  • use_theoretical_price(self)
    @api.multi
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/8.0/product_margin_classification
VERSION
VERSION 2.1.0
CATEGORY
CATEGORYAccount
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), GRAP
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), GRAP
COMMITTERS
COMMITTERSSylvain LE GAL, OCA Transbot, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttp://www.grap.coop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - report
    - analytic
    - board
    - edi
    - email_template
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
view_product_margin_classification_form product.margin.classification form New
view_product_margin_classification_tree product.margin.classification tree New
view_product_template_form product.template field Inherits product.product_template_form_view
view_product_template_search product.template field Inherits product.product_template_search_view
view_product_template_tree product.template tree New
Models touched (3)

New fields (11)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • markup Float
    digits=dp.get_precision('Margin Rate') help='Value that help you to compute the sale price, based on your cost, as defined: Sale Price = (Cost * (1 + Markup))\nIt is computed with the following formula Markup = (Sale Price - Cost) / Cost' old_name='margin' required=True string='Markup'
  • name Char
    required=True string='Name'
  • price_round Float
    default=<expr> digits_compute=dp.get_precision('Product Price') help='Sets the price so that it is a multiple of this value.\nRounding is applied after the margin and before the surcharge.\nTo have prices that end in 9.99, set rounding 1, surcharge -0.01' string='Price Rounding'
  • price_surcharge Float
    digits_compute=dp.get_precision('Product Price') help='Specify the fixed amount to add or substract(if negative) to the amount calculated with the discount.' string='Price Surcharge'
  • profit_margin Float
    compute='_compute_profit_margin' digits=dp.get_precision('Margin Rate') help="Also called 'Net margin' or 'Net Profit Ratio'.\nIt is computed with the following formula Profit Margin = (Sale Price - Cost) / Sale Price" inverse='_inverse_profit_margin' string='Profit Margin'
  • template_cheap_qty Integer
    compute='_compute_template_different_price_qty' multi='differente_price' store=True string='Products Cheaper'
  • template_different_price_qty Integer
    compute='_compute_template_different_price_qty' multi='differente_price' store=True string='Total Products With Different Price'
  • template_expensive_qty Integer
    compute='_compute_template_different_price_qty' multi='differente_price' store=True string='Products Too Expensive'
  • template_ids One2many → product.template
    comodel_name='product.template' inverse_name='margin_classification_id' readonly=True string='Products'
  • template_qty Integer
    compute='_compute_template_qty' store=True string='Products Quantity'
Public methods (3)
  • apply_theoretical_price(self)
    @api.multi
  • apply_theoretical_price_cheap(self)
    @api.multi
  • apply_theoretical_price_expensive(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • use_theoretical_price_variant(self)
    @api.multi

New fields (4)
  • margin_classification_id Many2one → product.margin.classification
    comodel_name='product.margin.classification' string='Margin Classification'
  • margin_state Selection
    compute='_compute_theoretical_multi' multi='theoretical_multi' selection=MARGIN_STATE_SELECTION store=True string='Theoretical Price State'
  • theoretical_difference Float
    compute='_compute_theoretical_multi' digits=dp.get_precision('Product Price') multi='theoretical_multi' store=True string='Theoretical Difference'
  • theoretical_price Float
    compute='_compute_theoretical_multi' digits=dp.get_precision('Product Price') multi='theoretical_multi' store=True string='Theoretical Price'
Public methods (1)
  • use_theoretical_price(self)
    @api.multi