Task Logs Timesheet Report

hr_timesheet_report
REPOSITORY
REPOSITORYOCA/timesheet
GIT
GIThttps://github.com/OCA/timesheet.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/timesheet/tree/18.0/hr_timesheet_report
VERSION
VERSION 1.0.0
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
COMMITTERSOCA-git-bot, oca-ci, tendil
WEBSITE
WEBSITEhttps://github.com/OCA/timesheet
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/reporting-engine:
    - report_xlsx
odoo/odoo:
    - hr_timesheet
    - hr
    - base_setup
    - base
    - web
    - digest
    - mail
    - bus
    - web_tour
    - html_editor
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - phone_validation
    - resource_mail
    - hr_hourly_cost
    - analytic
    - uom
    - project
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows to generate configurable Timesheet Report from Task
Logs.

Features:

> - Select reported fields
> - Select and reorder report line grouping
> - Configure time format (HH:MM, HH:MM:SS, or decimal)
> - View in browser, export in PDF and XLSX formats

Code Analysis

Views touched (2)
XML IDNameModelTypeStatus
hr_timesheet_report_wizard_form hr.timesheet.report.wizard.form hr.timesheet.report.wizard form New
report report ir.ui.view qweb New
Models touched (12)

New fields (0)

No new fields.

Public methods (1)
  • action_timesheet_report_wizard(self)

New fields (13)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.field.entry
    comodel_name='hr.timesheet.report.field.entry' inverse_name='report_id' string='Entry Fields'
  • group_ids One2many → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' compute='_compute_group_ids' inverse_name='report_id' store=True string='Groups'
  • groupby_field_ids One2many → hr.timesheet.report.field.groupby
    comodel_name='hr.timesheet.report.field.groupby' inverse_name='report_id' string='Group-By Fields'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    required=True selection=<expr> string='Time format'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (1)
  • get_action(self, report_type='qweb-html')

New fields (5)
  • any_line_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' compute='_compute_any_line_id' string='Account Analytics Lines'
  • group_id Many2one → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' ondelete='cascade' required=True string='Group'
  • scope Char
  • sequence Integer
    required=True
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (1)
  • render_value(self, field_name)

New fields (7)
  • aggregation Char
  • 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.timesheet.report
    comodel_name='hr.timesheet.report' ondelete='cascade' required=True string='Report'
  • sequence Integer
    required=True
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 (6)
  • entry_ids One2many → hr.timesheet.report.entry
    comodel_name='hr.timesheet.report.entry' compute='_compute_entry_ids' inverse_name='group_id' store=True string='Entries'
  • name Char
  • report_id Many2one → hr.timesheet.report
    comodel_name='hr.timesheet.report' ondelete='cascade' required=True string='Report'
  • scope Char
  • sequence Integer
    required=True
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (0)

No public methods.

New fields (12)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.wizard.field.details
    comodel_name='hr.timesheet.report.wizard.field.details' default=<expr> inverse_name='wizard_id' string='Details Fields'
  • grouping_field_ids One2many → hr.timesheet.report.wizard.field.grouping
    comodel_name='hr.timesheet.report.wizard.field.grouping' default=<expr> inverse_name='wizard_id' string='Grouping Fields'
  • has_line_ids Boolean
    compute='_compute_has_line_ids' string='Has lines (technical)'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    default=<expr> required=True selection=<expr> string='Time format'
Public methods (4)
  • action_export_html(self)
  • action_export_pdf(self)
  • action_export_xlsx(self)
  • create(self, vals_list)
    @api.model_create_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
  • wizard_id Many2one → hr.timesheet.report.wizard
    comodel_name='hr.timesheet.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/17.0/hr_timesheet_report
VERSION
VERSION 1.0.0
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
COMMITTERSOCA-git-bot, oca-ci, CristianoMafraJunior, Cristiano Mafra Junior
WEBSITE
WEBSITEhttps://github.com/OCA/timesheet
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/reporting-engine:
    - report_xlsx
odoo/odoo:
    - hr_timesheet
    - hr
    - base_setup
    - base
    - web
    - phone_validation
    - mail
    - bus
    - web_tour
    - resource
    - hr_hourly_cost
    - analytic
    - uom
    - project
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - rating
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES xlrd
xlsxwriter
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows to generate configurable Timesheet Report from Task
Logs.

Features:

> - Select reported fields
> - Select and reorder report line grouping
> - Configure time format (HH:MM, HH:MM:SS, or decimal)
> - View in browser, export in PDF and XLSX formats

Code Analysis

Views touched (2)
XML IDNameModelTypeStatus
hr_timesheet_report_wizard_form hr.timesheet.report.wizard.form hr.timesheet.report.wizard form New
report report ir.ui.view qweb New
Models touched (12)

New fields (0)

No new fields.

Public methods (1)
  • action_timesheet_report_wizard(self)

New fields (13)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.field.entry
    comodel_name='hr.timesheet.report.field.entry' inverse_name='report_id' string='Entry Fields'
  • group_ids One2many → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' compute='_compute_group_ids' inverse_name='report_id' store=True string='Groups'
  • groupby_field_ids One2many → hr.timesheet.report.field.groupby
    comodel_name='hr.timesheet.report.field.groupby' inverse_name='report_id' string='Group-By Fields'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    required=True selection=<expr> string='Time format'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (1)
  • get_action(self, report_type='qweb-html')

New fields (5)
  • any_line_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' compute='_compute_any_line_id' string='Account Analytics Lines'
  • group_id Many2one → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' ondelete='cascade' required=True string='Group'
  • scope Char
  • sequence Integer
    required=True
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (1)
  • render_value(self, field_name)

New fields (7)
  • aggregation Char
  • 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.timesheet.report
    comodel_name='hr.timesheet.report' ondelete='cascade' required=True string='Report'
  • sequence Integer
    required=True
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 (6)
  • entry_ids One2many → hr.timesheet.report.entry
    comodel_name='hr.timesheet.report.entry' compute='_compute_entry_ids' inverse_name='group_id' store=True string='Entries'
  • name Char
  • report_id Many2one → hr.timesheet.report
    comodel_name='hr.timesheet.report' ondelete='cascade' required=True string='Report'
  • scope Char
  • sequence Integer
    required=True
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (0)

No public methods.

New fields (12)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.wizard.field.details
    comodel_name='hr.timesheet.report.wizard.field.details' default=<expr> inverse_name='wizard_id' string='Details Fields'
  • grouping_field_ids One2many → hr.timesheet.report.wizard.field.grouping
    comodel_name='hr.timesheet.report.wizard.field.grouping' default=<expr> inverse_name='wizard_id' string='Grouping Fields'
  • has_line_ids Boolean
    compute='_compute_has_line_ids' string='Has lines (technical)'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    default=<expr> required=True selection=<expr> string='Time format'
Public methods (4)
  • action_export_html(self)
  • action_export_pdf(self)
  • action_export_xlsx(self)
  • create(self, vals_list)
    @api.model_create_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
  • wizard_id Many2one → hr.timesheet.report.wizard
    comodel_name='hr.timesheet.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/16.0/hr_timesheet_report
VERSION
VERSION 1.1.0
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
COMMITTERSVíctor Martínez, Weblate, OCA-git-bot, oca-ci, Simon Maillard
WEBSITE
WEBSITEhttps://github.com/OCA/timesheet
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/reporting-engine:
    - report_xlsx
odoo/odoo:
    - hr_timesheet
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - hr_hourly_cost
    - 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 (2)
XML IDNameModelTypeStatus
hr_timesheet_report_wizard_form hr.timesheet.report.wizard.form hr.timesheet.report.wizard form New
report report ir.ui.view qweb New
Models touched (12)

New fields (0)

No new fields.

Public methods (1)
  • action_timesheet_report_wizard(self)

New fields (14)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.field.entry
    comodel_name='hr.timesheet.report.field.entry' inverse_name='report_id' string='Entry Fields'
  • group_ids One2many → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' compute='_compute_group_ids' inverse_name='report_id' store=True string='Groups'
  • groupby_field_ids One2many → hr.timesheet.report.field.groupby
    comodel_name='hr.timesheet.report.field.groupby' inverse_name='report_id' string='Group-By Fields'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    required=True selection=<expr> string='Time format'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
  • uom Many2one → uom.uom
    compute='_compute_uom' store=True args: 'uom.uom'
Public methods (1)
  • get_action(self, report_type='qweb-html')

New fields (6)
  • any_line_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' compute='_compute_any_line_id' string='Account Analytics Lines'
  • group_id Many2one → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' ondelete='cascade' required=True string='Group'
  • scope Char
  • sequence Integer
    required=True
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
  • uom Many2one → uom.uom
    related='group_id.report_id.uom' args: 'uom.uom'
Public methods (1)
  • render_value(self, field_name)

New fields (7)
  • aggregation Char
  • 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.timesheet.report
    comodel_name='hr.timesheet.report' ondelete='cascade' required=True string='Report'
  • sequence Integer
    required=True
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 (6)
  • entry_ids One2many → hr.timesheet.report.entry
    comodel_name='hr.timesheet.report.entry' compute='_compute_entry_ids' inverse_name='group_id' store=True string='Entries'
  • name Char
  • report_id Many2one → hr.timesheet.report
    comodel_name='hr.timesheet.report' ondelete='cascade' required=True string='Report'
  • scope Char
  • sequence Integer
    required=True
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (0)

No public methods.

New fields (12)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.wizard.field.details
    comodel_name='hr.timesheet.report.wizard.field.details' default=<expr> inverse_name='wizard_id' string='Details Fields'
  • grouping_field_ids One2many → hr.timesheet.report.wizard.field.grouping
    comodel_name='hr.timesheet.report.wizard.field.grouping' default=<expr> inverse_name='wizard_id' string='Grouping Fields'
  • has_line_ids Boolean
    compute='_compute_has_line_ids' string='Has lines (technical)'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    default=<expr> required=True selection=<expr> string='Time format'
Public methods (4)
  • action_export_html(self)
  • action_export_pdf(self)
  • action_export_xlsx(self)
  • create(self, vals_list)
    @api.model_create_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
  • wizard_id Many2one → hr.timesheet.report.wizard
    comodel_name='hr.timesheet.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/14.0/hr_timesheet_report
VERSION
VERSION 1.0.1
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
COMMITTERSOCA Transbot, oca-travis, Weblate, OCA-git-bot, 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_timesheet
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - 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 (2)
XML IDNameModelTypeStatus
hr_timesheet_report_wizard_form hr.timesheet.report.wizard.form hr.timesheet.report.wizard form New
report report ir.ui.view qweb New
Models touched (12)

New fields (0)

No new fields.

Public methods (1)
  • action_timesheet_report_wizard(self)

New fields (13)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.field.entry
    comodel_name='hr.timesheet.report.field.entry' inverse_name='report_id' string='Entry Fields'
  • group_ids One2many → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' compute='_compute_group_ids' inverse_name='report_id' store=True string='Groups'
  • groupby_field_ids One2many → hr.timesheet.report.field.groupby
    comodel_name='hr.timesheet.report.field.groupby' inverse_name='report_id' string='Group-By Fields'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    required=True selection=<expr> string='Time format'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (1)
  • get_action(self, report_type='qweb-html')

New fields (5)
  • any_line_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' compute='_compute_any_line_id' string='Account Analytics Lines'
  • group_id Many2one → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' ondelete='cascade' required=True string='Group'
  • scope Char
    string='Scope'
  • sequence Integer
    required=True string='Sequence'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
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.timesheet.report
    comodel_name='hr.timesheet.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 (6)
  • entry_ids One2many → hr.timesheet.report.entry
    comodel_name='hr.timesheet.report.entry' compute='_compute_entry_ids' inverse_name='group_id' store=True string='Entries'
  • name Char
  • report_id Many2one → hr.timesheet.report
    comodel_name='hr.timesheet.report' ondelete='cascade' required=True string='Report'
  • scope Char
    string='Scope'
  • sequence Integer
    required=True string='Sequence'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (0)

No public methods.

New fields (12)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.wizard.field.details
    comodel_name='hr.timesheet.report.wizard.field.details' default=<expr> inverse_name='wizard_id' string='Details Fields'
  • grouping_field_ids One2many → hr.timesheet.report.wizard.field.grouping
    comodel_name='hr.timesheet.report.wizard.field.grouping' default=<expr> inverse_name='wizard_id' string='Grouping Fields'
  • has_line_ids Boolean
    compute='_compute_has_line_ids' string='Has lines (technical)'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    default=<expr> required=True selection=<expr> string='Time format'
Public methods (4)
  • action_export_html(self)
  • action_export_pdf(self)
  • action_export_xlsx(self)
  • create(self, vals)
    @api.model

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.timesheet.report.wizard
    comodel_name='hr.timesheet.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_timesheet_report
VERSION
VERSION 1.0.1
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
WEBSITE
WEBSITEhttps://github.com/OCA/timesheet
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:23
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 (2)
XML IDNameModelTypeStatus
hr_timesheet_report_wizard_form hr.timesheet.report.wizard.form hr.timesheet.report.wizard form New
report report ir.ui.view qweb New
Models touched (12)

New fields (0)

No new fields.

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

New fields (13)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.field.entry
    comodel_name='hr.timesheet.report.field.entry' inverse_name='report_id' string='Entry Fields'
  • group_ids One2many → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' compute='_compute_group_ids' inverse_name='report_id' store=True string='Groups'
  • groupby_field_ids One2many → hr.timesheet.report.field.groupby
    comodel_name='hr.timesheet.report.field.groupby' inverse_name='report_id' string='Group-By Fields'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    required=True selection=<expr> string='Time format'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (1)
  • get_action(self, report_type='qweb-html')
    @api.multi

New fields (5)
  • any_line_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' compute='_compute_any_line_id' string='Account Analytics Lines'
  • group_id Many2one → hr.timesheet.report.group
    comodel_name='hr.timesheet.report.group' ondelete='cascade' required=True string='Group'
  • scope Char
    string='Scope'
  • sequence Integer
    required=True string='Sequence'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
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.timesheet.report
    comodel_name='hr.timesheet.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 (6)
  • entry_ids One2many → hr.timesheet.report.entry
    comodel_name='hr.timesheet.report.entry' compute='_compute_entry_ids' inverse_name='group_id' store=True string='Entries'
  • name Char
  • report_id Many2one → hr.timesheet.report
    comodel_name='hr.timesheet.report' ondelete='cascade' required=True string='Report'
  • scope Char
    string='Scope'
  • sequence Integer
    required=True string='Sequence'
  • total_unit_amount Float
    compute='_compute_total_unit_amount' store=True string='Total Quantity'
Public methods (0)

No public methods.

New fields (12)
  • date_from Date
    string='Start Date'
  • date_to Date
    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.timesheet.report.wizard.field.details
    comodel_name='hr.timesheet.report.wizard.field.details' default=<expr> inverse_name='wizard_id' string='Details Fields'
  • grouping_field_ids One2many → hr.timesheet.report.wizard.field.grouping
    comodel_name='hr.timesheet.report.wizard.field.grouping' default=<expr> inverse_name='wizard_id' string='Grouping Fields'
  • has_line_ids Boolean
    compute='_compute_has_line_ids' string='Has lines (technical)'
  • line_ids Many2many → account.analytic.line
    comodel_name='account.analytic.line' string='Account Analytics Lines'
  • project_ids Many2many → project.project
    comodel_name='project.project' string='Projects'
  • task_ids Many2many → project.task
    comodel_name='project.task' string='Tasks'
  • time_format Selection
    default=<expr> required=True selection=<expr> string='Time format'
Public methods (4)
  • action_export_html(self)
    @api.multi
  • action_export_pdf(self)
    @api.multi
  • action_export_xlsx(self)
    @api.multi
  • create(self, vals)
    @api.model

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.timesheet.report.wizard
    comodel_name='hr.timesheet.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[19.0][MIG] hr_timesheet_report: Migration to 19.0 (#919)