diff --git a/app/Model/Facade/FakturaFacade.php b/app/Model/Facade/FakturaFacade.php index 3dbcc7e..39d4826 100644 --- a/app/Model/Facade/FakturaFacade.php +++ b/app/Model/Facade/FakturaFacade.php @@ -336,38 +336,76 @@ class FakturaFacade 'O_DIC' => self::nullIfEmpty($data['O_DIC'] ?? null), ]; - if (!$isNew) { - return $fromForm; - } - - $defaults = $this->getDodavatelDefaults($firmaId); - foreach ($defaults as $key => $value) { - if ($fromForm[$key] === null || $fromForm[$key] === '') { - $fromForm[$key] = $value; - } - } - - $zakaznikId = !empty($data['ZAKAZNIK_ID']) ? (int) $data['ZAKAZNIK_ID'] : null; - $zakaznik = $zakaznikId - ? $this->kufrikExplorer->table('ZAKAZNIK')->where('ID', $zakaznikId)->fetch() - : null; - if ($zakaznik) { - $oDefaults = [ - 'O_PRAJM' => trim(($zakaznik->PRIJMENI ?? '') . ' ' . ($zakaznik->JMENO ?? '')) ?: null, - 'O_ULICE' => $zakaznik->ULICE ?? null, - 'O_MESTO' => $zakaznik->MESTO ?? null, - 'O_PSC' => $zakaznik->PSC ?? null, - 'O_IC' => $zakaznik->IC ?? null, - 'O_DIC' => $zakaznik->DIC ?? null, - ]; - foreach ($oDefaults as $key => $value) { + if ($isNew) { + $defaults = $this->getDodavatelDefaults($firmaId); + foreach ($defaults as $key => $value) { if ($fromForm[$key] === null || $fromForm[$key] === '') { $fromForm[$key] = $value; } } + + $zakaznikId = !empty($data['ZAKAZNIK_ID']) ? (int) $data['ZAKAZNIK_ID'] : null; + $zakaznik = $zakaznikId + ? $this->kufrikExplorer->table('ZAKAZNIK')->where('ID', $zakaznikId)->fetch() + : null; + if ($zakaznik) { + $oDefaults = [ + 'O_PRAJM' => trim(($zakaznik->PRIJMENI ?? '') . ' ' . ($zakaznik->JMENO ?? '')) ?: null, + 'O_ULICE' => $zakaznik->ULICE ?? null, + 'O_MESTO' => $zakaznik->MESTO ?? null, + 'O_PSC' => $zakaznik->PSC ?? null, + 'O_IC' => $zakaznik->IC ?? null, + 'O_DIC' => $zakaznik->DIC ?? null, + ]; + foreach ($oDefaults as $key => $value) { + if ($fromForm[$key] === null || $fromForm[$key] === '') { + $fromForm[$key] = $value; + } + } + } } - return $fromForm; + return self::clampSnapshot($fromForm); + } + + /** + * Ořízne snapshot na délky sloupců FAKTURA (ochrana před truncací SQL Serveru). + * + * @param array $snapshot + * @return array + */ + private static function clampSnapshot(array $snapshot): array + { + $limits = [ + 'D_PRAJM' => 511, + 'D_ULICE' => 50, + 'D_MESTO' => 50, + 'D_PSC' => 50, + 'D_IC' => 8, + 'D_DIC' => 12, + 'D_BANKA' => 100, + 'D_TELEFON' => 20, + 'D_EMAIL' => 100, + 'D_WEB' => 100, + 'O_PRAJM' => 511, + 'O_ULICE' => 50, + 'O_MESTO' => 50, + 'O_PSC' => 5, + 'O_IC' => 8, + 'O_DIC' => 10, + ]; + + foreach ($limits as $key => $max) { + if (!isset($snapshot[$key]) || $snapshot[$key] === null) { + continue; + } + $text = (string) $snapshot[$key]; + if (mb_strlen($text) > $max) { + $snapshot[$key] = mb_substr($text, 0, $max); + } + } + + return $snapshot; } private static function nullIfEmpty(mixed $value): ?string @@ -601,70 +639,6 @@ class FakturaFacade $this->kufrikExplorer->table('FAKTURA')->where('ID', $id)->delete(); } - /** - * Kopie faktury: nové číslo, dnešní data, stejný odběratel a položky, bez plateb. - * - * @return int ID nové faktury - */ - public function duplicate(int $id, int $firmaId): int - { - $zdroj = $this->getById($id); - if (!$zdroj) { - throw new \InvalidArgumentException('Faktura nebyla nalezena.'); - } - - $dnes = new \DateTimeImmutable('today'); - $dalsi = $this->getNextCislo($firmaId, $dnes); - $datumVystaveni = $dnes->format('Y-m-d'); - $datumSplatnosti = $dnes - ->modify('+' . $dalsi['splatnostDny'] . ' days') - ->format('Y-m-d'); - - $novaId = $this->saveFaktura([ - 'ZAKAZNIK_ID' => (int) $zdroj->ZAKAZNIK, - 'CISLO' => $dalsi['cislo'], - 'CISLO_ABS' => $dalsi['cisloAbs'], - 'FORMA_UHRADY' => (int) ($zdroj->FORMA_UHRADY ?? 1), - 'DATUM_VYSTAVENI' => $datumVystaveni, - 'DATUM_SPLATNOSTI' => $datumSplatnosti, - 'DATUM_DUZP' => $datumVystaveni, - 'STAV' => self::STAV_VYSTAVENO, - 'CINNOSTI' => $zdroj->CINNOSTI, - // Zachovat upravené údaje dodavatele / odběratele ze zdroje - 'D_PRAJM' => $zdroj->D_PRAJM, - 'D_ULICE' => $zdroj->D_ULICE, - 'D_MESTO' => $zdroj->D_MESTO, - 'D_PSC' => $zdroj->D_PSC, - 'D_IC' => $zdroj->D_IC, - 'D_DIC' => $zdroj->D_DIC, - 'D_BANKA' => $zdroj->D_BANKA, - 'D_TELEFON' => $zdroj->D_TELEFON, - 'D_EMAIL' => $zdroj->D_EMAIL, - 'D_WEB' => $zdroj->D_WEB, - 'O_PRAJM' => $zdroj->O_PRAJM, - 'O_ULICE' => $zdroj->O_ULICE, - 'O_MESTO' => $zdroj->O_MESTO, - 'O_PSC' => $zdroj->O_PSC, - 'O_IC' => $zdroj->O_IC, - 'O_DIC' => $zdroj->O_DIC, - ], null, $firmaId); - - $polozky = []; - foreach ($this->getPolozky($id) as $polozka) { - $polozky[] = [ - 'NAZEV' => $polozka->NAZEV, - 'POCET' => $polozka->POCET, - 'JEDNOTKA' => $polozka->JEDNOTKA, - 'CENA_JEDNOTKA' => $polozka->CENA_JEDNOTKA, - 'SLEVA' => $polozka->SLEVA, - ]; - } - $this->savePolozky($novaId, $polozky, $firmaId); - $this->syncStav($novaId); - - return $novaId; - } - /** * Číslo účtu dodavatele ve formátu „účet/kód banky“. */ diff --git a/app/UI/@layout.latte b/app/UI/@layout.latte index 80780c2..927abdc 100644 --- a/app/UI/@layout.latte +++ b/app/UI/@layout.latte @@ -25,7 +25,7 @@ {* naše vlastní styly *} - + @@ -218,27 +218,30 @@ {/if} - -