Skip to content

Commit aeeafb0

Browse files
authored
Oprava změny kapacity na neomezenou, zobrazení času přihlášení (#790)
1 parent 1c028da commit aeeafb0

File tree

7 files changed

+110
-24
lines changed

7 files changed

+110
-24
lines changed

app/AdminModule/ProgramModule/Components/ProgramAttendeesGridControl.php

+16-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@
1818
use App\Model\Settings\Settings;
1919
use App\Model\User\Commands\RegisterProgram;
2020
use App\Model\User\Commands\UnregisterProgram;
21+
use App\Model\User\Queries\UserRegisteredProgramAtQuery;
2122
use App\Model\User\Repositories\UserRepository;
2223
use App\Model\User\User;
2324
use App\Services\CommandBus;
2425
use App\Services\ISettingsService;
26+
use App\Services\QueryBus;
27+
use App\Utils\Helpers;
2528
use Doctrine\ORM\EntityManagerInterface;
2629
use Doctrine\ORM\QueryBuilder;
2730
use Nette\Application\AbortException;
@@ -56,6 +59,8 @@ class ProgramAttendeesGridControl extends Control
5659

5760
private CommandBus $commandBus;
5861

62+
private QueryBus $queryBus;
63+
5964
private ISettingsService $settingsService;
6065

6166
private EntityManagerInterface $em;
@@ -66,13 +71,15 @@ public function __construct(
6671
UserRepository $userRepository,
6772
Session $session,
6873
CommandBus $commandBus,
74+
QueryBus $queryBus,
6975
ISettingsService $settingsService,
7076
EntityManagerInterface $em
7177
) {
7278
$this->translator = $translator;
7379
$this->programRepository = $programRepository;
7480
$this->userRepository = $userRepository;
7581
$this->commandBus = $commandBus;
82+
$this->queryBus = $queryBus;
7683
$this->settingsService = $settingsService;
7784
$this->em = $em;
7885

@@ -125,7 +132,7 @@ public function createComponentProgramAttendeesGrid(string $name): void
125132
$grid->addColumnText('displayName', 'admin.program.blocks.attendees.column.name')
126133
->setFilterText();
127134

128-
$grid->addColumnText('attends', 'admin.program.blocks.attendees.column.attends', 'pa')
135+
$grid->addColumnText('attends', 'admin.program.blocks.attendees.column.attends')
129136
->setRenderer(function (User $user) {
130137
return $user->isAttendee($this->program)
131138
? $this->translator->translate('admin.common.yes')
@@ -143,7 +150,7 @@ public function createComponentProgramAttendeesGrid(string $name): void
143150
})
144151
->setTranslateOptions();
145152

146-
$grid->addColumnText('alternates', 'admin.program.blocks.attendees.column.alternates', 'pa')
153+
$grid->addColumnText('alternates', 'admin.program.blocks.attendees.column.alternates')
147154
->setRenderer(function (User $user) {
148155
return $user->isAlternate($this->program)
149156
? $this->translator->translate('admin.common.yes')
@@ -161,6 +168,13 @@ public function createComponentProgramAttendeesGrid(string $name): void
161168
})
162169
->setTranslateOptions();
163170

171+
$grid->addColumnDateTime('registeredAt', 'admin.program.blocks.attendees.column.registered_at')
172+
->setRenderer(function (User $user) {
173+
$registeredAt = $this->queryBus->handle(new UserRegisteredProgramAtQuery($user, $this->program));
174+
175+
return $registeredAt === null ? null : $registeredAt->format(Helpers::DATETIME_FORMAT);
176+
});
177+
164178
$grid->setDefaultFilter(['attends' => 'yes'], false);
165179

166180
if ($user->isAllowed(SrsResource::USERS, Permission::MANAGE)) {

app/AdminModule/ProgramModule/Forms/BlockFormFactory.php

+9-6
Original file line numberDiff line numberDiff line change
@@ -269,15 +269,18 @@ public function processForm(Form $form, stdClass $values): void
269269
$subevent = $this->subeventRepository->findImplicit();
270270
}
271271

272-
$category = $values->category !== '' ? $this->categoryRepository->findById($values->category) : null;
273-
$lectors = $this->userRepository->findUsersByIds($values->lectors);
274-
$capacity = $values->capacity !== '' ? $values->capacity : null;
275-
$mandatory = $values->mandatory ? ($values->autoRegistered ? ProgramMandatoryType::AUTO_REGISTERED : ProgramMandatoryType::MANDATORY) : ProgramMandatoryType::VOLUNTARY;
272+
$category = $values->category !== '' ? $this->categoryRepository->findById($values->category) : null;
273+
$lectors = $this->userRepository->findUsersByIds($values->lectors);
274+
$capacity = $values->capacity !== '' ? $values->capacity : null;
275+
$alternatesAllowed = $capacity !== null && $values->alternatesAllowed;
276+
$mandatory = $values->mandatory
277+
? ($values->autoRegistered ? ProgramMandatoryType::AUTO_REGISTERED : ProgramMandatoryType::MANDATORY)
278+
: ProgramMandatoryType::VOLUNTARY;
276279

277280
$blockOld = null;
278281

279282
if ($this->block === null) {
280-
$this->block = new Block($values->name, $values->duration, $capacity, $values->alternatesAllowed, $mandatory);
283+
$this->block = new Block($values->name, $values->duration, $capacity, $alternatesAllowed, $mandatory);
281284
$this->block->setSubevent($subevent);
282285
$this->block->setCategory($category);
283286
$this->block->setLectors($lectors);
@@ -293,7 +296,7 @@ public function processForm(Form $form, stdClass $values): void
293296
$this->block->setLectors($lectors);
294297
$this->block->setDuration($values->duration);
295298
$this->block->setCapacity($capacity);
296-
$this->block->setAlternatesAllowed($values->alternatesAllowed);
299+
$this->block->setAlternatesAllowed($alternatesAllowed);
297300
$this->block->setMandatory($mandatory);
298301
$this->block->setPerex($values->perex);
299302
$this->block->setDescription($values->description);

app/Model/Program/Events/Subscribers/BlockUpdatedEventListener.php

+14-14
Original file line numberDiff line numberDiff line change
@@ -119,24 +119,13 @@ public function __invoke(BlockUpdatedEvent $event): void
119119
}
120120
}
121121

122-
// odhlaseni nahradniku, pokud jsou nahradnici zakazani
123-
if (! $alternatesAllowed && $alternatesAllowedOld) {
124-
foreach ($block->getPrograms() as $program) {
125-
$programAlternates = $this->queryBus->handle(new ProgramAlternatesQuery($program));
126-
127-
foreach ($programAlternates as $user) {
128-
$this->commandBus->handle(new UnregisterProgram($user, $program));
129-
}
130-
}
131-
}
132-
133-
// prihlaseni nahradniku na program, pokud se navysi kapacita
134-
if ($alternatesAllowed && $capacity > $capacityOld) {
122+
// prihlaseni nahradniku na program, pokud se navysi kapacita nebo se zmeni na neomezenou
123+
if ($alternatesAllowedOld && ($capacity > $capacityOld || $capacity === null)) {
135124
foreach ($block->getPrograms() as $program) {
136125
$program = $em->getRepository(Program::class)->find($program->getId(), LockMode::PESSIMISTIC_WRITE);
137126
assert($program instanceof Program);
138127

139-
while ($program->getAttendeesCount() < $capacity) {
128+
while ($capacity === null || $program->getAttendeesCount() < $capacity) {
140129
$user = $this->userRepository->findProgramFirstAlternate($program);
141130
if ($user === null) {
142131
break;
@@ -146,6 +135,17 @@ public function __invoke(BlockUpdatedEvent $event): void
146135
}
147136
}
148137
}
138+
139+
// odhlaseni nahradniku, pokud jsou nahradnici zakazani
140+
if (! $alternatesAllowed && $alternatesAllowedOld) {
141+
foreach ($block->getPrograms() as $program) {
142+
$programAlternates = $this->queryBus->handle(new ProgramAlternatesQuery($program));
143+
144+
foreach ($programAlternates as $user) {
145+
$this->commandBus->handle(new UnregisterProgram($user, $program));
146+
}
147+
}
148+
}
149149
});
150150
}
151151
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Model\User\Queries\Handlers;
6+
7+
use App\Model\Program\Repositories\ProgramApplicationRepository;
8+
use App\Model\User\Queries\UserRegisteredProgramAtQuery;
9+
use DateTimeImmutable;
10+
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
11+
12+
class UserRegisteredProgramAtQueryHandler implements MessageHandlerInterface
13+
{
14+
private ProgramApplicationRepository $programApplicationRepository;
15+
16+
public function __construct(ProgramApplicationRepository $programApplicationRepository)
17+
{
18+
$this->programApplicationRepository = $programApplicationRepository;
19+
}
20+
21+
public function __invoke(UserRegisteredProgramAtQuery $query): ?DateTimeImmutable
22+
{
23+
$programApplication = $this->programApplicationRepository->findByUserAndProgram($query->getUser(), $query->getProgram());
24+
25+
return $programApplication === null ? null : $programApplication->getCreatedAt();
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Model\User\Queries;
6+
7+
use App\Model\Program\Program;
8+
use App\Model\User\User;
9+
10+
class UserRegisteredProgramAtQuery
11+
{
12+
private User $user;
13+
14+
private Program $program;
15+
16+
public function __construct(User $user, Program $program)
17+
{
18+
$this->user = $user;
19+
$this->program = $program;
20+
}
21+
22+
public function getUser(): User
23+
{
24+
return $this->user;
25+
}
26+
27+
public function getProgram(): Program
28+
{
29+
return $this->program;
30+
}
31+
}

app/lang/admin.cs_CZ.neon

+3-2
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ program:
247247
name: "Jméno"
248248
attends: "Účastník"
249249
alternates: "Náhradník"
250+
registered_at: "Čas přihlášení"
250251

251252
action:
252253
register: "Přihlásit"
@@ -371,7 +372,7 @@ users:
371372
users_fee_remaining: "Zbývá doplatit"
372373
users_payment_method: "Platební metoda"
373374
users_variable_symbol: "Variabilní symbol"
374-
users_roles_application_date: "Datum přihlášení"
375+
users_roles_application_date: "Čas přihlášení"
375376
users_last_payment_date: "Datum poslední platby"
376377
users_payment_date: "Zaplaceno dne"
377378
users_application_date: "Odeslání přihlášky"
@@ -423,7 +424,7 @@ users:
423424
users_edit_roles_occupied: "Všechna místa v některé roli jsou obsazena."
424425
users_edit_roles_nonregistered: "Roli \"Nepřihlášený\" není možné nastavit, použijte odhlášení ze semináře."
425426

426-
users_applications_application_date: "Datum přihlášky"
427+
users_applications_application_date: "Čas přihlášení"
427428
users_applications_roles: "Role"
428429
users_applications_subevents: "Podakce"
429430
users_applications_subevents_empty: "Musí být vybrána alespoň jedna podakce."

tests/integration/Program/Commands/SaveBlockHandlerTest.php

+10
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,16 @@ public function testChangeCapacity(): void
456456
$this->assertEquals(2, $program2->getAttendeesCount());
457457
$this->assertEquals(1, $program2->getAlternatesCount());
458458

459+
$blockOld = clone $block;
460+
$block->setCapacity(null);
461+
$block->setAlternatesAllowed(false);
462+
$this->commandBus->handle(new SaveBlock($block, $blockOld));
463+
464+
$this->assertEquals(2, $program1->getAttendeesCount());
465+
$this->assertEquals(0, $program1->getAlternatesCount());
466+
$this->assertEquals(3, $program2->getAttendeesCount());
467+
$this->assertEquals(0, $program2->getAlternatesCount());
468+
459469
$blockOld = clone $block;
460470
$block->setCapacity(1);
461471

0 commit comments

Comments
 (0)