Skip to content
Merged
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
1 change: 1 addition & 0 deletions config/packages/backoffice_menu.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ parameters:
url: '/admin/event/billeterie-privee'
extra_routes:
- admin_event_billeterie_privee
- admin_event_billeterie_privee_add
- admin_event_billeterie_privee_edit
- admin_event_billeterie_privee_delete
admin_event_prices:
Expand Down
4 changes: 4 additions & 0 deletions config/routing/admin_event.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ admin_event_billeterie_privee:
path: /billeterie-privee
defaults: {_controller: AppBundle\Controller\Admin\Event\BilleteriePriveeAction}

admin_event_billeterie_privee_add:
path: /billeterie-privee/add
defaults: {_controller: AppBundle\Controller\Admin\Event\AddBilleteriePriveeAction}

admin_event_billeterie_privee_edit:
path: /billeterie-privee/edit/{event}/{id}
defaults: {_controller: AppBundle\Controller\Admin\Event\EditBilleteriePriveeAction}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

declare(strict_types=1);

namespace AppBundle\Controller\Admin\Event;

use AppBundle\Event\AdminEventSelection;
use AppBundle\Event\Entity\BilleteriePrivee;
use AppBundle\Event\Entity\Repository\BilleteriePriveeRepository;
use AppBundle\Event\Form\BilleteriePriveeType;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use DateTimeImmutable;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class AddBilleteriePriveeAction extends AbstractController
{
public function __construct(
private readonly BilleteriePriveeRepository $billeteriePriveeRepository,
private readonly TicketTypeRepository $ticketTypeRepository,
) {}

public function __invoke(Request $request, AdminEventSelection $eventSelection): Response
{
$event = $eventSelection->event;

$billeteriePrivee = new BilleteriePrivee();
$billeteriePrivee->token = base64_encode(random_bytes(30));
$billeteriePrivee->eventId = (int) $event->getId();
$billeteriePrivee->dateDebut = new DateTimeImmutable();
$billeteriePrivee->dateFin = DateTimeImmutable::createFromMutable($event->getDateEndSales());
$billeteriePrivee->createdOn = new DateTimeImmutable();

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

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$motDePasse = $form->get('plainMotDePasse')->getData();
if (is_string($motDePasse) && $motDePasse !== '') {
$billeteriePrivee->motDePasse = password_hash($motDePasse, PASSWORD_DEFAULT);
}

$this->billeteriePriveeRepository->save($billeteriePrivee);

$this->addFlash('notice', 'La billeterie privée a été enregistrée');

return $this->redirectToRoute('admin_event_billeterie_privee', [
'id' => (int) $event->getId(),
]);
}

return $this->render('admin/event/billeterie_privee_edit.html.twig', [
'is_new' => true,
'billeterie_privee' => $billeteriePrivee,
'places_prises' => null,
'event' => $event,
'title' => 'Billeteries privées - Nouvelle',
'edit_title' => 'Nouvelle billeterie privée',
'button_label' => 'Créer',
'form' => $form->createView(),
]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,9 @@
namespace AppBundle\Controller\Admin\Event;

use AppBundle\Event\AdminEventSelection;
use AppBundle\Event\Entity\BilleteriePrivee;
use AppBundle\Event\Entity\Repository\BilleteriePriveeRepository;
use AppBundle\Event\Form\BilleteriePriveeType;
use AppBundle\Event\Model\Repository\TicketTypeRepository;
use DateTimeImmutable;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class BilleteriePriveeAction extends AbstractController
Expand All @@ -21,38 +17,10 @@ public function __construct(
private readonly TicketTypeRepository $ticketTypeRepository,
) {}

public function __invoke(Request $request, AdminEventSelection $eventSelection): Response
public function __invoke(AdminEventSelection $eventSelection): Response
{
$event = $eventSelection->event;

$billeteriePrivee = new BilleteriePrivee();
$billeteriePrivee->token = base64_encode(random_bytes(30));
$billeteriePrivee->eventId = (int) $event->getId();
$billeteriePrivee->dateDebut = new DateTimeImmutable();
$billeteriePrivee->dateFin = DateTimeImmutable::createFromMutable($event->getDateEndSales());
$billeteriePrivee->createdOn = new DateTimeImmutable();

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

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$motDePasse = $form->get('plainMotDePasse')->getData();
if (is_string($motDePasse) && $motDePasse !== '') {
$billeteriePrivee->motDePasse = password_hash($motDePasse, PASSWORD_DEFAULT);
}

$this->billeteriePriveeRepository->save($billeteriePrivee);

$this->addFlash('notice', 'La billeterie privée a été enregistrée');

return $this->redirectToRoute('admin_event_billeterie_privee', [
'id' => (int) $event->getId(),
]);
}

$billeteries = [];
foreach ($this->billeteriePriveeRepository->findByEvent((int) $event->getId()) as $billeterie) {
$ticketType = $this->ticketTypeRepository->get($billeterie->ticketTypeId);
Expand All @@ -67,7 +35,6 @@ public function __invoke(Request $request, AdminEventSelection $eventSelection):
'billeteries_privees' => $billeteries,
'event' => $event,
'title' => 'Billeteries privées',
'form' => $form->createView(),
'event_select_form' => $eventSelection->selectForm(),
]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,12 @@ public function __invoke(Request $request, int $event, int $id): Response
}

return $this->render('admin/event/billeterie_privee_edit.html.twig', [
'is_new' => false,
'billeterie_privee' => $billeteriePrivee,
'places_prises' => $placesPrises,
'event' => $event,
'title' => 'Billeteries privées - Modifier',
'edit_title' => $billeteriePrivee->nom,
'form' => $form->createView(),
]);
}
Expand Down
14 changes: 6 additions & 8 deletions sources/AppBundle/Event/Form/BilleteriePriveeType.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ class BilleteriePriveeType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$ticketTypes = $options['ticketTypes'];
if (!is_array($ticketTypes)) {
throw new \RuntimeException('L\'option ticketTypes doit être un tableau.');
if (!is_iterable($ticketTypes)) {
throw new \RuntimeException('L\'option ticketTypes doit être un itérable.');
}

$builder
Expand All @@ -40,7 +40,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
->add('ticketTypeId', ChoiceType::class, [
'label' => 'Type de place',
'choices' => $this->ticketTypesToChoices($ticketTypes),
'choice_value' => 'id',
'constraints' => [
new NotBlank(),
],
Expand Down Expand Up @@ -97,20 +96,19 @@ public function configureOptions(OptionsResolver $resolver): void
$resolver->setRequired([
'ticketTypes',
]);
$resolver->setAllowedTypes('ticketTypes', 'array');
}

/**
* @param array<array-key, mixed> $ticketTypes
* @return array<string, TicketType>
* @param iterable<mixed> $ticketTypes
* @return array<string, int>
*/
private function ticketTypesToChoices(array $ticketTypes): array
private function ticketTypesToChoices(iterable $ticketTypes): array
{
$choices = [];

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

Expand Down
81 changes: 6 additions & 75 deletions templates/admin/event/billeterie_privee.html.twig
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
{% extends 'admin/base_with_header.html.twig' %}

{% block content %}
<h2>Billeteries privées</h2>
<div class="ui clearing segment">
<div class="ui clearing basic segment">
<h2 class="ui left floated header" style="margin:0">Billeteries privées</h2>
<a href="{{ path('admin_event_billeterie_privee_add') }}" class="ui primary button right floated">Nouvelle billeterie privée</a>
</div>
</div>
{% include 'admin/event/change_event.html.twig' with {form: event_select_form} only %}

{% if billeteries_privees|length > 0 %}
Expand Down Expand Up @@ -57,78 +62,4 @@
</div>
</div>
{% endif %}

<div class="ui segment">
<h2 class="ui header">Nouvelle billeterie privée</h2>

<div class="ui clearing divider"></div>

{{ form_start(form) }}

<table class="ui table striped compact celled">
<thead>
<th>{{ form_label(form.nom) }}</th>
<th>{{ form_label(form.ticketTypeId) }}</th>
<th>{{ form_label(form.prix) }}</th>
<th>{{ form_label(form.maxPlaces) }}</th>
<th>{{ form_label(form.dateDebut) }}</th>
<th>{{ form_label(form.dateFin) }}</th>
<th>{{ form_label(form.plainMotDePasse) }}</th>
<th></th>
</thead>
<tbody>
<tr>
<td>
<div class="ui form">
{{ form_errors(form.nom) }}
{{ form_widget(form.nom) }}
</div>
</td>
<td>
<div class="ui form">
{{ form_errors(form.ticketTypeId) }}
{{ form_widget(form.ticketTypeId) }}
</div>
</td>
<td>
<div class="ui form">
{{ form_errors(form.prix) }}
{{ form_widget(form.prix) }}
</div>
</td>
<td>
<div class="ui form">
{{ form_errors(form.maxPlaces) }}
{{ form_widget(form.maxPlaces) }}
</div>
</td>
<td>
<div class="ui form">
{{ form_errors(form.dateDebut) }}
{{ form_widget(form.dateDebut) }}
</div>
</td>
<td>
<div class="ui form">
{{ form_errors(form.dateFin) }}
{{ form_widget(form.dateFin) }}
</div>
</td>
<td>
<div class="ui form">
{{ form_errors(form.plainMotDePasse) }}
{{ form_widget(form.plainMotDePasse) }}
</div>
</td>
<td>
<button type="submit" class="ui primary button">Enregistrer</button>
</td>
</tr>
</tbody>
</table>

{{ form_errors(form) }}

{{ form_end(form) }}
</div>
{% endblock %}
6 changes: 4 additions & 2 deletions templates/admin/event/billeterie_privee_edit.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
<h2>{{ title }}</h2>
<div class="ui segment">
{{ form_start(form) }}
<h2 class="ui header">{{ billeterie_privee.nom }}</h2>
<h2 class="ui header">{{ edit_title }}</h2>
{% if not is_new|default(false) %}
<p>
Token : {{ billeterie_privee.token }}<br>
{% if places_prises is not null %}
Places déjà prises : {{ places_prises }}
{% endif %}
</p>
{% endif %}
<div class="ui clearing divider"></div>
<div class="ui form">
{{ form_row(form.nom) }}
Expand All @@ -28,7 +30,7 @@
<div class="inline fields ui grid">
<div class="three wide column"></div>
<div class="field nine wide column">
<button type="submit" class="ui primary button">Modifier</button>
<button type="submit" class="ui primary button">{{ button_label|default('Modifier') }}</button>
<a href="{{ path('admin_event_billeterie_privee', {'id': event.id}) }}" class="ui button">Annuler</a>
</div>
</div>
Expand Down
Loading