WIP
This commit is contained in:
278
docs/CUSTOM_FIELDS_AUDIT_RECOVERY.md
Normal file
278
docs/CUSTOM_FIELDS_AUDIT_RECOVERY.md
Normal file
@@ -0,0 +1,278 @@
|
||||
# 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 `CustomFieldValue` existants restaient lies aux anciens `CustomField`
|
||||
- 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/customFieldId` cote frontend pour `PIECE/PRODUCT`
|
||||
- matching backend plus robuste sur `id`, puis `orderIndex`, 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 :
|
||||
|
||||
```bash
|
||||
php bin/console app:check-missing-custom-field-values
|
||||
```
|
||||
|
||||
Variantes utiles :
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
php bin/console app:check-missing-custom-field-values --recoverable-only
|
||||
```
|
||||
|
||||
Variantes :
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
php bin/console app:restore-piece-custom-field-values <pieceId>
|
||||
```
|
||||
|
||||
Exemple :
|
||||
|
||||
```bash
|
||||
php bin/console app:restore-piece-custom-field-values cl731386df55fcb9e6a01e0a63
|
||||
```
|
||||
|
||||
### 4. Appliquer la restauration pour une piece
|
||||
|
||||
```bash
|
||||
php bin/console app:restore-piece-custom-field-values <pieceId> --apply
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Colonnes Du Listing
|
||||
|
||||
La commande `app:check-missing-custom-field-values` affiche :
|
||||
|
||||
- `Entity` : `piece` ou `composant`
|
||||
- `ID` : identifiant de l'entite
|
||||
- `Name` : nom de l'entite
|
||||
- `Reference` : reference metier si presente
|
||||
- `Category` : nom de la categorie (`ModelType`)
|
||||
- `Field` : nom du champ personnalise attendu par la categorie
|
||||
- `Issue` : `missing` ou `empty`
|
||||
- `Recoverable` : `yes` ou `no`
|
||||
- `Audit 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
|
||||
|
||||
```text
|
||||
piece ... Roulement ... Diametre ... missing ... no
|
||||
```
|
||||
|
||||
Interpretation :
|
||||
- le champ `Diametre` est 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
|
||||
|
||||
```text
|
||||
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 mm` existait
|
||||
|
||||
Conclusion :
|
||||
- cas typique de restauration automatique possible
|
||||
|
||||
### Cas 3
|
||||
|
||||
```text
|
||||
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 :
|
||||
|
||||
1. `empty + yes`
|
||||
2. `missing + yes`
|
||||
3. `empty + no`
|
||||
4. `missing + no`
|
||||
|
||||
Pourquoi :
|
||||
- les `yes` sont les seuls cas recuperables automatiquement
|
||||
- les `empty` indiquent souvent une valeur ecrasee
|
||||
- les `missing no` sont nombreux mais souvent ambigus
|
||||
|
||||
---
|
||||
|
||||
## Procedure Recommandee
|
||||
|
||||
### Etape 1 - Scanner globalement
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
php bin/console app:restore-piece-custom-field-values <pieceId>
|
||||
```
|
||||
|
||||
### Etape 4 - Appliquer uniquement apres verification
|
||||
|
||||
```bash
|
||||
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 = yes` sont candidates a une recuperation automatique fiable
|
||||
|
||||
---
|
||||
|
||||
## Commandes Resumees
|
||||
|
||||
```bash
|
||||
# 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
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user