Carte du projet

Outillage Planning du cabinet

Une machine, quatre couches : les services qui tournent, le dépôt qui les contient, la forme des données dans OpenProject, et ce que chaque personne voit selon son rôle.

état relevé le 31 juillet 2026 · aucune donnée réelle sur cette page
Serveur
1VM Debian, 192.168.10.70
Services
4nginx, auth, OpenProject, n8n
Pages servies
16dont 7 en production
Scripts outils
57+ 26 scénarios de test navigateur
Rôles
5× 11 capacités, matrice éditable
Postes
73 comptables, 4 de service
Couche 01

La machine et les services

Tout tient sur un seul serveur. Le navigateur d'un collaborateur ne parle jamais directement à OpenProject : il passe par nginx, puis par le service d'authentification, qui ajoute le jeton d'accès côté serveur. Aucun mot de passe ni jeton ne circule dans le navigateur.

Navigateur collaborateur Une page HTML par écran. Session portée par un cookie non lisible par le code de la page.
HTTP :80
nginx :80 Sert les pages depuis /var/www/planning. Redirige /auth/, /api/ et /ops/ vers le service d'auth.
127.0.0.1
:3001
Service d'auth planning-auth Vérifie la session, ajoute le jeton OpenProject, applique la matrice des droits, pilote la console.
API v3
OpenProject :8080 La base de référence : clients, tâches, temps, comptes, groupes. Conteneur Docker.

Ce qui tourne, et ce qui ne tourne pas

ServiceRôleÉtat
nginx :80 — hôte Sert les pages, relaie l'API. Racine /var/www/planning, faite de liens vers le dépôt. en production
planning-auth :3001 — systemd Connexion, sessions, droits, relais vers OpenProject, moteur de la console de bascule. en production
OpenProject 16 :8080 — Docker La source unique des données. Y compris le rôle, le poste et l'équipe de chacun, stockés en groupes. en production
n8n :5678 — Docker Prévu pour les notifications automatiques. Contient zéro scénario : le conteneur tourne, il ne fait rien. pas déployé

À ne pas confondre. La documentation décrit une automatisation « prévenir le suivant quand une tâche est clôturée ». Elle est conçue mais jamais installée : aucun scénario n'existe dans n8n, aucun webhook n'est configuré. À construire seulement si l'usage le justifie.

Les deux sorties vers l'extérieur

CheminDestinationÀ quoi ça sert
/insee/api.insee.frRetrouver le nom d'une société depuis son SIREN, à la création d'un client.
git pushGitHub (dépôt privé)Sauvegarde du code et de la documentation, à chaque fin de tour de travail.

Où sont les clés

Hors du dépôt, jamais versionnées, et c'est ce qui rend une reconstruction impossible sans elles.

FichierContient
/etc/planning-auth.envLe jeton de service utilisé par le service d'auth pour lire OpenProject.
poc-setup/.secretsLe jeton administrateur OpenProject utilisé par les scripts.
poc-setup/.auth-store.jsonLes comptes applicatifs : empreinte du mot de passe et jeton OpenProject de chacun.

Piège vérifié. Les jetons d'API vivent dans la base OpenProject. Restaurer une sauvegarde antérieure à un changement de clé fait répondre « accès refusé » à toute l'application, sans que rien ne soit réellement cassé.

Couche 02

Le dépôt

Un seul dossier fait référence : /opt/cabinet-planning. Tout le reste — la racine web, les chemins d'usage — n'en est qu'un raccourci. Modifier le dépôt modifie donc la production directement, sans étape de déploiement.

/opt/cabinet-planning/ ├── app/ 16 pages HTML + 3 modules JS partagés — tout le visage de l'outil ├── auth/ le service d'authentification, les droits, la création de comptes ├── tools/ 57 scripts : installation, import, purge, sauvegarde, tests │ ├── e2e/ tests qui pilotent un vrai navigateur │ ├── snapshots/ sauvegardes complètes de la base, avec leur inventaire │ └── hooks/ contrôle « aucune donnée réelle » joué avant chaque enregistrement ├── docs/ 12 documents de référence + copie de sauvegarde de la mémoire ├── infra/ configurations nginx ├── poc/ docker-compose : OpenProject + n8n ├── poc-setup/ service systemd, secrets (non versionnés), magasin des comptes ├── SUIVI.md état vivant : prochaine action, décisions, pièges — une page └── CLAUDE.md consignes de travail

Les pages, par usage

PageCe qu'elle fait
planningL'écran principal : calendrier, tâches à planifier, saisie du temps. La plus grosse page de loin.
rhVue de la charge et de la capacité, par collaborateur et par équipe. Réaffectation de dossiers.
creation-missionCréer un client et sa mission comptable de l'année ; désigner les trois titulaires.
admin-usersGérer les comptes : rôle, poste, équipe, fiche du collaborateur.
loginConnexion et changement de mot de passe obligatoire à la première entrée.
supportSignaler un problème ; les tickets deviennent des tâches dans OpenProject.
console-basculeLes opérations lourdes en 7 étapes : rotation de clé, purge, import, anonymisation.

Cinq autres pages sont des guides et présentations (dont le guide de la vue RH), et quatre sont des maquettes conservées comme références de design, pas branchées aux données.

Les scripts, par famille

FamilleNbRôle
Installer OpenProject10Créer les types de tâches, champs, statuts, groupes, catalogue, projet support.
Importer depuis Wrike8Lire les Excel, régénérer les missions par les règles, vérifier après coup.
Purger et anonymiser10Remettre la base à zéro, effacer les données réelles, masquer les noms.
Sauvegarder, restaurer, mettre à jour8Instantanés avec inventaire, restauration vérifiée, rotation de clé.
Tester399 suites Python, 4 suites JS, et 26 scénarios qui pilotent un vrai navigateur.
Installer et entretenir7Déploiement nginx, service d'auth, jeux de démonstration, rappels.

Règle tenue. Toute modification de la base ou de la production passe par un script versionné et rejouable — jamais par une commande tapée une fois. C'est ce qui permet de refaire, et de comprendre après coup ce qui a été fait.

Le moteur de règles, partagé

Un seul fichier calcule les missions comptables : les 11 tâches du Bilan, les échéances de TVA selon le régime, les dates dérivées du mois de clôture. Il est utilisé à la fois par la page de création de mission et par l'import de masse — donc l'import produit exactement ce qu'une saisie à la main aurait produit.

Couche 03

La forme des données

Dans OpenProject, un projet = un client. Sous chaque client, une mission par exercice, et sous la mission, les tâches. Rien d'autre : pas de dépendances entre tâches, pas de date de début, une seule échéance par tâche.

Projet client identifiant client-000000 — ne contient jamais de nom └── Compta <année> la mission : porte les paramètres (régime, clôture, temps, titulaires) ├── Bilan × 11 Révision → Supervision → … → Plaquette, échéances calculées └── TVA × 12 / 4 / 1 selon le régime : mensuel, trimestriel, ou annuel

Les types de tâches utilisés

TypeRôle
10ComptaLa mission de l'exercice — le conteneur parent.
8BilanLes 11 tâches de la chaîne annuelle.
9TVAUne échéance de déclaration.
11Ticket supportUn signalement venu de la page support.

Les types 1 à 7 sont ceux livrés par défaut avec OpenProject (Tâche, Bug, Epic…) : présents, non utilisés.

Les trois projets qui ne sont pas des clients

ProjetContenu
catalogue-tachesLe catalogue des tâches de service, par poste — 86 modèles.
gestion-interneLes tâches internes du cabinet.
supportLes tickets remontés par les collaborateurs.

Ils survivent à toutes les purges : les effacer casserait la barre « à planifier » des postes de service et la page support.

Les champs sur mesure

18 champs ajoutés à OpenProject, répartis sur trois objets. Ceux de la fiche du collaborateur sont créés vides : rien n'y sera saisi avant validation.

Porté parChamps
Le client N° interne (1)
La mission ou la tâche Chef de mission · Chargé de mission Bilan · Collaborateur comptable · Temps Bilan h/an · Temps tenue h/an · Forme juridique · Mois de clôture · Régime TVA · Holding LMNP · Poste · Service (11)
Le collaborateur Heures hebdomadaires · Date d'entrée · Adresse mail personnelle · Lien bibliothèque · Identifiant espace de fichiers · N° de sécurité sociale (6)

Les statuts

14 statuts existent ; deux seulement comptent comme « fermé » : Clôturé et Annulé. C'est cette notion de fermeture qui pilote les compteurs d'avancement et l'affichage des tâches faites.

Contrainte à connaître. Le circuit de validation d'OpenProject interdit de rouvrir une tâche clôturée par l'API. Toute vérification qui clôturerait une tâche doit donc être menée sans rien modifier.

Là où vit l'organisation

Décision structurante : le rôle, le poste et l'équipe d'une personne ne sont pas stockés dans un fichier à part, mais dans des groupes OpenProject. Un changement fait dans la page de gestion des comptes est donc pris en compte à la connexion suivante, sans redéploiement.

GroupeNbPorte
Rôle : …5Le rôle applicatif, qui décide des droits et de la vue affichée.
<nom du poste>7Le poste comptable ou de service — un axe indépendant du rôle.
Équipe …11L'équipe, une par manageur. Le manageur est déduit de l'appartenance au groupe des manageurs.

Piège coûteux, corrigé. OpenProject ne renvoie que 20 groupes par défaut, et rend les plus récents d'abord : les plus anciens disparaissent silencieusement de la liste. Trois postes comptables se sont ainsi retrouvés sans affectation pendant deux jours. Toute lecture de liste réclame désormais une taille de page explicite.

Couche 04

Les personnes

Deux axes indépendants, et c'est la clé du modèle : le rôle décide de ce qu'on a le droit de faire, le poste décide de ce qu'on voit dans son planning.

Le rôle : qui peut quoi

La matrice ci-dessous est éditable dans l'application, pas figée dans le code. Les valeurs montrées sont celles en vigueur.

Capacité CollabSecrétariat ManageurRHAdmin
Voir et saisir son planning oui ouiouioui
Voir et planifier le planning des autres ouiouioui
Saisir ou valider le temps réel d'un autre ouioui
Créer la mission de l'année suivante ouioui ouiouioui
Créer un client, une mission, les mettre à jour oui ouiouioui
Consulter la charge (vue RH) ouiouioui
Réaffecter des dossiers ouioui
Gérer les comptes ouioui
Promouvoir quelqu'un en RH ou Admin oui
Modifier un RH ou Admin existant oui
Opérations lourdes : purge, remise à zéro oui

Trois barrières, pas une. L'écran masque ce qui n'est pas permis ; le service refuse les écritures non autorisées même si l'on contourne l'écran ; OpenProject applique enfin ses propres droits. Une seule des trois qui tombe ne suffit pas à ouvrir la porte.

Le poste : ce qu'on voit dans son planning

3 postes comptables

Chef de mission
Chargé de mission Bilan
Collaborateur comptable

Planning alimenté par les tâches Bilan et TVA des dossiers dont la personne est titulaire.

4 postes de service

Juridique
Patrimoine
Secrétariat
Informatique

Planning alimenté par leur propre catalogue de tâches de service.

Quand une personne cumule deux postes, le poste comptable l'emporte : c'est lui qui décide de la vue servie.

Une décision qui structure tout le reste

Aucun collaborateur n'est administrateur d'OpenProject. Le serait-il, il pourrait tout supprimer depuis l'interface d'OpenProject, hors de tout garde-fou de l'application. Conséquence : quand une RH doit lister les comptes — ce qu'OpenProject réserve à ses administrateurs — c'est le service qui fait la lecture avec son propre jeton, et seulement pour les quelques opérations autorisées à son rôle.