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] ]
DSL Formáty: {} vs []
V DSL existují dva různé formáty pro různé účely. Pochopení rozdílu je klíčové pro správné psaní pravidel.
Používá se pro: Tělo pravidla (Rule) nebo guardrail.
Účel: Definuje AKCI - co se má udělat s cenou.
{
"if": [">", ["var", "dsl.margin_%"], 20],
"then": { "keep_price": true },
"else": { "set_min_price": ["*", ["var", "dsl.price_buy"], 1.2] }
}Klíče v {} formátu:
if, then, else, set_price, set_min_price, set_max_price, keep_price, reject
Používá se pro: Filter expression, podmínky, výpočty.
Účel: Definuje PODMÍNKU (true/false) nebo VÝPOČET (číslo).
["and", [">", ["var", "dsl.stock_level"], 0], ["==", ["var", "dsl.domain"], "profi-parfemy.cz"] ]
Operátory v [] formátu:
>, <, ==, !=, and, or, not, in, exists, +, -, *, /, var, if
| Kontext | Formát | Co vrací | Příklad |
|---|---|---|---|
| Rule/Guardrail Body Monaco editor v Rules/Guardrails |
{ } |
Akce (set_price, reject...) | {"if": [...], "then": {...}} |
| Filter Expression Pole "Filter Expression" v Rules/Guardrails |
[ ] |
true / false | [">", ["var", "dsl.stock"], 0] |
| Podmínka uvnitř "if" V hodnotě klíče "if" uvnitř {} |
[ ] |
true / false | ["exists", ["var", "dsl.rrp"]] |
| Výpočet ceny V hodnotě "set_price" uvnitř {} |
[ ] |
Číslo (cena) | ["*", ["var", "dsl.price_buy"], 1.3] |
Pravidlo které se aplikuje pouze na produkty značky "Nina Ricci" s konkurencí. Podtrhne konkurenci o 5 Kč, nebo použije 30% marži.
Filter Expression (pole "Filter Expression")
["and", ["==", ["var", "dsl.product.brand"], "Nina Ricci"], [">", ["var", "dsl.competition_count"], 0] ]
DSL Body (Monaco editor)
{
"if": ["exists", ["var", "dsl.competition.lowest_price"]],
"then": {
"set_price": ["-", ["var", "dsl.competition.lowest_price"], 5]
},
"else": {
"set_price": ["*", ["var", "dsl.price_buy"], 1.3]
}
}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%
🔍 Guardrail Filter Expressions - Praktické příklady
Filter Expression určuje, kdy se guardrail aplikuje. Používá se v režimu "Filter Expression" při editaci guardrail.
Guardrails jsou znovupoužitelné cenové omezení, které zajišťují, že ceny zůstanou v přijatelných mezích. Fungují jako bezpečnostní kontroly aplikované při přeceňování.
📌 Tři režimy aplikace:
| 🌐 Global | Aplikuje se automaticky na všechny produkty při každém přeceňování |
| 📍 Local (Rule) | Použije se pouze v konkrétních pravidlech pomocí apply_guardrails |
| 🔍 Filter Expression | Aplikuje se podle DSL podmínky - pouze pokud filter vrátí true |
Praktické Filter Expression příklady z praxe
Guardrail se aplikuje pouze na premium značky - např. vyšší minimální marže pro luxusní parfémy
["in", ["var", "dsl.product.brand"], ["Nina Ricci", "Chloé", "Gucci", "Prada", "Dior"] ]
Use case:
Guardrail "Min marže 25%" se aplikuje jen na luxusní značky, ostatní mají běžnou marži 15%
Guardrail se aplikuje pouze na levné produkty - speciální ochrana pro nízké ceny
["<", ["var", "dsl.price_buy"], 500]
Use case:
Guardrail "Min marže 50 Kč" se aplikuje jen na produkty s nákupem pod 500 Kč (jinak by marže byla příliš nízká)
Guardrail se aplikuje podle názvu produktu - např. speciální pravidla pro testery
["contains", ["var", "dsl.product.name"], "Tester"]
Use case:
Guardrail "Max marže 20%" se aplikuje jen na testery (obvykle prodávané s nižší marží)
Guardrail se aplikuje pouze na vybrané domény/e-shopy
["in", ["var", "dsl.domain"], ["profi-parfemy.cz", "parfemy-elnino.cz"] ]
Use case:
Guardrail "Max cena = konkurence median" jen pro domény kde je silná konkurence
Guardrail se aplikuje když je na skladě hodně kusů - agresivnější pricing
[">", ["var", "dsl.stock_level"], 50]
Use case:
Guardrail "Max marže 15%" pro produkty s vysokým skladem (potřeba prodat, nižší marže OK)
Guardrail se aplikuje pouze na vybranou kategorii produktů
["==", ["var", "dsl.product.category"], "Elektronika"]
Use case:
Guardrail "Max cena změna 5%/den" jen pro elektroniku (citlivá kategorie na cenové výkyvy)
Guardrail se aplikuje jen na drahé luxusní produkty
["and", ["in", ["var", "dsl.product.brand"], ["Chanel", "Dior", "Gucci"]], [">", ["var", "dsl.price_buy"], 1000] ]
Use case:
Guardrail "Nikdy pod RRP" jen pro luxusní produkty nad 1000 Kč
Guardrail se aplikuje jen když je konkurence a jsme na konkrétní doméně
["and", ["==", ["var", "dsl.domain"], "profi-parfemy.cz"], [">", ["var", "dsl.competition_count"], 0] ]
Use case:
Guardrail "Cena max median konkurence" jen pro profi-parfemy.cz a jen když existuje konkurence
Guardrail se aplikuje pouze když máme data o konkurenci
["exists", ["var", "dsl.competition.lowest_price"]]
Use case:
Guardrail "Max cena = nejnižší konkurent + 10%" - má smysl jen když známe cenu konkurence
Guardrail se aplikuje na vše KROMĚ vybraných značek
["not", ["in", ["var", "dsl.product.brand"], ["NoName", "Budget"]] ]
Use case:
Guardrail "Min marže 20%" na vše kromě levných značek (kde stačí 10%)
- Různé marže pro různé značky - luxusní vs. běžné
- Různé limity pro různé cenové hladiny - levné vs. drahé produkty
- Specifická pravidla pro domény - různé e-shopy různá strategie
- Pravidla závislá na datech - aplikuj jen když existuje konkurence
- Vyloučení produktů - vše kromě testerů, vzorků, atd.
- Kombinace podmínek - luxusní značka + vysoká cena + doména
💱 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) |
tag |
🏷️ Diagnostický štítek | ["tag", "low_margin"] |
true (přidá tag pro statistiky) |
🏷️ Pricing Tags - Diagnostika cenotvorby
Systém tagů pro sledování problémů v cenotvorbě. Umožňuje identifikovat, kolik produktů naráží na guardrails, má nízkou marži, chybí data apod.
📊 Jak to funguje
- Při každém přecenění produktu se smažou staré tagy
- Automatické tagy se přidávají podle výsledků (guardrails, marže, chyby)
- Ruční tagy lze přidat pomocí DSL operátoru
["tag", "název"] - Statistiky jsou dostupné přes API endpoint
/api/pricing-tags
DSL Operátor: tag
["tag", "název_tagu"] ["tag", "název_tagu", "popis"]
true, lze použít v podmínkách.
["if", ["<", ["var", "dsl.margin_pct"], 10], ["tag", "low_margin", "Marže pod 10%"], null ]
and.["if",
["not", ["var", "dsl.competition.lowest_price"]],
["and",
["tag", "no_competition"],
["*", ["var", "dsl.price_buy"], 1.5]
],
["var", "dsl.competition.lowest_price"]
]["if",
["<", ["var", "dsl.margin_pct"], 5],
["and", ["tag", "critical_margin"], ["var", "dsl.min_price"]],
["if",
["<", ["var", "dsl.margin_pct"], 15],
["and", ["tag", "low_margin"], ["var", "dsl.calculated_price"]],
["var", "dsl.calculated_price"]
]
]Automatické tagy
| Tag | Zdroj | Popis | Severity |
|---|---|---|---|
min_margin_hit | auto | Marže klesla pod 5% | error |
low_margin | auto | Marže mezi 5-10% | warning |
below_cost | auto | Cena pod nákupní cenou | error |
min_price_hit | guardrail | Guardrail nastavil minimální cenu | warning |
max_price_hit | guardrail | Guardrail nastavil maximální cenu | warning |
no_competition | dsl | Chybí konkurenční data | info |
rule_failed | rule | Pravidlo nevrátilo cenu | error |
final_rule_stop | rule | Zpracování zastaveno finálním pravidlem | info |
API Endpoint: /api/pricing-tags
GET /admin/api/pricing-tags?domain=parfum-zentrum.de
GET /admin/api/pricing-tags?domain=xxx&tag=min_margin_hit
GET /admin/api/pricing-tags?domain=xxx&product_id=123
GET /admin/api/pricing-tags?global=1
{
"success": true,
"type": "domain_stats",
"percentages": {
"total_products": 1250,
"tags": [
{"tag": "min_margin_hit", "count": 125, "percentage": 10.0, "severity": "error"},
{"tag": "low_margin", "count": 187, "percentage": 15.0, "severity": "warning"},
{"tag": "no_competition", "count": 312, "percentage": 25.0, "severity": "info"}
]
}
}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%
🔗 Linked Products (Propojené produkty)
Automatická cenotvorba pro varianty, testery a související produkty na základě ceny master produktu.
Typické use cases:
- Varianty: Různé odstíny make-upu se stejným regcis → stejná cena
- Odstíny (shade): Dermacol Make-Up Cover 208/211/213 → stejná cena (detekce: rada+objem+charakter)
- Testery: Tester parfému = 70% ceny plné verze
- Velikostní varianty: 30ml vs 100ml ve stejné kolekci → interpolace ceny
- Gift sety: Dárková sada = 115% ceny hlavního produktu
- Travel size: Cestovní balení = proporcionální cena podle objemu
regcis, id_kolekce, charakter+kolekce+objem, nebo rada+objem+charakter.
| Proměnná | Typ | Popis |
|---|---|---|
dsl.linked.is_linked | boolean | Je produkt linkovaný? |
dsl.linked.role | string | "master" | "linked" | "variant" |
dsl.linked.link_type | string | variant | tester | gift_set | travel_size | refill | bundle |
dsl.linked.master.price | number | Cena master produktu (bez DPH) |
dsl.linked.master.id | string | ID master produktu |
dsl.linked.master.name | string | Název master produktu |
dsl.linked.master.volume | number | Objem mastera (ml) |
dsl.linked.suggested_price | number | Předpočítaná suggested cena |
dsl.linked.master_price | number | Zkratka pro master.price |
dsl.linked.master_price_czk | number | Master price v CZK |
dsl.linked.master_price_eur | number | Master price v EUR |
dsl.linked.variants | array | Pole variant produktů |
dsl.linked.variant_count | number | Počet variant |
dsl.linked.min_variant_price | number | Nejnižší cena varianty |
dsl.linked.max_variant_price | number | Nejvyšší cena varianty |
dsl.linked.avg_variant_price | number | Průměrná cena variant |
dsl.linked.size_variants | array | Velikostní varianty s id, name, volume, price, price_per_ml |
dsl.linked.smaller_size | object | Nejbližší menší varianta (volume, price) |
dsl.linked.larger_size | object | Nejbližší větší varianta (volume, price) |
dsl.linked.smaller_price | number | Cena menší varianty (pro DSL) |
dsl.linked.larger_price | number | Cena větší varianty (pro DSL) |
dsl.linked.testers | array | Pole testerů (pokud jsme master) |
dsl.linked.linked_count | number | Celkový počet linkovaných produktů |
dsl.linked.modifier_type | string | same | percentage | fixed | formula |
dsl.linked.modifier_value | number | Hodnota modifikátoru (např. 0.70 pro 70%) |
dsl.linked.shade_variants | array | Odstínové varianty (stejná řada, objem, charakter) |
dsl.linked.shade_count | number | Počet odstínů (např. 12 pro Dermacol Make-Up Cover) |
dsl.linked.detected_via | array | Jak byl link detekován: ["product_links", "regcis", "kolekce", "charakter_kolekce", "rada_shade"] |
Příklady DSL pravidel
rada + objem + charakter.["if",
["and",
["var", "dsl.linked.is_linked"],
[">", ["var", "dsl.linked.shade_count"], 0]
],
["var", "dsl.linked.suggested_price"],
["*", ["var", "dsl.price_buy"], 1.3]
]["if",
["and", ["var", "dsl.linked.smaller_price"], ["var", "dsl.linked.larger_price"]],
["var", "dsl.linked.suggested_price"],
["if",
["var", "dsl.linked.larger_price"],
["*", ["var", "dsl.linked.larger_price"], 0.8],
["*", ["var", "dsl.price_buy"], 1.3]
]
]["if", ["var", "dsl.linked.is_linked"], ["var", "dsl.linked.master.price"], ["*", ["var", "dsl.price_buy"], 1.3] ]
["if", ["==", ["var", "dsl.linked.link_type"], "tester"], ["*", ["var", "dsl.linked.master.price"], 0.70], ["*", ["var", "dsl.price_buy"], 1.3] ]
suggested_price automaticky vypočítanou z master + modifier.["if", ["var", "dsl.linked.suggested_price"], ["var", "dsl.linked.suggested_price"], ["*", ["var", "dsl.price_buy"], 1.3] ]
["if",
["==", ["var", "dsl.linked.link_type"], "tester"],
["max",
["*", ["var", "dsl.linked.master.price"], 0.70],
["*", ["var", "dsl.price_buy"], 1.15]
],
["*", ["var", "dsl.price_buy"], 1.3]
]["if",
["not", ["var", "dsl.linked.is_linked"]],
["*", ["var", "dsl.price_buy"], 1.3],
["if",
["==", ["var", "dsl.linked.link_type"], "variant"],
["var", "dsl.linked.master.price"],
["if",
["==", ["var", "dsl.linked.link_type"], "tester"],
["*", ["var", "dsl.linked.master.price"], 0.70],
["if",
["==", ["var", "dsl.linked.link_type"], "travel_size"],
["*", ["var", "dsl.linked.master.price"], 0.40],
["var", "dsl.linked.suggested_price"]
]
]
]
]Řetězení pravidel (Rule Chaining)
💡 Jak to funguje: Pravidla běží v pořadí podle priority. Pokud pravidlo 1 vypočítá cenu,
je tato cena dostupná v pravidle 2 jako dsl.previous_price. Pravidlo 2 může tuto cenu modifikovat
nebo ignorovat a počítat úplně novou cenu.
["*", ["var", "dsl.price_buy"], 1.3]
["if", ["var", "dsl.previous_price"], ["+", ["var", "dsl.previous_price"], ["var", "dsl.bonus_marze"]], null ]
["if", ["var", "dsl.previous_price"], ["*", ["var", "dsl.previous_price"], 1.1], null ]
["if", ["var", "dsl.previous_price"], ["+", ["var", "dsl.previous_price"], 50], ["*", ["var", "dsl.price_buy"], 1.4] ]
Použití: Zaškrtněte "Toto je finální pravidlo" v editoru pravidla.
Typický scénář:
- Pravidlo 1 (priorita 10): Základní cenotvorba
- Pravidlo 2 (priorita 20): Modifikátor pro speciální produkty
- Pravidlo 3 (priorita 30, finální): Výjimky/guardrails - ZASTAVÍ řetězec
Jak vytvořit linky
1. regcis (EAN): Produkty se stejným regcis = tester/master
2. id_kolekce: Produkty ve stejné kolekci = velikostní varianty
3. charakter + kolekce + objem: Tester má v
charakter slovo "tester" + stejná kolekce/objem jako master4. rada + objem + charakter: Odstínové varianty (např. Dermacol Make-Up Cover 208, 211, 213...)
Není potřeba nic nastavovat - systém detekuje automaticky.
Size variants: Pro produkty v kolekci jsou automaticky vypočítány:
•
smaller_price - cena nejbližší menší varianty•
larger_price - cena nejbližší větší varianty•
suggested_price - interpolace mezi nimiShade variants: Pro odstínové varianty:
•
shade_variants - pole všech odstínů•
shade_count - počet odstínů (např. 12)•
suggested_price - průměrná cena odstínů
POST /api/product-links
{
"master_product_id": "MASTER-001",
"linked_product_id": "TESTER-001",
"link_type": "tester",
"modifier_type": "percentage",
"modifier_value": 0.70
}| Link Type | Popis | Modifier | Příklad |
|---|---|---|---|
variant | Barevná/velikostní varianta | same | Make-up odstíny |
shade | Odstínová varianta (detekce: rada+objem+charakter) | same | Dermacol Make-Up Cover 208/211/213 |
tester | Tester produktu | percentage: 0.70 | Tester parfému |
gift_set | Dárková sada | percentage: 1.15 | Vánoční set |
travel_size | Cestovní balení | percentage: 0.40 | 30ml verze 100ml |
refill | Náhradní náplň | percentage: 0.80 | Refill cartridge |
bundle | Balíček produktů | fixed: -50 | Duo pack |