Základ layout a DB
parent
cdfd388b67
commit
5c5b5b81d8
|
|
@ -1,19 +1,196 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="cs" xml:lang="cs" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Kufřík</title>
|
||||||
|
|
||||||
|
<!-- Bootstrap 5 CSS & Icons -->
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css" rel="stylesheet">
|
||||||
|
|
||||||
|
{* jquery *}
|
||||||
|
<script
|
||||||
|
src="https://code.jquery.com/jquery-3.7.1.min.js"
|
||||||
|
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
|
||||||
|
crossorigin="anonymous">
|
||||||
|
</script>
|
||||||
|
|
||||||
<title>{ifset title}{include title|stripHtml} | {/ifset}Nette Web</title>
|
{* naše vlastní styly *}
|
||||||
|
<link href="{$basePath}/css/layout.css?v={$appVersion ?? '1.0'}" rel="stylesheet">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div n:foreach="$flashes as $flash" n:class="flash, $flash->type">{$flash->message}</div>
|
|
||||||
|
|
||||||
{include content}
|
<!-- 1. HORNÍ LIŠTA -->
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-dark app-header">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<a class="navbar-brand" href="#"><i class="bi bi-briefcase-fill me-2"></i>Kufřík</a>
|
||||||
|
|
||||||
|
<button class="navbar-toggler border-0" type="button" data-bs-toggle="collapse" data-bs-target="#mainNavbar">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="mainNavbar">
|
||||||
|
<!-- Hlavní kategorie -->
|
||||||
|
<ul class="navbar-nav me-auto nav nav-tabs" id="mainCategoryTabs" role="tablist">
|
||||||
|
<li class="nav-item">
|
||||||
|
<button class="nav-link active" id="cat-invoices-tab" data-bs-toggle="tab" data-bs-target="#toolbar-invoices" type="button" role="tab">
|
||||||
|
<i class="bi bi-file-earmark-text me-1"></i> Faktury
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<button class="nav-link" id="cat-customers-tab" data-bs-toggle="tab" data-bs-target="#toolbar-customers" type="button" role="tab">
|
||||||
|
<i class="bi bi-people me-1"></i> Zákazníci
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<button class="nav-link" id="cat-profile-tab" data-bs-toggle="tab" data-bs-target="#toolbar-profile" type="button" role="tab">
|
||||||
|
<i class="bi bi-building me-1"></i> Moje OSVČ
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<button class="nav-link" id="cat-briefcase-tab" data-bs-toggle="tab" data-bs-target="#toolbar-briefcase" type="button" role="tab">
|
||||||
|
<i class="bi bi-box me-1"></i> Kufřík
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
{block scripts}
|
<!-- Uživatel a Odhlášení -->
|
||||||
<script src="https://unpkg.com/nette-forms@3"></script>
|
<div class="user-panel">
|
||||||
{/block}
|
<span class="text-white d-none d-sm-inline">
|
||||||
|
<i class="bi bi-person-circle me-1"></i> Jan Novák
|
||||||
|
</span>
|
||||||
|
<a href="#" class="btn btn-sm btn-outline-light" title="Odhlásit se">
|
||||||
|
<i class="bi bi-box-arrow-right me-1"></i> Odhlásit
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!-- 2. AKČNÍ LIŠTA (PODKATEGORIE) -->
|
||||||
|
<div class="action-toolbar">
|
||||||
|
<div class="container-fluid">
|
||||||
|
|
||||||
|
<!-- Tlačítko pro mobilní rozbalení -->
|
||||||
|
<div class="d-lg-none d-flex justify-content-between align-items-center">
|
||||||
|
<span class="fw-bold text-muted small">Nástroje</span>
|
||||||
|
<button class="btn btn-outline-secondary btn-sm" type="button" data-bs-toggle="collapse" data-bs-target="#actionToolbarCollapse">
|
||||||
|
<i class="bi bi-three-dots-vertical"></i> Podkategorie
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="collapse d-lg-block mt-2 mt-lg-0" id="actionToolbarCollapse">
|
||||||
|
<div class="tab-content" id="actionToolbarContent">
|
||||||
|
|
||||||
|
<!-- FAKTURY -->
|
||||||
|
<div class="tab-pane fade show active" id="toolbar-invoices" role="tabpanel">
|
||||||
|
<div class="toolbar-group">
|
||||||
|
<div class="action-buttons">
|
||||||
|
<a href="#" class="btn btn-outline-primary btn-action">
|
||||||
|
<i class="bi bi-folder-fill"></i>
|
||||||
|
<span>Seznam faktur</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="btn btn-success btn-action">
|
||||||
|
<i class="bi bi-plus-square-fill"></i>
|
||||||
|
<span>Přidat fakturu</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="btn btn-outline-secondary btn-action">
|
||||||
|
<i class="bi bi-printer-fill"></i>
|
||||||
|
<span>Tisk</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="v-divider d-none d-sm-block"></div>
|
||||||
|
|
||||||
|
<a href="#" class="btn btn-outline-secondary btn-action">
|
||||||
|
<i class="bi bi-bar-chart-line-fill text-warning"></i>
|
||||||
|
<span>Grafy</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="btn btn-outline-secondary btn-action">
|
||||||
|
<i class="bi bi-file-earmark-pdf-fill text-danger"></i>
|
||||||
|
<span>Tiskové sestavy</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Filtr pro Faktury -->
|
||||||
|
<form class="filter-panel ms-auto ms-lg-0">
|
||||||
|
<i class="bi bi-funnel-fill text-muted fs-5 ms-1"></i>
|
||||||
|
<select class="form-select form-select-sm" style="width: 85px;">
|
||||||
|
<option selected>2026</option>
|
||||||
|
<option>2025</option>
|
||||||
|
</select>
|
||||||
|
<select class="form-select form-select-sm" style="width: 140px;">
|
||||||
|
<option selected>(všechny měsíce)</option>
|
||||||
|
<option>Leden</option>
|
||||||
|
<option>Únor</option>
|
||||||
|
</select>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ZÁKAZNÍCI -->
|
||||||
|
<div class="tab-pane fade" id="toolbar-customers" role="tabpanel">
|
||||||
|
<div class="action-buttons">
|
||||||
|
<a href="#" class="btn btn-outline-primary btn-action">
|
||||||
|
<i class="bi bi-people-fill"></i>
|
||||||
|
<span>Seznam</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="btn btn-success btn-action">
|
||||||
|
<i class="bi bi-person-plus-fill"></i>
|
||||||
|
<span>Přidat zákazníka</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- MOJE OSVČ -->
|
||||||
|
<div class="tab-pane fade" id="toolbar-profile" role="tabpanel">
|
||||||
|
<div class="action-buttons">
|
||||||
|
<a href="#" class="btn btn-outline-primary btn-action">
|
||||||
|
<i class="bi bi-pencil-square"></i>
|
||||||
|
<span>Upravit moje OSVČ</span>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="btn btn-outline-secondary btn-action">
|
||||||
|
<i class="bi bi-gear-fill"></i>
|
||||||
|
<span>Nastavení</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- KUFŘÍK -->
|
||||||
|
<div class="tab-pane fade" id="toolbar-briefcase" role="tabpanel">
|
||||||
|
<div class="action-buttons">
|
||||||
|
<a href="#" class="btn btn-outline-info btn-action">
|
||||||
|
<i class="bi bi-question-circle-fill"></i>
|
||||||
|
<span>Nápověda</span>
|
||||||
|
</a>
|
||||||
|
<a href="https://facebook.com" target="_blank" class="btn btn-outline-primary btn-action">
|
||||||
|
<i class="bi bi-facebook"></i>
|
||||||
|
<span>Stránky - FB</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 3. HLAVNÍ OBSAH -->
|
||||||
|
<main class="main-content">
|
||||||
|
<div class="content-card">
|
||||||
|
{include content}
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<!-- 4. PATKA -->
|
||||||
|
<footer class="app-footer">
|
||||||
|
<div class="d-flex align-items-center gap-2">
|
||||||
|
<span class="spinner-grow spinner-grow-sm text-success" style="width: 8px; height: 8px;" role="status"></span>
|
||||||
|
<span>Kufřík v{$appVersion ?? '1.0'}</span>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -1,38 +1,2 @@
|
||||||
{* This is the welcome page, you can delete it *}
|
|
||||||
|
|
||||||
{block content}
|
{block content}
|
||||||
<div id="banner">
|
<div>HOME</div>
|
||||||
<h1 n:block=title>Congratulations!</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="content">
|
|
||||||
<h2>You have successfully created your <a href="https://nette.org">Nette</a> Web project.</h2>
|
|
||||||
|
|
||||||
<p><img src="data:image/png;base64,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" alt="">
|
|
||||||
If you are exploring Nette for the first time, you should read the
|
|
||||||
<a href="https://doc.nette.org/quickstart">Quick Start</a>, <a href="https://doc.nette.org">documentation</a>,
|
|
||||||
<a href="https://blog.nette.org">blog</a> and <a href="https://forum.nette.org">forum</a>.</p>
|
|
||||||
|
|
||||||
<h2>We hope you enjoy Nette!</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
html { font: normal 18px/1.3 Georgia, "New York CE", utopia, serif; color: #666; -webkit-text-stroke: 1px rgba(0,0,0,0); overflow-y: scroll; }
|
|
||||||
body { background: #3484d2; color: #333; margin: 2em auto; padding: 0 .5em; max-width: 600px; min-width: 320px; }
|
|
||||||
|
|
||||||
a { color: #006aeb; padding: 3px 1px; }
|
|
||||||
a:hover, a:active, a:focus { background-color: #006aeb; text-decoration: none; color: white; }
|
|
||||||
|
|
||||||
#banner { border-radius: 12px 12px 0 0; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAB5CAMAAADPursXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGBQTFRFD1CRDkqFDTlmDkF1D06NDT1tDTNZDk2KEFWaDTZgDkiCDTtpDT5wDkZ/DTBVEFacEFOWD1KUDTRcDTFWDkV9DkR7DkN4DkByDTVeDC9TDThjDTxrDkeADkuIDTRbDC9SbsUaggAAAEdJREFUeNqkwYURgAAQA7DH3d3335LSKyxAYpf9vWCpnYbf01qcOdFVXc14w4BznNTjkQfsscAdU3b4wIh9fDVYc4zV8xZgAAYaCMI6vPgLAAAAAElFTkSuQmCC); }
|
|
||||||
|
|
||||||
h1 { font: inherit; color: white; font-size: 50px; line-height: 121px; margin: 0; padding-left: 4%; background: url(https://files.nette.org/images/logo-nette@2.png) no-repeat 95%; background-size: 130px auto; text-shadow: 1px 1px 0 rgba(0, 0, 0, .9); }
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
h1 { background: none; font-size: 40px; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#content { background: white; border: 1px solid #eff4f7; border-radius: 0 0 12px 12px; padding: 10px 4%; overflow: hidden; }
|
|
||||||
|
|
||||||
h2 { font: inherit; padding: 1.2em 0; margin: 0; }
|
|
||||||
|
|
||||||
img { border: none; float: right; margin: 0 0 1em 3em; }
|
|
||||||
</style>
|
|
||||||
|
|
@ -0,0 +1,136 @@
|
||||||
|
<?php
|
||||||
|
namespace App\UI\Sign;
|
||||||
|
|
||||||
|
use App\Core\MujAutentifikator;
|
||||||
|
use App\Model\FormData\LoginFormData;
|
||||||
|
use App\Model\Login\ServerCredentials;
|
||||||
|
use Nette;
|
||||||
|
use Nette\Application\UI\Form;
|
||||||
|
use Nette\Application\Attributes\Persistent;
|
||||||
|
|
||||||
|
final class SignPresenter extends Nette\Application\UI\Presenter
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Stores the previous page hash to redirect back after successful login.
|
||||||
|
*/
|
||||||
|
#[Persistent]
|
||||||
|
public string $backlink = '';
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function createComponentSignInForm(): Form
|
||||||
|
{
|
||||||
|
$form = new Form();
|
||||||
|
$form->addText('server', 'Server:')
|
||||||
|
->setRequired('Prosím vyplňte server.')
|
||||||
|
->setValue(@$_COOKIE['server']);
|
||||||
|
|
||||||
|
$form->addText('username', 'Uživatelské jméno:')
|
||||||
|
->setRequired('Prosím vyplňte své uživatelské jméno.')
|
||||||
|
->setValue(@$_COOKIE['user']);
|
||||||
|
|
||||||
|
$form->addPassword('password', 'Heslo:');
|
||||||
|
// setRequired nepoužívat!! kvůli soft logoutu!!!
|
||||||
|
//->setRequired('Prosím vyplňte své heslo.');
|
||||||
|
|
||||||
|
$form->addSubmit('send', 'Přihlásit');
|
||||||
|
//$form->addProtection(); //ochrana pomocí TOKENu
|
||||||
|
|
||||||
|
$form->onSuccess[] = $this->signInFormSucceeded(...);
|
||||||
|
return $form;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function signInFormSucceeded(Form $form, LoginFormData $data): void //moje vlastní třída LoginFormData
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// kontrola serverů:
|
||||||
|
if (!Funkce::is_cloud_ip($data->server)) {
|
||||||
|
error_log("QR Login - neplatny server.", 0); //log je ve var/log/apache2/error.log (fail2ban)
|
||||||
|
$form->addError('Neznámý server.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sestav Credentials:
|
||||||
|
$credentials = new ServerCredentials($data->server);
|
||||||
|
|
||||||
|
$autentifikator = new MujAutentifikator($credentials, $this->session); // naše vlastní autentifikace!
|
||||||
|
$this->getUser()->setAuthenticator($autentifikator); // musíme ji registrovat!
|
||||||
|
|
||||||
|
$blacklist_check = $this->blackList->blacklist_check($data->server);
|
||||||
|
bdump($blacklist_check);
|
||||||
|
if (is_null($blacklist_check)) {
|
||||||
|
//nic, jako by prošel
|
||||||
|
} else {
|
||||||
|
// $blacklist_check->vysledek Returns 1, pokud není blacklistu. Když se tam nachází, tak 0.
|
||||||
|
// $blacklist_check->expire_date Kdy končí.
|
||||||
|
// $blacklist_check->expired_text Co jim zahlásíš.
|
||||||
|
if ($blacklist_check->vysledek == 0) {
|
||||||
|
setcookie("salt", "", time() - 3600); // smažeme v tomto případě kukínu ...
|
||||||
|
if (empty($blacklist_check->expired_text))
|
||||||
|
throw new BlackListException("Licence pro použití PečAppky vypršela, nebo nám dlužíte peníze.");
|
||||||
|
else
|
||||||
|
throw new BlackListException($blacklist_check->expired_text); // custom text z blacklist DB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// uložené heslo?
|
||||||
|
if (empty($data->password) and isset($_COOKIE['salt'])) {
|
||||||
|
$password = Funkce::decrypt_password($_COOKIE['salt']);
|
||||||
|
} else {
|
||||||
|
$password = $data->password;
|
||||||
|
}
|
||||||
|
// validace přihlášení je v třídě MujAutentifikator->authenticate(...)
|
||||||
|
$this->getUser()->login($data->username, $password);
|
||||||
|
|
||||||
|
// kam potom?
|
||||||
|
$this->restoreRequest($this->backlink); // vrátit se na požadovanou stránku
|
||||||
|
$this->redirect(':Ctecka:'); // jinak přejdi sem
|
||||||
|
} catch (Nette\Database\ConnectionException) {
|
||||||
|
error_log("QR Login - neplatne prihlaseni.", 0); //log je ve var/log/apache2/error.log (fail2ban)
|
||||||
|
$form->addError('Neplatné přihlášení.');
|
||||||
|
} catch (Nette\Security\AuthenticationException $e) {
|
||||||
|
error_log("QR Login - neplatne prihlaseni.", 0); //log je ve var/log/apache2/error.log (fail2ban)
|
||||||
|
$form->addError($e->getMessage());
|
||||||
|
} catch (BlackListException $e2) {
|
||||||
|
$form->addError($e2->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderIn(): void
|
||||||
|
{
|
||||||
|
// ukázat či neukázat pole pro heslo?
|
||||||
|
$this->template->salt = isset($_COOKIE['salt']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalní logout.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function actionOut(): void
|
||||||
|
{
|
||||||
|
$this->getUser()->logout();
|
||||||
|
$this->flashMessage('Odhlášení bylo úspěšné.');
|
||||||
|
$this->redirect('Sign:in');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tvrdý logout.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function actionHardOut(): void
|
||||||
|
{
|
||||||
|
$this->getUser()->logout();
|
||||||
|
setcookie("salt", "", time() - 3600); // smažeme v tomto případě kukínu ...
|
||||||
|
|
||||||
|
// smažeme vybranou DB ze session:
|
||||||
|
if ($this->session->hasSection(Konstanty::sectionDatabase)) {
|
||||||
|
$section = $this->session->getSection(Konstanty::sectionDatabase);
|
||||||
|
$section->remove(Konstanty::sessionCurrentDatabase);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->flashMessage('Odhlášení bylo úspěšné.');
|
||||||
|
$this->redirect('Sign:in');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
{block content}
|
||||||
|
|
||||||
|
{* {control signInForm} *}
|
||||||
|
<div class="container-fluid">
|
||||||
|
<section class="w-100 p-4 d-flex justify-content-center pb-4">
|
||||||
|
<form n:name=signInForm style="width: 22rem;">
|
||||||
|
<div class="p-3 container-fluid ramecek-chyba" n:if="$form->hasErrors()" n:foreach="$form->getErrors() as $error">
|
||||||
|
<span>{$error}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label n:name=username for="inputUser">Uživatel</label>
|
||||||
|
<input n:name=username type="text" class="form-control" id="inputUser" placeholder="Uživatel" required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label n:name=password for="inputHeslo" n:if="$salt == 0">Heslo</label>
|
||||||
|
<input n:name=password type="{if $salt == 0}password{else}hidden{/if}" class="form-control" id="inputHeslo" placeholder="Heslo" autofocus="autofocus" required>
|
||||||
|
</div>
|
||||||
|
<button type="submit" n:name=send class="btn btn-primary btn-xlarge w-100" style="margin-top: 10px;">Přihlásit</button>
|
||||||
|
</form>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
services:
|
services:
|
||||||
- App\Core\RouterFactory::createRouter
|
- App\Core\RouterFactory::createRouter
|
||||||
|
|
||||||
|
security.passwords: Nette\Security\Passwords(::PASSWORD_BCRYPT, [cost: 12])
|
||||||
|
|
||||||
search:
|
search:
|
||||||
- in: %appDir%
|
- in: %appDir%
|
||||||
|
|
|
||||||
175
sql/KufrikDB.sql
175
sql/KufrikDB.sql
|
|
@ -28,4 +28,179 @@ GO
|
||||||
ALTER ROLE [db_owner] ADD MEMBER [kufrik]
|
ALTER ROLE [db_owner] ADD MEMBER [kufrik]
|
||||||
GO
|
GO
|
||||||
|
|
||||||
|
USE [kufrik]
|
||||||
|
GO
|
||||||
|
/****** Object: Table [dbo].[FAKTURA] Script Date: 31.07.2026 9:05:46 ******/
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
CREATE TABLE [dbo].[FAKTURA](
|
||||||
|
[ID] [int] IDENTITY(15,1) NOT NULL,
|
||||||
|
[DATUM_VYSTAVENI] [datetime] NOT NULL,
|
||||||
|
[DATUM_SPLATNOSTI] [datetime] NOT NULL,
|
||||||
|
[ZAKAZNIK] [int] NOT NULL,
|
||||||
|
[CISLO] [nvarchar](20) NOT NULL,
|
||||||
|
[D_PRAJM] [nvarchar](511) NULL,
|
||||||
|
[D_ULICE] [nvarchar](50) NULL,
|
||||||
|
[D_MESTO] [nvarchar](50) NULL,
|
||||||
|
[D_PSC] [nvarchar](50) NULL,
|
||||||
|
[D_IC] [nvarchar](8) NULL,
|
||||||
|
[D_DIC] [nvarchar](10) NULL,
|
||||||
|
[D_BANKA] [nvarchar](100) NULL,
|
||||||
|
[D_TELEFON] [nvarchar](15) NULL,
|
||||||
|
[D_EMAIL] [nvarchar](100) NULL,
|
||||||
|
[D_WEB] [nvarchar](100) NULL,
|
||||||
|
[O_PRAJM] [nvarchar](511) NULL,
|
||||||
|
[O_ULICE] [nvarchar](50) NULL,
|
||||||
|
[O_MESTO] [nvarchar](50) NULL,
|
||||||
|
[O_PSC] [nvarchar](5) NULL,
|
||||||
|
[O_IC] [nvarchar](8) NULL,
|
||||||
|
[O_DIC] [nvarchar](10) NULL,
|
||||||
|
[FORMA_UHRADY] [tinyint] NOT NULL,
|
||||||
|
[CISLO_ABS] [int] NOT NULL,
|
||||||
|
[CINNOSTI] [ntext] NULL,
|
||||||
|
CONSTRAINT [PK_FAKTURA] PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[ID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
|
||||||
|
GO
|
||||||
|
/****** Object: Table [dbo].[KONFIGURACE] Script Date: 31.07.2026 9:05:46 ******/
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
CREATE TABLE [dbo].[KONFIGURACE](
|
||||||
|
[ID] [int] IDENTITY(2,1) NOT NULL,
|
||||||
|
[DATA] [ntext] NULL,
|
||||||
|
CONSTRAINT [PK_KONFIGURACE] PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[ID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
|
||||||
|
GO
|
||||||
|
/****** Object: Table [dbo].[PLATBA] Script Date: 31.07.2026 9:05:46 ******/
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
CREATE TABLE [dbo].[PLATBA](
|
||||||
|
[ID] [int] IDENTITY(11,1) NOT NULL,
|
||||||
|
[FAKTURA] [int] NOT NULL,
|
||||||
|
[CASTKA] [money] NOT NULL,
|
||||||
|
[DATUM] [datetime] NOT NULL,
|
||||||
|
[POZNAMKA] [ntext] NULL,
|
||||||
|
CONSTRAINT [PK_PLATBA] PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[ID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
|
||||||
|
GO
|
||||||
|
/****** Object: Table [dbo].[POLOZKA] Script Date: 31.07.2026 9:05:46 ******/
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
CREATE TABLE [dbo].[POLOZKA](
|
||||||
|
[ID] [int] IDENTITY(24,1) NOT NULL,
|
||||||
|
[FAKTURA] [int] NOT NULL,
|
||||||
|
[NAZEV] [nvarchar](255) NOT NULL,
|
||||||
|
[POCET] [float] NOT NULL,
|
||||||
|
[CENA_JEDNOTKA] [money] NOT NULL,
|
||||||
|
[SLEVA] [real] NULL,
|
||||||
|
[CENA] [money] NOT NULL,
|
||||||
|
[JEDNOTKA] [nvarchar](5) NULL,
|
||||||
|
CONSTRAINT [PK_POLOZKA] PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[ID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY]
|
||||||
|
GO
|
||||||
|
/****** Object: Table [dbo].[UZIVATEL] Script Date: 31.07.2026 9:05:46 ******/
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
CREATE TABLE [dbo].[UZIVATEL](
|
||||||
|
[ID] [int] IDENTITY(2,1) NOT NULL,
|
||||||
|
[JMENO] [nvarchar](255) NULL,
|
||||||
|
[PRIJMENI] [nvarchar](255) NOT NULL,
|
||||||
|
[ULICE] [nvarchar](50) NULL,
|
||||||
|
[MESTO] [nvarchar](50) NULL,
|
||||||
|
[PSC] [nvarchar](5) NULL,
|
||||||
|
[IC] [nvarchar](8) NULL,
|
||||||
|
[DIC] [nvarchar](10) NULL,
|
||||||
|
[TELEFON] [nvarchar](15) NULL,
|
||||||
|
[EMAIL] [nvarchar](100) NULL,
|
||||||
|
[BANKA] [nvarchar](100) NULL,
|
||||||
|
[WEB] [nvarchar](100) NULL,
|
||||||
|
CONSTRAINT [PK_UZIVATEL] PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[ID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY]
|
||||||
|
GO
|
||||||
|
/****** Object: Table [dbo].[VERZE] Script Date: 31.07.2026 9:05:46 ******/
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
CREATE TABLE [dbo].[VERZE](
|
||||||
|
[ID] [int] IDENTITY(15,1) NOT NULL,
|
||||||
|
[VERZE] [smallint] NOT NULL,
|
||||||
|
[DATUM] [datetime] NOT NULL,
|
||||||
|
CONSTRAINT [PK_VERZE] PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[ID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
|
||||||
|
CONSTRAINT [UQ__VERZE__ID] UNIQUE NONCLUSTERED
|
||||||
|
(
|
||||||
|
[ID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
|
||||||
|
CONSTRAINT [UQ__VERZE__VERZE] UNIQUE NONCLUSTERED
|
||||||
|
(
|
||||||
|
[VERZE] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY]
|
||||||
|
GO
|
||||||
|
/****** Object: Table [dbo].[ZAKAZNIK] Script Date: 31.07.2026 9:05:46 ******/
|
||||||
|
SET ANSI_NULLS ON
|
||||||
|
GO
|
||||||
|
SET QUOTED_IDENTIFIER ON
|
||||||
|
GO
|
||||||
|
CREATE TABLE [dbo].[ZAKAZNIK](
|
||||||
|
[ID] [int] IDENTITY(2,1) NOT NULL,
|
||||||
|
[JMENO] [nvarchar](255) NULL,
|
||||||
|
[PRIJMENI] [nvarchar](255) NOT NULL,
|
||||||
|
[ULICE] [nvarchar](50) NULL,
|
||||||
|
[MESTO] [nvarchar](50) NULL,
|
||||||
|
[PSC] [nvarchar](5) NULL,
|
||||||
|
[IC] [nvarchar](8) NULL,
|
||||||
|
[DIC] [nvarchar](10) NULL,
|
||||||
|
[TELEFON] [nvarchar](15) NULL,
|
||||||
|
[EMAIL] [nvarchar](100) NULL,
|
||||||
|
CONSTRAINT [PK_ZAKAZNIK] PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[ID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY]
|
||||||
|
GO
|
||||||
|
ALTER TABLE [dbo].[FAKTURA] ADD DEFAULT ((1)) FOR [FORMA_UHRADY]
|
||||||
|
GO
|
||||||
|
ALTER TABLE [dbo].[FAKTURA] WITH CHECK ADD CONSTRAINT [FK_ZAKAZNIK] FOREIGN KEY([ZAKAZNIK])
|
||||||
|
REFERENCES [dbo].[ZAKAZNIK] ([ID])
|
||||||
|
GO
|
||||||
|
ALTER TABLE [dbo].[FAKTURA] CHECK CONSTRAINT [FK_ZAKAZNIK]
|
||||||
|
GO
|
||||||
|
ALTER TABLE [dbo].[PLATBA] WITH CHECK ADD CONSTRAINT [FK_PLATBA_FAKTURA] FOREIGN KEY([FAKTURA])
|
||||||
|
REFERENCES [dbo].[FAKTURA] ([ID])
|
||||||
|
GO
|
||||||
|
ALTER TABLE [dbo].[PLATBA] CHECK CONSTRAINT [FK_PLATBA_FAKTURA]
|
||||||
|
GO
|
||||||
|
ALTER TABLE [dbo].[POLOZKA] WITH CHECK ADD CONSTRAINT [FK_PLOZKA_FAKTURA] FOREIGN KEY([FAKTURA])
|
||||||
|
REFERENCES [dbo].[FAKTURA] ([ID])
|
||||||
|
GO
|
||||||
|
ALTER TABLE [dbo].[POLOZKA] CHECK CONSTRAINT [FK_PLOZKA_FAKTURA]
|
||||||
|
GO
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# zabraneni v prohlizeni slozky
|
||||||
|
Options -Indexes
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,211 @@
|
||||||
|
/* --- 1. GLOBÁLNÍ PROMĚNNÉ BARVY & BASE --- */
|
||||||
|
:root {
|
||||||
|
--app-bg: #f8fafc; /* Jemný šedo-modrý podklad */
|
||||||
|
--header-bg: #1e293b; /* Moderní tmavě břidlicová (Slate 800) místo sytě modré */
|
||||||
|
--header-active: #334155; /* Světlejší břidlicová pro aktivní záložku */
|
||||||
|
--primary-accent: #3b82f6; /* Moderní soft modrá */
|
||||||
|
--text-main: #0f172a;
|
||||||
|
--text-muted: #64748b;
|
||||||
|
--border-color: #e2e8f0; /* Velmi velice jemná hraniční čára */
|
||||||
|
--card-bg: #ffffff;
|
||||||
|
--radius-sm: 0.375rem;
|
||||||
|
--radius-md: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||||
|
color: var(--text-main);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background-color: var(--app-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- 2. HORNÍ LIŠTA (HEADER) --- */
|
||||||
|
.app-header {
|
||||||
|
background-color: var(--header-bg);
|
||||||
|
padding: 0.35rem 0;
|
||||||
|
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-header .navbar-brand {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 1.05rem;
|
||||||
|
letter-spacing: -0.01em;
|
||||||
|
color: #fff !important;
|
||||||
|
margin-right: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-header .nav-tabs {
|
||||||
|
border-bottom: none;
|
||||||
|
gap: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-header .nav-link {
|
||||||
|
color: #94a3b8; /* Soft šedá pro neaktivní */
|
||||||
|
border: none !important;
|
||||||
|
padding: 0.45rem 0.85rem;
|
||||||
|
font-weight: 500;
|
||||||
|
border-radius: var(--radius-sm) !important;
|
||||||
|
transition: all 0.15s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-header .nav-link:hover {
|
||||||
|
color: #f1f5f9;
|
||||||
|
background-color: rgba(255, 255, 255, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-header .nav-link.active {
|
||||||
|
color: #ffffff !important;
|
||||||
|
background-color: var(--header-active) !important;
|
||||||
|
font-weight: 600;
|
||||||
|
box-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-panel {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-panel .btn-outline-light {
|
||||||
|
border-color: #475569;
|
||||||
|
color: #cbd5e1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-panel .btn-outline-light:hover {
|
||||||
|
background-color: #334155;
|
||||||
|
border-color: #334155;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- 3. AKČNÍ LIŠTA (TOOLBAR) --- */
|
||||||
|
.action-toolbar {
|
||||||
|
background-color: var(--card-bg);
|
||||||
|
border-bottom: 1px solid var(--border-color);
|
||||||
|
padding: 0.6rem 1rem;
|
||||||
|
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar-group {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-buttons {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Zpříjemněné tlačítka v toolbar */
|
||||||
|
.btn-action {
|
||||||
|
display: inline-flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
min-width: 82px;
|
||||||
|
padding: 0.35rem 0.65rem;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
font-weight: 500;
|
||||||
|
border-radius: var(--radius-sm);
|
||||||
|
border: 1px solid #e2e8f0;
|
||||||
|
background-color: #fff;
|
||||||
|
color: #475569;
|
||||||
|
transition: all 0.15s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-action:hover {
|
||||||
|
background-color: #f8fafc;
|
||||||
|
border-color: #cbd5e1;
|
||||||
|
color: #0f172a;
|
||||||
|
transform: translateY(-1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-action i {
|
||||||
|
font-size: 1.35rem;
|
||||||
|
margin-bottom: 0.15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Speciální úpravy barev pro primární tlačítka ( soft tlačítka ) */
|
||||||
|
.btn-action.btn-success {
|
||||||
|
background-color: #10b981; /* Emerald green místo zářivé zelené */
|
||||||
|
border-color: #10b981;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.btn-action.btn-success:hover {
|
||||||
|
background-color: #059669;
|
||||||
|
border-color: #059669;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-action.btn-outline-primary {
|
||||||
|
color: #2563eb;
|
||||||
|
border-color: #bfdbfe;
|
||||||
|
background-color: #eff6ff;
|
||||||
|
}
|
||||||
|
.btn-action.btn-outline-primary:hover {
|
||||||
|
background-color: #2563eb;
|
||||||
|
border-color: #2563eb;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Oddělovač */
|
||||||
|
.v-divider {
|
||||||
|
width: 1px;
|
||||||
|
height: 36px;
|
||||||
|
background-color: var(--border-color);
|
||||||
|
margin: 0 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- 4. FILTRY --- */
|
||||||
|
.filter-panel {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.4rem;
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: var(--radius-sm);
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
background-color: #f8fafc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-panel select {
|
||||||
|
border-color: #cbd5e1;
|
||||||
|
color: #334155;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- 5. OBSAH A PATKA --- */
|
||||||
|
.main-content {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
padding: 1.25rem;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-card {
|
||||||
|
background: var(--card-bg);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
height: 100%;
|
||||||
|
padding: 1.25rem;
|
||||||
|
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-footer {
|
||||||
|
background-color: var(--card-bg);
|
||||||
|
border-top: 1px solid var(--border-color);
|
||||||
|
padding: 0.35rem 1.25rem;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# zabraneni v prohlizeni slozky
|
||||||
|
Options -Indexes
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue