Pointeuse : un suivi du temps natif et hors ligne d'abord pour Odoo

Le tableau de bord des tâches de Pointeuse : un kanban avec des colonnes groupées par étape, des cartes de tâche affichant le projet, des barres d’effort et des échéances, avec un bouton lecture sur chaque carte pour démarrer le suivi
Le tableau de bord des tâches de Pointeuse, kanban groupé par étape, avec barres d’effort, échéances et démarrage du minuteur en un clic. Les captures utilisent une démo Odoo jetable avec des projets d’exemple, il n’y a donc aucune donnée réelle ici.

Odoo est un ERP réellement puissant. Il gère les ventes, les stocks, les projets, les RH et la comptabilité au même endroit, et le temps que vous y enregistrez alimente de vraies données métier. Mais cette puissance a un coût sur les bords. Pour un utilisateur du quotidien qui veut juste noter ce sur quoi il a travaillé, l’interface web complète, c’est beaucoup : ouvrir un onglet, attendre le client, retrouver la bonne tâche, ajouter une ligne de feuille de temps, saisir les heures. Même dans une entreprise qui vit déjà dans Odoo, cette friction est réelle, et la friction est précisément ce qui pousse les gens à ne plus enregistrer leur temps honnêtement.

Je voulais donc l’inverse : la façon la plus simple et la plus agréable possible de suivre son temps sur Odoo. Quelque chose où votre seul travail est de dire sur quelle tâche vous êtes, de recevoir un petit rappel de temps en temps, et de changer de tâche en un clic. Tout le reste, les lignes de feuille de temps, les enregistrements de présence, la synchronisation, devrait se faire pour vous, en arrière-plan, et atterrir dans Odoo comme de vraies données. J’ai construit cela, et je l’ai appelé Pointeuse. C’est open source sous licence MIT.

C’est aussi une démonstration. Pointeuse montre qu’on peut s’intégrer à Odoo très facilement, en application de bureau ou sur mobile, sans rien installer côté serveur, et poser une petite surface conviviale devant toute la puissance ERP qu’Odoo possède déjà. Vous laissez Odoo faire ce qu’il fait de mieux, et vos utilisateurs ne voient jamais qu’une pointeuse.

Ce qu’elle fait

Pointeuse est une application native qui vit dans la barre des tâches et suit le temps sur vos vraies tâches Odoo. La boucle centrale est volontairement ennuyeuse, et c’est tout l’intérêt :

  • Suivre le temps sur les tâches Odoo. Démarrer ou arrêter un minuteur sur n’importe quelle project.task. La feuille de temps atterrit dans account.analytic.line, exactement là où les vues de feuilles de temps d’Odoo vont lire, donc rien d’autre dans votre configuration Odoo n’a à changer.
  • Intégration de la présence. Vous pouvez pointer l’entrée et la sortie (hr.attendance) depuis l’application ou directement depuis la barre des tâches. Et comme la présence est un état partagé, le minuteur s’arrête automatiquement quand vous sortez depuis ailleurs, que ce soit le client web Odoo ou l’application mobile. Le suivi de bureau et le reste d’Odoo restent d’accord.
  • Rappels d’inactivité. Si vous restez silencieux, une petite fenêtre demande sur quoi vous travaillez, avec des suggestions pour changer de tâche afin de corriger l’enregistrement en un clic. Sur Android, le même rappel arrive sous forme de notification avec boutons d’action.
  • Un tableau de bord des tâches. Un kanban groupé par étape et par projet, un panneau de détail de tâche, et un journal du temps avec des vues jour, semaine et mois, pour que l’application soit aussi l’endroit où vous regardez où sont passées vos heures.

L’écran de connexion, un formulaire simple pour l’URL du serveur Odoo, la base de données et l’identifiant ou la clé API
Connexion à une instance Odoo. URL, base de données, identifiant, ou une clé API pour Odoo Online. Les identifiants vont dans le trousseau du système, jamais sur le disque.

Comment elle se connecte : XML-RPC, sans module serveur

La contrainte que je me suis fixée était que Pointeuse devait fonctionner avec n’importe quel Odoo, y compris les instances hébergées Odoo Online et les instances auto-hébergées, sans installer de module côté serveur. Demander aux gens de déployer un addon Odoo personnalisé juste pour suivre leur temps irait à l’encontre du but.

Elle parle donc à Odoo via son interface XML-RPC standard (/xmlrpc/2/), que chaque Odoo 14 et suivant expose d’origine. Vous lui donnez trois choses : l’URL du serveur, le nom de la base de données, et votre identifiant avec soit un mot de passe, soit une clé API. La voie de la clé API compte pour Odoo Online, où le mot de passe du compte est bloqué pour le XML-RPC externe, donc une clé est le seul moyen d’entrer. Ce que vous lui donnez est stocké dans le trousseau du système, jamais écrit sur le disque.

La belle propriété de construire sur les mêmes modèles XML-RPC qu’Odoo utilise en interne (project.task, account.analytic.line, hr.attendance), c’est qu’il n’y a pas de source de vérité parallèle. Pointeuse n’est qu’un client de plus, plus rapide, pour des données qu’Odoo possède déjà.

Hors ligne d’abord, parce que les connexions tombent

L’autre chose sur laquelle j’ai refusé de transiger, c’était le comportement hors ligne. Un minuteur que vous ne pouvez pas démarrer parce que le WiFi a cligné est inutile, et une pointeuse qui perd un pointage est pire que pas de pointeuse du tout.

Donc tout est mis en cache dans SQLite localement. Vos projets, tâches et feuilles de temps récentes sont tous disponibles sans aller-retour réseau, ce qui explique aussi pourquoi l’application paraît instantanée. Quand vous enregistrez du temps hors ligne, la feuille de temps est mise en file localement et se synchronise au retour de la connexion. Vous n’êtes jamais bloqué par l’accessibilité du serveur à l’instant précis où vous décidez de commencer à travailler.

La fenêtre du minuteur affichant la tâche active et les totaux suivis du jour en un coup d’œil
La fenêtre du minuteur. Une tâche, un minuteur, les totaux du jour en un coup d’œil. C’est la vue que je garde réellement ouverte.

Comment elle est construite

Pointeuse est une application Tauri 2. Le backend est en Rust, et le frontend est en JavaScript pur, sans aucun framework. Ce choix sans framework était délibéré : l’interface n’est pas compliquée, et une pointeuse n’a aucune raison de tirer un mégaoctet de framework pour afficher quelques boutons et une liste. Le résultat est un binaire petit et rapide, plutôt qu’un navigateur dans une boîte.

Le côté Rust fait le vrai travail : le client XML-RPC qui parle à Odoo, le cache SQLite (via rusqlite, embarqué pour qu’il n’y ait pas de dépendance système), le moteur de minuteur, la logique de présence et de rappel, et la barre des tâches. Le HTTP passe par reqwest sur rustls, le XML par quick-xml, et les identifiants par la crate keyring. Le même cœur Rust se compile pour le bureau et pour Android, où les rappels d’inactivité deviennent de vraies notifications Android.

Une seule base de code Tauri produit des installateurs pour les quatre cibles :

  • Windows, un .exe d’installation qui se met à jour tout seul
  • Linux, un .AppImage ou un .deb
  • macOS, un .dmg universel
  • Android, un .apk à charger manuellement

Le pipeline de publication garde tout cela honnête. Les commits sur main suivent les Conventional Commits, semantic-release décide du numéro de version à partir de l’historique des commits, GitHub Actions construit chaque plateforme, et les applications de bureau se mettent à jour seules depuis les GitHub Releases. Je pousse un commit, et un peu plus tard une nouvelle version est sur chaque machine sans que je touche à un installateur.

La fenêtre de création de tâche : sélecteur de projet, nom, échéance, priorité, et une option Créer et démarrer
Créer une tâche sans quitter l’application. Vous pouvez la créer et démarrer le suivi dans la même étape.

Pourquoi les données comptent : RS&DE et subventions

Il y a une raison économique de se soucier de tout cela, au-delà de rapports bien rangés. Au Canada, le programme RS&DE (Recherche scientifique et développement expérimental) accorde aux entreprises des crédits d’impôt pour les travaux de R&D admissibles, et les projets financés par des subventions ont leurs propres obligations de reporting. Dans les deux cas, la demande repose sur des preuves : ce sur quoi on a travaillé, par qui, et pendant combien de temps. Si cet enregistrement est mince, ou reconstitué de mémoire après coup, la demande est plus faible et plus difficile à défendre.

Le hic, c’est que cette preuve ne vaut jamais plus que l’habitude quotidienne qui la produit. Vous ne pouvez pas demander aux gens de consigner méticuleusement chaque heure sur le bon projet tout en rendant la consignation pénible. La friction l’emporte, et les données se dégradent en silence. La pointeuse la plus simple possible n’est donc pas un luxe, c’est ce qui rend les données dignes de confiance dès le départ. Faites en sorte que dire sur quoi on a travaillé prenne un seul clic, et au bout d’un an vous obtenez un enregistrement assez solide pour appuyer un crédit d’impôt ou un rapport de subvention.

C’est ça, le vrai fond de l’affaire. Tout est une question de gens qui gardent un œil sur leur propre temps, et quand c’est assez facile, ça marche raisonnablement bien.

Une petite surface devant un ERP puissant

Le but n’est pas de remplacer quoi que ce soit qu’Odoo fait. Le but, c’est que l’outil que vous attrapez cent fois par jour coûte le moins d’attention possible, pour que l’ERP puissant derrière reçoive vraiment des données exactes. La feuille de temps web d’Odoo est très bien quand vous êtes déjà dans Odoo en train de faire autre chose. C’est la mauvaise surface quand tout ce qu’une personne veut, c’est démarrer le chrono sur une tâche et retourner travailler.

C’est toute l’idée derrière Pointeuse : garder le travail de l’utilisateur minuscule, dire sur quoi vous travaillez et changer en un clic, et laisser tout se déverser dans Odoo sous forme de vraies feuilles de temps et de présence en coulisses. L’entreprise garde chaque rapport, chaque analyse, chaque parcelle de puissance ERP qu’elle a déjà payée. L’utilisateur, lui, ne voit qu’une pointeuse qui s’ouvre instantanément, survit à une connexion qui tombe, et reste synchronisée, qu’il soit à son bureau ou sur son téléphone.

Et comme toute l’intégration passe par le XML-RPC standard d’Odoo sans module côté serveur, c’est aussi une petite preuve que poser une interface conviviale devant Odoo est réellement facile. C’est le suivi du temps que je voulais, et maintenant je fais tourner mes journées dessus.

Liens

  • Source et versions : Leicas/pointeuse, sous licence MIT. Les installateurs pour Windows, Linux, macOS et Android sont sur la page Releases.
  • Page projet : Pointeuse.

Elle fonctionne avec n’importe quel Odoo 14 ou suivant, sans module côté serveur à installer. Si votre équipe tourne sur Odoo mais qu’enregistrer le temps honnêtement est la partie qui coince toujours, la réponse n’est pas plus d’interface, c’est moins : une pointeuse devant, l’ERP qui fait son travail derrière.

Antoine Weill--Duflos
Antoine Weill--Duflos
Responsable Technologie et Applications

Je m’intéresse à l’haptique, la mécatronique, la micro-robotique…