Akce a slevy¶
Stav k 2026-06-21
Akce jsou slevové kampaně na produkty nebo kategorie. Výsledek se ukládá denormalizovaně přímo na produkt (akce_id, akce_procent), kde ho přečte MariaDB funkce cena_eshop().
Tabulky¶
eshop_akce — definice akce¶
| Pole | Popis |
|---|---|
sleva |
% slevy |
vyrobce_id |
omezit na výrobce (0 = všichni) |
globalni |
globální akce — zasáhne všechny produkty, deaktivuje ostatní akce |
jen_skladem |
aplikovat jen na produkty s mnozstvi > 0 |
od, do |
datum platnosti |
od_zapnuto, do_zapnuto |
automaticky zapnout/vypnout v dané datum |
zobrazovat |
akce je aktivní |
souvisejicich |
počet aktuálně zasažených produktů (denormalizovaný cache) |
eshop_akce_souvisejici — produkty v akci¶
akce_id → sprodukt_id — konkrétní produkty přiřazené do akce.
eshop_akce_souvisejici_kategorie — kategorie v akci¶
akce_id → kategorie_id — kategorie přiřazené do akce; při výpočtu se rozbalují rekurzivně (funkce vrat_potomky_id()). Akce na kategorii zasáhne všechny podkategorie.
Finální seznam produktů = UNION (přímo přiřazené produkty) + (produkty ve vybraných kategoriích včetně potomků).
Jak se akce zapíná¶
Akce::zapnout_akci() zapíše výsledek přímo do eshop_produkty:
UPDATE eshop_produkty SET akce_id = {id}, akce_procent = {sleva} WHERE id IN (...)
Vypnutí akce:
UPDATE eshop_produkty SET akce_id = 0, akce_procent = 0 WHERE akce_id = {id}
akce_id a akce_procent na produktu jsou denormalizovaný stav — akce se nepočítají v runtime z vazební tabulky, ale jsou předpočítány a uloženy přímo na produkt.
Globální akce¶
Globální akce (globalni = 1) deaktivuje všechny ostatní akce a nastaví slevu plošně. Výjimky:
- výrobci z
manufacturersWithoutSales()— přeskočeni (prodávají za MOC) - výrobci, kteří mohou participovat v slevových akcích (
$discountEvent = true):tamiya,foxtoys,eduard - produkty
kod LIKE 'FOX%'— vždy přeskočeny
Filtr výrobce na neglobální akci¶
Neglobální akce může mít nastavený vyrobce_id — z kategoriových produktů se vezmou jen produkty daného výrobce. Kombinace: konkrétní produkty (bez filtru výrobce) + produkty v kategoriích (s filtrem výrobce).
Nový produkt při aktivní globální akci¶
Akce::produkt_zapnout_globalni_akci($productId) — volá se při importu nového produktu, pokud je právě aktivní globální akce. Zapíše akce_id a akce_procent přímo na jeden produkt bez přepočtu celé akce. Nově naimportovaný produkt okamžitě dostane slevu globální akce.
Automatické spouštění¶
Cron volá Akce::spustit_vypnout_akce() — kontroluje, zda dnes nastalo datum od_zapnuto nebo do_zapnuto, a akci automaticky zapne nebo vypne.
Dopad na migraci do Sylius¶
Denormalizovaný stav na produktu
akce_id a akce_procent jsou uloženy přímo na produktu. Sylius počítá slevy z Promotion za runtime — denormalizace se nepoužívá. Při migraci stačí přenést definice akcí, ne stav na produktech.
Globální akce s výjimkami
Logika globální akce (přeskočit určité výrobce, přeskočit FOX produkty) nemá přímý ekvivalent v Sylius Promotion rules. Nutno implementovat custom PromotionEligibilityChecker.
Rekurzivní rozbalení kategorií
Sylius Promotion podporuje filtrování na taxon, ale rekurzivní rozbalení podkategorií není garantované — ověřit chování před migrací.