Skip to content

Commit

Permalink
Export účastníků NSJ (#965)
Browse files Browse the repository at this point in the history
* attendees export

* skip leaders

* export all attendees

* export others
  • Loading branch information
jan-stanek committed Apr 11, 2023
1 parent a072047 commit ab240b2
Show file tree
Hide file tree
Showing 5 changed files with 318 additions and 0 deletions.
26 changes: 26 additions & 0 deletions app/AdminModule/UsersModule/Components/UsersGridControl.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use App\Model\Settings\Queries\SettingIntValueQuery;
use App\Model\Settings\Queries\SettingStringValueQuery;
use App\Model\Settings\Settings;
use App\Model\User\Queries\TroopsByStateQuery;
use App\Model\User\Repositories\UserRepository;
use App\Model\User\User;
use App\Services\AclService;
Expand Down Expand Up @@ -157,6 +158,10 @@ public function createComponentUsersGrid(string $name): DataGrid
$grid->addGroupAction('Načíst členství ze skautIS (admin)')
->onSelect[] = [$this, 'groupUpdateMembership'];

$grid->addToolbarButton('exportNsjAttendees', 'Export NSJ - účastníci');

$grid->addToolbarButton('exportNsjOthers', 'Export NSJ - ostatní');

$grid->addColumnText('displayName', 'admin.users.users_name')
->setSortable()
->setFilterText();
Expand Down Expand Up @@ -868,6 +873,27 @@ public function handleExportSchedules(): void
$this->getPresenter()->sendResponse($response);
}

public function handleExportNsjAttendees(): void
{
$troops = $this->queryBus->handle(new TroopsByStateQuery(TroopApplicationState::PAID));

$response = $this->excelExportService->exportNsjAttendees($troops, 'nsj-ucastnici.xlsx');

$this->getPresenter()->sendResponse($response);
}

public function handleExportNsjOthers(): void
{
$nonRegisteredRole = $this->roleRepository->findBySystemName(Role::NONREGISTERED);
$users = $this->userRepository->findAll()
->filter(static fn (User $u) => $u->getRoles()->count() > 0 && ! $u->isInRole($nonRegisteredRole))
->toArray();

$response = $this->excelExportService->exportNsjOthers($users, 'nsj-ostatni.xlsx');

$this->getPresenter()->sendResponse($response);
}

/**
* Vrátí platební metody jako možnosti pro select. Bez prázdné možnosti.
*
Expand Down
26 changes: 26 additions & 0 deletions app/Model/User/Queries/Handlers/TroopsByStateQueryHandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace App\Model\User\Queries\Handlers;

use App\Model\User\Queries\TroopsByStateQuery;
use App\Model\User\Repositories\TroopRepository;
use App\Model\User\Troop;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;

class TroopsByStateQueryHandler implements MessageHandlerInterface
{
public function __construct(private TroopRepository $troopRepository)
{
}

/**
* @return Collection<int, Troop>
*/
public function __invoke(TroopsByStateQuery $query): Collection
{
return $this->troopRepository->findByState($query->getTroopState());
}
}
17 changes: 17 additions & 0 deletions app/Model/User/Queries/TroopsByStateQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

declare(strict_types=1);

namespace App\Model\User\Queries;

class TroopsByStateQuery
{
public function __construct(private string $troopState)
{
}

public function getTroopState(): string
{
return $this->troopState;
}
}
8 changes: 8 additions & 0 deletions app/Model/User/Repositories/TroopRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ public function findAll(): Collection
return new ArrayCollection($result);
}

/**
* @return Collection<int, Troop>
*/
public function findByState(string $state): Collection
{
return $this->getRepository()->matching(Criteria::create()->where(Criteria::expr()->eq('state', $state)));
}

/**
* @throws NonUniqueResultException
*/
Expand Down
241 changes: 241 additions & 0 deletions app/Services/ExcelExportService.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@

use function implode;
use function preg_replace;
use function str_pad;
use function substr;

use const STR_PAD_LEFT;

/**
* Služba pro export do formátu XLSX.
Expand Down Expand Up @@ -686,6 +690,243 @@ public function exportTroopsList(Collection $troops, string $filename): ExcelRes
return new ExcelResponse($this->spreadsheet, $filename);
}

/**
* @param Troop[] $troops
*/
public function exportNsjAttendees($troops, string $filename): ExcelResponse
{
$sheet = $this->spreadsheet->getSheet(0);

$row = 1;
$column = 1;

$sheet->setCellValue([$column, $row], $this->translator->translate('Jméno'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Příjmení'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Přezdívka'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Datum narození'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Adresa'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(50);

$sheet->setCellValue([$column, $row], $this->translator->translate('E-mail'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(30);

$sheet->setCellValue([$column, $row], $this->translator->translate('Telefon'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

$sheet->setCellValue([$column, $row], $this->translator->translate('Telefon matky'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

$sheet->setCellValue([$column, $row], $this->translator->translate('Telefon otce'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

$sheet->setCellValue([$column, $row], $this->translator->translate('O mně'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Poznámka'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Zdravotní informace'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(50);

$sheet->setCellValue([$column, $row], $this->translator->translate('Role'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

$sheet->setCellValue([$column, $row], $this->translator->translate('Skupina'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

$sheet->setCellValue([$column, $row], $this->translator->translate('Družina'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

$sheet->setCellValue([$column, $row], $this->translator->translate('Kód'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

foreach ($troops as $troop) {
$i = 0;

foreach ($troop->getUsersRoles() as $usersRole) {
$user = $usersRole->getUser();
$i++;

$row++;
$column = 1;

$sheet->setCellValue([$column++, $row], $user->getFirstName());
$sheet->setCellValue([$column++, $row], $user->getLastName());
$sheet->setCellValue([$column++, $row], $user->getNickName());
$sheet->setCellValue([$column++, $row], $user->getBirthdate()->format(Helpers::DATE_FORMAT));
$sheet->setCellValue([$column++, $row], $user->getAddress());
$sheet->setCellValue([$column++, $row], $user->getEmail());
$sheet->setCellValue([$column++, $row], $user->getPhone());
$sheet->setCellValue([$column++, $row], $user->getMotherPhone());
$sheet->setCellValue([$column++, $row], $user->getFatherPhone());
$sheet->setCellValue([$column++, $row], $user->getAbout());
$sheet->setCellValue([$column++, $row], $user->getNote());
$sheet->setCellValue([$column++, $row], $user->getHealthInfo());
$sheet->setCellValue([$column++, $row], $usersRole->getRole()->getName());
$sheet->setCellValue([$column++, $row], $troop->getName());
$sheet->setCellValue([$column++, $row], '');

$code = substr($troop->getVariableSymbolText(), -4) . '-00-'
. str_pad((string) $i, 2, '0', STR_PAD_LEFT);
$sheet->setCellValue([$column++, $row], $code);
}

foreach ($troop->getConfirmedPatrols() as $patrol) {
$i = 0;

foreach ($patrol->getUsersRoles() as $usersRole) {
$user = $usersRole->getUser();
$i++;

$row++;
$column = 1;

$sheet->setCellValue([$column++, $row], $user->getFirstName());
$sheet->setCellValue([$column++, $row], $user->getLastName());
$sheet->setCellValue([$column++, $row], $user->getNickName());
$sheet->setCellValue([$column++, $row], $user->getBirthdate()->format(Helpers::DATE_FORMAT));
$sheet->setCellValue([$column++, $row], $user->getAddress());
$sheet->setCellValue([$column++, $row], $user->getEmail());
$sheet->setCellValue([$column++, $row], $user->getPhone());
$sheet->setCellValue([$column++, $row], $user->getMotherPhone());
$sheet->setCellValue([$column++, $row], $user->getFatherPhone());
$sheet->setCellValue([$column++, $row], $user->getAbout());
$sheet->setCellValue([$column++, $row], $user->getNote());
$sheet->setCellValue([$column++, $row], $user->getHealthInfo());
$sheet->setCellValue([$column++, $row], $usersRole->getRole()->getName());
$sheet->setCellValue([$column++, $row], $troop->getName());
$sheet->setCellValue([$column++, $row], $patrol->getName());

$code = substr($troop->getVariableSymbolText(), -4) . '-'
. substr($patrol->getName(), -2) . '-'
. str_pad((string) $i, 2, '0', STR_PAD_LEFT);
$sheet->setCellValue([$column++, $row], $code);
}
}
}

return new ExcelResponse($this->spreadsheet, $filename);
}

/**
* @param User[] $users
*/
public function exportNsjOthers($users, string $filename): ExcelResponse
{
$sheet = $this->spreadsheet->getSheet(0);

$row = 1;
$column = 1;

$sheet->setCellValue([$column, $row], $this->translator->translate('Jméno'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Příjmení'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Přezdívka'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Datum narození'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Adresa'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(50);

$sheet->setCellValue([$column, $row], $this->translator->translate('E-mail'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(30);

$sheet->setCellValue([$column, $row], $this->translator->translate('O mně'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Poznámka'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(20);

$sheet->setCellValue([$column, $row], $this->translator->translate('Role'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

$sheet->setCellValue([$column, $row], $this->translator->translate('Kód'));
$sheet->getStyle([$column, $row])->getFont()->setBold(true);
$sheet->getColumnDimensionByColumn($column)->setAutoSize(false);
$sheet->getColumnDimensionByColumn($column++)->setWidth(15);

foreach ($users as $user) {
$row++;
$column = 1;

$sheet->setCellValue([$column++, $row], $user->getFirstName());
$sheet->setCellValue([$column++, $row], $user->getLastName());
$sheet->setCellValue([$column++, $row], $user->getNickName());
$sheet->setCellValue([$column++, $row], $user->getBirthdate()->format(Helpers::DATE_FORMAT));
$sheet->setCellValue([$column++, $row], $user->getAddress());
$sheet->setCellValue([$column++, $row], $user->getEmail());
$sheet->setCellValue([$column++, $row], $user->getAbout());
$sheet->setCellValue([$column++, $row], $user->getNote());
$sheet->setCellValue([$column++, $row], $user->getRolesText());
$sheet->setCellValue([$column++, $row], substr($user->getRolesApplication()?->getVariableSymbolText() ?: '', -4));
}

return new ExcelResponse($this->spreadsheet, $filename);
}

/**
* @param Collection<int, Block> $blocks
*
Expand Down

0 comments on commit ab240b2

Please sign in to comment.