Project timesheet time control

hr_timesheet_time_control
REPOSITORY
REPOSITORYOCA/timesheet
GIT
GIThttps://github.com/OCA/timesheet.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/timesheet/tree/19.0/hr_timesheet_time_control
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYProject
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Christopher Rogos
WEBSITE
WEBSITEhttps://github.com/OCA/timesheet
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr_timesheet
    - hr
    - base_setup
    - base
    - web
    - digest
    - mail
    - bus
    - web_tour
    - html_editor
    - portal
    - 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
Allow to track the exact moment when a timesheet line is started (not
only the day, but also the minute and second) and let users start and
stop timers easily.

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
account_analytic_line_tree account.analytic.line field Inherits hr_timesheet.hr_timesheet_line_tree
hr_timesheet_line_form account.analytic.line.form.inherit account.analytic.line xpath Inherits hr_timesheet.hr_timesheet_line_form
hr_timesheet_switch_form hr.timesheet.switch resume form hr.timesheet.switch form New
project_invoice_form Add timesheet time controls project.project div Inherits hr_timesheet.project_invoice_form
view_kanban_account_analytic_line account.analytic.line.kanban account.analytic.line xpath Inherits hr_timesheet.view_kanban_account_analytic_line
view_project_kanban_inherited Add timesheet time controls project.project xpath Inherits hr_timesheet.view_project_kanban_inherited
view_project_tree Add timesheet time controls project.project list Inherits project.view_project
view_task_form2_inherited Add timesheet time controls project.task div Inherits hr_timesheet.view_task_form2_inherited
view_task_kanban Add timesheet time controls project.task xpath Inherits project.view_task_kanban
view_task_tree2_inherited Add timesheet time controls project.task list Inherits hr_timesheet.view_task_tree2_inherited
Models touched (5)

New fields (3)
  • date_time Datetime
    copy=False default=<expr> string='Start Time'
  • date_time_end Datetime
    compute='_compute_date_time_end' inverse='_inverse_date_time_end' search='_search_date_time_end' string='End Time'
  • show_time_control Selection
    compute='_compute_show_time_control' help='Indicate which time control button to show, if any.' selection=[('resume', 'Resume'), ('stop', 'Stop')]
Public methods (4)
  • button_end_work(self)
  • button_resume_work(self)
    Create a new record starting now, with a running timer.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (10)
  • analytic_line_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' string='Origin line'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> readonly=True required=True string='Company'
  • date_time Datetime
    default=fields.Datetime.now required=True string='Start Time'
  • date_time_end Datetime
    string='End Time'
  • name Char
    required=True string='Description'
  • project_id Many2one → project.project
    comodel_name='project.project' compute='_compute_project_id' domain=<expr> readonly=False store=True string='Project'
  • running_timer_duration Float
    compute='_compute_running_timer_duration' help='When the previous timer is stopped, it will save this duration.' string='Previous timer duration'
  • running_timer_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' default=<expr> help='This timer is running and will be stopped' ondelete='cascade' readonly=True string='Previous timer'
  • running_timer_start Datetime
    readonly=True related='running_timer_id.date_time' string='Previous timer start'
  • task_id Many2one → project.task
    comodel_name='project.task' compute='_compute_task_id' domain="\n [\n ('company_id', '=', company_id),\n ('project_id.allow_timesheets', '=', True),\n ('project_id', '=?', project_id)\n ]\n " index=True readonly=False store=True string='Task'
Public methods (2)
  • action_switch(self)
    Stop old timer, start new one.
  • default_get(self, fields_list)
    @api.model
    Return defaults depending on the context where it is called.

New fields (1)
  • show_time_control Selection
    compute='_compute_show_time_control' help='Indicate which time control button to show, if any.' selection=[('start', 'Start'), ('stop', 'Stop')]
Public methods (2)
  • button_end_work(self)
  • button_start_work(self)
    Create a new record starting now, with a running timer.

New fields (0)

No new fields.

Public methods (1)
  • button_start_work(self)

New fields (0)

No new fields.

Public methods (1)
  • button_start_work(self)