Projets 02 / 04

Numéros de programme sans doublon

Plusieurs postes créent des fiches en même temps, chacune doit repartir avec son propre numéro. Sans base de données.

État
En service
Année
2026
Durée
Juillet 2026
Rôle
Seul, de la conception au déploiement
Client
Garcia Rectification, Cormeilles-en-Vexin
Données
3 943 fiches synchronisées depuis Clipper
Le sujet
Deux postes ne doivent jamais recevoir le même numéro
Outils
PHP 8, Python 3, JavaScript, SMTP

01 — Contexte

Le point de départ

Deux opérateurs ouvrent le formulaire de création en même temps. Les deux lisent le dernier numéro, 3943. Les deux créent la fiche 3944. Personne ne voit rien avant que les fiches remontent dans Clipper, plusieurs heures plus tard, et là il est trop tard pour corriger simplement.

Cette appli sert à créer les fiches programme de l'atelier. Son vrai travail, c'est de rendre ce scénario impossible, avec des fichiers et un verrou, parce qu'il n'y a pas de base de données.

02

La course

Les nouvelles fiches ne remontent dans Clipper qu'après validation, avec plusieurs heures de décalage. Le numéro doit donc être réservé pendant que l'opérateur remplit le formulaire, pas quand la fiche arrive dans Clipper.

La course sans verrou Deux postes lisent le dernier numéro utilisé au même instant, obtiennent la même valeur, et créent tous deux la fiche numéro 3944. La collision n'est détectée qu'à l'intégration dans l'ERP. POSTE A POSTE B FICHIER lit → 3943 lit → 3943 les deux postes ont la même valeur crée 3944 crée 3944 doublon
Sans réservation, le doublon n'apparaît qu'à l'intégration dans Clipper, des heures plus tard.

03

Des réservations de 15 secondes

Quand le formulaire s'ouvre, le serveur ne se contente pas de calculer le prochain numéro : il le réserve dans un fichier de verrous, avec une expiration à 15 secondes. Tant que la réservation tient, aucun autre poste ne peut avoir ce numéro. Le formulaire la renouvelle tant qu'il reste ouvert.

Pour choisir, le serveur parcourt les numéros dans l'ordre et prend le premier qui n'est ni dans Clipper, ni réservé. Le ménage des réservations expirées, la recherche et la nouvelle réservation se font dans un seul verrou exclusif sur le fichier. Deux requêtes simultanées passent donc l'une après l'autre, et la deuxième voit la réservation de la première.

Vie d'une réservation La réservation est posée à l'ouverture du formulaire pour quinze secondes, renouvelée tant que le formulaire reste ouvert, puis libérée tout de suite à la validation ou à l'annulation. Si elle n'est ni renouvelée ni libérée, elle expire d'elle-même. Ouverture réservé T + 15 s Formulaire ouvert renouvelé Validation libéré Annulation libéré Onglet fermé expire seul Numéro libre réutilisable heartbeat
Une réservation qu'on ne libère pas expire toute seule : aucun numéro ne reste bloqué.
Liste des programmes synchronisés depuis l'ERP, avec recherche, bouton de création et onglet des fiches en attente d'intégration.
Onglets « Base Clipper » et « En attente d'intégration ». Données anonymisées pour la capture.

04

Les choix

  • Une réservation qui expire

    Écarté : un verrou que le navigateur libère

    Un verrou que seul le navigateur peut libérer finit par rester bloqué : onglet fermé, navigateur planté, PC éteint, coupure réseau. Le numéro serait perdu. Avec une date d'expiration, un poste qui ne donne plus de nouvelles est un cas prévu. Il n'y a pas de tâche de fond : chaque requête qui lit le fichier supprime au passage les réservations périmées.

  • 15 secondes, renouvelées

    Écarté : une réservation de 5 minutes

    Trop court, le numéro change sous les doigts de quelqu'un qui réfléchit. Trop long, un formulaire abandonné bloque un numéro pendant des minutes, et l'opérateur suivant voit un trou dans la numérotation. Avec 15 secondes renouvelées tant que le formulaire est ouvert, un formulaire ouvert garde son numéro aussi longtemps qu'il faut, et un formulaire abandonné le rend en quelques secondes.

05

Ce qui a coincé

  • La réservation peut expirer pendant la saisieQuelqu'un laisse le formulaire ouvert et s'en va. Quand il valide, sa réservation a pu expirer et être reprise par un autre poste. Si la validation faisait confiance à la réservation, on retombait sur le doublon. Donc la validation revérifie que le numéro est libre au moment d'écrire, sous verrou. La réservation sert à ce que le numéro affiché reste stable. Ce qui empêche vraiment le doublon, c'est cette vérification.
  • Rendre le numéro quand on annuleFermer le formulaire sans valider devait rendre le numéro tout de suite, sans attendre les 15 secondes. Sinon quelqu'un qui hésite laisse des trous dans la numérotation. Le bouton « Annuler », le clic en dehors du formulaire et la touche Échap libèrent tous la réservation. L'expiration reste là pour les cas que je ne contrôle pas.

06

Où ça en est

  • 3 943fiches synchronisées depuis Clipper
  • 15 spar réservation, renouvelée tant que le formulaire est ouvert

L'appli tourne sur le réseau de l'atelier depuis juillet 2026. Chaque création envoie un mail au responsable, et chaque étape de l'envoi (connexion, STARTTLS, authentification, envoi) est écrite dans un journal quotidien. Quand un mail ne part pas, on sait à quelle étape ça a cassé sans avoir à reproduire le problème.

Je n'ai pas le nombre de fiches créées depuis que je suis parti, donc je ne peux pas vous dire combien de doublons ça a évité.

07

À reprendre

  • Le renouvellement dépend du navigateur.Quand un onglet passe en arrière-plan, le navigateur peut ralentir ses minuteurs et laisser la réservation expirer alors que la personne est toujours là. La revérification évite le doublon, mais le numéro affiché peut changer. Relancer le renouvellement quand l'onglet revient au premier plan (API Page Visibility) réglerait ça.
  • Il n'y a pas d'authentification.Le service ne répond que sur le réseau local, et la règle du pare-feu est limitée au profil privé. Mais aucune action n'est rattachée à une personne. Pour un outil qui envoie des mails au nom de l'entreprise, une identification, même simple, serait plus saine.

Tous les projets

Contact

Parlons-en

pfery@outlook.fr