- Ajout page infrastructure/bovine avec CRUD - Refacto BuildingCase (suppression Statut, simplification) - Commande EnrichBovinesCommand pour enrichir les données bovins - 4 migrations Doctrine - Mise à jour composables shipment/weighing - Mise à jour README et CHANGELOG Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
100 lines
3.0 KiB
PHP
100 lines
3.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Command;
|
|
|
|
use App\Entity\Bovine;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Malio\EdnotifBundle\Bovin\Api\BovinApiInterface;
|
|
use Symfony\Component\Console\Attribute\AsCommand;
|
|
use Symfony\Component\Console\Command\Command;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
|
use Throwable;
|
|
|
|
use function count;
|
|
|
|
#[AsCommand(
|
|
name: 'app:enrich-bovines',
|
|
description: 'Enrichit les bovins existants avec les données EdNotif (n° travail, date naissance, race).'
|
|
)]
|
|
class EnrichBovinesCommand extends Command
|
|
{
|
|
public function __construct(
|
|
private readonly EntityManagerInterface $entityManager,
|
|
private readonly BovinApiInterface $bovinApi,
|
|
) {
|
|
parent::__construct();
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
{
|
|
$io = new SymfonyStyle($input, $output);
|
|
|
|
$bovines = $this->entityManager->getRepository(Bovine::class)->findBy(['workNumber' => null]);
|
|
|
|
if (0 === count($bovines)) {
|
|
$io->success('Tous les bovins sont déjà enrichis.');
|
|
|
|
return Command::SUCCESS;
|
|
}
|
|
|
|
$io->info(sprintf('%d bovin(s) à enrichir.', count($bovines)));
|
|
|
|
$enriched = 0;
|
|
$failed = 0;
|
|
|
|
foreach ($bovines as $bovine) {
|
|
try {
|
|
$animalFile = $this->bovinApi->getAnimalFile(
|
|
nationalNumber: $bovine->getNationalNumber(),
|
|
countryCode: 'FR',
|
|
);
|
|
$identification = $animalFile->identification;
|
|
|
|
if (null === $identification) {
|
|
$io->warning(sprintf(' %s — pas d\'identification retournée.', $bovine->getNationalNumber()));
|
|
++$failed;
|
|
|
|
continue;
|
|
}
|
|
|
|
$bovine->setWorkNumber($identification->workNumber);
|
|
$bovine->setBirthDate($identification->birthDate?->date);
|
|
$bovine->setBreedCode($this->normalizeBreedCode($identification->breedType));
|
|
|
|
++$enriched;
|
|
$io->text(sprintf(' ✓ %s → n° travail %s', $bovine->getNationalNumber(), $identification->workNumber ?? '—'));
|
|
} catch (Throwable $e) {
|
|
++$failed;
|
|
$io->warning(sprintf(' %s — erreur : %s', $bovine->getNationalNumber(), $e->getMessage()));
|
|
}
|
|
}
|
|
|
|
$this->entityManager->flush();
|
|
|
|
$io->success(sprintf('%d enrichi(s), %d échoué(s).', $enriched, $failed));
|
|
|
|
return Command::SUCCESS;
|
|
}
|
|
|
|
private function normalizeBreedCode(mixed $breedType): ?string
|
|
{
|
|
if (null === $breedType) {
|
|
return null;
|
|
}
|
|
|
|
if (is_numeric($breedType)) {
|
|
return (string) $breedType;
|
|
}
|
|
|
|
if (is_string($breedType) && preg_match('/\d+/', $breedType, $matches)) {
|
|
return $matches[0];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|