Kufrik/app/UI/FakturaEdit/FakturaEditPresenter.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');
}
}