Co je feed
Produktové XML/CSV feedy pro 3rd party prodejní portály (Heureka, Zboží, Typ, Autio, …).
Port ze staré sovy XmlModule\FeedPresenter::actionDataR5, port pouze verze R5
(R1-R4 zastaralé, neportovány).
Princip: klient na vyžádání stahuje XML/CSV z URL
/feed/data-r5/{partner_ext_id}[?csv=1]. Auth = partner_ext_id v URL + IP whitelist
(localhost devBypassIps z local.neon obejde).
Endpoint
GET /feed/data-r5/{partner_ext_id} → XML (default)
GET /feed/data-r5/{partner_ext_id}?csv=1 → CSV (CP1250, ';' separátor)
Auth flow
PartnerManager::authenticate($extId, $ip)- Kontrola
partner_ext_idexistence +is_active=true - IP whitelist (
partner_ip.remote_ip) NEBO dev bypass (parameters.feed.devBypassIps) - Při selhání: HTTP 403 + log do
partner_feed_log(status=unauthorized + reason)
Cache
4h TTL, tag feed.partner.{id}. Invalidace přes admin tlačítko „Vymazat cache"
nebo automaticky po editaci partnera. cache_hit=true/false se loguje.
XML formát (CZ root)
<vyrobky>
<vyrobek-1>
<id>0V010149</id>
<nazev>Hasici pristroj 1 kg</nazev>
<popis>…</popis>
<cena_MOC01>245.5</cena_MOC01>
<sklad>>10</sklad>
<prilohy>
<priloha_0>https://sovang.vapol.cz/picture/feed/…</priloha_0>
</prilohy>
</vyrobek-1>
</vyrobky>
Multi-state
Per-partner country ovlivňuje XML tagy přes FeedNodeTranslator:
| State | Root | Item | Příklady |
|---|---|---|---|
| CZ / SK | vyrobky | vyrobek-N | bez překladu |
| HU | products | product-N | name, price, attachments, … |
| DE | ware | produkt-N | benennung, preis, anhang, verfertiger |
Per-partner permissions (col_perm)
Tabulka partner_col_perm ~15 boolean sloupců — vypnutý sloupec se z XML/CSV vynechá.
nazev,popis,vyrobce,oem_kod,kategorie,barcodecena_moc,cena_moc01(vždy z Karatw_WEB2_feed_nomens_v5)cena— partner-specific ceník zw_WEB3_cenik(Iterace 2)sklad— mapping >10/>5/>0/ne (sove)priloha— obrázky v{prilohy}posilat_vsechny_obrazky— false = jenje_hlavniobrazek_bez_vodoznaku—true=raw orig přes/picture/feed/…?hash=(default),false=watermarked statická/imagesFeed/…URL (generate-on-miss, watermark VAPOL.cz logo — viz images docu)tecdoc,cross,parent_kategorie— Iterace 2 (zatím skip)
Omezení katalogu — skupiny karet (partner_permission)
Per-partner omezení, které skupiny karet (Karat
w_WEB2_feed_nomens_v5.SKUPINA_KARET) partner ve feedu dostane. Tabulka
partner_permission (partner_id → skupina_karet_id). Port ze staré sovy
(baseService::getPartnerPermission + $skupiny filtr).
- Sémantika 1:1 se sovou: partner bez záznamů = plný katalog;
se záznamy = jen vyjmenované skupiny (
WHERE SKUPINA_KARET IN (…)vKaratService::loadNomenListForFeedV5). - Číselník skupin v admin UI =
KaratService::getAvailableSkupinaKaret()(distinct z Karatu) ∪ už přiřazené; názvy z ref tabulkyskupina_karet. - Editace: karta „Skupiny karet" v
PartnerAdminPresenter(multi-select).
Data migrována ze sovy (2026-07-10, dump 10_sova_2.sql):
68 partnerů (61 aktivních), 1393 IP, 57 col_perm, 2424 permission, 93 názvů skupin.
Zachovány sova partner.id a partnerID → partner_ext_id
(BC feed URL). Původní „Test partner" nahrazen.
Perf caveat: Karat view w_WEB2_feed_nomens_v5 je pomalý
(~47 s i filtrovaný dotaz, plný scan; SKUPINA_KARET není indexovaný) →
feed first-request může >60 s. Tlumeno 4h cache + FTP cron (CLI). Optimalizace = index
na straně Karatu.
FTP push (Iterace 5)
Per-partner ftp_host/port/user/password/remote_path/use_ssl/format editovatelné v admin UI.
Pokud je ftp_host vyplněn, denní cron
console-feed/prepare-feeds nahraje feed na FTP do
{remote_path}/par-{partner_ext_id}-v5.{xml|csv}.
Heslo se nepřepisuje při editaci pokud zůstane pole prázdné (security).
Backward-compat routy (po DNS přesměru sova → sovang)
| Stará sove URL | Apivapol action |
|---|---|
| /xml/feed/data-r5/{id} | Feed:dataR5 |
| /xml/feed/vapol-picture/{shard}/{file} | Picture:vapolPictureBc |
| /xml/feed/vapol-picture2/{shard}/{base64} | Picture:vapolPicture2Bc |
| /xml/feed/clear-picture/{partner}/{shard}/{file} | Picture:clearPictureBc |
| /xml/feed/clear-picture2/{partner}/{shard}/{base64} | Picture:clearPicture2Bc |
| /xml/alza-picture/{shard}/{file} | Picture:alzaPictureBc |
DB:
- partner
- partner_ip
- partner_col_perm
- partner_permission
- skupina_karet
- partner_feed_log
Service:
- Model/Service/PartnerManager
- Services/Feed/FeedDataBuilder
- Services/Feed/FeedXmlSerializer
- Services/Feed/FeedCsvSerializer
- Services/Feed/FeedNodeTranslator
- Services/Feed/FeedRequestLogger
- Services/Feed/FeedFtpPusher
- Services/Feed/PartnerImageUrlBuilder
- Services/Feed/PartnerExtIdGenerator
Presenter:
- Presenters/FeedPresenter (public)
- Presenters/PartnerAdminPresenter (admin)
- ConsoleModule/Presenters/ConsoleFeedPresenter (cron)
Karat:
- KaratService::loadNomenListForFeedV5 (+ $skupiny filtr)
- KaratService::getAvailableSkupinaKaret
- KaratService::loadPartnerCenik