Administrace¶
Stránky dostupné pouze pro roli Admin.
Nastavení (/settings)¶
📸 Screenshot: Stránka nastavení s formulářem pro e-mail správce a konfiguraci převodek
Systémová nastavení spravovaná přes EvaSettingsService:
| Nastavení | Popis |
|---|---|
| AssetManagerEmail | E-mailová adresa správce majetku — příjemce notifikací o převodkách |
| ArticleTransfer.RequirePin | Vyžadovat PIN při potvrzení převodky (true/false) |
| ArticleTransfer.EmailNotification | Odesílat e-mailové notifikace (true/false) |
Systémové informace (/system-info)¶
📸 Screenshot: Stránka systémových informací — verze aplikace, DB host, velikost DB
Zobrazuje live informace o prostředí:
| Kategorie | Informace |
|---|---|
| Aplikace | Verze, prostředí (Development/Docker/Production), build datum |
| Databáze | Host, port, název DB, verze PostgreSQL |
| Server | Verze .NET runtime, OS, hostname |
| Využití DB | Velikost databáze, počet záznamů v klíčových tabulkách |
Data sbírá SystemInfoDataService (kombinuje AppEnv, IHostEnvironment a živý PostgreSQL dotaz).
Monitoring (/monitoring)¶
📸 Screenshot: Monitoring dashboard — grafy využití paměti, GC generace, thread pool, health status
Stránka pro sledování výkonu serveru v reálném čase.
Zobrazované metriky¶
| Metrika | Popis |
|---|---|
| Paměť (RSS) | Celkové využití paměti procesu |
| GC Heap | Využití managed haldy (.NET GC) |
| GC generace | Počty GC za generace (Gen0, Gen1, Gen2) |
| Thread pool | Aktivní a čekající vlákna |
| Health status | Celkový stav: Healthy / Degraded / Unhealthy |
Health endpointy¶
| Endpoint | Určení | Popis |
|---|---|---|
/health |
Docker healthcheck | Jednoduchý OK/Fail |
/health/details |
Monitoring systémy | JSON s detailním stavem DB a paměti |
Prometheus¶
Metriky jsou exportovány na /metrics ve formátu Prometheus. Doporučené Grafana dashboardy:
| Dashboard | Grafana ID | Popis |
|---|---|---|
| .NET Runtime Metrics | 10427 | GC, thread pool, alokace |
| ASP.NET Core | 23179 | HTTP požadavky, latence |
Konfigurace v Docker Compose¶
# Prometheus scrape job (prometheus.yml)
scrape_configs:
- job_name: 'eva-manager'
static_configs:
- targets: ['manager:8080']
metrics_path: '/metrics'
scrape_interval: 15s
Správa uživatelů (/users)¶
📸 Screenshot: Seznam uživatelů s přehledem rolí a stavem účtu
Správa ASP.NET Identity uživatelů: - Přidání / editace uživatelů - Přiřazení rolí (Admin, Manager, User) - Aktivace / deaktivace účtů - Nastavení PIN pro mobilní aplikaci
TenantAdmin
Uživatel s rolí TenantAdmin vidí pouze uživatele svého tenanta — filtrování probíhá automaticky dle TenantID claimu.
AI Asistent (/ai-chat)¶
Integrovaný AI chatbot pro správce a analytiky. Stránka je přístupná z menu jako AI Asistent a vyžaduje přihlášení ([Authorize]).
Architektura¶
DxAIChat (UI)
└─► IChatClient
└─► EvaToolsMiddleware (DelegatingChatClient)
├─► OpenAI API (GPT model, streaming)
└─► EvaAiFunctions (nástroje volané funkcemi)
├─► EvaDataContext (PostgreSQL)
└─► EvaDocumentationService (Markdown soubory)
EvaToolsMiddleware zajišťuje automatické vkládání nástrojů do každého volání API a zároveň ukládá průběh konverzace do databáze.
Dostupné AI nástroje¶
| Nástroj | Popis |
|---|---|
eva_query_assets |
Dotaz na seznam artiklů s filtry (kategorie, stav, lokace, uživatel) |
eva_aggregate_assets |
Agregace majetku — COUNT a SUM(Price) dle zadaných parametrů, bez LIMIT |
eva_query_inventories |
Dotaz na inventury s filtry (stav, datum, lokace) |
eva_query_transfers |
Dotaz na převodky majetku s filtry (stav, uživatel, datum) |
eva_query_users |
Seznam uživatelů s filtrem dle jména/aktivity, volitelně s počty přiřazeného majetku |
eva_query_user_assets |
Majetek přiřazený konkrétnímu uživateli |
eva_search_docs |
Fulltext vyhledávání v Markdown dokumentaci (top 3 výsledky, max 2 000 znaků) |
Historie konverzací¶
Každá konverzace je persistována do databáze pomocí AiConversationService:
| Entita | Tabulka | Popis |
|---|---|---|
AiChatSession |
dbo.AiChatSession |
Hlavička relace (uživatel, datum, název) |
AiChatMessage |
dbo.AiChatMessage |
Jednotlivé zprávy, tool_call a tool_result záznamy |
Záznamy jsou určeny pro audit a ladění. EvaToolsMiddleware automaticky loguje user zprávy, AI odpovědi i volání nástrojů.
Diagnostický endpoint /ai/status¶
Anonymně přístupný endpoint pro ověření konfigurace AI:
Vrací JSON se stavem konfigurace (provider, model, zda je API klíč nastaven). Vhodný pro Docker healthcheck nebo monitoring.
Konfigurace¶
Sekce AI v appsettings.json:
{
"AI": {
"Provider": "OpenAI",
"Model": "gpt-4o",
"MaxTokens": 2000,
"Temperature": 0.3,
"DocsPath": "/app/docs"
}
}
Pro Docker prostředí se hodnoty přebírají z env proměnných AI_API_KEY, AI_PROVIDER, AI_MODEL.
Pokud API klíč chybí, systém použije DisabledChatClient — placeholder, který vrací srozumitelnou chybovou zprávu místo pádu aplikace.
Správa tenantů — Super Admin¶
Dostupnost
Tato sekce je dostupná pouze při Multitenancy:Enabled = true v konfiguraci a pro roli SuperAdmin.
Registrace nové firmy (/account/tenant-registration)¶
Veřejně přístupná stránka — nevyžaduje přihlášení. Slouží pro samoobslužnou registraci nové organizace v SaaS režimu.
| Pole | Popis |
|---|---|
| Název firmy | Zobrazovaný název organizace (Tenant.Name) |
| Kontaktní e-mail administrátora | |
| Heslo | Heslo prvního admin účtu |
Po odeslání formuláře systém:
1. Vytvoří nový záznam Tenant
2. Vytvoří ApplicationUser s rolí TenantAdmin a přiřazeným TenantID
3. Inicializuje výchozí číselníky (kategorie, typy, stavy majetku) pro nového tenanta
Přehled tenantů (/admin/tenants)¶
DxGrid se všemi registrovanými organizacemi. Dostupné akce:
| Akce | Popis |
|---|---|
| Aktivovat / Deaktivovat | Okamžitě zablokuje nebo povolí přístup všem uživatelům tenanta |
| Detail | Přechod na správu uživatelů filtrovanou na daného tenanta |
Odkaz v navigačním menu se zobrazí pouze uživatelům s rolí SuperAdmin.
Správa uživatelů tenanta (/admin/tenant-users)¶
💡 Stránka umožňuje SuperAdminovi spravovat uživatele libovolného tenanta bez nutnosti přihlašovat se za daného tenanta.
- Vybrat tenant v
DxComboBox - DxGrid zobrazí uživatele daného tenanta
- Toolbar akce: Nový (přejde na
/account/create-user?tenantId=X), Editovat, Smazat, Export CSV
Export CSV stáhne soubor uzivatele_{TenantName}_{datum}.csv ve formátu kompatibilním s importní šablonou:
Export / Import dat tenanta (/admin/tenant-export)¶
💡 Záloha nebo přenos kompletních dat tenanta (majetek, umístění, inventury, číselníky) ve formátu JSON.
Export:
- Stáhne JSON soubor se všemi daty vybraného tenanta
- Název souboru: eva-export-tenant{ID}-{datum}.json
Import (Obnovení): - Nahraje JSON soubor exportu - Přemazání stávajících dat tenanta (DELETE + INSERT v transakci) - Podporuje cross-tenant import — data lze přenést i do jiného tenanta
Nevratná operace
Import přemazání odstraní veškerá stávající data tenanta. Akci nelze vrátit.
Technický detail — INSERT bez OID¶
Při importu jsou entity vkládány bez původních OID — databáze přiděluje nové ID z PostgreSQL sekvencí (RETURNING "OID"). Pro každou vrstvu je sestavena mapa starý OID → nový OID a všechny FK reference jsou přemapovány. Tím se eliminují PK kolize při importu do odlišné DB nebo jiného tenanta.
flowchart TD
A[JSON export] --> B[DELETE dat cílového tenanta]
B --> C[INSERT číselníky → catMap, typeMap, stateMap]
C --> D[INSERT lokace → locMap s remap ParentLocationID]
D --> E[INSERT artikly → artMap s remap FK]
E --> F[INSERT umístění artiklu]
F --> G[INSERT inventury → invMap]
G --> H[INSERT položky inventur → invItemMap]
H --> I[UPDATE Article.LastInventoryItemID]
I --> J[COMMIT]
Import nástrojů¶
| Stránka | URL | Role | Popis |
|---|---|---|---|
| Import artiklů | /tools/import-articles |
Admin, TenantAdmin | Hromadný import majetku z CSV |
| Import uživatelů | /tools/import-users |
Admin, TenantAdmin | Hromadný import uživatelů z CSV |
| Import EMA | /tools/import-ema |
Admin | Import z externího systému EMA |
Import majetku z CSV (/tools/import-articles)¶
💡 Import majetku ze středníkem odděleného CSV souboru do aktuálního tenanta.
CSV formát (sablona_majetek.csv):
| Sloupec | Povinný | Popis |
|---|---|---|
Kod |
Ne | Inventární číslo |
Nazev |
Ano | Název majetku |
Kategorie |
Ne | Název kategorie — chybějící se vytvoří automaticky |
Typ |
Ne | Název typu — chybějící se vytvoří automaticky |
Stav |
Ne | Název stavu — chybějící se vytvoří automaticky |
Poznamka |
Ne | Interní poznámka |
Cena |
Ne | Pořizovací cena v CZK (desetinná čárka, např. 45000,50) |
SerioveCislo |
Ne | Sériové číslo výrobce |
RFID |
Ne | RFID čip |
DatumPorizeni |
Ne | Datum pořízení (dd.MM.yyyy) |
DatumZacatkuUzivani |
Ne | Datum začátku používání (dd.MM.yyyy) |
CisloFaktury |
Ne | Číslo faktury |
Mnozstvi |
Ne | Množství (výchozí: 1) |
Volba Smazat vše před importem odstraní stávající majetek tenanta před vložením nových záznamů.
Import uživatelů z CSV (/tools/import-users)¶
💡 Hromadné přidávání uživatelů z CSV — stávající uživatelé (dle e-mailu) jsou přeskočeni, nikdy smazáni.
CSV formát (sablona_uzivatele.csv):
| Sloupec | Povinný | Popis |
|---|---|---|
Jmeno |
Ano | Křestní jméno |
Prijmeni |
Ano | Příjmení |
Email |
Ano | E-mail — unikátní přihlašovací jméno |
Barcode |
Ne | Čárový kód |
RFID |
Ne | RFID čip |
PIN |
Ne | PIN pro terminál |
Importovaní uživatelé nemají nastaveno heslo — musí jej nastavit admin nebo použít funkci „Zapomenuté heslo".