From 6cf3afef159b3f8448f70f09addc22b6b0e603da Mon Sep 17 00:00:00 2001 From: Nathan Boiron Date: Wed, 28 May 2025 15:11:49 +0200 Subject: [PATCH] Refactor du DTO en readonly --- .../administration/forum_inscriptions.php | 2 +- .../Controller/Admin/Event/StatsAction.php | 2 +- .../AppBundle/Controller/Admin/HomeAction.php | 2 +- sources/AppBundle/Event/Model/EventStats.php | 26 +++------- .../Event/Model/EventStats/DailyStats.php | 13 +++-- .../Model/EventStats/TicketTypeStats.php | 18 ++++--- .../Model/Repository/EventStatsRepository.php | 51 ++++++++++--------- sources/AppBundle/Slack/MessageFactory.php | 4 +- 8 files changed, 54 insertions(+), 64 deletions(-) diff --git a/htdocs/pages/administration/forum_inscriptions.php b/htdocs/pages/administration/forum_inscriptions.php index 2bddacac7..aace5dbf6 100644 --- a/htdocs/pages/administration/forum_inscriptions.php +++ b/htdocs/pages/administration/forum_inscriptions.php @@ -103,7 +103,7 @@ function updateGlobalsForTarif( $smarty->assign('forum_tarifs_lib',$AFUP_Tarifs_Forum_Lib); $smarty->assign('forum_tarifs_restantes', $restantes); $smarty->assign('forum_tarifs',$AFUP_Tarifs_Forum); - $stats = $eventStatsRepository->getStats($_GET['id_forum']); + $stats = $eventStatsRepository->getStats((int) $_GET['id_forum']); $smarty->assign('statistiques', [ 'premier_jour' => [ 'inscrits' => $stats->firstDay->registered, diff --git a/sources/AppBundle/Controller/Admin/Event/StatsAction.php b/sources/AppBundle/Controller/Admin/Event/StatsAction.php index 3b2a266bf..42668300b 100644 --- a/sources/AppBundle/Controller/Admin/Event/StatsAction.php +++ b/sources/AppBundle/Controller/Admin/Event/StatsAction.php @@ -84,7 +84,7 @@ public function __invoke(Request $request): Response ], ]; - $rawStatsByType = $this->eventStatsRepository->getStats($event->getId())->ticketType->paying; + $rawStatsByType = $this->eventStatsRepository->getStats((int) $event->getId())->ticketType->paying; $totalInscrits = array_sum($rawStatsByType); array_walk($rawStatsByType, function (&$item, $key) use (&$ticketTypes, $totalInscrits): void { if (isset($ticketTypes[$key]) === false) { diff --git a/sources/AppBundle/Controller/Admin/HomeAction.php b/sources/AppBundle/Controller/Admin/HomeAction.php index 8c6432131..673aee5a3 100644 --- a/sources/AppBundle/Controller/Admin/HomeAction.php +++ b/sources/AppBundle/Controller/Admin/HomeAction.php @@ -32,7 +32,7 @@ public function __invoke(): Response $cards = []; if ($this->isGranted('ROLE_FORUM') && $nextevents) { foreach ($nextevents as $event) { - $stats = $this->eventStatsRepository->getStats($event->getId()); + $stats = $this->eventStatsRepository->getStats((int) $event->getId()); $info = []; if ($event->lastsOneDay()) { $info['statistics']['entrées'] = $stats->firstDay->registered; diff --git a/sources/AppBundle/Event/Model/EventStats.php b/sources/AppBundle/Event/Model/EventStats.php index c30d57cf9..17b664a3d 100644 --- a/sources/AppBundle/Event/Model/EventStats.php +++ b/sources/AppBundle/Event/Model/EventStats.php @@ -7,25 +7,11 @@ use AppBundle\Event\Model\EventStats\DailyStats; use AppBundle\Event\Model\EventStats\TicketTypeStats; -class EventStats +final readonly class EventStats { - /** - * @var DailyStats - */ - public $firstDay; - /** - * @var DailyStats - */ - public $secondDay; - /** - * @var TicketTypeStats - */ - public $ticketType; - - public function __construct() - { - $this->firstDay = new DailyStats(); - $this->secondDay = new DailyStats(); - $this->ticketType = new TicketTypeStats(); - } + public function __construct( + public DailyStats $firstDay, + public DailyStats $secondDay, + public TicketTypeStats $ticketType, + ) {} } diff --git a/sources/AppBundle/Event/Model/EventStats/DailyStats.php b/sources/AppBundle/Event/Model/EventStats/DailyStats.php index 2bccff31f..9dee87f1e 100644 --- a/sources/AppBundle/Event/Model/EventStats/DailyStats.php +++ b/sources/AppBundle/Event/Model/EventStats/DailyStats.php @@ -4,12 +4,11 @@ namespace AppBundle\Event\Model\EventStats; -class DailyStats +final readonly class DailyStats { - /** @var int */ - public $registered = 0; - /** @var int */ - public $confirmed = 0; - /** @var int */ - public $pending = 0; + public function __construct( + public int $registered, + public int $confirmed, + public int $pending, + ) {} } diff --git a/sources/AppBundle/Event/Model/EventStats/TicketTypeStats.php b/sources/AppBundle/Event/Model/EventStats/TicketTypeStats.php index 22a158ba4..3d1da8766 100644 --- a/sources/AppBundle/Event/Model/EventStats/TicketTypeStats.php +++ b/sources/AppBundle/Event/Model/EventStats/TicketTypeStats.php @@ -4,12 +4,16 @@ namespace AppBundle\Event\Model\EventStats; -class TicketTypeStats +final readonly class TicketTypeStats { - /** @var array */ - public $confirmed = []; - /** @var array */ - public $registered = []; - /** @var array */ - public $paying = []; + public function __construct( + /** @var list */ + public array $confirmed, + + /** @var list */ + public array $registered, + + /** @var list */ + public array $paying, + ) {} } diff --git a/sources/AppBundle/Event/Model/Repository/EventStatsRepository.php b/sources/AppBundle/Event/Model/Repository/EventStatsRepository.php index 7d607ac00..d57b0b15a 100644 --- a/sources/AppBundle/Event/Model/Repository/EventStatsRepository.php +++ b/sources/AppBundle/Event/Model/Repository/EventStatsRepository.php @@ -4,6 +4,7 @@ namespace AppBundle\Event\Model\Repository; +use AppBundle\Event\Model\EventStats\TicketTypeStats; use AppBundle\Event\Model\EventStats; use AppBundle\Event\Model\EventStats\DailyStats; use Assert\Assertion; @@ -13,20 +14,23 @@ class EventStatsRepository { - public const DAY_ONE = 'one'; - public const DAY_TWO = 'two'; - public const DAYS = [self::DAY_ONE, self::DAY_TWO]; + private const DAY_ONE = 'one'; + private const DAY_TWO = 'two'; + private const DAYS = [self::DAY_ONE, self::DAY_TWO]; public function __construct(private readonly Connection $connection) {} - /** - * @param int $eventId - */ - public function getStats($eventId, Datetime $from = null): EventStats + public function getStats(int $eventId, Datetime $from = null): EventStats + { + return new EventStats( + $this->getStatsForDay($eventId, self::DAY_ONE, $from), + $this->getStatsForDay($eventId, self::DAY_TWO, $from), + $this->getStatsForTicketTypes($eventId, $from), + ); + } + + public function getStatsForTicketTypes(int $eventId, ?Datetime $from): TicketTypeStats { - $stats = new EventStats(); - $stats->firstDay = $this->getStatsForDay($eventId, self::DAY_ONE, $from); - $stats->secondDay = $this->getStatsForDay($eventId, self::DAY_TWO, $from); // Nombre de personnes validées par type d'inscription $baseQueryBuilder = $this->connection->createQueryBuilder() ->select('type_inscription', 'COUNT(*) AS c') @@ -45,8 +49,9 @@ public function getStats($eventId, Datetime $from = null): EventStats ->setParameter('states', [AFUP_FORUM_ETAT_REGLE, AFUP_FORUM_ETAT_ATTENTE_REGLEMENT, AFUP_FORUM_ETAT_INVITE], ArrayParameterType::INTEGER) ->executeQuery(); + $confirmed = []; foreach ($statement->fetchAllAssociative() as $row) { - $stats->ticketType->confirmed[$row['type_inscription']] = $row['c']; + $confirmed[$row['type_inscription']] = $row['c']; } $queryBuilder = clone $baseQueryBuilder; @@ -54,8 +59,9 @@ public function getStats($eventId, Datetime $from = null): EventStats ->setParameter('states', [AFUP_FORUM_ETAT_REGLE, AFUP_FORUM_ETAT_ATTENTE_REGLEMENT], ArrayParameterType::INTEGER) ->executeQuery(); + $paying = []; foreach ($statement->fetchAllAssociative() as $row) { - $stats->ticketType->paying[$row['type_inscription']] = $row['c']; + $paying[$row['type_inscription']] = $row['c']; } $queryBuilder = clone $baseQueryBuilder; @@ -63,19 +69,15 @@ public function getStats($eventId, Datetime $from = null): EventStats ->setParameter('states', [AFUP_FORUM_ETAT_ANNULE, AFUP_FORUM_ETAT_ERREUR, AFUP_FORUM_ETAT_REFUSE], ArrayParameterType::INTEGER) ->executeQuery(); + $registered = []; foreach ($statement->fetchAllAssociative() as $row) { - $stats->ticketType->registered[$row['type_inscription']] = $row['c']; + $registered[$row['type_inscription']] = $row['c']; } - return $stats; + return new TicketTypeStats($confirmed, $registered, $paying); } - /** - * @param int $eventId - * @param Datetime|null $from - * - */ - private function getStatsForDay($eventId, string $day, Datetime $from = null): DailyStats + private function getStatsForDay(int $eventId, string $day, ?Datetime $from = null): DailyStats { Assertion::inArray($day, self::DAYS); $baseQueryBuilder = $this->connection->createQueryBuilder() @@ -91,25 +93,24 @@ private function getStatsForDay($eventId, string $day, Datetime $from = null): D ->setParameter('from', $from->getTimestamp()); } - $dailyStats = new DailyStats(); $queryBuilder = clone $baseQueryBuilder; - $dailyStats->registered = $queryBuilder->andWhere('etat NOT IN(:states)') + $registered = $queryBuilder->andWhere('etat NOT IN(:states)') ->setParameter('states', [AFUP_FORUM_ETAT_ANNULE, AFUP_FORUM_ETAT_ERREUR, AFUP_FORUM_ETAT_REFUSE], ArrayParameterType::INTEGER) ->executeQuery() ->fetchOne(); $queryBuilder = clone $baseQueryBuilder; - $dailyStats->confirmed = $queryBuilder->andWhere('etat IN(:states)') + $confirmed = $queryBuilder->andWhere('etat IN(:states)') ->setParameter('states', [AFUP_FORUM_ETAT_REGLE, AFUP_FORUM_ETAT_INVITE, AFUP_FORUM_ETAT_CONFIRME], ArrayParameterType::INTEGER) ->executeQuery() ->fetchOne(); $queryBuilder = clone $baseQueryBuilder; - $dailyStats->pending = $queryBuilder->andWhere('etat = :state') + $pending = $queryBuilder->andWhere('etat = :state') ->setParameter('state', AFUP_FORUM_ETAT_ATTENTE_REGLEMENT) ->executeQuery() ->fetchOne(); - return $dailyStats; + return new DailyStats($registered, $confirmed, $pending); } } diff --git a/sources/AppBundle/Slack/MessageFactory.php b/sources/AppBundle/Slack/MessageFactory.php index 90e3dc6ca..300553fa8 100644 --- a/sources/AppBundle/Slack/MessageFactory.php +++ b/sources/AppBundle/Slack/MessageFactory.php @@ -175,7 +175,7 @@ public function createMessageForGeneralMeeting(GeneralMeetingRepository $general public function createMessageForTicketStats(Event $event, EventStatsRepository $eventStatsRepository, TicketTypeRepository $ticketRepository, \DateTime $date = null): Message { - $eventStats = $eventStatsRepository->getStats($event->getId()); + $eventStats = $eventStatsRepository->getStats((int) $event->getId()); $message = new Message(); $message ->setChannel($event->isAfupDay() ? 'afupday' : 'pole-forum') @@ -184,7 +184,7 @@ public function createMessageForTicketStats(Event $event, EventStatsRepository $ ; if ($date instanceof \DateTime) { - $eventStatsFiltered = $eventStatsRepository->getStats($event->getId(), $date); + $eventStatsFiltered = $eventStatsRepository->getStats((int) $event->getId(), $date); $attachment = new Attachment(); $attachment