Task Logs Utilization Report

hr_utilization_report
REPOSITORY
REPOSITORYOCA/timesheet
GIT
GIThttps://github.com/OCA/timesheet.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/timesheet/tree/14.0/hr_utilization_report
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), CorporateHub
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), CorporateHub
COMMITTERS
COMMITTERSAlexey Pelykh, Weblate, OCA-git-bot, sergiocorato, oca-ci, Stefano Consolaro, dsolanki
WEBSITE
WEBSITEhttps://github.com/OCA/timesheet
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/reporting-engine:
    - report_xlsx
odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - hr_timesheet
    - analytic
    - uom
    - project
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - rating
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
hr_utilization_report_wizard_form hr.utilization.report.wizard.form hr.utilization.report.wizard form New
report report ir.ui.view qweb New
report_block report_block ir.ui.view qweb New
report_block_empty report_block_empty ir.ui.view qweb New
report_capacity report_capacity ir.ui.view qweb New
report_group report_group ir.ui.view qweb New
report_group_footer report_group_footer ir.ui.view qweb New
report_group_header report_group_header ir.ui.view qweb New
report_header report_header ir.ui.view qweb New
report_utilization report_utilization ir.ui.view qweb New
Models touched (12)

New fields (19)
  • date_from Date
    required=True string='Start Date'
  • date_to Date
    required=True string='End Date'
  • department_ids Many2many → hr.department
    comodel_name='hr.department' string='Departments'
  • employee_category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Employee Tags'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
  • entry_field_ids One2many → hr.utilization.report.field.entry
    comodel_name='hr.utilization.report.field.entry' inverse_name='report_id' string='Entry Fields'
  • group_ids One2many → hr.utilization.report.group
    comodel_name='hr.utilization.report.group' compute='_compute_group_ids' inverse_name='report_id' store=True string='Groups'
  • groupby_field_ids One2many → hr.utilization.report.field.groupby
    comodel_name='hr.utilization.report.field.groupby' inverse_name='report_id' string='Group-By Fields'
  • has_multientry_blocks Boolean
    compute='_compute_has_multientry_blocks' store=True string='Has Multi-Entry Blocks'
  • only_active_employees Boolean
    default=True string='Only Active Employees'
  • split_by_field_name Selection
    selection=<expr> string='Split-By Field'
  • split_by_field_title Char
    compute='_compute_split_by_field_title' string='Split-By Field Title'
  • time_format Selection
    required=True selection=<expr> string='Time format'
  • total_capacity Float
    compute='_compute_total_capacity' store=True string='Total Capacity'
  • total_unit_amount_a Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (A)'
  • total_unit_amount_b Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (B)'
  • total_utilization_a Float
    compute='_compute_total_utilization' store=True string='Total Utilization (A)'
  • total_utilization_b Float
    compute='_compute_total_utilization' store=True string='Total Utilization (B)'
  • utilization_format Selection
    required=True selection=<expr> string='Utilization format'
Public methods (1)
  • get_action(self, report_type='qweb-html')

New fields (10)
  • capacity Float
    compute='_compute_capacity' store=True string='Capacity'
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' required=True string='Employee'
  • entry_ids One2many → hr.utilization.report.entry
    comodel_name='hr.utilization.report.entry' compute='_compute_entry_ids' inverse_name='block_id' store=True string='Entries'
  • group_id Many2one → hr.utilization.report.group
    comodel_name='hr.utilization.report.group' ondelete='cascade' required=True string='Group'
  • is_multientry Boolean
    compute='_compute_is_multientry' store=True string='Is Multi-Entry'
  • sequence Integer
    required=True string='Sequence'
  • total_unit_amount_a Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (A)'
  • total_unit_amount_b Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (B)'
  • total_utilization_a Float
    compute='_compute_total_utilization' store=True string='Total Utilization (A)'
  • total_utilization_b Float
    compute='_compute_total_utilization' store=True string='Total Utilization (B)'
Public methods (0)

No public methods.

New fields (8)
  • any_line_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' compute='_compute_any_line_id' string='Account Analytics Lines'
  • block_id Many2one → hr.utilization.report.block
    comodel_name='hr.utilization.report.block' ondelete='cascade' required=True string='Block'
  • scope Char
    required=True string='Scope'
  • sequence Integer
    required=True string='Sequence'
  • total_unit_amount_a Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (A)'
  • total_unit_amount_b Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (B)'
  • total_utilization_a Float
    compute='_compute_total_utilization' store=True string='Total Utilization (A)'
  • total_utilization_b Float
    compute='_compute_total_utilization' store=True string='Total Utilization (B)'
Public methods (1)
  • render_value(self, field_name)

New fields (7)
  • aggregation Char
    string='Aggregation'
  • field_name Char
    required=True string='Field name'
  • field_title Char
    required=True string='Field title'
  • field_type Char
    required=True string='Field type'
  • groupby Char
    compute='_compute_groupby' string='Group-by expression'
  • report_id Many2one → hr.utilization.report
    comodel_name='hr.utilization.report' ondelete='cascade' required=True string='Report'
  • sequence Integer
    required=True string='Sequence'
Public methods (0)

No public methods.

New fields (1)
  • cell_classes Char
    compute='_compute_cell_classes' string='Cell classes'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (11)
  • block_ids One2many → hr.utilization.report.block
    comodel_name='hr.utilization.report.block' compute='_compute_block_ids' inverse_name='group_id' store=True string='Blocks'
  • has_multientry_blocks Boolean
    compute='_compute_has_multientry_blocks' store=True string='Has Multi-Entry Blocks'
  • name Char
  • report_id Many2one → hr.utilization.report
    comodel_name='hr.utilization.report' ondelete='cascade' required=True string='Report'
  • scope Char
    required=True string='Scope'
  • sequence Integer
    required=True string='Sequence'
  • total_capacity Float
    compute='_compute_total_capacity' store=True string='Total Capacity'
  • total_unit_amount_a Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (A)'
  • total_unit_amount_b Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (B)'
  • total_utilization_a Float
    compute='_compute_total_utilization' store=True string='Total Utilization (A)'
  • total_utilization_b Float
    compute='_compute_total_utilization' store=True string='Total Utilization (B)'
Public methods (0)

No public methods.

New fields (11)
  • date_from Date
    required=True string='Start Date'
  • date_to Date
    required=True string='End Date'
  • department_ids Many2many → hr.department
    comodel_name='hr.department' string='Departments'
  • employee_category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Employee Tags'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
  • entry_field_ids One2many → hr.utilization.report.wizard.field.details
    comodel_name='hr.utilization.report.wizard.field.details' default=<expr> inverse_name='wizard_id' string='Details Fields'
  • grouping_field_ids One2many → hr.utilization.report.wizard.field.grouping
    comodel_name='hr.utilization.report.wizard.field.grouping' default=<expr> inverse_name='wizard_id' string='Grouping Fields'
  • only_active_employees Boolean
    default=True string='Only Active Employees'
  • split_by_field_name Selection
    selection=<expr> string='Split-By Field'
  • time_format Selection
    default=<expr> required=True selection=<expr> string='Time format'
  • utilization_format Selection
    default=<expr> required=True selection=<expr> string='Utilization format'
Public methods (3)
  • action_export_html(self)
  • action_export_pdf(self)
  • action_export_xlsx(self)

New fields (5)
  • field_name Selection
    required=True selection='_selection_field_name' string='Field'
  • field_title Char
    compute='_compute_field_title' string='Title'
  • field_type Char
    compute='_compute_field_type' string='Type'
  • sequence Integer
    default=10 required=True string='Sequence'
  • wizard_id Many2one → hr.utilization.report.wizard
    comodel_name='hr.utilization.report.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • generate_xlsx_report(self, workbook, data, docs)
    @api.model
REPOSITORY
REPOSITORYOCA/timesheet
GIT
GIThttps://github.com/OCA/timesheet.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/timesheet/tree/12.0/hr_utilization_report
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), CorporateHub
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), CorporateHub
COMMITTERS
COMMITTERSAlexey Pelykh, OCA Transbot, oca-travis, Weblate, OCA-git-bot, yousef.soliman, Yousef Soliman
WEBSITE
WEBSITEhttps://github.com/OCA/timesheet
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:24
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/reporting-engine:
    - report_xlsx
odoo/odoo:
    - hr_timesheet
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - analytic
    - decimal_precision
    - uom
    - project
    - portal
    - http_routing
    - rating
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES xlrd
xlsxwriter
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
hr_utilization_report_wizard_form hr.utilization.report.wizard.form hr.utilization.report.wizard form New
report report ir.ui.view qweb New
report_block report_block ir.ui.view qweb New
report_block_empty report_block_empty ir.ui.view qweb New
report_capacity report_capacity ir.ui.view qweb New
report_group report_group ir.ui.view qweb New
report_group_footer report_group_footer ir.ui.view qweb New
report_group_header report_group_header ir.ui.view qweb New
report_header report_header ir.ui.view qweb New
report_utilization report_utilization ir.ui.view qweb New
Models touched (12)

New fields (19)
  • date_from Date
    required=True string='Start Date'
  • date_to Date
    required=True string='End Date'
  • department_ids Many2many → hr.department
    comodel_name='hr.department' string='Departments'
  • employee_category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Employee Tags'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
  • entry_field_ids One2many → hr.utilization.report.field.entry
    comodel_name='hr.utilization.report.field.entry' inverse_name='report_id' string='Entry Fields'
  • group_ids One2many → hr.utilization.report.group
    comodel_name='hr.utilization.report.group' compute='_compute_group_ids' inverse_name='report_id' store=True string='Groups'
  • groupby_field_ids One2many → hr.utilization.report.field.groupby
    comodel_name='hr.utilization.report.field.groupby' inverse_name='report_id' string='Group-By Fields'
  • has_multientry_blocks Boolean
    compute='_compute_has_multientry_blocks' store=True string='Has Multi-Entry Blocks'
  • only_active_employees Boolean
    default=True string='Only Active Employees'
  • split_by_field_name Selection
    selection=<expr> string='Split-By Field'
  • split_by_field_title Char
    compute='_compute_split_by_field_title' string='Split-By Field Title'
  • time_format Selection
    required=True selection=<expr> string='Time format'
  • total_capacity Float
    compute='_compute_total_capacity' store=True string='Total Capacity'
  • total_unit_amount_a Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (A)'
  • total_unit_amount_b Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (B)'
  • total_utilization_a Float
    compute='_compute_total_utilization' store=True string='Total Utilization (A)'
  • total_utilization_b Float
    compute='_compute_total_utilization' store=True string='Total Utilization (B)'
  • utilization_format Selection
    required=True selection=<expr> string='Utilization format'
Public methods (1)
  • get_action(self, report_type='qweb-html')
    @api.multi

New fields (10)
  • capacity Float
    compute='_compute_capacity' store=True string='Capacity'
  • employee_id Many2one → hr.employee
    comodel_name='hr.employee' required=True string='Employee'
  • entry_ids One2many → hr.utilization.report.entry
    comodel_name='hr.utilization.report.entry' compute='_compute_entry_ids' inverse_name='block_id' store=True string='Entries'
  • group_id Many2one → hr.utilization.report.group
    comodel_name='hr.utilization.report.group' ondelete='cascade' required=True string='Group'
  • is_multientry Boolean
    compute='_compute_is_multientry' store=True string='Is Multi-Entry'
  • sequence Integer
    required=True string='Sequence'
  • total_unit_amount_a Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (A)'
  • total_unit_amount_b Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (B)'
  • total_utilization_a Float
    compute='_compute_total_utilization' store=True string='Total Utilization (A)'
  • total_utilization_b Float
    compute='_compute_total_utilization' store=True string='Total Utilization (B)'
Public methods (0)

No public methods.

New fields (8)
  • any_line_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' compute='_compute_any_line_id' string='Account Analytics Lines'
  • block_id Many2one → hr.utilization.report.block
    comodel_name='hr.utilization.report.block' ondelete='cascade' required=True string='Block'
  • scope Char
    required=True string='Scope'
  • sequence Integer
    required=True string='Sequence'
  • total_unit_amount_a Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (A)'
  • total_unit_amount_b Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (B)'
  • total_utilization_a Float
    compute='_compute_total_utilization' store=True string='Total Utilization (A)'
  • total_utilization_b Float
    compute='_compute_total_utilization' store=True string='Total Utilization (B)'
Public methods (1)
  • render_value(self, field_name)
    @api.multi

New fields (7)
  • aggregation Char
    string='Aggregation'
  • field_name Char
    required=True string='Field name'
  • field_title Char
    required=True string='Field title'
  • field_type Char
    required=True string='Field type'
  • groupby Char
    compute='_compute_groupby' string='Group-by expression'
  • report_id Many2one → hr.utilization.report
    comodel_name='hr.utilization.report' ondelete='cascade' required=True string='Report'
  • sequence Integer
    required=True string='Sequence'
Public methods (0)

No public methods.

New fields (1)
  • cell_classes Char
    compute='_compute_cell_classes' string='Cell classes'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (11)
  • block_ids One2many → hr.utilization.report.block
    comodel_name='hr.utilization.report.block' compute='_compute_block_ids' inverse_name='group_id' store=True string='Blocks'
  • has_multientry_blocks Boolean
    compute='_compute_has_multientry_blocks' store=True string='Has Multi-Entry Blocks'
  • name Char
  • report_id Many2one → hr.utilization.report
    comodel_name='hr.utilization.report' ondelete='cascade' required=True string='Report'
  • scope Char
    required=True string='Scope'
  • sequence Integer
    required=True string='Sequence'
  • total_capacity Float
    compute='_compute_total_capacity' store=True string='Total Capacity'
  • total_unit_amount_a Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (A)'
  • total_unit_amount_b Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity (B)'
  • total_utilization_a Float
    compute='_compute_total_utilization' store=True string='Total Utilization (A)'
  • total_utilization_b Float
    compute='_compute_total_utilization' store=True string='Total Utilization (B)'
Public methods (0)

No public methods.

New fields (11)
  • date_from Date
    required=True string='Start Date'
  • date_to Date
    required=True string='End Date'
  • department_ids Many2many → hr.department
    comodel_name='hr.department' string='Departments'
  • employee_category_ids Many2many → hr.employee.category
    comodel_name='hr.employee.category' string='Employee Tags'
  • employee_ids Many2many → hr.employee
    comodel_name='hr.employee' string='Employees'
  • entry_field_ids One2many → hr.utilization.report.wizard.field.details
    comodel_name='hr.utilization.report.wizard.field.details' default=<expr> inverse_name='wizard_id' string='Details Fields'
  • grouping_field_ids One2many → hr.utilization.report.wizard.field.grouping
    comodel_name='hr.utilization.report.wizard.field.grouping' default=<expr> inverse_name='wizard_id' string='Grouping Fields'
  • only_active_employees Boolean
    default=True string='Only Active Employees'
  • split_by_field_name Selection
    selection=<expr> string='Split-By Field'
  • time_format Selection
    default=<expr> required=True selection=<expr> string='Time format'
  • utilization_format Selection
    default=<expr> required=True selection=<expr> string='Utilization format'
Public methods (3)
  • action_export_html(self)
    @api.multi
  • action_export_pdf(self)
    @api.multi
  • action_export_xlsx(self)
    @api.multi

New fields (5)
  • field_name Selection
    required=True selection='_selection_field_name' string='Field'
  • field_title Char
    compute='_compute_field_title' string='Title'
  • field_type Char
    compute='_compute_field_type' string='Type'
  • sequence Integer
    default=10 required=True string='Sequence'
  • wizard_id Many2one → hr.utilization.report.wizard
    comodel_name='hr.utilization.report.wizard' ondelete='cascade' required=True string='Wizard'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • generate_xlsx_report(self, workbook, data, docs)
    @api.model
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/timesheet
PULL REQUEST
PULL REQUEST[18.0][MIG] hr_utilization_report: Migration to 18.0 (#748)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/timesheet
PULL REQUEST
PULL REQUEST[15.0][MIG] hr_utilization_report: Migration to 15.0 (#745)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/timesheet
PULL REQUEST
PULL REQUEST[16.0][MIG] hr_utilization_report: Migration to 16.0 (#746)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/timesheet
PULL REQUEST
PULL REQUEST[17.0][MIG] hr_utilization_report: Migration to 17.0 (#747)