Changelog

Complete version history of the ProductionInterne module.

v1.5.0 Current version

2026-09-22

● Ajoute — Le module adopte le theme Dolibarr du client (Epic 17)

  • Les couleurs des ecrans derivent des variables du coeur (`--colortext`, `--colorbacktabcard1`…)
  • 78 attributs `style=` retires des ecrans : le theme sait deja rendre espacements et bordures
  • Verification sur trois themes (eldy par defaut, eldy personnalise, md) avec un jeu de donnees couvrant tous les statuts et toutes les priorites — une capture d'ecran vide ne prouve rien
  • Garde-fou : un test echoue si une couleur hexadecimale reapparait dans un ecran ou dans le CSS

● Ajoute — Journal dedie et onglet Support (Epic 18)

  • Le module ecrit desormais dans `dolibarr_productioninterne.log`, separe du journal general
  • La verbosite se regle depuis l'ecran d'administration
  • Nouvel onglet **Support** : taille du journal, telechargement (reserve au super-administrateur), version du module, de Dolibarr et de PHP — de quoi ouvrir un ticket sans aller-retour
  • Les adresses e-mail sont masquees dans le journal : il est fait pour nous etre envoye
  • Rotation et purge verifiees sur l'instance, pas seulement declarees

● Ajoute — Chronometre de saisie de production (Epic 7)

  • Le chronometre demarre seul a l'ouverture de l'ecran de saisie et alimente le temps de production
  • Il laisse la main des que l'operateur saisit le champ lui-meme, et ne la reprend plus
  • Pause et reprise : le temps en pause ne s'ecoule pas, et la mesure survit a un rechargement
  • Un saut d'horloge (veille de la machine, retour arriere du navigateur) n'est pas compte comme du travail ; au-dela de 12 h, le chronometre cesse d'alimenter le champ et le signale
  • Le temps mesure est enregistre avec la production, distinct du temps saisi : les indicateurs de rendement savent desormais dire s'ils reposent sur une mesure ou sur une declaration
  • Nouveaux indicateurs : temps total mesure et temps moyen par unite produite

● Ajoute — Une documentation qui decrit le module reel

  • **Guide utilisateur entierement reecrit.** L'ancien ne couvrait que les notifications : neuf fonctionnalites livrees n'etaient documentees nulle part, dont le scan QR, en production depuis la 1.4.0. Le nouveau couvre le cycle de fabrication, le scan QR et la fiche A5, le chronometre, le Kanban, le tableau de bord, le Mode Solo, l'onglet Support, la page Diagnostic et l'assistant de configuration
  • Les documents techniques livres ont ete corriges de ce qu'ils affirmaient de faux : des codes d'evenement inexistants, une plage de compatibilite « Dolibarr 14.0+ », un nom de champ errone, un fichier de hooks qui n'existe pas, et une classe de notifications decrite avec des constantes, des noms et un systeme SMS qui n'ont jamais existe
  • Deux documents ont ete retires du paquet : l'un annoncait des fonctionnalites jamais developpees, l'autre faisait manipuler la base pour un probleme resolu depuis la v1.1.0

● Modifie — Durcissement

  • Les ecrans n'impriment plus `$_SERVER['PHP_SELF']` directement mais passent par un helper qui retire le PATH_INFO. Aucune exploitation n'etait possible — le coeur rejette deja les caracteres qui la permettraient — mais la surete du module n'a pas a reposer sur une garde qu'il ne controle pas.

● Corrige

  • **Tout le JavaScript de l'ecran de saisie de production etait mort.** La page emet son JavaScript sur une seule ligne physique : trois commentaires `//` y commentaient tout ce qui suivait, accolades fermantes comprises. Validation de quantite, avertissements de surproduction et aides de saisie ne fonctionnaient plus, sans qu'aucune erreur ne le signale.
  • Suppression du mode « calculer automatiquement le temps ecoule depuis la creation », **coche par defaut** : il inscrivait l'age de l'ordre de fabrication dans le temps de production — 7 200 minutes pour un ordre vieux de cinq jours — et faussait les indicateurs.

v1.4.1

2026-09-13

● Corrige — Plage de compatibilite ramenee a Dolibarr 18.0 -> 24.x

  • **Verification reelle** : suite complete executee sur **Dolibarr 18.0.10 (PHP 8.1)**, **23.0.4 (PHP 8.4)** et **24.0.1 (PHP 8.5)** — 464 tests, 2722 assertions, aucun echec sur les trois. Chaque version tourne avec un PHP qu'elle supporte officiellement : la matrice Dolibarr plafonne la 18 a PHP 8.1 et la 23 a PHP 8.4.
  • **Compatibilite 18/19 retablie dans le code** : `GETPOSTFLOAT()` n'existe que depuis Dolibarr 20 (`@since Dolibarr V20`). Les 16 appels passent desormais par le helper `pi_getpost_float()`, qui se replie sur `GETPOST()` + `price2num()` en dessous de la 20. Sans ce repli, les pages de saisie de production etaient inutilisables sur 18 et 19 — un defaut qu'aucun test ne revelait, la suite ne chargeant jamais ces pages.
  • Page Diagnostic, libelles traduits (5 langues), documentation du site (5 langues), fiche produit et README alignes sur la nouvelle plage, en distinguant ce qui est **teste** (18, 23, 24) de ce qui est **declare** (19 a 22).
  • Outillage de test : matrice `test/fixtures/run_matrix.sh` et jeu de donnees reproductible `test/fixtures/seed_test_instance.php`.

v1.4.0

2026-09-12

● Modifie — Compatibilite Dolibarr

  • **Plancher releve de 18.0 a 23.0, plafond declare a 24.x** (`need_dolibarr_version`, `max_dolibarr_version`). La page Diagnostic, la page A propos, les libelles traduits et les descriptions de la fiche produit ont ete alignes. La page A propos **derive** desormais la plage du descripteur au lieu de la recopier, pour qu'elle ne puisse plus diverger.
  • `getDolGlobalInt()` redevient utilisable sans reserve (la fonction existe depuis bien avant la 23.0) ; le contournement `(int) getDolGlobalString()` reste valable mais n'est plus necessaire.

● Ajoute — Epic 6 : Scan QR code

  • **Story 6-1 — Generation QR code unique par OF (done)** : token `qr_token` cryptographiquement aleatoire (`[0-9a-f]{32}`) genere a la creation de chaque OF dans la meme transaction que la `ref`, charge utile versionnee `PI1:{token}` (contrat unique pour le scan de la story 6-2), rendu QR via **TCPDF** (`TCPDF2DBarcode`, moteur natif du core — `includes/phpqrcode/` n'existe dans aucune version Dolibarr 18 -> 23), SVG inline sur la fiche OF et nouvel endpoint `production_qr.php` de telechargement (PNG, repli SVG automatique si GD absent, extension toujours alignee sur le contenu servi). Backfill des OF anterieurs en masse (a la reactivation du module et par le cron de rattrapage) avec filet de securite a l'affichage. Check diagnostic « Librairie QR Code » corrige : il testait `phpqrcode` (jamais present) et passe en OK/ERROR reel, compte desormais dans la synthese globale de sante.
  • **Story 6-2 — Scan QR et saisie directe de production (done)** : nouvelle page `production_scan.php` (bouton d'acces depuis la vue cartes operateur) avec zone de scan camera et champ de saisie manuelle de reference. Decodage **exclusivement cote navigateur** via l'API native `BarcodeDetector` (`js/qrscanner.js.php`, charge uniquement par cette page — jamais via `module_parts['js']`, qui aurait servi le scanner sur toutes les pages Dolibarr de toutes les sessions) : aucune image, aucun flux camera n'est jamais transmis au serveur, seule la charge utile texte decodee (`PI1:{token}`, contrat 6-1) part vers la nouvelle action AJAX `qr_lookup`. Repli explicite et cause (navigateur non compatible / HTTPS requis / permission camera refusee) si le scan n'est pas disponible — jamais de cul-de-sac, la saisie manuelle reste toujours accessible. Camera systematiquement liberee (succes, annulation, changement de page). Message d'echec generique unique pour tout OF non resolu (payload invalide, token inconnu, OF d'une autre entite) : aucune fuite sur l'existence d'un OF. La saisie de production reutilise integrale- ment le mecanisme existant (action `record_quantity`) — aucun nouveau chemin d'enregistrement. Regle de statut (seule regle reellement dupliquee entre la vue cartes et l'AJAX) extraite dans le helper unique `pi_quick_entry_eligibility()` (`lib/productioninterne.lib.php`). **Changement de comportement assume** : `handleRecordQuantity()` (action `record_quantity`) persiste desormais l'entrepot resolu par repli (extrafield produit, puis constante globale) au moment de l'enregistrement, si l'OF n'en avait aucun — auparavant, tout OF sans entrepot etait refuse meme si un repli existait. Sans effet sur un OF ayant deja un entrepot configure. **Correctifs code review round 2 (post-implementation, avant merge)** : - `qr_lookup` est redevenue une lecture PURE : l'appel a `pi_qr_get_or_create_token()` (qui ecrivait le token en base pour un OF resolu par reference) a ete supprime — il contredisait le motif explicite de l'exemption CSRF de cette action ("aucun effet de bord"). Le token reste garanti par le backfill activation/cron (6-1), par `production_card.php` a l'affichage et par `production_qr.php` au telechargement. - Correction d'un N+1 introduit par l'extraction : `pi_quick_entry_eligibility()` ne resout plus l'entrepot (requete `product_extrafields` + verification d'existence) que pour les OF dont le statut permet deja la saisie — plus de requete inutile sur chaque brouillon affiche dans la vue cartes. - `pi_quick_entry_eligibility()` verifie desormais que l'entrepot resolu (valeur OF, repli extrafield ou constante globale) existe encore dans `llx_entrepot` ; un entrepot supprime retourne le motif `no_warehouse` au lieu d'un `fk_entrepot` fantome transmis au mouvement de stock. **Changement de comportement d'affichage associe** (releve en review round 3, non documente jusqu'ici) : sur la vue cartes, l'avertissement "entrepot manquant" apparait desormais aussi quand l'OF reference un entrepot **supprime** — auparavant, seul un entrepot vide (`fk_entrepot` a 0/nul) declenchait cet avertissement. - La persistance de l'entrepot resolu dans `handleRecordQuantity()` rejoint desormais la transaction de `enregistrerProduction()` (affectation en memoire avant l'appel, persistee par son propre `update()`) : un rollback interne (mouvement de stock, ligne, trigger) n'ecrit plus l'entrepot sans que la production ait eu lieu. - Filtre d'entite ajoute sur le `SELECT` produit de `handleQrLookup()` (convention du projet, deja appliquee par `handleSearchProducts()`). - JS (`js/qrscanner.js.php`) : un scan ignore parce qu'un lookup est deja en vol affiche desormais un message explicite (au lieu d'un `return` muet apres extinction silencieuse de la camera) ; les causes d'indisponibilite camera distinguent desormais "aucune camera detectee" (`NotFoundError`) d'un navigateur non compatible ; un refus de permission camera propose un bouton "Reessayer" plutot qu'un cul-de-sac necessitant un rechargement ; la boucle de detection est suspendue quand l'onglet passe en arriere-plan (`visibilitychange`) pour la batterie de la tablette ; `maxlength="128"` ajoute au champ de reference manuelle (aligne sur la colonne `ref`). **Correctifs code review round 3 (post-implementation, avant merge) :** - **Correction (le N+1 ci-dessus etait redevenu faux)** : le correctif round 2 restreignait bien la resolution d'entrepot aux OF dont le statut la permet, mais executait ensuite `pi_warehouse_exists()` pour chacun de ces OF, **y compris ceux qui portaient deja un `fk_entrepot` valide** — le cas le plus frequent, qui ne declenchait aucune requete avant la Story 6-2. Une liste de N OF partageant le meme entrepot de production executait donc N `SELECT` identiques : le N+1 etait revenu par une autre porte. `pi_warehouse_exists()` memoise desormais son resultat en cache statique memoire, indexe par entrepot et par entite : le cout retombe a une requete par entrepot **distinct** affiche, sans rien perdre de la detection d'entrepot fantome (R3). Cache purgeable (`pi_warehouse_exists_reset_cache()` ou parametre `$forceRefresh`) pour les tests qui creent puis suppriment un entrepot dans le meme process PHP. - JS (`js/qrscanner.js.php`) : le bouton "Reessayer l'acces camera" (ajoute en round 2) pouvait declencher deux flux camera concurrents — `startScan()` ne posait aucun verrou avant resolution de `getUserMedia()`, et un double-clic (ou un tap tactile remanent, courant sur tablette) sur ce bouton ou sur "Demarrer le scan" ecrasait le premier flux sans jamais l'arreter (camera fantome allumee, `setInterval` orphelin). Verrou `_startingCamera` ajoute, partage par les deux boutons. - `handleQrLookup()` journalise desormais (`dol_syslog`, niveau warning) le cas ou le libelle produit ne peut pas etre resolu (produit supprime, ou hors perimetre d'entite) : auparavant, l'operateur voyait un OF sans nom de produit sans qu'aucune trace n'en reste cote serveur. Le message renvoye au client reste inchange (generique, AC#3).
  • **Story 6-3 — Impression fiche OF avec QR code (review)** : nouvel endpoint `production_pdf_sheet.php` qui genere une fiche A5 portrait imprimable par ordre de fabrication, avec le QR code de la Story 6.1 (dessine nativement, sans dependance externe). Impression a l'unite depuis la fiche OF, ou en lot depuis `production_list.php` via une selection par cases a cocher et un bouton "Imprimer les fiches" (la recherche par filtres continue de fonctionner normalement, y compris en validant avec la touche Entree). Plafond de 50 fiches par PDF ; au-dela, seules les 50 premieres sont generees et l'utilisateur en est informe. Les OF crees avant la Story 6.1 recoivent automatiquement leur QR code a la premiere impression. Si le lecteur QR du serveur est indisponible, la fiche est tout de meme produite, sans QR, avec une mention visible plutot qu'un echec. Une selection melangeant des ordres de fabrication de societes differentes (utilisateurs multi-societes) est refusee explicitement, avec message clair, plutot que de produire un document ambigu. La fiche affiche : reference (en gros), produit, quantite a produire (mise en avant), quantite deja produite, date prevue, priorite, entrepot de destination, commande client liee le cas echeant, statut et date de generation ; toute information manquante est indiquee comme telle plutot que laissee vide ou a zero. Couverture de tests dediee (generation PDF, rattrapage et degradation du QR, isolation entre societes, plafond de la selection).

● Corrige — Bugs preexistants trouves par la review de la story 6-1

  • **Reference d'OF perdue en multi-entite** : dans `create()`, l'UPDATE de la `ref` definitive et le calcul de `getNextNumRef()` filtraient sur `$conf->entity` (entite de la session) au lieu de l'entite cible de l'OF. Sur le chemin cross-entite du cron de rattrapage (`$production->entity = $target_entity`), la `ref` n'etait jamais ecrite — l'OF restait `(PROV)` en base silencieusement — ou entrait en collision avec la contrainte `UNIQUE (ref, entity)`, faisant echouer la creation. Les UPDATE controlent maintenant `affected_rows()` et journalisent toute anomalie. Sans effet sur les instances mono-entite.
  • **Faux succes silencieux sur `update()`/`validate()`/`close()`/`delete()` en multi-entite** (dette differee de la review 6-1) : ces methodes filtraient encore leur `WHERE`/`DELETE` sur `$conf->entity` (entite de la session) au lieu de l'entite cible de l'objet (`$this->entity`, deja normalisee pour `create()`). Un `UPDATE`/`DELETE` cross-entite (0 ligne affectee) etait traite comme un succes SQL : le trigger metier se declenchait quand meme (notifications, evenement agenda) alors que la base n'avait pas bouge — le pire cas etant `delete()`, qui retournait un succes avec l'OF toujours present en base. Corrige : filtre sur `$this->entity`, controle `affected_rows()` sur chaque `UPDATE`/`DELETE`, et `delete()` normalise desormais `$this->entity` en tete de methode comme `create()`/`update()`. Un `UPDATE` a 0 ligne affectee n'est plus traite en erreur automatique : un controle d'existence (`pi_production_row_exists()`) distingue une reecriture de valeurs identiques (succes legitime, cas courant meme en mono-entite) d'une ligne reellement absente (erreur). Le `DELETE` des lignes de production accepte toujours 0 ligne (OF jamais produit = cas normal) ; seul le `DELETE` de l'OF principal exige au moins 1 ligne supprimee. `fetch_lines()` aligne sur la convention SELECT du projet (`entity IN (getEntity(...))`). Meme correctif applique a `ProductionLine::update()`/`delete()`, avec deplacement du trigger `PRODUCTIONLINE_DELETE` apres la suppression reussie (il partait avant le `DELETE` SQL). **Sans effet sur les instances mono-entite** : `$this->entity` et `$conf->entity` y sont toujours identiques, donc `WHERE`/`SET` ciblent systematiquement la meme ligne.
  • **Entite des lignes de production alignee sur celle de leur OF** : `enregistrerProduction()` et `allouerProduction()` creaient les `ProductionLine` avec l'entite de la **session** (`$conf->entity`) et non celle de l'OF parent. Sur le chemin de redistribution FIFO cross-entite, une ligne pouvait donc porter une entite differente de son OF : visible via `fetch_lines()` mais impossible a modifier par `ProductionLine::update()`. Les lignes heritent desormais de l'entite de leur OF. Sans effet en mono-entite ; la suppression restait de toute facon garantie par la contrainte `ON DELETE CASCADE`.
  • **`delete()` rendu idempotent sans affaiblir le controle multi-entite** : depuis le correctif ci-dessus, `ProductionInterne::delete()` et `ProductionLine::delete()` echouaient aussi sur un double-submit benin (double-clic, requete rejouee sur `production_lines.php` ou la fiche OF), alors que le resultat souhaite (objet supprime) etait deja atteint. Un controle d'existence par `rowid` seul, sans filtre d'entite, distingue desormais explicitement « objet deja supprime » (succes idempotent, aucun trigger rejoue) d'« objet present dans une autre entite » (erreur, comportement inchange).

● Securite — Hygiene detecteur de secrets (suite alerte GitGuardian du 18/08/2026)

  • **Aucun secret exploitable** : alerte investiguee, depot prive sans miroir public, ZIP distribue n'embarquant ni `test/`, ni `_bmad/`, ni `.claude/`. Correctifs purement d'hygiene, sans urgence.
  • **Fixture de test a haute entropie neutralisee** : `test/phpunit/QrCodeTest.php` remplace le litteral hexadecimal 32 caracteres declenchant la regle `generic-api-key` par un helper prive deterministe (`fixtureQrToken()`, `str_repeat('0123456789abcdef', 2)`) — memes tests, meme couverture, plus aucune chaine a haute entropie dans le source.
  • **Faux positifs du toolkit BMAD vendorise exclus** : nouveau `.gitleaks.toml` (`[extend] useDefault = true` + `[allowlist].paths`), portee strictement limitee a `_bmad/_config/files-manifest.csv` (checksums SHA-256, pas des cles) et `.claude/skills/**/resources/knowledge/api-testing-patterns.md` (exemple pedagogique de jeton JWT expire). Jamais `test/**` ni le code du module dans cette allowlist.
  • **Mots de passe de demonstration sortis du code en dur** : `docker-compose-demo-19.yml`, `docker-compose-demo-20.yml` (syntaxe `${VAR:?message}`, echec explicite si absente) et `scripts/seed_demo_data.php` / `scripts/reset_demo_passwords.php` (`getenv()` + refus explicite) lisent desormais leurs mots de passe depuis l'environnement (`PI_DEMO_ADMIN_PASSWORD`, `PI_DEMO_DB_PASSWORD`, `PI_DEMO_DB_ROOT_PASSWORD`, `PI_DEMO_USER_PASSWORD`) — aucune valeur par defaut. `docs/DEMO_DATA.md` mis a jour (variables a definir avant `docker-compose up`).

● Prevu

  • **Epic 6 — Scan QR code** : stories 6-2 (scan camera et modale de saisie) et 6-3 (impression fiche OF)
  • **Epic 7 — Chronometre de production** (3 stories)
  • **Epic 8 — Checklists qualite** (4 stories)
  • **Epic 9 — Rapports avances** (2 stories)
  • **Story 5-3 — Documentation utilisateur et developpeur**

v1.3.0

2026-07-15

● Ajoute — Epic 1 : Migration et fondation qualite (done)

  • **Migration SQL idempotente v1.2.1 → v1.3.0** : Script `sql/update_1.2.1_1.3.0.sql` utilisant `information_schema` (detection de schema), ajout de 3 colonnes (`qr_token`, `production_timer`, `checklist_data`), table `llx_productioninterne_checklist`, 2 index
  • **Suite de tests PHPUnit** : Bootstrap Dolibarr fonctionnel (main.inc.php), 67 tests automatises / 405 assertions couvrant CRUD ProductionInterne, ProductionLine, ProductionUtils, workflow d'integration complet
  • **Documentation tests** : Pieges PHPUnit Dolibarr (bootstrap, `$GLOBALS["db"]`, `fetch()` post-create, FK constraint stock)

● Ajoute — Epic 2 : Vue Kanban responsable (done)

  • **Page Kanban par statut (story 2-1)** : Rendu serveur, 4 colonnes (Brouillon, Valide, En cours, Termine), cards avec produit/qty/%/deadline
  • **Drag & drop AJAX (story 2-2)** : Deplacement inter-colonnes avec mise a jour du statut, transaction securisee, whitelist transitions, CSRF + permissions
  • **Filtres et badges deadline (story 2-3)** : Filtres opérateur / produit / priorité (avec option "Non assigne"), badges deadline (en retard, critique, attention) conformes WCAG AA, animation accessible (`box-shadow` + `prefers-reduced-motion`), 90 tests PHPUnit / 296 assertions
  • **Modification priorite inline et fallback mobile (story 2-4)** : select inline sur le badge priorite (optimistic update + rollback), bouton "Reassigner" fallback sur mobile/tablette (<768px, drag & drop desactive) via `matchMedia`, zones tactiles >= 44x44px, navigation clavier complete (Escape annule sans requete AJAX)
  • **Accessibilite, responsive et polish (story 2-5)** : region `aria-live="polite"` (`#pi-kanban-announcer`) pour les annonces vocales (deplacement, changement priorite), respect systematique de `prefers-reduced-motion`, tabindex conditionnel aligne sur `data-can-drag`, correction contraste bordures WCAG 1.4.11 (`#dee2e6` -> `#adb5bd`), 2 audits formels (responsive + contraste)

● Ajoute — Epic 3 : Dashboard dirigeant (done)

  • **Page Dashboard, KPIs et tendances 30 jours (story 3-1)** : nouvelle page `production_dashboard.php`, 4 tuiles KPI (taux de completion semaine, OF en retard, OF en cours, OF termines cette semaine) avec philosophie "by exception" (vert dominant, rouge uniquement sur alerte reelle), sparkline 30 jours en barres CSS pures (zero JS) avec indicateur de tendance hausse/stable/baisse, responsive desktop/tablette/mobile
  • **Graphique charge operateur (story 3-2)** : bloc barres CSS pures (spike technique : `DolGraph::SetDataColor()` incompatible avec une couleur par barre, decision documentee), `ProductionUtils::getOperatorLoad()`, 3 seuils visuels (vert < 80%, orange 80-100%, rouge > 100% surcharge), masque automatiquement en Mode Solo
  • **Alertes actives et avancement par commande (story 3-3)** : tableau des OF en retard / deadline proche (`ProductionUtils::getActiveAlerts()`), tableau d'avancement de production par commande client avec barre de progression (`ProductionUtils::getOrdersProgress()`)
  • **Export PDF du Dashboard (story 3-4)** : nouvel endpoint `production_pdf_export.php` + classe `ProductionPdfDashboard`, genere via TCPDF du core (aucune librairie externe) un PDF reprenant les 4 blocs du Dashboard, sections operateur/commandes automatiquement omises en Mode Solo
  • **Rapport email hebdomadaire (story 3-5)** : nouveau cron `CronWeeklyDashboardReport` (lundi par defaut, semaine ecoulee), email HTML avec le PDF Dashboard en piece jointe envoye au responsable configure (`PRODUCTIONINTERNE_EMAIL_MANAGER`), nouvelle constante d'activation dediee `PRODUCTIONINTERNE_ENABLE_WEEKLY_REPORT` (independante des notifications evenementielles), section admin dediee avec bouton d'envoi de test immediat

● Corrige — Audit qualite 2026-06

  • **CSRF workflow fiche OF** : les actions `confirm_validate`, `confirm_close`, `confirm_cancel`, `confirm_delete` de `production_card.php` verifient desormais le token via `pi_check_csrf()` (alignees sur `confirm_assign`/`confirm_start`/`confirm_priority`)
  • **Bug mouvement stock avec numero de lot** : `enregistrerProduction()` passait `dol_now()` en date de peremption (`eatby`) et le numero de lot en date de mouvement (`datem`) — crash SQL `Incorrect datetime value` des qu'un lot etait saisi. Arguments de `MouvementStock::reception()` realignes (lot en 9e position, date du mouvement = date de production saisie)
  • **Migration `hasRight()` complete** : ~45 occurrences residuelles `$user->rights->productioninterne->` migrees vers `$user->hasRight()` (card, list, lines, note, ajax, agenda, document, kanban, cards) + strings de menu du descripteur en forme `hasRight("...")`
  • **Versions affichees** : `admin/about.php` affichait `1.2.1` en dur ; `$version` du trigger affichait `1.1.0` dans la liste admin des triggers — synchronises en 1.3.0

● Ajoute — Outillage demo

  • **Script `scripts/seed_demo_data.php`** : seed CLI idempotent du scenario "Mobilier Design Plus" (3 produits fabriques, 3 clients, 3 commandes validees, ~15 OF sur les 5 statuts dont historique 30 jours, 3 utilisateurs demo) + mode `--cleanup`. Active `STOCK_CALCULATE_ON_SHIPMENT` si aucun mode de calcul stock n'est configure (pre-requis stock virtuel). Non packagee (hors manifest makepack)

● Ajoute — Fix transversal stock-aware (#111)

  • **Creation OF conditionnelle au stock** : Creation d'OF uniquement si le stock theorique est insuffisant (economise les OF inutiles). Redistribution FIFO du surplus ferme automatiquement les OF en attente sur le meme produit.

● Ajoute — Fix rattrapage OF pour commandes non expediees (cron backfill)

  • **Cron `backfillMissingProductions()`** (`ProductionUtils`) : detecte les produits `produit_local = 2` en decouvert de stock virtuel (non couvert par la production deja planifiee) demandes par des commandes clients validees/en cours d'expedition non expediees, et cree les OF de rattrapage manquants — comble le trou de reconciliation laisse par une baisse de stock survenant APRES la validation d'une commande (correction d'inventaire, consommation par une commande plus ancienne). Reutilise integralement `computeQtyToProduce()` (stock virtuel + production planifiee, cappe a la demande ouverte consolidee) ; OF de rattrapage global par produit (`fk_commande = NULL`), note privee explicite. Nouveau cronjob `CronBackfillProduction` et constante `PRODUCTIONINTERNE_CRON_BACKFILL_ENABLED` (desactives par defaut), toggle admin, traductions 5 langues.

● Corrige — Story 1-5 : Fixes descripteur module et packaging

  • **Descripteur `$this->const`** : Conversion des 30 constantes du format associatif `['name'=>X, 'type'=>Y, ...]` vers le format numerique `[X, Y, ...]` attendu par le core Dolibarr (toutes versions 18-23). Correction silencieuse depuis v1.0.0 — les valeurs par defaut n'etaient jamais correctement inserees en base.
  • **Fatal error drag & drop** : Ajout de `dol_include_once('/productioninterne/core/constants.php')` dans `production_ajax.php` — corrige `Undefined constant "PRODUCTIONINTERNE_STATUS_VALIDATED"` sur requetes `kanban_move`.
  • **Pages absentes du package (404)** : `production_dashboard.php` (menu DASHBOARD) et `production_pdf_export.php` (export PDF) existaient dans le repo mais n'etaient pas listees dans `build/makepack-productioninterne.conf` — donc absentes du zip et 404 a l'usage. Ajoutees au manifest.
  • **Warnings PHP 8+** : `need_dolibarr_version` et `phpmin` passent de `array(18, 0)` / `array(7, 4)` a `array(18, 0, 0)` / `array(7, 4, 0)` (3 elements attendus par le core).
  • **Package ZIP conforme** : `production_kanban.php` ajoute au `build/makepack-productioninterne.conf`, version 1.3.0 synchronisee dans makepack, utilisation du bon script `generate_module_from_makepack.sh` (format `productioninterne/` racine).
  • **Descriptions DoliStore** : Refonte des 5 langues (fr, en, es, de, it) avec nouveautes v1.3.0 (Kanban + fondation qualite), ancienne v1.2.1 redescendue en h4 historique.
  • **website/version/productioninterne.txt** : Synchronise en 1.3.0.

● Ajoute — Epic 10 : Audit compat Dolibarr 19+/23+ (done 2026-05-17)

  • **Story audit-1 (HIGH, done)** : Migration des 6 occurrences fonctionnelles `$_GET[]` / `$_POST[]` directs dans `class/actions_productioninterne.class.php` vers `GETPOST*()` (filtrage XSS/sanitization natif Dolibarr 17+). 2 derogations legitimes documentees dans `lib/productioninterne.lib.php` (helper `pi_set_const_if_posted` qui necessite `isset($_POST[...])` pour distinguer absent vs vide). **Variables locales `$getId` et `$getAction`** extraites en tete de bloc pour eviter recomputation.
  • **Story audit-2 (MEDIUM, done)** : Migration des 8 occurrences `$user->rights->productioninterne->XXX` dans `lib/productioninterne.lib.php` vers `$user->hasRight('productioninterne', 'XXX')` (API stable Dolibarr 18+). Inclut `pi_check_permission()` qui supporte les variables string. 6 derogations dans `core/modules/modProductionInterne.class.php` lignes 231-311 conservees : ce sont des **strings dans le descripteur de module** evaluees par le core Dolibarr, ne PAS migrer (casserait Dolibarr).
  • Suite **174 tests / 1654 assertions / 0 FAIL** — zero regression.

● Ajoute — Epic 3.5 : Dette technique pre-Epic 4 (done)

  • **Story 3.5.1 (done)** : Robustesse timezone et DST — fix sparkline weekend, bornes `pi_dashboard_week_range()` DST, `LIMIT 10000` defensif, doc D13bis MAIN_TIMEZONE
  • **Story 3.5.2 (done)** : Couverture tests manquante — 5 tests Dashboard nouveaux + 3 refactors strict + helper `cleanProductionFixtures` + mock `makeStrictTranslate` + `docs/TESTING.md` (135 tests / 1440 assertions)
  • **Story 3.5.3 (done)** : Accessibilite WCAG 2.1 AA complete — 3 nouveaux tokens couleur strong (`--pi-color-{warning,success,danger}-strong`) appliques aux 3 violations identifiees (operator-bar warning, operator-bar-overload texte, progress-bar--complete), bloc `@media (prefers-contrast: more)` scope module (bordures `#495057` 9.4:1, sparkline weekend dotted, deadline border, fills outline), breakpoints `@media (max-width: 374px)` (sparkline 14j + KPI compacts) et `@media (max-width: 319px)` (fallback Kanban liste classique), audit consolide `docs/implementation-artifacts/audit-contraste-v130.md` (0 defer), 5 tests `CssAccessibilityTest` (140 tests / 1470 assertions / 0 FAIL), 2 cles i18n `KanbanNarrowViewportFallback` + `SeeClassicList` synchronisees dans les 5 langues
  • **Story 3.5.4 (done)** : Securite et robustesse defensive — 14 defers couverts (d-3.1.9 type-hint constructeur, d-3.1.10 clamp logging KPI, d-2.4.3 D17 IDOR cross-entity shared users, d-3.4.1 guard pi_dashboard_week_range, d-3.5.BH1 pi_set_const_if_posted helper transversal x12 toggles + doc CLAUDE.md, d-3.5.BH3 array_key_exists previousFlag, d-3.5.EC1 flock applicatif race cron, d-3.5.EC5 try/catch \\Throwable, d-3.5.1.BH3 MAIN_TIMEZONE='0' check, d-3.5.1.BH5 setMainTimezone helper 2 refs, d-3.5.1.EC4 validation typo php.ini, d-3.5.2.BH5 cleanProductionFixtures transaction atomique, d-3.5.2.EC4 Reflection check makeStrictTranslate). 3 helpers ajoutes (`pi_set_const_if_posted`, `pi_user_visible_in_entity`, `pi_count_log_patterns`). Nouveau bloc admin/diagnostic "Anomalies KPI". Suite **158 tests / 1517 assertions / 0 FAIL**. Aucun changement metier — story securite/robustesse uniquement.
  • **Story 3.5.5 (done)** : Cleanup, i18n et polish residuel — **13 defers** couverts (7 explicites spec + 6 post-3.5.1/2/3/4) : * **d-3.2.1** fallback aria FR — refactor 2 etages (`DashboardOperatorBarAriaFallback` i18n + structure brute) + cle dans 5 langues * **d-3.2.3** validation parite i18n — `LangFilesParityTest::testAllLangFilesHaveSameKeyCount` (5 langues meme nombre cles) * **d-3.2.4** cosmetique `+0.0%` — helper `pi_format_overload_delta(float)` seuil 1.0 absolu + test 5 cas * **d-3.3.1** `days_late` semantique split — ajout `days_remaining` distinct pour deadline_near, `days_late=0` pour deadline_near, **BREAKING CHANGE MINEUR** — 3 consumers internes migres (production_dashboard, ProductionNotification, productionpdfdashboard) * **d-3.3.3** magic numbers fk_statut — `dol_include_once Commande` + `Commande::STATUS_VALIDATED`/`STATUS_SHIPMENTONPROCESS` (stables Dolibarr 16+) * **d-3.4.2** `'%'` header PDF — cle i18n `Percent=%%` dans 5 langues (echappement sprintf) + suppression ternaire conditionnel * **d-3.5.AA1** trackid Option A documentee — PHPDoc en tete `sendWeeklyDashboardReport()` (audit bounce utile meme mode degraded PDF=null) * **d-3.5.4.F-2/EC20** audit complet wizard+setup — 8 patterns `dolibarr_set_const` wizard.php migres vers `pi_set_const_if_posted` + boucle setup.php migree + 2 canary tests * **d-3.5.4.BH10/F-4** tests IDOR cross-entity runtime — `createCrossEntityFixtures` helper + 2 tests `testHandleAssignOperator*UnsharedUser*` + cleanup strict tearDown * **d-3.5.4.F-9** TimezoneRobustnessTest migration — 5 mutations directes migrees vers `setMainTimezone()` helper * **d-3.5.4.AC#9/11/14** tests runtime — `testTestWeeklyReportRestoresEmptyStringFlag` (4 cas array_key_exists) + canary catch \\Throwable + canary listIdentifiers * **d-3.5.4.EC18 NFS lock** + **d-3.5.4.AC#2 syslog capture** + **d-3.5.3.BH9 list responsive 320+** → **DEFERRED v1.4** (cf `docs/planning-artifacts/deferred-v1.4.md`) * **Audit final `deferred-work.md`** : 27 items annotes (26 RESOLVED + 1 DEFERRED v1.4), **zero orphelin** confirme par `testDeferredWorkHasNoOrphanItems` * Suite **173 tests / 1626 assertions / 0 FAIL / 3 SKIP heriites**. Epic 3.5 dette technique terminee — prerequis Epic 4 satisfaits.
  • **Fix garde globale ORDER_VALIDATE** (commit 1a8d675) — perdue lors du merge stock-aware c4849ec, re-introduite ; 8 paires de doublons OF identifiees + nettoyees en BDD prod

● Ajoute — Epic 4 : Mode Solo artisan (done)

  • **Constante et helper centralise (story 4-1)** : toggle `PRODUCTIONINTERNE_MODE_SOLO` dans une section dediee de `admin/setup.php`, helper `pi_is_solo_mode()` disponible pour tout le module
  • **Masquage des elements multi-operateurs (story 4-2)** : filtre operateur et reassignation masques dans le Kanban, bloc assignation masque sur la fiche OF, nom operateur masque dans la vue cartes, menu Kanban masque en Mode Solo — masquage cote serveur (les donnees ne sont jamais emises dans le DOM) complete par la classe CSS `.pi-solo-mode`
  • **Todo-list simplifiee et auto-assignation (story 4-3)** : en Mode Solo, chaque OF cree manuellement ou automatiquement depuis une commande client est affecte sans etape supplementaire a l'utilisateur unique (`fk_user_assign`)
  • **Detection automatique et suggestion (story 4-4)** : comptage des utilisateurs habilites production (droits directs + herites via groupes), suggestion non bloquante d'activer/desactiver le Mode Solo affichee dans `admin/setup.php`, le wizard et la page diagnostic — jamais d'activation automatique, possibilite d'ignorer la suggestion

● Ajoute — Epic 5 : Infrastructure et deploiement (en cours — story 5-3 documentation en backlog)

  • **Support Docker/Cloudron (story 5-1)** : section dediee dans `docs/INSTALLATION.md` (prerequis, volumes code/data separes, `DOL_DATA_ROOT`, variable `DOL_DOCUMENT_ROOT` pour les tests), test canary garantissant le double fallback `__DIR__`/`DOCUMENT_ROOT` sur toutes les pages du module, validation manuelle sur instance Docker officielle `dolibarr/dolibarr`
  • **Page diagnostic enrichie (story 5-2)** : `admin/diagnostic.php` reorganisee en 4 sections nommees (Environnement, Module, Dependances optionnelles, Donnees) — ajout des checks version PHP/Dolibarr/MySQL-MariaDB, detection du type d'environnement (standard/Docker/Cloudron), statut des modules Stock/Expeditions/BOM, disponibilite de `phpqrcode` (preparation v1.3.1), nombre de lignes de production et de notifications en file d'attente, messages correctifs explicites avec lien d'action
  • **Fix onglet "Documents" jamais affiche sur la fiche OF** : l'onglet etait conditionne a `$conf->document->enabled` (module Dolibarr inexistant, condition erronee par construction) — corrige sur le pattern core (onglet affiche des que l'OF existe, sans dependre d'un module optionnel), badge compteur de fichiers joints
  • **Fix echec d'ecriture des documents joints** : `production_document.php` corrige (4 bugs confirmes en logs) — `$permissiontoadd` desormais defini avant l'inclusion de `actions_builddoc.inc.php` (upload sinon rejete), template natif `document_actions_post_headers.tpl.php` utilise a la place d'un template `_pre_headers` inexistant, formulaire custom limitant l'upload aux images supprime (tous types de fichiers desormais acceptes), `$this->dirs` ajoute au descripteur pour creer `DOL_DATA_ROOT/productioninterne/` a l'activation du module

● Ajoute — Interrupteurs on/off dans la configuration admin

  • **9 reglages Oui/Non convertis en interrupteurs natifs Dolibarr** dans `admin/setup.php` : `ajax_constantonoff()` remplace les menus deroulants `selectyesno` pour `ALLOW_OVERPRODUCTION`, `AUTO_DISTRIBUTE`, `AUTO_CREATE_ON_ORDER`, `ENABLE_BOM_CONSUMPTION`, `AUTO_CREATE_EXPEDITION`, `CRON_PRIORITY_ENABLED`, `CRON_BACKFILL_ENABLED`, `DEBUG`, `ENABLE_SERVICES` — enregistrement immediat au clic, sans bouton Enregistrer. Ecriture explicite de `'0'` (`setzeroinsteadofdel`) pour ne jamais faire revenir silencieusement un reglage a son defaut `'1'` lors de la desactivation. Handler de repli sans JavaScript (lien classique `set_`/`del_`) pour les navigateurs sans JS actif
  • `PRODUCTIONINTERNE_MODE_SOLO` reste un menu deroulant classique avec bouton Enregistrer : son changement declenche une reinitialisation du dismissal de suggestion Mode Solo, effet de bord incompatible avec l'enregistrement AJAX immediat

● Ajoute — Crons pilotes par leur seul parametre admin

  • **Les 6 taches planifiees du module** (`CronRecalculPriority`, `CronProcessNotificationQueue`, `CronCheckDeadlineAlerts`, `CronPurgeFinished`, `CronWeeklyDashboardReport`, `CronBackfillProduction`) passent en `status = 1` (toujours programmees) : chacune est desormais protegee par sa propre garde interne, qui retourne `0` immediatement tant que son parametre admin correspondant est desactive. Le toggle/parametre admin devient donc le seul controle reel — plus besoin d'activer manuellement le job dans "Travaux planifies" apres l'installation ou la mise a jour du module
  • **Alignement automatique des jobs existants** via `init()` a la reactivation du module
  • **Harmonisation du champ `test`** du cron de recalcul des priorites : constante `PRODUCTIONINTERNE_CRON_PRIORITY_ENABLED` utilisee a la place de `$conf->productioninterne->enabled`

● Change

  • Constante `PRODUCTIONINTERNE_MODE_SOLO` ajoutee au descripteur module (index 29) — fondation Epic 4, livree
  • Colonnes v1.3.1 prepositionnees en base (qr_token, production_timer, checklist_data) — preparation Epics 6-8

● Reporte (stories `backlog`)

  • **Story 5-3** : Documentation utilisateur et developpeur (Epic 5)
  • **Epics 6-9** : Reserves pour v1.3.1 (scan QR code, chronometre production, checklists qualite, rapports avances)
  • Voir aussi `docs/planning-artifacts/deferred-v1.4.md` pour les defers explicitement reportes v1.4

v1.2.1

2026-03-30

● Corrige

  • **Fix #99 - Notifications email non fonctionnelles** : Reactive onglet Notifications (desactive par erreur en v1.2.0), reactive onglet Wizard, corrige le mapping du type `cancel` dans les triggers (notification silencieusement ignoree)
  • **Fix priorite trigger** : Priorite par defaut corrigee de 0 a 3 lors de la creation auto d'OF depuis commande (violation CHECK CONSTRAINT 1-5)
  • **Fix doublon index constantes** : Index 24 duplique dans le descripteur module, renumerotation complete
  • **Securite GETPOST email** : Type `alpha` remplace par `email` dans wizard.php et setup.php
  • **Securite CSRF** : Ajout `pi_check_csrf()` sur suppression de masse (production_list) et suppression de ligne (production_lines)
  • **Securite UPDATE entrepot** : Filtre `entity` + garde `fk_entrepot IS NULL` sur auto-correction entrepot (production_cards)
  • **Fix include Docker/Cloudron** : Remplacement chemins relatifs par `__DIR__`-based dans 15 fichiers PHP pour compatibilite Docker/Cloudron/symlink (resolution "Include of main fails" sur Dolibarr v23)

● Ajoute

  • **#55 Widget dashboard** : Box Dolibarr sur la page d'accueil avec compteurs par statut (badges cliquables) et liste des OF urgents/en retard
  • **#61 Masquer productions terminees** : Checkbox pour masquer/afficher les productions terminees et annulees dans la liste, active par defaut
  • **#62 Purge auto** : Suppression automatique des OF termines/annules apres X jours configurable (cron quotidien, 0=desactive par defaut)
  • **Type notification annulation** : Nouveau type `TYPE_PRODUCTION_CANCELLED` avec destinataires, contenu email, constante `PRODUCTIONINTERNE_NOTIFY_ON_CANCEL`
  • **Diagnostic** : 2 nouveaux checks (tables SQL via information_schema, coherence crons actifs vs configuration)

● Modifie

  • **29 constantes** enregistrees dans le descripteur module (index 0-28)
  • **4 crons** enregistres (priorites, notifications, deadlines, purge)
  • **450 cles de traduction** dans 5 langues, 0 doublons (nettoyage 35 doublons, ajout 20 nouvelles cles)
  • **Compatibilite Dolibarr 23+** : picto `.png@module`, ajout `TRIGGER_PREFIX`
  • **Schema SQL** : Documentation du type `production_cancelled` dans la table notifications

v1.2.0

2026-03-17

● Ajoute

  • **Epic 3 - Interface cartes operateur** : Vue cartes production avec bandes de priorite, design tokens CSS, auto-assignation, saisie rapide 2 clics, dispatcher AJAX centralise
  • **Epic 4 - Affectation operateur et priorisation** : Assignation/reassignation operateur, modification manuelle priorite, recalcul automatique par cron, configuration actions 1_step/2_steps
  • **Epic 5 - Automatisation end-to-end** : Integration BOM hybride (consommation matieres premieres), creation automatique expedition apres production (PRODUCTION_CLOSE), expedition automatique a la validation commande (ORDER_VALIDATE)
  • **Epic 6 - Notifications et visibilite** : Refonte systeme notifications email (file d'attente + cron), matrice notifications par profil (3 profils, 6 types), alertes deadline configurable J-X, onglet Production avec avancement global et indicateur production complete
  • **Epic 7 - Configuration et onboarding** : Wizard configuration 4 etapes, page diagnostic sante module, enregistrement constantes manquantes

● Corrige

  • **Fix issue #99** : Constante notifications desynchronisee (NOTIFICATIONS_ENABLED vs ENABLE_NOTIFICATIONS) — cause directe du non-fonctionnement des notifications
  • **Fix admin/notifications.php** : 4 bugs corriges ($form non instancie, recipients_email, require Form manquant, constante desynchronisee)
  • **Fix retry notifications** : Mecanisme retry repare (STATUS_PENDING maintenu jusqu'a 3 tentatives au lieu de STATUS_ERROR au 1er echec)
  • **Securite backtopage** : Protection open redirect ajoutee dans production_agenda.php
  • **Logs DEBUG conditionnes** : Tous les dol_syslog LOG_DEBUG conditionnes a PRODUCTIONINTERNE_DEBUG

● Modifie

  • **27 constantes** enregistrees dans le descripteur module (index 0-26)
  • **555 cles de traduction** dans 5 langues (fr/en/es/de/it) — progression 192 → 555
  • **3 crons** enregistres : recalcul priorites, file notifications, alertes deadline
  • **5 pages admin** : setup.php, notifications.php, wizard.php (nouveau), diagnostic.php (nouveau), about.php

v1.1.5

2026-02-05

✓ Corrigé

  • **Fix #97 - Stock=0 faux positif** : Le stock à zéro ne déclenche plus de faux positif dans la détection des produits à produire - Correction de la condition `< qty` remplacée par `< 0` dans `countLocalProducts()` et `production_tab.php` - Les produits avec stock suffisant ne sont plus affichés comme nécessitant une production
  • **Fix #98 - Filtrage services production** : Correction du filtrage SQL des services selon leur mode d'approvisionnement par défaut - Les services sont maintenant correctement filtrés dans les requêtes de production

› Modifié

  • **Documentation technique** : Réécriture complète de CLAUDE.md avec architecture détaillée
  • **Support client** : Ajout documentation réponse client (Fabian Repp, Würzburg)

v1.1.4

2025-08-19

✓ Corrigé

  • **Limite de surproduction** : Correction du bug empêchant la saisie au-delà de la capacité "par production" - Suppression de l'attribut HTML `max` qui bloquait la saisie dans le formulaire - Transformation de l'erreur bloquante en avertissement pour le type "par_production" - Amélioration du JavaScript pour afficher des avertissements au lieu de forcer des valeurs - Permet maintenant de saisir une quantité supérieure à la limite si nécessaire
  • **Nouvelle clé de traduction** : Ajout de `CapacityExceeded` dans les 5 langues supportées - Message d'avertissement spécifique pour le dépassement de capacité de production

v1.1.3

2025-07-04

✓ Corrigé

  • **Compatibilité Dolibarr 19.x** : Correction critique de compatibilité pour les versions 19.x et antérieures - Remplacement de `getDolGlobalInt()` par `getDolGlobalString()` avec conversion explicite - Assure le fonctionnement sur Dolibarr 16.x à 21.x
  • **Calcul stock virtuel** : Correction majeure du calcul de stock pour l'affichage des productions - Utilisation du stock virtuel (stock réel - réservations) au lieu du stock réel seul - Correction dans `countLocalProducts()` et `production_tab.php` - Les produits avec stock virtuel négatif sont maintenant correctement détectés - L'onglet Production s'affiche et liste correctement les produits à produire

+ Ajouté

  • **Documentation démonstration** : Guide complet pour les vidéos de démonstration avec profils utilisateurs
  • **Script oral multilingue** : Script complet pour vidéo YouTube en 5 langues
  • **Configuration Apache** : Fichiers .htaccess pour sécuriser l'accès au répertoire version

› Modifié

  • **Docker** : Renommage docker-compose-demo.yml vers docker-compose-demo-20.yml pour clarifier la version Dolibarr

v1.1.2

2025-06-30

✓ Corrigé

  • **Onglet Production sur pages expédition** : L'onglet Production s'affiche maintenant correctement sur les pages d'expédition en récupérant automatiquement la commande d'origine
  • **Logique de capacité production** : Refonte complète du système de pré-remplissage et de validation - Production journalière : Calcul intelligent depuis le lancement (jours_écoulés × capacité_journalière) - Par production : Respect de la limite physique par ligne de production - Par période : Respect de la limite temporelle de capacité - Suppression des limites arbitraires hardcodées (999 unités)

› Amélioré

  • **Pré-remplissage intelligent** : Les quantités suggérées sont maintenant calculées selon le type de capacité défini
  • **Validation métier** : Seules les vraies contraintes physiques et temporelles sont appliquées
  • **Messages d'erreur** : Messages explicites différenciant les types de limites (par ligne, par période)

− Supprimé

  • **Scripts obsolètes** : Nettoyage des scripts de correction ponctuels devenus inutiles
  • **Limites artificielles** : Plus de blocage arbitraire pour les productions en millions d'unités

v1.1.1

2025-06-29

✓ Corrigé

  • **🐛 Issue #82 - Conformité package Dolibarr** : - Remplacement de `require_once DOL_DOCUMENT_ROOT . '/custom/productioninterne/'` par `dol_include_once('/productioninterne/')` - Correction de 7 occurrences non conformes aux standards Dolibarr - **Impact** : Respect total des règles de packaging Dolibarr - **Fichiers modifiés** : Tous les fichiers PHP du module
  • **🐛 Issue #83 - Problèmes filtres liste production** : - Ajout de logs de débogage détaillés pour tracer les requêtes de filtrage - Correction logique filtres : vérification `!== '' && != '-1'` pour les select - Amélioration type GETPOST pour les champs de recherche - **Impact** : Traçabilité complète des problèmes de filtrage - **Fichiers modifiés** : `production_list.php`
  • **🐛 Issue #84 - Traductions manquantes interface** : - Ajout clés manquantes : `High`, `Completed` dans les 5 langues - Correction incohérences : `StatusDraft` → `Draft`, etc. - Chargement traductions "main" pour compatibilité - **Impact** : Interface 100% traduite et cohérente - **Fichiers modifiés** : Tous les fichiers `/langs/*/productioninterne.lang`
  • **🖼️ Correction icône productioninterne.png** : - Remplacement icône personnalisée par icône standard Dolibarr `industry` - **Impact** : Suppression erreur chargement image inexistante - **Fichiers modifiés** : `production_list.php`

› Amélioré

  • **🌐 MAJEUR - Réorganisation complète traductions multilingues** : - **Fichier FR** : Réorganisé en 16 sections logiques avec emojis (192 clés) - **Synchronisation 5 langues** : EN, ES, DE, IT suivent structure française - **Suppression doublons** : Élimination clés redondantes dans toutes les langues - **Cohérence parfaite** : 192 clés synchronisées dans FR, EN, ES, DE, IT - **Sections standardisées** : 📋 Module, 🎯 Statuts, 🏭 Productions, ⚙️ Actions, 📊 Données, 🔧 Config, 🔔 Notifications, 🏷️ ExtraFields, 🛠️ Services, 🎛️ Interface, ✅ Confirmations, ❌ Erreurs, 📈 États, 🏷️ Avancée, ⚙️ Options - **Impact** : Architecture traductions parfaitement standardisée et maintenable - **Statistiques finales** : Toutes les langues synchronisées à 192 clés exactement
  • **📋 Documentation technique enrichie** : - Ajout section "CONVENTIONS DE NOMMAGE DOLIBARR 2025" dans CLAUDE.md - Règles strictes : format, encodage, anti-patterns - Commandes de vérification qualité - **Impact** : Prévention régression future, maintenabilité optimale

v1.1.0

2025-06-27

+ Ajouté

  • **Module de production complet pour services** : - Configuration complète dans `admin/setup.php` avec paramètres dédiés aux services - Constante `PRODUCTIONINTERNE_ENABLE_SERVICES` pour activer/désactiver la production sur services - Support des services avec mode d'approvisionnement et gestion de production
  • **Fichier de constantes centralisé** (`core/constants.php`) : - `PRODUCTIONINTERNE_PRODUIT_LOCAL_EXTERNE = '1'` (approvisionnement externe) - `PRODUCTIONINTERNE_PRODUIT_LOCAL_INTERNE = '2'` (fabrication interne)
  • **Nouvel onglet Production sur fiches de commande** : - Interface dédiée remplaçant les colonnes par un onglet complet - Affichage conditionnel uniquement si la commande contient des produits locaux - Badge intelligent indiquant le nombre de produits nécessitant une production - Gestion complète des statuts avec codes couleur Dolibarr - Actions contextuelles (Lancer/Voir production) selon les permissions
  • **Système de valeurs par défaut automatiques** : - Application intelligente détectant les champs vides - Hooks multiples (`formObjectOptions`, `doActions`) pour compatibilité maximale - Configuration centralisée dans l'interface d'administration - Logique spécifique pour chaque extrafield
  • **Gestion flexible de la surproduction** : - Configuration `PRODUCTIONINTERNE_ALLOW_OVERPRODUCTION` (activée par défaut) - Répartition automatique FIFO de l'excédent sur autres ordres en attente - Système intelligent de distribution avec traçabilité complète - Limites basées sur la capacité de production du produit
  • **Documentation et guides** : - Guide utilisateur pour le système de notifications/événements - Documentation des workflows projet dans `PROJECT_RULES.md` - Rapport de validation complet des issues

› Modifié

  • **Migration vers constantes globales** : - Remplacement de toutes les valeurs hardcodées (0/1) par constantes (1/2) - Utilisation uniforme dans tous les fichiers du module - Cohérence totale du code avec les nouvelles valeurs
  • **Refactorisation architecturale majeure** : - Suppression complète du JavaScript (`js/productioninterne.js.php`) - Migration vers CSS pur avec pseudo-éléments pour les badges - Hook PHP `printFieldListValue` propre selon conventions Dolibarr - Réduction de ~690 lignes de code obsolète
  • **Optimisation des performances** : - Requêtes SQL optimisées (INNER JOIN au lieu de LEFT JOIN) - Suppression des logs DEBUG en production - Cache intelligent pour les produits - JavaScript minimal (60 lignes vs 1079 lignes)
  • **Interface utilisateur améliorée** : - Badges CSS purs avec icônes (🏭/🚚) sans JavaScript - Classes unifiées `.badge-externe` et `.badge-interne` - CSS responsive avec adaptation mobile - Transitions et animations CSS natives

✓ Corrigé

  • **Services dans l'onglet production** : Filtrage conditionnel avec badge et cohérence d'affichage
  • **Valeurs par défaut extrafields** : Application correcte sans forcer les produits externes
  • **Script migration SQL** : Suppression des UPDATE forcés préservant les valeurs NULL
  • **Badges produits locaux** : Taille de police corrigée (0.85rem) pour lisibilité
  • **Détection mode édition** : Protection CSS contre application badges en édition
  • **Erreur SQL production_tab.php** : Suppression filtrage `cd.entity` inexistant
  • **Normalisation priorités** : Migration ancien système (0-2) vers nouveau (1-5)
  • **Menu Production** : Position et icône corrigées pour cohérence Dolibarr
  • **Trigger PRODUCT_MODIFY** : Désactivé pour éviter conflits avec pré-remplissage

− Supprimé

  • **JavaScript complet** : Fichier `js/productioninterne.js.php` entièrement supprimé
  • **Classe CSS inutilisée** : `class/cssutils.class.php` (381 lignes)
  • **Hook obsolète** : `printCommonFooter` avec requêtes SQL inutiles
  • **CSS conflictuel** : ~270 lignes d'anciens styles badges
  • **Extrafields obsolètes** : Références à `capacite_production_jour` supprimées

◆ Sécurité

  • **Contrôle strict des valeurs** : Validation des priorités et formulaires
  • **Correction bugs critiques** : Gestion valeurs par défaut et migration SQL

● Technique

  • **Architecture Dolibarr native** : CSS dédié + Hooks PHP standards
  • **Performance optimale** : Toutes optimisations implémentées
  • **Compatibilité maximale** : Support Dolibarr 18.0 → 21.0+
  • **Tests validés** : Workflow complet avec syntaxe PHP et CSS

● Issues GitHub

  • **Milestone v1.1.0** : 10 issues ouvertes, 31 fermées
  • **Milestone v1.2.0** : Nouvelles fonctionnalités planifiées
  • **Documentation complète** : Toutes les issues techniques résolues

v1.0.0

2025-01-06

+ Ajouté

  • **Module ProductionInterne complet** : Structure 100% fonctionnelle
  • **Configuration automatique** : Extrafields produits avec gestion d'erreurs
  • **Classes métier** : ProductionInterne, ProductionLine, ProductionUtils
  • **Support multi-langues** : 5 langues (FR, EN, DE, ES, IT)
  • **Infrastructure GitHub** : Actions CI/CD, templates, auto-releases
  • **Documentation** : CLAUDE.md, spécifications, architecture détaillée

● Infrastructure technique

  • **Base de données** : 2 tables optimisées avec 15+ index
  • **Permissions** : Système granulaire 4 niveaux
  • **Multi-entité** : Support natif environnements multi-sociétés
  • **Traçabilité** : Audit complet avec utilisateurs et dates