# Térképes nézet — bejelentés-lista

**Modul:** Manager (admin) felület → a bejelentés-lista térképes nézet-kapcsolója
**Verzió:** v1 (2026.06.30)
**Funkcionális bemenet:** `30_terkep_v1.md` (v1, 2026.06.29)
**Épít a kész MVP-re:** a bejelentés-lista (`10_bejelentes_lista_es_adatlap.md`) és a lezárt modul-keret (`00_architektura_v4.md`) — **nem módosítja őket**, post-MVP bővítés.
**Domain-modell:** `00_domain_model.md` (`Ticket`, `Attachment`, `Category` — nincs új elem).
**Hivatkozott kanonikus döntések:** K-005, K-009, K-016, K-029, K-036, **K-042**.

> **Olvasási megjegyzés a Claude Code-nak.** Ez a feature **additív** az API- és
> UI-rétegen: új entitás, mező, `enum` és (v1-re) index **nincs**. Egy új read-only
> végpont (`GET /v1/tickets/map`), egy szűk DTO, egy apró additív lista-szűrő
> (`located`), és egy nézet-kapcsoló a meglévő `/tickets` listán. Minden, ami a
> `BaseController` / `TableStateConfig` / `[tableState]` mintából jön, **készen
> van** — itt csak az **eltérés** szerepel, „Eltérés a mintától:" jelöléssel. A
> `30_terkep_v1.md` a *mit lát a felhasználó* szintet lezárta; ez a dokumentum a
> *hogyan* fejlesztői mélysége.

---

## 0. Funkcionális alap

### 0.1 A feature-t fedő dokumentumok

| Dokumentum | Mit ad |
|---|---|
| `30_terkep_v1.md` | A térképes nézet teljes funkcionális terve: nézet-kapcsoló, pin = státusz, tab/szűrő-tisztelet, klaszter, koordináta nélküli kezelés, GIS-határ, első kiadás vs. iteráció |
| `10_bejelentes_lista_es_adatlap.md` | A bejelentés-lista, amelyre a nézet-kapcsoló épül: `GET /v1/tickets`, a tab-feloldás (SD-30), a `TicketListDto`, a `TableStateConfig`, az `authorization.json` |
| `00_architektura_v4.md` 3.2, 4.1 | Navigáció (rövid bal menü), a lista-keret UX-e |
| `00_domain_model.md` 1.2, 1.3, 2.1 | A `Ticket`, `Attachment`, `Category` mezőkészlete |
| `90_sitemap_v3.md` | A `/tickets` nézet a sitemapen |

### 0.2 Érintett kanonikus döntések

- **K-005** — a platform-mag (a térkép a koncepcióban előirányzott elem).
- **K-009** — anti-termék lista / a GIS-határ (a térkép **nem** GIS — 7.).
- **K-016** — pilot-fegyelem (a viewport-paging és a hőtérkép iterációba kerül).
- **K-029** — az öt `Ticket`-állapot (a pin színe).
- **K-036** — a kétszintű kategória-fa (a térkép kategória-szűrője gyökér-szintű).
- **K-042** — *a manager-térkép a bejelentés-lista nézet-kapcsolója, nem külön oldal, és nem GIS-eszköz* (`30_terkep` 12.).

### 0.3 Mit döntött már el a funkcionális réteg

Röviden (a részletek `30_terkep_v1.md`): a térkép a `/tickets` lista **nézet-kapcsolója** (lista ↔ térkép, `?nezet=terkep`), amely a tabot és szűrőket megőrzi (`30_terkep` 2.); a bejelentések **pinek**, a **szín a státusz** (`30_terkep` 3.1); a térkép a tabot és szűrőket **tiszteli** (3.2); **klaszterezés** sűrű helyen (3.3); **pin-katt → előnézet-kártya → adatlap** (4.1); a **koordináta nélküli** ügy nem pin, de számjelzéssel jelezve (5.); **Béla** ugyanazt a térképet látja (6.); a **GIS-határ** explicit őrzött (7.).

### 0.4 Mit tölt ki EZ a specifikáció

A `GET /v1/tickets/map` szerződését és a `TicketMapPointDto`-t; az additív `located` lista-szűrőt; a nézet-kapcsoló `[tableState]`-állapotát (`?view=map`); a Leaflet+OSM térkép-komponenst; a klaszterezés és a középpont technikai modelljét; az acceptance criteria-t; az MVP vs. iteráció szétbontást.

---

## 1. Cél és hatókör

A térképes nézet a manager felület bejelentés-listájának **térbeli reprezentációja**: Anna és Béla „hol vannak a nyitott ügyek a városban?" kérdésére válasz. A `/tickets` listán egy **nézet-kapcsoló** (lista ↔ térkép) ugyanazt a szűrt halmazt mutatja **pinekként**, a státuszuk szerint színezve, a tabot és szűrőket megőrizve. Üzleti érték: térbeli operatív áttekintés a **meglévő** koordinátából, új adatfelvétel és új navigáció nélkül.

**Hatókörön kívül (ennél a feature-nél):** a térkép-szolgáltató kiválasztása ezúttal **eldöntött** (Leaflet + OSM, TD-T4); a pontos színkódok és a popup vizuális megjelenése (Claude Design); a viewport-alapú betöltés (iteráció); a hőtérkép (iteráció); a polgári oldali térkép (külön modul, `30_terkep` 8.3); minden GIS-funkció (réteg, mérés, terület-/topológiai elemzés, útvonaltervezés — K-009, 7.).

---

## 2. Domain-modell

### 2.1 Új / módosított entitások

**Nincs.** A térkép kizárólag meglévő `Ticket`-mezőkre és kísérőire rajzol — nem vezet be új entitást, mezőt, kapcsolatot vagy `enum`-ot (`30_terkep` 8.4).

### 2.2 Érintett entitások — kész bemenetként hivatkozva

| Entitás / mező | Típus | Mire kell a térképnek | Horgony |
|---|---|---|---|
| `Ticket.id` | `long` | belső pin- és kártya-azonosító | `00_domain_model.md` 1.2.1 |
| `Ticket.ticketNumber` → `displayId` | `int` → `string` | a kártyán megjelenő azonosító (`ALM-234`) | 1.2.1, SD-16 |
| `Ticket.latitude` / `longitude` | `decimal` (feltételes, együtt jár) | a pin pozíciója; `null`-pár → „helyszín nélkül" | 1.2.4 |
| `Ticket.status` | `enum TicketStatus` (`New/Assigned/InProgress/Resolved/Rejected`) | a pin színe | 1.2.3, K-029 |
| `Ticket.title` | `string` | előnézet-kártya cím | 1.2.1 |
| `Ticket.categoryId` (+ `citizenSuggestedCategoryId`) | `FK → Category` | kártya kategória-címke + ikon; a térkép kategória-szűrője | 1.2.2 |
| `Category.name` / `iconRef` / `parentId` | `string` / `string` / self-FK | a címke, az ikon, és a **gyökér-feloldás** | 2.1 |
| `Attachment` (`kind=ReportPhoto`, `sortOrder`, `fileRef`) | — | kártya bélyegkép (első `ReportPhoto`) | 1.3 |
| `Ticket.createdAt` | `DateTime` | kártya „beérkezett" idő | 1.2.8 |

### 2.3 Állapotgép

**Nem releváns, mert** a térkép **olvasó** nézet — nem vált állapotot, nem indít átmenetet (TD-T6). A `status`-t csak a pin-szín leképezéséhez olvassa; az öt állapot és az átmenetek a `02_globalis_allapotgep.md`-ben élnek (K-029), a térkép ezt nem ismétli.

### 2.4 Lookup-ok, katalógus-érintettség

Új lookup **nincs**. A térkép kategória-szűrője ugyanazt a gyökér-`Category` készletet használja (K-036), amit a lista fejléc-szűrője — a meglévő `ILookupProvider` / category-lookup mintán. A `status` `enum`, nem lookup.

---

## 3. Szerver — API és logika

### 3.1 A standard rész

A térkép **nem** `BaseController`-művelet és **nem** a lista-végpont egy módja: egy **új, dedikált read-only végpont** (TD-T1), a `GET /v1/tickets/{id}/similar` (SD-44) mintájára — mellékhatás nélküli, számított projekció. Standard CRUD nem érintett.

### 3.2 `GET /v1/tickets/map` — a térkép pont-halmaza

> **Eltérés a mintától — nem-lapozott, számított projekció (TD-T1).** A
> `BaseController` `ListAsync` offset-lapozott listát ad; a térkép a **teljes
> szűrt halmazt** kéri egyszerre, szűk projekcióval. Ezért külön végpont — nem a
> `GET /v1/tickets` egy `pageSize=∞` módja (a lapozott/nem-lapozott válasz
> keverése rontaná az `apigen` klienst).

**Kérés.** A végpont **ugyanazt a szűrő-bemenetet** fogadja, mint a lista (kódduplikáció nélkül):

- `tab` query-param: `new|mine|overdue|resolved|all` — a **szerver-oldali tab-feloldás** (SD-30) változatlanul újrahasználva (a „Hozzám rendelt" csoporttagság, a „Késésben" tenant-időzónás napkezdet ugyanúgy).
- fejléc-szűrők a standard `FilterQuery`-n — köztük a **kategória-szűrő** (ez a `30_terkep` 3.2 kategória-szűrője, gyökér-szinten).
- **lapozás nincs**; `sort` nem értelmezett (a térkép nem rendezett lista).

**Válasz.** Egy wrapper, ami a pontokat **és** a helyszín nélküli darabszámot egy hívásból adja (TD-T2):

```jsonc
// 200 OK
{
  "points": [ /* TicketMapPointDto[] — csak koordinátával rendelkező ügyek */ ],
  "unlocatedCount": 3   // ugyanezen tab + szűrők, de koordináta nélkül
}
```

`points` = a szűrt halmaz, ahol `latitude` ÉS `longitude` kitöltött; `unlocatedCount` = a maradék (a pár `null`). A kettő a szűrt halmazt **partícionálja**.

**`TicketMapPointDto`** (a `TicketListDto` szűk, térkép-célú rokona):

| Mező | Típus | Forrás |
|---|---|---|
| `id` | `long` | `Ticket.id` |
| `displayId` | `string` | `Tenant.displayPrefix` + `-` + `ticketNumber` (SD-16) |
| `latitude` | `decimal` | `Ticket.latitude` |
| `longitude` | `decimal` | `Ticket.longitude` |
| `status` | `enum TicketStatus` | `Ticket.status` (a pin színéhez) |
| `title` | `string` | `Ticket.title` |
| `categoryLabel` | `string?` | `categoryId` neve; különben `citizenSuggestedCategoryId` „(javasolt)"; különben `null` — a `TicketListDto` SD-30 logikájával azonos |
| `categoryIconRef` | `string?` | a **gyökér**-`Category.iconRef` (alkategóriánál `parentId`-felmenet) — a polgári kártya-konzisztenciához (`30_terkep` 4.1) |
| `thumbnailRef` | `string?` | az első `ReportPhoto` (`sortOrder`) presigned hivatkozása — az `Attachment`-feature mintája |
| `createdAt` | `DateTime` | `Ticket.createdAt` |

**Hibakódok.** `200` OK; `400` érvénytelen `tab`/`FilterQuery`; `401` auth nélkül; `403` nem engedett szerepkör. Gyűjtemény-végpont — `404` nincs. Idegen tenant adata nem fordulhat elő (3.7).

### 3.3 A lista-végpont apró bővítése — `located` szűrő (TD-T2)

A „N helyszín nélkül" indikátorra kattintva a felhasználó a **lista**-nézetre vált, ugyanazzal a tab + szűrővel, **csak a koordináta nélküli** ügyekre szűrve. Ehhez a `GET /v1/tickets` egy opcionális szűrőt kap:

- `located` query-param: `true` (csak koordinátás) / `false` (csak koordináta nélküli) / hiányzik (nincs szűrés).

> **Eltérés a mintától — additív szűrő-param (TD-T2).** Ezt a **térkép-feature
> vezeti be** a lista-végponton, de **visszafelé kompatibilis** (default = nincs
> szűrés). A `10_bejelentes_lista_es_adatlap.md` szűrő-készletébe (3.2.1) és a
> `CLAUDE.md`-be **visszavezetendő** — egy térkép-feature itt érinti a lista
> általános szerződését.

### 3.4 Validáció (FluentValidation)

Minimális — a végpontnak nincs törzse. `tab`: ha jelen van, a `new|mine|overdue|resolved|all` halmazból (a lista validációjával azonos). `FilterQuery`: standard. `located`: ha jelen van, `bool`. Kihagyott méret-/tartomány-szabály nincs: a `TicketMapPointDto` minden mezeje **származtatott**, nem bemeneti — a forrás-méreteket a `00_domain_model.md` 1.2 rögzíti.

### 3.5 Workflow- és business-szabályok

- A térkép **olvasó** — nincs állapotváltás a térképen (TD-T6).
- Az **`Rejected`** ügyek alapból nem terhelik a térképet: csak az `all` tabon, a státusz-fejléc-szűrőben explicit bekapcsolva jelennek meg — a lista `AC-A5` logikájával egyezően.
- A **koordináta nélküli** ügy nem pin, az `unlocatedCount`-ba számít (`30_terkep` 5.).

### 3.6 Jogosultság — `authorization.json`

A lista olvasó-szabályát tükrözi (`10` 3.8). Kódbeli szerepkörök (SD-7): `tenant_dispatcher`, `tenant_manager`, `tenant_content_manager`, `tenant_field_worker`.

```jsonc
{ "method": "GET", "path": "/v1/tickets/map", "roles": ["tenant_dispatcher","tenant_manager","tenant_field_worker"] }
```

- A **`field_worker` „csak saját ügye"** korlátja itt is **sor-szintű**, nem route-szintű: a térkép-végpont a `field_worker` kérőnél a „Hozzám rendelt" (`mine`) predikátumra szűkít — pontosan ahogy a `GET /v1/tickets` (`10` 3.8). Így a terepi dolgozó térképe is csak a hozzá rendelt ügyeket mutatja.
- A `content_manager` nem éri el (a `roles`-listában nincs).

### 3.7 Multi-tenancy

**Standard — eltérés nincs**, ahogy a listánál (`10` 3.9): a térkép-kontroller a tenant-aware `DbContext`-et kapja, a `Ticket` a **Tenant DB**-ben él (SD-1/SD-6), idegen tenant adata a fizikai DB-szeparáció miatt nem fordulhat elő (SD-12).

### 3.8 Audit és teljesítmény

- **Audit:** read-only végpont — a standard `AuditableEntity`-n túl nincs naplózandó.
- **Teljesítmény:** első kiadásra a **teljes szűrt halmaz** egy lekérdezésben; a listát kiszolgáló indexek ezt is kiszolgálják (a tab-predikátumok azonosak). **Koordináta-/térbeli index nem v1-tétel** — csak a viewport-paging iterációnál válik relevánssá (TD-T3, `30_terkep` 8.1).

---

## 4. Admin felület

### 4.1 Érintett képernyők

A térkép **nem új képernyő** — a meglévő `/tickets` bejelentés-lista **nézet-kapcsolója** (`30_terkep` 2.; `90_sitemap_v3` `/tickets` nézet). Nincs új route, nincs új főmenü-pont.

### 4.2 A nézet-kapcsoló — `?view=map` a lista-oldalon

A lista tetején, a tab-sáv mellett egy „lista / térkép" váltó. A nézet a `[tableState]` URL-állapot része — `?view=map`, a `?tab=` és a fejléc-szűrők mellett; a param hiánya = lista (default).

> **Eltérés a mintától — `view` állapot a `[tableState]`-ben (TD-T5).** A standard
> `[tableState]` a tab/szűrő/rendezés/oszlop-állapotot kódolja URL-be; ez a feature
> egy `view` kulccsal bővíti. A lista ↔ térkép váltás **megőrzi a tab + szűrő +
> kontextus állapotot** (nem szűr újra) — ez K-042 magja. A térkép ugyanazt a
> szűrt halmazt kapja, amit az aktív lista-állapot; a váltás csak a reprezentációt
> cseréli, és a „vissza"-navigáció megőrzi (a lista 4.4 elvének kiterjesztése).
>
> **URL-reconciliation (SD-78).** A `30_terkep` 2. a `?nezet=terkep` magyar
> paramot írta; az SD-78 óta a szegmens/param **angol** (a felirat magyar marad,
> K-028). A kanonikus alak: `/tickets?view=map`. A pontos param-nevet a meglévő
> `[tableState]` konvencióhoz igazítva.

A térkép **kategória-szűrője** (`30_terkep` 3.2) a meglévő gyökér-`Category` fejléc-szűrő (K-036, ugyanaz a lookup, mint a listán).

### 4.3 A térkép-komponens — Leaflet + OSM (TD-T4)

Új admin-komponens (munkanév `ticket-map`), **Leaflet + OpenStreetMap tile** — konzisztensen az **SD-77**-tel, amely a manuális-nyitás térkép-pickeréhez már behozta ezt a stacket az admin kódbázisba (ugyanaz a függőség).

- **Adatforrás:** `GET /v1/tickets/map` (3.2) — a teljes szűrt halmaz + `unlocatedCount`.
- **Pin / szín:** pontonként egy pin, a `status` színezi. A szemantikai leképezés (`30_terkep` 3.1): `New` = kiemelt, `Assigned` = másodlagos, `InProgress` = folyamat-szín, `Resolved` = halvány, `Rejected` = alapból rejtett. A komponens a **szűrés/opacitás-logikát** alkalmazza; a **pontos színkódok a Claude Design dolga**, a kész specből.
- **Klaszterezés:** kliens-oldali (TD-T3). Sűrű terület → szám-jelvény; zoom/katt szétnyit, egybeeső pontok spiderfy.
- **Középpont/zoom:** a lokalizált pinek **bounding-boxára illeszt** (fit-bounds); üres halmaznál hardcoded magyarországi alapközéppont (TD-T7).
- **Pin-katt → előnézet-kártya** (popup): `displayId`, `title`, `categoryLabel` (+ `categoryIconRef`), `status`, `thumbnailRef`, `createdAt`, és egy **„Megnyitás"** link → `/tickets/details/<id>` (`30_terkep` 4.1). A kártya a polgári lista-kártya vizuális nyelvét tükrözi.
- **„N helyszín nélkül" indikátor:** kis jelvény a térkép sarkában (`unlocatedCount`); kattintásra **lista-nézetre** vált, ugyanazzal a tab + szűrővel és `located=false`-szal (3.3, `30_terkep` 5.).

### 4.4 Jogosultság — admin-felületi vetület

A nézet-kapcsolót az látja, aki a `/tickets` listát (`05_jogosultsagok_v2.md`): **diszpécser, vezető, terepi**. A `content_manager` a `/tickets`-et egyáltalán nem éri el. A terepi dolgozó térképe **csak a hozzá rendelt** ügyeket mutatja (sor-szintű szűrés, 3.6). **Nincs új szerepkör vagy jogosultság** a listáén túl.

### 4.5 Üres / betöltési / hibaállapot

| Állapot | Viselkedés |
|---|---|
| Betöltés | a tile-betöltés és a pont-betöltés külön jelzéssel (skeleton/spinner a térkép fölött) |
| Üres — nincs lokalizált ügy a szűrt halmazban | térkép az alapközépponton + üzenet (`ticket.map.empty`); ha `unlocatedCount > 0`, az indikátor látszik |
| Üres — minden ügy koordináta nélküli | nulla pin; az indikátor = a teljes darabszám |
| Hiba — pont-API | hibasáv + „Újrapróbálás" (`ticket.map.error.points`) |
| Hiba — tile-betöltés | tile-szintű fallback-üzenet (`ticket.map.error.tiles`) |

### 4.6 i18n kulcsok (`hu.json`)

A `ticket.*` prefix-konvenció szerint (`10` 4.6); a felület **tegez**. Új kulcsok:

| Kulcs | Szöveg |
|---|---|
| `ticket.view.list` | „Lista" |
| `ticket.view.map` | „Térkép" |
| `ticket.action.open` | „Megnyitás" *(a lista kebabjával közös lehet)* |
| `ticket.map.unlocated` | „{count} bejelentés helyszín nélkül" |
| `ticket.map.empty` | „Nincs megjeleníthető, helyszínnel rendelkező bejelentés." |
| `ticket.map.error.points` | „A térkép nem tölthető be, próbáld újra." |
| `ticket.map.error.tiles` | „A térkép-alaplap nem tölthető be." |

Az előnézet-kártya a meglévő `ticket.status.*` és `ticket.field.*` kulcsokat használja újra. **Konfliktus-kulcs (409/422) nincs** — a térkép read-only, nincs írás. **Esemény-sablon-kulcs sincs** — a térkép nem jelenít meg tevékenység-naplót.

### 4.7 Reszponzív viselkedés

Asztali alapeset; tableten/mobilon használható (`30_terkep` 10.1). A térkép-komponens a viewport-méretre alkalmazkodik; a tab-sáv és a nézet-kapcsoló a lista meglévő reszponzív mintáját követi (`10` 4.7). A reszponzivitás nem ad új állapotot és nem vezet be új i18n-kulcsot.

---

## 5. Polgári mobilapp adatigénye

**Nem releváns, mert** a manager-térkép nem érint polgári adatigényt: a `GET /v1/tickets/map` szerepkör-védett, tenant-belső, és a manager öt állapotát adja. A **polgári oldali térkép külön dolog** (a nyilvános bejelentéseket mutatja a polgárnak), és a `30_terkep` 8.3 **átadta** a polgári mobilapp / webes funnel modulnak. Ez a feature csak jelzi, hogy létezik, és hogy más a célja — nem specifikálja.

---

## 6. Acceptance criteria

Given/When/Then, gépiesen ellenőrizhetően; minden kritérium egy korábbi döntésre vezethető.

### AC-M — Térkép-végpont és adat

- **AC-M1** — *Given* három `New` és két `Assigned` ügy koordinátával; *When* `GET /v1/tickets/map?tab=new`; *Then* a `points` pontosan a három `New` ügyet adja.
- **AC-M2** — *Given* a szűrt halmazban három koordinátás és két koordináta nélküli ügy; *When* a térkép lekérve; *Then* `points` hossza 3, `unlocatedCount` = 2.
- **AC-M3** — *Given* tetszőleges szűrt halmaz; *When* a válasz megjön; *Then* minden `points`-elemnek van `latitude` ÉS `longitude`, és `unlocatedCount` = a `null`-páros ügyek száma (a kettő partícionálja a halmazt).
- **AC-M4** — *Given* egy `Rejected` ügy koordinátával; *When* `tab=new`; *Then* nincs a `points`-ban. *When* `tab=all` + a státusz-szűrő tartalmazza a `Rejected`-et; *Then* benne van.
- **AC-M5** — *Given* ügyek két gyökér-kategóriában (egy alkategórián keresztül is); *When* a kategória-szűrő „Utak és járdák" gyökér; *Then* `points` csak az e gyökérre feloldódó ügyeket adja.
- **AC-M6** — *Given* `field_worker` kérő, hozzá rendelt és idegen ügyekkel; *When* a térkép lekérve; *Then* `points` csak a hozzá rendelteket adja (a lista `mine` predikátumával egyezően).

### AC-V — Nézet-kapcsoló és állapot

- **AC-V1** — *Given* lista `tab=overdue` + egy kategória-szűrővel; *When* térképre vált; *Then* a térkép ugyanazt a szűrt halmazt mutatja; *When* visszavált; *Then* ugyanaz a lista-állapot fogad.
- **AC-V2** — *Given* `/tickets?view=map&tab=overdue&...` deep-link; *When* betölt; *Then* a térkép-nézet az adott tabbal/szűrővel nyílik.
- **AC-V3** — *Given* `/tickets` `view` param nélkül; *Then* a lista-nézet aktív.

### AC-P — Pin és interakció

- **AC-P1** — *Given* N lokalizált ügy a halmazban; *Then* N pin (a klaszterezés erejéig összevonva).
- **AC-P2** — *Given* egy pin; *When* rákattint; *Then* előnézet-kártya `displayId` / `title` / kategória / `status` / bélyegkép / `createdAt` adattal és egy „Megnyitás" linkkel a `/tickets/details/<id>`-re.
- **AC-P3** — *Given* sok közeli/egybeeső pont; *Then* klaszter-jelvény a darabszámmal; *When* ráközelít vagy rákattint; *Then* a pinek szétnyílnak.
- **AC-P4** — *Given* `unlocatedCount > 0`; *When* az indikátorra kattint; *Then* lista-nézet, ugyanaz a tab + szűrő, `located=false` — csak a koordináta nélküli ügyek.

### AC-E — Üres és hiba

- **AC-E1** — *Given* a szűrő nulla lokalizált ügyet ad; *Then* üres-térkép üzenet az alapközépponton (+ indikátor, ha `unlocatedCount > 0`).
- **AC-E2** — *Given* a pont-API hibázik; *Then* hibasáv + „Újrapróbálás", a tile-réteg külön hibát jelez, ha a tile nem tölt.

---

## 7. Keresztmetszeti

- **i18n** — a 4.6-ban; a felület tegez. Új net-elem nincs a felsoroltakon túl.
- **Időzóna** — a `createdAt` tenant-időzónában jelenik meg; a „Késésben" tab napkezdete tenant-időzónás (a listából örökölve, 3.2.1). Új időzóna-logika nincs.
- **Teljesítmény** — első kiadásra a teljes szűrt halmaz egy lekérdezésben (3.8); a listát kiszolgáló indexek elegendők, a klaszterezés kliens-oldali. Térbeli index csak a viewport-paging iterációnál (TD-T3).
- **Biztonság** — read-only, a listáéval azonos auth: tenant-aware `DbContext` (3.7) + sor-szintű `field_worker`-szűkítés (3.6); nincs új támadási felület. **Külső függőség:** az OSM tile-réteg külső tile-szerverről jön (vagy proxyn keresztül) — implementációs részlet; a publikus OSM tile-szerver kvóta-korlátaira figyelni kell (az SD-77 picker is ezt használja).

---

## 8. Lezárás

### 8.1 Első kiadás (post-MVP) vs. következő iterációk

**Első kiadás** (`30_terkep` 10.1): nézet-kapcsoló (`?view=map`); státusz-színezett pinek a tabot/szűrőket tisztelve; kategória-szűrő; kliens-oldali klaszterezés; pin-katt → előnézet → adatlap-link; „N helyszín nélkül" indikátor; teljes szűrt halmaz betöltése; a vezető ugyanezt a térképet látja; reszponzív működés.

**Következő iterációk** (`30_terkep` 10.2):

| Elem | Indok a halasztásra |
|---|---|
| Viewport-alapú betöltés (nagy ügyszám) | A pilot-város a teljes halmazt elbírja (8.1, TD-T3) |
| Hőtérkép a vezetői áttekintéshez | A GIS-határt közelíti; külön mérlegelés (`30_terkep` 8.2) |
| A térkép mint triage-segéd | A duplikáció-doboz ezt már lefedi; ne duplikáljuk |
| Útvonaltervezés a terepi csapatnak | Esetleg a terepi mobilapp dolga |
| Idő-alapú lejátszás | Elemzés-jellegű; GIS-határ |

### 8.2 Feltételezések

- A helyszín `decimal` `latitude`/`longitude` páros, már létezik (`00_domain_model.md` 1.2.4); új adatfelvétel nincs.
- A polgári app-ból érkező ügy mindig tartalmaz GPS-t; a hiány a manuális ügyekre korlátozódik (`30_terkep` 5.).
- A pilot-város ügyszáma elbírja a teljes szűrt halmaz egyszerre betöltését (TD-T3, `30_terkep` 8.1).
- A Leaflet + OSM tile elérhető és integrálható (SD-77 precedens).
- A térkép kategória-szűrője ugyanaz a gyökér-`Category` lookup, mint a listáé.

### 8.3 Nyitott kérdések, megtartott hiányok, visszacsorgó jelzések

| # | Tétel | Típus / hatáskör |
|---|---|---|
| **NY-T-1** | Tenant-szintű alapértelmezett térkép-középpont (most fit-bounds + hardcoded HU default) | **Megtartott hiány** — nem blokkol; SD-77 IT-MN-5 / tenant-config feature |
| **NY-T-2** | Viewport-paging küszöbe nagy ügyszámú városokra | Iteráció (`30_terkep` 8.1); v1 = teljes halmaz |
| **NY-T-3** | A pontos pin-színkódok és a popup-kártya vizuális megjelenése | **Delegálva a Claude Designnak**, a kész specből |
| **VF-T-1** | A `located` szűrő (TD-T2) a `GET /v1/tickets`-en | **Visszacsorgó:** a `10_bejelentes_lista_es_adatlap.md` 3.2.1 szűrő-készletébe és a `CLAUDE.md`-be vezetendő |
| **VF-T-2** | K-042 felvétele | **Stratégiai projekt:** `kanonikus_donek.md` v5 → v6 (`30_terkep` 13.) |
| **VF-T-3** | A polgári oldali térkép | Átadva a polgári mobilapp / webes funnel modulnak (`30_terkep` 8.3) |

### 8.4 A feature tervezési döntései — döntésnaplóba vezetendők

A `99_donesnaplo.md`-be, SD-szám kiosztással:

| Jelölés | Döntés | Típus |
|---|---|---|
| **TD-T1** | A térkép adatforrása dedikált, nem-lapozott `GET /v1/tickets/map` végpont (a lista `FilterQuery`-szűrőjét újrahasználva) | technikai |
| **TD-T2** | A térkép-válasz `unlocatedCount`-ot is ad; az indikátor a `located=false` lista-szűrőre vezet (additív szűrő a `GET /v1/tickets`-en) | technikai (+ visszacsorgó) |
| **TD-T3** | Kliens-oldali klaszterezés; teljes szűrt halmaz az első kiadásra; viewport-paging iteráció | technikai |
| **TD-T4** | Térkép-szolgáltató: **Leaflet + OSM** (SD-77-konzisztens, ingyenes) | **üzleti/scope — az alapító döntötte** |
| **TD-T5** | A nézet-kapcsoló a `[tableState]` URL-állapotában él: `?view=map` (SD-78 angol param) | technikai |
| **TD-T6** | A térkép read-only a státuszra — nincs inline triage a pinen | technikai |
| **TD-T7** | Térkép-középpont: fit-bounds a pinekre; üres halmaznál hardcoded HU default (tenant-középpont megtartott hiány) | technikai |

### 8.5 Hivatkozott dokumentumok

`30_terkep_v1.md` · `10_bejelentes_lista_es_adatlap.md` · `00_domain_model.md` (1.2, 1.3, 2.1) · `02_globalis_allapotgep.md` · `05_jogosultsagok_v2.md` · `90_sitemap_v3.md` · `01_kozos_mintak.md` · `kanonikus_donek.md` (K-005, K-009, K-016, K-029, K-036, K-042) · a `project_backend` és `project_backend_client_angular` `CLAUDE.md` · döntésnapló (SD-16, SD-30, SD-44, SD-77, SD-78).

---

## Verziónapló

- **v1 (2026.06.30)** — Első specifikáció a `30_terkep_v1.md` funkcionális tervből. Nézet-kapcsoló (`?view=map`) a meglévő `/tickets` listán; új read-only `GET /v1/tickets/map` végpont + `TicketMapPointDto`; additív `located` lista-szűrő; Leaflet+OSM komponens (TD-T4, SD-77-konzisztens); kliens-oldali klaszterezés; pin = státusz, előnézet-kártya → adatlap; koordináta nélküli ügyek `unlocatedCount`-tal. Új entitás/mező/index nincs. A multi-tenancy a testvér-specekkel egyezően standard (Tenant DB). Hét tervezési döntés (TD-T1—TD-T7) döntésnaplóba; három visszacsorgó jelzés (VF-T-1—VF-T-3).
