zapis('Upraveny hranice obvodu č. ' . $cislo . '.'); } public function prideleno(int $cislo, string $zvestovatel, \DateTimeInterface $den): void { $this->zapis(sprintf( 'Obvod č. %d přidělen zvěstovateli %s dne %s.', $cislo, $zvestovatel, $den->format('j.n.Y'), )); } public function vraceno(int $cislo, string $zvestovatel, \DateTimeInterface $den): void { $this->zapis(sprintf( 'Obvod č. %d vrácen zvěstovatelem %s dne %s.', $cislo, $zvestovatel, $den->format('j.n.Y'), )); } /** * @param \DateTimeInterface|null $vraceno null, když záznam ještě nebyl vrácen */ public function upraven(int $cislo, string $zvestovatel, \DateTimeInterface $pridelen, ?\DateTimeInterface $vraceno): void { $this->zapis($this->textZaznamu('upraven', $cislo, $zvestovatel, $pridelen, $vraceno)); } /** * @param \DateTimeInterface|null $vraceno null, když záznam ještě nebyl vrácen */ public function smazan(int $cislo, string $zvestovatel, \DateTimeInterface $pridelen, ?\DateTimeInterface $vraceno): void { $this->zapis($this->textZaznamu('smazán', $cislo, $zvestovatel, $pridelen, $vraceno)); } private function textZaznamu( string $akce, int $cislo, string $zvestovatel, \DateTimeInterface $pridelen, ?\DateTimeInterface $vraceno, ): string { $vraceni = $vraceno === null ? 'nevráceno' : 'vráceno ' . $vraceno->format('j.n.Y'); return sprintf( 'Záznam u obvodu č. %d %s. Zvěstovatel %s, přiděleno %s, %s.', $cislo, $akce, $zvestovatel, $pridelen->format('j.n.Y'), $vraceni, ); } public function prejmenovan(string $puvodni, string $nove): void { $this->zapis('Zvěstovatel ' . $puvodni . ' přejmenován na ' . $nove . '.'); } /** * Záznamy jednoho měsíce, nejnovější první. * Načte o jeden řádek víc, aby šlo poznat, jestli existuje další dávka. * * @return array{radky: list<\Nette\Database\Row>, dalsi: bool} */ public function getMesic(int $rok, int $mesic, int $od, int $limit): array { $od = max(0, $od); $limit = max(1, $limit); $zacatek = new \DateTimeImmutable(sprintf('%04d-%02d-01 00:00:00', $rok, $mesic)); $radky = $this->database->fetchAll( 'SELECT ID, UZIVATEL, DATUM, [TEXT] FROM [LOG] WHERE DATUM >= ? AND DATUM < ? ORDER BY DATUM DESC, ID DESC OFFSET ' . $od . ' ROWS FETCH NEXT ' . ($limit + 1) . ' ROWS ONLY', $zacatek, $zacatek->modify('+1 month'), ); $dalsi = count($radky) > $limit; if ($dalsi) { array_pop($radky); } return ['radky' => $radky, 'dalsi' => $dalsi]; } /** * Roky, ve kterých je aspoň jeden záznam, plus aktuální a vybraný rok. * * @return list */ public function getRoky(int $vybrany): array { $min = $this->database->fetchField('SELECT MIN(DATUM) FROM [LOG]'); $max = $this->database->fetchField('SELECT MAX(DATUM) FROM [LOG]'); $letos = (int) (new \DateTimeImmutable('today'))->format('Y'); $od = $min instanceof \DateTimeInterface ? (int) $min->format('Y') : $letos; $do = $max instanceof \DateTimeInterface ? (int) $max->format('Y') : $letos; $od = min($od, $letos, $vybrany); $do = max($do, $letos, $vybrany); $roky = []; for ($rok = $do; $rok >= $od; $rok--) { $roky[] = $rok; } return $roky; } private function zapis(string $text): void { $this->database->query( 'INSERT INTO [LOG] (UZIVATEL, DATUM, [TEXT]) VALUES (?, ?, ?)', $this->jmenoUzivatele(), new \DateTimeImmutable(), $text, ); } private function jmenoUzivatele(): string { $identita = $this->user->getIdentity(); if ($identita instanceof UserIdentity && $identita->username !== '') { return $identita->username; } $id = $this->user->getId(); $jmeno = $id === null ? null : $this->database->fetchField('SELECT JMENO FROM [LOGIN] WHERE ID = ?', $id); return is_string($jmeno) && $jmeno !== '' ? $jmeno : 'neznámý'; } }