Skip to content

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_idsprodukt_id — konkrétní produkty přiřazené do akce.

eshop_akce_souvisejici_kategorie — kategorie v akci

akce_idkategorie_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í.