From ba52486f53a60433bd8816c0ed71f13fbc185063 Mon Sep 17 00:00:00 2001 From: Josef Marek Date: Mon, 7 Sep 2026 10:50:23 +0200 Subject: [PATCH] =?UTF-8?q?Dokumentace=20k=20rozvr=C5=BEen=C3=AD=20podklad?= =?UTF-8?q?=C5=AF=20a=20vrstv=C3=A1m=20=C4=8D=C3=ADseln=C3=ADk=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ROZPISKY.md §2 a §8, ROZHRANI.md §3.4 (a odškrtnutá otevřená otázka v §9), CLAUDE.md. Baseline testů v promptech subagentů 36 -> 50. Co-Authored-By: Claude Opus 5 --- .claude/agents/render-dxf.md | 2 +- .claude/agents/verifikator.md | 4 ++-- .claude/agents/wpf-ui.md | 2 +- CLAUDE.md | 7 ++++++- docs/ROZHRANI.md | 26 ++++++++++++++++++-------- docs/ROZPISKY.md | 26 +++++++++++++++++++++----- 6 files changed, 49 insertions(+), 18 deletions(-) diff --git a/.claude/agents/render-dxf.md b/.claude/agents/render-dxf.md index 4419aa6..f9f1d1a 100644 --- a/.claude/agents/render-dxf.md +++ b/.claude/agents/render-dxf.md @@ -50,6 +50,6 @@ Needituj produkční data: `Rozpisky/Podklady/Rozpiska.dxf`, `vzorky/schema.dxf` 3. Ověř: `dotnet build "Rozpisky.sln" -nologo -v q -clp:ErrorsOnly` a `dotnet test "Rozpisky.Tests\Rozpisky.Tests.csproj" -nologo -v q` - (baseline je 36 zelených testů — nesmí ubýt). + (baseline je 50 zelených testů — nesmí ubýt). 4. V odpovědi vrať: co jsi změnil (soubor:řádek), proč, a výsledek buildu a testů. Když něco neprošlo, řekni to rovnou i s chybovou hláškou — nezakrývej to. diff --git a/.claude/agents/verifikator.md b/.claude/agents/verifikator.md index 27bc83a..2f0c41b 100644 --- a/.claude/agents/verifikator.md +++ b/.claude/agents/verifikator.md @@ -1,4 +1,4 @@ ---- +--- name: verifikator description: Read-only ověřovatel — spustí build a testy Rozpisek a vrátí strukturovaný verdikt. Použij po každé nezanedbatelné změně kódu, nebo když je potřeba nezávisle potvrdit, že projekt je v pořádku. Nic needituje. tools: Read, Grep, Glob, Bash, PowerShell @@ -17,7 +17,7 @@ dotnet test "C:\Users\marek\_Osobní\C sharp\EXE\Rozpisky\Rozpisky.Tests\Rozpis Testy spusť i tehdy, když build projde s varováními. Když build spadne, testy nespouštěj a rovnou hlas chyby buildu. -Baseline, se kterou porovnáváš: **build bez chyb a bez varování, 36 testů zelených, 0 přeskočených.** +Baseline, se kterou porovnáváš: **build bez chyb a bez varování, 50 testů zelených, 0 přeskočených.** Volitelně (jen když o to volající požádá) ověř, že aplikace naběhne: spusť `Rozpisky\bin\Debug\net10.0-windows\Rozpisky.exe`, počkej ~8 s, zkontroluj, že proces diff --git a/.claude/agents/wpf-ui.md b/.claude/agents/wpf-ui.md index 5b08bd6..a8e165b 100644 --- a/.claude/agents/wpf-ui.md +++ b/.claude/agents/wpf-ui.md @@ -35,7 +35,7 @@ nebo `Rozpisky/Xlsx/` jen popiš v odpovědi a nech je na volajícím. začneš měnit UI. 2. `MainViewModel.cs` je velký; hledej v něm grepem, nečti ho celý zbytečně. 3. Ověř: `dotnet build "Rozpisky.sln" -nologo -v q -clp:ErrorsOnly` a - `dotnet test "Rozpisky.Tests\Rozpisky.Tests.csproj" -nologo -v q` (baseline 36 zelených). + `dotnet test "Rozpisky.Tests\Rozpisky.Tests.csproj" -nologo -v q` (baseline 50 zelených). Build musí být **bez varování** — chyby v XAML se často projeví jen jako varování. 4. WPF chyby v bindingu build nezachytí. Pokud změna může binding rozbít, řekni to explicitně a doporuč ruční spuštění aplikace. diff --git a/CLAUDE.md b/CLAUDE.md index 763ec1b..993add9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,7 +11,7 @@ dotnet test "Rozpisky.Tests\Rozpisky.Tests.csproj" -nologo -v q dotnet run --project "Rozpisky\Rozpisky.csproj" ``` -Baseline: build bez chyb a varování, **36 testů zelených**. Před hlášením hotovo obojí spustit +Baseline: build bez chyb a varování, **50 testů zelených**. Před hlášením hotovo obojí spustit (nebo použít `/overit`). ## Architektura — jediné pravidlo, které se nesmí porušit @@ -35,6 +35,11 @@ jen relevantní kapitolu. (WPF-DarkTheme-Kit). Žádné hardcoded `#RRGGBB` ani natvrdo zadané odsazení. - `Nullable` a `ImplicitUsings` jsou zapnuté v obou projektech. - COM (CAD, MS Excel) jde přes pozdní vazbu (`dynamic`) — nepřidávat interop assembly. +- Uživatelská data (číselníky, výběr CADu, logy) jdou přes + [`UzivatelskaData`](Rozpisky/Data/UzivatelskaData.cs) do `%APPDATA%\Rozpisky`. Do složky u `.exe` + se **nezapisuje** — může být jen pro čtení a přeinstalace ji přepíše. Číselníky navíc žijí ve dvou + vrstvách ([`CiselnikyStore`](Rozpisky/Data/CiselnikyStore.cs)): dodávaná + uložený rozdíl + uživatele. Změnu slučování vždy pokrýt testem — chyba tam se projeví tichou ztrátou dat. ## Rozvržení složky — tři druhy podkladů diff --git a/docs/ROZHRANI.md b/docs/ROZHRANI.md index 145146b..539da1e 100644 --- a/docs/ROZHRANI.md +++ b/docs/ROZHRANI.md @@ -131,12 +131,22 @@ Na revize se odkazují řádkové revizní sloupce přílohy (R1–R4) a revizn | **Verze dokumentace** | verze | stupeň dokumentace | | **Části** | označení, název části | části/objekty v seznamu | -> **Číselníky jsou sdílená data napříč projekty a žijí v samostatné databázi vedle `.exe`.** -> V původním Excelu šlo o samostatné listy s daty (označení dokumentace, data firem apod.). -> Ve standalone aplikaci se z nich stane **externí databázový soubor uložený vedle spustitelného -> souboru** (např. `cisleniky.db` / `.json` ve složce aplikace), aby ho šlo **průběžně doplňovat -> a sdílet** mezi projekty bez zásahu do aplikace. (Na rozdíl od revizí, které jsou interní -> k zakázce – viz [3.3](#33-revize-původní-list-revize).) +> **Číselníky jsou sdílená data napříč projekty a žijí mimo projekt.** V původním Excelu šlo +> o samostatné listy s daty (označení dokumentace, data firem apod.). Ve standalone aplikaci jsou +> uložené ve **dvou vrstvách JSON** (na rozdíl od revizí, které jsou interní k zakázce – +> viz [3.3](#33-revize-původní-list-revize)): +> +> | Vrstva | Soubor | Role | +> |---|---|---| +> | dodávaná | `ciselniky.vychozi.json` vedle `.exe` | výchozí obsah dodaný s programem, jen ke čtení; každá instalace ho obnoví | +> | uživatelská | `ciselniky.user.json` v `%APPDATA%\Rozpisky` | jen **rozdíl** proti dodávané: `Vlastni` (přidané a upravené položky) + `Skryte` (klíče odklizených dodávaných položek) | +> +> Při načtení se vrstvy slučují: dodávané pořadí zůstává, upravená položka se přepíše na svém +> místě, vlastní se řadí za ně. Při uložení se rozdíl dopočítá znovu. Smysl rozdělení: uživatel +> číselníky průběžně doplňuje (ručně i samoučením jmen z projektů) a **přeinstalace novou verzí +> mu je nesmí přepsat** – zároveň smí nová verze dodávaný číselník libovolně měnit. +> Klíč položky: `Nazev` (organizace, firmy, kraje), `Hodnota` (jména, verze), `Oznaceni` (části); +> porovnává se bez ohledu na velikost písmen. ### 3.5 Konfigurace @@ -396,8 +406,8 @@ Orientační fázování (priorita shora dolů): - **Formát uložení** – rozdělené úložiště: - **Projekt** (údaje + seznam příloh + **revize**) = interní data jedné zakázky → formát k rozhodnutí (JSON / SQLite / vlastní). - - **Číselníky** (organizace, firmy, jména, profese, verze, části) = **externí databáze vedle `.exe`**, - sdílená a doplňovatelná napříč projekty ([3.4](#34-číselníky)) → formát k rozhodnutí. + - ~~**Číselníky** – formát a umístění.~~ **Vyřešeno:** dvě vrstvy JSON – dodávaná vedle `.exe`, + uživatelská (rozdíl) v `%APPDATA%\Rozpisky` ([3.4](#34-číselníky)). - **Generátor 47-pozičního kódu** – doimplementovat dle manuálu kap. 3.2.1–3.2.8 vč. okrajových případů (sdružené objekty `SK`/`PK`, kap. 3.3; pracovní vs. definitivní verze). - **Orientační schéma** – jak se obrázek schématu získá/přiřadí k příloze (vstup uživatele vs. generování). diff --git a/docs/ROZPISKY.md b/docs/ROZPISKY.md index 1931a21..cb2def5 100644 --- a/docs/ROZPISKY.md +++ b/docs/ROZPISKY.md @@ -73,8 +73,17 @@ Rozpisky/ └─ MainWindow.xaml(.cs) ← hlavní okno ``` -Vedle .exe se dodávají editovatelné soubory: `Rozpiska.dxf` (šablona), `SEZNAM.xlsx` (mustr seznamu), -`ciselniky.json`, `mapovani.json`, `cad.json`, `layout.json`, `loga/` a manuál SŽ (PDF). +Datové soubory jsou rozdělené podle toho, kdo je vlastní: + +| Kde | Co | Kdo zapisuje | +|---|---|---| +| vedle `.exe` (zdroj `Rozpisky/Podklady/`) | `Rozpiska.dxf`, `SEZNAM.xlsx`, `ciselniky.vychozi.json`, `mapovani.json`, `loga/`, manuál SŽ (PDF) | nikdo – dodává se s programem, každá instalace přepíše | +| `%APPDATA%\Rozpisky` ([`UzivatelskaData`](../Rozpisky/Data/UzivatelskaData.cs)) | `ciselniky.user.json`, `cad.json`, `layout.json`, `error.log`, `tisk_diag.log` | aplikace za běhu | +| kdekoli u uživatele | projekty `.rzp` | aplikace na vyžádání | + +Rozdělení existuje proto, aby přeinstalace novou verzí (nebo `.exe` v `Program Files`, kam se nesmí +psát) nesmazala nic, co si uživatel nastřádal. Portable režim se zapíná souborem `portable.txt` +vedle `.exe` – pak se všechno vrátí do složky aplikace. --- @@ -199,9 +208,16 @@ Aplikace **nemá CLI režim** – vše jede z GUI. Neočekávané výjimky zachy - **Projekt `.rzp`** ([`ProjektStore`](../Rozpisky/Data/ProjektStore.cs)) – JSON s exkluzivním zámkem drženým po dobu otevření (ostatní procesy smí jen číst). Zápis serializuje **před** useknutím souboru, aby pád nezanechal prázdný soubor. -- **Configy vedle .exe** (`ciselniky.json`, `cad.json`, `layout.json`, `mapovani.json`) jdou přes - [`JsonConfigFile`](../Rozpisky/Data/JsonConfigFile.cs): **atomický zápis** (přes `.tmp`) a při - poškozeném souboru **záloha do `.bak` + upozornění** (místo tichého přepsání výchozími daty). +- **JSON configy** (`ciselniky.user.json`, `cad.json`, `layout.json` v uživatelské složce, + `mapovani.json` vedle .exe) jdou přes [`JsonConfigFile`](../Rozpisky/Data/JsonConfigFile.cs): + **atomický zápis** (přes `.tmp`) a při poškozeném souboru **záloha do `.bak` + upozornění** + (místo tichého přepsání výchozími daty). +- **Číselníky ve dvou vrstvách** ([`CiselnikyStore`](../Rozpisky/Data/CiselnikyStore.cs)) – dodávaná + `ciselniky.vychozi.json` (jen ke čtení) a uživatelská `ciselniky.user.json`, kde je uložený jen + **rozdíl** proti ní (přidané/upravené položky + klíče skrytých). Nová verze programu tak smí + dodávaný číselník měnit, aniž by uživatel přišel o svoje záznamy. +- **Migrace starých poloh** ([`Migrace`](../Rozpisky/Data/Migrace.cs)) – data zapisovaná dřív vedle + .exe se při startu přenesou do uživatelské složky; originál se jen přejmenuje na `.migrovano`. - **Zamčený cíl exportu** – před zápisem PDF/XLSX/DXF se ověří, zda soubor nedrží jiný program (Excel, prohlížeč PDF), a nabídne Pokračovat/Přerušit.