6.8 KiB
Champs Personnalises - Diagnostic Et Recuperation
Date : 2026-03-23
Contexte
Un bug sur la sauvegarde des categories (ModelType) pouvait recreer des definitions de champs personnalises avec de nouveaux IDs.
Effet de bord :
- les
CustomFieldValueexistants restaient lies aux anciensCustomField - puis etaient supprimes en cascade
- resultat visible : apres modification d'une categorie, certaines valeurs de champs perso disparaissaient
Le correctif preventif a ete fait :
- conservation des
id/customFieldIdcote frontend pourPIECE/PRODUCT - matching backend plus robuste sur
id, puisorderIndex, puis nom
Ce document couvre uniquement :
- comment detecter ce qui manque
- comment lire le listing
- comment identifier ce qui est recuperable depuis l'audit
- comment restaurer proprement
Commandes Disponibles
1. Lister tous les champs perso manquants ou vides
Dans le conteneur :
php bin/console app:check-missing-custom-field-values
Variantes utiles :
php bin/console app:check-missing-custom-field-values --entity=piece
php bin/console app:check-missing-custom-field-values --entity=composant
php bin/console app:check-missing-custom-field-values --max-rows=1000
php bin/console app:check-missing-custom-field-values --limit=500 --max-rows=1000
2. Afficher uniquement les cas recuperables depuis l'audit
php bin/console app:check-missing-custom-field-values --recoverable-only
Variantes :
php bin/console app:check-missing-custom-field-values --entity=piece --recoverable-only
php bin/console app:check-missing-custom-field-values --entity=composant --recoverable-only
php bin/console app:check-missing-custom-field-values --recoverable-only --max-rows=1000
3. Dry-run de restauration pour une piece
php bin/console app:restore-piece-custom-field-values <pieceId>
Exemple :
php bin/console app:restore-piece-custom-field-values cl731386df55fcb9e6a01e0a63
4. Appliquer la restauration pour une piece
php bin/console app:restore-piece-custom-field-values <pieceId> --apply
Colonnes Du Listing
La commande app:check-missing-custom-field-values affiche :
Entity:pieceoucomposantID: identifiant de l'entiteName: nom de l'entiteReference: reference metier si presenteCategory: nom de la categorie (ModelType)Field: nom du champ personnalise attendu par la categorieIssue:missingouemptyRecoverable:yesounoAudit value: derniere valeur non vide retrouvee dans l'audit si disponible
Signification Des Statuts
missing
Il n'existe actuellement aucune ligne CustomFieldValue pour ce champ sur l'entite.
Cela peut vouloir dire :
- la valeur n'a jamais ete saisie
- la valeur a ete perdue lors du bug
- le champ a ete ajoute plus tard sur la categorie sans initialisation des anciennes entites
empty
La ligne CustomFieldValue existe, mais sa valeur est vide.
Cela est plus suspect qu'un missing, mais ne prouve pas a lui seul une perte.
Recoverable = yes
L'audit contient au moins une ancienne valeur non vide pour ce champ.
En pratique :
- c'est le signal le plus utile
- ce sont les cas a traiter en priorite
- ces cas sont potentiellement restaurables automatiquement
Recoverable = no
L'audit de cette entite ne contient pas de valeur non vide exploitable pour ce champ.
Cela ne veut pas forcement dire qu'il n'y a jamais eu de valeur. Cela veut simplement dire :
- rien de recuperable n'a ete trouve dans les logs d'audit consultes
Lecture Des Cas Typiques
Cas 1
piece ... Roulement ... Diametre ... missing ... no
Interpretation :
- le champ
Diametreest attendu sur cette piece - aucune valeur n'existe actuellement
- l'audit ne permet pas de retrouver une ancienne valeur
Conclusion :
- non recuperable automatiquement
- a verifier metierement si la valeur a deja existe ou non
Cas 2
piece ... Arbre ... Diametre ... empty ... yes ... 35 mm
Interpretation :
- une ligne de valeur existe mais elle est vide
- l'audit montre qu'une ancienne valeur
35 mmexistait
Conclusion :
- cas typique de restauration automatique possible
Cas 3
piece ... Joint ... Matiere ... missing ... yes ... NBR
Interpretation :
- la valeur n'existe plus du tout
- l'audit permet de retrouver
NBR
Conclusion :
- forte probabilite de perte historique
- recuperable automatiquement
Priorisation Recommandee
Ordre de traitement conseille :
empty + yesmissing + yesempty + nomissing + no
Pourquoi :
- les
yessont les seuls cas recuperables automatiquement - les
emptyindiquent souvent une valeur ecrasee - les
missing nosont nombreux mais souvent ambigus
Procedure Recommandee
Etape 1 - Scanner globalement
php bin/console app:check-missing-custom-field-values --recoverable-only --max-rows=1000
Etape 2 - Identifier les pieces prioritaires
Chercher :
- les pieces les plus critiques metierement
- les categories fortement touchees (
Roulement,Joint,Arbre, etc.) - les cas avec valeur d'audit explicite
Etape 3 - Faire un dry-run piece par piece
php bin/console app:restore-piece-custom-field-values <pieceId>
Etape 4 - Appliquer uniquement apres verification
php bin/console app:restore-piece-custom-field-values <pieceId> --apply
Limites Actuelles
Ce qui est pris en charge
- diagnostic global sur les
pieces - diagnostic global sur les
composants - restauration automatique ciblee sur les
pieces
Ce qui n'est pas encore automatise
- restauration automatique en masse
- restauration automatique des
composants - reconstitution si l'audit ne contient aucune ancienne valeur exploitable
Interpretation Metier
Le listing global ne doit pas etre lu comme :
"866 valeurs ont ete perdues"
Il doit etre lu comme :
"866 couples entite/champ sont actuellement manquants ou vides par rapport aux definitions de categories"
Parmi eux :
- certains n'ont jamais ete renseignes
- certains ont probablement ete perdus
- seuls les cas
Recoverable = yessont candidates a une recuperation automatique fiable
Commandes Resumees
# Tout lister
php bin/console app:check-missing-custom-field-values
# Afficher uniquement les cas recuperables
php bin/console app:check-missing-custom-field-values --recoverable-only
# Scanner seulement les pieces
php bin/console app:check-missing-custom-field-values --entity=piece --recoverable-only
# Scanner seulement les composants
php bin/console app:check-missing-custom-field-values --entity=composant --recoverable-only
# Dry-run de restauration d'une piece
php bin/console app:restore-piece-custom-field-values <pieceId>
# Application reelle
php bin/console app:restore-piece-custom-field-values <pieceId> --apply