DSL Syntaxe
Základní pravidla pro správnou syntaxi Domain Specific Language.
Všechny DSL výrazy musí být v JSON formátu s hranatými závorkami
✅ Správně: ["*", ["var", "dsl.price_buy"], 1.3]
✅ Správně: ["if", condition, true_value, false_value]
❌ Špatně: if (condition) { return value; }
❌ Špatně: dsl.price_buy * 1.3První prvek pole je vždy operátor v uvozovkách
✅ Správně: [">", hodnota1, hodnota2] ✅ Správně: ["and", podminka1, podminka2] ✅ Správně: ["var", "dsl.price_buy"] ❌ Špatně: [>, hodnota1, hodnota2] ❌ Špatně: [and, podminka1, podminka2]
Proměnné se zadávají pomocí ["var", "nazev_promenne"]
✅ Správně: ["var", "dsl.price_buy"]
✅ Správně: ["var", "dsl.competition.lowest_price"]
❌ Špatně: dsl.price_buy
❌ Špatně: $price_buy
❌ Špatně: {dsl.price_buy}Výrazy lze vnořovat do sebe pro komplexní logiku
["if", [">", ["var", "dsl.stock_level"], 5], ["*", ["var", "dsl.price_buy"], 1.3], ["*", ["var", "dsl.price_buy"], 1.25] ]
Filter Expressions
Filtry určují, zda se pravidlo nebo strategie vůbec spustí pro daný produkt. Vrací true/false.
Pravidlo se použije pouze když je skladem více než 3 ks
[">", ["var", "dsl.stock_level"], 3]
Použité proměnné:
Výsledek:
true pokud stock_level > 3, jinak false
Pravidlo se použije pouze když je nalezena konkurence
[">", ["var", "dsl.competition_count"], 0]
Použité proměnné:
Výsledek:
true pokud je nalezen alespoň 1 konkurent
Pravidlo se použije pouze pro konkrétní kategorii produktu
["==", ["var", "dsl.product.category"], "Elektronika"]
Použité proměnné:
Výsledek:
true pokud kategorie = "Elektronika"
Pravidlo se použije pouze pro produkty v určitém cenovém rozmezí
["and", [">", ["var", "dsl.price_buy"], 100], ["<", ["var", "dsl.price_buy"], 1000] ]
Použité proměnné:
Výsledek:
true pokud 100 < nákupní cena < 1000 Kč
Pravidlo se použije pouze když je skladem a existuje konkurence
["and", [">", ["var", "dsl.stock_level"], 0], [">", ["var", "dsl.competition_count"], 0] ]
Použité proměnné:
Výsledek:
true pokud je na skladě ANI existuje konkurence
Pravidlo se použije pouze pro vybranou značku
["in", ["var", "dsl.product.brand"], ["Apple", "Samsung", "Sony"]]
Použité proměnné:
Výsledek:
true pokud značka je Apple, Samsung nebo Sony
Smart Templates - Cenová Pravidla
Kompletní pravidla pro výpočet prodejní ceny. Vrací číselnou hodnotu (cenu v Kč).
Nastavit cenu s pevnou 30% marží nad nákupní cenou. Příklad z produktu Calvin Klein Contradiction EDP (ID 24).
["*", ["var", "dsl.price_buy"], 1.3]
Použité proměnné:
Příklad:
Nákup 373,37 Kč → Prodej 485,38 Kč (marže 112,01 Kč = 30%)
Nastavit cenu o 10 Kč nižší než nejlevnější konkurent. 💱 Používá amount pro měnovou hodnotu. Skutečná konkurence z produktu ID 24.
["-", ["var", "dsl.competition.lowest_price"], ["amount", 10, "CZK"]]
Použité proměnné:
Příklad:
Nejlevnější konkurent 438,02 Kč → Prodej 428,02 Kč | V EUR projektu: automaticky převede 10 CZK → ~0.40 EUR
Když je konkurence, podražit o 10 Kč. Jinak marže 25%. 💱 Kombinuje amount a multiplikátor. Produktu ID 24 má 20 konkurentů.
["if", [">", ["var", "dsl.competition_count"], 0], ["-", ["var", "dsl.competition.lowest_price"], ["amount", 10, "CZK"]], ["*", ["var", "dsl.price_buy"], 1.25] ]
Použité proměnné:
Příklad:
S konkurencí (20 konkurentů): 438,02 Kč → 428,02 Kč | Bez konkurence: 373,37 Kč → 466,71 Kč (marže 25%)
Marže 30%, ale minimálně 200 Kč a maximálně 1000 Kč. 💱 Používá amount pro absolutní limity.
["min",
["max",
["*", ["var", "dsl.price_buy"], 1.3],
["amount", 200, "CZK"]
],
["amount", 1000, "CZK"]
]Použité proměnné:
Příklad:
Nákup 100 Kč → 200 Kč (min) | Nákup 1000 Kč → 1000 Kč (max) | V EUR: limity se převedou
Když málo na skladě (< 5 ks), zvýšit marži na 35%, jinak 25%
["if", ["<", ["var", "dsl.stock_level"], 5], ["*", ["var", "dsl.price_buy"], 1.35], ["*", ["var", "dsl.price_buy"], 1.25] ]
Použité proměnné:
Příklad:
Sklad 3 ks: 100 Kč → 135 Kč | Sklad 10 ks: 100 Kč → 125 Kč
Použít předdefinovanou úroveň marže "std" (např. 30%)
["margin-level", "std"]
Použité proměnné:
Příklad:
Nákup 100 Kč → 130 Kč (pokud std = 30%)
Nastavit cenu na průměr konkurence minus 3%. Skutečný průměr z produktu ID 24: 505,62 Kč.
["*", ["var", "dsl.competition.avg_price"], 0.97]
Použité proměnné:
Příklad:
Průměr konkurence 505,62 Kč → Prodej 490,45 Kč (3% úspora)
Pokud je skladem více než 10 ks, podražit o 15 Kč. Pokud 5-10 ks, podražit o 10 Kč. Jinak marže 30%.
["if",
[">", ["var", "dsl.stock_level"], 10],
["-", ["var", "dsl.competition.lowest_price"], 15],
["if",
[">=", ["var", "dsl.stock_level"], 5],
["-", ["var", "dsl.competition.lowest_price"], 10],
["*", ["var", "dsl.price_buy"], 1.3]
]
]Použité proměnné:
Příklad:
Sklad 15 ks: 500 Kč → 485 Kč | Sklad 7 ks: 500 Kč → 490 Kč | Sklad 2 ks: 100 Kč → 130 Kč
Být vždy nejlevnější (o 5 Kč), ale dodržet minimální marži 10%
["max", ["-", ["var", "dsl.competition.lowest_price"], 5], ["*", ["var", "dsl.price_buy"], 1.1] ]
Použité proměnné:
Příklad:
Konkurent 500 Kč, nákup 400 Kč → 495 Kč (10% zachováno) | Konkurent 200 Kč, nákup 100 Kč → 195 Kč
Pokud je konkurence více než 5 obchodů, zvýšit marži o 10%. Produktu ID 24 má 20 konkurentů, takže aktivuje vyšší marži.
["if", [">", ["var", "dsl.competition_count"], 5], ["*", ["var", "dsl.price_buy"], 1.4], ["*", ["var", "dsl.price_buy"], 1.3] ]
Použité proměnné:
Příklad:
20 konkurentů (jako ID 24): 373,37 Kč → 523,72 Kč (40% marže) | 3 konkurenti: 373,37 Kč → 485,38 Kč (30% marže)
Pokud je konkurence max 3 obchody, použít median cenu, jinak marže 25%. Poznámka: Produktu ID 24 má 20 konkurentů, jde do fallbacku.
["if", ["<=", ["var", "dsl.competition_count"], 3], ["var", "dsl.competition.median_price"], ["*", ["var", "dsl.price_buy"], 1.25] ]
Použité proměnné:
Příklad:
2 konkurenti, median 450 Kč → 450 Kč | 20 konkurentů (jako ID 24), nákup 373,37 Kč → 466,71 Kč (marže 25%)
Použít median cenu konkurence, ale zajistit marží mezi 10-40%. Pro produkt ID 24: median 504,13 Kč, nákup 373,37 Kč.
["min",
["max",
["var", "dsl.competition.median_price"],
["*", ["var", "dsl.price_buy"], 1.1]
],
["*", ["var", "dsl.price_buy"], 1.4]
]Použité proměnné:
Příklad:
ID 24: Median 504,13 Kč, nákup 373,37 Kč → 504,13 Kč (35% marže, v rozmezí 10-40%) | Min: 410,71 Kč (10%), Max: 523,72 Kč (40%)
Nastavit cenu s 25% marží (profit / prodejní cena). Pozor: marže ≠ markup!
["/", ["var", "dsl.price_buy"], 0.75]
Použité proměnné:
Výpočet:
Nákup 100 Kč → Prodej 133.33 Kč → Marže: 25% | Markup: 33.33%
Nastavit cenu s 25% markupem (přirážka na nákupní cenu). Pozor: markup ≠ marže!
["*", ["var", "dsl.price_buy"], 1.25]
Použité proměnné:
Výpočet:
Nákup 100 Kč → Prodej 125 Kč → Marže: 20% | Markup: 25%
Markup může být i nad 100% (marže nikdy!). Zde 300% markup = 75% marže.
["*", ["var", "dsl.price_buy"], 4.0]
Použité proměnné:
Výpočet:
Nákup 100 Kč → Prodej 400 Kč → Marže: 75% | Markup: 300%
Pokud nákup < 500 Kč: markup 50%. Jinak: marže 30%.
["if", ["<", ["var", "dsl.price_buy"], 500], ["*", ["var", "dsl.price_buy"], 1.5], ["/", ["var", "dsl.price_buy"], 0.7] ]
Použité proměnné:
Příklad:
Nákup 300 Kč → 450 Kč (50% markup) | Nákup 800 Kč → 1142.86 Kč (30% marže)
Guardrails - Ochranné Limity
Ochranné podmínky které musí být splněny. Vrací true/false, ovlivňuje zda se cena použije.
Zajistit, že marže je vždy alespoň 15%
[">", ["margin-%"], 15]
Použité proměnné:
Výsledek:
true pokud marže >= 15%, cena se použije
Zajistit, že cena nepřekročí 5000 Kč. 💱 Používá amount pro absolutní limit.
["<=", ["var", "dsl.price_new"], ["amount", 5000, "CZK"]]
Použité proměnné:
Výsledek:
true pokud nová cena <= 5000 Kč | V EUR projektu: <= ~205.76 EUR
Zajistit absolutní marži alespoň 50 Kč. 💱 Používá amount pro měnovou hodnotu.
[">", ["-", ["var", "dsl.price_new"], ["var", "dsl.price_buy"]], ["amount", 50, "CZK"] ]
Použité proměnné:
Výsledek:
true pokud (prodej - nákup) >= 50 Kč | V EUR: >= ~2.06 EUR
Zajistit, že nová cena se neliší od aktuální o více než 10%
["and", [">=", ["var", "dsl.price_new"], ["*", ["var", "dsl.price_current"], 0.9]], ["<=", ["var", "dsl.price_new"], ["*", ["var", "dsl.price_current"], 1.1]] ]
Použité proměnné:
Výsledek:
true pokud nová cena je v rozmezí 90% - 110% aktuální ceny
Nastavit cenu pouze když je produkt na skladě
[">", ["var", "dsl.stock_level"], 0]
Použité proměnné:
Výsledek:
true pokud je skladem alespoň 1 ks
Zajistit, že cena nebude nižší než nejlevnější konkurent
[">=", ["var", "dsl.price_new"], ["var", "dsl.competition.lowest_price"]]
Použité proměnné:
Výsledek:
true pokud naše cena >= nejnižší cena konkurence
Marže min 15% A cena max 5000 Kč A skladem > 0
["and", [">", ["margin-%"], 15], ["<=", ["var", "dsl.price_new"], 5000], [">", ["var", "dsl.stock_level"], 0] ]
Použité proměnné:
Výsledek:
true pokud jsou splněny VŠECHNY tři podmínky
Zajistit, že cena nepřekročí 150% nákupní ceny
["<=", ["var", "dsl.price_new"], ["*", ["var", "dsl.price_buy"], 1.5]]
Použité proměnné:
Výsledek:
true pokud prodejní cena <= 1.5x nákupní cena
Zajistit, že cena nepřekročí doporučenou maloobchodní cenu (RRP)
["<=", ["var", "dsl.price_new"], ["var", "dsl.product.rrp"]]
Použité proměnné:
Výsledek:
true pokud naše cena <= RRP (doporučená maloobchodní cena)
Zajistit, že markup nepřekročí 200% (marže max 66.67%)
["<=", ["var", "dsl.price_new"], ["*", ["var", "dsl.price_buy"], 3.0]]
Použité proměnné:
Výsledek:
true pokud prodejní cena <= 3x nákupní cena (max 200% markup)
Zajistit, že marže nepřekročí 60% (markup max 150%)
[">=", ["var", "dsl.price_new"], ["/", ["var", "dsl.price_buy"], 0.4]]
Použité proměnné:
Výsledek:
true pokud cena >= nákup/0.4 (60% marže = markup 150%)
Zajistit marži mezi 10-50%, což odpovídá markupu 11.11-100%
["and", [">=", ["var", "dsl.price_new"], ["/", ["var", "dsl.price_buy"], 0.9]], ["<=", ["var", "dsl.price_new"], ["/", ["var", "dsl.price_buy"], 0.5]] ]
Použité proměnné:
Výsledek:
true pokud marže je v rozmezí 10-50%
💱 Operátor Amount - Měnové hodnoty
Operátor amount umožňuje explicitně specifikovat absolutní měnové hodnoty v DSL výrazech a automaticky je převádí na měnu projektu.
amount vs. holé číslo?
✅ Holé číslo = Multiplikátor / Procenta
["*", ["var", "dsl.price_buy"], 1.35] → 35% marže (multiplikátor) ["+", ["var", "dsl.price"], 0.15] → Přičíst 0.15 jako multiplikátor
❌ Holé číslo = Není jasné, co znamená!
["-", ["var", "dsl.competition.lowest_price"], 10] → Je to 10 Kč? Nebo 10%? Nebo 10 EUR? NEPOUŽÍVAT!
✅ amount = Absolutní hodnota v měně
["-", ["var", "dsl.competition.lowest_price"], ["amount", 10, "CZK"]] → Konkurence - 10 Kč (JASNÉ!) ["+", ["var", "dsl.price"], ["amount", 2, "EUR"]] → Cena + 2 EUR (v CZK projektu se převede → ~48.64 Kč)
Formát: ["amount", hodnota, "měna"]
["amount", 100, "CZK"] → 100 Kč ["amount", 10, "EUR"] → 10 EUR (převede se na měnu projektu) ["amount", 50] → 50 v default měně (CZK) ["amount", 5, "USD"] → 5 USD (automatický převod)
DSL automaticky převádí mezi měnami pomocí aktuálních kurzů ČNB
// V CZK projektu: ["amount", 10, "EUR"] → ~243 Kč (při kurzu 24.32) // V EUR projektu: ["amount", 100, "CZK"] → ~4.11 EUR (při kurzu 24.32)
Odečíst 50 Kč od konkurenční ceny
["-", ["var", "dsl.competition.lowest_price"], ["amount", 50, "CZK"] ]
Příklad:
Konkurent 1000 Kč → 950 Kč | V EUR projektu: 1000 Kč → ~39.02 EUR, minus ~2.06 EUR = ~36.96 EUR
Přidat 100 Kč premium k nákupní ceně
["+", ["var", "dsl.price_buy"], ["amount", 100, "CZK"] ]
Příklad:
Nákup 500 Kč → 600 Kč (fixní přirážka)
Použít EUR hodnoty v CZK projektu
["if", ["<", ["var", "dsl.price"], ["amount", 500, "CZK"]], ["amount", 20, "EUR"], ["var", "dsl.price"] ]
Příklad:
Pokud cena < 500 Kč, nastav na 20 EUR (~486 Kč). Jinak ponech.
Větší z: marže 30% nebo minimálně 150 Kč
["max", ["*", ["var", "dsl.price_buy"], 1.3], ["amount", 150, "CZK"] ]
Příklad:
Nákup 100 Kč: max(130, 150) = 150 Kč | Nákup 200 Kč: max(260, 150) = 260 Kč
Další: AUD, CAD, JPY, CNY, BRL, INR, KRW, MXN, ZAR, TRY, IDR, THB a další...
Kurzy z ČNB kurzovního lístku, aktualizace denně.
Operátory - Quick Reference
Kompletní přehled všech dostupných operátorů DSL
| Operátor | Popis | Příklad | Výsledek |
|---|---|---|---|
+ |
Sčítání | ["+", 10, 5] |
15 |
- |
Odčítání | ["-", 10, 5] |
5 |
* |
Násobení | ["*", 10, 2] |
20 |
/ |
Dělení | ["/", 10, 2] |
5 |
min |
Minimum | ["min", 10, 5, 20] |
5 |
max |
Maximum | ["max", 10, 5, 20] |
20 |
== |
Rovná se | ["==", 10, 10] |
true |
!= |
Nerovná se | ["!=", 10, 5] |
true |
> |
Větší než | [">", 10, 5] |
true |
>= |
Větší nebo rovno | [">=", 10, 10] |
true |
< |
Menší než | ["<", 5, 10] |
true |
<= |
Menší nebo rovno | ["<=", 10, 10] |
true |
and |
Logické AND | ["and", true, true] |
true |
or |
Logické OR | ["or", false, true] |
true |
not |
Logické NOT | ["not", false] |
true |
if |
Podmínka | ["if", true, "ano", "ne"] |
"ano" |
var |
Proměnná | ["var", "dsl.price_buy"] |
hodnota proměnné |
in |
Je v seznamu | ["in", "X", ["X", "Y"]] |
true |
margin-% |
Marže v % | ["margin-%"] |
% marže |
margin-level |
Úroveň marže | ["margin-level", "std"] |
cena s marží "std" |
amount |
💱 Měnová hodnota | ["amount", 100, "CZK"] |
100 Kč (převede na měnu projektu) |
Proměnné - Quick Reference
Kompletní přehled všech dostupných proměnných DSL
| Proměnná | Typ | Popis | Příklad hodnoty |
|---|---|---|---|
dsl.price_buy |
number | Nákupní cena produktu | 536.65 |
dsl.price_current |
number | Aktuální prodejní cena | 650.00 |
dsl.price_new |
number | Nově vypočítaná cena | 625.00 |
dsl.stock_level |
number | Množství na skladě | 15 |
dsl.competition_count |
number | Počet konkurentů | 11 |
dsl.competition.lowest_price |
number | Nejnižší cena konkurence | 627.27 |
dsl.competition.avg_price |
number | Průměrná cena konkurence | 750.50 |
dsl.competition.highest_price |
number | Nejvyšší cena konkurence | 890.00 |
dsl.product.category |
string | Kategorie produktu | "Elektronika" |
dsl.product.brand |
string | Značka produktu | "Apple" |
dsl.product.ean |
string | EAN kód produktu | "8590000123456" |
dsl.final_price.margin_percent |
number | Marže v % (profit / sell price) | 67.67 |
dsl.final_price.markup_percent |
number | Markup v % (profit / buy price) | 209.31 |
dsl.final_price.profit_amount |
number | Absolutní zisk v Kč | 2236.47 |
margin-% |
number | Procentuální marže (legacy) | 25.5 |
(Prodej - Nákup) / Prodej × 100Markup (Obchodní přirážka): Podíl zisku k nákupní ceně. Může být >100%. Vzorec:
(Prodej - Nákup) / Nákup × 100
Příklad: Nákup 100 Kč → Prodej 150 Kč - Zisk: 50 Kč - Marže: 50/150 × 100 = 33.33% - Markup: 50/100 × 100 = 50%