code DSL Syntaxe

Základní pravidla pro správnou syntaxi Domain Specific Language.

keyboard Základní syntaxe
SYNTAX

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.3
functions Formát operátorů
SYNTAX

První 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]
data_object Formát proměnných
SYNTAX

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}
account_tree Vnořené výrazy
SYNTAX

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]
]

difference 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.

data_object Objektový formát { }
RULE / GUARDRAIL BODY

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] }
}

key Klíče v {} formátu:

if, then, else, set_price, set_min_price, set_max_price, keep_price, reject

data_array Array formát [ ]
FILTER / CONDITION / CALCULATION

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"]
]

functions Operátory v [] formátu:

>, <, ==, !=, and, or, not, in, exists, +, -, *, /, var, if

compare Kde použít který formát
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]
school Kompletní příklad: Rule s Filter Expression
KOMPLETNÍ RULE

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_alt Filter Expression (pole "Filter Expression")

["and",
  ["==", ["var", "dsl.product.brand"], "Nina Ricci"],
  [">", ["var", "dsl.competition_count"], 0]
]
→ Vrací: true nebo false

code 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]
  }
}
→ Vrací: akci (nastavení ceny)

filter_alt Filter Expressions

Filtry určují, zda se pravidlo nebo strategie vůbec spustí pro daný produkt. Vrací true/false.

inventory_2 Filtr na dostupnost
FILTER

Pravidlo se použije pouze když je skladem více než 3 ks

[">", ["var", "dsl.stock_level"], 3]

Použité proměnné:

dsl.stock_level

check_circle Výsledek:

true pokud stock_level > 3, jinak false

groups Filtr na konkurenci
FILTER

Pravidlo se použije pouze když je nalezena konkurence

[">", ["var", "dsl.competition_count"], 0]

Použité proměnné:

dsl.competition_count

check_circle Výsledek:

true pokud je nalezen alespoň 1 konkurent

category Filtr na kategorii
FILTER

Pravidlo se použije pouze pro konkrétní kategorii produktu

["==", ["var", "dsl.product.category"], "Elektronika"]

Použité proměnné:

dsl.product.category

check_circle Výsledek:

true pokud kategorie = "Elektronika"

payments Filtr na cenové pásmo
FILTER

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é:

dsl.price_buy

check_circle Výsledek:

true pokud 100 < nákupní cena < 1000 Kč

filter_list Kombinovaný filtr
FILTER

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é:

dsl.stock_level dsl.competition_count

check_circle Výsledek:

true pokud je na skladě ANI existuje konkurence

branding_watermark Filtr na značku
FILTER

Pravidlo se použije pouze pro vybranou značku

["in", ["var", "dsl.product.brand"], ["Apple", "Samsung", "Sony"]]

Použité proměnné:

dsl.product.brand

check_circle Výsledek:

true pokud značka je Apple, Samsung nebo Sony

auto_awesome Smart Templates - Cenová Pravidla

Kompletní pravidla pro výpočet prodejní ceny. Vrací číselnou hodnotu (cenu v Kč).

calculate Pevná marže 30%
RULE

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é:

dsl.price_buy

check_circle Příklad:

Nákup 373,37 Kč → Prodej 485,38 Kč (marže 112,01 Kč = 30%)

trending_down Podražit konkurenci o 10 Kč
RULE

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é:

dsl.competition.lowest_price amount (operátor)

check_circle Příklad:

Nejlevnější konkurent 438,02 Kč → Prodej 428,02 Kč | V EUR projektu: automaticky převede 10 CZK → ~0.40 EUR

fork_right Podmíněná cena s fallbackem
RULE

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é:

dsl.competition_count dsl.competition.lowest_price dsl.price_buy amount (operátor)

check_circle Příklad:

S konkurencí (20 konkurentů): 438,02 Kč → 428,02 Kč | Bez konkurence: 373,37 Kč → 466,71 Kč (marže 25%)

straighten Cena s min/max limitem
RULE

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é:

dsl.price_buy amount (operátor)

check_circle Příklad:

Nákup 100 Kč → 200 Kč (min) | Nákup 1000 Kč → 1000 Kč (max) | V EUR: limity se převedou

inventory Dynamická cena dle skladu
RULE

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é:

dsl.stock_level dsl.price_buy

check_circle Příklad:

Sklad 3 ks: 100 Kč → 135 Kč | Sklad 10 ks: 100 Kč → 125 Kč

trending_up Standardní marže
RULE

Použít předdefinovanou úroveň marže "std" (např. 30%)

["margin-level", "std"]

Použité proměnné:

dsl.price_buy config.margin_levels.std

check_circle Příklad:

Nákup 100 Kč → 130 Kč (pokud std = 30%)

analytics Průměrná cena konkurence
RULE

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é:

dsl.competition.avg_price

check_circle Příklad:

Průměr konkurence 505,62 Kč → Prodej 490,45 Kč (3% úspora)

account_tree Komplexní strategie
RULE

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é:

dsl.stock_level dsl.competition.lowest_price dsl.price_buy

check_circle Příklad:

Sklad 15 ks: 500 Kč → 485 Kč | Sklad 7 ks: 500 Kč → 490 Kč | Sklad 2 ks: 100 Kč → 130 Kč

emoji_events První na trhu, min. 10% marže
RULE

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é:

dsl.competition.lowest_price dsl.price_buy

check_circle Příklad:

Konkurent 500 Kč, nákup 400 Kč → 495 Kč (10% zachováno) | Konkurent 200 Kč, nákup 100 Kč → 195 Kč

groups Marže +10% při vysoké konkurenci
RULE

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é:

dsl.competition_count dsl.price_buy

check_circle 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)

balance Median při <= 3 konkurentech
RULE

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é:

dsl.competition_count dsl.competition.median_price dsl.price_buy

check_circle 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%)

tune Median s marží 10-40%
RULE

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é:

dsl.competition.median_price dsl.price_buy

check_circle 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%)

percent Margin 25% (ne markup!)
RULE

Nastavit cenu s 25% marží (profit / prodejní cena). Pozor: marže ≠ markup!

["/", ["var", "dsl.price_buy"], 0.75]

Použité proměnné:

dsl.price_buy

check_circle Výpočet:

Nákup 100 Kč → Prodej 133.33 Kč → Marže: 25% | Markup: 33.33%

trending_up Markup 25% (ne marže!)
RULE

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é:

dsl.price_buy

check_circle Výpočet:

Nákup 100 Kč → Prodej 125 Kč → Marže: 20% | Markup: 25%

rocket_launch Vysoký markup 300%
RULE

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é:

dsl.price_buy

check_circle Výpočet:

Nákup 100 Kč → Prodej 400 Kč → Marže: 75% | Markup: 300%

psychology Podmíněná marže/markup logika
RULE

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é:

dsl.price_buy

check_circle Příklad:

Nákup 300 Kč → 450 Kč (50% markup) | Nákup 800 Kč → 1142.86 Kč (30% marže)

security Guardrails - Ochranné Limity

Ochranné podmínky které musí být splněny. Vrací true/false, ovlivňuje zda se cena použije.

shield Minimální marže 15%
GUARDRAIL

Zajistit, že marže je vždy alespoň 15%

[">", ["margin-%"], 15]

Použité proměnné:

margin-% dsl.price_buy

check_circle Výsledek:

true pokud marže >= 15%, cena se použije

price_check Maximální cena 5000 Kč
GUARDRAIL

Zajistit, že cena nepřekročí 5000 Kč. 💱 Používá amount pro absolutní limit.

["<=", ["var", "dsl.price_new"], ["amount", 5000, "CZK"]]

Použité proměnné:

dsl.price_new amount (operátor)

check_circle Výsledek:

true pokud nová cena <= 5000 Kč | V EUR projektu: <= ~205.76 EUR

attach_money Minimální marže 50 Kč
GUARDRAIL

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é:

dsl.price_new dsl.price_buy amount (operátor)

check_circle Výsledek:

true pokud (prodej - nákup) >= 50 Kč | V EUR: >= ~2.06 EUR

compare_arrows Max změna o 10%
GUARDRAIL

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é:

dsl.price_new dsl.price_current

check_circle Výsledek:

true pokud nová cena je v rozmezí 90% - 110% aktuální ceny

warehouse Pouze když je skladem
GUARDRAIL

Nastavit cenu pouze když je produkt na skladě

[">", ["var", "dsl.stock_level"], 0]

Použité proměnné:

dsl.stock_level

check_circle Výsledek:

true pokud je skladem alespoň 1 ks

trending_flat Neklesnou pod konkurenci
GUARDRAIL

Zajistit, že cena nebude nižší než nejlevnější konkurent

[">=", ["var", "dsl.price_new"], ["var", "dsl.competition.lowest_price"]]

Použité proměnné:

dsl.price_new dsl.competition.lowest_price

check_circle Výsledek:

true pokud naše cena >= nejnižší cena konkurence

verified_user Kombinované ochrany
GUARDRAIL

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é:

margin-% dsl.price_new dsl.stock_level

check_circle Výsledek:

true pokud jsou splněny VŠECHNY tři podmínky

percent Max 150% nákupní ceny
GUARDRAIL

Zajistit, že cena nepřekročí 150% nákupní ceny

["<=", ["var", "dsl.price_new"], ["*", ["var", "dsl.price_buy"], 1.5]]

Použité proměnné:

dsl.price_new dsl.price_buy

check_circle Výsledek:

true pokud prodejní cena <= 1.5x nákupní cena

sell RRP jako maximum
GUARDRAIL

Zajistit, že cena nepřekročí doporučenou maloobchodní cenu (RRP)

["<=", ["var", "dsl.price_new"], ["var", "dsl.product.rrp"]]

Použité proměnné:

dsl.price_new dsl.product.rrp

check_circle Výsledek:

true pokud naše cena <= RRP (doporučená maloobchodní cena)

trending_up Maximum markup 200%
GUARDRAIL

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é:

dsl.price_new dsl.price_buy

check_circle Výsledek:

true pokud prodejní cena <= 3x nákupní cena (max 200% markup)

percent Maximum marže 60%
GUARDRAIL

Zajistit, že marže nepřekročí 60% (markup max 150%)

[">=", ["var", "dsl.price_new"], ["/", ["var", "dsl.price_buy"], 0.4]]

Použité proměnné:

dsl.price_new dsl.price_buy

check_circle Výsledek:

true pokud cena >= nákup/0.4 (60% marže = markup 150%)

balance Marže 10-50% (markup 11-100%)
GUARDRAIL

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é:

dsl.price_new dsl.price_buy

check_circle Výsledek:

true pokud marže je v rozmezí 10-50%

tune 🔍 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.

info Co jsou Guardrails a Application Modes?

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

filter_alt Praktické Filter Expression příklady z praxe

branding_watermark Značka je v seznamu (premium značky)
FILTER

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"]
]

lightbulb Use case:

Guardrail "Min marže 25%" se aplikuje jen na luxusní značky, ostatní mají běžnou marži 15%

payments Nákupní cena nižší než X
FILTER

Guardrail se aplikuje pouze na levné produkty - speciální ochrana pro nízké ceny

["<", ["var", "dsl.price_buy"], 500]

lightbulb 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á)

text_fields Název produktu obsahuje text
FILTER

Guardrail se aplikuje podle názvu produktu - např. speciální pravidla pro testery

["contains", ["var", "dsl.product.name"], "Tester"]

lightbulb Use case:

Guardrail "Max marže 20%" se aplikuje jen na testery (obvykle prodávané s nižší marží)

domain Doména je v seznamu
FILTER

Guardrail se aplikuje pouze na vybrané domény/e-shopy

["in", ["var", "dsl.domain"], 
  ["profi-parfemy.cz", "parfemy-elnino.cz"]
]

lightbulb Use case:

Guardrail "Max cena = konkurence median" jen pro domény kde je silná konkurence

inventory_2 Vysoký stav skladu
FILTER

Guardrail se aplikuje když je na skladě hodně kusů - agresivnější pricing

[">", ["var", "dsl.stock_level"], 50]

lightbulb Use case:

Guardrail "Max marže 15%" pro produkty s vysokým skladem (potřeba prodat, nižší marže OK)

category Specifická kategorie
FILTER

Guardrail se aplikuje pouze na vybranou kategorii produktů

["==", ["var", "dsl.product.category"], "Elektronika"]

lightbulb Use case:

Guardrail "Max cena změna 5%/den" jen pro elektroniku (citlivá kategorie na cenové výkyvy)

filter_list Kombinace: Premium značka + vysoká cena
FILTER

Guardrail se aplikuje jen na drahé luxusní produkty

["and",
  ["in", ["var", "dsl.product.brand"], ["Chanel", "Dior", "Gucci"]],
  [">", ["var", "dsl.price_buy"], 1000]
]

lightbulb Use case:

Guardrail "Nikdy pod RRP" jen pro luxusní produkty nad 1000 Kč

filter_list Kombinace: Doména + existuje konkurence
FILTER

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]
]

lightbulb Use case:

Guardrail "Cena max median konkurence" jen pro profi-parfemy.cz a jen když existuje konkurence

groups Existuje konkurenční cena
FILTER

Guardrail se aplikuje pouze když máme data o konkurenci

["exists", ["var", "dsl.competition.lowest_price"]]

lightbulb Use case:

Guardrail "Max cena = nejnižší konkurent + 10%" - má smysl jen když známe cenu konkurence

block Vyloučit značku / kategorii
FILTER

Guardrail se aplikuje na vše KROMĚ vybraných značek

["not", 
  ["in", ["var", "dsl.product.brand"], ["NoName", "Budget"]]
]

lightbulb Use case:

Guardrail "Min marže 20%" na vše kromě levných značek (kde stačí 10%)

summarize Shrnutí: Kdy použít Filter Expression mode
  • 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

currency_exchange 💱 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.

info Kdy používat amount vs. holé číslo?
DŮLEŽITÉ

✅ 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č)
code Syntaxe operátoru amount
SYNTAX

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)
sync Automatická konverze měn
AUTO

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)
remove Podražit o fixní částku
RULE

Odečíst 50 Kč od konkurenční ceny

["-", 
  ["var", "dsl.competition.lowest_price"], 
  ["amount", 50, "CZK"]
]

check_circle Příklad:

Konkurent 1000 Kč → 950 Kč | V EUR projektu: 1000 Kč → ~39.02 EUR, minus ~2.06 EUR = ~36.96 EUR

add Přidat premium
RULE

Přidat 100 Kč premium k nákupní ceně

["+", 
  ["var", "dsl.price_buy"], 
  ["amount", 100, "CZK"]
]

check_circle Příklad:

Nákup 500 Kč → 600 Kč (fixní přirážka)

sync_alt Cross-currency příklad
RULE

Použít EUR hodnoty v CZK projektu

["if",
  ["<", ["var", "dsl.price"], ["amount", 500, "CZK"]],
  ["amount", 20, "EUR"],
  ["var", "dsl.price"]
]

check_circle Příklad:

Pokud cena < 500 Kč, nastav na 20 EUR (~486 Kč). Jinak ponech.

vertical_align_bottom Minimum s amount
RULE

Větší z: marže 30% nebo minimálně 150 Kč

["max",
  ["*", ["var", "dsl.price_buy"], 1.3],
  ["amount", 150, "CZK"]
]

check_circle Příklad:

Nákup 100 Kč: max(130, 150) = 150 Kč | Nákup 200 Kč: max(260, 150) = 260 Kč

payments Podporované měny
30+ MĚN
Hlavní měny: CZK (default), EUR, USD, PLN, GBP, CHF, SEK, NOK, DKK, HUF, RON, BGN, HRK, RUB
Další: AUD, CAD, JPY, CNY, BRL, INR, KRW, MXN, ZAR, TRY, IDR, THB a další...
Kurzy z ČNB kurzovního lístku, aktualizace denně.

functions 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)

analytics 🏷️ 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

  1. Při každém přecenění produktu se smažou staré tagy
  2. Automatické tagy se přidávají podle výsledků (guardrails, marže, chyby)
  3. Ruční tagy lze přidat pomocí DSL operátoru ["tag", "název"]
  4. Statistiky jsou dostupné přes API endpoint /api/pricing-tags

code DSL Operátor: tag

label Základní použití
SYNTAX
Přidá diagnostický tag k produktu.
["tag", "název_tagu"]
["tag", "název_tagu", "popis"]
Vrací true, lze použít v podmínkách.
rule Podmíněný tag
PŘÍKLAD
Tag se přidá pouze když je splněna podmínka.
["if",
  ["<", ["var", "dsl.margin_pct"], 10],
  ["tag", "low_margin", "Marže pod 10%"],
  null
]
bookmark_add Tag v pravidle
RULE
Kombinace tagu a výpočtu ceny pomocí and.
["if",
  ["not", ["var", "dsl.competition.lowest_price"]],
  ["and",
    ["tag", "no_competition"],
    ["*", ["var", "dsl.price_buy"], 1.5]
  ],
  ["var", "dsl.competition.lowest_price"]
]
Pokud chybí konkurence → přidá tag + počítá fallback cenu.
bookmarks Více tagů najednou
ADVANCED
Každá větev může přidat jiný tag.
["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"]
  ]
]

auto_awesome Automatické tagy

bolt Tagy přidávané automaticky systémem
Tag Zdroj Popis Severity
min_margin_hitautoMarže klesla pod 5%error
low_marginautoMarže mezi 5-10%warning
below_costautoCena pod nákupní cenouerror
min_price_hitguardrailGuardrail nastavil minimální cenuwarning
max_price_hitguardrailGuardrail nastavil maximální cenuwarning
no_competitiondslChybí konkurenční datainfo
rule_failedrulePravidlo nevrátilo cenuerror
final_rule_stopruleZpracování zastaveno finálním pravidleminfo

api API Endpoint: /api/pricing-tags

query_stats Statistiky domény
GET
GET /admin/api/pricing-tags?domain=parfum-zentrum.de
Vrátí: počet produktů s každým tagem, procenta, severity summary.
list Produkty s tagem
GET
GET /admin/api/pricing-tags?domain=xxx&tag=min_margin_hit
Vrátí: seznam product_id které mají tento tag, s detaily.
person_search Tagy produktu
GET
GET /admin/api/pricing-tags?domain=xxx&product_id=123
Vrátí: všechny tagy konkrétního produktu s detaily proč.
public Globální statistiky
GET
GET /admin/api/pricing-tags?global=1
Vrátí: statistiky napříč všemi doménami.
data_object Příklad odpovědi API
{
  "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"}
    ]
  }
}

data_object 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
help Rozdíl mezi Margin a Markup
IMPORTANT
Marže (Margin): Podíl zisku k prodejní ceně. Max 100%. Vzorec: (Prodej - Nákup) / Prodej × 100
Markup (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%

link 🔗 Linked Products (Propojené produkty)

Automatická cenotvorba pro varianty, testery a související produkty na základě ceny master produktu.

lightbulb Co jsou Linked Products?
CONCEPT
Linked Products umožňují automaticky odvozovat cenu produktu od jiného (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
Detekce linků: Automaticky podle regcis, id_kolekce, charakter+kolekce+objem, nebo rada+objem+charakter.
data_object DSL Proměnné pro Linked Products
VARIABLES
Proměnná Typ Popis
dsl.linked.is_linkedbooleanJe produkt linkovaný?
dsl.linked.rolestring"master" | "linked" | "variant"
dsl.linked.link_typestringvariant | tester | gift_set | travel_size | refill | bundle
dsl.linked.master.pricenumberCena master produktu (bez DPH)
dsl.linked.master.idstringID master produktu
dsl.linked.master.namestringNázev master produktu
dsl.linked.master.volumenumberObjem mastera (ml)
dsl.linked.suggested_pricenumberPředpočítaná suggested cena
dsl.linked.master_pricenumberZkratka pro master.price
dsl.linked.master_price_czknumberMaster price v CZK
dsl.linked.master_price_eurnumberMaster price v EUR
dsl.linked.variantsarrayPole variant produktů
dsl.linked.variant_countnumberPočet variant
dsl.linked.min_variant_pricenumberNejnižší cena varianty
dsl.linked.max_variant_pricenumberNejvyšší cena varianty
dsl.linked.avg_variant_pricenumberPrůměrná cena variant
dsl.linked.size_variantsarrayVelikostní varianty s id, name, volume, price, price_per_ml
dsl.linked.smaller_sizeobjectNejbližší menší varianta (volume, price)
dsl.linked.larger_sizeobjectNejbližší větší varianta (volume, price)
dsl.linked.smaller_pricenumberCena menší varianty (pro DSL)
dsl.linked.larger_pricenumberCena větší varianty (pro DSL)
dsl.linked.testersarrayPole testerů (pokud jsme master)
dsl.linked.linked_countnumberCelkový počet linkovaných produktů
dsl.linked.modifier_typestringsame | percentage | fixed | formula
dsl.linked.modifier_valuenumberHodnota modifikátoru (např. 0.70 pro 70%)
dsl.linked.shade_variantsarrayOdstínové varianty (stejná řada, objem, charakter)
dsl.linked.shade_countnumberPočet odstínů (např. 12 pro Dermacol Make-Up Cover)
dsl.linked.detected_viaarrayJak byl link detekován: ["product_links", "regcis", "kolekce", "charakter_kolekce", "rada_shade"]

rule Příklady DSL pravidel

palette Odstínové varianty - všechny odstíny stejná cena
SHADE VARIANTS
Různé odstíny make-upu (208, 211, 213, ...) mají stejnou cenu. Detekce: stejná 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]
]
straighten Cena mezi menší a větší variantou (size interpolation)
SIZE VARIANTS
Pro 75ml produkt: použij cenu mezi 30ml (595 CZK) a 100ml (1438 CZK) variantou.
["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]
  ]
]
content_copy Varianta = stejná cena jako master
VARIANT
Pokud je produkt linkovaný jako varianta, použij cenu master produktu.
["if",
  ["var", "dsl.linked.is_linked"],
  ["var", "dsl.linked.master.price"],
  ["*", ["var", "dsl.price_buy"], 1.3]
]
science Tester = 70% ceny mastera
TESTER
Tester parfému má cenu 70% hlavního produktu. Automaticky detekováno podle charakter + kolekce.
["if",
  ["==", ["var", "dsl.linked.link_type"], "tester"],
  ["*", ["var", "dsl.linked.master.price"], 0.70],
  ["*", ["var", "dsl.price_buy"], 1.3]
]
auto_fix_high Použij předpočítanou cenu
AUTOMATIC
Použij 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]
]
security Tester s minimální marží
GUARDRAIL
Tester 70% mastera, ale minimum 15% marže na nákupu.
["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]
]
account_tree Multi-type: různá logika podle typu linku
ADVANCED
Kompletní pravidlo s různou logikou pro variant, tester, travel_size a ostatní.
["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"]
      ]
    ]
  ]
]

link Ř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.

looks_one Pravidlo 1: Základní cena
PRIORITA 10
Vypočítá základní cenu jako 130% nákupní ceny.
["*", ["var", "dsl.price_buy"], 1.3]
Např. nákupní cena 100 Kč → výsledek 130 Kč
looks_two Pravidlo 2: Přidání marže
PRIORITA 20
Vezme výsledek z pravidla 1 a přidá k němu fixní částku z produktové proměnné.
["if",
  ["var", "dsl.previous_price"],
  ["+", ["var", "dsl.previous_price"], ["var", "dsl.bonus_marze"]],
  null
]
Např. previous_price 130 Kč + bonus_marze 20 Kč → výsledek 150 Kč
percent Procentuální navýšení
MODIFIER
Zvýší předchozí cenu o 10%.
["if",
  ["var", "dsl.previous_price"],
  ["*", ["var", "dsl.previous_price"], 1.1],
  null
]
alt_route Podmíněné řetězení
ADVANCED
Modifikuj pouze pokud existuje předchozí cena, jinak počítej nově.
["if",
  ["var", "dsl.previous_price"],
  ["+", ["var", "dsl.previous_price"], 50],
  ["*", ["var", "dsl.price_buy"], 1.4]
]
Pokud existuje previous_price → přidej 50 Kč, jinak → 140% nákupní ceny
flag Finální pravidlo (is_final)
STOP
Pravidlo označené jako "Finální" zastaví zpracování dalších pravidel. Jakmile finální pravidlo vypočítá cenu, žádná další pravidla se už nespustí.

Použití: Zaškrtněte "Toto je finální pravidlo" v editoru pravidla.

Typický scénář:
  1. Pravidlo 1 (priorita 10): Základní cenotvorba
  2. Pravidlo 2 (priorita 20): Modifikátor pro speciální produkty
  3. Pravidlo 3 (priorita 30, finální): Výjimky/guardrails - ZASTAVÍ řetězec

add_link Jak vytvořit linky

auto_mode Automatická detekce
AUTO
Linky se automaticky detekují podle:

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 master
4. 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 nimi

Shade 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ů
api Explicitní linky (API)
MANUAL
Pro přesnou kontrolu použijte API:
POST /api/product-links
{
  "master_product_id": "MASTER-001",
  "linked_product_id": "TESTER-001",
  "link_type": "tester",
  "modifier_type": "percentage",
  "modifier_value": 0.70
}
category Typy linků a doporučené modifikátory
Link Type Popis Modifier Příklad
variantBarevná/velikostní variantasameMake-up odstíny
shadeOdstínová varianta (detekce: rada+objem+charakter)sameDermacol Make-Up Cover 208/211/213
testerTester produktupercentage: 0.70Tester parfému
gift_setDárková sadapercentage: 1.15Vánoční set
travel_sizeCestovní balenípercentage: 0.4030ml verze 100ml
refillNáhradní náplňpercentage: 0.80Refill cartridge
bundleBalíček produktůfixed: -50Duo pack