Repository
odoo/odoo · module folder
Module version
1.0
Category
Services/Timesheets
Folder size
4.53 MB
License
LGPL-3
Application
No
Auto-installable
No
Website
https://www.odoo.com/app/timesheet
Last tracking update
2026-08-21 16:14:24
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Aaron Bohy, Yannick Tivisse, Jorge Pinna Puissant, Julien Castiaux, Julien Mougenot, svs-odoo, Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, william-andre, Audric Onockx (auon), luvi, Vincent Larcin, damr, Louis Wicket (wil), Victor Piryns (pivi), Dylan Kiss (dyki), Xavier Bol (xbo), Brieuc-brd, rajh-odoo, guva-odoo, Youssef Bashandy, bary, Maxime de Neuville, suth-odoo, sami odoo, asno-odoo, Mathieu Coutant, Abdelrahman Mahmoud (amah), Mohammad Abdulmoneim (abdu), Michaël Mattiello, K Theja (kthe), Mahdi Alijani (malj), bona-odoo, Krzysztof Magusiak (krma), Ajit Singh, Akash Pandey, Robin Engels (roen), vpan-odoo, nsirjacobs, mjvi-odoo, K Theja (kthe@odoo.com), Quentin Colla (qucol), Elliot ELCO, Maxime de Neuville (mane), maap-odoo, Abdelouahab Laaroussi (abla), Farah (ahmfa), karygauss03, chpa-odoo, Stanislav Kostenko, Jenish Korat, nikhil
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
fieldservice_timesheet, hr_timesheet_attendance, hr_timesheet_autofill_project_off, hr_timesheet_begin_end, hr_timesheet_day_week, hr_timesheet_employee_analytic_tag, hr_timesheet_portal, hr_timesheet_task_domain, hr_timesheet_task_required, hr_timesheet_task_stage, hr_timesheet_time_control, maintenance_timesheet, project_milestone_status, project_task_ancestor, project_timeline_hr_timesheet, project_timesheet_holidays, sale_timesheet, spreadsheet_dashboard_hr_timesheet, website_timesheet
Description
This module implements a timesheet system.
==========================================

Each employee can encode and track their time spent on the different projects.

Lots of reporting on time and employee tracking are provided.

It is completely integrated with the cost accounting module. It allows you to set
up a management by affair.
    

Code Analysis

Views touched (68)
XML IDNameModelTypeStatus
hr_department_view_kanban hr.department.kanban.inherit hr.department kanban Inherits hr.hr_department_view_kanban
hr_employee_delete_wizard_form Delete Employee hr.employee.delete.wizard form New
hr_employee_public_view_form hr.employee.public.form.inherit.timesheet hr.employee.public form Inherits hr.hr_employee_public_view_form
hr_employee_view_form_inherit_timesheet hr.employee.form.timesheet hr.employee form Inherits hr_hourly_cost.view_employee_form
hr_employee_view_kanban_inherit_timesheet hr.employee.kanban.timesheet hr.employee kanban Inherits hr.hr_kanban_view_employees
hr_timesheet.timesheet_project_task_page hr_timesheet.timesheet_project_task_page ir.ui.view qweb New
hr_timesheet.timesheet_table hr_timesheet.timesheet_table ir.ui.view qweb New
hr_timesheet_line_form account.analytic.line.form account.analytic.line form New
hr_timesheet_line_my_timesheet_search view.search.my.timesheet.menu account.analytic.line search Inherits hr_timesheet_line_search
hr_timesheet_line_portal_tree portal.hr_timesheet.account.analytic.line.list account.analytic.line list Inherits hr_timesheet_line_tree
hr_timesheet_line_search account.analytic.line.search account.analytic.line search Inherits analytic.view_account_analytic_line_filter
hr_timesheet_line_tree account.analytic.line.list.hr_timesheet account.analytic.line list New
hr_timesheet_report_search timesheets.analysis.report.search timesheets.analysis.report search Inherits hr_timesheet.hr_timesheet_line_search
portal_layout Portal layout: timesheet menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_timesheet Timesheets ir.ui.view qweb Inherits portal.portal_my_home
portal_my_task Portal: My Task with Timesheets ir.ui.view qweb Inherits project.portal_my_task
portal_my_task_allocated_hours_template portal_my_task_allocated_hours_template ir.ui.view qweb New
portal_my_timesheets My Timesheets ir.ui.view qweb New
portal_tasks_list_inherit Portal: My Tasks with Timesheets ir.ui.view qweb Inherits project.portal_tasks_list
portal_timesheet_table Portal Timesheet Table ir.ui.view qweb New
project_invoice_form Inherit project form : Invoicing Data project.project form Inherits project.edit_project
project_project_view_form_simplified_inherit_timesheet project.project.view.form.simplified.inherit.timesheet project.project form Inherits project.project_project_view_form_simplified
project_project_view_tree_inherit_sale_project project.project.list.inherit.sale.timesheet project.project list Inherits project.view_project
project_sharing_inherit_project_task_view_form project.sharing.project.task.view.form.inherit project.task form Inherits project.project_sharing_project_task_view_form
project_sharing_kanban_inherit_project_task_view_kanban project.sharing.project.task.timesheet.kanban.inherited project.task kanban Inherits project.project_sharing_project_task_view_kanban
project_task_view_graph project.task.view.graph.inherited project.task graph Inherits project.view_project_task_graph
project_task_view_pivot project.task.view.pivot.inherited project.task pivot Inherits project.view_project_task_pivot
project_task_view_search project.task.view.search.inherit.sale.timesheet.enterprise project.task search Inherits project.view_task_search_form_project_fsm_base
project_templates_view_list_inherit_timesheet project.project.template.list.inherit.timesheet project.project list Inherits project.project_templates_view_list
project_update_view_kanban_inherit project.update.view.kanban.inherit project.update kanban Inherits project.project_update_view_kanban
project_update_view_search_inherit project.update.view.search.inherit project.update search Inherits project.project_update_view_search
report_project_task_timesheet report_project_task_timesheet ir.ui.view qweb New
report_timesheet report_timesheet ir.ui.view qweb New
report_timesheet_project report_timesheet_project ir.ui.view qweb New
report_timesheet_task report_timesheet_task ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.timesheet res.config.settings form Inherits base.res_config_settings_view_form
timesheet_report_subtask timesheet_report_subtask ir.ui.view qweb New
timesheet_view_form_portal_user account.analytic.line.form account.analytic.line form Inherits hr_timesheet.timesheet_view_form_user
timesheet_view_form_user account.analytic.line.list.with.user account.analytic.line form Inherits hr_timesheet.hr_timesheet_line_form
timesheet_view_tree_user account.analytic.line.view.list.with.user account.analytic.line list Inherits hr_timesheet_line_tree
timesheets_analysis_report_form timesheets.analysis.report.form timesheets.analysis.report form New
timesheets_analysis_report_graph_employee timesheets.analysis.report.graph timesheets.analysis.report graph New
timesheets_analysis_report_graph_project timesheets.analysis.report.graph timesheets.analysis.report graph New
timesheets_analysis_report_graph_task timesheets.analysis.report.graph timesheets.analysis.report graph New
timesheets_analysis_report_list timesheets.analysis.report.list timesheets.analysis.report list New
timesheets_analysis_report_pivot_employee timesheets.analysis.report.pivot timesheets.analysis.report pivot New
timesheets_analysis_report_pivot_project timesheets.analysis.report.pivot timesheets.analysis.report pivot New
timesheets_analysis_report_pivot_task timesheets.analysis.report.pivot timesheets.analysis.report pivot New
view_calendar_account_analytic_line account.analytic.line.calendar account.analytic.line calendar New
view_calendar_account_analytic_line_multi_create account.analytic.line.calendar.multi_create account.analytic.line form New
view_calendar_account_analytic_line_my_timesheets account.analytic.line.calendar account.analytic.line calendar Inherits hr_timesheet.view_calendar_account_analytic_line
view_employee_tree_inherit_timesheet hr.employee.list.timesheet hr.employee list Inherits hr.view_employee_tree
view_hr_timesheet_line_by_project account.analytic.line.graph.by.project account.analytic.line graph Inherits hr_timesheet.view_hr_timesheet_line_graph_all
view_hr_timesheet_line_graph account.analytic.line.graph account.analytic.line graph New
view_hr_timesheet_line_graph_all account.analytic.line.graph account.analytic.line graph New
view_hr_timesheet_line_graph_by_employee account.analytic.line.graph.by.employee account.analytic.line graph Inherits hr_timesheet.view_hr_timesheet_line_graph_all
view_hr_timesheet_line_graph_my account.analytic.line.graph account.analytic.line graph New
view_hr_timesheet_line_pivot account.analytic.line.pivot account.analytic.line pivot New
view_kanban_account_analytic_line account.analytic.line.kanban account.analytic.line kanban New
view_kanban_account_analytic_line_portal_user portal.account.analytic.line.kanban account.analytic.line kanban Inherits hr_timesheet.view_kanban_account_analytic_line
view_my_timesheet_line_pivot account.analytic.line.pivot account.analytic.line pivot New
view_project_kanban_inherited project.project.timesheet.kanban.inherited project.project kanban Inherits project.view_project_kanban
view_project_project_filter_inherit_timesheet project.project.view.inherit.timesheet project.project Inherits project.view_project_project_filter
view_task_form2_inherited project.task.form.inherited project.task form Inherits project.view_task_form2
view_task_kanban_inherited_progress project.task.timesheet.kanban.inherited.progress project.task kanban Inherits project.view_task_kanban
view_task_project_user_graph_inherited report.project.task.user.graph.inherited report.project.task.user graph Inherits project.view_task_project_user_graph
view_task_project_user_pivot_inherited report.project.task.user.pivot.inherited report.project.task.user pivot Inherits project.view_task_project_user_pivot
view_task_tree2_inherited project.task.list.inherited project.task list Inherits project.project_task_view_tree_main_base
HTTP endpoints (1)
Route(s)HandlerAuthTypeMethodsFlags
/my/timesheets, /my/timesheets/page/<int:page> TimesheetCustomerPortal.portal_my_timesheets user http ALL sudo website
Models touched (17)

New fields (1)
  • business_domain Selection
    ondelete={'timesheet': 'cascade'} selection_add=[('timesheet', 'Timesheet')]
Public methods (0)

No public methods.

New fields (14)
  • calendar_display_name Char
    compute='_compute_calendar_display_name' export_string_translation=False
  • department_id Many2one → hr.department
    compute='_compute_department_id' compute_sudo=True store=True args: 'hr.department', 'Department'
  • employee_id Many2one → hr.employee
    context={'active_test': False} domain=_domain_employee_id help="Define an 'hourly cost' on the employee to track the cost of their time." index=True args: 'hr.employee', 'Employee'
  • encoding_uom_id Many2one → uom.uom
    compute='_compute_encoding_uom_id' export_string_translation=False args: 'uom.uom'
  • job_title Char
    export_string_translation=False related='employee_id.job_title'
  • manager_id Many2one → hr.employee
    related='employee_id.parent_id' store=True args: 'hr.employee', 'Manager'
  • message_partner_ids Many2many → res.partner
    compute='_compute_message_partner_ids' search='_search_message_partner_ids' args: 'res.partner'
  • milestone_id Many2one → project.milestone
    related='task_id.milestone_id' args: 'project.milestone'
  • parent_task_id Many2one → project.task
    index='btree_not_null' related='task_id.parent_id' store=True args: 'project.task'
  • partner_id Many2one
    compute='_compute_partner_id' readonly=False store=True
  • project_id Many2one → project.project
    compute='_compute_project_id' domain=_domain_project_id index=True inverse='_inverse_project_id' readonly=False store=True args: 'project.project', 'Project'
  • readonly_timesheet Boolean
    compute='_compute_readonly_timesheet' compute_sudo=True export_string_translation=False
  • task_id Many2one → project.task
    compute='_compute_task_id' domain="[('allow_timesheets', '=', True), ('project_id', '=?', project_id), ('has_template_ancestor', '=', False)]" index='btree_not_null' readonly=False store=True args: 'project.task', 'Task'
  • user_id Many2one
    compute='_compute_user_id' readonly=False store=True
Public methods (7)
  • action_open_timesheet_view_portal(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_import_templates(self)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • get_views(self, views, options=None)
    @api.model
  • write(self, vals)

New fields (4)
  • active Boolean
    default=True export_string_translation=False
  • checked Boolean
    default=True export_string_translation=False
  • employee_id Many2one → hr.employee
    export_string_translation=False args: 'hr.employee'
  • user_id Many2one → res.users
    default=<expr> export_string_translation=False ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (1)
  • has_timesheet Boolean
    compute='_compute_has_timesheet' export_string_translation=False
Public methods (2)
  • action_timesheet_from_employee(self)
  • action_unlink_wizard(self)

New fields (3)
  • employee_ids Many2many → hr.employee
    context={'active_test': False} export_string_translation=False string='Employees' args: 'hr.employee'
  • has_active_employee Boolean
    compute='_compute_has_active_employee' export_string_translation=False string='Has Active Employee'
  • has_timesheet Boolean
    compute='_compute_has_timesheet' compute_sudo=True export_string_translation=False string='Has Timesheet'
Public methods (3)
  • action_archive(self)
  • action_confirm_delete(self)
  • action_open_timesheets(self)

New fields (1)
  • has_timesheet Boolean
    related='employee_id.has_timesheet'
Public methods (1)
  • action_timesheet_from_employee(self)

New fields (0)

No new fields.

Public methods (2)
  • get_timesheet_uoms(self)
    @api.model
  • session_info(self)
    The widget 'timesheet_uom' needs to know which UoM conversion factor and which javascript widget to apply, depending on the current company.

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 (12)
  • account_id Many2one
    domain="[\n '|', ('company_id', '=', False), ('company_id', '=?', company_id),\n ('partner_id', '=?', partner_id),\n ]"
  • allocated_hours Float
    string='Allocated Time' tracking=True
  • allow_timesheets Boolean
    compute='_compute_allow_timesheets' default=True readonly=False store=True args: 'Timesheets'
  • analytic_account_active Boolean
    export_string_translation=False related='account_id.active' args: 'Active Account'
  • effective_hours Float
    compute='_compute_remaining_hours' compute_sudo=True string='Time Spent'
  • encode_uom_in_days Boolean
    compute='_compute_encode_uom_in_days' export_string_translation=False
  • is_internal_project Boolean
    compute='_compute_is_internal_project' export_string_translation=False search='_search_is_internal_project'
  • is_project_overtime Boolean
    compute='_compute_remaining_hours' compute_sudo=True export_string_translation=False search='_search_is_project_overtime' args: 'Project in Overtime'
  • remaining_hours Float
    compute='_compute_remaining_hours' compute_sudo=True string='Time Remaining'
  • timesheet_encode_uom_id Many2one → uom.uom
    compute='_compute_timesheet_encode_uom_id' export_string_translation=False args: 'uom.uom'
  • timesheet_ids One2many → account.analytic.line
    export_string_translation=False args: 'account.analytic.line', 'project_id', 'Associated Timesheets'
  • total_timesheet_time Float
    compute='_compute_total_timesheet_time' export_string_translation=False groups='hr_timesheet.group_hr_timesheet_user' string='Total amount of time (in the proper unit) recorded in the project, rounded to the unit.'
Public methods (5)
  • action_project_timesheets(self)
  • action_view_tasks(self)
  • create(self, vals_list)
    @api.model_create_multi
    Create an analytic account if project allow timesheet and don't provide one Note: create it before calling super() to avoid raising the ValidationError from _check_allow_timesheet
  • get_create_edit_project_ids(self)
    @api.model
  • write(self, vals)

New fields (13)
  • allow_timesheets Boolean
    compute='_compute_allow_timesheets' compute_sudo=True export_string_translation=False readonly=True search='_search_allow_timesheets' args: 'Allow timesheets'
  • analytic_account_active Boolean
    export_string_translation=False related='project_id.analytic_account_active' args: 'Active Analytic Account'
  • display_name Char
    help='Use these keywords in the title to set new tasks:\n\n 30h Allocate 30 hours to the task\n #tags Set tags on the task\n @user Assign the task to a user\n ! Set the task a medium priority\n !! Set the task a high priority\n !!! Set the task a urgent priority\n\n Make sure to use the right format and order e.g. Improve the configuration screen 5h #feature #v16 @Mitchell !'
  • effective_hours Float
    compute='_compute_effective_hours' compute_sudo=True store=True args: 'Time Spent'
  • encode_uom_in_days Boolean
    compute='_compute_encode_uom_in_days' default=<expr> export_string_translation=False
  • overtime Float
    compute='_compute_progress_hours' store=True
  • progress Float
    aggregator='avg' compute='_compute_progress_hours' store=True args: 'Progress'
  • project_id Many2one
    domain="['|', ('company_id', '=', False), ('company_id', '=?', company_id), ('is_internal_project', '=', False), ('is_template', 'in', [is_template, False])]"
  • remaining_hours Float
    compute='_compute_remaining_hours' help='Number of allocated hours minus the number of hours spent.' readonly=True store=True args: 'Time Remaining'
  • remaining_hours_percentage Float
    compute='_compute_remaining_hours_percentage' export_string_translation=False search='_search_remaining_hours_percentage'
  • subtask_effective_hours Float
    compute='_compute_subtask_effective_hours' help='Time spent on the sub-tasks (and their own sub-tasks) of this task.' recursive=True store=True args: 'Time Spent on Sub-tasks'
  • timesheet_ids One2many → account.analytic.line
    export_string_translation=False args: 'account.analytic.line', 'task_id', 'Timesheets'
  • total_hours_spent Float
    compute='_compute_total_hours_spent' help='Time spent on this task and its sub-tasks (and their own sub-tasks).' store=True args: 'Total Time Spent'
Public methods (2)
  • TASK_PORTAL_READABLE_FIELDS(self)
    @property
  • action_view_subtask_timesheet(self)

New fields (5)
  • allocated_time Integer
    readonly=True args: 'Allocated Time'
  • display_timesheet_stats Boolean
    compute='_compute_display_timesheet_stats' export_string_translation=False
  • timesheet_percentage Integer
    compute='_compute_timesheet_percentage' export_string_translation=False
  • timesheet_time Integer
    readonly=True args: 'Timesheet Time'
  • uom_id Many2one → uom.uom
    export_string_translation=False readonly=True args: 'uom.uom', 'Unit'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (6)
  • allocated_hours Float
    groups='hr_timesheet.group_hr_timesheet_user' readonly=True args: 'Allocated Time'
  • effective_hours Float
    groups='hr_timesheet.group_hr_timesheet_user' readonly=True args: 'Time Spent'
  • overtime Float
    groups='hr_timesheet.group_hr_timesheet_user' readonly=True
  • progress Float
    aggregator='avg' groups='hr_timesheet.group_hr_timesheet_user' readonly=True args: 'Progress'
  • remaining_hours Float
    groups='hr_timesheet.group_hr_timesheet_user' readonly=True args: 'Time Remaining'
  • remaining_hours_percentage Float
    groups='hr_timesheet.group_hr_timesheet_user' readonly=True args: 'Time Remaining Percentage'
Public methods (0)

No public methods.

New fields (3)
  • internal_project_id Many2one → project.project
    domain=[('is_template', '=', False)] help='Default project value for timesheet generated from time off type.' string='Internal Project' args: 'project.project'
  • project_time_mode_id Many2one → uom.uom
    default=_default_project_time_mode_id help="This will set the unit of measure used in projects and tasks.\nIf you use the timesheet linked to projects, don't forget to setup the right unit of measure in your employees." string='Project Time Unit' args: 'uom.uom'
  • timesheet_encode_uom_id Many2one → uom.uom
    default=_default_timesheet_encode_uom_id string='Timesheet Encoding Unit' args: 'uom.uom'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (6)
  • is_encode_uom_days Boolean
    compute='_compute_is_encode_uom_days' export_string_translation=False
  • module_project_timesheet_holidays Boolean
    compute='_compute_timesheet_modules' readonly=False store=True args: 'Time Off'
  • project_time_mode_id Many2one → uom.uom
    help="This will set the unit of measure used in projects and tasks.\nIf you use the timesheet linked to projects, don't forget to setup the right unit of measure in your employees." readonly=False related='company_id.project_time_mode_id' string='Project Time Unit' args: 'uom.uom'
  • reminder_allow Boolean
    string='Approver Reminder'
  • reminder_user_allow Boolean
    string='Employee Reminder'
  • timesheet_encode_method Selection
    compute='_compute_timesheet_encode_method' inverse='_inverse_timesheet_encode_method' required=True string='Encoding Method' args: [('hours', 'Hours / Minutes'), ('days', 'Days / Half-Days')]
Public methods (0)

No public methods.

New fields (15)
  • amount Monetary
    currency_field='currency_id' readonly=True args: 'Amount'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True string='Currency' args: 'res.currency'
  • date Date
    readonly=True args: 'Date'
  • department_id Many2one → hr.department
    readonly=True string='Department' args: 'hr.department'
  • manager_id Many2one → hr.employee
    readonly=True args: 'hr.employee', 'Manager'
  • message_partner_ids Many2many → res.partner
    compute='_compute_message_partner_ids' readonly=True search='_search_message_partner_ids' args: 'res.partner'
  • milestone_id Many2one → project.milestone
    related='task_id.milestone_id' args: 'project.milestone'
  • name Char
    readonly=True args: 'Description'
  • parent_task_id Many2one → project.task
    readonly=True string='Parent Task' args: 'project.task'
  • partner_id Many2one → res.partner
    readonly=True string='Partner' args: 'res.partner'
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • task_id Many2one → project.task
    readonly=True string='Task' args: 'project.task'
  • unit_amount Float
    readonly=True args: 'Time Spent'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (1)
  • timesheet_widget Char
    export_string_translation=False args: 'Widget'
Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…