Obvody/app/Presentation/Obvod/ObvodPresenter.php

217 lines
7.5 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Presentation\Obvod;
use App\Model\ObvodFacade;
use App\Model\ZaznamFacade;
use Nette;
use Nette\Application\UI\Form;
use Nette\Application\UI\Multiplier;
use Nette\Utils\ArrayHash;
final class ObvodPresenter extends Nette\Application\UI\Presenter
{
private string $skupina = '';
public function __construct(
private ObvodFacade $obvod,
private ZaznamFacade $zaznam
) {
}
public function beforeRender(): void
{
}
public function actionList(?string $skupina = null): void
{
$this->skupina = $this->obvod->vyberSkupinu(
$skupina,
$this->getHttpRequest()->getCookie(ObvodFacade::SKUPINA_COOKIE),
);
if ($skupina !== null && $skupina === $this->skupina && $this->skupina !== '') {
$this->getHttpResponse()->setCookie(ObvodFacade::SKUPINA_COOKIE, $this->skupina, '+1 year', '/');
}
}
public function renderList(): void
{
$this->template->skupina = $this->skupina;
$this->template->skupiny = $this->obvod->getSkupiny();
$this->template->obvody = $this->obvod->getObvody($this->skupina);
}
public function renderView(int $id = null): void
{
$this->template->obvod = $this->obvod->getObvod($id);
$this->template->zaznamy = $this->zaznam->getZaznamyObvodu($id);
$this->template->zvestovateleJson = json_encode(
array_values($this->zaznam->getZvestovatele()),
JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_THROW_ON_ERROR
);
$this->template->otevrene = $id === null ? [] : $this->zaznam->getOtevrene($id);
}
protected function createComponentPridelitForm(): Form
{
$form = new Form;
$form->addText('zvestovatel', 'Zvěstovatel')
->setRequired('Zadejte zvěstovatele.')
->setMaxLength(100);
$form->addDate('datum', 'Datum přidělení')
->setRequired('Zadejte datum přidělení.')
->setDefaultValue(new \DateTimeImmutable('today'));
$form->addSubmit('send', 'Přidělit');
$form->addProtection('Platnost formuláře vypršela, odešlete ho znovu.');
$form->onSuccess[] = $this->pridelitFormSucceeded(...);
return $form;
}
private function pridelitFormSucceeded(Form $form, ArrayHash $values): void
{
$id = $this->obvodId();
$jmeno = trim((string) $values->zvestovatel);
if ($jmeno === '') {
$form->addError('Zadejte zvěstovatele.');
return;
}
if (mb_strlen($jmeno) > 100) {
$form->addError('Jméno zvěstovatele je příliš dlouhé.');
return;
}
$this->zaznam->pridej($id, $jmeno, $this->den($values->datum));
$this->flashMessage('Obvod byl přidělen.');
$this->redirect('this');
}
protected function createComponentVratitForm(): Form
{
$form = new Form;
$polozky = [];
foreach ($this->zaznam->getOtevrene($this->obvodId()) as $zaznam) {
$polozky[$zaznam->ID] = $zaznam->JMENO . ' (přiděleno ' . $this->den($zaznam->VYDANO)->format('d.m.Y') . ')';
}
$form->addSelect('zaznam', 'Záznam', $polozky)
->setRequired('Vyberte záznam k vrácení.');
$form->addDate('datum', 'Datum vrácení')
->setRequired('Zadejte datum vrácení.')
->setDefaultValue(new \DateTimeImmutable('today'));
$form->addSubmit('send', 'Vrátit');
$form->addProtection('Platnost formuláře vypršela, odešlete ho znovu.');
$form->onSuccess[] = $this->vratitFormSucceeded(...);
return $form;
}
private function vratitFormSucceeded(Form $form, ArrayHash $values): void
{
$obvodId = $this->obvodId();
$zaznam = $this->zaznam->getZaznam((int) $values->zaznam);
if ($zaznam === null || (int) $zaznam->OBVOD !== $obvodId || $zaznam->VRACENO !== null) {
$form->addError('Tento záznam už nelze vrátit.');
return;
}
$vraceno = $this->den($values->datum);
if ($this->den($zaznam->VYDANO) > $vraceno) {
$form->addError('Datum přidělení nesmí být později než datum vrácení.');
return;
}
$this->zaznam->vrat((int) $zaznam->ID, $obvodId, $vraceno);
$this->flashMessage('Obvod byl vrácen.');
$this->redirect('this');
}
protected function createComponentUpravitForm(): Form
{
$form = new Form;
$form->addHidden('id');
$form->addText('zvestovatel', 'Zvěstovatel')
->setRequired('Zadejte zvěstovatele.')
->setMaxLength(100);
$form->addDate('vydano', 'Datum přidělení')
->setRequired('Zadejte datum přidělení.');
$form->addDate('vraceno', 'Datum vrácení');
$form->addSubmit('send', 'Uložit');
$form->addProtection('Platnost formuláře vypršela, odešlete ho znovu.');
$form->onSuccess[] = $this->upravitFormSucceeded(...);
return $form;
}
private function upravitFormSucceeded(Form $form, ArrayHash $values): void
{
$obvodId = $this->obvodId();
$zaznam = $this->zaznam->getZaznam((int) $values->id);
if ($zaznam === null || (int) $zaznam->OBVOD !== $obvodId) {
$form->addError('Tento záznam už nelze upravit.');
return;
}
$jmeno = trim((string) $values->zvestovatel);
if ($jmeno === '') {
$form->addError('Zadejte zvěstovatele.');
return;
}
if (mb_strlen($jmeno) > 100) {
$form->addError('Jméno zvěstovatele je příliš dlouhé.');
return;
}
$vydano = $this->den($values->vydano);
$vraceno = $values->vraceno !== null && $values->vraceno !== ''
? $this->den($values->vraceno)
: null;
if ($vraceno !== null && $vydano > $vraceno) {
$form->addError('Datum přidělení nesmí být později než datum vrácení.');
return;
}
if (!$this->zaznam->uprav((int) $zaznam->ID, $obvodId, $jmeno, $vydano, $vraceno)) {
$form->addError('Tento záznam už nelze upravit.');
return;
}
$this->flashMessage('Záznam byl upraven.');
$this->redirect('this');
}
protected function createComponentSmazat(): Multiplier
{
return new Multiplier(function (string $id): Form {
$form = new Form;
$form->addSubmit('send', 'Smazat');
$form->addProtection('Platnost formuláře vypršela, odešlete ho znovu.');
$form->onSuccess[] = function () use ($id): void {
if ($this->zaznam->smaz((int) $id, $this->obvodId())) {
$this->flashMessage('Záznam byl smazán.');
} else {
$this->flashMessage('Tento záznam už nelze smazat.');
}
$this->redirect('this');
};
return $form;
});
}
private function obvodId(): int
{
$id = $this->getParameter('id');
if ($id === null || $id === '') {
$this->error('Obvod nenalezen.', Nette\Http\IResponse::S404_NotFound);
}
return (int) $id;
}
private function den(mixed $value): \DateTimeImmutable
{
$datum = $value instanceof \DateTimeInterface
? \DateTimeImmutable::createFromInterface($value)
: new \DateTimeImmutable((string) $value);
return $datum->setTime(0, 0);
}
}