# Résolution — base de connaissance support N1 Atoo-Sync

Outil interne : fiches par fonctionnalité × ERP × boutique (statut, emplacement de la donnée, erreurs fréquentes, escalade, réponse type).

Stack : PHP ≥ 8.2 (dév. : 8.4), Symfony 7.4 LTS, Doctrine, MariaDB 10.6+ / MySQL 8.

## Installation (Laragon)

Toutes les commandes se lancent dans le terminal Laragon.

1. **Créer le projet** (le dossier `D:\laragon\www\RESOLUTION` doit être vide ou absent ; sinon le renommer en `RESOLUTION_ancien`) :
   ```
   cd D:\laragon\www
   composer create-project symfony/skeleton:"7.4.*" RESOLUTION
   cd RESOLUTION
   composer require symfony/orm-pack symfony/security-bundle phpoffice/phpspreadsheet
   ```
   À la question « include Docker configuration from recipes? », répondre **n**.

2. **Copier les fichiers du livrable** dans `RESOLUTION\` en remplaçant les existants (`src\`, `config\packages\security.yaml`, `donnees\`, `images\`, `.env.local.exemple`, `README.md`).

3. **Configuration** : copier `.env.local.exemple` en `.env.local`, puis remplacer `APP_SECRET` par la valeur de :
   ```
   php -r "echo bin2hex(random_bytes(16));"
   ```

4. **Base de données** (une seule fois, garantit l'UTF-8 complet pour ✔ ✘ 🛠) :
   ```
   mysql -u root -e "ALTER DATABASE resolution CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
   php bin/console doctrine:migrations:diff
   php bin/console doctrine:migrations:migrate
   php bin/console doctrine:schema:validate
   ```

5. **Import de la matrice** (copier `Flux-Atoo.xlsx` dans `donnees\`) :
   ```
   php bin/console app:import:matrice donnees/Flux-Atoo.xlsx --simulation
   php bin/console app:import:matrice donnees/Flux-Atoo.xlsx
   ```

6. **Premier compte** :
   ```
   php bin/console app:utilisateur:creer admin "Prénom Nom" admin
   ```
   Rôles : `lecteur` (N1), `editeur` (N2), `admin`. Modifier un compte : ajouter `--modifier`.

## Pages de lecture (étape 2)

Paquets supplémentaires (une seule fois) :
```
composer require symfony/twig-bundle symfony/asset symfony/apache-pack
```
Pour `symfony/apache-pack`, répondre **y** à « Do you want to execute this recipe? » (crée `public/.htaccess`).

Contrôles :
```
php bin/console lint:twig templates
php bin/console lint:container
php bin/console debug:router
```

Ouvrir le site, au choix :
- serveur PHP intégré (le plus simple) : `php -S 127.0.0.1:8000 -t public`, puis http://127.0.0.1:8000/
- Apache de Laragon : http://localhost/RESOLUTION/public/

Pages : `/` (liste filtrée) et `/fonctionnalite/F001` (fiche). Le choix ERP + boutique est mémorisé un an dans un cookie.

## Édition (étape 3)

Paquets supplémentaires (une seule fois, **avant** de copier les fichiers) :
```
composer require symfony/form symfony/validator symfony/security-csrf
php bin/console cache:clear
```
Aucune migration : le schéma ne change pas.

Pages :
- `/edition` : suivi des fiches par état (à compléter / à relire / validée) ;
- `/edition/fonctionnalite/F001` : contenu rédigé, emplacements, statuts manuels, cas particuliers ERP × boutique ;
- `/edition/saisie-rapide` : tableau chemin + champ pour le couple ERP / boutique choisi.

**Attention** : l'édition n'est pas encore protégée par mot de passe. Ne pas installer sur le serveur partagé avant l'étape « comptes ».

Si la saisie rapide perd des lignes sur un très grand tableau, augmenter `max_input_vars` dans `php.ini` (1000 par défaut, environ 5 champs par ligne) ou filtrer par donnée.

## Captures et duplication (étape 3b)

Paquet supplémentaire (une seule fois) :
```
composer require symfony/mime
```
Vérifier que `.env.local` contient le dossier des captures (créé automatiquement au premier envoi) :
```
DOSSIER_IMAGES="D:/laragon/www/RESOLUTION/images"
```
Dans `php.ini`, `upload_max_filesize` et `post_max_size` doivent valoir au moins `8M`, puis redémarrer Laragon.

- Capture : depuis le formulaire d'un emplacement (Modifier). Rangement automatique : `images/<logiciel>/<version>/<logiciel>_<titre>_<version>.png`.
- Une capture n'est visible des N1 que si la case « aucune donnée client » est cochée.
- Dupliquer : lien « Dupliquer » sur chaque emplacement (vers une autre fonctionnalité, un autre logiciel ou une autre version).
- Préremplir une fiche depuis une autre : en haut du formulaire « Contenu de la fiche » (champs vides seulement, rien n'est enregistré sans « Enregistrer »).

## Zones numérotées (étape 4)

Aucun paquet ni migration supplémentaire.

- Menu **Captures** : toutes les captures, par logiciel, avec le nombre de zones et d'emplacements.
- Page d'une capture : cliquer-glisser sur l'image pour dessiner une zone, saisir son libellé, réordonner (↑ ↓), supprimer (✕).
- En bas de la même page : pour chaque fonctionnalité qui utilise la capture, choisir la zone à surligner sur la fiche N1 (« Toutes » = toutes les zones avec légende).
- Une capture ne peut être supprimée (avec son fichier) que si plus aucun emplacement ne l'utilise.

## Champs techniques (étape 4b)

Ajout de deux colonnes à `emplacement` (table et champ technique). Migration :
```
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
php bin/console doctrine:schema:validate
```
La saisie rapide envoie environ 10 champs par ligne. Dans `php.ini`, mettre `max_input_vars = 5000`, puis redémarrer Laragon.
Si la limite est dépassée, la page refuse l'enregistrement (rien n'est enregistré à moitié).

## Import Moodle, suggestions, lexique (étape 5)

Nouvelles tables `champ_logiciel`, `lexique`, `suggestion_ignoree`. Migration :
```
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
```
Import (rejouable ; lit uniquement les tables de glossaire du fichier, jamais les comptes Moodle) :
```
php bin/console app:import:moodle "D:\chemin\vers\moodle.sql" --simulation
php bin/console app:import:moodle "D:\chemin\vers\moodle.sql"
```
Options : `--glossaire-champs="Wiki Wise Up Skate"` `--logiciel=sage100` `--glossaire-lexique="Wiki Atoo-Sync GesCom"` (valeurs par défaut).
Ne pas copier l'export Moodle dans le dossier du site ; le supprimer une fois l'import fait.

- **Suggestions** (`/edition/suggestions`) : propose des champs pour chaque fonctionnalité sans emplacement ; Accepter crée un emplacement « Non vérifié » avec la source Moodle, Ignorer ne la propose plus.
- **Dictionnaire** (`/edition/dictionnaire`) : compléter la table technique, ligne à ligne ou par préfixe.
- **Saisie assistée** : taper un code (ex. `AR_Ref`) dans « Champ technique » remplit les cases vides.
- **Lexique** (`/lexique`) : consultable par les N1, avec filtre.

## Paramétrage, pagination, thème sombre (étape 5b)

Nouvelle table `capture_parametrage` et colonne `ecran.categorie`. Migration :
```
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
```
- Fiche d'édition, section **Paramétrage (captures)** : captures Atoo-Sync (par ERP) et module boutique (par boutique), plusieurs par fiche, ordonnées, avec légende. Rangées dans `images/atoosync/<erp>/…` et `images/module/<boutique>/…`.
- Saisie rapide : 20 lignes par page (« Enregistrer et page suivante »).
- Thème sombre par défaut ; bouton « ◐ Thème » pour le clair (mémorisé par navigateur).

## Mise à jour

- **Nouvelle version de la matrice** : remplacer `donnees\Flux-Atoo.xlsx`, lancer l'import avec `--simulation`, lire le rapport, puis sans `--simulation`.
  L'import ne modifie que flux, donnée, type, libellé, statuts d'origine « import » et notes. Il ne supprime rien.
- **Nouvelle version du code** : copier les fichiers, puis
  ```
  composer install
  php bin/console doctrine:migrations:migrate
  php bin/console cache:clear
  ```

## Règles de contenu

- Statut d'un couple ERP × boutique : exception saisie si elle existe, sinon le plus restrictif (✘ > 🛠 > ✔). Si un seul côté est renseigné, on le prend et la fiche le signale.
- Toute information technique (emplacement, erreur, exception) a une **source** obligatoire et un état « Non vérifié / Vérifié ».
- Aucune donnée client réelle : tickets = numéro + résumé anonymisé ; captures marquées « anonymisée » avant affichage aux N1.

## Passage sur le serveur interne

Copier le projet, créer un `.env.local` propre au serveur (`APP_ENV=prod`, accès base, `DOSSIER_IMAGES`), puis :
```
composer install --no-dev --optimize-autoloader
php bin/console doctrine:migrations:migrate
php bin/console cache:clear
```
La racine web doit pointer sur `RESOLUTION\public`.
