Deux façons d'arrêter de saisir les heures à la main
Odoo 20 comble deux vieux manques du suivi du temps. Présences peut désormais recevoir les pointages de terminaux biométriques physiques : chaque pointage devient un événement de présence biométrique, est rattaché à un employé par son numéro de badge, et crée une présence normale marquée d'un nouveau mode Biométrique. Des connecteurs sont livrés pour les serveurs ZKTeco BioTime et les appareils eSSL et Mantra. De l'autre côté du bâtiment, l'assistant Feuilles de temps devient une fonction complète avec son propre menu, un moteur de règles et des suggestions bâties sur votre agenda, votre activité dans Odoo et l'activité du navigateur collectée localement par ActivityWatch. Cela concerne les responsables RH et opérations qui ont du personnel horaire et refusent une tablette de pointage, et les cabinets de services qui facturent le temps et perdent des heures en feuilles de temps oubliées.
Cet article couvre la boîte de réception biométrique et les paramètres des connecteurs, puis les paramètres, les règles et le panneau de suggestions de l'assistant, puis la barre d'état où vit maintenant le chronomètre. Deux choses que nous n'avons pas pu exercer sur la version préliminaire, un vrai serveur BioTime et de vraies données ActivityWatch, sont signalées là où elles s'appliquent.
Observé sur la version préliminaire d'Odoo 20.0 Enterprise du 23 septembre 2026. Les noms, menus et disponibilités peuvent changer avant la version finale ; nous mettrons cette page à jour le cas échéant.
Une boîte de réception pour chaque pointage envoyé par un terminal
Chaque pointage reçu d'un appareil devient un événement de présence biométrique avec le fournisseur, le code employé envoyé par le terminal, l'identifiant de l'appareil, l'heure du pointage et un état, Traité ou Erreur. Odoo rattache le code à l'employé par le numéro de badge de sa fiche, si bien que la seule configuration par personne consiste à copier le code utilisateur du terminal dans ce champ. La liste se trouve sous Présences > Gestion > Événements biométriques et affiche la date et l'heure du pointage, l'employé, le code employé, le fournisseur, l'état et la présence résultante. Les événements traités ne peuvent pas être supprimés, et un pointage reçu deux fois est rejeté par une contrainte d'unicité par société, fournisseur et référence de pointage.

Le responsable des présences ne regarde que les lignes en Erreur. Sur la démo, nous avons envoyé un pointage avec le badge 9999, qu'aucun employé ne porte : l'événement passe en Erreur et sa fiche affiche une bannière rouge « Employee not found », avec le code, l'heure du pointage et l'appareil. Le guide décrit une colonne de note d'avertissement ; sur cette version, la note n'apparaît que sous forme de bannière. Une deuxième cause de rejet n'est pas dans le guide : un événement dont l'heure de pointage est antérieure au dernier pointage traité est refusé, ce qui protège l'appariement entrée-sortie contre les appareils qui rejouent d'anciennes données. Dans les deux cas, la correction se fait à la source.

ZKTeco tire, eSSL et Mantra poussent
Les trois connecteurs alimentent la même boîte de réception mais fonctionnent en sens inverse. ZKTeco s'intègre aux serveurs BioTime 8.5 et 9.0. Dans Présences > Configuration > Paramètres, un bloc ZKTeco BioTime contient l'URL du serveur, le courriel et le mot de passe du compte BioTime, une fenêtre de récupération des transactions en jours, une période de rétrospection des sorties en jours servant à apparier une sortie avec une présence ouverte, et un lien Connexion pour tester les identifiants. Une tâche planifiée tire ensuite les transactions. Les terminaux sont listés sous Configuration > Terminaux Zkteco, où un bouton Récupérer les terminaux les importe du serveur ; chaque fiche porte un nom, un identifiant de terminal, un lieu de travail et une société. Sur cette version, les vues de terminaux refusent de s'ouvrir avant la première synchronisation réussie, donc les identifiants viennent en premier.

eSSL et Mantra fonctionnent dans l'autre sens. Chacun expose une URL de webhook dans la même page de paramètres, avec un lien Générer un nouveau jeton qui renouvelle le secret contenu dans l'URL, et l'appareil ou son intergiciel pousse les pointages vers Odoo au fil de l'eau. Il n'y a ni tâche d'interrogation ni fiche de terminal à maintenir. Sur la démo, les pointages ont été envoyés au vrai webhook eSSL, et c'est ainsi que les lignes ci-dessus ont été produites.

Avant la mise en service du premier appareil
Traitez l'URL de webhook comme un identifiant. Quiconque la détient peut injecter des pointages dans vos présences : régénérez le jeton une fois la configuration terminée, ne le partagez qu'avec l'intergiciel de l'appareil, et revoyez avec votre intégrateur la façon dont l'URL est exposée. Envoyez ensuite un pointage de test avec un badge inconnu et confirmez qu'il finit en Erreur.
Les pointages de terminal sont séparés des saisies kiosque et manuelles
Les présences créées depuis un terminal portent un nouveau mode d'entrée et de sortie Biométrique. Dans Présences > Gestion, grouper la liste par Mode sépare Manuel et Biométrique, chacun avec son total d'heures travaillées, de sorte qu'une personne de la paie ou des RH voit d'un coup d'œil quelles heures viennent d'un appareil et lesquelles ont été saisies ou pointées sur un kiosque. En aval, rien ne change : ces enregistrements alimentent les heures supplémentaires, les entrées de travail et la paie comme toute autre présence. Pour une usine déjà équipée, cela supprime le tableur entre l'export du terminal et le cycle de paie.




L'assistant Feuilles de temps : un paramètre à activer et un moteur de règles
Toute la fonction se trouve derrière une seule case dans Feuilles de temps > Configuration > Paramètres, Timesheets Assistant, décrite à l'écran par « Automatically track your device activity and turn it into timesheets. Your data remains private. » Rien n'est collecté tant qu'une société ne la coche pas. Une fois activée, un menu Assistant apparaît dans l'application, et Configuration > Timesheets Assistant > Assistant Rules contient les règles qui décident ce que signifie un titre de fenêtre ou une URL.

La version préliminaire livre 19 règles pour les outils courants : Gmail, Google Docs, Sheets, Slides, Meet et Chat, GitHub, Discord, Zoom, Excalidraw, YouTube, la documentation Odoo et l'eLearning, et la base Odoo elle-même, pour que le temps passé dans une tâche, un ticket ou une piste soit attribué à cet enregistrement. La liste affiche Name, Type, Regex et Template ; le guide mentionne une colonne Threshold, mais sur cette version le seuil n'est que sur la fiche. La règle Gmail se lit comme une phrase : Type Email, une expression régulière sur l'URL de la boîte de réception, le modèle « Reading Emails », un seuil d'une minute sous lequel l'activité est ignorée, et deux options, Always Active et Side Activity, la seconde marquant un travail qui ne doit pas compter comme tâche principale. Une règle peut fixer un projet et une tâche, et s'applique à tout le monde, à des départements ou reste privée à un utilisateur.


Ce que l'assistant propose, et ce que fait l'acceptation
Feuilles de temps > Assistant ouvre un écran à deux volets pour une journée. Le volet gauche, My Timesheets, sépare Billable et Non-Billable avec des totaux face aux heures attendues de la journée. Le volet droit, Suggestions, offre une bascule Chronological et By Project. Chaque suggestion porte une icône pour sa source, une durée, une description, et le projet et la tâche auxquels elle a été rattachée. Sur notre journée de démo, les sources étaient un bloc de courriels, des tâches Odoo ouvertes dans la journée, deux réunions d'agenda liées à des tâches, un Google Doc, une demande de tirage GitHub et une feuille Google Sheets, plus un bloc Away sur l'heure du midi. Les suggestions utilisent le vrai nom de l'enregistrement plutôt que le titre brut de la fenêtre : une tâche ouverte dans Odoo apparaît comme « Energy Certificate » sous Office Design, pas comme une URL. Les quarts de Planification sont aussi une source sur cette version, bien que le guide ne les liste pas.

By Project regroupe la journée sous des en-têtes de projet et de tâche avec un sous-total par groupe, et place ce que les règles n'ont pas su classer sous Unmatched ; sur la démo, quarante minutes de Reading Emails. Accepter une suggestion crée une ligne de feuille de temps à gauche et la retire à droite. La durée enregistrée suit le paramètre d'arrondi des feuilles de temps : notre suggestion de 1 h 40 a été enregistrée à 1 h 45 parce que la société arrondit à 15 minutes. Quand deux sources se chevauchent, l'événement d'agenda l'emporte. La couche IA, ai_timesheet_grid, se pose par-dessus ; selon le guide, elle propose des descriptions et des regroupements et répond aux questions sur votre semaine par un agent IA. Aucune invite IA n'est apparue dans le panneau pendant notre capture, donc tout ce qui est montré ici relève du moteur de règles et des modules de liaison, sans texte généré.




Le chronomètre déménage dans la barre d'état des présences
Le guide décrit une horloge de feuilles de temps distincte dans la barre d'état. Avec Présences installé, ce n'est pas ce que vous obtenez sur cette version : le chronomètre vit dans la fenêtre contextuelle de présence, sur un onglet Timesheets à côté de l'onglet Attendance, et cet onglet n'apparaît qu'après avoir cliqué Check in. Il contient un champ « What did you work on? », un projet et une tâche, le chronomètre en cours, les boutons Create et Reset, un raccourci Assistant et le bouton Check out avec le total de la journée. Pointer et lancer un chronomètre deviennent un seul geste. Un jour sans données capturées, l'assistant recommande une extension de navigateur depuis le Chrome Web Store ou un module Firefox ; le guide ne mentionne qu'ActivityWatch, attendez-vous donc aux deux chemins au déploiement.

Sur la confidentialité, nous ne répétons que ce que disent l'écran de paramètres et le guide : ActivityWatch conserve ses données sur la machine de l'employé, le texte du paramètre affirme que vos données restent privées, et Odoo ne reçoit que ce que les règles reconnaissent. Expliquez-le au personnel avant de cocher la case.
Comment l'essayer sur une base de démonstration
- Installez Présences et le connecteur eSSL, ouvrez
Présences > Configuration > Paramètreset copiez l'URL de webhook. - Donnez à deux employés de démo le numéro de badge qu'un terminal enverrait.
- Envoyez quelques pointages au webhook, dont un avec un badge que personne ne porte.
- Ouvrez
Présences > Gestion > Événements biométriques, puis ouvrez la ligne en Erreur pour lire la bannière. - Ouvrez
Présences > Gestion, groupez par Mode et déployez le groupe Biométrique. - Cochez Timesheets Assistant dans
Feuilles de temps > Configuration > Paramètres, puis ouvrezFeuilles de temps > Configuration > Timesheets Assistant > Assistant Ruleset la règle Gmail. - Installez ActivityWatch avec son observateur de navigateur, créez une réunion liée à une tâche, ouvrez quelques tâches, puis ouvrez
Feuilles de temps > Assistant, basculez sur By Project et acceptez une suggestion. - Pointez depuis la barre d'état et ouvrez l'onglet Timesheets pour lancer un chronomètre.
Ce que nous n'avons pas pu vérifier sur la version préliminaire
Nous n'avions pas de serveur BioTime 8.5 ou 9.0 : les paramètres ZKTeco et les écrans de terminaux sont montrés avec des identifiants fictifs et la récupération planifiée n'a pas été observée. Le connecteur Mantra est dans l'arborescence source mais n'était pas installé. L'assistant Feuilles de temps a tourné sur des données ActivityWatch simulées, pas sur une vraie journée de navigation, et la couche IA n'a jamais affiché d'invite ni de question dans le panneau, donc nous ne pouvons pas décrire sa sortie. La suggestion Meet était masquée par une réunion d'agenda qui la chevauchait. Tout le reste de cette page a été parcouru sur la version 20.0 Enterprise du 23 septembre 2026.
Ce que cela change pour une mise à niveau
Si vous tournez sur Odoo 17, 18 ou 19 avec un export de terminal, un import de présences sur mesure ou un connecteur tiers, la mise à niveau est le moment de le retirer : mettez les codes du terminal dans le champ Numéro de badge, choisissez le mode tiré ou poussé selon le matériel, et décidez qui revoit les événements en Erreur chaque matin. Tout connecteur maison qui envoie des présences par XML-RPC ou JSON-RPC demande une attention préalable, car Odoo a programmé pour Odoo 20 la suppression de ces points de terminaison ; notre audit de migration RPC trouve ces appels avant qu'ils ne cassent. Pour les feuilles de temps, convenez du texte sur la confidentialité et du paramètre d'arrondi avant d'activer l'assistant, puis commencez par une équipe qui facture. Les deux entrent dans notre service de migration, et l'article central de la série liste les changements de paie et de planification qui arrivent dans la même mise à niveau.
Questions fréquentes
Quels terminaux biométriques Odoo 20 prend-il en charge ?
Trois connecteurs sont livrés dans la source 20.0 : ZKTeco, qui tire les transactions d'un serveur BioTime 8.5 ou 9.0, et eSSL et Mantra, qui poussent les pointages vers une URL de webhook exposée dans les paramètres de Présences. D'autres marques peuvent atteindre la même boîte de réception par un intergiciel qui envoie vers un webhook, ce qui relève de votre intégrateur.
Comment Odoo rattache-t-il un pointage de terminal à un employé ?
Par le champ Numéro de badge de la fiche employé. Le terminal envoie son code utilisateur avec chaque pointage ; si un employé porte ce code comme numéro de badge, l'événement est Traité et une présence est créée. Si personne ne le porte, l'événement passe en Erreur avec une bannière « Employee not found ».
L'assistant Feuilles de temps envoie-t-il mon historique de navigation à Odoo ?
Selon le guide et l'écran de paramètres, ActivityWatch conserve l'activité sur la machine de l'employé et Odoo ne reçoit que ce que les règles de l'assistant reconnaissent, comme l'URL d'une tâche ou une boîte Gmail. La fonction reste désactivée tant qu'une société ne coche pas le paramètre, et les règles peuvent être limitées à des départements ou rester privées.
Faut-il ActivityWatch pour utiliser l'assistant Feuilles de temps ?
Pas pour toutes les sources. Les réunions d'agenda, les tâches Odoo et les quarts de Planification sont proposés par des modules de liaison sans aucun traqueur local. L'activité du navigateur et du poste exige ActivityWatch avec son observateur de navigateur, ou l'extension de navigateur que l'assistant recommande un jour sans données.
Pourquoi une suggestion acceptée a-t-elle enregistré une durée différente ?
Parce qu'accepter une suggestion applique l'arrondi des feuilles de temps de la société. Sur la démo, une suggestion de 1 h 40 a été enregistrée à 1 h 45 avec l'arrondi à 15 minutes réglé dans Feuilles de temps > Configuration > Paramètres. Ajustez la durée minimale et l'arrondi si ce n'est pas ce que vous facturez.
