← LemonJalon

JOURNAL DES VERSIONS

Tout ce qui a changé
dans LemonJalon.

Des jalons et des sous-totaux dans vos devis

Version en cours 1.2.0 Dolibarr 18 et supérieur

1.2.0 (15 octobre 2026)

Les jalons se replient à l’écran. Un clic sur le titre d’un jalon le replie : il n’en reste que le titre, le nombre de lignes et le sous-total. « Tout replier » et « Tout déplier » sont au-dessus du tableau des lignes. Le repli est mémorisé par document, dans le navigateur ; le PDF ne change pas. Les sections Sous-total ATM et Sous-total du cœur se replient aussi.

Un style plus discret. Le titre d’un jalon se lit sur un bandeau clair, précédé d’un chevron, à la place du drapeau. Les sous-totaux ATM et du cœur prennent la disposition de ceux des jalons, montant dans la colonne Total HT. Sur un document qui porte des jalons, la poignée de glisser-déposer devient une poignée fine, visible au survol de la ligne.

Glisser une ligne dans un jalon replié. Une ligne tenue une demi-seconde contre un jalon replié l’ouvre : ses lignes masquées n’offraient aucune place où la lâcher.

Un bloc de lignes rejoint un jalon d’un seul geste. Une rangée glissée qui emmène d’autres lignes les annonce dans l’attribut data-dnd-lines (identifiants séparés par des virgules) ; au lâcher, toutes rejoignent le jalon où elles tombent, ou en sortent. Contrat générique, utilisé par LemonVignette pour ses blocs de tailles.

Supprimer un jalon garde ses lignes par défaut. Dans le dialogue de suppression, le choix coché d’avance est désormais de détacher les lignes, qui restent dans le document ; tout supprimer reste possible.

1.1.1 (7 octobre 2026)

Les sous-lignes d’une ligne de jalon font partie du jalon. Un marquage rattaché à son t-shirt, lui-même rangé dans un jalon, sortait du jalon : il n’entrait pas dans le sous-total, s’affichait à part sur la fiche et restait orphelin quand on supprimait le jalon. Il compte désormais dans le sous-total, s’affiche sous la ligne à laquelle il est rattaché, suit le jalon sur le PDF et part avec lui à la suppression. Un document sans sous-lignes ne change pas.

Nouveau réglage : « Ranger les sous-lignes des lignes de jalon ». C’est le réglage MAIN_CARE_GRANDCHILD du cœur de Dolibarr, exposé dans la configuration du module. Sans lui, Dolibarr ne renumérote pas ces sous-lignes et elles peuvent sortir à une autre place sur le PDF. À activer dès que des lignes de jalon portent des sous-lignes.

1.1.0 (1er octobre 2026)

Sur le PDF, le sous-total d’un jalon se lit sous ses lignes. Il s’affichait dans la colonne Total de la ligne-titre, au-dessus des prix qu’il additionne, et se confondait avec eux. Une ligne de sous-total, qui reprend le titre du jalon, ferme désormais chaque jalon sous sa dernière ligne, et un espace sépare un jalon du suivant. Si la ligne de sous-total ne tient plus en bas de page, elle passe en haut de la page suivante. Un nouveau réglage, « Position du sous-total », permet de revenir à l’affichage sur la ligne-titre. Le placement sous les lignes demande Dolibarr 21 ou plus et un modèle à colonnes (cyan, eratosthene, sponge, octopus et leurs dérivés) ; les autres modèles gardent le sous-total sur la ligne-titre. L’écran de la fiche, lui, affichait déjà le sous-total en bas du jalon.

Une ligne glissée dans un jalon y est rattachée. Le glisser-déposer changeait l’ordre des lignes, mais une ligne gardait son jalon d’origine et y retournait au rechargement. Elle rejoint désormais le jalon où elle est lâchée, et une ligne lâchée hors de tout jalon en est détachée.

Un jalon se déplace avec ses lignes. En le faisant glisser comme avec ses flèches, le jalon emmène toutes ses lignes et passe au-delà du jalon ou de la ligne voisine. Les flèches d’une ligne de jalon la déplacent à l’intérieur de son jalon, sans l’en faire sortir.

Le saut de page d’un jalon suit le document. Il se perdait quand un devis devenait une commande ou une facture, ou quand une commande devenait une facture. Il est désormais recopié. Pour les conversions automatiques (module Workflow) et les clones, désactivez puis réactivez le module après la mise à jour.

Un PDF généré après un autre dans la même opération pouvait afficher des sous-totaux faux. C’est le cas d’un paiement qui solde plusieurs factures : Dolibarr régénère alors le PDF de chacune, l’une après l’autre. Le module réutilisait par erreur le découpage du document précédent, si bien qu’un jalon pouvait sortir à zéro et une ligne perdre son rattachement au jalon. Le découpage est désormais recalculé dès que les lignes du document changent. Le même défaut provoquait des avertissements PHP (« Undefined array key “parents” ») dans les journaux.

L’installation s’explique dès l’ouverture du ZIP. Un fichier INSTALL.txt, en français et en anglais, donne les deux façons d’installer le module (depuis le menu de Dolibarr, sans décompresser, ou par copie dans custom), son activation, ses réglages, et comment le mettre à jour.

1.0.0 (8 septembre 2026)

Première version publiée. Le module ajoute des jalons — des lignes de titre qui regroupent et totalisent les lignes suivantes — dans les propositions commerciales, les commandes et les factures clients. Le regroupement et le sous-total apparaissent à l’écran comme sur le PDF.

Compatible avec les documents existants produits par Milestone et par les sous-totaux du cœur : un document déjà découpé garde son découpage.

La suppression d’un jalon passe par un formulaire POST porteur d’un jeton : la boîte de confirmation jQuery de Dolibarr navigue par une requête GET, que le garde d’écriture du module refuse.

Recette passée sur la matrice Dolibarr 18 à 24, MySQL et PostgreSQL.

Le numéro passe de 0.2.1 à 1.0.0 : le module est mis en vente, il n’a plus à porter un numéro qui annonce un travail en cours.

0.2.1 (2026-09-05)

  • Protection explicite des écritures par requête POST et jeton CSRF, sans dépendre du réglage global de l’instance Dolibarr.
  • Vérification de l’appartenance de chaque jalon au document courant avant sa modification ou sa suppression, avec transmission de l’identifiant du document aux méthodes deleteLine() du cœur.
  • Échappement du titre des jalons avant son rendu HTML dans les PDF.
  • Blocage de l’accès HTTP au dossier de recette embarqué dans le module.
  • Remplacement des URLs construites depuis PHP_SELF par les chemins Dolibarr explicites des fiches et de la page de configuration.

0.2.0 (2026-09-04)

  • Ajout d’un adaptateur central non destructif pour relire quatre formats : LemonJalon (210039), Milestone (1790), Sous-total ATM (104777) et Sous-total du cœur (81).
  • Reconstruction par rang et pile des niveaux ATM/cœur, avec tolérance des blocs vides, non fermés ou orphelins.
  • Calcul HTML/PDF et multidevise exclusivement depuis les lignes métier, sans mutation des lignes de structure ni des totaux généraux du document.
  • Écriture de tous les nouveaux jalons exclusivement au format natif 210039 ; retrait du réglage d’écriture Milestone, sans effacer l’ancienne constante.
  • Inventaire en lecture seule des données historiques, limité à l’entité courante, sur la page de configuration.
  • Recettes autonomes pour les formats mixtes, les niveaux imbriqués, les commentaires, la multidevise, les rendus HTML/PDF et le contrat Factur-X.

0.1.0 (2026-08-30)

Première version.

  • Jalons (lignes de titre) avec sous-totaux dans les propositions commerciales, commandes et factures clients : ajout, édition, suppression (avec choix du sort des lignes rattachées), rattachement des lignes à un jalon depuis les formulaires d’ajout et d’édition de ligne.
  • Rendu PDF agnostique du modèle : bandeau de jalon dessiné à partir de la géométrie fournie par les hooks du cœur, sans cas particulier par modèle.
  • Options PDF par document : masquer les montants des lignes, leurs descriptions, ou les sous-totaux ; saut de page avant un jalon ; pays d’origine des produits en option.
  • Compatibilité Milestone (Atoo-Net) : les jalons existants (special_code 1790) sont reconnus et affichés sans migration ; une option d’écriture compatible, préréglée automatiquement selon le passé de l’instance, garde les documents interchangeables ; les réglages MILESTONE_* sont lus en repli.
  • Aucune table propre, aucune requête spécifique MySQL : compatible MySQL, MariaDB et PostgreSQL.