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
  1. PartnerManager::authenticate($extId, $ip)
  2. Kontrola partner_ext_id existence + is_active=true
  3. IP whitelist (partner_ip.remote_ip) NEBO dev bypass (parameters.feed.devBypassIps)
  4. 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>&gt;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:

StateRootItemPříklady
CZ / SKvyrobkyvyrobek-Nbez překladu
HUproductsproduct-Nname, price, attachments, …
DEwareprodukt-Nbenennung, 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, barcode
  • cena_moc, cena_moc01 (vždy z Karat w_WEB2_feed_nomens_v5)
  • cena — partner-specific ceník z w_WEB3_cenik (Iterace 2)
  • sklad — mapping >10/>5/>0/ne (sove)
  • priloha — obrázky v {prilohy}
  • posilat_vsechny_obrazky — false = jen je_hlavni
  • obrazek_bez_vodoznakutrue=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 (…) v KaratService::loadNomenListForFeedV5).
  • Číselník skupin v admin UI = KaratService::getAvailableSkupinaKaret() (distinct z Karatu) ∪ už přiřazené; názvy z ref tabulky skupina_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 partnerIDpartner_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 URLApivapol 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
Klíčové soubory

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
Nomen
Otevřít celou stránku ↗

Načítání...

Karat objednávka
Otevřít celou stránku ↗

Načítání...