Seznam změn
Vývojový log StoneCalc
1.5.152
- UI: odstraněna bledá ⓘ u pole „Ořez výrobce" (interní BO údaj) — je nadbytečná, ořez vysvětluje nápověda „Rozměry desky". Zůstávají jen jednotné ⓘ odznaky.
1.5.151
- UI: ikony nápovědy ⓘ sjednoceny na pozici HNED ZA NADPISEM (dřív byly u kapitol opracování vpravo, u sekcí za nadpisem) — teď všude stejně.
1.5.150
- Typ použití povinné — UX: chybějící Typ použití se teď hlásí HNED při „Pokračovat" (u Kámen jasná hláška se seznamem desek + odscroll), a chybná deska je červeně označená „⚠ Typ použití / Typ dílce" v pravém výpisu desek — s hodně dílci hned poznáte, která to je.
1.5.149
- Typ použití / Typ dílce je nově POVINNÝ — nelze pokračovat z kroku Desky, dokud ho každá deska nemá (ovlivňuje cenu montáže). Platí pro Kámen, Compact, Ostatní i Přírodu (Zbytky ho nemají). Kontrola až po uložení (desky se neztratí) + červená hláška a zvýraznění chybějícího pole.
1.5.148
- UI: všechny ikony nápovědy ⓘ (materiál, rozměry, kapitoly opracování, kroky…) sjednoceny na plný zlatý odznak zarovnaný doprava — konzistentní vzhled a lepší viditelnost všude.
1.5.147
- Nápovědy/UI: kde je kontextová nápověda ⓘ, mažeme nadbytečné inline věty. Odstraněn popisný hint u „Typ použití" (byl navíc zastaralý — tvrdil „nemá vliv na výpočet", přitom ovlivňuje montáž). Funkční inline (max rozměr, default délky řezu, placeholdery) zůstávají.
1.5.146
- FIX (cena materiálu): po změně dekoru se spotřeba (počet desek) nyní tvrdě resetuje a musí se přepočítat v nářezu — dřív mohla zůstat prázdná a cenovka se publikovala s cenou materiálu 0 Kč. Nově navíc nejde publikovat cenovku, kde má materiál cenu za m², ale cena materiálu vyšla 0 — systém pošle na krok Nářez s hláškou.
1.5.145
- Nápovědy: obrázky sdílené mezi SC a Outletem, text může být jiný (jiné UI — SC zadává typ+délku hrany, Outlet strany A–D). Outlet použije vlastní text z boxu „Nápovědy konfigurátoru", když je vyplněný; jinak sdílí text z SC.
- UI: ikona nápovědy ⓘ u kapitol opracování (SC) je teď jako plný zlatý odznak — výrazně viditelnější.
1.5.144
- UI: ikona nápovědy ⓘ u kapitol opracování (průvodce SC) je nově vpravo a výraznější (dřív byla na střed a málo viditelná).
1.5.143
- Nápovědy — sjednocení (Fáze 1): Outlet konfigurátor teď čte nápovědy ke skupinám opracování z jednoho zdroje — SC „Nápovědy" (článek s klíčem step02-opgroup-{skupina}). Když článek existuje, platí pro SC i Outlet; dokud ne, zůstává původní text. Text se tak edituje na jednom místě.
1.5.142
- Duplikace cenovky: přílohy (výkresy a soubory) se teď přenesou i do kopie („Duplikovat jako koncept" i „Převod na jinou organizaci"). Kopie souborů jsou samostatné — smazání přílohy u jedné cenovky neovlivní druhou.
1.5.141
- CN Zbytky — auto-přidání operací: dílce zbytků teď automaticky přidávají navázané operace stejně jako Quarz/Keramika/Ostatní (např. výřez pro dřez → otvor pro baterii). Auto-přidaná operace má odznak ⚙; ruční odebrání ji už znovu nepřidá. (Pravidla dál dle admin „Auto-přidání operací" + rozsahu ceníku.)
1.5.140
- CN Ostatní — rabat: potvrzeno a zamčeno, že rabat je výhradně z pole „Rabat VOC (%)". Prázdné = 0 % (žádné odvození z výrobce materiálu — u Ostatní ho neznáme). Odstraněna matoucí nápověda „Quarz = jako Technistone · Keramika = jako Atlas" u výběru ceníku (týkala se ceníku/StoneCutu, ne rabatu).
1.5.139
- Administrace → Fotky dekorů: potvrzovací hláška po načtení fotek přesunuta na správnou stránku (z Diagnostiky do Administrace, kam funkce po refaktoru dev352 patří). Chování stejné, jen čistší vlastnictví — nemůže se rozbít.
1.5.138
- Admin Diagnostika: rozdělena do 3 záložek (🖥️ Systém / 🔍 Data a ladění / 🛠️ Nástroje) — přehlednější, těžké dotazy se pouští jen pro aktivní záložku. „Načtení fotek dekorů“ přesunuto do Administrace → Fotky dekorů (týká se provozu). Starý ProfesorBruno chat widget odstraněn (bude postavený jinak).
1.5.75
- Outlet: jednotlivé ceny operací skryté (zákazník vidí jen Deska + Opracování + Celkem; PDF ceny nechává). Objednávka: samostatná pole Firma/IČ/DIČ + celá adresa (ulice/město/PSČ) pro přenos do Heliosu.
1.5.74
- Outlet: oblouky se nabízejí na všech materiálech (i tam, kde má oblouk jiné číslo). Výrobní PDF: náčrt ABCD u hran + v názvu operace zůstává označení hrany. Tlačítko objednávky „Objednat s povinností platby“ (zákonný požadavek).
1.5.73
- Outlet konfigurátor: „Typ oblouku“ se nabízí na všech materiálech (operace oblouk se do sekce vytahuje napřímo z ceníku, i když je jinak skrytá).
1.5.72
- Outlet: výrobce (značka — Silestone, Dekton, Technistone…) na detailu desky a ve výrobním PDF; dle kombinace Výrobce+Skupina (import sloupce M z XLSX), mimo tabulku = Příroda.
1.5.71
- Outlet: výrobní zadání (PDF) k objednávce — ke stažení na sledovací stránce i v administraci, a jako příloha potvrzovacího e-mailu zákazníkovi.
1.5.70
- Outlet konfigurátor: přiložení výkresu (PDF/JPG/PNG, do 10 MB) — zobrazí se u objednávky v administraci i na sledovací stránce.
1.5.69
- Outlet konfigurátor: náčrt ABCD přesunut k hranám (u rozměru A/B mátl); skupiny opracování bez operací (např. Typ oblouku) se skryjí.
1.5.68
- Outlet: nápovědy ke skupinám opracování v konfigurátoru jsou editovatelné v Adminu (Nápovědy konfigurátoru), včetně vkládání obrázků.
1.5.67
- Outlet konfigurátor přepracován (dle eshopu): hrany A/B/C/D se skutečnými operacemi + náčrt, panel Zdrojová/Požadovaná/Prořez/Zbývá, ostatní opracování jako sekce s nápovědou, ponechat zbytky. (Výkres + výrobní PDF = navazující kroky.)
1.5.66
- Outlet FTP: bereme jen soubory s prefixem BPZ (ostatní ignorujeme).
1.5.65
- Outlet: platba kartou GoPay (F5b) — na sledovací stránce „Zaplatit kartou“ → potvrzení → brána; stav se ověřuje přes API + notifikace. Přístupy v Admin → Outlet → GoPay. FTP: soubory bez prefixu BPZ, širší auth metoda.
1.5.64
- Outlet: stahování fotek + mapy vad z FTP (přírůstkově, jen desky skladem bez fotky) — nastavení, test připojení a stažení v Admin → Outlet.
1.5.63
- Outlet: podtitul výpisu bez ošklivého zlomu „je originál“; z úvodních podmínek vyňat bod o skladování 2 měsíce.
1.5.62
- Outlet: úvodní text nad výpisem desek (podmínky prodeje) — editovatelný v Admin → Outlet, předvyplněný.
1.5.61
- Hlavička: podtitul (Outlet/StoneCalc) vycentrovaný pod logo; navigační odkaz „Zbytky“ přejmenován na „Outlet“.
1.5.60
- Outlet: odstoupení od smlouvy — doplněna informace, že u zakázkově opracovaných desek lze odstoupit do zahájení výroby.
1.5.59
- Cookie lišta (souhlas) na /calc i /outlet — vlastní řešení dle rodinného patternu (4 kategorie, souhlas 12 měsíců, „Nastavení cookies“ v patičce). Stránka Cookies předvyplněná.
1.5.58
- Outlet: formulář pro odstoupení od smlouvy — ověří objednávku (číslo/VS + e-mail), pošle e-mail Back Office i potvrzení zákazníkovi.
1.5.57
- Outlet: patička s právními stránkami (GDPR, obchodní podmínky, cookies, odstoupení od smlouvy, reklamace) — editovatelné v Admin → Outlet → Stránky, s předvyplněním z eshopu. Zákaznický kontakt v patičce.
1.5.56
- Outlet F5a: potvrzovací e-mail zákazníkovi (sledovací odkaz + platba převodem, VS = číslo objednávky) + notifikace BO; platební údaje na sledovací stránce; účet/notifikace v Admin → Outlet.
1.5.55
- Outlet admin: přehled objednávek (menu Objednávky) + akce Potvrdit / Zaplaceno / Zrušit (zrušení uvolní rezervace desek).
1.5.54
- Outlet: objednávkový formulář (F4b) — kontakt, odběr/doprava, GDPR souhlas; server přepočítá ceny, zarezervuje desky, magic-link na sledování objednávky. (Platba + e-mail + Helios = další krok.)
1.5.53
- Outlet: oprava počtu položek u ikony košíku v hlavičce.
1.5.52
- Outlet: košík (F4a) — „Do košíku“ z konfigurátoru, přehled košíku s více deskami, odkaz v hlavičce s počtem. Objednávkový formulář zatím připravujeme.
1.5.51
- Outlet konfigurátor: pole pro rozměry už neposkakují (info „plocha“ a varování na samostatný řádek).
1.5.50
- Outlet: mapa vad — dorovnaná levá hrana (X kalibrace). Konfigurátor: opracování v nabídce seskupené do kapitol (optgroup).
1.5.49
- Outlet: konfigurátor (F3a) — z jednoho zbytku víc výrobků + opracování, živá cena, kontrola vejití. % ztráty nastavitelné v Adminu (default 15 %).
1.5.48
- Outlet: mapa vad zarovnaná na fotku — kalibrace ověřená proti reálným skenům (X 1:1, Y překlopení × 0,9753).
1.5.47
- Outlet: minimální cena (pod kterou se deska nezobrazí) je nově nastavitelná v Adminu, ne napevno.
1.5.46
- Outlet: mapa vad — oprava kalibrace (Y od spodu → překlopeno); detail bez „do košíku" (deska jen přes konfigurátor); desky s cenou < 1000 Kč se nezobrazují (ochrana proti chybám v cenách).
1.5.45
- Outlet (F2): VEŘEJNÝ výpis zbytkových desek na /outlet (bez loginu) — dlaždice s fotkou/cenou, filtr dle materiálu, stránkování; detail desky s mapou vad (SVG překryv) + cena s/bez DPH.
1.5.44
- Outlet: volitelný úklid při syncu — smaže soubory desek mimo sklad starší 90 dní (čerstvé orphany zůstanou).
1.5.43
- Outlet (F1b): sync fotek + mapy vad ze složky — parse BPZ.xml (rozměry, vady, obrys+polygony) + spárování BPZ.jpg. Zdroj = složka pod uploads (později FTP).
1.5.42
- Outlet: desky, které chybí v novém XLSX importu, se skryjí (měkké smazání) místo šedivého „vyprodáno".
1.5.41
- Outlet eshop — základ (F1): samostatné admin menu „Outlet" (oddělené od StoneCalc), import
1.5.40
- Export Přírody / Ostatní do Heliosu: při objednávce se u každého materiálu zadá registrační číslo
1.5.39
- Seznam CN: šipka pro rozbalení variant je výraznější (větší, plný trojúhelník ▶/▼).
1.5.38
- Seznam CN: varianty ve skupině jde sbalit/rozbalit — u vedoucí nabídky je odznak „N×" jako přepínač
1.5.37
- Přeskok mezi kroky wizardu přes horní lištu kroků teď nejdřív uloží aktuální krok — data se
1.5.36
- Povinný Kraj / region (zákazník) je teď výrazně označený: červený štítek „povinné", jantarové
1.5.35
- Kraj / region (Místo realizace) je nově POVINNÝ pro zákazníky (Director / Manager / Uživatel) —
1.5.34
- Nářezový plán vidí i zákazníci (Director / Manager / Uživatel) — ikona v seznamu, sekce v detailu
1.5.33
- Nářezový plán je u UZAVŘENÉ (publikované) cenovky zamrazený a už se nemění — při prvním zobrazení
1.5.32
- Nářezový plán je teď dostupný i po uložení: ikona 🪚 v řádku seznamu CN (skočí na rekapitulaci
1.5.31
- Školení — kompaktnější a přehlednější blok na přihlašovací stránce: viditelný nejbližší termín,
1.5.30
- Školení: nastavitelný kontaktní e-mail (notifikace o přihláškách + veřejná adresa na login stránce)
1.5.29
- Online školení — fáze 2: na přihlašovací stránce (místo Novinek) je nyní seznam vypsaných termínů
1.5.28
- Online školení — základ (fáze 1): nové tabulky termínů a přihlášek + admin záložka „Školení"
1.5.27
- Admin „Viditelnost značek" přestavěna na skutečné značky z dekorů (stejný zdroj jako frontend).
1.5.26
- Diagnostika: nový read-only „Audit značek (Quartz / Keramika)" — živá čísla, kolik má každá značka
1.5.25
- Výběr značky postaven na skutečné značce z dekorů teď i ve zbývajících flow: Zbytky, převod
1.5.24
- Výběr obchodní značky (Kámen flow) postaven na skutečné značce z dekorů (Znacka), ne na názvech
1.5.23
- Oprava: interní role (Back Office / Obchodník / administrátor) teď ve výběru „Obchodní značka"
1.5.22
- Drobnost: „+ Vyber operaci…" v pickeru odsazeno pod název kapitoly (čitelnější hierarchie).
- Piktogramy dřezů na míru (TYP A–G). U výběru i přidaných dřezů/umyvadel se zobrazí ikonka podle
1.5.18
- Sjednocený výběr i v Příslušenství a Dřezech/umyvadlech — nativní select nahrazen stejným
1.5.17
- Piktogramy operací i ve flow Příroda, Ostatní a Zbytky (výběr operace i u přidaných). Sjednoceno
1.5.16
- Piktogramy operací i ve VÝBĚRU. Výběr operace (Kámen flow) je nově vlastní rozbalovací seznam,
1.5.15
- Piktogramy operací (Fáze 1). U přidaných operací se v kartě desky zobrazí čárová ikonka
1.5.14
- Nářezový plán — transparentnost optimalizace. StoneCut (1.0.28) nově zkouší víc variant rozmístění
1.5.12
- Mobil — další stránky. Seznam uživatelů se na telefonu (≤860px) zobrazí jako karty (jako seznam CN).
1.5.11
- Mobilní zobrazení seznamu cenovek. Na telefonu (≤900px) se ze široké tabulky staly přehledné
1.5.10
- Oprava zobrazení ZMD: v rozpisu (detail CN i PDF) chyběl řádek „Výnos nad patro", přitom se
1.5.9
- Breton XML — server-side parser + „výrobní rozpis". Po načtení CAM exportu se spočítají délky
1.5.8
- Systémový font v celé aplikaci. Divi (přes wp_head) vnucoval Open Sans na body, formulářové prvky
1.5.7
- Hotfix tmavého režimu: pozadí stránky zůstávalo bílé. Divi téma (přes wp_head) definuje
1.5.6
- Tmavý režim (dark mode). V ⚙ Nastavení nová volba „Vzhled": Automaticky (podle zařízení) /
- Technicky: barvy přes CSS proměnné + light-dark(), přepínání přes color-scheme na <html data-theme>.
1.5.5
- Nové osobní nastavení uživatele (⚙ Nastavení v hlavičce) — volba „Otevírání PDF": Stáhnout soubor /
1.5.4
- Deaktivace účtu ve wp-adminu (Uživatelé → editace → sekce StoneCalc): zaškrtávátko „Účet je deaktivovaný"
1.5.3
- Ceny hotových výrobků (dřezy/příslušenství) skryté zákazníkovi i v rekapitulaci (krok Kalkulace — řádek
1.5.2
- Hotové výrobky (Příslušenství, Dřezy a umyvadla, Integrity dřezy): zákazník už nevidí ceny v nabídce —
1.5.1
- Zákaznický manuál nově i ve slovenštině (`/calc/manual` při jazyce SK → `manual-sk.php`).
1.5.0
- MILNÍK — Back Office kompletní + self-service pro zákazníky (vč. slovenských).
- Slovenština dokončena: doplněny chybějící překlady napříč UI (přílohy, nápověda, štítky, PDF štítky),
- Souhrn 1.4.x: zákaznický režim (5 rolí, pozvánky, branded login/maily), fotky dekorů, ikony kapitol operací,
- Pozn.: zákaznický manuál ve slovenštině zůstává na později (mimo rozsah 1.5.0).
1.4.75
- Fotky dekorů: scanner nově páruje PRIMÁRNĚ podle složky (= značky) + názvu dekoru, teprve pak podle RegCis.
1.4.74
- Interní manuál — nová stránka /calc/manual-interni (jen BO/OZ): kompletní referenční příručka —
1.4.73
- Nápověda /calc/manual přepsána na ZÁKAZNICKOU verzi — jen zákaznické funkce + Kámen (Quarz/Keramika/
1.4.72
- Hlášení chyb (widget) pro zákazníky: přejmenováno na „Nahlásit chybu / připomínku" (interní BO/OZ
1.4.71
- Přílohy cenovky: nové nahrávání přes drag & drop — přetáhni soubory nebo klikni pro výběr,
1.4.70
- Operace: každá kapitola (Řez, Typ hrany, Otvory, Usazení dřezu…) má nově vlastní vektorovou ikonu
1.4.69
- Typ cenovky u „Kámen" flow se nově zpřesňuje podle použitých desek: jen Quarz → „Quarz",
1.4.68
- Hlavička: druhá řádka u jména — interní role (Back Office, obchodní zástupce, admin) vidí
1.4.66
- Hlavička: oprava druhé řádky u OZ (obchodní zástupce) — zobrazovala náhodnou první firmu ze seznamu
1.4.65
- Auto-přidání operací: k pravidlu lze nově zadat vlastní „Text upozornění" (toast). Prázdné = výchozí
1.4.64
- Auto-přidání operací se nově spravuje v Administraci (StoneCalc → Auto-přidání operací) — pravidla „když se přidá
1.4.63
- Nápověda (bod 2) — nenásilné toasty (upozornění v rohu, samy zmizí): (a) při auto-přidání operace
1.4.62
- Nápověda — rozcestník: menu „Nápověda" nově vede na rozcestník se 2 sekcemi — „Jak pracovat s aplikací"
1.4.61
- Nápověda: (ⓘ) ikona nově i u standardních kapitol opracování (dřív jen u obloukových) — teď má každá
1.4.60
- Role „Director" (dohled) — bez nové role: Manažer + pole „Monitorovaná IČ" v profilu (wp-admin). Manažer u své
1.4.59
- Role OZ (obchodní zástupce) — rozsah firem se nově odvozuje AUTOMATICKY z Heliosu: OZ vidí všechny organizace,
1.4.58
- Role — oprava rozsahu viditelnosti: role „Uživatel" nově vidí JEN SVÉ cenovky (dřív viděl všechny CN celé
1.4.57
- Seznam CN — varianty nově vizuálně odsazené se svislou vodicí linkou (strom skupina→varianty).
- Přihlašovací stránka (/calc/login) — přidán odkaz „Zapomněli jste heslo?" na (nabrandovaný) WP reset hesla.
1.4.56
- BO detail — první PDF tlačítko („MOC — pro zákazníka", u projektu „Stáhnout cenovou nabídku") bylo trvale černé;
1.4.55
- UX: zvýrazněný blok „Rozměry" i ve flow Zbytky (sekce „Rozměry a cena zbytku"). Příroda/Ostatní už mají vlastní
1.4.54
- UX (náhled): sekce „Rozměry desky" ve wizardu je nově ve zvýrazněném bloku (světlý podklad + barevný proužek),
1.4.53
- Detail (zákazník) — box PDF: nadpis nově „Stáhnout cenovou nabídku", 1. tlačítko „MOC — zákazník" (dřív
1.4.52
- Seznam uživatelů — profesionální filtrační řádka (Příjmení/jméno · E-mail · ID Helios · Firma), stejný vzhled
1.4.51
- Seznam uživatelů „na tisíce": server-side vyhledávání (jméno / e-mail) + stránkování (30/stránku) přes
- Editace uživatele předělána z Alpine na nativní <details> dropdown (Alpine se v <tr> tabulky nezpracoval,
1.4.50
- Hotfix: tlačítko „Editace" v seznamu uživatelů nefungovalo (Alpine x-data na <tr> se v tabulce nezpracoval).
1.4.49
- (Self-service, vlna 4 — profi komunikace) Pozvánkový e-mail nově jako branded HTML (logo BRUNO PAUL, barvy,
- (Self-service, vlna 4) Přihlašovací / heslové stránky (wp-login.php: přihlášení, nastavení hesla, reset) nově
1.4.48
- (Self-service, vlna 2+3) Seznam CN: tlačítko Breton skryto zákazníkovi (jen BO/OZ); vyhledávací placeholder bez
- (Globální) StoneCalc favicon (přebíjí WP default); v hlavičce u jména nově i společnost/organizace přihlášeného.
- (Správa uživatelů 2b) Seznam uživatelů: sloupce Jméno · ID Helios · Společnost · E-mail · Role (jednoslovná) +
- (Správa uživatelů 2c) Akce nad uživatelem: Reset hesla (znovu odeslat odkaz), Editace = změna role Uživatel↔Manažer,
- (Privacy) Feedback widget „Připomínky": zákazník (ne-interní) vidí nově jen SVÉ připomínky, ne cizí testery
1.4.47
- (Self-service, fáze 1c/vlna 1) Zákaznický pohled ve wizardu + detailu — skryty všechny dílčí ceny a interní věci
1.4.46
- (Self-service, fáze 2b) Nová stránka „Uživatelé" (/calc/uzivatele) — odkaz v hlavičce pro BO/OZ/Manažera.
1.4.45
- (Self-service, fáze 2a) Role „Uživatel" a „Viewer" jsou nově DEFAULTNĚ BEZ VOC (vidí jen MOC) — CAPS_VERSION 3,
1.4.44
- (Self-service, fáze 1c — krok 06) V kalkulaci vidí zákazník (ne-interní) jen finální cenu + ZMD; skryty rozpady
1.4.43
- (Self-service, fáze 1c — tělo detailu) Zákazníkovi (ne-internímu) se v detailu CN skryjí ceny materiálů (sloupce
1.4.42
- (Self-service, fáze 1c — část) Skrytí dílčích cen u zákazníka: MOC PDF pro zákazníka (ne-interního) je vždy jen
1.4.41
- (Self-service, fáze 1b — bezpečnost) Gate na akce: zakládání CN vyžaduje CREATE_QUOTE (blokuje roli Viewer);
1.4.40
- (Self-service, fáze 1a — bezpečnost) Route-level oprávnění: kontrola vlastnictví CN na detailu a PDF endpointech.
1.4.39
- DPH v MOC — v PDF cenovce pro zákazníka je nově hlavní (velká) cena UVEDENA VČETNĚ DPH, pod ní rozpad
1.4.38
- (#1 SK — 11/n) Výchozí jazyk uživatele — vlastní pole „Jazyk StoneCalc" (Automaticky / Čeština / Slovenčina)
1.4.37
- (#1 SK — 10/n) Přepínač jazyka CZ/SK v hlavičce (vpravo) — už není potřeba volat jazyk parametrem `?lang`.
1.4.36
- (#1 SK — 9/n) JS i18n dokončeno — krok 02 (Kámen + varianty Příroda/Ostatní/Zbytky): přeloženy všechny
- · K OVĚŘENÍ slovenskými kolegy: kvalita překladů; a otestovat .xlsx import v SK (šablona má SK hlavičky —
1.4.35
- (#1 SK — 8/n) JS i18n 2. část: přeloženy dynamické texty v detailu cenovky (dialogy Objednat/Duplikovat/Převést,
1.4.34
- (#1 SK — 7/n) JS i18n — infrastruktura + 1. část dynamických textů: nový klientský helper `scT('český klíč')`
- · Zbývá dodělat JS ve: krok 02 (+ varianty Příroda/Ostatní/Zbytky), krok 03 (nářez), detail cenovky, krok 06 projekt.
1.4.33
- (#1 SK — 6/n) Slovenština napříč celou aplikací (2. vlna i18n): obaleno ~1250 řetězců přes `sc_t()` ve
- · Statický UI text je nyní slovenský dle jazyka rozhraní/dokladu; data z Heliosu (názvy materiálů, dekorů,
- · ZNÁMÉ OMEZENÍ: dynamické texty v JavaScriptu (validační hlášky, potvrzovací dialogy, živé „Dílec N"
- · Připraveno ke kontrole slovenskými kolegy (překlady jsou první verze k proofreadu).
1.4.32
- (#1 SK — 5/n) Základ i18n (překladová vrstva) + slovenština pro zákaznické PDF a přihlášení:
- · Nová vrstva `Support\I18n` + zkratka `sc_t()` (styl gettext: zdroj = čeština, `lang/sk.php`
- · Jazyk DOKLADU (PDF) dle ODBĚRATELE cenovky (SK odběratel → slovenské PDF), jazyk ROZHRANÍ dle
- · Přeloženo: standardní cenové PDF (vč. právních textů a patičky), přihlašovací stránka, hlavička/patička.
- · POZOR: zbytky/projekt PDF a wizard/seznam/detail se překládají v dalším kroku (zatím zůstávají česky).
1.4.31
- (#1 SK — 4/n) Zaokrouhlení konečné částky na celá € nahoru: v EUR se KONEČNÁ částka (MOC/VOC celkem,
1.4.30
- (#1 SK — 3/n) EUR default pro slovenského odběratele: cenovka s odběratelem ze SK (sc_distributors.state
1.4.29
- (#1 SK — 2/n) Napojení SK ZMD na výpočet: cenovka s realizací SK počítá ZMD z fixních částek (Administrace,
1.4.28
- (#1 SK — 1/n) Administrace → Sazby ZMD → nová sekce „ZMD Slovensko" (4 fixní částky v EUR: Zaměření, Montáž,
1.4.27
- (#3 „Sada cenovek", varianta A) Propojení více CN jedné zakázky (např. Quarz + Příroda zvlášť).
1.4.26
- (#3-A) Kombinace materiálů na jedné CN: Kámen cenovka nově nabízí i **Compact** (Quarz + Keramika + Compact
1.4.25
- (#6) Výška polí 44 px teď spolehlivě i pro číselná a datová pole (přebití Divi type-specific stylů přes
1.4.24
- (#6) Sjednocená výška polí: textové inputy i selecty jsou teď stejně vysoké (44 px) — dekor řádek ladí
1.4.23
- (#6) Dekor: hledací pole roztaženo na celou levou půlku (width:100%) — ladí s Tloušťkou/Povrchem.
1.4.22
- (#6) Dekor UI dolazení: řádek 50/50 (vlevo našeptávač názvu, vpravo tlačítko „Výběr podle obrázku");
- FotoVýběr: lightbox — u dlaždice tlačítko lupy → zvětší celý uložený obrázek dekoru (klik mimo/✕ zavře).
1.4.21
- (#6 fáze 2) FotoVýběr — výběr dekoru podle obrázku: tlačítko „📷 FotoVýběr" u pole Dekor otevře modal
1.4.20
- (#6) Dekor combobox: řádek zarovnán nahoru (align-items:flex-start) — náhled zůstane u pole
1.4.19
- (#6 fáze 1) Výběr dekoru = combobox na jeden řádek (jako u organizací): hledání i výběr v jednom poli,
1.4.18
- (#6 fáze 0) Fotky dekorů „na vždy": provázání image_path teď přežije Helios reimport dekorů
1.4.17
- (#7) Seznam CN — pevné šířky sloupců (table-layout:fixed + colgroup): stejné zalamování v každém řádku
1.4.16
- (#7) Stránka nabídek — kompaktnější a rychlejší:
- Typ jako barevná zkratka (KA/CO/PŘ/ZB/OS/PR) s plným názvem v tooltipu; doplněny barvy pro Zbytky/Ostatní/Projekt.
- Stav jako barevná tečka + krátký text.
- Akce na jeden klik přímo v řádku: 👁 Detail · PDF MOC · PDF VOC (jen BO) · ⧉ Duplikovat.
1.4.15
- (#5b) Invisa Cook – Neviditelné vaření (skup. 430) se nabízí pouze k desce z materiálu Keramika (130);
1.4.14
- Připomínky testerů — první dávka rychlých úprav:
- (#4) Identita cenovky = „Skupina + Varianta" místo „ID + Skupina" (detail + wizard souhrny; skutečný kód cenovky
- (#2) Vyhledávání zákazníka i podle čísla organizace (Helios) a IČ; číslo organizace se zobrazuje v našeptávači,
- (#5) Integrity dřezy: skupina 440 přejmenována na „Integrity dřezy Silestone", nabízí se pouze k desce značky
1.4.13
- Viditelnost značek pro zákazníka (vrstva 3): příznak customer_visible na značkách (DB v12, auto-migrace,
1.4.12
- Sbalitelné sekce doplněny do zbývajících flow (sdílený _autoacc): projektové cenění (Služby i
1.4.11
- Detail cenovky — sekce (Údaje, Materiály, Desky, Doplňkové položky, ZMD, Rozpad ceny…) jsou
1.4.10
- Etapa B DOKONČENA: Služby mají rozbalovací boxy — Místo realizace (otevřený) · ZMD (otevřený, živý
1.4.9
- Etapa B: Kalkulace má rozbalovací boxy — detailní rozpisy (Materiály · Dílce a opracování · Doplňkové
1.4.8
- Informace: „Platnost" a „Poznámky" rozděleny do samostatných rozbalovacích boxů
1.4.7
- Etapa B (část 1): krok „Informace" má rozbalovací boxy — Zákazník (otevřený), Platnost a poznámky
1.4.6
- Zjednodušení wizardu z 6 na 4 kroky (Etapa A): 1 Specifikace desek · 2 Specifikace služeb (+ místo
1.4.5
- Breton prohlížeč — u nalezených kódů operací se nově ukazuje jejich **význam** (CNC legenda
1.4.4
- Pinsero „dohled" badge v patičce (pravý dolní roh, na mobilu pod text) — odkaz na https://pinsero.ai/.
1.4.3
- Breton prohlížeč — v tabulce dílců přibyl sloupec **Rozměr (Š × V mm)** z bounding boxu hlavního obrysu
1.4.2
- Breton přesunut z horního menu do řádku „Nový případ" (mezi typy cenění) — placeholder pro budoucí
1.4.1
- Breton XML — prohlížeč (příprava cenění). Nová stránka /calc/breton (odkaz „Breton" v horní liště):
1.4.0
- Připomínky (feedback) pro testery — plovoucí tlačítko „💬 Připomínka" vlevo dole na všech /calc stránkách.
1.3.3
- Poznámky PDF — zástupný text **{platnost}** (na PDF se nahradí datem platnosti konkrétní nabídky) a
1.3.2
- Poznámky PDF — změna chování: výchozí poznámka z Administrace se nově zobrazuje na **každém** MOC/VOC PDF
1.3.1
- Uživatelský manuál (/calc/manual) — kompletní aktualizace na aktuální stav. Doplněno: 6 typů cenovek
1.3.0
- Nápověda — dokončení (i) ikon na VŠECH hotových krocích a flow: krok 01 (Zákazník), 03 (ZMD +
- Po „Uložit koncept" se uživatel vrací do seznamu CN s potvrzením (dřív nebylo vidět, kam se uložil).
1.2.99
- Nápovědy Fáze 2 — (i) ikony i ve flow Příroda, Ostatní, Zbytky (kapitoly Opracování) + u „Hotové výrobky"
1.2.98
- Nápovědy — Divi režim (Fáze B): CPT „Nápovědy" je teď public (vlastní URL /napoveda/…) + zapnutý Divi
1.2.97
- Nápovědy (Fáze 1) — nový CPT „Nápovědy" ve WP Admin (každá kapitola = vlastní článek, rich editor +
1.2.96
- Odolný import dílců — konec tiché chyby: když .xlsx obsahuje operační sloupce, které neodpovídají
1.2.95
- Import .xlsx šablona — přidán list „Legenda" s popisem každého sloupce (Název, Délka, Šířka, Délka řezu,
1.2.94
- UX: „Uložit (jako) koncept" v kroku 06 nově **uloží a vrátí na seznam CN** (dřív zůstal na kroku 6 bez
1.2.93
- Převod CN na jinou organizaci (1.5 drobné) — nová akce na detailu (jen BO, z libovolného stavu).
1.2.92
- Poznámka BRUNO PAUL (note_bp) — zobrazení na detailu cenovky rozšířeno z „jen BO" na **BO + Obchod (OZ)**
1.2.91
- Rozpad DPH v PDF (1.5-D) — MOC cenový blok teď ukazuje plný rozpad: Základ daně · DPH XX% (částka) ·
1.2.90
- Kontakt na obchodníka v PDF (1.5-D) — pod „Vytvořil/a: {jméno}" se nově zobrazí e-mail + telefon tvůrce.
1.2.89
- Editovatelné poznámky v PDF — 2 úrovně (1.5-D). Per-CN poznámky (note_moc/note_voc) už existovaly (dev59);
1.2.88
- Položky BP (1.5-C) — skryté navýšení ceny, jen Back Office. 3. tabulka v kroku 03 (název · počet ·
1.2.87
- Jedna CN s více materiály (Quarz + Keramika) — ověřeno, že celý řetězec (výběr per deska,
1.2.86
- Ořezy desek — Fáze 2b: pole „Ořez výrobce (mm)" + „Max dílec WxH" i ve flow Příroda
1.2.85
- Ořezy desek — Fáze 2 (flow Kámen/Compact): u materiálu v kroku 02 pole „Ořez výrobce (mm)"
1.2.84
- Administrace → nový tab „Ořezy desek" (Fáze 1): tabulka výrobce → technologický ořez StoneCutu (mm).
1.2.83
- Objednanou cenovku (stav „Objednáno") už nelze duplikovat — duplikace sdílí group_id
1.2.82
- Krok 02 — hrany na výřezech: strop pro délku hran (group „Typ hrany") se nově zvětší
1.2.81
- UX Krok 02 — našeptávání množství u m² operací: při přidání operace s jednotkou m²
1.2.80
- FIX Helios export — auto-řez (op 1) a auto-oblouk (op 3) se do Heliosu vůbec neposílaly
1.2.79
- FIX Helios — import objednávky padal („Bylo porušeno kontrolní omezení") kvůli `<cenaJedn>`
1.2.78
- FIX spotřeba desek — nářez (StoneCut) vrací reálný počet desek (např. 0,5), ale do ceny se
1.2.77
- FIX Helios export hotových výrobků — doplněna `<cenaJedn>` (jednotková cena z karty). Helios
1.2.76
- Helios export hotových výrobků — opraveno na PŘESNÝ NASA formát (dle reálné poptávky 4UOS-VZ05):
1.2.75
- PDF — hotové výrobky se zobrazují POD každým dílcem (u svého dílce) místo samostatné tabulky;
1.2.74
- Hotové výrobky — rozšířeno na flow Příroda a Ostatní (mimo Compact), zatím jen kapitola
1.2.73
- Auto-vzpěra pod dřez (karta 410-4) — automaticky se přidá (1×) na desku, když je na ní operace
1.2.72
- Hotové výrobky — Stage 2: dotaženo do výstupů.
- · Detail CN: sekce „Hotové výrobky (dřezy, příslušenství)" (položka · dílec · počet · cena/ks · celkem).
- · PDF (MOC i VOC): sekce „Hotové výrobky" v měně nabídky; VOC po rabatu skupiny.
- · Helios export (finalni): pevně ceněné položky `<polozka>` se skupZbo = 212/440/430/410,
- · Snapshot finish_products doplněn o voc_total + discount_percent (per řádek).
1.2.71
- Hotové výrobky — výběrové selecty kapitol na celou šířku řádku (vizuálně jednotné).
1.2.70
- Hotové výrobky — kapitola „Příslušenství" (410) přesunuta na první místo. 410 = „Vzpěra pod
1.2.69
- Hotové výrobky — další skupiny (krok 02, Quarz/Keramika): „Dřezy a umyvadla" (440),
1.2.68
- Hotové výrobky — kapitola „Dřezy a umyvadla na míru" (skup 212) v kroku 02 (Stage 1).
1.2.67
- FIX (skutečná příčina, test Helios E2): veřejný share odkaz (MOC PDF i podklady) hlásil
- Odstraněn dočasný admin DEBUG výpis z 1.2.65. Změna tokenu na wp_salt (1.2.64) zůstává jako
1.2.65
- Dočasná diagnostika ověření share tokenu (admin-only) — viz 1.2.67 (odstraněno).
1.2.64
- FIX (test Helios E2): veřejný odkaz na MOC PDF cenovky (Helios <dokumentace>) hlásil
1.2.63
- Cross-flow (test 15): převod celé cenovky Příroda → Kámen (Quarz/Keramika). V kroku 02 Přírody
1.2.62
- Administrace → nový tab „Typy dílců" (test 14): zaškrtnutím povolíš/skryješ typy nabízené
1.2.61
- Hromadný import (test 19): po importu se prázdná zdrojová „Deska 1" (jen šablona formátu/ceny)
- Odebrané operace (test 12/2): po hromadné změně dekoru / převodu na Přírodu se u dotčeného
1.2.60
- Zbytky (test 17): u zbytku přidáno pole „Rabat VOC (%)" — předvyplní se rabatem zákazníka
1.2.59
- Ostatní (test 18): přidáno ruční pole „Rabat VOC (%)" u ceny dílce — VOC se počítá tímto
1.2.58
- Příroda + Ostatní (test 16/18): doplněn „Popis dílce" (volitelný popisek); „Počet kusů"
- Hromadná změna dekoru / převod na Přírodu (test 12/1): „Odebrané operace" nyní na výrazném
1.2.57
- FIX (test 13/3): Objednávka hlásila „0 nahráno" i po nahrání přílohy přes AJAX (počet
- Objednávka (test 13/1): prohozeno pořadí — „Datum zaměření" vlevo, „Datum montáže" vpravo.
1.2.56
- Projektové cenění — detail: doplněn odkaz „🪚 Nářezový plán" (StoneCut), stejně jako
1.2.55
- Projektové cenění: při volbě € se tabulka „Položky cenové nabídky" přepne do eur — zadáváš
1.2.54
- FIX: projektové cenění — volba měny Kč/€ se neukládala u KONCEPTU (jen při publikaci),
1.2.53
- Projektové cenění: přepínač měny Kč/€ přesunut do pravého sloupce (sekce „Měna nabídky"),
1.2.52
- Projektové cenění: doplněna volba měny Kč/€ (krok 06) — stejně jako u ostatních flow.
1.2.51
- FIX: sloupec „Typ" v seznamu obch. případů zobrazoval u Projektových cenovek „Kámen"
1.2.50
- Krok 03: zpevnění reaktivity „Souhrn položek" (přidání/odebrání MOC/VOC položky teď
1.2.49
- Krok 03 (Specifikace služeb) — z testu 07:
- · „= výnos celkem" zarovnán na stejnou řádku jako pole „Počet pater nad 1. NP".
- · Odebrána obsoletní věta „Další úpravy (ZMD, výnos, slevy, rabat) přijdou v dalších iteracích"
1.2.48
- Krok 02: pole „Popis desky" podbarveno (zlatý box), ať vyniká.
1.2.47
- Krok 02: přidané operace jsou zřetelně podbarvené (zlatý levý okraj + světlé pozadí).
1.2.46
- Krok 02 (Specifikace desek) — z testu 06:
- · „Popis desky" přesunut pod výběr materiálu, hned nad „Rozměry desky" (logičtější pořadí).
- · „Počet kusů" zarovnán na pravou stranu (pod Šířku).
- · U přidané operace se nově ukazuje sazba za jednotku (např. „· 3,72 Kč/mm") — dřív byl
1.2.45
- Obchodní případy (dev192): filtrační záložky podle typu (VŠE/KÁMEN/…) zrušeny — podle
- „Kámen" rozdělen na Quarz a Keramika: obě tlačítka založí standard cenovku a v kroku 02
1.2.44
- Seznam obch. případů (dev191):
- · Varianty se v sloupci ID zobrazují jako „{kód skupiny} – Varianta N" (např. 3Q2YUK – Varianta 2)
- · Silnější oddělovník (linka) před každým případem/skupinou — varianty zůstávají vizuálně spojené.
- · Nová akce „Smazat koncept" v ⋮ menu (jen stav Koncept, smí jen autor konceptu nebo WP-admin).
- · Stránkování: čísla stran 1,2,3… + šipky ‹ › místo „Předchozí / Další".
1.2.43
- Wizard: do černé spodní lišty (vedle „Pokračovat") přidán helpdesk kontakt
1.2.42
- Krok 01 wizardu: nadpis „Pro koho cenujeme" přejmenován na „Zákazník".
1.2.41
- Poznámka BRUNO PAUL (interní): pole nyní vidí a může zadat jen zaměstnanec BRUNO PAUL
1.2.40
- Přílohy: odebrána vysvětlující věta „(interní — neukáže se v PDF…)" u nadpisu.
- PDF: odkaz „Podklady ke stažení (otevřít online)" doplněn i do CN ze zbytků — nyní je
1.2.39
- Detail CN: sekce Objednávka / Soubory / Objednat podbarvené (zlatý box), ať jsou nahoře hned vidět.
1.2.38
- Detail CN (dev189): Objednávka + Soubory přesunuty NAHORU (nejdůležitější část). Hlavička:
1.2.37
- Krok 06 (Kalkulace): sekce „Název cenovky" zvýrazněna (zlatě podbarvený box), ať je
1.2.36
- Login: podnadpis „StoneCalc / kalkulačka cenových nabídek" zalomen na dva řádky (StoneCalc
1.2.35
- Novinky — oprava umístění (dev186): Novinky se zobrazují na PŘIHLAŠOVACÍ stránce vedle
1.2.34
- Novinky (dev186): „Seznam změn" odebrán z přihlašovací stránky, přesunut na úvod po
1.2.33
- Patička: doplněn provozovatel (Bruno Paul, a.s., Fáblovka 586, 533 52 Pardubice, IČ/DIČ)
1.2.32
- Hlavička: logo na hover už se nepřebarvuje do nesmyslné žluté (zrušen sepia filtr) —
1.2.31
- PDF CN: doladění mezery pod nadpisy Partner/Materiály (nadpis margin-bottom 0,
1.2.30
- PDF CN: zmenšen rozestup mezi zlatými nadpisy (Partner / Materiály / Dílce / ZMD) a jejich
1.2.29
- PDF CN — úpravy z testu: kompaktnější hlavička (menší logo, užší rozestupy), datumy
1.2.28
- PDF (dev180): sjednocené BLOKOVÉ rozložení dílců pro VŠECHNY úrovně rozpadu (MOC i VOC) —
1.2.27
- Sazba DPH (dev179): auto-určení dle pravidel (Podklady/DPH) — plátce = DIČ, „dodávka+montáž"
1.2.26
- Helios export — služby skupiny 900 dle mapování (dev178): ZMD podle kombinace vybraných
1.2.25
- Objednávka (dev177): objednávkový formulář (dotazník dle NASA) na detailu CN — externí
1.2.24
- Helios EXPORT (1.5-E, E3 příprava): sledování odeslání poptávky — sloupce
1.2.23
- Projekt krok 06: ZMD v rekapitulaci rozepsané po položkách (Doprava / Montáž / Zaměření…),
1.2.22
- Projektová CN PDF: poslední sloupec přejmenován na „Celkem", třetí na „m2 /hodiny/ks".
- Projektová CN je EUR-ready — částky formátuje měnový formátovač (base v Kč, € přepočet
1.2.21
- Projektová Cenová nabídka — PDF (dev173): nová šablona `quote-projekt.php` dle BRUNO PAUL
- Krok 06 projektu: editor „Položky cenové nabídky" — volné řádky (název + částka, množství
- Detail projektové cenovky: funkční tlačítko „Stáhnout cenovou nabídku" (místo placeholderu).
1.2.20
- Helios sync (1.5-E): Zcom systémový cron rozběhnut a ověřen (rozvrh 15,45, `.cron` v web rootu
- Bezpečnost: tlačítko „Přegenerovat token" (Administrace → Helios sync) — rotace cron tokenu
1.2.19
- Helios export (1.5-E, fáze E2b): `<dokumentace>` = veřejný tokenovaný odkaz na MOC PDF cenovky
1.2.18
- Helios export (1.5-E, fáze E2): generátor poptávky XML (`PoptavkaExporter`) dle manuálu —
1.2.17
- FIX Helios sync: FTP host se očistí od schématu (`ftp://`) a cesty/lomítka — `ftp_connect()`
1.2.16
- Helios sync — IMPORT (1.5-E, fáze E1): nová Administrace → „Helios sync". Automatické
1.2.15
- PDF cenovky: ODKAZ NA PODKLADY — pokud má CN nahrané soubory (výkresy ap.), v PDF je
1.2.14
- PDF cenovky — DVĚ NOVÉ varianty rozpadu (MOC i VOC):
- · „rozpad po dílcích" — kompaktní tabulka + sloupec Cena (cena per dílec = materiál
- · „detailní rozpad" — per dílec řádkový výpis operací (množství × cena = celkem) +
1.2.13
- FIX (kritické): PDF cenovky s materiály + ZMD padalo „Array callback must have exactly two
- Příroda/Ostatní PDF: vrácen „Formát desky" (rozměr) pod materiál — BEZ ceny (ta až
- Detail cenovky: akce „Duplikovat" přesunuta hned pod „Stav cenovky".
1.2.12
- PDF cenovka (krok 1 PDF epicu): KOMPAKTNÍ layout — dílce už nejsou roztáhlé bloky,
1.2.11
- Projekt Fáze 2 (A1+A2): PUBLIKACE projektové cenovky — v kroku 06 tlačítko „Publikovat
1.2.10
- Projekt: Administrace → „Společné výkony" zpřehledněno do JEDNÉ matice — řádek = operace
1.2.9
- Projekt: SPOLEČNÉ VÝKONY (dřez, výřezy, výztuž — stanoviště „Společné (výkony v ks)")
1.2.8
- Projekt krok 06: ŽIVÝ přepočet — cena materiálu, marže a navýšení se promítají do
1.2.7
- Projekt krok 06: rekapitulace práce nově ukazuje prostoj (přirážku na čas) —
1.2.6
- FIX (projekt): krok 03 → 04 padal fatálně. POST pole se jmenovalo `project[…]`, což
1.2.5
- Projektové cenění: ZMD přesunuto do kroku 03 (vlastní projektová verze) — položky
1.2.4
- Projektové cenění — flow „Projekt" (Fáze 1): nový typ cenovky (BO + OZ) v „+ Nový případ"
1.2.3
- Projektové cenění (příprava, interní): admin záložka „Projekt" (Administrace) — Kč/h
1.2.2
- Projektové cenění (příprava, interní): import operací nově ukládá jednotku času
1.2.1
- Kurz EUR — historie kurzů. V Administraci → „Kurz €" se zadává kurz + datum;
1.2.0
- Cenění v EUR. Kurz (kolik Kč = 1 €) se nastavuje v Administraci → záložka „Kurz €".
1.1.9
- ProfesorBruno: odstraněn dočasný shim (widget.js v0.3 opravil bug u zdroje), přidán
1.1.8
- ProfesorBruno: chat se teď otevírá rohovou bublinou vpravo dole (místo odkazu v menu).
1.1.7
- FIX (ProfesorBruno): widget se nenačítal — chyba v cizím widget.js (čte nedeklarovanou
1.1.6
- ProfesorBruno — integrace AI chat widgetu (nápověda ke kameni / materiálům / montáži).
- · Klíč se ukládá přes Diagnostiku jako WP option (nikdy v Gitu).
- · Bublina skrytá, otevírá se přes „🎓 Zeptat se Profesora" v hlavičce (jen pro přihlášené).
- · Widget běží jen když je klíč vyplněný — bez klíče je integrace vypnutá.
1.1.5
- FIX (CutToSize + ZMD): montáž a výnos nad patro správně reflektují počet kusů i v živém
- · Montáž zkompaktněna: 1 řádek/deska „× N ks" (bm i cena ×kusy), celkový součet beze změny.
- · Výnos (váhová pásma) počítá každý fyzický kus.
- · Backendový součet montáže byl správný už dřív; nově sedí i náhled a PDF je přehlednější.
1.1.4
- Administrace → Cenovky — export do CSV (respektuje filtr hledání + stav). UTF-8 BOM + středník
1.1.3
- Seznam cenovek — stránkování (25 na stránku, Předchozí/Další; zachovává aktivní filtry v URL).
1.1.2
- Krok 02 — zpřehlednění editace desek: u „Seznam desek" hint „✎ Klikni na desku pro úpravu · ✕ smaže"
1.1.1
- Ostatní — výběr povrchu nyní nabízí VŠECHNY povrchy z číselníku (Příroda whitelist +
- Kalkulačka — univerzální plovoucí kalkulačka (vpravo dole) na všech /calc stránkách:
1.1.0
- CutToSize — počet kusů na desce (sériové dílce) + sloupec „Počet kusů" v importní šabloně.
- Hromadný import dílců (.xlsx) napříč všemi flow — Kámen, Compact, Příroda, Ostatní.
- Převod cenovky Kámen/Compact → Příroda (originál zůstane, přepočet na ceník Přírody).
- Nářezový plán: per-deska SVG, 1 deska = 1 strana (čitelný vícestránkový PDF, landscape).
- Oblouk v Přírodě (Kvarcit/Žula/Mramor) — plná podpora vč. ceny (fallback op3 → op6).
- Flow „Ostatní" (nespecifikovaný materiál; ceník Quarz→Technistone / Keramika→Atlas) + fix uložení ceníku.
- Mazání a přepínání desek přímo v „Seznam desek".
- Aktualizovaná nápověda (/calc/manual) + sdílené know-how do _shared (PDF generování, API vrstva).
1.0.20
- Nápověda (/calc/manual) — aktualizace o nové funkce: typ „Ostatní", Počet kusů (CutToSize),
1.0.19
- Mazání dílce přímo z levého „Seznam desek" (✕ u položky) — Kámen, Compact, Příroda, Ostatní.
1.0.18
- FIX: Ostatní — ztráta vybraného ceníku (quarz/keramika) při uložení.
- · Pole `cenik` nebylo v allowlistu kroku 02 → při uložení se zahodilo. Důsledek: Ostatní
- · Oprava: `cenik` se ukládá. Quarz → Technistone, Keramika → Atlas (Plan) jako dosud.
- · Pozn.: cenovky uložené před opravou je třeba znovu otevřít v kroku 02, znovu vybrat ceník
1.0.17
- Drobnost: pole „Počet kusů" v kroku 02 zúženo (130 px) — méně místa, přehlednější řádek.
1.0.16
- Hromadný import — sloupec „Počet kusů" v šabloně (CutToSize přes import).
- · V .xlsx šabloně přibyl volitelný sloupec „Počet kusů" (Kámen, Compact, Ostatní, Příroda).
- · Zpětně kompatibilní: staré šablony bez sloupce fungují dál (počet = 1). Sloupec se hledá
1.0.15
- CutToSize — počet kusů na desce (cenění mnoha stejných dílců).
- · Nové pole „Počet kusů" u dílce (Kámen, Compact, Příroda, Ostatní). Místo kopírování
- · Operace se násobí počtem kusů; materiál řeší spotřeba desek (StoneCutu se posílá N kusů
- · V cenovce/PDF/detailu i rekapitulaci je jeden řádek „dílec × N ks" místo N řádků.
- · Pricing log rozepisuje „operace za kus × N ks = celkem".
1.0.14
- Hromadný import dílců (.xlsx) i pro flow „Příroda".
- · Stejný princip jako Ostatní: vyplň první desku (typ Kvarcit/Žula/Mramor + formát + cena MOC),
- · Import je teď ve všech relevantních flow: Kámen, Compact, Ostatní, Příroda (Zbytky mají jinou strukturu).
1.0.13
- Hromadný import dílců (.xlsx) i pro flow „Ostatní" (Etapa B).
- · Stejný princip jako Kámen/Compact: vyplň první desku (ceník Quarz/Keramika + formát +
- · Operace z ceníku (110 Quarz / 130 Keramika), kruhové otvory v Ø, oblouk jako délka mm,
- · Příroda zatím bez importu (stejná struktura — případně doplníme).
1.0.12
- Oblouk v Přírodě — OPRAVENO (skutečná příčina = nekonzistentní číslování operací).
- · Diagnóza 1.0.11 byla nepřesná: nešlo o chybějící data. Ceníky Přírody (Kvarcit/Žula/
- · Fix: auto-oblouk i arc-kapitola (radius/průměr UI) nově fallbackují op 03 → op 06,
- · Příroda tím získává plnou podporu oblouků: zadávání přes poloměr/průměr, auto-výpočet
- · Žádný zásah do Heliosu není potřeba.
1.0.11
- Převod na Přírodu — upozornění na chybějící oblouk v ceníku.
- · Ceníky Přírody (Kvarcit/Žula/Mramor) v Heliosu nemají operaci oblouk (cisloOp 3),
- · Trvalá náprava = doplnit oblouk do 3 ceníků Přírody v Heliosu + re-import.
1.0.10
- Převod cenovky Kámen/Compact → Příroda (cross-flow změna dekoru).
- · Postup: duplikuj Kámen cenovku → na kopii tlačítko „🌿 Převést na Přírodu" (krok 02).
- · Mezikrok: ručně zadáš formát desky + MOC cenu + druh/název/povrch (jednou pro celou CN).
- · Dílce i operace zůstanou, operace se přemapují na ceník Přírody (přes čísla operací);
- · Originál v Kámeni zůstává; flow_type kopie se přepne na Příroda.
- · Oprávnění: Back Office + obchodní zástupce (CREATE_PRIRODA).
1.0.9
- Nářezové PDF — SKUTEČNÝ fix vícestránkového výstupu: 1 DESKA = 1 STRANA.
- · Příčina (konečně nalezená): StoneCut posílal 1 SVG na materiál se všemi deskami
- · Řešení: StoneCut 1.0.14 nově vrací slabs[] (per-deska SVG). StoneCalc je čte a dává
- · Per-deska statistiky (odpad/zbytek), označení půlformátu, počet dílců na desce.
- · Fallback: starší StoneCut bez slabs[] → původní chování (1 blok s celkovým SVG).
1.0.8
- Nářezové PDF — fix stránkování u mnoha formátů (vše bylo na 1 straně).
- · Příčina: page-break-inside:avoid na desítkách bloků rozhodí Dompdf stránkování.
- · Řešení: explicitní page-wrappery s page-break-after (str.1 = 1 formát, str.2+ = 2 formáty).
- · Ověřeno na 80 dílcích / 14 formátech.
1.0.7
- Nářezové PDF u velkých zakázek (desítky formátů): zvednuty limity Dompdf
1.0.6
- Hromadný import — Etapa A (Kámen + Compact): přechod z CSV na .xlsx + kruhy v Ø + oblouk-délka.
- · SheetJS (CDN, jen krok editace): generování i čtení .xlsx. Konec trápení s oddělovačem/kódováním.
- · Kruhový otvor: ve sloupci zadáš průměr Ø v mm → dopočítá obvod (π×d).
- · Oblouk: sloupec „Oblouk — délka [mm]" → zadáš celkovou délku, nacení se délka × sazba
- · Šablona má pojmenované sloupce operací s {token} v záhlaví pro robustní mapování.
- Pozn.: Etapa B přidá import do Příroda + Ostatní (sdílený modul).
1.0.5
- Hromadný import dílců z CSV (krok 02, Kámen) — „nastav 1. desku, zbytek z CSV".
- · Tlačítko „📥 Hromadný import" → stáhni šablonu (sloupce operací z ceníku materiálu) →
- · Každý řádek = nový dílec, podědí materiál/dekor/tloušťku/povrch z první desky.
- · Auto-řez se počítá z obvodu; volitelný sloupec Délka řezu. Operace mapované přes #id v záhlaví.
- · Celé client-side (využívá načtený ceník), CSV ; nebo , + BOM pro Excel UTF-8.
1.0.4
- NOVÝ flow typ „Ostatní" (cenění neznámého materiálu) — Etapa 1.
- · Výběr ceníku Quarz (operace jako Technistone, material_id 110) / Keramika (jako Atlas, 130).
- · Ručně: název, rozměr vstupní desky, cena MOC/m², dílce + operace (jako Příroda).
- · StoneCut: posílá manufacturer Technistone/Atlas dle ceníku (využije fuzzy match).
- · Nový případ + tab + filtr (BO + OZ), wizard krok 02, kalkulace, detail, PDF.
- · Operace year-proof přes findActivePriceTypeForMaterial (2606QUARZ → příští rok automaticky).
1.0.3
- Fix orientace desky u nářezu: deska se posílá StoneCutu i zobrazuje jako landscape
- · StoneCutPlanService: slab_width = max(w,h), slab_height = min(w,h). Cut lookup je orientačně
- · MaterialKey::formatForBoard: zobrazuje delší × kratší (konvenční čtení).
1.0.2
- Fix StoneCut nářez u Přírody: prázdný `manufacturer` → 422 manufacturer_empty.
- · StoneCutPlanService teď u materiálů bez výrobce (Příroda/custom) posílá hierarchické
- · StoneCut fuzzy-matchne segment (i samotný "Kvarcit"). Bez změny API kontraktu.
1.0.1
- Uživatelský manuál přímo v aplikaci: /calc/manual + odkaz "Nápověda" v hlavičce.
- · HTML stránka (kdo/co/proč/jak): role, 6 kroků, ZMD+výnosy, StoneCut, PDF, stavy, přílohy, FAQ.
1.0.0
- 🎉 PRVNÍ OSTRÁ VERZE. StoneCalc nahrazuje legacy systém NASA.
- · 6-krokový wizard cenové nabídky; 4 flow typy (Kámen, Compact, Příroda, Cenění ze zbytků).
- · Kaskáda Materiál → Značka → Dekor → Tloušťka → Povrch + Operace; fotky dekorů.
- · Kalkulace MOC + VOC (partner rabaty z Heliosu), doplňkové položky.
- · ZMD engine: Zaměření / Montáž / Doprava (per kraj) + Ponechat zbytky
- · StoneCut integrace: automatický nářezový plán + samostatné PDF (SVG, odpad/zbytky).
- · Helios XML import (8 importérů), role + capabilities (5 rolí), zabezpečení wp-adminu.
- · PDF cenovky (MOC/VOC) + nářezové PDF. Změna stavu cenovky. Přílohy k cenovce.
- · Administrace systému: Sazby ZMD, Cenovky+mazání, Statistiky, Číselníky.
0.1.0-dev139
- Výnos nad patro + stěhování nadměrných břemen (audit-svc-3) — kompletace v0.1.
- · Krok 03 ZMD: pole "Počet pater nad 1. NP" + živý náhled. Auto dle hmotnosti dílce
- · Připočítává se do ZMD (MOC=VOC, bez rabatu), flat bez sezóny; rozpis v Rozpadu ceny.
- · Administrace → Sazby ZMD: editovatelné sazby výnosu, pásma, hranice hmotnosti, hustoty.
0.1.0-dev138
- Přílohy v kroku 06 přesunuty PŘED blok Dokončení + sjednocená šířka s ostatními sekcemi.
- · Přepsáno na AJAX (fetch, type=button) → žádné vnořené <form>, jde vložit dovnitř wizardu.
- · Upload/delete bez reloadu stránky; sjednocený nonce stonecalc_files_{id}.
0.1.0-dev137
- Přílohy také ve wizardu — sekce na konci kroku 06 (Kalkulace), nejen na detailu.
- · Sdílený partial _quote-files.php (DRY: krok 06 i detail).
- · Upload form je MIMO wizard <form> (vnořené formy nejsou validní HTML).
- · redirect_to: po nahrání/smazání se vrátíš tam, odkud jsi (krok 06 / detail).
0.1.0-dev136
- Přílohy k cenovce (nahrávání souborů) — druhá věc k v1.0.
- · Sekce "Přílohy" na konci detailu: nahrání + seznam + stažení + mazání.
- · Typy: PDF, obrázky, výkresy (dwg/dxf), Office. Limit 10 MB. Nepovinné.
- · Nahrává autor + BO; soubory JEN interní (ne do zákaznického PDF).
- · Bezpečnost: allowlist přípon, náhodné názvy na disku, .htaccess deny ve složce,
- · Nová tabulka sc_quote_files (DB v8), QuoteFileRepository + QuoteFileStorage.
0.1.0-dev135
- Změna stavu cenovky z detailu (cesta k v1.0).
- · Aside "Stav cenovky": přepnutí + volitelný důvod, záznam kdo/kdy.
- · BO přepíná volně (Koncept/Aktivní/Objednáno/Neaktivní); autor (ne-BO) jen vpřed
- · "Zrušeno" přejmenováno na "Neaktivní" (DB hodnota canceled beze změny).
- · Archivováno zatím v UI neřešeno. Centrální QuoteStatus (labely + přechody).
0.1.0-dev134
- Nářezové PDF: rozvržení na stojato (portrait), menší formáty.
- · Str. 1 = hlavička + 1 formát · str. 2+ = vždy 2 formáty (deterministické zalomení
- · Identifikace v patičce na každé stránce zachována (dev133).
0.1.0-dev133
- Nářezové PDF: identifikace na KAŽDÉ stránce (Dompdf page_text).
- · Patička každé stránky: vlevo "Nářezový plán — {ID} · {název} · BRUNO PAUL", vpravo "Strana X / Y".
- · Řeší situaci, kdy diagram je na str. 2+ a byl by bez označení.
- · SVG max výška 110mm → jednomateriálový plán se vejde na jednu stránku (míň prázdna).
0.1.0-dev132
- Nářezový plán jako SAMOSTATNÉ PDF (on-demand, nenafukuje data cenovky).
- · URL /calc/cases/{ID}/pdf-narez · tlačítko "🪚 Nářezový plán (PDF)" na detailu (jen když StoneCut běží).
- · Generuje se až při stažení: volá StoneCut živě → vždy aktuální, nic se neukládá do snapshotu.
- · Struktura: hlavička (číslo, název, partner) → statistika (spotřeba, odpad, zbytky, plocha)
- · SVG embedován jako data-URI <img> (spolehlivé v Dompdf). PdfGenerator::generateNarez().
- · Nahrazuje plán ukládat SVG do snapshotu (#68) — místo toho on-demand.
0.1.0-dev131
- Krok 05 nářez: zobrazení odpad/zbytky statistiky + legenda barev u SVG.
- · Pod každým SVG: "Spotřeba X desky · Odpad Y % · využitelný zbytek Z % (W m²)".
- · Legenda: 🟦 dílec · 🟩 využitelný zbytek · ⬜ odpad.
- · Aside aktualizován (StoneCut je živý, ne "bude později").
- · StoneCut integrace POTVRZENA na reálné cenovce (Altamonte 1650×3300 → 1 deska, SVG OK).
0.1.0-dev130
- Diagnostika → StoneCut test: poznámka "422 material_not_found je OK" se zobrazí jen když
- · StoneCut integrace ověřena end-to-end z Diagnostiky (Technistone 3200×1600×20 → 0,5 desky).
0.1.0-dev129
- Diagnostika → StoneCut test: editovatelný testovací materiál (výrobce + rozměr + tloušťka).
- · Default Technistone 3200×1600×20. Umožní otestovat /optimize na materiálu, který v Cut DB
- · testConnection() přijímá materiálový override; handler čte pole z formuláře.
0.1.0-dev128
- Diagnostika → StoneCut: tlačítko "Otestovat spojení" je nyní vždy viditelné
- · Stav upozorní: "máš klíč, ale prázdnou Base URL — vyplň https://stonecut.brunopaul.cz".
0.1.0-dev127
- StoneCut integrace: StoneCut endpoint je ŽIVÝ (v1.1.0) — sladění klientské strany.
- · Chybové tělo {code, message} se parsuje a zpráva (zejm. 422 material_not_found)
- · Nový /healthcheck connectivity test (bez auth), volá se v Diagnostice před vzorovým /optimize.
- · StoneCutClient::healthcheck(); optimize() + testConnection() propagují error code/message.
- · Reply Netty.StoneCut v _shared/HANDOFF_StoneCalc_to_StoneCut.md.
- · Čeká na: Zdeněk zadá URL+klíč v Diagnostice + jeden existující materiál pro první živý test.
0.1.0-dev126
- Administrace → tab Číselníky: read-only prohlížeč Helios číselníků.
- · Dlaždice s počty: materiály, skupiny/značky, obch. značky, dekory, tloušťky,
- · Klik → tabulka obsahu + hledání (limit 300, počítadlo zobrazeno/celkem).
- · Bool sloupce (viditelnost/archiv/foto) jako ✓/—. Záměrně jen ke čtení
- · Administrace tím má kompletní 4 moduly: ZMD, Cenovky, Statistiky, Číselníky.
0.1.0-dev125
- Administrace → tab Statistiky (audit-admin-2b): přehledové výstupy z ostrého provozu.
- · Souhrnné karty: cenovek celkem, MOC/VOC celkem, + tento měsíc (počet/MOC/VOC).
- · Rozpady: dle typu (Kámen/Compact/Příroda/Zbytky), dle stavu, posledních 12 měsíců,
- · QuoteRepository::adminStatistics() — agregační dotazy, jen nesmazané cenovky.
0.1.0-dev124
- Administrace → tab Cenovky (audit-admin-2a): seznam všech cenovek + mazání per řádek.
- · Tabulka napříč uživateli: ID, název, typ, stav, firma, autor, datum, MOC.
- · Filtr (hledání + stav).
- · Mazání = soft-delete (deleted_at), s confirm. Nahrazuje odebrané hromadné mazání z Diagnostiky.
- · QuoteRepository::listAllForAdmin() + softDelete().
- · ID odkazuje na detail cenovky (nové okno).
0.1.0-dev123
- Administrace systému (audit-admin-2) — kostra + 1. modul Sazby ZMD.
- Nová admin stránka: StoneCalc → Administrace (submenu), taby:
- Modul Sazby ZMD — editace VŠECH ZMD konstant z UI (ukládá do option stonecalc_zmd_config):
- · Zaměření, Montáž (deska/obklad/parapet/lišta), Vícepráce/hod
- · Sezónní faktor (sezóna / mimo), Doprava km sazba, Manipulace se zbytky
- · Doprava per kraj (14 krajů ČR)
- ZmdConfig refaktor: čte hodnoty z option s fallbackem na hardcoded default
- Změny se okamžitě projeví ve výpočtu nových cenovek. Tím splněno opakované přání
0.1.0-dev122
- Diagnostika: tlačítko "Otestovat spojení se StoneCut" (zobrazí se když je nakonfigurováno).
- · Pošle ukázkový optimize request (1 deska 3040×1440 + 2 dílce).
- · Výsledek: ✅/❌ + počet desek + doba odezvy (ms) + HTTP kód + syrová odpověď (rozbalovací).
- · Pro rychlé ladění formátu při společném testu se StoneCut (bez nutnosti tvořit cenovku).
- · StoneCutClient::testConnection().
0.1.0-dev121
- StoneCut kontrakt upřesněn dle Zdeňka (revize co Calc reálně má):
- · Request: posílá jen manufacturer (výrobce) + slab rozměry + tloušťka + dílce (id, š×d, ks, volitelný label).
- · Odebráno: název materiálu, kerf, skupZbo, rotatable, allow_half_slab — StoneCut si drží podle výrobce.
- · Response: odpad rozdělen na odpad_pct (nepoužitelný) + zbytky_pct/zbytky_m2 (využitelný zbytek).
- · Timeout default 10 → 60 s (velkorysý pro testování).
- Aktualizováno _shared/API_CONTRACTS.md §1.
0.1.0-dev120
- StoneCut integrace — StoneCalc strana (kontrakt + klient + UI). StoneCut se vyvíjí,
- Nové třídy:
- · Integration/StoneCut/StoneCutClient — HTTP POST optimize, config přes options + filtry.
- · Integration/StoneCut/StoneCutPlanService — poskládá payload per materiál, zavolá StoneCut.
- REST: GET /stonecalc/v1/narez/{id} — async výpočet nářezu (volá se z kroku 05).
- Krok 05: při vstupu auto-volá StoneCut (pokud nakonfigurován).
- · Vyplní počet desek + zobrazí SVG náhled per materiál.
- · Role-based: BO+OZ mohou přepsat ručně; ostatní = výsledek StoneCutu (locked).
- · Fallback: StoneCut nenakonfigurován → všichni manuální (současné chování).
- Diagnostika: sekce StoneCut — nastavení Base URL + API klíče (X-Api-Key), stav integrace.
- Konfigurace: options stonecalc_stonecut_url / _api_key (+ filtry). Prázdné = vypnuto.
0.1.0-dev119
- ZMD: přepínač "Ponechat zbytky" (default NE) v řadě s ostatními.
- · Pokud ZAP + současně Montáž ZAP → info "Za manipulaci a dodání zbytků bude
- · Pokud Ponechat zbytky ZAP ale Montáž NE → poznámka že se nepřičte.
- · Promítnuto do CELKEM ZMD → finální cena + detail page + PDF (položka "Manipulace se zbytky").
- · Částka ZmdConfig::ZBYTKY_FEE = 1 500 Kč, editovatelné (filtr stonecalc_zmd_zbytky_fee → Administrace).
0.1.0-dev118
- ZMD zapojeno do finální ceny cenovky (zaměření/montáž/doprava).
- WizardController::applyZmd() — spočítá ZMD a přičte do MOC i VOC (služby bez rabatu).
- Krok 06 Kalkulace: nový řádek "ZMD" v souhrnu cen, promítnuto do VÝSLEDNÉ CENY.
- Publish: base_price + base_price_rabate nově obsahují ZMD; snapshot data.calculation.zmd.
- Detail page: sekce "ZMD — Zaměření, montáž, doprava" s rozpisem.
- PDF: sekce "Zaměření, montáž, doprava" se souhrnnými řádky (Montáž / Zaměření / Doprava).
- CalculationResult: + zmdTotal + zmd[] + ZMD v toPricingLog (Rozpad ceny).
- Tím je hotová základní ZMD trojice. Zbývá: výnosy (audit-svc-3, čeká na spec).
0.1.0-dev117
- ZMD příprava pro výnosy (audit-svc-3): hustoty materiálu + odhad hmotnosti dílce.
- · ZmdConfig::densityForThickness() — <12mm=20, 12mm=30, 20mm=50, 30mm=70 kg/m²
- · ZmdConfig::weightForDilec(plocha, tloušťka) = plocha m² × hustota.
- · Hranice WEIGHT_ZERO_LIMIT=20 kg, WEIGHT_HEAVY_LIMIT=90 kg.
- Samotná výnosová logika ČEKÁ — kolegové se neshodli na pravidle součtu dílců <20 kg.
0.1.0-dev116
- ZMD UI redesign (dle původního návrhu):
- · Přepínače Je/Není v jedné řadě nahoře: Montáž | Zaměření | Doprava | Sezóna.
- · Zaměření default ZAP (5 890 Kč). Sezóna default vyp (×1,03).
- · Sekce pod přepínači se zobrazují podle stavu (montáž detail, zaměření řádek, doprava).
- · Čistší layout, konzistentní nadpisy.
- Doprava bez zaměření a montáže = km × cena/km:
- · Pole km × pole cena/km (předvyplněno 16,50 Kč, editovatelné) = částka.
- · ZmdConfig::DOPRAVA_KM_RATE = 16,50 (+ filtr stonecalc_zmd_doprava_km_rate).
- · Nahrazuje dřívější ruční "doprava bez zaměření a montáže (Kč)".
- Zbývá: výnosy (audit-svc-3) + zapojení ZMD do finální ceny (krok 06 + PDF).
0.1.0-dev115
- ZMD: přepínač Je / Není pro každou ze tří složek (Zdeněk 2026-06).
- · Montáž Je/Není — pokud Není, realizace (montáž+vícepráce+náročnost) = 0.
- · Zaměření Je/Není — pokud Není, 0 (default Je = 5 890 Kč).
- · Doprava Je/Není — pokud Není, cena dle kraje = 0.
- · Všechny default ZAP (Je).
- Potvrzeno mapování dopravy: Středočeský = Praha (2690), Zlínský = Olomouc (4500).
- Zbývá (dev116): zapojení ZMD do finální ceny + výnosy + samostatná doprava bez montáže.
0.1.0-dev114
- ZMD engine (Zaměření, Montáž, Doprava) — část 1: výpočet + UI v kroku 03 (jen ČR).
- Nové třídy:
- · Domain/Zmd/ZmdConfig — všechny sazby + mapování + apply_filters (budoucí admin).
- · Domain/Calculator/ZmdCalculator — montáž z dílců (delší hrana × sazba dle typu),
- Krok 03: nová sekce ZMD s živým náhledem (Alpine scZmd mirror PHP kalkulátoru):
- · Montáž auto z dílců (z kroku 02), tabulka per dílec + Σ.
- · Vícepráce (hodiny), náročnost (%), sezóna (checkbox).
- · Zaměření (checkbox, default ZAP).
- · Doprava dle kraje (z kroku 01) + nestandardní + bez zaměření a montáže.
- · CELKEM ZMD.
- Mapování typů dílců: obklad(8,10)→750, parapet(5)→650, lišta(6)→320, ostatní→1950.
- Doprava per kraj — Středočeský=Praha 2690, Zlínský=4500 (OVĚŘIT).
- Slevy distributora se na ZMD NEuplatňují (MOC=VOC).
- Vstupy se ukládají do quote.data.zmd.
- ČÁST 2 (dev115): zapojení ZMD do finální ceny (krok 06 + publish + detail + PDF).
0.1.0-dev113
- Wizard: Místo realizace (adresa + země + kraj) přesunuto z kroku 04 do kroku 01.
- Důvod: region je potřeba pro výpočet dopravy (ZMD) už po zadání dílců (krok 03).
- Krok 01 (Pro koho cenujeme): kontakt + nově Místo realizace (s poznámkou "určuje cenu dopravy").
- Krok 04 (Doplňkové info): zůstává Platnost + Poznámky (místo realizace odebráno).
- Backend:
- · collectStep1 nově ukládá installation_address/country/region.
- · collectStep3 (krok 04) je PŘESTAL sbírat — jinak by uložení kroku 04 přepsalo
- Žádná DB změna — sloupce installation_* už existují.
0.1.0-dev112
- PDF: cena materiálu se NEzobrazuje (důvěrná cenotvorba) — všechny flow typy.
- Kámen/Compact/Příroda (quote.php): sekce Materiály ukazovala
- Zbytky (quote-zbytky.php):
- · per dílec řádek "Materiál (poměrově…): N Kč" odebrán.
- · v hlavičce zbytku "pořizovací N Kč" odebráno.
- · footer note zjednodušen (neuvádí pořizovací cenu / sklad zbytků).
- Operace už ceny v PDF nezobrazovaly (od dev108) — teď konzistentní i materiál.
- Klient v PDF vidí: co (materiál, dílce, operace) + finální cenu. Ne rozpis nákladů.
- Web (Rozpad ceny, Detail page, wizard) ceny dál zobrazuje — interní data pro BO/OZ.
0.1.0-dev111
- BEZPEČNOST: non-admin uživatelé (role StoneCalc) zablokováni z wp-admin.
- Problém: testeři s rolí Back Office se přes uvítací e-mail z WP dostali do
- Řešení (standardní "members" pattern):
- · admin_init redirect → non-admin (bez `manage_options`) → /calc/.
- · after_setup_theme → skrýt admin bar na frontendu pro non-admin.
- · login_redirect filter → po přihlášení non-admin rovnou na /calc/
- Skuteční WP administrátoři (manage_options) mají plný přístup beze změny.
- Diagnostika + Helios import už dříve vyžadovaly manage_options → BO je nikdy
0.1.0-dev110
- Příroda — 4 fixy (dorovnání s Kámen flow):
- 1) Select-on-focus + desetinná místa na všech number inputech (Délka/Šířka/Cena
- 2) Typ dílce (Noha, Deska, …) — přidán dropdown product_type v sekci Velikost dílce.
- 3) Kopírovat dílec — tlačítko 📋 vedle smazat, deep copy + nové uid (operace + arcs).
- 4) Nářezový plán — dílce ze stejné desky se teď sdružují do JEDNOHO materiálu.
0.1.0-dev109
- Seznam cenovek: odebrány Quick stats z hlavičky (Tento měsíc / MOC celkem / VOC celkem).
- · Zabíraly místo bez vypovídající hodnoty pro obsluhu.
- · Statistické výstupy budou v Administraci / samostatné stránce (audit-admin-2b).
- · Data v QuoteRepository (statsCurrentMonth, countersByFlow) zůstávají — jen UI odebráno.
0.1.0-dev108
- Zbytky PDF: operace bez cen za jednotlivé operace, seskupené per kapitola
- Na webu (Rozpad ceny + Detail page) ceny operací zůstávají — tam jsou interní data.
- V PDF má klient vidět jen seznam práce, ne rozpis cenotvorby (důvěrné).
- Per dílec v PDF zachováno: Materiál (poměrová cena), seznam operací,
0.1.0-dev107
- Zbytky: rozpis operací per dílec (Rozpad ceny + Detail page + PDF).
- Předtím byly operace per dílec jen jako sumární číslo ("Operace: 17 709 Kč").
- Fix:
- · ZbytkyCalculator::compute() ukládá detail operací do items[].operations[]
- · ZbytkyCalculator::toPricingLog() rozepíše per dílec každou operaci se vzorcem
- · PDF quote-zbytky.php: nahrazena tabulka kompaktnějším layoutem per dílec —
- · Detail page case-detail.php: stejně — per dílec sekce, operace po řádku
- Layout PDF: 1 dílec = 1 sekce (border-left modrá), žádný horizontální scroll,
0.1.0-dev106
- Zbytky 2 fixy:
- 1) Detail page "Rozpad ceny" zobrazoval raw JSON co rozbil layout.
- 2) VOC slevy distributora — předtím se pro zbytky neuplatňovaly (VOC = MOC v MVP).
- UI updates:
- · Step 06 Kalkulace: nový sloupec VOC v tabulkách dílců, footer s MOC + VOC.
- · Detail page: stejné.
- · PDF: VOC PDF zobrazí ceny se slevou, MOC PDF plné; footer footnote o rabatu.
- Backend: base_price_rabate uložen jako round(voc_total) místo round(total).
0.1.0-dev105
- Hotfix Zbytky: na step 06 Kalkulace chyběla tlačítka Uložit / Publikovat.
- · Publikovat sekce byla jen ve standard/Příroda větvi (`<?php else: ?>`),
- · Fix: přidána stejná Publikovat sekce do zbytky větve.
- · Sticky footer "Uložit" (= save draft) funguje beze změny.
0.1.0-dev104
- Bug fix Zbytky: materiálová cena dílce — proporce podle ploch DÍLCŮ, ne podle plochy zbytku.
- · Příklad: zbytek 2,1 m² za 10 000 Kč, dílec 1,5 m².
- · Vzorec: cena_zbytku × (plocha_dílce / Σ plocha_všech_dílců).
- · Suma materiálových cen napříč dílci = cena_zbytku (vždy).
- · Fix v JS itemMaterialPrice + PHP ZbytkyCalculator + dokstring.
- PDF render pro Zbytky cenovky (audit-step02-16b).
- · Nová šablona templates/pdf/quote-zbytky.php — layout per zbytek s tabulkou dílců
- · Hlavička/footer/partner sekce stejná jako standard PDF, barevné rozlišení:
- · Badge v hlavičce "Cenění ze zbytků" (+ VOC suffix pro VOC PDF).
- · Cenovka celkem s DPH 21% v price boxu.
- · Footer note: "Pořizovací cena zbytku je rozdělena mezi dílce poměrně podle jejich plochy."
- · PdfGenerator dispatcher podle flow_type: zbytky→quote-zbytky.php, jinak→quote.php.
0.1.0-dev103
- Hotfix Zbytky dev102: 2 UI fixy.
- 1) Materiál dropdown obsahoval všechny materiály (vč. Compact 140 a Příroda 120).
- 2) Operace v dílcích byly v jednom flat selectu s optgroupy. Změna:
0.1.0-dev102
- audit-step02-16: Cenění ze zbytků (4. flow type) — MVP.
- Hybrid Kámen + Příroda: dekor z Helios katalogu (cascade), rozměry + cena
- Vzorec: cena_dílce = (cena_zbytku × plocha_dílce / plocha_zbytku) + operace.
- Soft warning pokud dílce přesahují plochu zbytku (>100 %) — necháme uživateli rozhodnout.
- Nová capability `stonecalc_create_zbytky` (BO + OZ default ON).
- Nový flow type `zbytky` v QuoteFlowType + label "Zbytky" + popis pro UI.
- Routing: /calc/cases/new-zbytky → CaseController::newCaseZbytky → draft.
- Wizard step 02: nový template 02-specifikace-zbytky.php (~600 řádků, scZbytky Alpine).
- Wizard step 06 (Kalkulace): větvení pro zbytky → vlastní render se sekcemi per zbytek
- Publish: vlastní cesta v WizardController::publish — uloží snapshot calculation
- Detail page: vlastní rendering sekcí per zbytek + tabulkou dílců.
- Cases list: tab "Zbytky" v navigaci, "+ Nový případ" položka pro BO/OZ,
- Backend sanitize v WizardController::collectStep2 — nested items[].operations[].
- Nová třída ZbytkyCalculator (proporcionální cena dílce).
- Mimo MVP: vlastní PDF render (zatím reuse Příroda PDF), slevy distributora,
0.1.0-dev101
- audit-step02-8: Warning při dvojím přidání operace.
- · addOperationWithQty: zkontroluje operationDupCount, při >0 ukáže confirm
- · Pokud user dá Storno → operace se nepřidá (může upravit qty u stávající).
- · Pokud Potvrdí → přidá se a obě (resp. všechny) dostanou žlutý badge ⚠ N×
- · Badge se zobrazuje vedle title v sc-ops-card-item.
- · Helper operationDupCount(boardIdx, opId) — countuje operations s daným
- · Důvod: prevence omylu při klikání ze selectu (uživatel nevidí že už ji má).
0.1.0-dev100
- audit-step02-5: Validace prázdné desky před Pokračovat.
- · @submit handler validateAndSync($event) zkontroluje desky před odesláním.
- · Povinná pole: material_id, product_group_id||vyrobce_org_id, decor_id,
- · Při chybě: preventDefault, zobrazení červeného error boxu nad form
- · Empty boards.length → 'Přidej alespoň jednu desku.'
- audit-step02-7: Kopírovat desku.
- · Tlačítko '📋 kopírovat' vedle 'smazat ✕' v hlavičce desky.
- · Deep copy přes JSON.parse(JSON.stringify) — všechna pole + operations + arcs.
- · Nové uid pro desku + pro každou operaci + arc.
- · Label se prefixne ' (kopie)' aby uživatel věděl která je nová.
- · Vloženo HNED za zdrojovou desku (ne na konec), activeIdx = nová.
- audit-step02-4: Souhrn ceny per deska v sidebaru.
- · V Seznamu desek pod každým řádkem 2. řádek: 'WxH mm · X.XX m²'
- · Pod seznamem (pokud má desek > 1) celkový součet operací napříč všemi
- · Materiálová cena se zde nezobrazuje (slab_count je až v kroku 04).
0.1.0-dev99
- audit-step02-9b: Search filter v dekor dropdownu (pro značky s >10 dekorů).
- · Search input nad <select> dekoru, filtruje options v reálném čase.
- · Case-insensitive + bez diakritiky (Brilliant matchne i "brilliant", "brílliant").
- · Zobrazí se jen když značka má >10 dekorů (Technistone 50, Avant Quartz, …).
- · Compact (FinitWood 3 dekory) input nezobrazuje (zbytečné).
- · Pod selectem počítadlo "Zobrazeno X z Y dekorů".
- · Reset _decorSearch při změně materiálu / značky / dekoru.
- · Důvod: Zdeněk: 'prorolovat 59 dekory může být nepřehledné' (dev98 feedback).
0.1.0-dev98
- audit-step02-9: Fotky dekorů v cascade (hybrid layout).
- · 59 fotek nahráno do wp-content/uploads/stonecalc/dekory/{technistone,finitwood}/
- · Nový scanner DecorPhotosScanner — projde složku, zparsuje filenames,
- · Dva patterny filenames:
- Quartz/Keramika: "<RegCis>-<Nazev>.webp" (např. "113837-Noble Imperial Grey.webp")
- Compact: "<short_code>.webp" (např. "NI342.webp")
- · Hybrid UI: dropdown beze změny + vpravo 120x120 preview vybraného dekoru
- · REST /decors vrací image_path; Alpine helper decorImageUrl(i).
- · Diagnostika: nová sekce "Fotky dekorů" se statistikou (kolik dekorů
0.1.0-dev97
- Diagnostika: odebráno tlačítko "Vyčistit všechny cenovky (dev)".
- · Důvod: přechod do ostrého testovacího režimu (prezentace pondělí).
- · Backend handler `handlePurgeQuotes` + `admin_post_stonecalc_purge_quotes`
- · Per-cenovka mazání bude součástí Administrace systému (audit-admin-2a).
- · Notifikace transientů smazána není (zpětně kompatibilní pro běžící requesty).
0.1.0-dev96
- audit-step02-1: Volitelný popisek desky ("Ostrůvek", "Obklad za varnou plochou", …).
- · Vstup pod hlavičkou desky, max 200 znaků.
- · Zobrazení v sidebaru ("Seznam desek"), header desky, kroku 04 (Nářezový plán),
- · JSON v sc_quotes.data: pole `label`, sanitize trim + max 200.
- · addBoard: label se NEDĚDÍ (každá deska má svůj).
- audit-step02-2: Select-on-focus na všech number inputech v kroku 02.
- · Click do pole → celý obsah vybraný → další klávesa přepíše hodnotu.
- · Inputy: Délka, Šířka, Délka řezu, Arc input/count, Otvor průměr, Op počet.
- audit-step02-3: Desetinná místa (step="any") u relevantních inputů.
- · Předtím step="1" zaokrouhlovalo (např. m² 2,5 → 3).
- · Změna: Délka, Šířka, Délka řezu, Arc input, Otvor průměr, Op počet = step="any".
- · Arc count zůstává step="1" (počet oblouků musí být celé číslo).
0.1.0-dev95
- Hotfix dev94: Compact dropdown Dekor zůstával disabled (falsy-zero bug).
- Debug widget v dev94 odhalil: state OK (vyrobce_org_id=7090, decorOptions=3,
- Fix: `:disabled="(!b.product_group_id && !b.vyrobce_org_id) || !decorOptions.length"`
- Stejně i pro bulkChange modal.
- Debug widget odebrán.
0.1.0-dev93
- Hotfix dev92: dropdown Heritage vybraný, ale dekory pořád prázdné.
- Diagnostika potvrdila — backend funguje na 100 % (Heritage=20 dekorů,
- Příčina: dev92 přidal `materialsFlow` do scBoards() init, ale browser/Divi
- Fix: odstranit závislost na `materialsFlow` úplně — Compact pseudo se pozná
- `this.materialsFlow` zůstává v init (pro budoucí použití), ale cascade už ho
- Diagnostika: nová sekce "dev91: Compact (sk. 140) — vyrobce / aliasy / dekory"
0.1.0-dev92
- Hotfix dev91: Compact cascade — výrobce se vybral, ale dekory zůstaly prázdné.
- Příčina: scBoards() nikdy nedostal `materialsFlow` z PHP do JS state — proměnná
- Fix: x-data scBoards() přijímá `materialsFlow`, ukládá do state, isCompactPseudo
0.1.0-dev91
- Compact cascade — výrobci (Heritage / FinitWood) místo značek dekoru.
- Problém: dev90 odvozoval značky Compactu z d.trademark v dekorech (Technistone,
- Fix:
- · Schema: sc_base_products + vyrobce_org_id INT NULL (= Helios cisloOrg)
- · Schema: sc_distributors + compact_brand_alias VARCHAR(64) NULL
- · Domain: CompactVyrobceMap (defaults: 8412=Heritage, 7090=FinitWood)
- · Importer: BaseProductsImporter čte <Karta>/<Vyrobce> + fallback heuristika
- · Migrator: backfill pro již importované karty 140 + seed aliasů Heritage/FinitWood
- · Repository: ProductGroupRepository::productGroupsFromCardsForMaterial GROUP BY
- · REST: /decors přijímá vyrobce_org_id (preferováno nad trademark).
- · Frontend: pgOptionValue() = "id:vyrobceOrgId" — rozlišuje dvě pseudo pg=0.
- Bump DB_VERSION = 7 (přidané sloupce, dbDelta migrace).
0.1.0-dev90
- Compact cascade fix — značky a dekory z reálných dat karet
- Problém: Compact karty (SkupZbo=140) odkazují na dekory s Znacka="Technistone"
- Fix: pro material 140 značky odvodit z DISTINCT d.trademark v
- Compact dropdown Značka teď ukáže 2 reálné značky (Technistone, Lapitec).
- Pseudo product_group_id=0, frontend pošle trademark explicitně v /decors REST.
- REST /decors přijme volitelný `trademark` parametr (priorita nad pg_id).
- Cache key pro Compact pseudo: "material|tm:trademark" (nezasahuje do Kámen flow).
- BoardDiscountGroup pro material_id=140 → 240 (Hotová výroba kompakt. laminát).
- Filter `stonecalc_compact_discount_group` pro override.
0.1.0-dev89
- User meta používá HELIOS IDs (ne internal sc_distributors.id)
- BO/OZ pracuje s Helios cisloOrg (= to co vidí v Heliosu),
- user_meta keys:
- · stonecalc_distributor_helios_ids (string, čárkou — Helios IDs)
- · stonecalc_person_helios_id (string — Helios cisloKO osoby)
- UserRole::distributorIds() → lookup helios_id → internal id přes
- UserRole::personId() → lookup helios_id (VARCHAR) → internal id
- WP admin edit user:
- · Labely "Spravované firmy (Helios ID)" + "Helios ID osoby"
- · Placeholder "např. 6561" (AutoDetect)
- · Live lookup: ukáže názvy firem/osoby po uložení (debug helper)
- · Hint: odkaz na Diagnostika → Rabaty distributorů (kde Zdeněk najde Helios IDs)
0.1.0-dev88
- Uživatelské role + Capabilities (foundation)
- 5 WP custom rolí:
- · stonecalc_back_office (BO) — vše + Helios Import + Diagnostika
- · stonecalc_sales_rep (OZ) — Příroda + spravované firmy
- · stonecalc_org_manager (Manažer organizace) — vlastní firma, vidí VOC
- · stonecalc_user (Uživatel) — vlastní cenovky (kde je kontakt)
- · stonecalc_viewer (Read-only) — určené firmy, jen prohlížení
- 8 capabilities:
- · stonecalc_access — vstup do /calc/* (každá role)
- · stonecalc_create_quote — vytvořit jakoukoli CN
- · stonecalc_create_priroda — Příroda flow (BO + OZ)
- · stonecalc_view_all_quotes — vidět všechny CN (BO)
- · stonecalc_view_voc — VOC sloupec/PDF (všechny role default ON)
- · stonecalc_edit_voc_items — editace VOC položek (BO + OZ)
- · stonecalc_manage_helios — Helios Import + Diagnostika (BO + admin)
- · stonecalc_manage_users — správa uživatelů (BO + admin)
- WP admin (administrator) dostane VŠECHNY stonecalc_* caps = super-BO
- Auto-registrace rolí při bootu (caps_version tracking, idempotent)
- User meta:
- · stonecalc_distributor_ids — list IDs (čárkou), scope per role
- · stonecalc_person_id — sc_distributor_persons.id (Uživatel)
- WP admin → Uživatelé → Edit → sekce "StoneCalc — role a vazby"
- QuoteRepository::listForUser — filter per role:
- · BO/Admin: bez filtru
- · OZ/Manažer/Viewer: distributor_id IN list
- · Uživatel: distributor_person_id = jeho personId
- · Plus vždy: vlastní cenovky (created_by)
- Frontend access gate:
- · Dispatcher::requireLogin — kontroluje stonecalc_access cap
- · AuthController — po loginu ověřuje access (jinak logout + error)
- QuoteFlowType::PRIRODA capability migrace
- Po deploy admin nedělá nic — auto-registrace rolí proběhne při dalším
0.1.0-dev87
- Verify že dev86 readOuterXml fix běží — parser_version stamp v debug
- Plus znovu deploy XmlIterator.php (kdyby předchozí FTP nezáplatoval)
0.1.0-dev86
- KRITICKÝ BUG fix v XmlIterator
- Pro některé organizace (např. AutoDetect 6561) vracel $reader->expand()
- Tj. import zachytil jen prvních 2 slevy a nevěděl o ostatních 20.
- Fix: místo expand() použijeme readOuterXml() + DOMDocument::loadXML()
- Po reimport: všechny organizace mají správný počet rabatů.
- Po dev86 hromadná změna dekoru správně počítá VOC ceny.
0.1.0-dev85
- Debug log pro VŠECHNY distributory s rabaty + raw_sample
- Limit 100 odebrán → debug pro každého kdo má <slevy>
- raw_sample (prvních 3 sleva items jak je XmlIterator naparsoval) — uvidíme
- Po reimport → 6561 → Zobrazit rabaty → debug box rozbalit "první 3 slevy"
0.1.0-dev84
- HOTFIX dev83: Gateway Timeout u Helios Import
- Bug: dev83 přidal update_option per distributor (1000+ organizací = 1000+ DB
- Fix 1: BULK INSERT — všechny discounts pro 1 distributora v 1 SQL query
- Fix 2: Debug log se collected do memory během importu a uloží JEDNOU na
- Fix 3: Debug log limit 100 distributorů (= pro debug stačí top 100).
- Performance: order of magnitude rychlejší.
0.1.0-dev83
- Debug log pro syncDiscounts (AutoDetect importuje jen 2 z 22 rabatů)
- Persistent log v option stonecalc_helios_discounts_debug
- Diagnostika ukáže debug box per distributor:
- · slevy_count v XML
- · is_list (array_is_list result)
- · deduped count + skip reasons
- · INSERT úspěšné/selhání + error messages
- · raw_first (var_export první sleva pro inspekci)
- Po spuštění Helios Import znovu → Diagnostika dist_helios=6561
0.1.0-dev82
- Diagnostika — inspekce rabatů per distributor
- DiagnosticsPage.inspectDistributorDiscounts() — load po ?dist_helios=NNNN
- Nová sekce "💰 Rabaty distributorů":
- · Input pro Helios ID (např. 6561 = AutoDetect)
- · Tabulka rabatů: skupina | název | %
- · Plus top distributoři (statsPerDistributor)
- Help při debug "VOC se nepropočítal":
- · Vyplň Helios ID partnera, uvidíš stav DB
- · Pokud chybí rabaty → spustit Helios Import
- · Pokud rabat 0% → Helios je tak (uvidíš tam)
0.1.0-dev81
- Hromadná změna dekoru — title regenerace + debug rabatu
- Bug 1 fix: changeBoardsDecor regeneruje title přes TitleGenerator
- Debug pro Bug 2 (rabat se nepropočítal po změně dekoru):
- · Pricing log per materiál ukáže rabat % a VOC cenu
- · Pokud rabat 0% → "[bez rabatu — VOC = MOC]"
- · Pokud rabat >0% → "[rabat 20% → VOC: ... Kč]"
- · Snapshot calculation.debug_distributor_id pro inspekci v DB
0.1.0-dev80
- HOTFIX dev79: modal hromadné změny nedělal nic při kliku
- Modal byl placed MIMO <form> = mimo Alpine x-data scope scBoards.
- Fix: přesunut modal před </form>, aby byl ve scope scBoards komponenty.
- Plus x-data prázdné atribute na modal divu odebráno (zbytečné).
0.1.0-dev79
- Hromadná změna dekoru (varianta A — celá implementace)
- Domain\OperationMapper:
- · Mapuje operace mezi ceníky přes operation_number (business kód)
- · Stejný kód napříč ceníky (1=Řez rovný, 3=Oblouk, 4=Combicut...)
- · Vrací { operations: [...], removed: [...] }
- QuoteRepository::changeBoardsDecor():
- · Vstup: quote_id, board_uids[], newSpec
- · Změní: decor + thickness + surface + product_group + material + base_product
- · Clamp width/height na nový max
- · Přemapuje operace přes OperationMapper
- · Smaže data.calculation snapshot
- · Vrátí: { success, changed_boards, removed_operations, clamped_dimensions, error }
- REST POST /quotes/{id}/change-decor (BO + autor)
- UI v krok 02 wizardu:
- · Tlačítko "⇄ Hromadná změna dekoru" v aside (jen když máš aspoň 1 desku s kartou)
- · Modal: checkbox list desek + cascade pro nový dekor (Materiál → ... → Povrch)
- · Po Apply: result modal s přehledem co se změnilo, co odebráno, co clampnuto
- · Reload stránky po Zavřít — nové boards se načtou z DB
- CSS .sc-modal-overlay / .sc-modal (sdílené pro budoucí modaly)
- Pro publikované cenovky: nejdřív Duplikovat (dev77) → pak Hromadná změna v krok 02
0.1.0-dev78
- Seznam cenovek — sdružení variant (group_id)
- Sort změna:
- · ORDER BY group_last_at DESC, group_id DESC, row_in_group ASC
- · Skupiny řazené podle poslední aktivity (nejnovější skupina = první)
- · Uvnitř skupiny: varianty pod sebou (row_in_group ASC)
- · = duplikáty se vždy zobrazí pohromadě jako blok
- SQL subquery na group meta (group_size + group_last_at) — pro frontend
- Vizuální vrstva (CSS):
- · Skupina s >1 variantou: levý zlatý border kolem celého bloku
- · Lead cenovka (row=1): jemný zlatý gradient v ID buňce + badge "N×"
- · Varianty (row>1): tlumené pozadí, indent prefixem ↳ + "varianta N"
- Helps orientaci kdy je cenovka součástí skupiny duplikátů
0.1.0-dev77
- Duplikace cenovky (audit-cases-2)
- QuoteRepository::duplicate($sourceId, $userId):
- · Deep copy data (boards, operations, arcs, items, slab counts)
- · Stejný group_id, row_in_group++ (varianty v jedné skupině)
- · Nové random ID, status=draft, created_at=teď, valid_to=+90 dní
- · Smaže data.calculation snapshot + pricing_log (přepočítá se při publish)
- · Title se regeneruje přes TitleGenerator (podle materiálu+dekoru)
- UserRole::canEditQuote() — capability gate
- · BO vždy + autor (created_by) vždy
- · Manager organizace = v0.3+ (filter stonecalc_user_can_edit_quote)
- POST /calc/cases/{ID}/duplicate
- · Router + Dispatcher + CaseController::duplicate
- · Vyžaduje WP nonce + capability check + 403 wp_die při FAIL
- · Po úspěchu redirect na /calc/cases/{newId}/edit/1 (krok 01 nového draftu)
- UI tlačítka:
- · Detail aside: ⧉ Duplikovat (oživeno z dummy alertu)
- · Seznam ⋮ menu: Detail / PDF MOC / PDF VOC (BO) / Duplikovat
- · Capability per řádek (autor + BO vidí Duplikovat, ostatní ne)
- CSS .sc-actions-btn + .sc-actions-menu (dropdown na řádku)
0.1.0-dev76
- Filter značek bez aktivních dekorů (druhý pokus)
- productGroupsForMaterial: pro každou značku z mapy zavolat
- Princip: značka v dropdownu je viditelná POUZE pokud aspoň 1 dekor s ní
- Efekt:
- · Quartz dropdown ukáže jen Technistone + Silestone (BP nedistribuuje ostatní)
- · Keramika dropdown ukáže ~ 8 značek (Atlas, Dekton, Fondovalle, Inalco,
- · Lapitec (EOL) zmizí
- N+1 queries (1 + max 14), ale per dropdown render OK.
- Reuse existující BaseProductRepository::decorsForTrademark — testovaná logika.
0.1.0-dev75
- HOTFIX dev74 — dva bugy
- Bug A: Compact dropdown ukazoval Quartz + Keramiku + Compact (3 položky)
- Bug B: Po dev74 EXISTS filtru na visible_nasa+status vrátil dropdown ZNAČKA
0.1.0-dev74
- Compact / HPL samostatný flow + filtr značek bez aktivních dekorů
- QuoteFlowType::COMPACT — třetí flow vedle STANDARD (Kámen) a PRIRODA
- · Kámen = 110 Quartz + 130 Keramika
- · Compact = 140 (HPL / Kompaktní laminát)
- · Příroda = 120 (custom)
- · Compact viditelný pro VŠECHNY (Příroda zůstává jen BO)
- Routing /calc/cases/new-compact + CaseController::newCaseCompact
- Seznam cenovek:
- · Dropdown "+ Nový případ" se 3 položkami (Kámen/Compact/Příroda)
- · Záložky [Vše][Kámen][Compact][Příroda] s counters
- · sc-flow-compact badge (modrý odstín)
- REST /materials?flow=standard|compact|priroda
- MaterialGroupMap::materialsForFlow($flow) — return material IDs per flow
- Krok 02 (Kámen template):
- · Hlavička "Specifikace desek — COMPACT / HPL" pro compact flow
- · Materiál dropdown filtruje per flow (jen 110+130 vs 140)
- Detail page — Compact badge + label
- ProductGroupRepository::productGroupsForMaterial — EXISTS subquery
- · Značky bez aktivních produktů (Lapitec EOL apod.) zmizí z dropdownu
- · U Quartz uvidíš jen značky které BP aktuálně distribuuje
- · U Keramiky stejně
0.1.0-dev73
- Inline editace názvu cenovky v seznamu (audit-cases-5)
- Cases list: u každého názvu tlačítko ✏ (viditelné při hover)
- · Klik → input se zfokusuje a označí celý text
- · Enter (submit form) nebo blur → uloží
- · Esc → zruší (vrátí původní)
- · Funguje i pro publikované cenovky
- · "✓ uloženo" flash po úspěšném save
- REST: POST /quotes/{id}/rename (sanitize, login required)
- QuoteRepository::updateTitle() — pouze title sloupec
- Účel: interní označení v seznamu ("Praha 8 - varianta B")
- · PDF a snapshot v data.json ZŮSTÁVAJÍ s původním názvem (jen seznam)
0.1.0-dev72
- Krok 01 (Pro koho cenujeme) — audit
- Po výběru osoby/firmy se zobrazí kontakty:
- · ✉ e-mail (mailto: link)
- · ☎ telefon (tel: link)
- REST /persons/search rozšířen o phone
- DistributorPersonRepository.search() vrací i p.phone
- Validace povinné osoby:
- · JS validace při Pokračovat (Alpine, zvýraznění + scroll)
- · Server-side anti-tamper (?error=person_required redirect zpět)
- · Lze pokračovat AŽ po výběru — bez kontaktu nelze
- Návrat na předchozí krok / Uložit jako koncept (bez "next" action)
- Hint texty upraveny — odstraněno "výběr je volitelný"
0.1.0-dev71
- Seznam cenovek — vylepšení (audit-cases)
- Counter v záložkách: [Vše (24)] [Kámen (18)] [Příroda (6)]
- Quick stats nahoře:
- · Tento měsíc: počet cenovek + suma MOC
- · Pro Back Office i suma VOC
- Filtry funkční (GET parametry):
- · Vyhledávání (ID, název, kontakt, firma)
- · Stav (Koncept / Aktivní / ... )
- · Datum od/do
- · Tlačítka Filtrovat + Vyčistit
- Nový sloupec VOC bez DPH (jen pro Back Office, zlatá barva)
- Nový sloupec Vytvořil (display_name WP usera)
- Expirovaná cenovka (active + valid_to < dnes):
- · Žluté pozadí řádky
- · Badge ⚠ Po platnosti pod názvem
- QuoteRepository:
- · listForUser() rozšířen o $filters parametr
- · countersByFlow() — pro záložky
- · statsCurrentMonth() — pro quick stats
- Vše viditelné podle role (BO = víc info)
0.1.0-dev70
- Login: skutečné logo BRUNO PAUL + Seznam změn (audit-login-1/2)
- Layout header:
- · Místo nápisu "BRUNO PAUL" zobrazujeme PNG logo
- · assets/img/bp-logo.png (z Podklady/Loga)
- · CSS invert(1) — logo je černé, header je černý → bíle se vykreslí
- · Hover: zlatý tónovaný efekt přes filter
- Domain/Changelog.php — parser readme.txt:
- · Sekce "== Changelog ==" → list verzí
- · Heading "= 0.1.0-devXX =" + bullet "* ..." → strukturovaný array
- · Transient cache 1h (invalidace přes filemtime)
- Login stránka (2sloupcový grid):
- · Levý sloupec: login form (stejné jako bylo)
- · Pravý sloupec: Seznam změn — posledních 3 verzí + "Zobrazit starší" toggle
- · Responsive: na mobilu pod sebou
- Účel: před ostrým spuštěním ukázka rozsahu vývoje pro kolegy
0.1.0-dev69
- Diagnostika — Data quality report z Helios slev
- Importer ukládá per organization:
- · stonecalc_helios_duplicate_discounts (option) — kdo má duplicitní slevy
- · stonecalc_helios_over100_discounts (option) — kdo má slevu > 100 %
- · Reset na začátku každého importu
- Diagnostika nová sekce "⚠️ Data quality — Helios slevy":
- · Tabulka organizací s duplicitními slevami (helios #, firma, počet duplicit)
- · Tabulka slev > 100 % (helios #, firma, skupina, %)
- · Slouží k feedbacku do Heliosu pro datový cleanup
- Import messages obsahují název firmy:
- · "AutoDetect s.r.o. (Helios #6561), skupina 240: rabat 240% > 100%"
0.1.0-dev68
- HOTFIX dev64: duplicitní slevy v Helios XML
- · Některé organizace mají v XML 2× slevu pro stejnou skupinu
- · Před dev68: druhý INSERT padal s "Duplicate entry" → 401 chyba v importu
- · Po dev68:
0.1.0-dev67
- HOTFIX dev64: PHP fatal error v DistributorsImporter
- · V dev64 jsem přidala private static function float()
- · AbstractImporter UŽ má protected static function float() →
- · Padlo to při autoload DistributorsImporter (admin/import context)
- · Fix: smazána lokální verze, používá se zděděná self::float() z AbstractImporter
0.1.0-dev66
- Rabat aplikujeme JEN pro skupiny 2xx (Hotová výroba)
- QuoteCalculator::resolveDiscountPercent:
- · Filtr na rozsah [200, 300) — group < 200 nebo >= 300 → 0% rabat
- · Defensive proti omylem zadané surovinové skupině (1xx)
- BoardDiscountGroup komentář vyjasněn
0.1.0-dev65
- Výpočet VOC ceny z partner rabatů (dev64)
- BoardDiscountGroup helper:
- · Kámen flow: board.product_group_id (210, 215, 220...)
- · Příroda flow: 220 (Hotová výroba příroda) — override přes
- QuoteCalculator::compute() rozšířen o $distributorId parametr:
- · Per board najde rabat % (= sleva pro slevovou skupinu boardu)
- · VOC factor = 1 - rabat/100
- · VOC materiál = MOC materiál × factor (per material group)
- · VOC operace = MOC operace × factor (per board)
- · VOC items: BEZ rabatu (free položky se nevracejí)
- · mocTotal = materiál + operace + MOC items
- · vocTotal = vocMateriál + vocOperace + VOC items
- CalculationResult + BoardCalculation:
- · vocMaterialPrice, vocOperationsPrice nová pole
- · materials[].discount_percent, materials[].voc_price
- · BoardCalculation.discountPercent
- Pokud rabat 0 % → MOC = VOC (žádná sleva pro tuto skupinu)
- Krok 06 rekapitulace:
- · 2sloupcová total tabulka: MOC vs VOC (po rabatu)
- · Per materiál řádek ukáže rabat % + VOC cena
- · Hint info "VOC = MOC × (1 - rabat) per produktová skupina"
- Detail page:
- · Tabulka Materiály doplněna o sloupce Rabat + VOC
- PDF — VOC ceny už správně přes base_price_rabate
0.1.0-dev64
- Import partner rabatů z Heliosu
- DB migrace (db_version 5 → 6):
- · Nová tabulka sc_distributor_discounts:
- · Unique (distributor_id, product_group_id)
- · Auto-migrace spustí dbDelta při příštím load
- DistributorsImporter rozšířen:
- · Parsuje <slevy><sleva> z HeliosOrganizaceBP.xml
- · Clean refresh — smaže staré discounty per distributor a vloží nové
- · Warning při rabat > 100% (Helios překlep — viz AutoDetect skupina 240)
- DistributorDiscountRepository:
- · findPercent($distributorId, $productGroupId) → 0.0 pokud nenastaveno
- · listForDistributor($id) → všechny rabaty
- · statsPerDistributor($limit) → diagnostika
- Po deploy spusť: Admin → StoneCalc → Helios Import (nahraje rabaty z XML)
- VOC výpočet přijde v dev65
0.1.0-dev63
- Auto-migrace + defenzivní fix poznámek
- Plugin::boot() → maybeRunMigration():
- · Pokud option stonecalc_db_version != STONECALC_DB_VERSION konstanta,
- · Lock přes transient (60s) proti race condition
- · Try/catch + error_log (nepadne fronta když migrace selže)
- Fix dev59 bug: poznámka_bp sloupec nepřidán = wpdb->update fail =
- WizardController defenzivní retry:
- · Pokud updateDraft vrátí false (column missing race), retry bez note_bp
- · Aspoň note_moc + note_voc se uloží i v edge case
0.1.0-dev62
- Wizard krok 03 — Specifikace služeb (volné položky MOC/VOC)
- UserRole helper (Domain/UserRole.php):
- · isBackOffice() proxy přes manage_options pro v0.2
- · Filter stonecalc_user_is_back_office pro override (v0.3+ refactor na role-based)
- Krok 03 šablona (Alpine.js):
- · Sekce MOC položky — viditelné/editovatelné pro každého
- · Sekce VOC položky — JEN pro Back Office (anti-tamper i v backendu)
- · Tlačítko "↗ Kopírovat do VOC" u MOC položek (jen BO)
- · Live total per sekce, anti-overflow per row
- · +Přidat položku tlačítko (jako u operací)
- QuoteCalculator:
- · Nové parametry $mocItems, $vocItems
- · itemsMocTotal, itemsVocTotal v CalculationResult
- · MOC celkem = materiál + operace + MOC položky
- · VOC celkem = materiál + operace + VOC položky
- Snapshot: items_moc/items_voc/items_*_total v data.calculation
- PDF render — sekce "Doplňkové položky" před cenou:
- · MOC PDF: jen items_moc
- · VOC PDF: jen items_voc
- Krok 06 rekapitulace:
- · Sekce "Doplňkové položky" (MOC + VOC barevně odlišené)
- · Řádky "Položky MOC celkem" / "Položky VOC celkem"
- · VOC cena zobrazena samostatně pokud se liší od MOC
- Detail page:
- · Tabulka doplňkových položek (MOC + VOC)
- · VOC cena vedle MOC v aside (pokud se liší)
- CSS .sc-items-table + .sc-bo-section (zlatý border)
0.1.0-dev61
- Wizard refactor — 5 → 6 kroků
- Nová struktura:
- WizardController: 6krokové mapování + step clamping max 6
- Progress nav (_progress.php) — 6 položek
- Sticky footer — "Pokračovat" do step < 6
- Soubory:
- · NEW: templates/frontend/wizard/03-specifikace-sluzeb.php (placeholder)
- · RENAME: 03-doplnkove-info.php → 04-doplnkove-info.php
- · RENAME: 04-narezovy-plan.php → 05-narezovy-plan.php
- · RENAME: 05-kalkulace.php → 06-kalkulace.php
- Existující drafty: pojedou v nové struktuře hned po deploy
- Item položky MOC + VOC přijdou v dev62
0.1.0-dev60
- Nářezový plán per MATERIÁL (ne per dílec)
- Nový MaterialKey helper (Domain/MaterialKey.php):
- · Kámen: base_product_id (1 km. karta = 1 materiál)
- · Příroda: subtype+název+tloušťka+povrch+formát+cena (1 specifikace = 1 materiál)
- · Group helper: groupBoards() → seskupení dílců
- Wizard krok 04:
- · 1 řádek per materiál, 1 input "počet desek" per materiál
- · Sloupec "Dílce na tomto materiálu" ukazuje které dílce ze stejného materiálu
- · Live plocha celkem (count × area)
- · Aside: počet dílců + počet materiálů
- Wizard krok 04 LEGACY mode:
- · Pokud cenovka má per-board slab_count > 0 a nemá material_slab_counts
- · Backward compat pro cenovky vytvořené před dev60
- QuoteCalculator::compute($boards, $materialSlabCounts):
- · Nový režim: per-material agregace → CalculationResult.materials[]
- · Legacy: bez slab_counts argumentu = per-board materialPrice (jak bylo)
- · skipMaterialPrice flag pro computeBoard v novém režimu
- CalculationResult:
- · Nová public array $materials = [] (per-group breakdown)
- · toPricingLog() — nahoře sekce "Materiály", pak "Dílce a opracování"
- Wizard krok 05 (rekapitulace):
- · Nová sekce "Materiály" nad rekapitulací dílců
- · "Deska N" → "Dílec N" v novém režimu
- PDF (quote.php):
- · Sekce "Materiály" nad dílci (v novém režimu)
- · "Deska N" → "Dílec N"
- Detail page (case-detail.php):
- · Tabulka Materiály se sloupci ks, m², Kč/m², Cena
0.1.0-dev59
- Poznámka BRUNO PAUL (3. typ poznámky)
- DB migrace (db_version 4 → 5):
- · Nový sloupec sc_quotes.note_bp TEXT NULL
- · Spusť: Admin → Diagnostika → "Spustit DB migraci"
- Wizard krok 03:
- · 3 textarey: Poznámka MOC, Poznámka VOC, Poznámka BRUNO PAUL
- · Labely upraveny aby bylo jasné kde se která zobrazí
- PDF rendering:
- · MOC PDF: pouze poznámka MOC
- · VOC PDF: poznámka MOC + poznámka VOC (partner vidí obě)
- · Poznámka BP se v PDF NIKDY neukáže (pouze v administraci)
- Detail cenovky (case-detail.php):
- · Zobrazuje všechny 3 poznámky (BP odlišena zlatým podbarvením)
0.1.0-dev58
- PŘÍRODA — revert dev57 layout změny (špatná interpretace)
- Materiál sekce vrácena na dev55/56 layout:
- · Row 1: Typ Příroda + Název materiálu
- · Row 2: Tloušťka + Povrchová úprava
0.1.0-dev57
- PŘÍRODA — finální seznam povrchů + layout fix Materiálu
- MaterialGroupMap::prirodaSurfaces() — whitelist 10 povrchů:
- /surfaces-list REST endpoint:
- · Vrací PRIMÁRNĚ Příroda whitelist (ne DB)
- · sc_surface_finishes z Heliosu má anglické názvy (Glossy/Matt) pro Quartz,
- · Filter stonecalc_priroda_surfaces zachován pro override
- Layout Materiál sekce:
- · Row 1: Typ Příroda (220px) + Tloušťka (110px) + Název materiálu (široký)
- · Row 2: Povrch (široký dropdown)
- · Název má teď stejnou viditelnou šířku jako vstupy ve Formát/Dílec
0.1.0-dev56
- PŘÍRODA layout polish
- Vizuální oddělení "vstup" (zakoupená deska) vs "výstup" (dílec):
- · Materiál + Formát zakoupené desky → jemně zlaté pozadí (#fcf6e8)
- · Velikost dílce + Opracování → bílé pozadí
- · Silnější mezera mezi posledním input a prvním output blokem (28px)
- Layout fix v Materiál sekci:
- · Typ Příroda — úzký box (sc-field-narrow-md, 200-240px)
- · Název materiálu — default flex (stejná šířka jako délka/šířka/cena)
- · Povrch — default flex (sjednoceno)
0.1.0-dev55
- PŘÍRODA UX polish v2 — sekce + povrchy
- Wizard krok 02 Příroda — strukturované sekce:
- · 1) Materiál (Typ + Název + Tloušťka + Povrch)
- · 2) Formát zakoupené desky a cena
- · 3) Velikost dílce (pro výrobu)
- · 4) Opracování
- · Každá sekce v sc-priroda-section blocku (zlatý levý border, padding)
- Surfaces endpoint hardening:
- · Odstraněn filter visible=1 (defenzivně — Helios má mix)
- · Distinct po title
- · Fallback statický seznam pokud DB empty (Leštěný/Matný/.../Pemrlovaný)
- · WordPress filter `stonecalc_priroda_surfaces` pro vlastní whitelist
0.1.0-dev54
- PŘÍRODA UX polish — feedback ze screenshotu
- Rozdělení rozměrů (jako u Kámen flow):
- · "Formát zakoupené desky" — max_width × max_height (vstup pro materiál)
- · "Velikost dílce (pro výrobu)" — width × height (výstup do PDF)
- · Live plocha + cena MOC za desku z formátu, max-validace dílce
- Povrchová úprava — dropdown z DB místo free textu:
- · Nový REST endpoint /surfaces-list (globální seznam sc_surface_finishes)
- · TODO: filtr na Příroda až Zdeněk specifikuje
- Layout cleanup:
- · Tloušťka — úzký box (.sc-field-narrow, 110px) místo full-width
- · Boxy v row mají konzistentní šířku
- QuoteCalculator:
- · Příroda materiál se počítá z max_w × max_h (formát desky) × MOC/m²
- · Sjednoceno s Kámen flow
- PDF/Detail:
- · Zobrazuje obě hodnoty (Formát desky + Velikost dílce)
0.1.0-dev53
- PŘÍRODA Fáze 3 (FINAL): UI Polish + kompletní operace
- Seznam cenovek:
- · Záložky [Vše] [Kámen] [Příroda] (jen pro Back Office / OZ)
- · Filter ?type=standard|priroda v URL
- · Nový sloupec "Typ" s badge Kámen / Příroda
- · Dropdown "+ Nový případ" se 2 možnostmi (Back Office vidí oba flow)
- QuoteRepository::listForUser:
- · Nový parametr $flowType pro filtr
- · Backward-compatible (null = bez filtru)
- CaseController::index:
- · Čte ?type query param, validuje proti QuoteFlowType
- · Předává canPriroda do template (controls dropdown + tabs visibility)
- case-detail.php:
- · Flow badge v hlavičce (Kámen / Příroda)
- · Tabulka desek pro Příroda flow (subtype, custom_material_name, rozměry, cena MOC)
- PDF (QuoteRenderer):
- · Příroda boards rendered s "Příroda — Kvarcit, [název]" titulkem
- · Tloušťka/povrch volný text (surface_label)
- · Cena MOC/m² v řádku Velikost
- 02-specifikace-priroda.php — KOMPLETNÍ operace UI:
- · Plné kapitoly (chapters cards)
- · Picker dropdown per kapitola
- · Editovatelné quantity, total_price, recalculate
- · Arcs UI (poloměr/průměr, čtvrtkruh/půlkruh/kruh, počet)
- · Auto-cut live preview (rovny / combicut podle cut_length)
- · Edge validation (kapitola 02 Typ hrany — clamp na max obvod)
- · Cache klíčovaný subtypem (kvarcit/zula/mramor → vlastní ceník)
- · Změna subtype = wipe operations (jiný ceník)
- QuoteCalculator:
- · is_custom_priced → spotřeba z user-entered width×height (ne max_dimensions)
- · Subtype → priceTypeForPrirodaSubtype (ne findActivePriceTypeForMaterial)
- · boardTitle pro Příroda: "Příroda · Kvarcit · [název] · [tloušťka]"
- TitleGenerator:
- · Příroda title: [custom_material_name] [subtype] [thickness] mm [surface_label]
- CSS:
- · .sc-tabs / .sc-tab (záložky filter)
- · .sc-new-case-dropdown / .sc-new-case-menu
- · .sc-flow-badge / .sc-flow-standard / .sc-flow-priroda
0.1.0-dev52
- PŘÍRODA Fáze 2: Routing + custom wizard krok 02
- Routing:
- · /calc/cases/new-priroda → CaseController::newCasePriroda
- · Self-healing rewrite flush check
- CaseController::newCasePriroda:
- · Capability gate přes QuoteFlowType::canCurrentUserUse (manage_options proxy)
- · 403 wp_die pokud bez práv
- · Vytvoří draft s flow_type=priroda
- WizardController::show:
- · Krok 02 se větví podle $quote['flow_type']
- · 'priroda' → wizard/02-specifikace-priroda
- · jinak → wizard/02-specifikace (Kámen, existující)
- Nový template wizard/02-specifikace-priroda.php:
- · Vlastní Alpine komponenta scPrirodaBoards (separate od scBoards)
- · Custom inputs:
- Typ Příroda (kvarcit/zula/mramor) — určuje ceník
- Název materiálu (volný text)
- Tloušťka, Povrch (volné, orientační)
- Délka × Šířka mm
- Cena MOC v Kč/m² (ručně)
- Cut_length (1A funguje stejně)
- · REST /operations volá s &subtype=X pro správný ceník
- · Operace zatím placeholder (přijde v dev53)
- NEW MaterialGroupMap::priceTypeForPrirodaSubtype:
- · kvarcit → 2606KVARCI
- · zula → 2606ZULA
- · mramor → 2606MRAM
- REST /operations rozšířen o subtype param:
- · Pokud zadán → použije Příroda mapping
- · Jinak → standard findActivePriceTypeForMaterial
- WizardController allowedBoard rozšířen o Příroda fields:
- · subtype, custom_material_name, surface_label, is_custom_priced
0.1.0-dev51
- PŘÍRODA FOUNDATION (Fáze 1 ze 3)
- DB schema:
- · sc_quotes + sloupec flow_type VARCHAR(20) NOT NULL DEFAULT 'standard'
- · + index idx_flow_type
- · STONECALC_DB_VERSION → 4 (vyžaduje migration v Diagnostice)
- NEW: Domain\QuoteFlowType
- · Konstanty STANDARD ('standard' = Kámen) a PRIRODA ('priroda')
- · isValid(), normalize(), label() helpers
- · requiredCapability() — v0.1 proxy přes manage_options pro Příroda
- · canCurrentUserUse() — gate check
- QuoteRepository::createDraft přijímá flow_type přes $extra
- Dosavadní cenovky všechny mají flow_type='standard' (default DB)
0.1.0-dev49
- 1B-E: Plošné oblouky (POSLEDNÍ z auto-výpočtů!)
- · Kapitola "Typ oblouku" v kroku 02 se vrací jako speciální UI:
- · Místo standardního pickeru: "+ Přidat oblouk" tlačítko
- · Per oblouk: radio (poloměr/průměr) + hodnota + radio (čtvrtkruh/
- · Live výpočet délky každého oblouku (2π × fraction × r × count)
- · Celkový součet + cena (× op 03 cena/mm)
- · OperationRepository::groupedOperationsForPriceType:
- · Pokud ceník má op 03 (Oblouk), přidá VIRTUÁLNÍ kapitolu s flagem
- · QuoteCalculator::computeAutoArcs:
- · Najde op 03 v aktivním ceníku
- · Spočítá total length přes všechny arcs (každý: count × fraction × 2πr)
- · Vytvoří operaci s arc_breakdown[] pro PDF detail
- · WizardController::publish: vepíše oblouk operaci do snapshotu
- PDF rozepsání oblouků (Zdeněk požadavek):
- · V kapitole "Typ oblouku" PDF render rozdělí per arc:
- allowedBoard + arcs[], allowedOp + arc_breakdown
- CSS .sc-arcs-* pro arc UI
- OperationCodeMap + konstanta OBLOUK_GROUP_ID = 3
0.1.0-dev48.1
- UX: cut_length pole zmenšeno (max-width 280px, kompaktnější hint)
0.1.0-dev48
- 1A: Auto-řez z obvodu / cut_length
- · Nové pole "Délka řezu v mm (volitelné)" v kroku 02 pod rozměry
- Defaultně prázdné — auto-řez se počítá z obvodu 2(w+h)
- Pro netypické tvary (záhyby) uživatel zadá délku ručně
- Validace: musí být ≥ obvod (frontend: červený rám + hláška,
- · QuoteCalculator::computeAutoCut:
- Bez cut_length: op 01 (Řez rovný) × obvod
- S cut_length: op 04 (Combicut) × cut_length
- Fallback op 01 pro Keramika (nemá op 04, ale op 01 je už combi)
- Najde aktivní ceník přes findActivePriceTypeForMaterial
- Identifikace operací přes OperationCodeMap::REZ_ROVNY/REZ_COMBICUT
- Title očištěn od "(nezobrazuje se)" pro PDF
- WizardController::publish: vepíše auto-řez do boards[i].operations[]
- allowedOp + is_auto, allowedBoard + cut_length_mm
- Nový Alpine helper:
- · cutLengthBelowPerimeter(boardIdx) — chyba pokud cut < obvod
- · clampCutLength(boardIdx) — silent clamp na obvod minimum
0.1.0-dev47
- 4-B: Validace celkové délky hran ≤ max obvod desky (silent rewrite)
- · V kapitole "Typ hrany" (group_id=2) se počítá součet všech operací
- · max_edge = b.cut_length_mm (přijde v dev48) || 2*(width + height)
- · Pokud uživatel napíše hodnotu která způsobí přečerpání:
- Silent rewrite — POSLEDNÍ editovaná hrana se sníží o overflow
- Notice "Délka hran upravena na max obvod XXXX mm" (5 sek)
- · V hlavičce kapitoly Typ hrany teď meter "součet / max mm"
- Šedý badge — v limitu
- Červený badge — přečerpáno (rare edge case)
- Server-side pojistka v WizardController::collectStep2:
- · Stejná logika clamp na backendu (kdyby uživatel obejít frontend)
- Nový Alpine helper:
- · edgeMaxFor(boardIdx) — vrátí max obvod
- · edgeTotalFor(boardIdx) — součet hran v kapitole 02
- · clampEdgeOverflow(boardIdx, editedOp) — silent rewrite logika
- WizardController allowedBoard: + cut_length_mm (foundation pro dev48 1A)
- CSS: .sc-ops-edge-meter, .sc-ops-edge-overflow, .sc-ops-edge-notice
0.1.0-dev46.3
- HOTFIX 1B-A (znovu): drážka se přepisovala na qty=1 i s dev46.1
- · Skutečná příčina: `addOperationWithQty` v wrapper logice volá
- · addOperation správně nastaví 1750 pro drážku, ale wrapper to vrátil zpět
- · Fix: addOperationWithQty respektuje last.is_fixed flag a neoverwriteuje
- · REST cache buster v fetchJSON (poslední dotek)
0.1.0-dev46.2
- Debug log v addOperation pro diagnostiku
- REST cache buster (_v=verze) v fetchJSON proti CDN/Wordfence cache
0.1.0-dev46.1
- HOTFIX 1B-A: odkapová drážka se přidávala s qty=1 místo 1750
- · Příčina: JS detekce `Number(op.operation_number) === 30` nefungovala
- · Fix: PHP teď posílá is_auto_fixed boolean + auto_fixed_qty number
- · JS používá tyto flagy místo magic-number detekce — robustní napříč
- REST /operations response per operace teď obsahuje:
- · is_auto_fixed (bool) — pro fixní qty (drážka 1750 mm)
- · auto_fixed_qty (int|null) — fixní hodnota
- · auto_addons (object|null) — mapping addonOpNumber → defaultQty
0.1.0-dev46
- 1B-A: Odkapová drážka (cisloOp 30) — fixní 1750 mm
- · Po výběru operace v dropdownu se qty nastaví automaticky na 1750
- · Input "Počet" je readonly + šedý + cursor not-allowed
- · Badge 🔒 vedle názvu operace
- 1B-B: Auto-add Otvor pro baterii (cisloOp 40) po výběru Dřez spodní (cisloOp 51)
- · Při addOperation s op 51 → AUTO push op 40 1ks do b.operations
- · Tracking: pokud uživatel auto-přidaný otvor odebere, sleduje se přes
- · Badge ⚙ (zlaté) vedle auto-přidané operace
- · Funguje napříč ceníky (Quartz / Keramika / Příroda)
- REST /operations: response rozšířen o operation_number (frontend ho
- WizardController collectStep2: rozšířen allowedOp + allowedBoard:
- · allowedOp += operation_number, is_fixed, auto_added_by
- · allowedBoard += _autoAddonsRemoved
0.1.0-dev45
- AUTO-VÝPOČTY foundation + první fáze
- NEW: Domain\OperationCodeMap — konstanty pro klíčové cisloOp napříč ceníky:
- · REZ_ROVNY=1, OBLOUK=3, REZ_COMBICUT=4
- · ODKAPOVA_DRAZKA=30 (qty 1750 fixní)
- · OTVOR_BATERIE=40, DREZ_SPODNI=51
- · HIDDEN_FROM_PICKER = [1, 3, 4] — auto-operace nikdy v UI dropdownu
- · AUTO_ADDONS — mapping trigger op → +addon ops (DREZ_SPODNI → OTVOR_BATERIE)
- OperationRepository: rozšířený filter pro UI dropdown:
- · title_nasa NOT LIKE '%nezobrazuje se%' (kvůli Quartz "Řez rovný (nezobrazuje se)")
- · operation_number NOT IN (1, 3, 4)
- OperationRepository::findByOperationNumber — nový lookup pro auto-výpočty
- 1B-C: validace max formátu desky
- · Frontend (Alpine): @change clamp na max_width/max_height + červený badge
- · Backend (WizardController::collectStep2): silent clamp na server (pojistka)
- · CSS: .sc-input-overflow (červený rám) + .sc-input-error (popisek pod)
0.1.0-dev44
- POLISH PDF: číslování stránek "1 / N" v pravém dolním rohu
- · Použito Dompdf API page_text v <script type="text/php">
- · Font DejaVu Sans 9pt, šedá #888
- · Pozice: -51pt od pravého kraje, -28pt od dolního kraje
- · Zvětšen bottom margin @page 18mm → 22mm (místo pro číslo)
- PdfGenerator: enabled `isPhpEnabled` v Dompdf Options (nutné pro
0.1.0-dev43
- POLISH PDF: platnost cenovky bez času — "26.08.2026" místo "26.08.2026 07:08"
- · Nabídka má smysl jen na úroveň dne (ne na minuty)
- · Aplikováno v "Nabídka platná do" + "Upozornění" sekcích
- · "Vytvořeno" zachovává čas (technický timestamp)
- QuoteRenderer: nová helper metoda formatCsDate (bez času) vedle
0.1.0-dev42
- POLISH PDF (1. iterace):
- · Horní okraj zmenšen z 30mm na 15mm (méně bílého prostoru)
- · "BRUNO PAUL" text nahrazen logem (BP-logo-black_claim-CZ.png)
- · Bundled v wp-content/uploads/stonecalc/logos/bp-logo.png
- · Max výška 50px, embed přes data:image/png;base64 (žádné chroot starosti)
- · Vpravo logo PARTNERA (distributora) — pojmenované podle helios_id
- · Pokud logo chybí, prostě se nevykreslí (žádný placeholder)
- · Header layout: dvousloupcová table (Dompdf-friendly, vyhne se flexbox)
- · H1 zmenšeno z 18pt na 13pt — vejde se na 1 řádek
- · Skupina v titulu jen pokud se liší od ID (typicky se shoduje)
- NEW: QuoteRenderer::loadLogoAsDataUri + loadPartnerLogo
- · Base64 embed z wp-content/uploads/stonecalc/logos/
- · Fallback chain: PNG → JPG → JPEG
- · Read-only, žádné modifikace souborů
0.1.0-dev41
- DOMÉNOVÉ UJASNĚNÍ (Zdeněk 2026-05-28):
- · VOC PDF NENÍ pro Back Office only — dostává ho B2B partner (distributor)
- · B2B partner standardně dostává OBA PDF: MOC + VOC
- · VOC PDF musí obsahovat i MOC řádek (partner vidí oba)
- · Role-based viditelnost (v0.2+) se týká VOC POLÍ v UI (poznámka_voc,
- FIX: CaseController::pdfVoc — odebrán manage_options check, každý
- UI: detail page — vždy zobrazí obě PDF tlačítka (ne jen pro admin):
- · "📄 MOC — pro koncového zákazníka"
- · "📄 VOC — nákupní cena partnera"
- · + vysvětlující popisek "B2B partner standardně dostává oba PDF"
- PDF VOC vizuál:
- · Vínový badge "🔒 INTERNÍ" → zlatý "Velkoobchodní výstup — VOC partner"
- · Odebráno upozornění "neposkytovat zákazníkům"
- · Cenový blok: 2 řádky
- Memory: reference_domain_rules.md aktualizován o ujasnění MOC/VOC PDF
0.1.0-dev40
- FEATURE: VOC PDF cenovka (s rabatem — interní, jen pro Back Office)
- · URL: /calc/cases/{ID}/pdf-voc (capability check manage_options)
- · Tlačítko "🔒 Stáhnout PDF (s rabatem · Back Office)" už bylo na
- REFACTOR: 1 sdílená šablona quote.php místo duplicate quote-moc/voc
- · Parametr $type ('moc' | 'voc') přepíná jen cenový blok dole
- · VOC verze má navíc:
- · Vínový badge "🔒 Interní výstup — VOC s rabatem" v hlavičce
- · Cenový blok "Cena s rabatem: X bez DPH" (1 řádek, NE 21% DPH)
- · Upozornění "Interní VOC výstup — neposkytovat zákazníkům"
- QuoteRenderer: přidán $vocTotal
- · Priorita: base_price_rabate (DB) → calculation.voc_total (JSON) → MOC fallback
- · Ve v0.1 typicky VOC = MOC (žádný rabat), v0.2+ přijde rabatový ceník
- PdfGenerator::generateQuote() — sdílená cesta pro MOC i VOC
- Filename pattern: VOC bez "-pro-zakaznika" suffixu (jako NASA)
0.1.0-dev39
- DATA: nový Helios XML export (28.05.2026) — 13 souborů, 11 MB
- MaterialGroupMap rozšířen:
- · PŘIDÁN materiál 140 (Kompaktní laminát) — nová skupina zboží + nový
- · PŘIDÁN product_group 240 (Hotová výroba kompakt. laminát) pod 140
- · OPRAVENO: 240 bylo dříve omylem v Keramika (130) — patří pod Kompakt (140)
- · PŘIDÁN 212 (Hotová výroba BP) pod 110 Quartz — chybělo
- · PŘIDÁN 239 (Hotová výroba Level Stone) pod 130 Keramika — chybělo
- · V1_MATERIALS rozšířeno [110, 130] → [110, 130, 140]
- CENÍKY 2606xxxx aktuálně platné (od 01.05.2026):
- · 2606QUARZ (Quartz, 110)
- · 2606KERAM (Keramika, 130)
- · 2606KVARCI (Příroda – Kvarcit, 120) — mimo v0.1 scope
- · 2606ZULA (Příroda – Žula, 120) — mimo v0.1 scope
- · 2606MRAM (Příroda – Mramor, 120) — mimo v0.1 scope
- · 2606KOMPAK (Kompakt, 140) — NOVÝ
0.1.0-dev38
- FEATURE: MOC PDF cenovka (pro zákazníka) — první ostrá PDF varianta
- · Šablona templates/pdf/quote-moc.php podle NASA vzoru, modernizovaná
- · Per deska seskupení operací podle kapitol (Řez / Typ hrany / …) —
- · Cena pro zákazníka + výpočet 21% DPH
- · Doplněk názvu desky (label) — připraveno pro v0.2+
- · URL: /calc/cases/{ID}/pdf-moc (přihlášený uživatel)
- · Tlačítko "📄 Stáhnout PDF (pro zákazníka)" na detail page
- · Filename pattern: {group_id}-{id}-{date}-{slug}-pro-zakaznika-{random}.pdf
- NEW: třída Pdf\QuoteRenderer — extrakce dat z $quote pro šablonu
- · groupOperationsByChapter — seskupení per OperationGroupMap::DEFAULT_ORDER
- · materialTitle / partnerLine / creatorName / formatCsDateTime
- NEW: PdfGenerator::generateQuoteMoc + filenameFor
- ROUTING: Router + Dispatcher přidány case-pdf-moc / case-pdf-voc routes
- VOC PDF: stub (501 "připravuje se v dev39") + tlačítko pro Back Office
0.1.0-dev37
- HOTFIX (dev36): PowerShell Compress-Archive vytvořil ZIP s Windows path
- FIX: defensive autoload v stonecalc.php — require vendor/autoload.php jen
- FIX: install akce nyní podporuje VARIANTY archive:
- · vendor.tar.gz (preferováno, POSIX-friendly)
- · vendor.zip (fallback, pozor na Windows separators)
- · PharData pro tar.gz, ZipArchive pro zip
- FIX: install akce ověřuje, že vendor je strukturálně správný po extrakci
- recursiveRmdir nyní robustnější (@scandir error handling)
- UI: tabulka "Archiv k instalaci" rozlišuje tar.gz (✓ doporučeno) vs zip
0.1.0-dev36
- INFRA: setup Dompdf knihovny pro generování PDF cenovek
- · Podmíněný include `vendor/autoload.php` v stonecalc.php
- · Plugin funguje i bez vendor/ (jen PDF features disabled)
- · Vendor folder JE V .gitignore (11 MB, neukládáme do gitu)
- · Strategie deploye: vendor.zip přes SFTP + serverside unzip akce
- NEW: třída `Pdf\PdfGenerator` (wrapper okolo Dompdf)
- · `isAvailable()` — zda je Dompdf načtený
- · `fromHtml($html, $opts)` — render HTML → binary PDF
- · `stream($pdf, $filename)` — pošle PDF do prohlížeče
- · `helloPdf()` — test PDF s českou ukázkou
- DIAGNOSTIKA: nová sekce "📄 PDF generování (Dompdf)":
- · Status (knihovna / vendor.zip / php-zip rozšíření)
- · Tlačítko "📦 Install Dompdf" — unzipne vendor.zip serverside
- · Tlačítko "🧪 Test PDF" — stáhne Hello PDF (ověří funkčnost)
0.1.0-dev35
- UX: auto-add Desky 1 v kroku 02 (žádný mezikrok "+ Přidat desku")
- · Pokud uživatel přejde na krok 02 bez desek, automaticky se vytvoří
- · Žádná jiná možnost není = mezikrok byl zbytečný
- UX: zrychlení přidávání operací
- · Picker: jen "+" (zlatý badge) + select operace
- · Žádné pole "Počet" v pickeru, žádné tlačítko "+ Přidat"
- · Při výběru ze selectu → operace se HNED přidá s qty=1
- · Operace se objeví v listu nad pickerem s editovatelným polem počet
- · Pole počet u operace: recalc na @change (po opuštění inputu),
- · Order: list operací NAHOŘE, picker pro další DOLE (jako NASA)
- Konvence ujasněna: workflow = vyber operaci → uprav počet → jdi dál
0.1.0-dev34
- UX REDESIGN: hybrid layout pro operace v kroku 02
- · Místo accordion (dev32) nyní karty kapitol VŽDY VIDITELNÉ pod sebou
- · V každé kartě inline UX: select operace + počet + tlačítko Přidat
- · Přidané operace zobrazené UVNITŘ karty té samé kapitoly (ne v separátní
- · Možnost přidat víc operací téže kapitoly (kombinace NASA + flexibility)
- · Karty bez dostupných operací se nezobrazí (díky dev33 title_nasa filteru)
- · Celkový součet operací v jednom panelu pod kartami
- Alpine helpers:
- · operationsInGroup(boardIdx, groupId) — filtr per kapitola
- · addOperationWithQty(boardIdx, opId, qty) — wrapper okolo addOperation
- CSS: nová sekce .sc-ops-chapters, .sc-ops-card*, .sc-ops-picker*,
- Rozhodnutí UX: Zdeněk vybral Variantu C (Hybrid) ze 4 možností
0.1.0-dev33
- FILTER: operace bez `title_nasa` se nezobrazují v UI (Zdeněk: title_nasa
- · SQL: `AND o.title_nasa IS NOT NULL AND o.title_nasa != ''`
- · Důsledek: prázdné kapitoly se v accordion ani nezobrazí (filter
- · Odstraněn fallback `title_nasa ?: title` v PHP — title_nasa je vždy zaručen
0.1.0-dev32
- FEATURE: operace v kapitolách (UX redesign dropdownu v kroku 02)
- · Místo flat `<select>` s `<optgroup>` nyní accordion s 10 kapitolami:
- · Klick na kapitolu → rozbalí jen tu jednu (ostatní se zavřou)
- · Pod kapitolou seznam operací jako tlačítka — klick = přidá do tabulky
- · U každé kapitoly počet dostupných operací `(N)`
- · Aktivní kapitola má černé pozadí + zlatý ▾ toggle
- · Hover na operaci = jemně žluté pozadí + zlatá cena
- DOMAIN: nová třída `Domain\OperationGroupMap`
- · Hardcoded mapping čísla 1-11 (kromě 5) → názvy kapitol
- · Slouží jako fallback pokud `sc_operation_groups.title` chybí
- · Definuje DEFAULT_ORDER pro UI (Řez → … → Příslušenství)
- REFACTOR: `OperationRepository::groupedOperationsForPriceType`
- · Post-sort kapitol přes OperationGroupMap::DEFAULT_ORDER (business pořadí)
- · Title fallback: DB → OperationGroupMap → "Skupina N" → "Ostatní"
- · Sort fallback: DB → OperationGroupMap → 99999 (orphan na konec)
0.1.0-dev31
- UX FIX: dropdown operací v kroku 02 wizardu měl jako první kapitolu
- · Změny v `OperationRepository::groupedOperationsForPriceType`:
- · Funkčně se nic nezměnilo, jen vizuální čistota
- POZNÁMKA: filter per ceník (Quartz vs Keramika) byl celou dobu OK —
0.1.0-dev30
- DEV FEATURE: dev mode toggle "Zobrazit info o ceníku u desek"
- · Nový button v admin Diagnostika → "🔬 Dev: ceník u desek"
- · WP option `stonecalc_dev_show_pricelist_badges` (default: false)
- · Při zapnutí: žluté badge "ceník: Quartz / Keramika" v kroku 02 wizardu
- · Slouží JEN pro testování — v ostrém provozu uživatel tuto technickou
- CSS: nová třída `.sc-pricelist-badge` (žluté tlačítko s tečkovaným okrajem)
- POZNÁMKA: funkčnost (per-board materiál → vlastní ceník operací) byla
0.1.0-dev29
- REFACTOR: PHP namespace `Stonecalc\` → `BrunoPaul\StoneCalc\`
- · Sjednocení s _shared/CONVENTIONS.md §6 (BrunoPaul jako shared prefix
- · 37 souborů v src/ — namespace declarations + use statements + FQN
- · stonecalc.php: autoloader prefix + Activator hooks + Plugin::instance FQN
- · templates/frontend/wizard/05-kalkulace.php: @var docblock
- · Žádné funkční změny — čistě rename
- AUDIT: per-table collation viditelná v Diagnostice (Tabulky sc_*)
- · Nový sloupec ukáže collation každé tabulky ze information_schema
- · Zeleně = sedí s konvencí (utf8mb4_unicode_520_ci), oranžově = odchylka
- · Pomoc při ověření souladu s _shared/CONVENTIONS.md §2
0.1.0-dev28
- FIX: distributor (firma) byl vkládán do názvu cenovky místo do sloupce "Kontakt"
- · Příčina: TitleGenerator::suggest měl pravidlo "{Firma} — {Dekor} ..."
- · Fix: TitleGenerator dává jen popisek desky ({Dekor} {Tloušťka} mm {Povrch})
- · Fix: collectStep1 už nenastavuje placeholder title — title se generuje
- FEATURE: sloupec "Kontakt" v seznamu cenovek nyní funguje
- · QuoteRepository::listForUser nyní LEFT JOIN na sc_distributors
- · cases-list.php: "Osoba (tučně) / Firma (menší)" v Kontakt sloupci
- FEATURE: kontakt nyní viditelný i na detail page publikované cenovky
- · QuoteRepository::find rozšířen o stejný JOIN
- · case-detail.php: nový řádek "Kontakt" v Údajích cenovky
0.1.0-dev27
- CLEANUP: odstraněn debug panel z wizard kroku 02 (po fixu wp_unslash už není potřeba)
- CLEANUP: odstraněna debug card "Poslední POST kroku 02" z diagnostiky
- CLEANUP: odstraněn transient debug `stonecalc_debug_last_step2_json`
- CLEANUP: odstraněn plain-JS fallback submit listener v kroku 02 (x-effect funguje)
- DEV ACTION: nová akce "🧹 Vyčistit všechny cenovky (dev)" v diagnostice —
0.1.0-dev26
- CRITICAL FIX: desky se ukládaly jako prázdné pole kvůli WordPress magic quotes
- · WP automaticky aplikuje `addslashes()` na `$_POST` (legacy z 2003)
- · `$_POST['boards_json']` obsahovalo `[\"uid\":...]` místo `["uid":...]`
- · `json_decode()` selhal → `$boards = []` → krok 04 prázdný
- · JS v dev21-25 byl celou dobu OK, bug byl SERVER-SIDE
- · Fix: `wp_unslash($post['boards_json'])` před `json_decode`
- HARDENING: aplikováno `wp_unslash()` i na všechna textová pole
0.1.0-dev25
- FIX (definitivní): hidden input `boards_json` se nyní spolehlivě synchronizuje
- · Předchozí pokusy: `:value` binding (dev21), `$watch` (dev22), kombinace
- · dev25: `x-effect="$el.value = JSON.stringify(boards); ..."` — Alpine
- · Plus zachovány všechny předchozí fallback vrstvy (plain-JS submit
0.1.0-dev24
- WIP: restore `:value` binding + Alpine.$data fallback (selhalo na deep reaktivitě)
0.1.0-dev23
- Debug panel v kroku 02 (real-time výpis Alpine state)
- Diagnostics: inspector posledního POST kroku 02 (transient debug)
0.1.0-dev22
- WIP: $watch('boards', ...) + console.log diagnostika (Alpine 3 nemá deep watch)
0.1.0-dev21
- FIX: desky v kroku 02 se občas neukládaly do sc_quotes.data
- · Příčina: Alpine `:value` binding na hidden inputu měl timing problém
- · Fix: explicitní serializace přes @submit handler:
- UX: nová deska kopíruje materiál/dekor/tloušťku/povrch z aktivní (poslední
- Memory: rozdělení ceníků Quartz/Keramika — implementačně už funguje
0.1.0-dev20
- Fix homepage redirect infinite loop
0.1.0-dev19
- Homepage (/) přesměruje na /calc/ (přihlášení nebo cenovky podle stavu loginu)
0.1.0-dev18
- Wizard krok 04 (Nářezový plán) — manuální vstup počtu desek per deska (krok 0,5)
- Wizard krok 05 (Kalkulace) — kompletní rekapitulace + Publikovat
- Domain\Calculator\QuoteCalculator: kalkulace materiálu + operací
- Domain\Calculator\BoardCalculation + CalculationResult DTO
- Domain\TitleGenerator: navrhne název z dat ({Organizace} — {Dekor} {Tloušťka} {Povrch})
- WizardController: collectStep4, collectStep5, publish()
- Publish: Draft → Aktivní, ukládá data + pricing_log + base_price
- Detail cenovky (case-detail.php) — read-only zobrazení s rozpadem ceny
- CSS: sc-recap-*, sc-detail-* styly
0.1.0-dev17
- Fix: platnost ukazovala 89 místo 90 dní
- · createDraft nyní nastavuje created_at i valid_to v PHP ze stejného moment
- · Display: porovnání pouze podle DATA (setTime(0,0,0)), takže drift sekund
- Memory: zapamatováno role-based viditelnost MOC/VOC polí
0.1.0-dev16
- Wizard krok 03 — Doplňkové info (kompletní pro v0.1)
- Pole: adresa realizace, země (CZ/SK), kraj (cascade), platnost (1-365 dní), poznámka MOC, poznámka VOC
- Live náhled "Platná do" — počítáno z created_at + zadaných dní
- WizardController::collectStep3 — recompute valid_to ze zadaných dní
- Placeholder _placeholder-step aktualizován — odebrán krok 3 (už není placeholder)
- ZMD, výnos do pater, ponechat zbytky, manuální úpravy ceny = v0.2+
0.1.0-dev15
- Wizard krok 02 — fáze 5c-2: operace na desce
- OperationRepository: findActivePriceTypeForMaterial + groupedOperationsForPriceType
- Aktivní ceník (sc_price_types) se vybírá podle materiálu + dnešního data
- REST endpoint /wp-json/stonecalc/v1/operations?material_id=110
- UI: sekce "Opracování" pod každou deskou s:
- · dropdown "+ Přidat operaci" s <optgroup> dle operation_group
- · tabulka přidaných operací (skupina | název | množství | cena/jedn. | celkem)
- · per-deska total opracování v patičce tabulky
- JSON struktura boards[].operations = [] (uložené v sc_quotes.data)
- WizardController sanitizace allowed fields pro operace
- CSS pro sc-ops-table
0.1.0-dev14
- UX feedback: odstraněno pole "Počet ks" z kroku 02 (každá deska je originál)
- Nový dropdown "Typ použití" (Kuchyňská deska, Obklad, Pracovní deska, ...)
- Schema: nová tabulka sc_product_types (DB version → 3)
- ProductTypesImporter: HeliosTypyVyrobkuBP.xml → sc_product_types (id, title, prorez)
- REST API endpoint /wp-json/stonecalc/v1/product-types
- Po deploy:
0.1.0-dev13
- Fix: DecorsImporter používá Cislo (ne ID) jako primary key v sc_decors,
- Karty <_Dekor> = Cislo dekoru, NE Helios ID.
- Při importu nejprve DELETE FROM sc_decors (clean rebuild).
- Důsledek: nyní zobrazíme všech ~100 aktivních dekorů v Quartzu místo 9.
0.1.0-dev12
- ZÁVAŽNÝ BUG FIX v AbstractImporter::upsert(): při NULL hodnotách se
- Stejný fix v ProductGroupsImporter::upsertProductGroup
- BaseProductRepository: filtry vrácené na visible_nasa=1 AND status IN ('A','B')
0.1.0-dev11
- Cascade query: vypnut filtr visible_nasa=1 (NASA skrývala >90% karet,
- Trademark match: LOWER(TRIM(...)) — case-insensitive + ignore whitespace
- Status filter méně přísný: status='A' OR status IS NULL
- Data Inspector v diagnostice: distribuce status/visible_nasa/product_group_id/trademark
0.1.0-dev10
- Fix: dekor cascade přes decor.trademark (Helios <Znacka>), ne přes product_group_id
- Schema: nový sloupec sc_decors.trademark VARCHAR(100) (DB verze 2)
- DecorsImporter: mapuje <Znacka> → trademark
- Obchodní značka v UI: krátké jméno ("Technistone") místo "Hotová výroba Technistone"
- MaterialGroupMap::trademarkFromTitle helper
- BaseProductRepository: decorsForTrademark(materialId, trademark)
- REST endpoints zjednodušené (decor_id stačí pro tloušťky/povrchy)
- Po deploy vyžaduje:
0.1.0-dev9
- Wizard krok 02 (Specifikace desek) — fáze 5c-1
- Domain\MaterialGroupMap — hardcoded 110/130 ↔ product_groups mapování
- Repositories: BaseProductRepository, ProductGroupRepository (filtr visible_nasa+status=A)
- REST API: 6 endpointů pro kaskádu (materials, product-groups, decors, thicknesses, surfaces, base-product)
- Alpine.js scBoards komponenta — cascading dropdowns + cache lookupů
- Multi-deska v cenovce přes JSON v sc_quotes.data
- Side panel "Seznam desek" s aktivní deskou
- Rozměry desky s max-limity podle kmenové karty
- Operace na deskách až v 5c-2
0.1.0-dev8
- UX redesign kroku 01: jen výběr osoby přes autocomplete combobox
- Title cenovky se neukládá v kroku 01 (vygeneruje se v kroku 05 z dat)
- REST API endpoint /wp-json/stonecalc/v1/persons/search (live autocomplete)
- Frontend\Rest třída pro REST API endpointy
- Alpine.js combobox component s klávesovou navigací (šipky + enter + esc)
- Placeholder title v tabulce = "{Org} — koncept" dokud nedojde uživatel na 05
- CSS combobox styling (dropdown, hover, selected indicator)
0.1.0-dev7
- UX: krok 01 wizardu zjednodušen — jen Název cenovky + Odpovědná osoba
- Adresa realizace, země, kraj přesunuty do kroku 03 (Doplňkové info)
- Placeholder pro krok 03 obsahuje hint, co tam přijde
0.1.0-dev6
- Wizard krok 01 (Základní info) — implementováno
- QuoteRepository — CRUD + generování náhodného 6-znak ID
- DistributorPersonRepository — search + find
- WizardController s 5-step lifecyclem (krok 01 plný, 2-5 placeholdery)
- Templates: _progress.php, _sticky-footer.php, 01-zakladni-info.php, _placeholder-step.php
- Sticky footer s názvem, adresou, indikátorem "Uloženo" a tlačítkem Pokračovat
- CSS pro wizard layout (progress bar, side panel, sticky footer)
- CaseController::newCase nyní vytvoří draft a redirectuje na krok 1
- Router self-healing flush (fix z dev5+)
0.1.0-dev5
- Frontend\Router — rewrite rules pro /calc/* URLs
- Frontend\Dispatcher — template_redirect handler, žádný Divi theme na /calc/*
- Frontend\View — renderer s layout wrapping
- AuthController — vlastní login (wp_signon) + logout
- CaseController — tabulka cenovek (zatím prázdná) + placeholdery
- Frontend layout: BP black/white/gold styling
- CSS asset loaded jen na /calc/* (žádný konflikt s Divi)
- Cesty: /calc, /calc/login, /calc/cases, /calc/cases/new, /calc/cases/{ID}
0.1.0-dev4
- Fix XmlIterator: name collision pro nested elementy se stejným názvem
0.1.0-dev3
- Integration\Helios — kompletní importér číselníků z XML
- AbstractImporter + XmlIterator (streamové parsování přes XMLReader)
- 9 konkrétních importérů: ProductGroups, OperationGroups, Thicknesses,
- HeliosImporter orchestrátor + diagnostické tlačítko
- Upsert přes INSERT ... ON DUPLICATE KEY UPDATE (idempotentní)
- Diagnostika: inventář XML souborů v uploads/stonecalc/helios/
- Diagnostika: tabulka s výsledky posledního importu
0.1.0-dev2
- Database\Schema — definice všech 14 `sc_*` tabulek
- Database\Migrator — idempotentní migrátor přes dbDelta
- Aktivace pluginu nyní vytvoří všechny tabulky (ne jen sc_meta)
- Diagnostika: tlačítko "Naplnit / aktualizovat DB schéma"
- Diagnostika: zobrazení `migrated_at` timestamp
0.1.0-dev1
- Plugin bootstrap, autoloader, lifecycle hooky
- Diagnostická stránka (Settings → StoneCalc → Diagnostika)
- Tabulka `wp_sc_meta` pro plugin metadata