feat : commande de feed des prix bovins depuis un XLSX

- app:feed-bovine-prices <file> [--dry-run]
- Met à jour receivedWeight, pricePerKg et supplier sur les bovins existants (pas de création)
- Strip défensif du préfixe FR
- Supplier introuvable -> bovin updaté avec supplier=null + warning
- Préload des suppliers pour lookup O(1)
- Documentation ajoutée au README

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-27 16:16:31 +02:00
parent 7bf6a36b73
commit b3b7746bc5
2 changed files with 243 additions and 0 deletions

View File

@@ -178,3 +178,62 @@ Pour suivre les logs en temps réel :
- tail -f var/log/dev.log
- tail -f var/log/prod.log
## Feed des prix bovins
Une commande Symfony permet de mettre à jour le **poids à l'arrivée**, le **prix au kilo** et le **fournisseur** des bovins existants à partir d'un fichier XLSX. La commande **ne crée jamais de nouveau bovin** : elle complète seulement ceux déjà présents en BDD.
### Format du fichier XLSX attendu
Pas de ligne d'en-tête, 4 colonnes dans cet ordre :
| Colonne | Champ | Format | Exemple |
|---------|-------|--------|---------|
| A | Numéro national | Avec ou sans préfixe `FR ` (insensible casse) | `FR 7979580026` ou `7979580026` |
| B | Fournisseur | Texte libre, casse ignorée | `TERRENA` |
| C | Poids à l'arrivée (kg) | Entier | `368` |
| D | Prix au kilo | Décimal | `5.7` |
### Comportement
- **Numéro national** : le préfixe `FR` (avec ou sans espace) est retiré s'il est présent. Sinon la valeur est utilisée telle quelle.
- **Bovin introuvable** en BDD → ligne ignorée, log warning à la fin avec aperçu.
- **Fournisseur introuvable** en BDD → le bovin est mis à jour quand même avec `supplier = null`, log warning.
- **Cellules `weight` / `price` vides ou non numériques** → champ non modifié.
- La commande est **idempotente** : peut être relancée sans effet de bord.
### Lancement en dev
Copie le fichier dans la racine du projet (mappée dans le container sous `/var/www/html`), puis :
```bash
# Simulation sans écriture en BDD
docker compose exec php bin/console app:feed-bovine-prices /var/www/html/feed_bovin.xlsx --dry-run
# Persistance effective
docker compose exec php bin/console app:feed-bovine-prices /var/www/html/feed_bovin.xlsx
```
### Lancement en prod
```bash
# 1. Envoyer le fichier sur le serveur
scp feed_bovin.xlsx ferme-prod:/tmp/
# 2. SSH sur le serveur et lancer la commande dans le dossier de l'app
ssh ferme-prod
cd /var/www/ferme
php bin/console app:feed-bovine-prices /tmp/feed_bovin.xlsx --dry-run # vérification
php bin/console app:feed-bovine-prices /tmp/feed_bovin.xlsx # exécution
rm /tmp/feed_bovin.xlsx # nettoyage
```
### Sortie attendue
À la fin, un tableau récapitule :
- Lignes totales lues
- Bovins mis à jour
- Bovins introuvables (avec aperçu des 10 premiers numéros)
- Lignes invalides (numéro national vide)
- Fournisseurs introuvables (avec liste et compte par nom)