Key Performance Indicators

kpi
REPOSITORY
REPOSITORYOCA/reporting-engine
GIT
GIThttps://github.com/OCA/reporting-engine.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/reporting-engine/tree/19.0/kpi
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYReport
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Savoir-faire Linux, Gray Matter Logic
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Savoir-faire Linux, Gray Matter Logic
COMMITTERS
COMMITTERSMaxime Chambreuil, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/reporting-engine
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:46
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-backend:
    - base_external_dbsource
odoo/odoo:
    - base
    - spreadsheet_dashboard
    - spreadsheet
    - bus
    - web
    - portal
    - html_editor
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides the basis for creating key performance indicators,
including static and dynamic thresholds (SQL query or Python code), on
local and remote data sources.

The module also provides the mecanism to update KPIs automatically. A
scheduler is executed every hour and updates the KPI values, based on
the periodicity of each KPI. KPI computation can also be done manually.

A threshold is a list of ranges and a range is:

- a name (like Good, Warning, Bad)
- a minimum value (fixed, sql query or python code)
- a maximum value (fixed, sql query or python code)
- color (RGB code like \#00FF00 for green, \#FFA500 for orange, \#FF0000
  for red)

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
view_kpi_category_form kpi.category.form kpi.category form New
view_kpi_category_tree kpi.category.tree kpi.category list New
view_kpi_filter kpi.filter kpi search New
view_kpi_form kpi.form kpi form New
view_kpi_history_form kpi.history.form kpi.history form New
view_kpi_history_tree kpi.history.tree kpi.history list New
view_kpi_kanban kpi.kanban kpi kanban New
view_kpi_threshold_form kpi.threshold.form kpi.threshold form New
view_kpi_threshold_range_form kpi.threshold.range.form kpi.threshold.range form New
view_kpi_threshold_range_tree kpi.threshold.range.tree kpi.threshold.range list New
view_kpi_threshold_tree kpi.threshold.tree kpi.threshold list New
view_kpi_tree kpi.tree kpi list New
Models touched (5)

New fields (16)
  • active Boolean
    default=True help='Only active KPIs will be updated by the scheduler based on the periodicity configuration.'
  • category_id Many2one → kpi.category
    required=True args: 'kpi.category', 'Category'
  • color Text
    compute='_compute_display_last_kpi_value'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source'
  • description Text
  • history_ids One2many → kpi.history
    args: 'kpi.history', 'kpi_id', 'History'
  • kpi_code Text
    help="SQL code must return the result as 'value' (i.e. 'SELECT 5 AS value')." args: 'KPI Code'
  • kpi_type Selection
    args: [('python', 'Python'), ('local', 'SQL - Local DB'), ('external', 'SQL - External DB')], 'KPI Computation Type'
  • last_execution Datetime
    compute='_compute_display_last_kpi_value' args: 'Last execution'
  • name Char
    required=True
  • next_execution_date Datetime
    args: 'Next execution date'
  • periodicity Integer
    default=1
  • periodicity_uom Selection
    default='day' required=True args: [('minute', 'Minute'), ('hour', 'Hour'), ('day', 'Day'), ('week', 'Week'), ('month', 'Month')], 'Periodicity UoM'
  • threshold_id Many2one → kpi.threshold
    required=True args: 'kpi.threshold', 'Threshold'
  • value Float
    compute='_compute_display_last_kpi_value'
Public methods (3)
  • compute_kpi_value(self)
  • update_kpi_value(self)
    @api.model
  • update_next_execution_date(self)

New fields (2)
  • description Text
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (6)
  • color Text
    default='#FFFFFF' readonly=True required=True
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • date Datetime
    default=<expr> readonly=True required=True args: 'Execution Date'
  • kpi_id Many2one → kpi
    required=True args: 'kpi', 'KPI'
  • name Char
    default=fields.Datetime.now() required=True size=150
  • value Float
    readonly=True required=True
Public methods (0)

No public methods.

New fields (6)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_threshold' size=100 string='Message'
  • kpi_ids One2many → kpi
    args: 'kpi', 'threshold_id', 'KPIs'
  • name Char
    required=True
  • range_ids Many2many → kpi.threshold.range
    args: 'kpi.threshold.range', 'kpi_threshold_range_rel', 'threshold_id', 'range_id', 'Ranges'
  • valid Boolean
    compute='_compute_is_valid_threshold' default=True required=True
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • get_color(self, kpi_value)

New fields (18)
  • color Char
    help='Choose your color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_range' size=100 string='Message'
  • max_code Text
    args: 'Maximum Computation Code'
  • max_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Maximum'
  • max_error Char
    compute='_compute_max_value' args: 'Maximum Error'
  • max_fixed_value Float
    args: 'Maximum Fixed Value'
  • max_type Selection
    required=True selection='_selection_value_type'
  • max_value Float
    compute='_compute_max_value' string='Maximum Value'
  • min_code Text
    args: 'Minimum Computation Code'
  • min_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Minimum'
  • min_error Char
    compute='_compute_min_value' args: 'Minimum Error'
  • min_fixed_value Float
    args: 'Minimum Fixed Value'
  • min_type Selection
    required=True selection='_selection_value_type'
  • min_value Float
    compute='_compute_min_value' string='Minimum Value'
  • name Char
    required=True
  • threshold_ids Many2many → kpi.threshold
    args: 'kpi.threshold', 'kpi_threshold_range_rel', 'range_id', 'threshold_id', 'Thresholds'
  • valid Boolean
    compute='_compute_is_valid_range' default=True required=True
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/reporting-engine
GIT
GIThttps://github.com/OCA/reporting-engine.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/reporting-engine/tree/18.0/kpi
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYReport
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators, Savoir-faire Linux
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators, Savoir-faire Linux
COMMITTERS
COMMITTERSMaxime Chambreuil, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/reporting-engine
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-backend:
    - base_external_dbsource
odoo/odoo:
    - base
    - spreadsheet_dashboard
    - spreadsheet
    - bus
    - web
    - portal
    - web_editor
    - html_editor
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides the basis for creating key performance indicators,
including static and dynamic thresholds (SQL query or Python code), on
local and remote data sources.

The module also provides the mecanism to update KPIs automatically. A
scheduler is executed every hour and updates the KPI values, based on
the periodicity of each KPI. KPI computation can also be done manually.

A threshold is a list of ranges and a range is:

- a name (like Good, Warning, Bad)
- a minimum value (fixed, sql query or python code)
- a maximum value (fixed, sql query or python code)
- color (RGB code like \#00FF00 for green, \#FFA500 for orange, \#FF0000
  for red)

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
view_kpi_category_form kpi.category.form kpi.category form New
view_kpi_category_tree kpi.category.tree kpi.category list New
view_kpi_filter kpi.filter kpi search New
view_kpi_form kpi.form kpi form New
view_kpi_history_form kpi.history.form kpi.history form New
view_kpi_history_tree kpi.history.tree kpi.history list New
view_kpi_kanban kpi.kanban kpi kanban New
view_kpi_threshold_form kpi.threshold.form kpi.threshold form New
view_kpi_threshold_range_form kpi.threshold.range.form kpi.threshold.range form New
view_kpi_threshold_range_tree kpi.threshold.range.tree kpi.threshold.range list New
view_kpi_threshold_tree kpi.threshold.tree kpi.threshold list New
view_kpi_tree kpi.tree kpi list New
Models touched (5)

New fields (16)
  • active Boolean
    default=True help='Only active KPIs will be updated by the scheduler based on the periodicity configuration.'
  • category_id Many2one → kpi.category
    required=True args: 'kpi.category', 'Category'
  • color Text
    compute='_compute_display_last_kpi_value'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source'
  • description Text
  • history_ids One2many → kpi.history
    args: 'kpi.history', 'kpi_id', 'History'
  • kpi_code Text
    help="SQL code must return the result as 'value' (i.e. 'SELECT 5 AS value')." args: 'KPI Code'
  • kpi_type Selection
    args: [('python', 'Python'), ('local', 'SQL - Local DB'), ('external', 'SQL - External DB')], 'KPI Computation Type'
  • last_execution Datetime
    compute='_compute_display_last_kpi_value' args: 'Last execution'
  • name Char
    required=True
  • next_execution_date Datetime
    args: 'Next execution date'
  • periodicity Integer
    default=1
  • periodicity_uom Selection
    default='day' required=True args: [('minute', 'Minute'), ('hour', 'Hour'), ('day', 'Day'), ('week', 'Week'), ('month', 'Month')], 'Periodicity UoM'
  • threshold_id Many2one → kpi.threshold
    required=True args: 'kpi.threshold', 'Threshold'
  • value Float
    compute='_compute_display_last_kpi_value'
Public methods (3)
  • compute_kpi_value(self)
  • update_kpi_value(self)
    @api.model
  • update_next_execution_date(self)

New fields (2)
  • description Text
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (6)
  • color Text
    default='#FFFFFF' readonly=True required=True
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • date Datetime
    default=<expr> readonly=True required=True args: 'Execution Date'
  • kpi_id Many2one → kpi
    required=True args: 'kpi', 'KPI'
  • name Char
    default=fields.Datetime.now() required=True size=150
  • value Float
    readonly=True required=True
Public methods (0)

No public methods.

New fields (6)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_threshold' size=100 string='Message'
  • kpi_ids One2many → kpi
    args: 'kpi', 'threshold_id', 'KPIs'
  • name Char
    required=True
  • range_ids Many2many → kpi.threshold.range
    args: 'kpi.threshold.range', 'kpi_threshold_range_rel', 'threshold_id', 'range_id', 'Ranges'
  • valid Boolean
    compute='_compute_is_valid_threshold' default=True required=True
Public methods (2)
  • create(self, data)
    @api.model
  • get_color(self, kpi_value)

New fields (18)
  • color Char
    help='Choose your color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_range' size=100 string='Message'
  • max_code Text
    args: 'Maximum Computation Code'
  • max_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Maximum'
  • max_error Char
    compute='_compute_max_value' args: 'Maximum Error'
  • max_fixed_value Float
    args: 'Maximum Fixed Value'
  • max_type Selection
    required=True selection='_selection_value_type'
  • max_value Float
    compute='_compute_max_value' string='Maximum Value'
  • min_code Text
    args: 'Minimum Computation Code'
  • min_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Minimum'
  • min_error Char
    compute='_compute_min_value' args: 'Minimum Error'
  • min_fixed_value Float
    args: 'Minimum Fixed Value'
  • min_type Selection
    required=True selection='_selection_value_type'
  • min_value Float
    compute='_compute_min_value' string='Minimum Value'
  • name Char
    required=True
  • threshold_ids Many2many → kpi.threshold
    args: 'kpi.threshold', 'kpi_threshold_range_rel', 'range_id', 'threshold_id', 'Thresholds'
  • valid Boolean
    compute='_compute_is_valid_range' default=True required=True
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/reporting-engine
GIT
GIThttps://github.com/OCA/reporting-engine.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/reporting-engine/tree/17.0/kpi
VERSION
VERSION 1.2.0
CATEGORY
CATEGORYReport
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Savoir-faire Linux
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Savoir-faire Linux
COMMITTERS
COMMITTERSMaxime Chambreuil, Weblate, OCA-git-bot, oca-ci, EdgarRetes, Miquel Rosell, Gustavo
WEBSITE
WEBSITEhttps://github.com/OCA/reporting-engine
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-backend:
    - base_external_dbsource
odoo/odoo:
    - base
    - spreadsheet_dashboard
    - spreadsheet
    - bus
    - web
    - portal
    - web_editor
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides the basis for creating key performance indicators,
including static and dynamic thresholds (SQL query or Python code), on
local and remote data sources.

The module also provides the mecanism to update KPIs automatically. A
scheduler is executed every hour and updates the KPI values, based on
the periodicity of each KPI. KPI computation can also be done manually.

A threshold is a list of ranges and a range is:

- a name (like Good, Warning, Bad)
- a minimum value (fixed, sql query or python code)
- a maximum value (fixed, sql query or python code)
- color (RGB code like \#00FF00 for green, \#FFA500 for orange, \#FF0000
  for red)

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
view_kpi_category_form kpi.category.form kpi.category form New
view_kpi_category_tree kpi.category.tree kpi.category tree New
view_kpi_filter kpi.filter kpi search New
view_kpi_form kpi.form kpi form New
view_kpi_history_form kpi.history.form kpi.history form New
view_kpi_history_tree kpi.history.tree kpi.history tree New
view_kpi_kanban kpi.kanban kpi kanban New
view_kpi_threshold_form kpi.threshold.form kpi.threshold form New
view_kpi_threshold_range_form kpi.threshold.range.form kpi.threshold.range form New
view_kpi_threshold_range_tree kpi.threshold.range.tree kpi.threshold.range tree New
view_kpi_threshold_tree kpi.threshold.tree kpi.threshold tree New
view_kpi_tree kpi.tree kpi tree New
Models touched (5)

New fields (16)
  • active Boolean
    default=True help='Only active KPIs will be updated by the scheduler based on the periodicity configuration.'
  • category_id Many2one → kpi.category
    required=True args: 'kpi.category', 'Category'
  • color Text
    compute='_compute_display_last_kpi_value'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source'
  • description Text
  • history_ids One2many → kpi.history
    args: 'kpi.history', 'kpi_id', 'History'
  • kpi_code Text
    help="SQL code must return the result as 'value' (i.e. 'SELECT 5 AS value')." args: 'KPI Code'
  • kpi_type Selection
    args: [('python', 'Python'), ('local', 'SQL - Local DB'), ('external', 'SQL - External DB')], 'KPI Computation Type'
  • last_execution Datetime
    compute='_compute_display_last_kpi_value' args: 'Last execution'
  • name Char
    required=True
  • next_execution_date Datetime
    args: 'Next execution date'
  • periodicity Integer
    default=1
  • periodicity_uom Selection
    default='day' required=True args: [('minute', 'Minute'), ('hour', 'Hour'), ('day', 'Day'), ('week', 'Week'), ('month', 'Month')], 'Periodicity UoM'
  • threshold_id Many2one → kpi.threshold
    required=True args: 'kpi.threshold', 'Threshold'
  • value Float
    compute='_compute_display_last_kpi_value'
Public methods (3)
  • compute_kpi_value(self)
  • update_kpi_value(self)
    @api.model
  • update_next_execution_date(self)

New fields (2)
  • description Text
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (6)
  • color Text
    default='#FFFFFF' required=True
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • date Datetime
    default=<expr> required=True args: 'Execution Date'
  • kpi_id Many2one → kpi
    required=True args: 'kpi', 'KPI'
  • name Char
    default=fields.Datetime.now() required=True size=150
  • value Float
    required=True
Public methods (0)

No public methods.

New fields (6)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_threshold' size=100 string='Message'
  • kpi_ids One2many → kpi
    args: 'kpi', 'threshold_id', 'KPIs'
  • name Char
    required=True
  • range_ids Many2many → kpi.threshold.range
    args: 'kpi.threshold.range', 'kpi_threshold_range_rel', 'threshold_id', 'range_id', 'Ranges'
  • valid Boolean
    compute='_compute_is_valid_threshold' default=True required=True
Public methods (2)
  • create(self, data)
    @api.model
  • get_color(self, kpi_value)

New fields (18)
  • color Char
    help='Choose your color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_range' size=100 string='Message'
  • max_code Text
    args: 'Maximum Computation Code'
  • max_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Maximum'
  • max_error Char
    compute='_compute_max_value' args: 'Maximum Error'
  • max_fixed_value Float
    args: 'Maximum Fixed Value'
  • max_type Selection
    required=True selection='_selection_value_type'
  • max_value Float
    compute='_compute_max_value' string='Maximum Value'
  • min_code Text
    args: 'Minimum Computation Code'
  • min_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Minimum'
  • min_error Char
    compute='_compute_min_value' args: 'Minimum Error'
  • min_fixed_value Float
    args: 'Minimum Fixed Value'
  • min_type Selection
    required=True selection='_selection_value_type'
  • min_value Float
    compute='_compute_min_value' string='Minimum Value'
  • name Char
    required=True
  • threshold_ids Many2many → kpi.threshold
    args: 'kpi.threshold', 'kpi_threshold_range_rel', 'range_id', 'threshold_id', 'Thresholds'
  • valid Boolean
    compute='_compute_is_valid_range' default=True required=True
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/reporting-engine
GIT
GIThttps://github.com/OCA/reporting-engine.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/reporting-engine/tree/13.0/kpi
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYReport
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Savoir-faire Linux
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Savoir-faire Linux
COMMITTERS
COMMITTERSStéphane Bidoul, oca-travis, Weblate, OCA-git-bot, flachica
WEBSITE
WEBSITEhttps://github.com/OCA/reporting-engine
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-backend:
    - base_external_dbsource
odoo/odoo:
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
view_kpi_category_form kpi.category.form kpi.category form New
view_kpi_category_tree kpi.category.tree kpi.category tree New
view_kpi_filter kpi.filter kpi search New
view_kpi_form kpi.form kpi form New
view_kpi_history_form kpi.history.form kpi.history form New
view_kpi_history_tree kpi.history.tree kpi.history tree New
view_kpi_kanban kpi.kanban kpi kanban New
view_kpi_threshold_form kpi.threshold.form kpi.threshold form New
view_kpi_threshold_range_form kpi.threshold.range.form kpi.threshold.range form New
view_kpi_threshold_range_tree kpi.threshold.range.tree kpi.threshold.range tree New
view_kpi_threshold_tree kpi.threshold.tree kpi.threshold tree New
view_kpi_tree kpi.tree kpi tree New
Models touched (5)

New fields (16)
  • active Boolean
    default=True help='Only active KPIs will be updated by the scheduler based on the periodicity configuration.' args: 'Active'
  • category_id Many2one → kpi.category
    required=True args: 'kpi.category', 'Category'
  • color Text
    compute='_compute_display_last_kpi_value' args: 'Color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source'
  • description Text
    args: 'Description'
  • history_ids One2many → kpi.history
    args: 'kpi.history', 'kpi_id', 'History'
  • kpi_code Text
    help="SQL code must return the result as 'value' (i.e. 'SELECT 5 AS value')." args: 'KPI Code'
  • kpi_type Selection
    args: [('python', 'Python'), ('local', 'SQL - Local DB'), ('external', 'SQL - External DB')], 'KPI Computation Type'
  • last_execution Datetime
    compute='_compute_display_last_kpi_value' args: 'Last execution'
  • name Char
    required=True args: 'Name'
  • next_execution_date Datetime
    readonly=True args: 'Next execution date'
  • periodicity Integer
    default=1 args: 'Periodicity'
  • periodicity_uom Selection
    default='day' required=True args: [('minute', 'Minute'), ('hour', 'Hour'), ('day', 'Day'), ('week', 'Week'), ('month', 'Month')], 'Periodicity UoM'
  • threshold_id Many2one → kpi.threshold
    required=True args: 'kpi.threshold', 'Threshold'
  • value Float
    compute='_compute_display_last_kpi_value' string='Value'
Public methods (3)
  • compute_kpi_value(self)
  • update_kpi_value(self)
    @api.model
  • update_next_execution_date(self)

New fields (2)
  • description Text
    args: 'Description'
  • name Char
    required=True size=50 args: 'Name'
Public methods (0)

No public methods.

New fields (6)
  • color Text
    default='#FFFFFF' readonly=True required=True args: 'Color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • date Datetime
    default=<expr> readonly=True required=True args: 'Execution Date'
  • kpi_id Many2one → kpi
    required=True args: 'kpi', 'KPI'
  • name Char
    default=fields.Datetime.now() required=True size=150 args: 'Name'
  • value Float
    readonly=True required=True args: 'Value'
Public methods (0)

No public methods.

New fields (6)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_threshold' size=100 string='Message'
  • kpi_ids One2many → kpi
    args: 'kpi', 'threshold_id', 'KPIs'
  • name Char
    required=True size=50 args: 'Name'
  • range_ids Many2many → kpi.threshold.range
    args: 'kpi.threshold.range', 'kpi_threshold_range_rel', 'threshold_id', 'range_id', 'Ranges'
  • valid Boolean
    compute='_compute_is_valid_threshold' default=True required=True string='Valid'
Public methods (2)
  • create(self, data)
    @api.model
  • get_color(self, kpi_value)

New fields (18)
  • color Char
    help='Choose your color' string='Color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_range' size=100 string='Message'
  • max_code Text
    args: 'Maximum Computation Code'
  • max_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Maximum'
  • max_error Char
    compute='_compute_max_value' args: 'Maximum Error'
  • max_fixed_value Float
    args: 'Maximum Fixed Value'
  • max_type Selection
    required=True selection='_selection_value_type' string='Max Type'
  • max_value Float
    compute='_compute_max_value' string='Maximum Value'
  • min_code Text
    args: 'Minimum Computation Code'
  • min_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Minimum'
  • min_error Char
    compute='_compute_min_value' args: 'Minimum Error'
  • min_fixed_value Float
    args: 'Minimum Fixed Value'
  • min_type Selection
    required=True selection='_selection_value_type' string='Min Type'
  • min_value Float
    compute='_compute_min_value' string='Minimum Value'
  • name Char
    required=True size=50 args: 'Name'
  • threshold_ids Many2many → kpi.threshold
    args: 'kpi.threshold', 'kpi_threshold_range_rel', 'range_id', 'threshold_id', 'Thresholds'
  • valid Boolean
    compute='_compute_is_valid_range' default=True required=True string='Valid'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/reporting-engine
GIT
GIThttps://github.com/OCA/reporting-engine.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/reporting-engine/tree/12.0/kpi
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYReport
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Savoir-faire Linux
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Savoir-faire Linux
COMMITTERS
COMMITTERSEnric Tobella, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes
WEBSITE
WEBSITEhttps://github.com/OCA/reporting-engine
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:24
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-backend:
    - base_external_dbsource
OCA/web:
    - web_widget_color
odoo/odoo:
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
view_kpi_category_form kpi.category.form kpi.category form New
view_kpi_category_tree kpi.category.tree kpi.category tree New
view_kpi_filter kpi.filter kpi search New
view_kpi_form kpi.form kpi form New
view_kpi_history_form kpi.history.form kpi.history form New
view_kpi_history_tree kpi.history.tree kpi.history tree New
view_kpi_kanban kpi.kanban kpi kanban New
view_kpi_threshold_form kpi.threshold.form kpi.threshold form New
view_kpi_threshold_range_form kpi.threshold.range.form kpi.threshold.range form New
view_kpi_threshold_range_tree kpi.threshold.range.tree kpi.threshold.range tree New
view_kpi_threshold_tree kpi.threshold.tree kpi.threshold tree New
view_kpi_tree kpi.tree kpi tree New
Models touched (5)

New fields (16)
  • active Boolean
    default=True help='Only active KPIs will be updated by the scheduler based on the periodicity configuration.' args: 'Active'
  • category_id Many2one → kpi.category
    required=True args: 'kpi.category', 'Category'
  • color Text
    compute='_compute_display_last_kpi_value' args: 'Color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source'
  • description Text
    args: 'Description'
  • history_ids One2many → kpi.history
    args: 'kpi.history', 'kpi_id', 'History'
  • kpi_code Text
    help="SQL code must return the result as 'value' (i.e. 'SELECT 5 AS value')." args: 'KPI Code'
  • kpi_type Selection
    args: (('python', 'Python'), ('local', 'SQL - Local DB'), ('external', 'SQL - External DB')), 'KPI Computation Type'
  • last_execution Datetime
    compute='_compute_display_last_kpi_value' args: 'Last execution'
  • name Char
    required=True args: 'Name'
  • next_execution_date Datetime
    readonly=True args: 'Next execution date'
  • periodicity Integer
    default=1 args: 'Periodicity'
  • periodicity_uom Selection
    default='day' required=True args: (('minute', 'Minute'), ('hour', 'Hour'), ('day', 'Day'), ('week', 'Week'), ('month', 'Month')), 'Periodicity UoM'
  • threshold_id Many2one → kpi.threshold
    required=True args: 'kpi.threshold', 'Threshold'
  • value Float
    compute='_compute_display_last_kpi_value' string='Value'
Public methods (3)
  • compute_kpi_value(self)
    @api.multi
  • update_kpi_value(self)
    @api.model
  • update_next_execution_date(self)
    @api.multi

New fields (2)
  • description Text
    args: 'Description'
  • name Char
    required=True size=50 args: 'Name'
Public methods (0)

No public methods.

New fields (6)
  • color Text
    default='#FFFFFF' readonly=True required=True args: 'Color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • date Datetime
    default=<expr> readonly=True required=True args: 'Execution Date'
  • kpi_id Many2one → kpi
    required=True args: 'kpi', 'KPI'
  • name Char
    default=fields.Datetime.now() required=True size=150 args: 'Name'
  • value Float
    readonly=True required=True args: 'Value'
Public methods (0)

No public methods.

New fields (6)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_threshold' size=100 string='Message'
  • kpi_ids One2many → kpi
    args: 'kpi', 'threshold_id', 'KPIs'
  • name Char
    required=True size=50 args: 'Name'
  • range_ids Many2many → kpi.threshold.range
    args: 'kpi.threshold.range', 'kpi_threshold_range_rel', 'threshold_id', 'range_id', 'Ranges'
  • valid Boolean
    compute='_compute_is_valid_threshold' default=True required=True string='Valid'
Public methods (2)
  • create(self, data)
    @api.model
  • get_color(self, kpi_value)
    @api.multi

New fields (18)
  • color Char
    help='Choose your color' string='Color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_range' size=100 string='Message'
  • max_code Text
    args: 'Maximum Computation Code'
  • max_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Maximum'
  • max_error Char
    compute='_compute_max_value' args: 'Maximum Error'
  • max_fixed_value Float
    args: 'Maximum Fixed Value'
  • max_type Selection
    required=True args: (('static', 'Fixed value'), ('python', 'Python Code'), ('local', 'SQL - Local DB'), ('external', 'SQL - External DB')), 'Max Type'
  • max_value Float
    compute='_compute_max_value' string='Maximum Value'
  • min_code Text
    args: 'Minimum Computation Code'
  • min_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source Minimum'
  • min_error Char
    compute='_compute_min_value' args: 'Minimum Error'
  • min_fixed_value Float
    args: 'Minimum Fixed Value'
  • min_type Selection
    required=True args: (('static', 'Fixed value'), ('python', 'Python Code'), ('local', 'SQL - Local DB'), ('external', 'SQL - Externa DB')), 'Min Type'
  • min_value Float
    compute='_compute_min_value' string='Minimum Value'
  • name Char
    required=True size=50 args: 'Name'
  • threshold_ids Many2many → kpi.threshold
    args: 'kpi.threshold', 'kpi_threshold_range_rel', 'range_id', 'threshold_id', 'Thresholds'
  • valid Boolean
    compute='_compute_is_valid_range' default=True required=True string='Valid'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/9.0/kpi
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYReport
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Savoir-faire Linux
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Savoir-faire Linux
COMMITTERS
COMMITTERSGitHub, Daniel Reis, Stéphane Bidoul (ACSONE), OCA Transbot, darshan-serpent, oca-travis, Weblate, OCA-git-bot, Iván Todorovich
WEBSITE
WEBSITEhttp://www.savoirfairelinux.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:15:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/server-tools:
    - base_external_dbsource
odoo/odoo:
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
view_kpi_category_form kpi.category.form kpi.category form New
view_kpi_category_tree kpi.category.tree kpi.category tree New
view_kpi_filter kpi.filter kpi search New
view_kpi_form kpi.form kpi form New
view_kpi_history_form kpi.history.form kpi.history form New
view_kpi_history_tree kpi.history.tree kpi.history tree New
view_kpi_threshold_form kpi.threshold.form kpi.threshold form New
view_kpi_threshold_range_form kpi.threshold.range.form kpi.threshold.range form New
view_kpi_threshold_range_tree kpi.threshold.range.tree kpi.threshold.range tree New
view_kpi_threshold_tree kpi.threshold.tree kpi.threshold tree New
view_kpi_tree kpi.tree kpi tree New
Models touched (5)

New fields (14)
  • active Boolean
    default=True help='Only active KPIs will be updated by the scheduler based on the periodicity configuration.' args: 'Active'
  • category_id Many2one → kpi.category
    required=True args: 'kpi.category', 'Category'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source'
  • description Text
    args: 'Description'
  • history_ids One2many → kpi.history
    args: 'kpi.history', 'kpi_id', 'History'
  • kpi_code Text
    help="SQL code must return the result as 'value' (i.e. 'SELECT 5 AS value')." args: 'KPI Code'
  • kpi_type Selection
    args: (('python', 'Python'), ('local', 'SQL - Local DB'), ('external', 'SQL - External DB')), 'KPI Computation Type'
  • name Char
    required=True args: 'Name'
  • next_execution_date Datetime
    readonly=True args: 'Next execution date'
  • periodicity Integer
    default=1 args: 'Periodicity'
  • periodicity_uom Selection
    default='day' required=True args: (('hour', 'Hour'), ('day', 'Day'), ('week', 'Week'), ('month', 'Month')), 'Periodicity UoM'
  • threshold_id Many2one → kpi.threshold
    required=True args: 'kpi.threshold', 'Threshold'
  • value Float
    compute='_compute_display_last_kpi_value' string='Value'
Public methods (3)
  • compute_kpi_value(self)
    @api.multi
  • update_kpi_value(self)
    @api.model
  • update_next_execution_date(self)
    @api.multi

New fields (2)
  • description Text
    args: 'Description'
  • name Char
    required=True size=50 args: 'Name'
Public methods (0)

No public methods.

New fields (6)
  • color Text
    default='#FFFFFF' readonly=True required=True args: 'Color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • date Datetime
    default=fields.Datetime.now() readonly=True required=True args: 'Execution Date'
  • kpi_id Many2one → kpi
    required=True args: 'kpi', 'KPI'
  • name Char
    default=fields.Datetime.now() required=True size=150 args: 'Name'
  • value Float
    readonly=True required=True args: 'Value'
Public methods (0)

No public methods.

New fields (6)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_threshold' size=100 string='Message'
  • kpi_ids One2many → kpi
    args: 'kpi', 'threshold_id', 'KPIs'
  • name Char
    required=True size=50 args: 'Name'
  • range_ids Many2many → kpi.threshold.range
    args: 'kpi.threshold.range', 'kpi_threshold_range_rel', 'threshold_id', 'range_id', 'Ranges'
  • valid Boolean
    compute='_compute_is_valid_threshold' default=True required=True string='Valid'
Public methods (2)
  • create(self, data)
    @api.model
  • get_color(self, kpi_value)
    @api.multi

New fields (18)
  • color Char
    help='Choose your color' string='Color'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • invalid_message Char
    compute='_compute_is_valid_range' size=100 string='Message'
  • max_code Text
    args: 'Maximum Computation Code'
  • max_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source'
  • max_error Char
    compute='_compute_max_value' args: 'Error'
  • max_fixed_value Float
    args: 'Maximum'
  • max_type Selection
    required=True args: (('static', 'Fixed value'), ('python', 'Python Code'), ('local', 'SQL - Local DB'), ('external', 'SQL - External DB')), 'Max Type'
  • max_value Float
    compute='_compute_max_value' string='Maximum'
  • min_code Text
    args: 'Minimum Computation Code'
  • min_dbsource_id Many2one → base.external.dbsource
    args: 'base.external.dbsource', 'External DB Source'
  • min_error Char
    compute='_compute_min_value' args: 'Error'
  • min_fixed_value Float
    args: 'Minimum'
  • min_type Selection
    required=True args: (('static', 'Fixed value'), ('python', 'Python Code'), ('local', 'SQL - Local DB'), ('external', 'SQL - Externa DB')), 'Min Type'
  • min_value Float
    compute='_compute_min_value' string='Minimum'
  • name Char
    required=True size=50 args: 'Name'
  • threshold_ids Many2many → kpi.threshold
    args: 'kpi.threshold', 'kpi_threshold_range_rel', 'range_id', 'threshold_id', 'Thresholds'
  • valid Boolean
    compute='_compute_is_valid_range' default=True required=True string='Valid'
Public methods (0)

No public methods.