Kufrik/app/UI/Admin/AdminPresenter.php

124 lines
3.8 KiB
PHP

<?php
namespace App\UI\Admin;
use App\Model\Facade\DatabazeFacade;
use App\Model\Sdf\SdfKufrikImporter;
use App\UI\BasePresenter;
use Nette\Application\AbortException;
use Nette\Application\UI\Form;
use Nette\Forms\Controls\UploadControl;
use Nette\Forms\Helpers;
use Nette\Http\FileUpload;
class AdminPresenter extends BasePresenter
{
private const SDF_MAX_BYTES = 50 * 1024 * 1024;
public function __construct(
private DatabazeFacade $databazeFacade,
private SdfKufrikImporter $sdfImporter
) {
parent::__construct();
}
protected function startup(): void
{
parent::startup();
if (!$this->getUser()->isInRole('admin')) {
$this->error('Sekce Admin je dostupná pouze administrátorovi systému.', 403);
}
}
public function actionDefault(): void
{
$this->redirect('databaze');
}
public function renderDatabaze(): void
{
$loginy = $this->databazeFacade->getAll();
$aktivniCount = 0;
foreach ($loginy as $login) {
if ($login->AKTIVNI) {
$aktivniCount++;
}
}
$this->template->loginy = $loginy;
$this->template->celkemCount = count($loginy);
$this->template->aktivniCount = $aktivniCount;
}
public function renderStatistika(): void
{
}
protected function createComponentSdfImportForm(): Form
{
$form = new Form();
$form->addHidden('loginId')
->addRule($form::Integer, 'Vyberte databázi.')
->setRequired('Vyberte databázi.');
$iniLimits = array_filter([
Helpers::iniGetSize('upload_max_filesize'),
Helpers::iniGetSize('post_max_size'),
]);
$maxBytes = min(self::SDF_MAX_BYTES, ...($iniLimits ?: [self::SDF_MAX_BYTES]));
$maxMb = max(1, (int) floor($maxBytes / (1024 * 1024)));
$form->addUpload('sdf', 'Soubor SDF:')
->setRequired('Vyberte soubor s příponou .sdf.')
->addRule($form::MaxFileSize, "Soubor může mít nejvýše {$maxMb} MB.", $maxBytes)
->addRule(
function (UploadControl $control): bool {
$file = $control->getValue();
if (!$file instanceof FileUpload || !$file->hasFile()) {
return false;
}
return strtolower(pathinfo($file->getUntrustedName(), PATHINFO_EXTENSION)) === 'sdf';
},
'Soubor musí mít příponu .sdf.'
);
$form->addSubmit('send', 'Import');
$form->onSuccess[] = [$this, 'sdfImportFormSucceeded'];
return $form;
}
public function sdfImportFormSucceeded(Form $form, \stdClass $data): void
{
set_time_limit(180);
$loginId = (int) $data->loginId;
try {
$this->databazeFacade->saveSdf($loginId, $data->sdf);
$stats = $this->sdfImporter->import($loginId);
$this->flashMessage(
sprintf(
'Import ze SDF do databáze %s dokončen. Původní data byla smazána. Zákazníci: %d. Faktury: %d. Položky: %d. Platby: %d. Nastavení: %s.',
$stats['database'],
$stats['zakazniciInserted'],
$stats['fakturyInserted'],
$stats['polozkyInserted'],
$stats['platbyInserted'],
!empty($stats['nastaveniImported']) ? 'přeneseno' : 'bez změn'
),
'success'
);
} catch (AbortException $e) {
throw $e;
} catch (\Throwable $e) {
$this->flashMessage('Import ze SDF selhal: ' . $e->getMessage(), 'danger');
}
$this->redirect('this');
}
}