Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/services_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ services:
Afup\Tests\Support\Wordpress\FakeWordpressClient: ~
AppBundle\Event\Wordpress\WordpressClient: '@Afup\Tests\Support\Wordpress\FakeWordpressClient'

Afup\Tests\Support\Github\FakeGithubClient: ~
AppBundle\Github\GithubClient: '@Afup\Tests\Support\Github\FakeGithubClient'

AppBundle\Offices\OfficeFinder:
class: AppBundle\Offices\NullOfficeFinder
autowire: true
Expand Down
12 changes: 0 additions & 12 deletions phpstan-baseline.php
Original file line number Diff line number Diff line change
Expand Up @@ -3271,12 +3271,6 @@
'count' => 1,
'path' => __DIR__ . '/sources/AppBundle/Controller/Admin/Event/StatsAction.php',
];
$ignoreErrors[] = [
'message' => '#^Cannot call method getPrettyName\\(\\) on AppBundle\\\\Event\\\\Model\\\\TicketType\\|null\\.$#',
'identifier' => 'method.nonObject',
'count' => 1,
'path' => __DIR__ . '/sources/AppBundle/Controller/Admin/Event/StatsAction.php',
];
$ignoreErrors[] = [
'message' => '#^Parameter \\#1 \\$eventId of method AppBundle\\\\Event\\\\Model\\\\Repository\\\\EventStatsRepository\\:\\:getRegistrationTracking\\(\\) expects int, int\\|null given\\.$#',
'identifier' => 'argument.type',
Expand Down Expand Up @@ -9103,12 +9097,6 @@
'count' => 1,
'path' => __DIR__ . '/sources/AppBundle/Slack/MessageFactory.php',
];
$ignoreErrors[] = [
'message' => '#^Cannot call method getPrettyName\\(\\) on AppBundle\\\\Event\\\\Model\\\\TicketType\\|null\\.$#',
'identifier' => 'method.nonObject',
'count' => 1,
'path' => __DIR__ . '/sources/AppBundle/Slack/MessageFactory.php',
];
$ignoreErrors[] = [
'message' => '#^Cannot call method getTitle\\(\\) on AppBundle\\\\Event\\\\Model\\\\Talk\\|null\\.$#',
'identifier' => 'method.nonObject',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

namespace AppBundle\Command;

use AppBundle\Event\Entity\Repository\TicketTypeRepository;
use AppBundle\Event\Model\Event;
use AppBundle\Event\Model\Repository\EventRepository;
use AppBundle\Event\Model\Repository\EventStatsRepository;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use AppBundle\Notifier\SlackNotifier;
use AppBundle\Slack\MessageFactory;
use Symfony\Component\Console\Command\Command;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
use AppBundle\Event\AdminEventSelection;
use AppBundle\Event\Entity\BilleteriePrivee;
use AppBundle\Event\Entity\Repository\BilleteriePriveeRepository;
use AppBundle\Event\Entity\Repository\TicketTypeRepository;
use AppBundle\Event\Form\BilleteriePriveeType;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use DateTimeImmutable;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
Expand All @@ -33,7 +33,7 @@ public function __invoke(Request $request, AdminEventSelection $eventSelection):
$billeteriePrivee->createdOn = new DateTimeImmutable();

$form = $this->createForm(BilleteriePriveeType::class, $billeteriePrivee, [
'ticketTypes' => $this->ticketTypeRepository->getAll(),
'ticketTypes' => $this->ticketTypeRepository->findAllOrderedById(),
]);

$form->handleRequest($request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use AppBundle\Event\AdminEventSelection;
use AppBundle\Event\Entity\Repository\BilleteriePriveeRepository;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use AppBundle\Event\Entity\Repository\TicketTypeRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

Expand All @@ -23,10 +23,10 @@ public function __invoke(AdminEventSelection $eventSelection): Response

$billeteries = [];
foreach ($this->billeteriePriveeRepository->findByEvent((int) $event->getId()) as $billeterie) {
$ticketType = $this->ticketTypeRepository->get($billeterie->ticketTypeId);
$ticketType = $this->ticketTypeRepository->find($billeterie->ticketTypeId);
$billeteries[] = [
'billeterie_privee' => $billeterie,
'ticket_type' => $ticketType !== null ? $ticketType->getPrettyName() : '',
'ticket_type' => $ticketType !== null ? $ticketType->prettyName : '',
'places_prises' => $this->billeteriePriveeRepository->countPlacesPrisesParToken($billeterie->token),
];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
use AppBundle\Controller\Event\EventActionHelper;
use AppBundle\Event\Entity\BilleteriePrivee;
use AppBundle\Event\Entity\Repository\BilleteriePriveeRepository;
use AppBundle\Event\Entity\Repository\TicketTypeRepository;
use AppBundle\Event\Form\BilleteriePriveeType;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
Expand All @@ -34,7 +34,7 @@ public function __invoke(Request $request, int $event, int $id): Response
$maxPlacesActuelles = $billeteriePrivee->maxPlaces;

$form = $this->createForm(BilleteriePriveeType::class, $billeteriePrivee, [
'ticketTypes' => $this->ticketTypeRepository->getAll(),
'ticketTypes' => $this->ticketTypeRepository->findAllOrderedById(),
'is_edit' => true,
]);

Expand Down
6 changes: 3 additions & 3 deletions sources/AppBundle/Controller/Admin/Event/StatsAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
namespace AppBundle\Controller\Admin\Event;

use AppBundle\Controller\Event\EventActionHelper;
use AppBundle\Event\Entity\Repository\TicketTypeRepository;
use AppBundle\Event\Form\EventCompareSelectType;
use AppBundle\Event\Model\Repository\EventRepository;
use AppBundle\Event\Model\Repository\EventStatsRepository;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
Expand Down Expand Up @@ -78,8 +78,8 @@ public function __invoke(Request $request): Response
$totalInscrits = array_sum($rawStatsByType);
array_walk($rawStatsByType, function (&$item, $key) use (&$ticketTypes, $totalInscrits): void {
if (isset($ticketTypes[$key]) === false) {
$type = $this->ticketTypeRepository->get($key);
$ticketTypes[$key] = $type->getPrettyName();
$type = $this->ticketTypeRepository->find($key);
$ticketTypes[$key] = $type !== null ? $type->prettyName : '';
}
$item = ['name' => $ticketTypes[$key], 'y' => $item / $totalInscrits];
});
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

declare(strict_types=1);

namespace AppBundle\Event\Entity\Repository;

use AppBundle\Doctrine\EntityRepository;
use AppBundle\Event\Entity\TicketType;
use Doctrine\Persistence\ManagerRegistry;

/**
* @extends EntityRepository<TicketType>
*/
final class TicketTypeRepository extends EntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, TicketType::class);
}

/**
* @return list<TicketType>
*/
public function findAllOrderedById(): array
{
/** @var list<TicketType> $ticketTypes */
$ticketTypes = $this->findBy([], ['id' => 'ASC']);

return $ticketTypes;
}
}
95 changes: 95 additions & 0 deletions sources/AppBundle/Event/Entity/TicketType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php

declare(strict_types=1);

namespace AppBundle\Event\Entity;

use AppBundle\Event\Entity\Repository\TicketTypeRepository;
use AppBundle\Event\Model\Ticket;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: TicketTypeRepository::class)]
#[ORM\Table(name: 'afup_forum_tarif')]
class TicketType
{
/**
* Nom technique du tarif utilisé pour les prix sanctuarisés (tokens spéciaux et billetteries privées).
*/
public const string SPECIAL_PRICE_TECHNICAL_NAME = 'SPECIAL_PRICE';

/**
* Noms techniques des tarifs « early bird ».
*/
public const array EARLY_BIRD_TECHNICAL_NAME = ['EARLY_BIRD', 'EARLY_BIRD_AFUP', 'AFUP_DAY_EARLY'];

#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
public int $id;

#[ORM\Column(name: 'technical_name', length: 64, nullable: false)]
public string $technicalName;

#[ORM\Column(name: 'pretty_name', length: 255, nullable: false)]
public string $prettyName;

#[ORM\Column(name: 'public', nullable: false)]
public bool $isPublic;

#[ORM\Column(name: 'members_only', nullable: false)]
public bool $isRestrictedToMembers;

#[ORM\Column(name: 'cfp_submitter_only', nullable: false)]
public bool $isRestrictedToCfpSubmitter;

#[ORM\Column(name: 'default_price', nullable: false)]
public float $defaultPrice;

#[ORM\Column(name: 'active', nullable: false)]
public bool $isActive;

#[ORM\Column(nullable: false)]
public string $day;

public function getLabel(): string
{
return sprintf('%s - %s%s - %s',
$this->technicalName,
$this->prettyName,
$this->isRestrictedToMembers ? ' - (réservé aux membres)' : '',
$this->getPrettyDays(),
);
}

public function isEarly(): bool
{
return in_array($this->technicalName, self::EARLY_BIRD_TECHNICAL_NAME);
}

/**
* @return list<string>
*/
public function getDays(): array
{
return explode(',', $this->day);
}

public function getPrettyDays(): string
{
$days = [];
foreach ($this->getDays() as $day) {
switch ($day) {
case Ticket::DAY_ONE:
$days[] = 'JOUR 1';
break;
case Ticket::DAY_TWO:
$days[] = 'JOUR 2';
break;
default:
break;
}
}

return implode(', ', $days);
}
}
4 changes: 2 additions & 2 deletions sources/AppBundle/Event/Form/BilleteriePriveeType.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace AppBundle\Event\Form;

use AppBundle\Event\Entity\BilleteriePrivee;
use AppBundle\Event\Model\TicketType;
use AppBundle\Event\Entity\TicketType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
Expand Down Expand Up @@ -108,7 +108,7 @@ private function ticketTypesToChoices(iterable $ticketTypes): array

foreach ($ticketTypes as $ticketType) {
if ($ticketType instanceof TicketType) {
$choices[$ticketType->getLabel()] = $ticketType->getId();
$choices[$ticketType->getLabel()] = $ticketType->id;
}
}

Expand Down
12 changes: 7 additions & 5 deletions sources/AppBundle/Event/Form/TicketType.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@
use AppBundle\Antennes\AntenneRepository;
use AppBundle\Association\Genre;
use AppBundle\Event\Entity\BilleteriePrivee;
use AppBundle\Event\Entity\Repository\TicketTypeRepository;
use AppBundle\Event\Model\Repository\EventRepository;
use AppBundle\Event\Model\Repository\TicketEventTypeRepository;
use AppBundle\Event\Model\Repository\TicketSpecialPriceRepository;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use AppBundle\Event\Model\Repository\TicketTypeRepository as TingTicketTypeRepository;
use AppBundle\Event\Model\Ticket;
use AppBundle\Event\Model\TicketEventType;
use AppBundle\Event\Model\TicketSpecialPrice;
Expand Down Expand Up @@ -39,6 +40,7 @@ public function __construct(
private readonly TicketTypeAvailability $ticketTypeAvailability,
private readonly TicketSpecialPriceRepository $ticketSpecialPriceRepository,
private readonly TicketTypeRepository $ticketTypeRepository,
private readonly TingTicketTypeRepository $tingTicketTypeRepository,
private readonly AntenneRepository $antenneRepository,
) {}

Expand Down Expand Up @@ -102,8 +104,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
$choiceLabel = 'ticketType.prettyName';
if ($billeteriePrivee instanceof BilleteriePrivee) {
$filteredEventTickets = $this->createBilleteriePriveeTicketEventType($billeteriePrivee, $filteredEventTickets);
$typeDePlace = $this->ticketTypeRepository->get($billeteriePrivee->ticketTypeId);
$choiceLabel = static fn(): string => $typeDePlace !== null ? $typeDePlace->getPrettyName() : 'Billet';
$typeDePlace = $this->ticketTypeRepository->find($billeteriePrivee->ticketTypeId);
$choiceLabel = static fn(): string => $typeDePlace !== null ? $typeDePlace->prettyName : 'Billet';
}

$formEvent->getForm()->add('ticketEventType', ChoiceType::class, [
Expand Down Expand Up @@ -181,7 +183,7 @@ public function configureOptions(OptionsResolver $resolver): void
*/
private function createSpecialPriceTicketEventType(TicketSpecialPrice $ticketSpecialPrice, array $filteredEventTickets): array
{
$ticketType = $this->ticketTypeRepository->get(Ticket::TYPE_SPECIAL_PRICE);
$ticketType = $this->tingTicketTypeRepository->get(Ticket::TYPE_SPECIAL_PRICE);
if (!$ticketType instanceof \AppBundle\Event\Model\TicketType) {
return $filteredEventTickets;
}
Expand Down Expand Up @@ -209,7 +211,7 @@ private function createSpecialPriceTicketEventType(TicketSpecialPrice $ticketSpe
*/
private function createBilleteriePriveeTicketEventType(BilleteriePrivee $billeteriePrivee, array $filteredEventTickets): array
{
$ticketType = $this->ticketTypeRepository->get(Ticket::TYPE_SPECIAL_PRICE);
$ticketType = $this->tingTicketTypeRepository->get(Ticket::TYPE_SPECIAL_PRICE);
if (!$ticketType instanceof \AppBundle\Event\Model\TicketType) {
return $filteredEventTickets;
}
Expand Down
6 changes: 4 additions & 2 deletions sources/AppBundle/Event/Model/TicketType.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,17 @@

namespace AppBundle\Event\Model;

use AppBundle\Event\Entity\TicketType as DoctrineTicketType;
use CCMBenchmark\Ting\Entity\NotifyProperty;
use CCMBenchmark\Ting\Entity\NotifyPropertyInterface;

class TicketType implements NotifyPropertyInterface
{
use NotifyProperty;

public const string SPECIAL_PRICE_TECHNICAL_NAME = 'SPECIAL_PRICE';
public const array EARLY_BIRD_TECHNICAL_NAME = ['EARLY_BIRD', 'EARLY_BIRD_AFUP', 'AFUP_DAY_EARLY'];
// Constantes portées par l'entité Doctrine AppBundle\Event\Entity\TicketType, source de vérité commune
public const string SPECIAL_PRICE_TECHNICAL_NAME = DoctrineTicketType::SPECIAL_PRICE_TECHNICAL_NAME;
public const array EARLY_BIRD_TECHNICAL_NAME = DoctrineTicketType::EARLY_BIRD_TECHNICAL_NAME;

/**
* @var int
Expand Down
16 changes: 6 additions & 10 deletions sources/AppBundle/Event/Ticket/TicketOffers.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@

namespace AppBundle\Event\Ticket;

use AppBundle\Event\Entity\Repository\TicketTypeRepository;
use AppBundle\Event\Model\Event;
use AppBundle\Event\Model\Repository\TicketEventTypeRepository;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use AppBundle\Event\Model\TicketOffer;
use AppBundle\Event\Model\TicketType;

readonly class TicketOffers
{
Expand All @@ -25,14 +24,11 @@ public function getAllOffersForEvent(Event $event): array
{
$offers = [];

/** @var TicketType[] $ticketTypes */
$ticketTypes = $this->ticketTypeRepository->getAll();
foreach ($ticketTypes as $ticketType) {
$ticketTypeId = $ticketType->getId();
$offers[$ticketTypeId] = new TicketOffer(
$ticketTypeId,
$ticketType->getPrettyName(),
$ticketType->getDefaultPrice(),
foreach ($this->ticketTypeRepository->findAllOrderedById() as $ticketType) {
$offers[$ticketType->id] = new TicketOffer(
$ticketType->id,
$ticketType->prettyName,
$ticketType->defaultPrice,
$event->getSeats(),
);
}
Expand Down
Loading
Loading