Dans une entreprise de services, tout se joue sur l'écart entre les heures vendues et les heures passées. Odoo sait enregistrer des heures ; il ne sait pas, nativement, les faire valider, les chronométrer, ni dire qui tient quel rôle sur un projet.
Neuf modules comblent ces manques. Deux d'entre eux méritent une mention particulière : ils restaurent des fonctions présentes dans Odoo 8 et retirées depuis.
Résumé
Neuf modules pour que le temps passé devienne une donnée fiable : une feuille périodique en grille croisée soumise à validation, un chronomètre, la détection des chevauchements, des rôles de projet et un statut d'avancement.
Deux d'entre eux restaurent des fonctions retirées d'Odoo depuis la version 8. Et le module le plus petit est le plus décisif : sale_timesheet_line_exclude ajoute une case « non facturable » qui n'existe pas nativement — sans elle, les heures offertes ne sont pas saisies du tout, et la marge devient immesurable.
L'essentiel
hr_timesheet_sheet: une feuille de temps périodique en grille croisée (date × projet/tâche), soumise à validation — 126 champs, 7 menus.project_timesheet_time_control: un chronomètre Démarrer / Reprendre / Arrêter, qui enregistre l'heure exacte et non seulement le jour.hr_timesheet_begin_end: heures de début et de fin par ligne, avec détection des chevauchements pour un même employé.project_role: un catalogue de rôles métier et des affectations, au niveau du projet ou de la société.sale_timesheet_line_exclude: une case « non facturable » par ligne — une fonction qui n'existe pas nativement.project_task_default_stageetproject_task_stage_staterestaurent des fonctions retirées d'Odoo depuis la version 8.
Ce que ces modules ajoutent à l'instance
| Module | Modèles créés | Champs | Menus | Version |
|---|---|---|---|---|
hr_timesheet_sheet | 3 | 126 | 7 | 18.0.1.3.2 |
project_role | 2 | 49 | 2 | 18.0.1.0.1 |
project_timesheet_time_control | 1 | 22 | 1 | 18.0.1.0.7 |
project_status | 1 | 13 | 1 | 18.0.1.0.0 |
project_timeline | 0 | 4 | 0 | 18.0.1.0.1 |
hr_timesheet_begin_end | 0 | 4 | 0 | 18.0.1.0.2 |
sale_timesheet_line_exclude | 0 | 3 | 0 | 18.0.1.0.0 |
project_task_default_stage | 0 | 2 | 0 | 18.0.1.0.1 |
project_task_stage_state | 0 | 2 | 0 | 18.0.1.0.0 |
Les quatre derniers tiennent en deux à quatre champs : ce sont des corrections de détail, et ce sont souvent elles qui débloquent un usage. Le premier, à l'inverse, est un domaine entier — un cycle de soumission et de validation périodique.
hr_timesheet_sheet : la feuille de temps avec validation
C'est le module le plus structurant de cette fiche, et il répond à un besoin précis : un cycle formel de soumission et de validation, plutôt que des lignes de temps libres.
- Chaque employé saisit ses heures par période — jour, semaine ou mois, configurable — dans une grille croisée date × projet/tâche.
- Il soumet sa feuille à validation.
- Un réviseur l'approuve ou la refuse. Selon la politique configurée, ce réviseur est un officier RH, un manager RH ou un manager des feuilles de temps.

La grille croisée est ce qui change l'expérience de saisie. Saisir vingt lignes de temps une par une décourage ; remplir une matrice de la semaine se fait en deux minutes. Elle s'appuie sur le module technique web_widget_x2many_2d_matrix.
Limite répertoriée, et elle est documentée avec honnêteté par le dépôt : la grille est limitée à 1 million de cellules, à cause d'une limitation du paramètre de limite des vues liste, qui ne peut pas être défini dynamiquement. La valeur par défaut d'Odoo — 40 enregistrements — était trop petite, et la communauté a retenu 1 million, « qui devrait suffire dans la majorité des scénarios ».
Autrement dit : ce n'est pas une limite que vous rencontrerez, mais c'est le genre de précision qui distingue une documentation d'une plaquette.
Les menus se trouvent sous Feuilles de temps : « À approuver », « Feuille de présence », « Lignes des feuilles de temps », « My Timesheets ». Voir la marge par mission en société de services.
Le chronomètre, et la précision des heures
Deux modules travaillent la même matière par deux angles différents, et le choix entre eux n'est pas indifférent.
project_timesheet_time_control | hr_timesheet_begin_end | |
|---|---|---|
| Principe | Un chronomètre : Démarrer / Reprendre / Arrêter | Deux champs heure de début et heure de fin |
| Ce qu'il enregistre | L'instant précis du démarrage (heure et minute) | La plage horaire complète |
| Où sont les boutons | Feuilles de temps, fiches Projet et fiches Tâche | — |
| Contrôle | — | Cohérence début / fin / durée, détection des chevauchements |
| Usage | Chronométrer en temps réel | Tracer des plages horaires précises |
Le chronomètre sert la qualité de la mesure : un temps saisi le vendredi soir est une estimation, un temps chronométré est une mesure. Sur une activité facturée au temps, l'écart entre les deux est l'essentiel de la marge.
La détection des chevauchements de hr_timesheet_begin_end sert autre chose : la vraisemblance. Elle attrape l'employé qui a déclaré deux activités sur la même heure — par erreur le plus souvent, et c'est une erreur qu'on ne voit pas autrement.
Limite répertoriée sur le module de chronomètre : le dépôt souhaite le renommer hr_timesheet_time_control et le déplacer vers le dépôt timesheet. C'est une réorganisation à venir, à connaître parce qu'elle changera le nom du module à une version ultérieure.
sale_timesheet_line_exclude : une case qui manque à Odoo
Celui-ci tient en trois champs et comble un manque que le dépôt documente précisément.
Le cas : une facturation « à la tâche ». La tâche est facturable, donc toutes les heures saisies dessus partent en facturation. Sauf qu'une entrée de temps précise ne doit parfois pas être refacturée — un geste commercial, une reprise, du temps interne.
Cette fonctionnalité n'existe pas nativement dans Odoo — le module cite le ticket
odoo/odoo#31043à l'appui.
Le module ajoute donc une case « Non-billable » sur la ligne de feuille de temps, qui l'exclut manuellement de la facturation liée au bon de commande, même si la tâche ou le contrat est normalement facturable. Il crée aussi un groupe de droits, ce qui permet de restreindre qui peut cocher cette case.
C'est le genre de module de trois champs qui décide de l'adoption d'un dispositif entier : sans lui, un chef de projet qui veut offrir deux heures doit modifier la tâche, ou renoncer à les saisir — et des heures non saisies, c'est une marge qu'on ne mesure plus.
Les rôles de projet, et le statut
project_role : qui fait quoi, au-delà du responsable
Odoo donne un champ « Responsable » à un projet. Dans une équipe de cinq personnes avec des rôles distincts — chef de projet, référent technique, interlocuteur client — c'est insuffisant.
project_role introduit un catalogue de rôles métier et un système d'affectations :
- Les rôles se définissent au niveau de la société ou en partagé global.
- Les affectations se font par projet, ou au niveau de la société — une affectation par défaut potentiellement héritée par tous les projets.


L'héritage depuis la société est le détail qui rend le module utilisable : on déclare une fois que telle personne est référente technique par défaut, et chaque nouveau projet en hérite.
project_status : l'avancement, distinct de l'étape
Odoo a des étapes (stages) pour les tâches. project_status ajoute un statut de projet — distinct — pour suivre l'avancement global : Pending, In Progress, Complete.
Il se présente sous forme de barre de statut cliquable sur la fiche projet, avec regroupement Kanban par statut et filtres de recherche dédiés. C'est la vue dont a besoin une direction : non pas où en sont les tâches, mais où en sont les projets.
Deux fonctions restaurées depuis Odoo 8
Ces deux modules sont instructifs au-delà de leur taille : ils documentent ce que l'éditeur a retiré.
| Module | Ce qu'il restaure | Retiré depuis |
|---|---|---|
project_task_default_stage | La possibilité de marquer des étapes de tâche comme « par défaut », automatiquement proposées à chaque nouveau projet | Odoo 8.0 |
project_task_stage_state | Un champ « State » sur les étapes, qui applique automatiquement un état de tâche quand elle entre dans l'étape | Odoo 8.0 |
Le premier répond à un besoin de standardisation : sans lui, chaque nouveau projet démarre avec les étapes par défaut d'Odoo, et il faut les refaire à la main pour imposer un cycle de vie commun — analyse, spécification, développement, recette.
Le second synchronise l'état Kanban d'une tâche avec son étape, sans intervention de l'utilisateur. Sans lui, une tâche déplacée dans « Terminé » garde l'état qu'elle avait, et les deux informations divergent.
C'est le même motif que account_fiscal_year, qui restaure un modèle déplacé vers l'Enterprise en version 14 : la communauté reprend ce qui disparaît. Voir les sept conforts de facturation et Odoo Community ou Enterprise.
project_timeline : la vue chronologique
Un module de quatre champs qui ajoute une vue Chronologie aux écrans Projets et Tâches, fournie par le module technique web_timeline.
Ce qu'elle montre : les projets et les tâches d'une équipe sur un axe temporel, avec leurs dates planifiées et leurs dépendances. C'est la vue de planification de charge qui manque à Odoo Community.
Son prérequis est sa principale contrainte : elle n'a de sens que si les tâches portent des dates planifiées. Sur un backlog sans dates, la chronologie est vide — et c'est le cas le plus fréquent avant un travail de cadrage.
Dans quel ordre les déployer
| Ordre | Module | Pourquoi |
|---|---|---|
| 1 | project_task_default_stage | Standardiser le cycle de vie avant de créer les projets |
| 2 | project_timesheet_time_control | La qualité de la mesure du temps, dès le premier jour |
| 3 | sale_timesheet_line_exclude | Sans elle, les heures non facturables ne sont pas saisies |
| 4 | project_role + project_status | Quand l'équipe dépasse quelques personnes |
| 5 | hr_timesheet_sheet | Quand un cycle de validation formel devient nécessaire |
| 6 | project_timeline | Quand les tâches portent des dates |
| 7 | hr_timesheet_begin_end | Si les plages horaires précises comptent |
L'ordre 3 est celui qu'on sous-estime : sans la case « non facturable », un chef de projet qui veut offrir des heures ne les saisit pas. Et des heures non saisies font disparaître l'information la plus utile de toute cette fiche — l'écart entre heures vendues et heures passées.
Identité technique
| Module | Dépôt OCA | Dépend de |
|---|---|---|
project_role | project | mail, project |
project_status | project | project |
project_task_default_stage | project | project |
project_task_stage_state | project | project |
project_timeline | project | project, web_timeline |
project_timesheet_time_control | project | hr_timesheet |
hr_timesheet_begin_end | timesheet | hr_timesheet |
hr_timesheet_sheet | timesheet | hr_timesheet, sale_timesheet, web_widget_x2many_2d_matrix |
sale_timesheet_line_exclude | timesheet | sale_timesheet |
Tous sous licence AGPL-3, branche 18.0. Le dépôt project compte 66 modules documentés, timesheet 33. Ils font partie de notre pack services (81 modules), au-delà du socle commun.
Questions fréquentes
Odoo Community permet-il de faire valider les feuilles de temps ?
Pas nativement : les lignes de temps sont libres. hr_timesheet_sheet ajoute un cycle formel — saisie par période dans une grille croisée, soumission, puis approbation ou refus par un réviseur (officier RH, manager RH ou manager des feuilles de temps, selon la politique configurée).
Chronomètre ou heures de début et de fin : lequel choisir ?
Le chronomètre (project_timesheet_time_control) sert la qualité de la mesure : un temps chronométré est une mesure, un temps saisi le vendredi est une estimation. Les heures de début et de fin (hr_timesheet_begin_end) servent la vraisemblance, grâce à la détection des chevauchements. Les deux peuvent cohabiter.
Comment ne pas facturer certaines heures d'une tâche facturable ?
Avec sale_timesheet_line_exclude, qui ajoute une case « Non-billable » par ligne de feuille de temps. Cette fonction n'existe pas nativement dans Odoo — le module cite le ticket odoo/odoo#31043. Sans elle, les heures offertes ne sont souvent pas saisies du tout, ce qui fausse la marge.
Pourquoi deux modules restaurent-ils des fonctions d'Odoo 8 ?
Parce que l'éditeur les a retirées. project_task_default_stage rétablit les étapes marquées « par défaut » proposées à chaque nouveau projet, et project_task_stage_state le champ « State » sur les étapes, qui synchronise l'état d'une tâche avec son étape. C'est le même motif que account_fiscal_year, déplacé vers l'Enterprise en version 14.
La vue chronologie est vide, pourquoi ?
Parce que les tâches ne portent pas de dates planifiées : project_timeline affiche les projets et tâches sur un axe temporel à partir de ces dates. Sur un backlog non cadré, la vue est vide — ce n'est pas un défaut du module mais l'absence de la donnée qu'il représente.
Se faire accompagner
Un seul réglage décide de la fiabilité de tout ce dispositif : la maille de saisie du temps. Une saisie hebdomadaire à la demi-journée est tenue ; une saisie quotidienne au quart d'heure produit des données inventées le vendredi soir. Et la case « non facturable » conditionne que les heures offertes soient saisies du tout.
Nous posons la maille avec les équipes, installons le chronomètre là où la mesure compte, et construisons l'indicateur qui résume tout : la part des heures saisies qui finissent sur une facture. Voir les prestations d'Atalios Consulting ou demander un rappel.
Pour aller plus loin
- Projets, temps et facturation récurrente en société de services
- helpdesk_mgmt : tickets, portail client et temps passé
- Les trois indicateurs qui comptent, par métier
En résumé
Neuf modules pour que le temps passé devienne une donnée fiable : une feuille périodique validée, un chronomètre, la détection des chevauchements, et une case « non facturable » qui n'existe pas dans Odoo. Deux d'entre eux restaurent des fonctions retirées depuis la version 8. Parlons de vos feuilles de temps.