id = null; $this->setView('edit'); $firmaId = $this->getUser()->getIdentity()->firma_id; $noveCislo = $this->fakturaFacade->getNextCislo($firmaId); // Předplníme nové číslo faktury do formuláře $this['fakturaForm']->setDefaults([ 'CISLO' => $noveCislo, ]); } public function actionEdit(int $id): void { $this->id = $id; $faktura = $this->fakturaFacade->getById($id); if (!$faktura) { $this->flashMessage('Faktura nebyla nalezena.', 'danger'); $this->redirect('Faktura:default'); } $defaults = $faktura->toArray(); // Explicitně přiřadíme ID zákazníka if ($faktura->ZAKAZNIK !== null) { $defaults['ZAKAZNIK_ID'] = (int) $faktura->ZAKAZNIK; } if ($faktura->DATUM_VYSTAVENI) { $defaults['DATUM_VYSTAVENI'] = $faktura->DATUM_VYSTAVENI->format('Y-m-d'); } if ($faktura->DATUM_SPLATNOSTI) { $defaults['DATUM_SPLATNOSTI'] = $faktura->DATUM_SPLATNOSTI->format('Y-m-d'); } if ($faktura->DATUM_DUZP) { $defaults['DATUM_DUZP'] = $faktura->DATUM_DUZP->format('Y-m-d'); } // 1. Nastavení výchozích hodnot $this['fakturaForm']->setDefaults($defaults); // Společný CSS styl pro zablokované / zešedlé prvky (odpovídá Bootstrap disabled vzhledu) $disabledStyle = 'pointer-events: none; background-color: #e9ecef; opacity: 1;'; // 2. Zamknutí prvků při editaci (Odběratel, Číslo faktury, Datum vystavení) $this['fakturaForm']['ZAKAZNIK_ID'] ->setHtmlAttribute('style', $disabledStyle) ->setHtmlAttribute('tabindex', '-1'); $this['fakturaForm']['CISLO'] ->setHtmlAttribute('readonly', true) ->setHtmlAttribute('style', $disabledStyle) ->setHtmlAttribute('tabindex', '-1'); $this['fakturaForm']['DATUM_VYSTAVENI'] ->setHtmlAttribute('readonly', true) ->setHtmlAttribute('style', $disabledStyle) ->setHtmlAttribute('tabindex', '-1'); } public function renderEdit(?int $id = null): void { $this->template->isEdit = (bool) $this->id; // Pokud upravujeme, načteme stávající položky, jinak připravíme prázdné pole pro JS/Latte $this->template->polozky = $this->id ? $this->fakturaFacade->getPolozky($this->id) : []; } protected function createComponentFakturaForm(): Form { $form = new Form; // 1. Načteme všechny zákazníky (parametr 'vse' projde bez filtru AKTIVNI) $zakaznici = $this->zakaznikFacade->getFiltered('', 'vse'); $zakazniciPairs = []; foreach ($zakaznici as $z) { $nazev = trim(($z->PRIJMENI ?? '') . ' ' . ($z->JMENO ?? '')); if (!empty($z->IC)) { $nazev .= " (IČ: {$z->IC})"; } // Kličem musí být int $zakazniciPairs[(int) $z->ID] = $nazev; } $form->addSelect('ZAKAZNIK_ID', 'Odběratel:', $zakazniciPairs) ->setPrompt('-- Vyberte zákazníka --'); $form->addText('CISLO', 'Číslo faktury:') ->setDefaultValue(date('Y') . '001'); $form->addText('DATUM_VYSTAVENI', 'Datum vystavení:') ->setHtmlType('date') ->setDefaultValue(date('Y-m-d')); $form->addText('DATUM_SPLATNOSTI', 'Datum splatnosti:') ->setHtmlType('date') ->setDefaultValue(date('Y-m-d', strtotime('+14 days'))) ->setRequired('Zadejte datum splatnosti.'); $form->addText('DATUM_DUZP', 'Datum UZP:') ->setHtmlType('date'); $form->addSelect('STAV', 'Stav:', [ 'ISSUED' => 'Vystaveno (Neuhrazeno)', 'PAID' => 'Zaplaceno', ])->setDefaultValue('ISSUED'); $form->addTextArea('CINNOSTI', 'Činnosti / Popis plnění:'); $form->addSubmit('save', 'Uložit fakturu') ->setHtmlAttribute('class', 'btn btn-primary'); $form->onSuccess[] = [$this, 'fakturaFormSucceeded']; return $form; } public function fakturaFormSucceeded(Form $form, \stdClass $data): void { $firmaId = $this->getUser()->getIdentity()->firma_id; $httpRequest = $this->getHttpRequest(); // 1. Uložení hlavičky faktury $fakturaId = $this->fakturaFacade->saveFaktura((array) $data, $this->id, $firmaId); // 2. Získání položek z POSTu (z dynamického formuláře z Latte/JS) $polozkyRaw = $httpRequest->getPost('polozky', []); // 3. Uložení položek s automatickým výpočtem PORADI a celkové ceny $this->fakturaFacade->savePolozky($fakturaId, $polozkyRaw, $firmaId); $this->flashMessage( $this->id ? 'Faktura byla úspěšně upravena.' : 'Nová faktura byla vystavena.', 'success' ); $this->redirect('Faktura:default'); } }