163 lines
5.4 KiB
PHP
163 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\UI\FakturaEdit;
|
|
|
|
use App\UI\BasePresenter;
|
|
use App\Model\Facade\FakturaFacade;
|
|
use App\Model\Facade\ZakaznikFacade;
|
|
use Nette\Application\UI\Form;
|
|
|
|
class FakturaEditPresenter extends BasePresenter
|
|
{
|
|
/** @persistent */
|
|
public ?int $id = null;
|
|
|
|
public function __construct(
|
|
private FakturaFacade $fakturaFacade,
|
|
private ZakaznikFacade $zakaznikFacade
|
|
) {
|
|
parent::__construct();
|
|
}
|
|
|
|
public function actionNew(): void
|
|
{
|
|
$this->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');
|
|
}
|
|
} |