# PompoBundle

Bundle, který obsahuje všechny pompo customizace. Spoustu dokumentace se nachází už i přímo v jednotlivách třídách, kde 
je popsaných spousta věcí, aby bylo jasný jak to funguje.

Bundle je použit na shopech `prod/pompo` a `prod/nejhracka`, kdy na nejhračce se používá méně věcí, protože tam nejsou prodejny
a je to celkově jednodušší verze pompa.
 
Obecný popis pro `prod/pompo`
- Produkty - produkty se zakládájí a aktualizují z DataGo (pouze některé parametry a obrázky), zbytek potom upravují na e-shopu.
- Ceny - ceny se tahají z DRSu. Tahají se ceny ze specifického ceníku pro pompo.
- Sklad
  - DataGo - centrální sklad a sklad dodavatele.
  - DRS - sklad prodejen.
- Objednávky
  - DataGo - zapisují se objednávky s přepravou, tedy objednávky přes přepravce a případně rezervace na prodejně, kam je nutný 
  závoz z centrálního skladu.
  - DRS - zapisují se rezervační objednávky, rezervační objednávka s přepravou (závoz s prodejny) se zapisuje nejříve do DataGo
  a do DRSu se zapíše až ve chvíli, kdy je objednávka v DataGo přepnuta do stavu "převoz".

Obecný popis pro `prod/nejhracka`
- Produkty - stejné produkty jako na `prod/pompo`.
- Ceny - ceny se tahají z DRSu, stejně jako na `prod/pompo`, ale používá se jiný ceník, který je určen pro nejhračku.
- Sklad - nejsou prodejny, takže se tahá pouze centrální sklad a sklad dodavatele z DataGo.
- Objednávky - objednávky pouze přes přepravce, takže se zapisují do DataGo, zpětně se stahuje a aktualizuje stav objednávek.

## Popis PompoAPI

Kvůli DRS pokladnám bylo vytvořeno PompoAPI, které muselo zůstat kompatibilní se starým API, které používali na starém řešení.
Všechny routy okolo API jsou umístěny v `Controller/PompoApiController.php` a funkcionalita API je umístěna v `Util/Api/ApiUtil.php`.
Pokladny k API přistupují přes doménu `api-pompo.wpjshop.cz`, která je ručně přidaná do ingressu v kubernetes. Je tomu tak hlavně kvůli
tomu, že pokladny nějak nedávali komunikaci přes novější TLS (HTTPS), takže takhle doména běží na HTTP.
V budoucnu by třeba DRS měl být schopen provést nějakou aktualizaci na pokladnách a začít k API přistupovat přes klasickou 
doménu https://pompo.cz, ale je to asi o domluvě s DRSem.

## Specifikace

### Customizace administrace `PompoBundle/Admin`

- **Objednávky** (`Actions/UpdateDataGoOrderAction.php`) - akce, která po spuštění provede aktualizaci objednávky v DataGo.
- **Produkty** (`Actions/UpdateNejhrackaProductAction.php`) - akce, která po spuštění přenese data produktu na nejhračku. Přenesou se popisky a parametry. Komunikace probíhá pomocí GraphQL API.
- **Seznam generovaných kódů** (`lists/OrderDiscountsGeneratedCouponsList.php`) - přidáváme sloupec s prodejnou, na které byl poukaz uplatněn.
- **Seznam objednávek** (`lists/OrdersList.php`) - přidáváme custom sloupečky (ID cílové prodejny v DRSu, ID zákazníka v DRSu, datum závozu u rezervací s přepravou, odbavuje)
- **Seznam uživatelů** (`lists/UsersList.php`) - přidáváme sloupec s ID uživatele z DRSu. Zároveň se ještě rozšiřuje filtr podle ID zákazníka, aby hledal i podle DRS ID zákazníka.
- **Přidáno do hlavního menu** (`StoreManagement.php`) - správa skladů přes kterou je možné odpojit sklad - FE potom nebere v potaz skladovost odpojených skladů. V adminu v menu pod Sklad / Sklady / Správa skladů.
- **Záložky** (`Tabs`)
  - **Dopravy a platby** (`DeliveryPaymentTab.php`) - přidává záložku "Synchronizace" k dopravám a k platbám. Plní si tam mapování vůči DataGo.
  - **Způsob doručení** (`DeliveryTypeTab.php`) - přidává záložku "Synchronizace" k způsobům doručení. Plní si tam mapování vůči DRSu.
  - **Nastavení e-shopu** (`PompoSettingsTab.php`) - přidává záložku "Pompo do nastavení e-shopu, na které jsou obecná nastavení specifická pro pompo. Z téhle záložky je možné taky ručně spustit synchronizaci obrázků nebo produktů.
  - **Výrobci** (`ProducersTab.php`) - nahrání custom HTML obsahu k výrobci/sekci. Aktuálně se to už nejspíš nepoužívá, protože se to nakonec udělalo jinak.
  - **Sekce** (`SectionsTab.php`) - možnost nastavení "Neoblíbenější licence" a nahrání custom HTML obsahu k výrobci/sekci. Aktuálně se to už nejspíš nepoužívá, protože se to nakonec udělalo jinak.
  - **Prodejci** (`SellersTab.php`) - přidává záložku k prodejci. Zložka přidává ruzná nastavení okolo prodejce - mapování na DRS a DataFo, kraje, omezení... 
  - **Produkty dodavatelů** (`SuppliersTab.php`) - přidává záložku k dodavateli, kde je možné nastavit objednací dny - kdy se na straně pompa provádí objednávka k dodavateli. Slouží to primárně ke správnému výpočtu data doručení.
- **Exporty**
  - **Objednávky** (`Util/Export/OrdersExcelExport.php`) - přidáváme custom sloupečky stejně jako na `OrdersList.php`

### Přílohy `PompoBundle/Attachment`

- `ReceiptPDFAttachment.php` - účtenka k nákupu na prodejně. Je možné si ji zobrazít v účtu.
- `InvoicePDFAttachment.php` - faktura z DataGo. Posílá se v OrderSentEmail, který se posílá ze synchronizace.

### Věrnostní program `PompoBundle/BonusProgram`

Customizace okolo věrnostního programu.

- `BonusComputer.php`
- **Funkce**:
  - `createBonusPoints` - ignoruju osobní odběry, protože tam body počítám až když objednávku v synchronizaci páruju s prodejkou.
  - `activatePoints` - body se aktivujou pouze u objednávek, které jsou vyřízené (nedělám to tedy standartně po počtu X dnů).
  - `getNewPointsStatus` - všechny body jsou při vytvoření automaticky neaktivní.
- `BonusExchangeUtil.php` - customizace výměny bodů kvůli partnerským poukazům, které jsou předgenerované a tímpádem nemůžu generovat pokaždý nový.
- **Funkce**:
  - `generateUserCoupon` - pokud je výměna bodů nastavená jako partnerský kupón, tak tak najde dostupný kupón z již vygenerovaných a ten to přiděli uživateli.
- `PointEvaluator.php`
- **Funkce**:
  - `calculatePointsFromPrice` - customizace, aby se 1 bod rovnal 30 Kč

### Command `PompoBundle/Command`

- `StockSynchronizationCommand.php` - synchronizace skladu - je potřeba, aby byla synchronizace skladu rychlá a běžela prakticky furt, a k
tomu slouží tenhle command, který každou minutu spouší synchronizaci skladu (v kubernetes běží command pod, kde je tenhle command spuštěný).
Deployne se to vždycky automaticky s nasazením shopu díky `COMMAND_POD` proměnné v `.gitlab-ci.yml` na shopu.

### Controller `PompoBundle/Controller`
- `DataGoController.php` - přístupný pouze pro zalogované administrátory, obsahuje debug routy.
  - `/sync/{type}/` - spustí synchronizaci daného typu.
  - `/dump_order/{id}/` - zobrazí JSON pro zadané ID objednávky. Stejná data se potom používají při vytváření objednávky. 
- `DRSController.php` - přístupný pouze pro zalogované administrátory, obsahuje debug routy.
  - `/sync/{type}/` - spustí synchronizaci daného typu.
  - `/sync/user/{drsId}/` - spustí synchronizaci uživatele podle zadaného ID (DRS -> shop).
  - `/sync/prices/{productCode}/` - spustí synchronizaci cen pro daný produkt.
  - `/sync/pos_order/{drsId}/` - spustí synchronizaci prodejky podle ID v DRSu.
  - `/dump_order/{id}/` - zobrazí XML pro zadané ID objednávky. Stejná data se potom používají pro vytváření objednávky.
  - `/dump_user/{id}/` - zobrazí XML pro zadané ID uživatele. Stejná data se potom používají pro založení a aktualizaci zákazníka.
- `PompoApiController.php` - Základní adresa je `/_pompo/api/TenantPublicAPI/v1/{endpoint}`. Obsahuje routy přes které komunikují pokladny. Celé PompoAPI je kompatibilní se starým API od AirMe, aby 
se na straně pokladny nemuselo nic měnit. Celé API je case-insensitive, i routy.
  - `/PAAuth` - slouží k získání API tokenu podle přihlašovacího jména a hesla do administrace.
  - `/PAVouchers/UseVoucher` - uplatnění poukazu, označí poukaz jako uplatněný
  - `/PAVouchers/TryUseVoucher` - vrací stejná data jako `UseVoucher`, jen poukaz ještě neuplatní
  - `/PAVouchers/RechargeVoucher` - nastaví uplatněný poukaz jako neuplatněný, tímpádem je možné ho znovu použít
  - `/PAVouchers/{coupon}` - vrátí informace o daném poukazu, nebo 404 pokud nebyl voucher nalezen.
- `PompoController.php` - routy specifické pro pompo.
  - `/_pompo/export/oss/` - jednoduchý export produktů a jejich DPH.
  - `/_pompo/sellers/` - ajax načítání focusu s prodejnama (změna prodejny v hlavičce, na produktu...).
  - `/#account#/#user_cards#/` - seznam zákazníckých karet v uživatelském účtu.
  - `/#orderView#/{orderId}/receipt/` - PDF s účtenkou z prodejny.
  
### Customizace dropshipmentu `PompoBundle/Dropship`

- `PompoExpandoTransfer.php`
- **Funkce**:
  - `modifyInsertedOrder` - importovat objednávky jako zaplacené.

### DataGo `PompoBundle/DataGo`

Synchronizace e-shopu s DataGo. DataGo je systém pro správu hlavního skladu a expedice z něj.

Většina spouštění synchronizace je zaregistrována v `SynchronizationRegister\DataGoSynchronizationRegister.php`.

#### Synchronizace

Synchronizace je rozdělená na dvě části. Jedna část se provádí v cronech a druhá část se provádí přes synchronization eventu.
V synchronizační eventě se provádí věci, které je potřeba provádět často - objednávky a sklad. V cronu se potom provádí synchronizace
produktů z CSV, skladu z CSV a obrázků produktů.

- Objednávky - do DataGo odesíláme objednávky přes dopravce, případně objednávky se závozem na prodejnu, které se odešlou i do DRSu
potom, co se přepnou do stavu "Převoz"
  - `Synchronizers/OrderSynchronizer.php` - odesílá objednávky do DataGo a potom zpětne stahuje jejich stavy z DataGo do e-shopu.
- Sklad - z DataGo stahujeme skladovost produktů na hlavním skladu.
  - `Synchronizers/StockSynchronizer.php` - aktualizuje hlavní sklad v e-shopu podle DataGo.
    - Typ CSV (`MODE_CSV`) - sesynchronizuje sklad podle CSV souboru, který DataGo jednou za cca 20 minut aktualizuje.
    - Typ ZMĚNY (`MODE_NORMAL`) - rozdílová synchronizace, kdy si e-shop řekne o změny za posledních X vteřin a sesynchronizuje. Lze si říct o změny max 600s zpátky.
- Produkty - zakládá a aktualizuje produkty (název, kód, viditelnost, parametry...).
  - `PROCESS_TYPE_FULL` - import ze souboru, kde jsou všechny produkty - plný import, který pouze zakládá nové produkty.
  - `PROCESS_TYPE_FULL_UPDATE` - import ze souboru, kde jsou všechny produkty - plný import, který pouze aktualizuje existující produktu (aktualizuje se jen pár údajů, parametrů).
  - `PROCESS_TYPE_NEW` - import ze souboru, kde jsou pouze nové produkty za posledních několik hodin - pouze zakládá produkty
  - `PROCESS_TYPE_DIFF` - import ze souboru, kde jsou pouze změněné produkty - pouze aktualizace již existujících.
- Obrázky produktů - synchronizují se v NORMAL cronu. Synchronizují se pouze změněné obrázky, které se nejdříve načtou z API a pak stáhnou / aktualizujou.
Synchronizace obrázku jde spustit i ručně z administrace (Nastaveni e-shopu, záložka pompo).

#### Soubory

Popis souborů souvisejících s věcma okolo DataGo.

- `EventSubscriber\CronSubscriber`
  - **FREQUENT**
    - zpětná synchronizace stavů z DataGo
  - **NORMAL**
    - částečná synchronizace z CSV souborů - vytváření a aktualizace produktů, synchronizace skladu
    - synchronizace změněných obrázků
  - **EXPENSIVE**
    - plná synchronizace z CSV souborů - produkty
- `EventSubscriber\OrderSubscriber`
  - **ORDER_STORNO**
    - v případě storna objednávky provést storno i v DataGo
- `Synchronizer\OrderSynchronizer` - zapisování objednávek do DataGo a zpětné stahování stavů z DataGo do e-shopu
- `Synchronizer\ProductSynchronizer` - zakládání a aktualizace produktů 
- `Synchronizer\StockSynchronizer` - synchronizace skladu - dva typy:
  - **CSV** - synchronizace z velkého CSV souboru, který obsahuje všechny produkty a jejich sklad na centrále + sklad dodavatele
  - **JSON** - rozdílová synchronizace skladu - ptáme se vždycky na změny za posledních 10 minut a podle toho aktualizujeme hlavní sklad
- `Util\DataGoApi` - komunikace s DataGo
- `Util\PhotoDownloader` - stahování fotek
- `Util\PhotoUpdater` - aktualizace fotek

### DRS `PompoBundle/DRS`

Synchronizace e-shopu s DRSem. DRS je systém pro správu pokladen/prodejen a jejich skladu.

Pro nějakou komunikaci se připojujeme se napřímo k MSSQL databázi a pak třeba pro zápis 
objednávek, zápis uživatelů používáme SOAP API. Vešketá tahle komunikace se najde v `DRSApi.php` classe.

Konfigurace připojení se nachází v `Resources/config/parameters.yml`.

Většina spouštění synchronizace je zaregistrována v `SynchronizationRegister\DRSSynchronizationRegister.php`.

#### Synchronizace

S DRSem synchronizujeme sklady prodejen, ceny, objednávky včetně prodejek (nákupy na prodejně) a uživatelé.

- Objednávky - do DRSu jdou objednávky, které mají osobní odběr (vyzvednutí na prodejně).
Pokud je objednávka na osobní odběr, ale zboží je skladem pouze na centrálním skladě, tak
jde objednávka nejdříve do DataGo a po přepnutí do stavu "převoz" se objednávka odešle do DRSu.
  - `Synchronizers/OrderSynchronizer.php` - odesílá objednávky do DRSu a zpětně zpracovává stavy.
  - `Synchronizers/POSOrderSynchronizer.php` - zakládá prodejky do e-shopu. Použilo se to i k doimportování objednávek
  ze starého e-shopu (proto tam jsou ify na `$oldOrder`, které by mělo být možné do budoucna odebrat).
- Ceny - synchronizujeme rozdílově. V DRSu existují dvě tabulky s cenama: `PricesGlobal` - globální ceny podle měny,
a pak `PricesLocal` - ceny konkrétních shopů (mutací).
  - `Synchronizers/PriceSynchronizer.php`
- Sklad - synchronizujeme pohyby na skladech. Do tabulky `eshop.ChangedItems` (MSSQL) se nám generují čísla produktů, kde proběhl nějaký pohyb
a tuhle tabulku si potom načítáme a aktualizujeme podle ní skladovost u produktů, kde proběhl nějaký pohyb. Tahle synchronizace se spouští v
samostatném threadu (`StockSynchronizationCommand.php`).
  - `Synchronizers/StockSynchronizer.php`
- Uživatelé - synchronizujeme uživatele z e-shopu do DRSu a zároveň provádíme i zpětnou aktualizaci uživatelů z DRSu do e-shopu.
Zakládáme také nové uživatele, kteří vzniknou v DRSu, protože někdo může přijít na prodejnu a chtít věrnostní
kartu, kterou dostane a musí se mu na ní začít přičítat body. Takže i když je v DRSu uživatel s prázdným mailem,
tak na e-shopu uživatele založíme a nastavíme mu dočasný e-mail ve formátu `{drsId}@pompo.cz`.
Pokud uživateli někdy v budoucnu doplní mail v DRSu, tak se aktualizuje i na e-shopu + se uživateli odešlě e-mail
aby dokončil registraci na e-shopu (protože je potřeba nastavit heslo atd...). Další způsob registrace je, že na
e-shopu vyplní číslo zákazníka + číslo věrnostní kartičky, díky čemuž je schopen se zaregistrovat a spárovat si učet
s existujícím účtem, kde se mu už počítaly body.
  - `Synchronizers/UserSynchronizer.php` - synchronizace uživatelů do DRSu a zpětně k nám
  - `Synchronizers/UserCouponSynchronizer.php` - synchronizuje uživatelských kupónů do DRSu, aby na pokladnách viděli,
  že uživatel má tyhle kupóny a mohli mu tímpádem nabídnout jejich uplatnění

#### Soubory

Popis souborů souvisejících s věcma okolo DRSu.

- `EventSubscriber\CronSubscriber`
  - **FREQUENT**
    - Synchronizace prodejek z DRSu - vytváření nákupů na prodejně (kvůli bodům, a aby byly vidět v účtu zákazníka) a párování rezervací vytvořených na e-shopu s nákupem na prodejně.
    - Synchronizace uživatelských kupónů do DRSu - aby bylo na pokladně vidět, jaké kupóny má uživatel v účtu a případně mu tak mohli připomenout, že tam nějaký má.
  - **EXPENSIVE**
    - Synchronizace akčních cen - sesynchronizujou se ceny, u kterých bude začínat nebo končit platnost.
- `Synchronizers/OrderSynchronizer.php` - synchronizace objednávek
- `Synchronizers/POSOrderSynchronizer.php` - synchronizace prodejek 
- `Synchronizers/PriceSynchronizer.php` - synchronizace cen
- `Synchronizers/StockSynchronizer.php` - synchornizace skladu prodejen
- `Synchronizers/UserCouponSynchronizer.php` - synchronizace uživatelských kupónů
- `Synchronizers/UserSynchronizer.php` - synchronizace kupónů
- `Util/DRSApi.php` - komunikace s DRS API / databází

### E-maily `PompoBundle/Email`

Custom e-maily, které se odesílají ze synchronizace.

- `OrderInPersonReadyEmail.php` - objednávka připravena k osobnímu převzení. Odesílá DRS synchronizace když nastaven stav.
- `OrderInProgressEmail.php` - objednávka se zpracovává. Odesílá jak DRS, tak DataGo synchronizace.
- `OrderNotCompleteEmail.php` - objednávka je nekompletní. Objednavka je pripravena k osobnimu prevzeti, ale neni kompletni, protoze nejake zbozi chybi.
- `OrderSentEmail.php` - objednávka odeslána. Odesíla DataGo synchronizace, když byla objednávka poslána dopravcem.
- `OrderShopTransportEmail.php` - objednávka se převáží na prodejnu. Odesílá  DataGo synchronizace, když nastane stav "převoz".
- `UserPOSRegistrationEmail.php` - zákazník se registroval na prodejně a je potřeba, aby dokončil registraci na e-shopu. Posílá DRS synchronizace uživatelů.

### EventSubscribers `PompoBundle/EventSubscriber`

- `Ordering`
  - `CartSubscriber.php`
  - **Funkce**:
    - `checkItemsStock` - kontrola skladovosti v DataGo nebo v DRSu před odesláním objednávky, abych si nemohl objednat např. produkt, který jsem dal do košíku, ale mezitím ho někdo koupil na prodejně a nestihlo se to ještě přenést na shop.
  - `DeliveryCheckSubscriber.php` - validace doprav.
  - **Funkce**:
    - `checkDelivery` - validace košíku vůči dopravě, zda se třeba nesnažím rezervovat zboží, které není dostupné na centrálním skladě a vybrané prodejně.
    - `checkZasilkovnaDelivery` - vlastní validace zásilkovny, přes kterou umožnují poslat pouze jednokusovou zásilku.
  - `InvoicesOrderEventSubscriber.php` - nastavení fakturační řady pro Slovensko.
  - `OrderingCronSubscriber.php` - customizace notifikace nezaplacených objednávek.
  - `OrderItemInfoSubscriber.php` - zobrazení poznámky u objednané položky - výběr varianty formou textového pole.
  - `OrderSubscriber.php`
  - **Funkce**:
    - `doOrderSplit` - rozdělení objednávky na rezervační objednávku a rezervaci se závozem.
    - `logDeliveryDate` - zaloguje k objednávce s osobním odběrem datum vyzvednutí, který se zobrazoval v košíku.
    - `setOrderType` - uloží k objednávce typ (rezervace, rezervace s přepravou, dopravce) a zároveň nastaví flag objednávce.
  - `PurchaseStateSubscriber.php`
    - `purchaseStateCreated` - nafetchuje skladové dostupnosti k jednotlivým produktům, abych v košíku mohl správně zobrazovat, co je skladem, co je potřeba zavézt na prodejnu, co skladem není...
- `ProductList/CatalogSubscriber.php` - nafetchovaní informací o skladech na ProductList.
- `User`
  - `UserSubscriber.php`
    - po zaregistrování uživatele se provede synchronizace s DRSem - pokud se uživatel registroval na prodejně, tak se díky tomu rovnou dotáhnou data k němu.
    - vygenerování zákaznícké karty u nové registrovaného uživatele.
- `CronSubscriber.php` - generování narozeninových poukazů, odesílaní notifikací o docházejících poukazech.

### Custom triggery pro slevy `PompoBundle/Ordering`

- `Triggers/POSTrigger.php` - podmínka, která umožní slevu uplatnit na pokladně. Uplatnění na pokladně == uplatnění slevy přes vlastní API (PompoAPI).
- `Triggers/TransportChargeTrigger.php` - podmínka, která říká, zda se má v košíku učtovat manipulační poplatek - pokud je to odběr na prodejně, kam se musí provést závoz.

### Smarty plugins `PompoBundle/Resources/smarty_plugins`

- `function.get_delivery_date_incremented.php` - vrací předpokládáný datum doručení pro produkt a dopravu, nebo pro celý košík a konkrétní dopravu.
- `function.get_drs_customer_id.php` - vrátí ID uživatele v DRSu podle e-shopového ID uživatele.
- `function.get_dynamic_filter.php` - vytvoří prázdnej dynamic filter, abysme byli schopni vytvořit formulář pro výběr hračky na homepage. 
- `function.get_formatted_receipt.php` - zformátuje účtenku z DRSu, aby vypadalo aspoň trochu normálně v PDF, kde ji zobrazujeme. 
- `function.get_pompo_content.php` - vrací cestu ke custom contentu pro sekci nebo výrobce. Pravděpodobně se nepoužívá, protože se to později vyřešilo jinak. 
- `function.get_pompo_delivery_charge.php` - vrací cenu manipulačního polatku, která je pevná a je potřeba ji zobrazovat v košíku u osobních odběrů, kde je potřeba provést závoz z centrálního skladu.
- `function.get_pompo_product_availability.php` - vytáhne dostupnost z ProductPurchaseItemu, která by tam měla být nafetchovaná z PurchaseStateEventy.
- `function.get_pompo_sellers.php` - vrátí všechny prodejny, ke kterým to nafetchuje i potřebné info (dostupnost, datum doručení) a zároveň to ještě prodejny zgroupuje podle krajů.
- `function.get_price_action_end_date.php` - vrací datum konce platnostni akční ceny.
- `function.get_product_deliverytime_info.php` - vrací skladové informace o produktu. Používá se to na detailu produktu, abysme správně zobrazili zda je skladem online, zda je skladem na moji prodejně, jiné prodejně, u dodavatele...
- `function.get_reservation_order.php` - vrací druhou (rezervační) objednávku, která vznikla při rozdělení objednávek.
- `function.get_section_licences.php` - vrací licence pro danou sekci. V administraci lze u každé sekce nastavovat "Neoblíbenější licence".

### Utility `PompoBundle/Util`

Pomocné funkce a předefinování některých engine servis.

- `Api/ApiUtil.php` - veškeré logika, která se týká **PompoAPI**, se kterým komunikují DRS poklady. Používá se kvůli uplatnění poukazů na pokladně.
  - `auth` - pokladna volá auth metodu, aby získala Bearer token pro komunikaci s API.
  - `useVoucher` - použítí voucheru a zároveň "zkouška" (try) použítí, která voucher ještě neuplatní, ale vrátí stejná data, jako kdyby ho uplatnila.
  - `rechargeVoucher` - reaktivuje kupón - změní stav z Uplatněno na Neuplatněno.
- `Email/Preprocessor.php` - u e-mailu pro dokončení registrace potřebuju přidávat na konec URL #user-register-form, aby se zascrollovalo na formulář.
- `Export/OSSExport.php` - custom export pro OSS, aby si mohli opravit v DataGo CN kódy. Pravděpodobně ho už nepoužívájí, protože by už neměl být potřeba.
- `Import/PompoImport.php` - import dat před spuštěním, jinak se nikde nepoužívá. Už by neměl být potřeba.
- `Incomaker` - customizace Incomakeru
  - `PompoContactXMLElement.php` - customizace kvůli věrnostním kartám a dětem, aby se odesílaly i do Incomakeru.
  - `PompoProductXMLElement.php` - customizace kvůli flagům u produktu, protože do Incomakeru chceme posílat víc flagů než se posílá v defaultu.
- `Order` - úpravy týkající se objednávek
  - `OrderInfo.php` - předefinovaná `OrderInfo.php` z `OrderingBundle`, kde je akorát upravená metoda `getDeliveryDate`, aby se datum doručení vracel správně
  na základě customizací okolo data doručení.
  - `OrderSynchronizerTrait.php` - společné funkce pro synchronizaci objednávek (DRS a DataGo společné funkce).
- `Ordering` - úpravy a customizace týkající se objednávání (košík, objednávka, datum doručení)
  - `OrderingUtil.php` - obsahuje všechny věci, které se týkají košíku (dostupnosti, validace, datum doručení...). Hodně dokumentace se najde přimo uvnitř třídy.
  - **Funkce**:
    - `orderSplitTransportReservation` - rozdělí objednávku typu ORDER_TRANSPORT_RESERVATION na dvě objednávky.
    - `getOrderType` - vrátí typ objednávky podle objednávky.
    - `getPurchaseStateOrderType` - vrátí typ objednávky pro PurchaseState. 
    - `fetchPurchaseStateProductsAvailability` - načte skladovou dostupnost k produktům v purchase statu. Například: skladem, potřeba zavézt na prodejnu, není skladem... 
    - `validatePurchaseStateByDelivery` - zvaliduje PurchaseState. Validace na straně e-shopu, že je pro dopravu/prodejnu vše skladem.
    - `fetchSellersCartInfo` - načte skladovou dostupnost k jednotlivým prodejnám na základě produktů v purchase statu, abych u prodejny mohl zobrazit, zda je všechno v košíku na 
   dané prodejně dostupné, je potřeba závoz, není dostupné nebo třeba zda si můžu všechno v košíku vyzvednout na prodejně ve stejný čas, nebo se musí nějaká část zavézt.
   Zároveň si k prodejnám načtu a uložim datum doručení, který je potřeba počítat právě i na základě dostupnosti.
    - `getSellerAvailability` - vrátí konstantu, která určitě dostupnost pro konkrétní prodejnu. Funkci musím předat hodnoty skladu a počet kusů pro které chci dostupnost vrátit. 
    - `getPurchaseStateProducts` - načte k produktům v purchase statu potřebné informace (skladovosti podle mojí prodejny).
    - `isOrderInPerson` - vrací, zda je objednávka na osobní odběr nebo ne.
    - `isTransportChargeInOrder` - vrací, zda je v objednávce obsažen "Manipulační příplatek" - za převoz na prodejnu.
    - `getOrderSeller` - vrátí prodejnu pro danou objednávku (prodejna vybraná v košíku při tvorbě objednávky).
    - `getPurchaseStateProductsGrouped` - kvůli variantám, které jsou dělané pouze přes poznámku se může stát, že v košíku jsou dva a více stejných produktů, jen s jinou poznámkou.
    V purchase statu se potom všechny tváří jako samostatné produkty, ale pro ProductList a skladovost je to furt stejný produkt, takže to v některých případech potřebuju zgroupovat
    do jedné položky, a k tomu přesně slouží tahle funkce.
    - `copyOrderItem` - zkopíruje položku objednávky do jiné objednávky.
    - `getSellerDeliveryDate` - spočítá datum doručení pro prodejnu (prodejce) na základě dostupnosti a dalších nastavení, které je v administraci možné provést.
    - `getSellerClosestShipmentDate` - vrací nejbližší datum závozu z centrálního skladu na prodejnu. Závozy prodejen se nastavují v administraci u konkrétní prodejny. 
    - `checkPurchaseStateStockDataGo` - zvaliduje skladovost produktu vůči DataGo. Před odesláním objednávky se ještě provádí online kontrola skladovosti.
    - `checkPurchaseStateStock` - zvaliduje skladovost vůči DRSu a DataGo.Před odesláním objednávky se ještě provádí online kontrola skladovosti.
    - `getPurchaseItemKey` - vrací ID PurchaseItemu složené z ID produktu a ID varianty.
    - `getDaysOfWeek` - pomocná funkce, která vrací dny v týdnu.
    - `activateSeller` - pomocná funkce, která slouží k aktivaci konkrétní prodejny.
  - `OrderType.php` - třída která obsahuje pouze konstanty s typem objednávky.
  - `ProductAvailability.php` - třída která obsahuje pouze konstanty s typem dostupnosti.
- `User` - utility, které souvisejí s uživatelem.
  - `PompoUserUtil.php` - pomocná utilita pro nějaké custom fce okolo uživatele.
  - **Funkce**:
    - `generateBirthdayDiscountCoupons` - funkce, která uživatelům generuje narozeninové kupóny. Každý uživatel může mít v účtu přidané
    svoje děti a pokud nějaké dítě má narozeniny, tak se 14 dní dopředu vygeneruje narozeninový poukaz.
      - `synchronizeRegisteredUser` - metoda, která natvrdo natáhne k uživateli data z DRSu.
      - `getDaysParameter` - pomocná funkce při generování poukazů. Vrací pole s datumama dnů ode dneška až po den za 14 dní.
      - `getNextYearDays` - pomocná funkce, která vrací mezi dneškem a datem za 14 dnů všechny dny, které jsou v dalším roce. Používá se při generování poukazů abych správně generoval u konce roku.
      - `getDatePeriod` - vrací datumy ode dneška až po datum za 14 dní.
      - `getBirthdayDiscountIdByLanguage` - vrací ID generovaného poukazu podle jazyka.
  - `UserCardUtil.php` - utilita, které slouží pro práci s věrnostníma kartama.
  - **Funkce**:
    - `getUserCards` - vrací všechny věrnostní kartičky daného uživatele.
    - `generateUserCard` - vygeneruje novou věrnostní kartu k danému uživateli.
    - `generateCardCode` - vygeneruje kód, který se potom přiřadí k nově vytvořené kartě.
- `Watchdog` - customizace hlídacího psa
  - `PompoWatchdog.php` - předefinováváme `getInStoreField` tak, aby se pro hlídacího psa brala v potaz pouze skladovost z centrálního skladu.
- `Configuration.php` - třida s konfigurací, která je načtená z YML konfigurace + obsahuje pomocné funkce pro získaní některých informací z konfigurace.
- `OrdersListFilter.php` - předefinovaný `OrdersListFilter.php` z jádra kvůli filtrování podle kódu objednávky. Z kódu objednávky se zkouší oříznout první znak.
- `PompocontentUtil.php` - slouží pro práci s custom HTML obsahem, který se připravoval pro sekce a výrobce. Nakonec se to nepoužilo, takže aktuálně by se to nemělo nikde používat.
- `PompoGraphQLClient.php` - slouží pro přenos dat na `prod/nejhracka` pomocí našeho GraphQL API.
- `PompoLogger.php` - slouží pro logování chyb do ActivityLogu, případně do Sentry.
- `PompoUtil.php` - pomocné funkce pro obecné věci týkající primárně synchronizace.
- **Funkce**:
  - `getDataGoCredentialsByOrder` - vrací jméno a heslo pro zápis objednávek do DataGo, protože každá prodejna nebo jazyková mutace má jiné údaje.
  - `getDataGoDefaultCredentials` - vrací výchozí jméno a heslo pro zápis objednávek podle jazykové mutace.
  - `recalculateStores` - přepočítání skladu. Přenese sklad ze `stores_items` na produkt, aby seděla zásoba podle `stores_items`.
  - `getIgnoredStores` - vrací sklady, které se mají ignorovat. Nemá se přenášet jejich skladovost na produkt.
  - `synchronizeDataGoProducts` - spustí synchronizaci produktů s DataGo.
  - `synchronizeDataGo` - spustí synchronizaci zadaných typů s DataGo.
  - `synchronizeDRS` - spustí synchronizaci zadaných typů s DRSem.
  - `synchronizeDataGoProducts` - spustí synchronizaci produktů s DataGo.
- `ProductUtil.php` - pomocné funkce kolem produktů.
- **Funkce**:
  - `fetchStoreInfo` - multifetch pro načtení skladovosti rozdělené podle skladu - jde o centrální sklad, sklad aktuálně vybrané prodejny a součet kusů na ostatních prodejnách.
  - `getDeliveryDateIncremented` - vrátí datum dopravy navýšený a potřebný počet dnů pro dané položky.
  - `getDateIncrement` - vrací date increment - počet dní o kolik se má navýšit datum doručení pro dané položky.
  - `getMainStoreClosedDates` - vrací datumy, kdy je hlavní sklad uzavřen a tímpádem je uzavčena i expedice z něj.
  - `getMainStoreDeliveryDateIncrement` - vrací počet dní, o které je potřeba navýšit datum doručení pokud je expedice z centrály uzavřena.
  - `getDateIncrementWithoutWorkdays` - odečte od incrementu nepracovní dny, aby když se pak zavolá `DateUtil::calcWorkingDays` nebylo datum o ty nepracovní dny posunutý.
  - `getSupplierOrderIncrement` - vrátí počet dnů do dalšího objednávacího dne od dodavatele.
  - `recursivelyGetClosestDeliveryDateIncrement` - rekurzivně prochází objednací časy nastavené u dodavatele, aby se našel nejbližší den, kdy se od dodavatele bude objednávat.
  - `fetchProductsSupplierDeliveryDateIncrement` - mutlifetch načte k produktům increment podle záznamu v `products_of_suppliers` - každý produkt může mít totiž delivery increment ještě povýšený speciálně u dodavatele.
  - `getSellersByStoreId` - vrací prodejce indexované podle ID skladu.
  - `getProducts` - vrací `ProductCollection` podle zadaných ID produktů
- `PompoNotifier.php` - emailové notifikace.
- **Funkce**:
  - `notifyLowPartnerCoupons` - notifikace o docházejících poukazech.
- `PompoOrderUtil.php` - pomocné funkce pro práci s objednávkama
  - `getOrderSynchronizerType` - vrátí zdroj remote objednávky (DataGo nebo DRS)
  - `getOrderItemDifference` - vrací seznam položek s počtama kusů v DRSu / DataGo. Podle toho se potom generuje block.incomplete-items.tpl, který
  se posílá v mailu.

### Customizace view `PompoBundle/View`

- `BonusProgramExchangeView.php` - customizace kvůli partnerským poukazům, abych nezobrazoval partnerské poukazy, pokud tam už není dostupný žádný předvygenerovaný poukaz.
- `PageView.php` - customizace kvůli zaheslování stránky. 
- `UserCardsView.php` - custom view pro zobrazení zákaznických karet uživatele.
- `UserView.php` - customizace kvůli registraci / dokončení registrace uživatelů, které si vytvořili účet na pokladně / mají zákazníckou kartu. Pokud uživatel má zákazníckou 
kartu, tak může pomocí čísla karty a čísla uživatele provést registraci na e-shopu a tím si účet automaticky spáruje s již existující zákaznickou kartou.
  - `getBodyVariables` - pokud je v requestu číslo zákazníka v DRSu, tak předvyplním formulář datama z DRSu.
  - `handleSubmit` - handlování odeslání formuláře, kde se vyplňuje číslo zákazníka a karty - pokud se vyplní existující, tak se předvyplní formulář pro registraci datama z DRSu.
