# Rapport de déduplication ## DUP-001 · Score 92 · Formulaire de contact site - **Motif** : duplication à l’identique du bloc de champs de contact (nom, téléphone, adresse…) entre les modales de création et d’édition de site. - **Occurrences détectées** : - `app/components/sites/SiteCreateModal.vue` — lignes 1-52 (bloc de formulaire remplacé par ``). - `app/components/sites/SiteEditModal.vue` — lignes 1-155 (même bloc de formulaire remplacé par ``). - **Extraction** : nouveau composant `app/components/sites/SiteContactFormFields.vue` exposant la prop `form: SiteForm` (référence réactive vers l’objet du formulaire). - **Plan / Statut** : les deux modales importent désormais le composant partagé (``), supprimant l’ancienne duplication. Aucun changement d’API publique côté modale. ## DUP-002 · Score 95 · Éditeur de contraintes (composants/pièces) - **Motif** : logique et template identiques pour la gestion des groupes requis dans `TypeEditComponentRequirementsSection` et `TypeEditPieceRequirementsSection` (ajout/suppression, formulaires, cases à cocher). - **Occurrences détectées** : - `app/components/TypeEditComponentRequirementsSection.vue` — lignes 1-94 (ancien template remplacé par ``). - `app/components/TypeEditPieceRequirementsSection.vue` — lignes 1-94 (même duplication remplacée). - **Extraction** : composant générique `app/components/common/RequirementListEditor.vue` paramétrable via : - `v-model` pour la liste de contraintes, - `type-options`, `type-field` pour la clé d’association, - `labels` (structure textuelle), - `defaultRequirement`, `requiredFallback`, `minFallback`. - **Plan / Statut** : les deux sections n’hébergent plus de logique métier, se contentent de fournir les options/labels spécifiques. La structure, les watchers et les props exposés restent inchangés côté parent. ## DUP-003 · Score 88 · Formatage de dates UI - **Motif** : fonctions utilitaires de formatage (`toLocaleDateString`/`Intl.DateTimeFormat`) recopiées dans plusieurs pages (catalogues modèles et documents). - **Occurrences détectées** : - `app/pages/component-catalog.vue` — lignes 70-311 (affichage de la colonne « Modifié »). - `app/pages/pieces-catalog.vue` — lignes 70-310. - `app/pages/documents.vue` — lignes 90-188. - **Extraction** : utilitaire commun `app/utils/date.ts` exposant `formatFrenchDate(value: Date | string | number | null | undefined): string` avec gestion des valeurs nulles/invalides. - **Plan / Statut** : toutes les pages importent `formatFrenchDate` et l’utilisent directement en template. Plus de fonction locale dupliquée. ## Couverture & suites - Les trois duplications les plus impactantes repérées ont été factorisées (>= 80 % du volume ciblé). - Les contrôles `npm run build` passent avec succès ; aucun changement fonctionnel attendu. - Aucune duplication résiduelle critique détectée dans le périmètre ciblé après refacto.