{"openapi":"3.0.3","info":{"title":"MöbelEasy API","description":"Backend pre e-shop s doskami na mieru a nábytkovým konfigurátorom (mobeleasy.com). Verejné sú katalóg (dekory, zostavy, kovanie), výpočet ceny a vytvorenie objednávky; ceny sú v EUR vrátane DPH, rozmery v mm.","version":"1.0.0","contact":{"email":"info@mobeleasy.com","url":"https://mobeleasy.com/info/how-it-works"}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{}},"paths":{"/health":{"get":{"summary":"Liveness - stav procesu a uptime","tags":["Health"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"uptime":{"type":"number"},"timestamp":{"type":"string"}}}}}}}}},"/health/ready":{"get":{"summary":"Readiness - dostupnosť databázy","tags":["Health"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"database":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"database":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/seo/sitemap.xml":{"get":{"summary":"Sitemap webu (statické stránky, dekory, zostavy)","tags":["SEO"],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/auth/google/start":{"get":{"summary":"Presmeruje na prihlásenie cez Google","tags":["Auth"],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/auth/refresh":{"post":{"summary":"Nový access token z refresh cookie (rotuje refresh token)","tags":["Auth"],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/auth/totp/verify":{"post":{"summary":"Druhý faktor pre čakajúcu session (TOTP alebo záložný kód)","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","minLength":6,"maxLength":12}},"additionalProperties":false}}}},"security":[],"responses":{"200":{"description":"Default Response"}}}},"/auth/logout":{"post":{"summary":"Zruší aktuálnu session a zmaže cookie","tags":["Auth"],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/auth/me":{"get":{"summary":"Profil a oprávnenia prihláseného používateľa","tags":["Auth"],"responses":{"200":{"description":"Default Response"}}}},"/auth/sessions":{"get":{"summary":"Prihlásené zariadenia","tags":["Auth"],"responses":{"200":{"description":"Default Response"}}}},"/auth/sessions/{id}/revoke":{"post":{"summary":"Odhlási konkrétne zariadenie","tags":["Auth"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/auth/sessions/revoke-others":{"post":{"summary":"Odhlási všetky ostatné zariadenia","tags":["Auth"],"responses":{"200":{"description":"Default Response"}}}},"/auth/totp/setup":{"post":{"summary":"Začne nastavenie 2FA - vráti QR pre authenticator","tags":["Auth"],"responses":{"200":{"description":"Default Response"}}}},"/auth/totp/enable":{"post":{"summary":"Potvrdí 2FA prvým kódom, vráti záložné kódy (len raz)","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","minLength":6,"maxLength":12}},"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}}},"/auth/totp/disable":{"post":{"summary":"Vypne 2FA (vyžaduje platný kód)","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","minLength":6,"maxLength":12}},"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}}},"/account/":{"get":{"summary":"Profil účtu (meno, telefón, firma, adresy)","tags":["Account"],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Uloží profil účtu","tags":["Account"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["firstName","lastName","phone"],"additionalProperties":false,"properties":{"firstName":{"type":"string","minLength":1,"maxLength":60},"lastName":{"type":"string","minLength":1,"maxLength":60},"phone":{"type":"string","minLength":6,"maxLength":30},"company":{"anyOf":[{"type":"null"},{"type":"object","required":["name","ico"],"additionalProperties":false,"properties":{"name":{"type":"string","minLength":2,"maxLength":120},"ico":{"type":"string","minLength":6,"maxLength":12},"dic":{"type":"string","maxLength":14},"icDph":{"type":"string","maxLength":16}}}]},"billingAddress":{"anyOf":[{"type":"object","required":["street","city","zip"],"additionalProperties":false,"properties":{"street":{"type":"string","minLength":2,"maxLength":120},"city":{"type":"string","minLength":2,"maxLength":80},"zip":{"type":"string","minLength":3,"maxLength":12},"country":{"type":"string","minLength":2,"maxLength":2}}},{"type":"null"}]},"shippingAddress":{"anyOf":[{"type":"object","required":["street","city","zip"],"additionalProperties":false,"properties":{"street":{"type":"string","minLength":2,"maxLength":120},"city":{"type":"string","minLength":2,"maxLength":80},"zip":{"type":"string","minLength":3,"maxLength":12},"country":{"type":"string","minLength":2,"maxLength":2}}},{"type":"null"}]}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/account/orders":{"get":{"summary":"Objednávky účtu","tags":["Account"],"responses":{"200":{"description":"Default Response"}}}},"/account/orders/{number}":{"get":{"summary":"Detail vlastnej objednávky (s platobnými údajmi a QR, kým nie je uhradená)","tags":["Account"],"parameters":[{"schema":{"type":"string","pattern":"^[A-Z]{1,4}-\\d{4}-\\d{3,4}$"},"in":"path","name":"number","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/stats":{"get":{"summary":"Prehľad: objednávky podľa stavu, tržby, zákazníci, posledných 7 dní","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/order-statuses":{"get":{"summary":"Stavy objednávok v poradí výroby","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/search":{"post":{"summary":"Zoznam objednávok (filter v tele)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"search":{"type":"string","maxLength":100},"status":{"type":"string","maxLength":30},"limit":{"type":"integer","minimum":1,"maximum":500},"offset":{"type":"integer","minimum":0}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/{ref}":{"get":{"summary":"Detail objednávky (číslo alebo uuid)","tags":["Admin"],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":40,"pattern":"^([A-Z]{1,4}-\\d{4}-\\d{3,4}|[0-9a-fA-F-]{36})$"},"in":"path","name":"ref","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/{ref}/status":{"post":{"summary":"Zmena stavu (Ukončená s dôvodom PICKED_UP/DELIVERED/CANCELLED/NOT_COLLECTED)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","maxLength":30},"reason":{"type":"string","maxLength":30}}}}}},"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":40,"pattern":"^([A-Z]{1,4}-\\d{4}-\\d{3,4}|[0-9a-fA-F-]{36})$"},"in":"path","name":"ref","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/{ref}/resend-confirmation":{"post":{"summary":"Znova poslať potvrdenie objednávky (nový odkaz, starý prestane platiť)","tags":["Admin"],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":40,"pattern":"^([A-Z]{1,4}-\\d{4}-\\d{3,4}|[0-9a-fA-F-]{36})$"},"in":"path","name":"ref","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/{ref}/invoice":{"post":{"summary":"Vystaviť faktúru v SuperFaktúre (existujúcu vráti); len pre uhradenú objednávku","tags":["Admin"],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":40,"pattern":"^([A-Z]{1,4}-\\d{4}-\\d{3,4}|[0-9a-fA-F-]{36})$"},"in":"path","name":"ref","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/mail/verify":{"get":{"summary":"Overenie SMTP spojenia","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/{ref}/refunded":{"post":{"summary":"Platba za stornovanú objednávku vrátená","tags":["Admin"],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":40,"pattern":"^([A-Z]{1,4}-\\d{4}-\\d{3,4}|[0-9a-fA-F-]{36})$"},"in":"path","name":"ref","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/{ref}/paid":{"post":{"summary":"Ručné označenie úhrady","tags":["Admin"],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":40,"pattern":"^([A-Z]{1,4}-\\d{4}-\\d{3,4}|[0-9a-fA-F-]{36})$"},"in":"path","name":"ref","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/{ref}/production-sheet":{"post":{"summary":"Výrobný lístok objednávky (A4 PDF): dielce, materiál, rozmery, hrany, obrábanie","tags":["Admin"],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":40,"pattern":"^([A-Z]{1,4}-\\d{4}-\\d{3,4}|[0-9a-fA-F-]{36})$"},"in":"path","name":"ref","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/orders/{ref}/labels":{"post":{"summary":"Štítky na dielce (PDF, Brother QL 62 mm) - layout v tele","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"layout":{"type":"string","enum":["full","compact","mini","strip"]}}}}}},"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":40,"pattern":"^([A-Z]{1,4}-\\d{4}-\\d{3,4}|[0-9a-fA-F-]{36})$"},"in":"path","name":"ref","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/customers/search":{"post":{"summary":"Zákazníci (hostia aj účty) s počtom objednávok","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"search":{"type":"string","maxLength":100}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/customers/{id}/sign-ins":{"get":{"summary":"Prihlásenia zákazníka = jeho relácie (čas, posledná IP, prehliadač, či je ešte aktívna)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/resources":{"get":{"summary":"Zoznam číselníkov a ich polí (whitelist)","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/resources/{name}/search":{"post":{"summary":"Riadky číselníka s prekladmi","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"search":{"type":"string","maxLength":100},"includeInactive":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","pattern":"^[a-z_]{3,40}$"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/resources/{name}":{"post":{"summary":"Nový záznam","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"additionalProperties":false,"properties":{"data":{"type":"object","additionalProperties":true},"i18n":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"string","maxLength":2000}}}}}}}},"parameters":[{"schema":{"type":"string","pattern":"^[a-z_]{3,40}$"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/resources/{name}/{id}":{"post":{"summary":"Úprava záznamu","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"additionalProperties":false,"properties":{"data":{"type":"object","additionalProperties":true},"i18n":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"string","maxLength":2000}}}}}}}},"parameters":[{"schema":{"type":"string","pattern":"^[a-z_]{3,40}$"},"in":"path","name":"name","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/resources/{name}/{id}/delete":{"post":{"summary":"Zmazanie (mäkké, ak tabuľka má deleted_at)","tags":["Admin"],"parameters":[{"schema":{"type":"string","pattern":"^[a-z_]{3,40}$"},"in":"path","name":"name","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/variants/search":{"post":{"summary":"Varianty dosiek s predajnou a nákupnou cenou; filtre značka, hrúbka, povrch, typ, predajnosť, bez ceny, bez dodávateľa","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"search":{"type":"string","maxLength":100},"material_id":{"type":"string","format":"uuid"},"brand":{"type":"string","maxLength":60},"thickness":{"type":"number","minimum":0},"surface":{"type":"string","maxLength":40},"type":{"type":"string","maxLength":40},"sellable":{"type":"boolean"},"no_price":{"type":"boolean"},"no_supplier":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/variants":{"post":{"summary":"Nový variant s cenami","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["material_id","board_type_id","board_thickness_id","board_surface_id"],"additionalProperties":false,"properties":{"material_id":{"type":"string","format":"uuid"},"board_type_id":{"type":"string","format":"uuid"},"board_thickness_id":{"type":"string","format":"uuid"},"board_surface_id":{"type":"string","format":"uuid"},"board_standard_size_id":{"type":["string","null"]},"stock_status_id":{"type":["string","null"]},"is_sellable":{"type":"boolean"},"back_surface_id":{"type":["string","null"]},"back_material_id":{"type":["string","null"]},"supplier":{"type":["object","null"],"required":["sku"],"additionalProperties":false,"properties":{"sku":{"type":"string","maxLength":40},"name":{"type":"string","maxLength":200}}},"prices":{"type":"array","maxItems":10,"items":{"type":"object","required":["calculation_type_id","amount"],"properties":{"calculation_type_id":{"type":"string","format":"uuid"},"amount":{"type":"number","minimum":0}}}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/variants/{id}":{"post":{"summary":"Úprava variantu a cien","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["material_id","board_type_id","board_thickness_id","board_surface_id"],"additionalProperties":false,"properties":{"material_id":{"type":"string","format":"uuid"},"board_type_id":{"type":"string","format":"uuid"},"board_thickness_id":{"type":"string","format":"uuid"},"board_surface_id":{"type":"string","format":"uuid"},"board_standard_size_id":{"type":["string","null"]},"stock_status_id":{"type":["string","null"]},"is_sellable":{"type":"boolean"},"back_surface_id":{"type":["string","null"]},"back_material_id":{"type":["string","null"]},"supplier":{"type":["object","null"],"required":["sku"],"additionalProperties":false,"properties":{"sku":{"type":"string","maxLength":40},"name":{"type":"string","maxLength":200}}},"prices":{"type":"array","maxItems":10,"items":{"type":"object","required":["calculation_type_id","amount"],"properties":{"calculation_type_id":{"type":"string","format":"uuid"},"amount":{"type":"number","minimum":0}}}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/variants/{id}/delete":{"post":{"summary":"Mäkké zmazanie variantu","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/variants/{id}/history":{"get":{"summary":"História cien variantu","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/uploads":{"post":{"summary":"Obrázok alebo 3D model kovania do Supabase Storage (bucket web); multipart: file, folder, name?","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/prices/search":{"post":{"summary":"Cenová matica: predajné ceny s nákupom a maržou","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["entity_type"],"additionalProperties":false,"properties":{"entity_type":{"type":"string","enum":["BOARD_VARIANT","EDGE_MATERIAL","OPERATION","HARDWARE_ITEM","SLIDING_DOOR"]},"search":{"type":"string","maxLength":100},"brand":{"type":"string","maxLength":60},"group":{"type":"string","maxLength":120},"thickness":{"type":"number","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":5000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/prices/facets":{"post":{"summary":"Hodnoty filtrov (značky, skupiny, hrúbky)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["entity_type"],"additionalProperties":false,"properties":{"entity_type":{"type":"string","enum":["BOARD_VARIANT","EDGE_MATERIAL","OPERATION","HARDWARE_ITEM","SLIDING_DOOR"]}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/prices/{id}":{"post":{"summary":"Ručná zmena predajnej ceny","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amount"],"additionalProperties":false,"properties":{"amount":{"type":"number","minimum":0}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/prices/{id}/markup":{"post":{"summary":"Prirážka jednej položky v % (predaj = nákup × (1 + prirážka/100))","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["markup"],"additionalProperties":false,"properties":{"markup":{"type":"number","minimum":0,"maximum":1000}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/prices/bulk-markup":{"post":{"summary":"Hromadná marža: predaj = nákup × (1 + marža/100); apply=false je náhľad","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["filter","markup","apply"],"additionalProperties":false,"properties":{"filter":{"type":"object","required":["entity_type"],"additionalProperties":false,"properties":{"entity_type":{"type":"string","enum":["BOARD_VARIANT","EDGE_MATERIAL","OPERATION","HARDWARE_ITEM","SLIDING_DOOR"]},"search":{"type":"string","maxLength":100},"brand":{"type":"string","maxLength":60},"group":{"type":"string","maxLength":120},"thickness":{"type":"number","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":5000}}},"markup":{"type":"number","minimum":0,"maximum":1000},"apply":{"type":"boolean"},"include_manual":{"type":"boolean"},"price_ids":{"type":"array","maxItems":5000,"items":{"type":"string","format":"uuid"}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/prices/history/search":{"post":{"summary":"História zmien cien (najnovšie prvé) s filtrami a stránkovaním","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"search":{"type":"string","maxLength":100},"role":{"type":"string","enum":["RETAIL","PURCHASE"]},"entity_type":{"type":"string","enum":["BOARD_VARIANT","EDGE_MATERIAL","OPERATION","HARDWARE_ITEM","SLIDING_DOOR"]},"thickness":{"type":"number","minimum":0},"brand":{"type":"string","maxLength":60},"reason":{"type":"string","enum":["manual","bulk","import","script","unknown"]},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"limit":{"type":"integer","minimum":1,"maximum":1000},"offset":{"type":"integer","minimum":0,"maximum":100000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/finance/summary":{"get":{"summary":"Súhrn: pohľadávky, záväzky, náklady tento mesiac","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/invoices/search":{"post":{"summary":"Vystavené faktúry","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"search":{"type":"string","maxLength":100},"status":{"type":"string","enum":["DRAFT","ISSUED","PAID","OVERDUE","CANCELLED"]},"limit":{"type":"integer","minimum":1,"maximum":2000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/invoices/{id}/paid":{"post":{"summary":"Označiť faktúru ako uhradenú","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/received-invoices/search":{"post":{"summary":"Prijaté faktúry (náklady)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"search":{"type":"string","maxLength":100},"status":{"type":"string","enum":["UNPAID","PAID","OVERDUE"]},"limit":{"type":"integer","minimum":1,"maximum":2000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/received-invoices/{id}/paid":{"post":{"summary":"Označiť prijatú faktúru ako uhradenú","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/discounts":{"get":{"summary":"Zľavové kupóny a koľko zľavy sa nimi poskytlo","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/bank/accounts":{"get":{"summary":"Aktívne bankové účty","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/bank/transactions/search":{"post":{"summary":"Pohyby na účte so stavom párovania","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"search":{"type":"string","maxLength":100},"status":{"type":"string","enum":["UNMATCHED","MATCHED","UNDERPAID","OVERPAID","DUPLICATE","MANUAL","IGNORED"]},"limit":{"type":"integer","minimum":1,"maximum":2000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/bank/sync":{"post":{"summary":"Stiahnuť pohyby z Fio a spárovať s objednávkami (limit Fio: 1 volanie / 30 s)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"days":{"type":"integer","minimum":1,"maximum":90}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/bank/transactions/{id}/assign":{"post":{"summary":"Ručne priradiť prijatú platbu k objednávke (force = uhradiť aj pri nižšej sume)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["order_number"],"additionalProperties":false,"properties":{"order_number":{"type":"string","minLength":5,"maxLength":20},"force":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/bank/transactions/{id}/unassign":{"post":{"summary":"Odpojiť platbu od objednávky","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/translations/meta":{"get":{"summary":"Jazyky, tabuľky a polia prekladov","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/translations/search":{"post":{"summary":"Preklady s filtrom","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"table":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z0-9_]+$"},"lang":{"type":"string","minLength":2,"maxLength":5},"field":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z0-9_]+$"},"search":{"type":"string","maxLength":100},"limit":{"type":"integer","minimum":1,"maximum":5000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/translations":{"post":{"summary":"Nový preklad (existujúci pre rovnaký riadok/pole/jazyk sa prepíše)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["table_name","row_id","lang_code","field_name","content"],"additionalProperties":false,"properties":{"table_name":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z0-9_]+$"},"row_id":{"type":"string","format":"uuid"},"lang_code":{"type":"string","minLength":2,"maxLength":5},"field_name":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z0-9_]+$"},"content":{"type":"string","maxLength":5000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/translations/{id}":{"post":{"summary":"Úprava prekladu","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"content":{"type":"string","maxLength":5000},"lang_code":{"type":"string","minLength":2,"maxLength":5},"field_name":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z0-9_]+$"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/translations/{id}/delete":{"post":{"summary":"Zmazanie prekladu","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/docs":{"get":{"summary":"Technická dokumentácia (markdown)","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Nový dokument","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["table_name"],"additionalProperties":false,"properties":{"table_name":{"type":"string","minLength":1,"maxLength":120},"content":{"type":"string","maxLength":200000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/docs/{id}":{"post":{"summary":"Úprava dokumentu (názov, obsah)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"table_name":{"type":"string","minLength":1,"maxLength":120},"content":{"type":"string","maxLength":200000}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/docs/{id}/delete":{"post":{"summary":"Zmazanie dokumentu","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/database/info":{"get":{"summary":"Tabuľky: odhad riadkov a veľkosť (pg_stat_user_tables)","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/batches/candidates":{"get":{"summary":"Uhradené objednávky čakajúce na schválenie do výroby","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/batches/preview":{"post":{"summary":"Náhľad riadkov formulára ATVYN (bez zápisu)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["order_numbers"],"additionalProperties":false,"properties":{"order_numbers":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"string","minLength":5,"maxLength":20}},"delivery":{"type":"boolean"},"send":{"type":"boolean"},"force":{"type":"boolean"},"note":{"type":"string","maxLength":2000}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/batches/preview/file":{"post":{"summary":"Formulár XLSX na kontrolu (bez dávky a bez zmeny stavu)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["order_numbers"],"additionalProperties":false,"properties":{"order_numbers":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"string","minLength":5,"maxLength":20}},"delivery":{"type":"boolean"},"send":{"type":"boolean"},"force":{"type":"boolean"},"note":{"type":"string","maxLength":2000},"kind":{"type":"string","enum":["cutting","worktops"]}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/batches":{"post":{"summary":"Vytvoriť dávku: XLSX, objednávky → IN_PRODUCTION, voliteľne e-mail dodávateľovi","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["order_numbers"],"additionalProperties":false,"properties":{"order_numbers":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"string","minLength":5,"maxLength":20}},"delivery":{"type":"boolean"},"send":{"type":"boolean"},"force":{"type":"boolean"},"note":{"type":"string","maxLength":2000}}}}}},"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"Zoznam dávok","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/batches/{id}/file":{"get":{"summary":"Stiahnuť vyplnený formulár porezu (XLSX)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/batches/{id}/file/worktops":{"get":{"summary":"Stiahnuť formulár pracovných dosiek a zástien (XLSX)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/batches/{id}/labels":{"post":{"summary":"Štítky (PDF) pre všetky kusy dávky","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"layout":{"type":"string","enum":["full","compact","mini","strip"]}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/batches/{id}/send":{"post":{"summary":"Poslať formulár dodávateľovi e-mailom (aj opakovane)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/furniture/meta":{"get":{"summary":"Číselníky pre editor zostáv","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/furniture/search":{"post":{"summary":"Zoznam šablón zostáv (aj neaktívne)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"q":{"type":"string","maxLength":80}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/furniture/{id}":{"get":{"summary":"Šablóna ako dokument na úpravu","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Uložiť šablónu (verzia +1)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","params","slots","names","parts"],"properties":{"id":{"type":["string","null"]},"code":{"type":"string","maxLength":40},"categorySlug":{"type":["string","null"],"maxLength":80},"sort":{"type":"integer"},"isActive":{"type":"boolean"},"imageUrl":{"type":["string","null"],"maxLength":500},"params":{"type":"object"},"slots":{"type":"object"},"roles":{"type":"object"},"names":{"type":"object"},"parts":{"type":"array","maxItems":200,"items":{"type":"object","required":["code","x","y","z"]}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Zmazať šablónu","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/furniture":{"post":{"summary":"Nová šablóna","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","params","slots","names","parts"],"properties":{"id":{"type":["string","null"]},"code":{"type":"string","maxLength":40},"categorySlug":{"type":["string","null"],"maxLength":80},"sort":{"type":"integer"},"isActive":{"type":"boolean"},"imageUrl":{"type":["string","null"],"maxLength":500},"params":{"type":"object"},"slots":{"type":"object"},"roles":{"type":"object"},"names":{"type":"object"},"parts":{"type":"array","maxItems":200,"items":{"type":"object","required":["code","x","y","z"]}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/furniture/import-bxf":{"post":{"summary":"Návrh šablóny z Blum BXF; multipart: file (.zip / .bxf2)","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}}},"/admin/furniture/preview":{"post":{"summary":"Náhľad neuloženej šablóny (rozpis + cena)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["doc"],"properties":{"doc":{"type":"object","required":["code","params","slots","names","parts"],"properties":{"id":{"type":["string","null"]},"code":{"type":"string","maxLength":40},"categorySlug":{"type":["string","null"],"maxLength":80},"sort":{"type":"integer"},"isActive":{"type":"boolean"},"imageUrl":{"type":["string","null"],"maxLength":500},"params":{"type":"object"},"slots":{"type":"object"},"roles":{"type":"object"},"names":{"type":"object"},"parts":{"type":"array","maxItems":200,"items":{"type":"object","required":["code","x","y","z"]}}}},"input":{"type":"object"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware/search":{"post":{"summary":"Zoznam kovania so vzorom a cenou","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"q":{"type":"string","maxLength":100}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware/{id}":{"get":{"summary":"Kovanie s vŕtacím vzorom a rozpisom ceny","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Zmazanie kovania (mäkké)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware":{"post":{"summary":"Nové kovanie alebo úprava existujúceho","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"additionalProperties":false,"properties":{"id":{"type":["string","null"],"format":"uuid"},"code":{"type":"string","minLength":2,"maxLength":40},"manufacturerCode":{"type":["string","null"],"maxLength":60},"typeId":{"type":["string","null"],"format":"uuid"},"brandId":{"type":["string","null"],"format":"uuid"},"stockStatusId":{"type":["string","null"],"format":"uuid"},"model3dUrl":{"type":["string","null"],"maxLength":500},"fitting":{"type":["object","null"],"additionalProperties":false,"required":["kind"],"properties":{"kind":{"type":"string","maxLength":20},"visible":{"type":"boolean"},"inset":{"type":"number"},"seat":{"type":"string","enum":["under"]},"holes":{"type":"array","maxItems":20,"items":{"type":"object","required":["in","face","d","depth"],"additionalProperties":false,"properties":{"in":{"type":"string","enum":["A","B"]},"face":{"type":"string","enum":["FACE","EDGE"]},"d":{"type":"number"},"depth":{"type":"number"},"along":{"type":"number"},"fromEdge":{"type":"number"},"through":{"type":"boolean"}}}},"grooves":{"type":"array","maxItems":10,"items":{"type":"object","required":["in","width","depth","length"],"additionalProperties":false,"properties":{"in":{"type":"string","enum":["A","B"]},"face":{"type":"string","enum":["FACE"]},"width":{"type":"number"},"depth":{"type":"number"},"length":{"type":"number"},"along":{"type":"number"},"fromEdge":{"type":"number"}}}},"model":{"type":"object","additionalProperties":false,"properties":{"shape":{"type":"string","maxLength":40},"size":{"type":"array","maxItems":8,"items":{"type":"number"}},"offset":{"type":"array","maxItems":3,"items":{"type":"number"}},"rotation":{"type":"array","maxItems":3,"items":{"type":"number"}},"scale":{"type":"number"},"center":{"type":"boolean"},"origin":{"type":"string","enum":["corner","axis","point"]},"finish":{"type":"string","maxLength":30},"finishOnly":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":60}},"push":{"type":"object","additionalProperties":false,"required":["from","stroke"],"properties":{"from":{"type":"number"},"stroke":{"type":"number"}}},"rig":{"type":"object"}}}}},"names":{"type":"object","additionalProperties":{"type":"string","maxLength":200}},"price":{"type":["number","null"]},"cost":{"type":["number","null"]}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-families/search":{"post":{"summary":"Rodiny kovania s počtom variantov","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-families/{id}":{"get":{"summary":"Rodina s roztečami a tabuľkou variantov","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Zmazanie rodiny bez položiek","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-families":{"post":{"summary":"Uloženie rodiny - vygeneruje položky z buniek","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","names","spacings","cells"],"additionalProperties":false,"properties":{"id":{"type":["string","null"],"format":"uuid"},"code":{"type":"string","minLength":2,"maxLength":40},"names":{"type":"object","additionalProperties":{"type":"string","maxLength":120}},"typeId":{"type":["string","null"],"format":"uuid"},"brandId":{"type":["string","null"],"format":"uuid"},"supplierId":{"type":["string","null"],"format":"uuid"},"mounting":{"type":["string","null"],"enum":["FACE_2","FACE_1","EDGE_MILLED","EDGE_CLIP",null]},"axes":{"type":"array","maxItems":4,"items":{"type":"object","required":["key","kind"],"properties":{"key":{"type":"string","maxLength":20},"kind":{"type":"string","enum":["size","finish","choice"]},"pick":{"type":["object","null"],"properties":{"by":{"type":"string","enum":["edge","depth"]},"ratio":{"type":"number"},"margin":{"type":"number"}}}}}},"fittingBase":{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","maxLength":20},"holeD":{"type":"number"},"through":{"type":"boolean"},"visible":{"type":"boolean"},"markup":{"type":["number","null"]}}},"spacings":{"type":"object","additionalProperties":{"type":"object","additionalProperties":false,"properties":{"model":{"type":["string","null"],"maxLength":500},"size":{"type":"array","maxItems":3,"items":{"type":"number"}},"offset":{"type":"array","maxItems":3,"items":{"type":"number"}},"rotation":{"type":"array","maxItems":3,"items":{"type":"number"}}}}},"cells":{"type":"array","maxItems":400,"items":{"type":"object","required":["C","finish"],"additionalProperties":false,"properties":{"itemId":{"type":["string","null"],"format":"uuid"},"C":{"type":"number"},"finish":{"type":"string","maxLength":30},"code":{"type":["string","null"],"maxLength":40},"manufacturerCode":{"type":["string","null"],"maxLength":60},"supplierSku":{"type":["string","null"],"maxLength":60},"packQty":{"type":["number","null"]},"cost":{"type":["number","null"]},"price":{"type":["number","null"]}}}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-suppliers":{"get":{"summary":"Dodávatelia so značkou a počtom položiek","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Nový dodávateľ alebo úprava (názov, IČ DPH, značka)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string","maxLength":120},"vatNumber":{"type":["string","null"],"maxLength":20},"taxId":{"type":["string","null"],"maxLength":20},"isActive":{"type":"boolean"},"brandId":{"type":["string","null"],"format":"uuid"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware/{id}/suppliers":{"get":{"summary":"Kódy položky u dodávateľov","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Kód položky u dodávateľa (nový alebo úprava)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["supplierId","supplierSku"],"additionalProperties":false,"properties":{"id":{"type":["string","null"],"format":"uuid"},"supplierId":{"type":"string","format":"uuid"},"supplierSku":{"type":"string","maxLength":60},"supplierName":{"type":["string","null"],"maxLength":200},"unit":{"type":["string","null"],"maxLength":20},"packQty":{"type":["number","null"]},"isPreferred":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware/{id}/suppliers/{spId}":{"delete":{"summary":"Odobrať kód u dodávateľa","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"spId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-kits/search":{"post":{"summary":"Sady kovania s cenou zo súčastí","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-kits/{id}":{"get":{"summary":"Sada so súčasťami","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Zmazanie sady (mimo šablón)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-kits":{"post":{"summary":"Nová sada alebo úprava","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","names","components"],"additionalProperties":false,"properties":{"id":{"type":["string","null"],"format":"uuid"},"code":{"type":"string","minLength":2,"maxLength":40},"names":{"type":"object","additionalProperties":{"type":"string","maxLength":120}},"typeId":{"type":["string","null"],"format":"uuid"},"brandId":{"type":["string","null"],"format":"uuid"},"isActive":{"type":"boolean"},"sortOrder":{"type":"integer"},"components":{"type":"array","maxItems":20,"items":{"type":"object","required":["key"],"additionalProperties":false,"properties":{"key":{"type":"string","maxLength":20},"item":{"type":["string","null"],"maxLength":40},"family":{"type":["string","null"],"maxLength":40},"axes":{"type":["object","null"],"additionalProperties":{"type":["string","number"]}},"qty":{"type":["number","null"]},"place":{"type":["string","null"],"enum":["anchor","holes","bom",null]},"holesOf":{"type":["string","null"],"maxLength":20},"when":{"type":["string","null"],"maxLength":120}}}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-finishes":{"get":{"summary":"Povrchy kovania (nikel, chróm, čierna matná…)","tags":["Admin"],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Nový povrch kovania alebo úprava","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","color","metalness","roughness"],"additionalProperties":false,"properties":{"id":{"type":["string","null"],"format":"uuid"},"code":{"type":"string","minLength":2,"maxLength":30},"color":{"type":"string","maxLength":7},"metalness":{"type":"number"},"roughness":{"type":"number"},"sortOrder":{"type":"integer"},"isActive":{"type":"boolean"},"names":{"type":"object","additionalProperties":{"type":"string","maxLength":100}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/admin/hardware-finishes/{id}":{"delete":{"summary":"Zmazanie povrchu (len nepoužitého)","tags":["Admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/catalog/dictionaries":{"get":{"summary":"Všetky číselníky naraz (preložené)","tags":["Catalog"],"description":"Značky, kategórie, povrchy, hrúbky, typy dosiek, formáty, stavy skladu, hrany, operácie a meny. Nahrádza sedem samostatných dotazov z webu.","security":[],"responses":{"200":{"description":"Default Response"}}}},"/catalog/materials":{"get":{"summary":"Všetky aktívne dekory s variantmi a cenami","tags":["Catalog"],"description":"Bez filtrov. Filtrovanie a stránkovanie: POST /catalog/materials/search.","security":[],"responses":{"200":{"description":"Default Response"}}}},"/catalog/materials/search":{"post":{"summary":"Vyhľadávanie dekorov s filtrami a stránkovaním","tags":["Catalog"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"categoryId":{"type":"string","format":"uuid"},"brandId":{"type":"string","format":"uuid"},"surfaceId":{"type":"string","format":"uuid"},"boardTypeId":{"type":"string","format":"uuid"},"thicknessMm":{"type":"number","description":"Hrúbka v mm"},"q":{"type":"string","maxLength":60,"description":"Hľadanie podľa kódu dekoru"},"limit":{"type":"integer","minimum":1,"maximum":500},"offset":{"type":"integer","minimum":0}}}}}},"security":[],"responses":{"200":{"description":"Default Response"}}}},"/catalog/materials/{id}":{"get":{"summary":"Detail dekoru vrátane variantov a ich cien","tags":["Catalog"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/catalog/materials/{id}/edges":{"get":{"summary":"Hrany, ktoré sa hodia k dekoru","tags":["Catalog"],"description":"Podľa väzobnej tabuľky material_edge_map. Web dnes ponúka štyri natvrdo zapísané farby bez ohľadu na dekor.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/catalog/materials/{id}/placeholder.svg":{"get":{"summary":"Zástupný obrázok dekoru bez fotky","tags":["Catalog"],"description":"Deterministická farebná dlaždica s kódom a názvom - farba podľa názvu (dub hnedý, betón sivý…). Import ho nastaví do texture_url_*, kým sa nedohrá reálna textúra.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/catalog/shipping-methods":{"get":{"summary":"Aktívne spôsoby dopravy s cenou bez DPH aj s DPH","tags":["Catalog"],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/catalog/hardware":{"get":{"summary":"Kovanie z databázy","tags":["Catalog"],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/catalog/furniture":{"get":{"summary":"Aktívne šablóny zostáv s cenou „od“ (podlieha prepínaču furniture_sets)","tags":["Catalog"],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/catalog/sliding-doors":{"get":{"summary":"Posuvné dvere: systémy profilov s povrchmi a výplne (podlieha prepínaču sliding_doors)","tags":["Catalog"],"security":[],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/catalog/furniture/{code}":{"get":{"summary":"Detail šablóny: parametre, sloty dekorov, roly kovania, dielce","tags":["Catalog"],"parameters":[{"schema":{"type":"string","pattern":"^[A-Z0-9_]{2,40}$"},"in":"path","name":"code","required":true}],"security":[],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/catalog/furniture/{code}/resolve":{"post":{"summary":"Rozloženie zostavy na dielce a cena","tags":["Catalog"],"description":"Telo: { W, H, D, extra: { N: 2… }, slots: { CORPUS: materialId… }, roles: { HANDLE: hardwareId… }, overrides: { parts: { SIDE_L: { material, disabled } }, edges: [{ select: { facing, codes }, abs, none }] } }. Vracia inštanciu (dielce pre 3D scénu a košík) a cenu.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"W":{"type":"number","minimum":1,"maximum":10000},"H":{"type":"number","minimum":1,"maximum":10000},"D":{"type":"number","minimum":1,"maximum":10000},"extra":{"type":"object","maxProperties":20,"additionalProperties":{"type":"number","minimum":0,"maximum":10000}},"slots":{"type":"object","additionalProperties":{"type":"string","maxLength":64}},"roles":{"type":"object","additionalProperties":{"type":"string","maxLength":64}},"doors":{"type":"object","additionalProperties":false,"properties":{"system":{"type":"string","maxLength":40},"finish":{"type":"string","maxLength":40},"doors":{"type":"array","maxItems":6,"items":{"type":"object","additionalProperties":false,"properties":{"fields":{"type":"array","maxItems":6,"items":{"type":"object","additionalProperties":false,"required":["filling"],"properties":{"filling":{"type":"string","maxLength":60},"heightMm":{"type":"number","minimum":50,"maximum":2750},"ratio":{"type":"number","minimum":0.1,"maximum":20}}}}}}}}},"overrides":{"type":"object","additionalProperties":false,"properties":{"parts":{"type":"object","additionalProperties":{"type":"object","additionalProperties":false,"properties":{"material":{"type":"string","maxLength":64},"disabled":{"type":"boolean"}}}},"sections":{"type":"object","maxProperties":6,"additionalProperties":{"type":"array","maxItems":8,"items":{"type":"object","additionalProperties":false,"required":["kind"],"properties":{"kind":{"type":"string","enum":["hang","shelf","drawers"]},"h":{"type":"number","minimum":0,"maximum":2750},"n":{"type":"integer","minimum":1,"maximum":6},"free":{"type":"integer","minimum":0,"maximum":6}}}}},"edges":{"type":"array","maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["select"],"properties":{"select":{"type":"object","additionalProperties":false,"properties":{"facing":{"type":"array","items":{"type":"string","enum":["front","back","left","right","top","bottom"]}},"codes":{"type":"array","items":{"type":"string","maxLength":40}}}},"abs":{"type":"number","enum":[0.5,1,2]},"none":{"type":"boolean"}}}}}}}}}}},"parameters":[{"schema":{"type":"string","pattern":"^[A-Z0-9_]{2,40}$"},"in":"path","name":"code","required":true}],"security":[],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pricing/board":{"post":{"summary":"Cena jedného dielca","tags":["Pricing"],"description":"Materiál podľa plochy a variantu, hrany podľa dĺžky olepených strán a konkrétnej ABS, príplatok za dielec pod 70 mm, vŕtanie a drážky. Vracia rozpis, sumu bez DPH aj s DPH a varovania.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["boardVariantId","widthMm","heightMm","quantity"],"additionalProperties":false,"properties":{"boardVariantId":{"type":"string","format":"uuid"},"widthMm":{"type":"number","minimum":1,"description":"X - smer kresby, finálny rozmer vrátane hrany"},"heightMm":{"type":"number","minimum":1},"quantity":{"type":"integer","minimum":1,"maximum":999},"edges":{"type":"object","additionalProperties":false,"properties":{"top":{"type":["string","null"],"format":"uuid"},"bottom":{"type":["string","null"],"format":"uuid"},"left":{"type":["string","null"],"format":"uuid"},"right":{"type":["string","null"],"format":"uuid"}}},"holes":{"type":"integer","minimum":0,"maximum":200},"grooves":{"type":"array","maxItems":20,"items":{"type":"object","required":["lengthMm"],"properties":{"lengthMm":{"type":"number","minimum":1}}}},"worktopJoints":{"type":"array","maxItems":2,"items":{"type":"object","required":["side","connector"],"additionalProperties":false,"properties":{"side":{"type":"string","enum":["left","right"]},"connector":{"type":"string","enum":["METAL_100","METAL_65","CAM_100","CAM_60"]},"count":{"type":"integer","minimum":1,"maximum":6},"atypical":{"type":"boolean"},"shape":{"type":"string","enum":["BUTT","MASON_F","MASON_M","MASON_FT","MASON_MT"]},"inset":{"type":"number","minimum":2,"maximum":40},"span":{"type":"number","minimum":10,"maximum":4100},"at":{"type":"number","minimum":0,"maximum":4100}}}},"keepLeftover":{"type":"boolean"},"note":{"type":"string","maxLength":300},"grain":{"type":"string","enum":["horizontal","vertical"]},"grooveOps":{"type":"array","maxItems":20,"items":{"type":"object","required":["type","widthMm","depthMm","lengthMm"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["GROOVE","RABBET","EDGE_GROOVE","FREE"]},"side":{"type":["string","null"],"enum":["top","bottom","left","right",null]},"widthMm":{"type":"number","minimum":0},"depthMm":{"type":"number","minimum":0},"fromEdgeMm":{"type":"number","minimum":0},"fromFaceMm":{"type":"number","minimum":0},"face":{"type":"string","enum":["front","back"]},"lengthMm":{"type":"number","minimum":0}}}},"machiningNote":{"type":"string","maxLength":2000}}}}}},"security":[],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pricing/quote":{"post":{"summary":"Cena celého projektu (viac dielcov)","tags":["Pricing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object","required":["boardVariantId","widthMm","heightMm","quantity"],"additionalProperties":false,"properties":{"boardVariantId":{"type":"string","format":"uuid"},"widthMm":{"type":"number","minimum":1,"description":"X - smer kresby, finálny rozmer vrátane hrany"},"heightMm":{"type":"number","minimum":1},"quantity":{"type":"integer","minimum":1,"maximum":999},"edges":{"type":"object","additionalProperties":false,"properties":{"top":{"type":["string","null"],"format":"uuid"},"bottom":{"type":["string","null"],"format":"uuid"},"left":{"type":["string","null"],"format":"uuid"},"right":{"type":["string","null"],"format":"uuid"}}},"holes":{"type":"integer","minimum":0,"maximum":200},"grooves":{"type":"array","maxItems":20,"items":{"type":"object","required":["lengthMm"],"properties":{"lengthMm":{"type":"number","minimum":1}}}},"worktopJoints":{"type":"array","maxItems":2,"items":{"type":"object","required":["side","connector"],"additionalProperties":false,"properties":{"side":{"type":"string","enum":["left","right"]},"connector":{"type":"string","enum":["METAL_100","METAL_65","CAM_100","CAM_60"]},"count":{"type":"integer","minimum":1,"maximum":6},"atypical":{"type":"boolean"},"shape":{"type":"string","enum":["BUTT","MASON_F","MASON_M","MASON_FT","MASON_MT"]},"inset":{"type":"number","minimum":2,"maximum":40},"span":{"type":"number","minimum":10,"maximum":4100},"at":{"type":"number","minimum":0,"maximum":4100}}}},"keepLeftover":{"type":"boolean"},"note":{"type":"string","maxLength":300},"grain":{"type":"string","enum":["horizontal","vertical"]},"grooveOps":{"type":"array","maxItems":20,"items":{"type":"object","required":["type","widthMm","depthMm","lengthMm"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["GROOVE","RABBET","EDGE_GROOVE","FREE"]},"side":{"type":["string","null"],"enum":["top","bottom","left","right",null]},"widthMm":{"type":"number","minimum":0},"depthMm":{"type":"number","minimum":0},"fromEdgeMm":{"type":"number","minimum":0},"fromFaceMm":{"type":"number","minimum":0},"face":{"type":"string","enum":["front","back"]},"lengthMm":{"type":"number","minimum":0}}}},"machiningNote":{"type":"string","maxLength":2000}}}}}}}}},"security":[],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pricing/discount":{"post":{"summary":"Overenie zľavového kupónu","tags":["Pricing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","subtotalNet"],"properties":{"code":{"type":"string","minLength":1,"maxLength":40},"subtotalNet":{"type":"number","minimum":0,"maximum":1000000}}}}}},"security":[],"responses":{"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/orders/":{"post":{"summary":"Checkout (hosť alebo prihlásený)","tags":["Orders"],"description":"Prepočíta cenu na serveri (klientova cena sa ignoruje), založí zákazníka (hosťa, alebo použije záznam prihláseného účtu, ak je v hlavičke Authorization náš JWT), adresy, objednávku s číslom ME-RRMM-NNN a záznam o platbe prevodom. Vracia platobné údaje a token na zobrazenie objednávky.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["items","customer","billingAddress","shippingMethodCode","consents"],"additionalProperties":false,"properties":{"items":{"type":"array","minItems":1,"maxItems":200,"items":{"anyOf":[{"type":"object","required":["boardVariantId","widthMm","heightMm","quantity"],"additionalProperties":false,"properties":{"kind":{"type":"string","enum":["board"]},"boardVariantId":{"type":"string","format":"uuid"},"widthMm":{"type":"number","minimum":1},"heightMm":{"type":"number","minimum":1},"quantity":{"type":"integer","minimum":1,"maximum":999},"label":{"type":"string","maxLength":80},"set":{"type":"object","required":["ref"],"additionalProperties":false,"properties":{"ref":{"type":"string","format":"uuid"},"name":{"type":"string","maxLength":80},"partCode":{"type":"string","maxLength":40},"templateCode":{"type":"string","maxLength":40}}},"edges":{"type":"object","additionalProperties":false,"properties":{"top":{"type":["string","null"],"format":"uuid"},"bottom":{"type":["string","null"],"format":"uuid"},"left":{"type":["string","null"],"format":"uuid"},"right":{"type":["string","null"],"format":"uuid"}}},"holes":{"type":"integer","minimum":0,"maximum":200},"grooves":{"type":"array","maxItems":20,"items":{"type":"object","required":["lengthMm"],"properties":{"lengthMm":{"type":"number","minimum":1}}}},"worktopJoints":{"type":"array","maxItems":2,"items":{"type":"object","required":["side","connector"],"additionalProperties":false,"properties":{"side":{"type":"string","enum":["left","right"]},"connector":{"type":"string","enum":["METAL_100","METAL_65","CAM_100","CAM_60"]},"count":{"type":"integer","minimum":1,"maximum":6},"atypical":{"type":"boolean"},"shape":{"type":"string","enum":["BUTT","MASON_F","MASON_M","MASON_FT","MASON_MT"]},"inset":{"type":"number","minimum":2,"maximum":40},"span":{"type":"number","minimum":10,"maximum":4100},"at":{"type":"number","minimum":0,"maximum":4100}}}},"keepLeftover":{"type":"boolean"},"note":{"type":"string","maxLength":300},"grain":{"type":"string","enum":["horizontal","vertical"]},"grooveOps":{"type":"array","maxItems":20,"items":{"type":"object","required":["type","widthMm","depthMm","lengthMm"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["GROOVE","RABBET","EDGE_GROOVE","FREE"]},"side":{"type":["string","null"],"enum":["top","bottom","left","right",null]},"widthMm":{"type":"number","minimum":0},"depthMm":{"type":"number","minimum":0},"fromEdgeMm":{"type":"number","minimum":0},"fromFaceMm":{"type":"number","minimum":0},"face":{"type":"string","enum":["front","back"]},"lengthMm":{"type":"number","minimum":0}}}},"machiningNote":{"type":"string","maxLength":2000}}},{"type":"object","required":["kind","quantity","slidingDoors"],"additionalProperties":false,"properties":{"kind":{"type":"string","enum":["sliding_doors"]},"quantity":{"type":"integer","minimum":1,"maximum":20},"label":{"type":"string","maxLength":80},"slidingDoors":{"type":"object","additionalProperties":false,"properties":{"W":{"type":"number","minimum":1,"maximum":10000},"H":{"type":"number","minimum":1,"maximum":10000},"extra":{"type":"object","maxProperties":20,"additionalProperties":{"type":"number","minimum":0,"maximum":10000}},"doors":{"type":"object","additionalProperties":false,"properties":{"system":{"type":"string","maxLength":40},"finish":{"type":"string","maxLength":40},"doors":{"type":"array","maxItems":6,"items":{"type":"object","additionalProperties":false,"properties":{"fields":{"type":"array","maxItems":6,"items":{"type":"object","additionalProperties":false,"required":["filling"],"properties":{"filling":{"type":"string","maxLength":60},"heightMm":{"type":"number","minimum":50,"maximum":2750},"ratio":{"type":"number","minimum":0.1,"maximum":20}}}}}}}}}}}}}]}},"sets":{"type":"object","maxProperties":50,"additionalProperties":{"type":"object"}},"customer":{"type":"object","required":["email","phone","firstName","lastName"],"additionalProperties":false,"properties":{"email":{"type":"string","format":"email","maxLength":120},"phone":{"type":"string","minLength":6,"maxLength":30},"firstName":{"type":"string","minLength":1,"maxLength":60},"lastName":{"type":"string","minLength":1,"maxLength":60},"company":{"type":"object","required":["name","ico"],"additionalProperties":false,"properties":{"name":{"type":"string","minLength":2,"maxLength":120},"ico":{"type":"string","minLength":6,"maxLength":12},"dic":{"type":"string","maxLength":14},"icDph":{"type":"string","maxLength":16}}}}},"billingAddress":{"type":"object","required":["street","city","zip"],"additionalProperties":false,"properties":{"street":{"type":"string","minLength":2,"maxLength":120},"city":{"type":"string","minLength":2,"maxLength":80},"zip":{"type":"string","minLength":3,"maxLength":12},"country":{"type":"string","minLength":2,"maxLength":2}}},"shippingAddress":{"anyOf":[{"type":"object","required":["street","city","zip"],"additionalProperties":false,"properties":{"street":{"type":"string","minLength":2,"maxLength":120},"city":{"type":"string","minLength":2,"maxLength":80},"zip":{"type":"string","minLength":3,"maxLength":12},"country":{"type":"string","minLength":2,"maxLength":2}}},{"type":"null"}]},"shippingMethodCode":{"type":"string","enum":["PICKUP","COURIER","TOPTRANS"]},"note":{"type":"string","maxLength":1000},"discountCode":{"type":"string","maxLength":40},"expressHours":{"type":"integer","enum":[24,48]},"consents":{"type":"object","required":["terms","customMadeWaiver"],"properties":{"terms":{"type":"boolean"},"customMadeWaiver":{"type":"boolean"}}},"locale":{"type":"string","minLength":2,"maxLength":2}}}}}},"security":[],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/orders/{number}":{"get":{"summary":"Detail objednávky pre hosťa","tags":["Orders"],"description":"Token z potvrdenia ide v hlavičke `Authorization: Bearer <token>`. Odpoveď obsahuje aj platobné údaje a PAY by square QR ako data URL, kým objednávka nie je uhradená.","parameters":[{"schema":{"type":"string","pattern":"^[A-Z]{1,4}-\\d{4}-\\d{3,4}$"},"in":"path","name":"number","required":true}],"security":[{"bearerAuth":[]}],"responses":{"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pieces/{code}":{"get":{"summary":"Dielec podľa kódu zo štítku (QR → /p/<kód>)","tags":["Pieces"],"parameters":[{"schema":{"type":"string","pattern":"^[0-9A-Z]{10}$"},"in":"path","name":"code","required":true}],"security":[],"responses":{"200":{"description":"Default Response"}}}},"/bank/paybysquare/generate":{"post":{"summary":"Vygeneruje Pay by Square QR kód / Generate Pay by Square QR code","tags":["Bank: PayBySquare"],"description":"Vygeneruje QR kód z platobných údajov podľa Pay by Square štandardu. Podporuje platobné príkazy, trvalé príkazy a inkasá.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"invoiceID":{"type":"string","maxLength":10},"payments":{"type":"array","minItems":1,"items":{"type":"object","required":["paymentOptions","bankAccounts"],"properties":{"paymentOptions":{"type":"array","items":{"type":"string","enum":["paymentorder","standingorder","directdebit"]},"minItems":1},"amount":{"type":"number","minimum":0},"currencyCode":{"type":"string","pattern":"^[A-Z]{3}$","default":"EUR"},"paymentDueDate":{"type":"string","format":"date"},"variableSymbol":{"type":"string","maxLength":10},"constantSymbol":{"type":"string","maxLength":4},"specificSymbol":{"type":"string","maxLength":10},"originatorsReferenceInformation":{"type":"string","maxLength":35},"paymentNote":{"type":"string","maxLength":140},"bankAccounts":{"type":"array","minItems":1,"items":{"type":"object","required":["iban"],"properties":{"iban":{"type":"string","maxLength":34},"bic":{"type":"string","maxLength":11}}}},"standingOrderExt":{"type":"object","properties":{"day":{"type":"integer","minimum":1,"maximum":31},"months":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12}},"periodicity":{"type":"string","enum":["d","w","b","m","B","q","s","a"]},"lastDate":{"type":"string","format":"date"}}},"directDebitExt":{"type":"object","properties":{"directDebitScheme":{"type":"integer","enum":[0,1]},"directDebitType":{"type":"integer","enum":[0,1]},"variableSymbol":{"type":"string","maxLength":10},"specificSymbol":{"type":"string","maxLength":10},"originatorsReferenceInformation":{"type":"string","maxLength":35},"mandateID":{"type":"string","maxLength":35},"creditorID":{"type":"string","maxLength":35},"contractID":{"type":"string","maxLength":35},"maxAmount":{"type":"number","minimum":0},"validTillDate":{"type":"string","format":"date"}}},"beneficiaryName":{"type":"string","maxLength":70},"beneficiaryAddressLine1":{"type":"string","maxLength":70},"beneficiaryAddressLine2":{"type":"string","maxLength":70}}}},"options":{"type":"object","properties":{"format":{"type":"string","enum":["png","svg","dataurl","text"],"default":"png"},"errorCorrectionLevel":{"type":"string","enum":["L","M","Q","H"],"default":"L"},"width":{"type":"integer","minimum":100,"maximum":1000,"default":300},"margin":{"type":"integer","minimum":0,"maximum":10,"default":4}}}}}}}},"responses":{"200":{"description":"QR kód úspešne vygenerovaný","content":{"application/json":{"schema":{"description":"QR kód úspešne vygenerovaný","type":"object","properties":{"success":{"type":"boolean"},"qrCode":{"type":"string"},"metadata":{"type":"object","properties":{"format":{"type":"string"},"base32Data":{"type":"string"},"sequenceLength":{"type":"integer"},"compressedLength":{"type":"integer"},"base32Length":{"type":"integer"},"crc32":{"type":"string"},"header":{"type":"object","properties":{"bySquareType":{"type":"integer"},"version":{"type":"integer"},"documentType":{"type":"integer"},"reserved":{"type":"integer"}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/bank/paybysquare/decode":{"post":{"summary":"Dekóduje Pay by Square QR kód / Decode Pay by Square QR code","tags":["Bank: PayBySquare"],"description":"Dekóduje Base32hex reťazec z QR kódu späť na platobné údaje.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["base32Data"],"properties":{"base32Data":{"type":"string","description":"Base32hex encoded string from QR code"}}}}}},"responses":{"200":{"description":"QR kód úspešne dekódovaný","content":{"application/json":{"schema":{"description":"QR kód úspešne dekódovaný","type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object"},"metadata":{"type":"object"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/bank/paybysquare/validate":{"post":{"summary":"Validuje platobné údaje / Validate payment data","tags":["Bank: PayBySquare"],"description":"Overí platobné údaje bez generovania QR kódu. Kontroluje formát, povinné polia a dĺžku sekvence.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"invoiceID":{"type":"string"},"payments":{"type":"array"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"valid":{"type":"boolean"},"sequenceLength":{"type":"integer"},"withinLimit":{"type":"boolean"},"message":{"type":"string"},"error":{"type":"string"}}}}}}}}}},"servers":[{"url":"https://api.mobeleasy.com"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Health","description":"Liveness a readiness pre monitoring"},{"name":"SEO","description":"Sitemap a strojovo čitateľné podklady pre vyhľadávače"},{"name":"Auth","description":"Registrácia, prihlásenie a tokeny"},{"name":"Catalog","description":"Materiály, varianty dosiek, hrany, kovanie a číselníky"},{"name":"Pricing","description":"Výpočet ceny dielca a operácií"},{"name":"Cart","description":"Serverový košík"},{"name":"Orders","description":"Checkout, objednávky a ich stavy"},{"name":"Admin","description":"Správa katalógu, cenníkov a prekladov"},{"name":"Bank: PayBySquare","description":"Generovanie a dekódovanie Pay by Square QR kódov"},{"name":"Bank: Fio","description":"Sťahovanie výpisov a párovanie prijatých platieb"}]}