Timesheet Approval for Odoo 19 Community documentation
A guide to the timesheet approval: the sheet, submitting and approving, the locks, the generation, the printed sheet and the access rights.
Documents version 1.0.0Updated Oct 23, 2026
Start here
In plain words: Hours are logged all week, and on Friday evening nobody knows who has finished. Timesheet Approval adds the missing step to Odoo Community timesheets: the employee submits the hours of a week, the manager approves them or refuses them with a reason, and from then on the submitted and approved hours are locked: nobody edits, adds or deletes hours behind the manager's back. The hours are compared with the expected hours of the employee's working schedule, time off excluded.
Tip: It works on the timesheets you already have: the Timesheets app, the projects and the tasks are unchanged.
What you get
| Feature | What it does |
|---|---|
| Timesheet sheet | The hours of one employee for a week (or any period up to two months), gathered from their timesheets. |
| Submit and approve | The employee submits, the manager approves, or refuses with a reason and the employee corrects and submits again. |
| Locked hours | Submitted and approved hours cannot be edited, moved or deleted, and no hours can be added to a submitted period. |
| Expected hours | The hours of the working schedule of the period, minus time off, and the missing hours. |
| Approver | The employee's manager, or the manager of the department; you can change it on the sheet. |
| Generate sheets | Draft sheets for everybody who has hours in a period, in one click, or every week automatically with a reminder to each employee. |
| On the timesheets | An Approval column and the filters Not submitted, Submitted and Approved. |
| Overview | The hours by employee and by status. |
| The sheet as a PDF with the signatures. | |
| Arabic | Everything is translated and works right to left. |
Requirements
| Item | Details |
|---|---|
| Odoo | 19.0 (Community or Enterprise) |
| Apps needed | Timesheets (hr_timesheet) |
| License | OPL-1 (Odoo Proprietary License v1.0) |
Install
- Unzip the package. Inside is
taqnix_timesheet_approval.zip; unzip it to get the foldertaqnix_timesheet_approval. - Copy the folder into one of the
addons_pathfolders of your Odoo server and restart Odoo. - Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
- Remove the “Apps” filter, search Timesheet Approval and press Install.
# or from the command line ./odoo-bin -c odoo.conf -d YOUR_DATABASE -i taqnix_timesheet_approval --stop-after-init
The sheet of a week
In plain words: Timesheets → Timesheet sheets → New. The employee is you by default and the period is the current week: change them if you need to. The sheet gathers your timesheets of the period (the ones with a project). Click Refresh the hours to gather the ones you logged since. The warning shows when the hours are lower than the expected hours.
| Status | Meaning |
|---|---|
| Draft | Being prepared: the hours are still free. |
| Submitted | Waiting for the manager: the hours are locked. |
| Approved | Approved: the hours are locked. |
| Refused | Sent back with a reason: the hours are free again. |
Submit and approve
In plain words: The employee clicks Submit: the approver gets an activity. The manager opens the sheet, checks the hours and the expected hours, and clicks Approve.
In plain words: To refuse, write the reason in the field and click Refuse: the employee gets an activity with the reason, corrects the hours and submits the sheet again.
Tip: Nobody approves their own sheet, except a timesheet administrator.
Locked hours
In plain words: Once a sheet is submitted or approved, its hours are locked for everybody but the timesheet administrators: the hours, the date, the project and the task cannot be changed, the entries cannot be deleted, and no hours can be added to the period. The employee sees a clear message. To change something, the manager refuses the sheet or sets it back to draft.
In plain words: In the timesheets list, the Approval column shows the status of each entry, and the filters Not submitted, Submitted and Approved find them.
Sheets for everybody
In plain words: Timesheets → Timesheets → Generate sheets: choose the period (last week by default), and the employees if you want only some. A draft sheet is created for each employee who has hours in the period that are on no sheet yet; the ones who already have a sheet are skipped.
In plain words: To do it every week, enable the scheduled action Timesheet approval: draft sheets for last week (Settings → Technical → Scheduled actions): it creates the sheets of the last week and gives each employee an activity to submit theirs. It is off by default.
The overview
In plain words: Timesheet sheets → pivot view shows the hours by employee and by status.
The printed sheet
In plain words: Print gives the sheet: the period, the status, the approver, every entry with its date, project, task and description, the total and the expected hours, and lines for the signatures.
Who can do what
| Who | Can |
|---|---|
| Employees (Timesheets: own timesheets) | Make, submit and set back to draft their own sheets, and see them. |
| Managers | See the sheets they approve and their hours, and approve or refuse them. |
| Timesheet approvers (all timesheets) | See, approve and refuse all the sheets, and generate sheets. |
| Timesheet administrators | Also approve their own sheet, reopen an approved one and edit locked hours. |
| Other users | No access. |
Arabic and right to left
Limits
| Limit | Detail |
|---|---|
| Project timesheets | Only the timesheets that have a project are on a sheet. |
| One sheet per period | Two sheets of the same employee cannot overlap, except a refused one. |
| Expected hours | They come from the employee's working schedule and the time off recorded as leaves of the schedule. |
For developers
In plain words: Skip this chapter if you only use the module.
sheet = env['taqnix.timesheet.sheet'].create({'employee_id': employee.id, 'date_from': '2026-10-12', 'date_to': '2026-10-18'})
sheet.action_submit()
sheet.action_approve() # or: sheet.refuse_reason = 'Friday is missing'; sheet.action_refuse()
sheet.total_hours, sheet.expected_hours, sheet.missing_hours
env['taqnix.timesheet.sheet']._generate_sheets(date(2026, 10, 12), date(2026, 10, 18)) # draft sheets for everybodyTroubleshooting
| Problem | What to do |
|---|---|
| I cannot change my hours | They are on a submitted or approved sheet: ask your manager to refuse the sheet or set it back to draft. |
| Nothing to submit | There are no timesheets with a project in the period: check the dates, then Refresh the hours. |
| I cannot approve my own sheet | Your manager has to; only a timesheet administrator can approve their own. |
| The sheet has no approver | The employee has no manager and no department manager: choose the approver on the draft sheet. |
| An employee is missing in Generate sheets | They have no timesheet in the period, or already have a sheet. |
Updating and removing
Replace the folder with the new version, restart Odoo and run -u taqnix_timesheet_approval. Your sheets are kept.
Support
Installation help and bug fixes are included for 6 months, with lifetime updates. Contact us through the marketplace page where you bought the module or write to support@taqnix.com with your Odoo version and a screenshot.