# Recenze (Google / Seznam), mapa a profily: proveditelnost

Stav ověřen 26. 9. 2026. Zdroje jsou u každého bodu.

## Shrnutí pro rozhodnutí

| Co | Proveditelné? | Doporučení |
|---|---|---|
| Přepínač recenzí Google / Seznam | **Ano** | Jednotná komponenta `<x-reviews>` nad vlastní tabulkou `reviews` v DB. Data plní synchronizace (Google) + oficiální widget nebo ruční import (Seznam). |
| Recenze z Google | **Ano, s podmínkami** | Primárně Google Business Profile API (všechny recenze, vlastník). Záloha: Places API (max. 5 recenzí, bez ukládání). |
| Recenze ze Seznamu (Firmy.cz) | **Částečně** | Veřejné API **neexistuje**. Oficiální widget „Recenze ze Seznamu“ (1 až 5 recenzí) nebo ruční přepis vybraných recenzí v administraci s odkazem na zdroj. Scraping ne. |
| CTA „Ohodnotit“ | **Ano** | Google: odkaz na napsání recenze (Place ID). Seznam: odkaz na profil Firmy.cz / QR z administrace Firmy.cz. |
| Mapa působnosti (Leaflet) | **Ano** | Hranice okresů z ČÚZK (CC BY 4.0), podklad Mapy.com (API klíč) nebo CARTO/OSM. |

---

## 1. Google recenze

### Varianta A (doporučená): Google Business Profile API
- Endpoint `GET https://mybusiness.googleapis.com/v4/accounts/{account}/locations/{location}/reviews`, vrací **všechny** recenze (50 na stránku), `averageRating`, `totalReviewCount`, řazení `updateTime desc` / `rating`. [docs](https://developers.google.com/my-business/reference/rest/v4/accounts.locations.reviews/list)
- OAuth scope `https://www.googleapis.com/auth/business.manage`, přihlašuje se **vlastník profilu** (jednorázově, refresh token v `.env` / DB).
- Přístup k API se žádá formulářem [Application for Basic API Access](https://support.google.com/business/contact/api_default). Podmínky: profil ověřený a aktivní **60+ dní** a s uvedeným webem. Do schválení je kvóta 0. [prereqs](https://developers.google.com/my-business/content/prereqs)
- Ukládání: politika povoluje jen „omezené množství“ dat, kvůli výkonu, **max. 30 dní**, bezpečně a bez úprav. Synchronizaci tedy spouštět denně a držet jen aktuální snapshot. [policies](https://developers.google.com/my-business/content/policies)
- Nejistota: politika výslovně neřeší veřejné zobrazení na webu. Běžná praxe to dělá, ale před spuštěním stojí za to znovu projít podmínky.

### Varianta B (záloha): Places API (New), Place Details
- Pole `reviews` vrací **max. 5 recenzí** „podle relevance“, bez volby řazení. SKU *Place Details Enterprise + Atmosphere*, 1 000 volání měsíčně zdarma, pak cca 25 USD / 1 000. [reference](https://developers.google.com/maps/documentation/places/web-service/reference/rest/v1/places) · [ceník](https://developers.google.com/maps/billing-and-pricing/pricing)
- Povinné zobrazení: logo Google Maps (nebo text „Google Maps“), autor recenze (jméno, avatar, odkaz na profil), odkaz na recenzi (`googleMapsUri`), informace o řazení („seřazeno podle relevance“). [policies](https://developers.google.com/maps/documentation/places/web-service/policies)
- **Ukládat se smí jen `place_id`**, text recenzí ne (§14.3 Maps Service Terms). Prakticky: načítat na serveru s krátkou cache (minuty až hodiny) nebo v prohlížeči.
- EEA podmínky (fakturace v ČR): obsah Places se **nesmí zobrazovat spolu s mapou**, která není od Google. Blok recenzí proto držet vizuálně odděleně od Leaflet mapy (ve všech návrzích jsou to samostatné sekce). [EEA terms §15](https://cloud.google.com/terms/maps-platform/eea/maps-service-terms)

### Odkaz „Ohodnotit na Google“
- Běžně používaný formát: `https://search.google.com/local/writereview?placeid=PLACE_ID` (neoficiálně zdokumentovaný, funguje).
- Oficiálně: pole `googleMapsLinks.writeAReviewUri` z Places API, nebo odkaz / QR „Požádat o recenze“ přímo v Business Profile. [nápověda](https://support.google.com/business/answer/3474122)
- Place ID: [Place ID Finder](https://developers.google.com/maps/documentation/places/web-service/place-id) nebo Text Search (New) s maskou `places.id` (SKU „IDs Only“, zdarma).

> **Stav:** Google profil firmy se nepodařilo dohledat. **Úkol pro majitele:** založit/ověřit Google Business Profile jako *firmu působící v oblasti* (service-area business, adresa skrytá, oblast = 3 okresy), vyplnit web tootevru.cz, kategorii „Zámečník“, otevírací dobu nonstop. Bez ověřeného profilu nejde ani API, ani odkaz na hodnocení.

---

## 2. Seznam (Firmy.cz) recenze

- Profil existuje: **„To otevřu“**, [firmy.cz/detail/13751128](https://www.firmy.cz/detail/13751128-to-otevru-velke-hamry-bohdalovice.html), hodnocení **5,0 („Fantastické“) z 6 recenzí**, 5. místo v kategorii Zámečnictví v Libereckém kraji. Mapy.com: [profil](https://mapy.com/cs/?source=firm&id=13751128).
- **Veřejné API pro čtení recenzí neexistuje.**
- Oficiální widgety zdarma v `admin.firmy.cz` → Profil → Widgety ([nápověda](https://napoveda.firmy.cz/firemni-profil/widgety/)):
  - **„Recenze ze Seznamu“**: 1 až 5 recenzí včetně textu (Firmy.cz + Zboží.cz), při nulovém počtu výzva k hodnocení,
  - dynamický **odznak s průměrným hodnocením** (světlý / tmavý, přepočet denně, zobrazí se až při dostatku ověřených recenzí),
  - logo Firmy.cz / Mapy.com, QR kód nebo kartička A7 pro sběr hodnocení.
  - Vkládá se HTML kódem z administrace. Zda jde o iframe nebo skript, není veřejně popsáno (**ověřit v administraci**). Styl widgetu nebude 1:1 s designem.
- Scraping: `firmy.cz/robots.txt` končí `User-agent: * / Disallow: /`. **Nepoužívat.**

### Doporučené řešení pro záložku „Seznam“
1. **Ruční kurátorský import v administraci**: majitel (nebo správce) přepíše vybrané recenze (jméno ve tvaru „Jan N.“, datum, hvězdy, text) a průměr + počet. U záložky vždy odkaz „Všechny recenze na Firmy.cz“. Plně v designu, bez cizích skriptů a cookies. Recenzí přibývá málo, údržba je minimální.
2. Alternativa: vložit oficiální widget do záložky (rychlé, ale cizí vzhled a skript třetí strany, nutné prověřit cookies).

### Odkaz „Ohodnotit na Seznamu“
- Odkaz na profil (`https://www.firmy.cz/detail/13751128-to-otevru-velke-hamry-bohdalovice.html`). Tlačítko „Přidat hodnocení“ je na profilu řešené JavaScriptem a vyžaduje přihlášení Seznamem. Kotva `#pridat-hodnoceni` je zmíněná jen u třetích stran (neověřeno). Oficiální cesta je QR kód z widgetů.

---

## 3. Návrh implementace v Laravelu

```
reviews (id, source enum[google,seznam], external_id null, author_name, author_photo_url null,
         rating tinyint, text, published_at, source_url, is_visible bool, sort int, synced_at)
review_sources (source, average_rating decimal(2,1), total_count int, profile_url, write_review_url, synced_at)
```

- `php artisan reviews:sync-google` (scheduler denně): GBP API → upsert do `reviews`, smazat záznamy starší 30 dní od posledního syncu, aktualizovat `review_sources`.
- Seznam: CRUD v administraci (Filament resource), ruční aktualizace průměru a počtu.
- Komponenta `<x-reviews :sources="['google','seznam']" />`: záložky (WAI-ARIA tabs, JS viz `common.js`), max. 3 řádky textu, odkaz „Všechny recenze“, CTA „Ohodnotit na …“ podle aktivní záložky.
- Do JSON-LD **nevkládat** `aggregateRating` z Google/Seznam (Google to u LocalBusiness považuje za self-serving recenze).
- Server-side načítání = žádné požadavky prohlížeče na Google, tedy žádný dopad na cookie souhlas.

---

## 4. Mapa působnosti

- **Knihovna:** Leaflet 1.9.4 (v produkci `npm i leaflet`, lazy-load až při zobrazení mapy).
- **Hranice okresů:** `assets/data/okresy-3.geojson` (Jablonec nad Nisou, Semily, Liberec), zdroj [siwekm/czech-geojson](https://github.com/siwekm/czech-geojson) z dat **ČÚZK INSPIRE AU**, licence **CC BY 4.0**, nutné uvést „© ČÚZK“. Zjednodušeno (tolerance ~25 m, 41 kB), sdílené hranice bez mezer. Skript `design/_build/tools/okresy-simplify.py`.
- **Podklad v ukázkách:** dlaždice OpenStreetMap odbarvené CSS filtrem (CARTO basemaps nově bez API klíče vrací vodoznak „API KEY REQUIRED“).
- **Podklad v produkci (doporučení): Mapy.com REST tiles**
  - `https://api.mapy.com/v1/maptiles/{mapset}/256/{z}/{x}/{y}?apikey=KEY`, mapsety `basic`, `outdoor`, `winter`, `aerial`; `256@2x` pro retinu (basic, outdoor). [docs](https://github.com/mapycom/developer/blob/master/docs/rest-api/map-tiles.md)
  - Povinná atribuce: klikací logo Mapy.com (`https://api.mapy.com/img/api/logo.svg`, min. 30 px) + text „Seznam.cz a.s. a další“ s odkazem na `https://api.mapy.com/copyright`. [atribuce](https://developer.mapy.com/en/rest-api-mapy-cz/atribution/)
  - Ceník: 1 kredit za dlaždici, tarif Basic 250 000 kreditů měsíčně zdarma (pro tento web bohatě stačí), dál 1,60 Kč / 1 000. [pricing](https://developer.mapy.com/en/pricing/)
  - Klíč omezit na HTTP referer tootevru.cz. [zabezpečení](https://developer.mapy.com/my-account/api-key-security/)
  - Český poskytovatel, servery v EU, konzistentní s profilem na Firmy.cz / Mapy.com.
- Mapy.com nabízí `basic` a `winter`; světlý/tmavý vzhled podle návrhu jde doladit CSS filtrem na vrstvě dlaždic (`--map-tile-filter`, stejně jako v ukázkách), případně CARTO s placeným API klíčem.
- Na mapě neoznačovat adresu sídla (bydliště), jen střed obce Velké Hamry a obce v oblasti.

---

## 5. Profily a konzistence NAP

- Firmy.cz uvádí název „To otevřu“, web a Google by měly používat stejné jméno značky. Doporučení: sjednotit na **„tootevru.cz – zámečník Ondřej Balý“** nebo „To otevřu – zámečnická pohotovost“ všude (Firmy.cz, Google, web, faktury).
- Stávající web má v `<head>` tag Google Ads (`AW-11523592230`). Pokud má měření konverzí zůstat, musí cookie lišta dostat kategorii **Marketingové** (viz `gdpr.md`).
