Files
Ferme/src/Repository/BovineRepository.php
tristan 5bb0aad620
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
feat: amélioration de l'export inventaire bovin (!51)
| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|                  |                 |

## Description de la PR

## Modification du .env

## Check list

- [ ] Pas de régression
- [ ] TU/TI/TF rédigée
- [ ] TU/TI/TF OK
- [ ] CHANGELOG modifié

Reviewed-on: #51
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-04-28 10:03:50 +00:00

102 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Repository;
use App\Entity\Bovine;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<Bovine>
*/
final class BovineRepository extends ServiceEntityRepository
{
public const AGE_RANGE_OVER_24 = 'over24';
public const AGE_RANGE_BETWEEN_22_AND_24 = 'between22And24';
public const AGE_RANGE_BETWEEN_20_AND_22 = 'between20And22';
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Bovine::class);
}
/**
* Liste des bovins actifs pour l'export inventaire.
*
* @param null|list<string> $ageRanges Si null/vide → tous. Sinon filtre OR sur les tranches d'âge demandées.
*
* @return list<Bovine>
*/
public function findActiveForInventoryExport(?array $ageRanges = null): array
{
$qb = $this->createQueryBuilder('b')
->where('b.exitedAt IS NULL')
->orderBy('b.birthDate', 'ASC')
;
if (null !== $ageRanges && [] !== $ageRanges) {
$orX = $qb->expr()->orX();
foreach ($ageRanges as $idx => $range) {
switch ($range) {
case self::AGE_RANGE_OVER_24:
$orX->add('b.ageMonths >= 24');
break;
case self::AGE_RANGE_BETWEEN_22_AND_24:
$orX->add($qb->expr()->andX('b.ageMonths >= 22', 'b.ageMonths < 24'));
break;
case self::AGE_RANGE_BETWEEN_20_AND_22:
$orX->add($qb->expr()->andX('b.ageMonths >= 20', 'b.ageMonths < 22'));
break;
}
}
if ($orX->count() > 0) {
$qb->andWhere($orX);
}
}
return $qb->getQuery()->getResult();
}
/**
* Compteurs des bovins actifs par tranche d'âge.
*
* @return array{total: int, over24: int, between22And24: int, between20And22: int}
*/
public function getInventoryStats(?int $buildingCaseId = null): array
{
$qb = $this->createQueryBuilder('b')
->select(
'COUNT(b.id) AS total',
'SUM(CASE WHEN b.ageMonths >= 24 THEN 1 ELSE 0 END) AS over24',
'SUM(CASE WHEN b.ageMonths >= 22 AND b.ageMonths < 24 THEN 1 ELSE 0 END) AS between22And24',
'SUM(CASE WHEN b.ageMonths >= 20 AND b.ageMonths < 22 THEN 1 ELSE 0 END) AS between20And22',
)
->where('b.exitedAt IS NULL')
;
if (null !== $buildingCaseId) {
$qb->andWhere('b.buildingCase = :caseId')
->setParameter('caseId', $buildingCaseId)
;
}
$row = $qb->getQuery()->getSingleResult();
return [
'total' => (int) ($row['total'] ?? 0),
'over24' => (int) ($row['over24'] ?? 0),
'between22And24' => (int) ($row['between22And24'] ?? 0),
'between20And22' => (int) ($row['between20And22'] ?? 0),
];
}
}