feat : modal d'export inventaire avec filtres par tranches d'âge

- UiModal : composant générique réutilisable (teleport, escape, backdrop, max-width configurable)
- InventoryExportModal : 3 checkboxes pour les tranches d'âge, footer centré sans annuler
- BovineRepository::findActiveForInventoryExport(?array $ageRanges) en DQL
- Endpoint inventory-export accepte ageRanges (comma-separated) en query param
- Aucune coche = export complet (comportement actuel intact)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 10:13:30 +02:00
parent 19a29f854e
commit 8eebb63626
5 changed files with 265 additions and 13 deletions

View File

@@ -7,8 +7,8 @@ namespace App\State\Bovin;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Entity\Bovine;
use App\Repository\BovineRepository;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
@@ -16,6 +16,7 @@ use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
/**
@@ -46,19 +47,17 @@ final class BovineInventoryExportProvider implements ProviderInterface
private const COLUMN_WIDTHS = [18, 12, 10, 12, 12, 12, 30, 8, 12];
public function __construct(
private EntityManagerInterface $em,
private BovineRepository $bovineRepository,
private RequestStack $requestStack,
) {}
public function provide(Operation $operation, array $uriVariables = [], array $context = []): Response
{
$bovines = $this->em->createQueryBuilder()
->select('b')
->from(Bovine::class, 'b')
->where('b.exitedAt IS NULL')
->orderBy('b.birthDate', 'ASC')
->getQuery()
->getResult()
;
$request = $this->requestStack->getCurrentRequest();
$raw = (string) ($request?->query->get('ageRanges') ?? '');
$ageRanges = '' === $raw ? [] : array_values(array_filter(array_map('trim', explode(',', $raw))));
$bovines = $this->bovineRepository->findActiveForInventoryExport($ageRanges);
$spreadsheet = $this->buildSpreadsheet($bovines);
$body = $this->renderXlsx($spreadsheet);