CZ SK

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