# HANDOFF-DELTA — Lezárás-fotó (`ResolutionPhoto`)

**Dátum.** 2026.07.07 · **Forrás-spec.** `uploads/urbino-docs/20_admin_felulet/40_lezaras_foto.md` (v1.0, 2026.07.03) · **Döntés-napló.** `manager-system/DECISIONS.md` **D-21**
**Címzett.** A pilot-portolást végző fejlesztő + Claude Code. Ez a dokumentum a 2026.05.27-i HANDOFF.md **inkrementális kiegészítése** — a fő handoff érvényben marad, ez csak az új feature UI-rétegét adja át.

---

## 1. Mi ez a feature?

A diszpécser/terepi felelős a bejelentés lezárásakor fotóval dokumentálhatja a munkát. A `resolve` visszaáll a valódi 5.2-szabályra: **legalább egy `ResolutionPhoto` VAGY kitöltött `resolutionNote`** (a `99_dev_spec_elteresek.md` 3. döntésének „szöveg mindig kötelező" ideiglenes állapota megszűnik). Két admin-felület:

1. **Lezárás-dialógus** — az A1 adatlap ActionBar „Lezárás" gombja mögött (eddig nem volt mockolva).
2. **Lezárás-dokumentáció szekció** — a lezárt (`Resolved`) adatlapon: `resolutionNote` + `ResolutionPhoto`-galéria; alatta a „Bejelentői fotók" (`ReportPhoto`) galéria, MVP-ben jellemzően üres-állapottal.

## 2. Hol nézd meg (mock)

`manager-system/preview/screens/a1-bejelentes-adatlap.html` — új **„A1 adatlap — Lezárás-fotó"** DCSection, 7 artboard:

| # | Artboard | Mit mutat |
|---|---|---|
| 5 | `dlg-kontextus` | Dialógus overlay a dimmelt Folyamatban-adatlap fölött |
| 6 | `dlg-ures` | **Élő mock** — üres állapot, a gomb-gate gépelésre/feltöltésre élőben vált (szimulált progress) |
| 7 | `dlg-feltoltes` | Per-kép feltöltés-progress |
| 8 | `dlg-kesz` | 3 fotó + megjegyzés, aktív Lezárás + footer-összegzés |
| 9 | `dlg-hiba` | 422 `file.invalidType` mezőszintű hibasáv (tooLarge/tooMany ugyanígy) |
| 10 | `dlg-betelt` | 10/10 — betelt-zóna + `file.tooMany` |
| 11 | `megoldva-szoveges` | Szöveges lezárás: „Nincs lezárás-fotó" üres galéria + „Bejelentői fotók" üres-állapot |

+ a meglévő **3-as (Megoldva)** artboard kiegészült a lezárás-dokumentáció szekcióval (fotós eset).

## 3. Új / módosult mock-réteg fájlok

| Fájl | Változás |
|---|---|
| `manager-system/organisms/ticket-resolve-dialog.jsx` | **ÚJ** — `TicketResolveDialog` (API: ORGANISMS.md) |
| `manager-system/organisms/photo-uploader.jsx` | **v1.1** — per-kép `status`/`progress`, `accept`, `formatsLabel`, `error`, `fullText`, `disabled`. Visszafelé kompatibilis (A2/A10/A11 változatlan) |
| `manager-system/organisms/icon.jsx` | +3 ikon: `check`, `camera`, `zoom-in` |
| `manager-system/organisms/_styles.css` | Új záró-szekció: `.mgr-resolve__*` + PhotoUploader v1.1 osztályok |
| `manager-system/preview/screens/a1-bejelentes-adatlap.html` | Új DCSection + `ResolutionDocs` screen-komponens + StateResolved-bővítés |
| `i18n-keys-mgr.json` | `manager.ticket.resolution.*` + `manager.ticket.error.file.*` / `error.state.invalidState` |
| `manager-system/SITEMAP.md`, `ORGANISMS.md`, `DECISIONS.md` (D-21) | Regisztráció |

## 4. PrimeNG / Angular cross-mapping (a HANDOFF.md 4. szekció mintájára)

| Mock | Angular-oldal |
|---|---|
| `TicketResolveDialog` | `p-dialog` (modal, `lg` ≈ 800px) — **NEM** `p-confirmDialog`; a footer egyedi template (szabály-hint balra + Mégse/Lezárás jobbra, primer `[disabled]` a gate-en) |
| Gate-logika | `canResolve = photos.some(done) \|\| note.trim().length > 0` — csak kliens-oldali előjelzés; a `resolve` 422-jét ettől függetlenül kezelni (SD-28 minta) |
| `PhotoUploader` v1.1 | Meglévő feltöltő-minta bővítése; `p-fileUpload` helyett a saját dropzone maradhat — a lényeg: **azonnali** `POST /v1/tickets/{id}/resolution-photos` képenként (multipart `file`), a válasz `AttachmentDto.url`-jével preview; törlés `DELETE .../resolution-photos/{attachmentId}` |
| Per-kép progress | `HttpClient` `reportProgress: true` → thumbnail-overlay progress-sáv |
| Mezőszintű hibák | `422 fieldErrors.file.required/invalidType/tooLarge/tooMany` → hibasáv a zóna alatt; `409 { reason: "invalid_state" }` → nem-blokkoló toast + adatlap-refresh (spec §4.5) |
| Lezárás-dokumentáció szekció | A `TicketDto.attachments` `kind === 'ResolutionPhoto'` csoportja `sortOrder` szerint + `resolutionNote`; galéria-lightbox a meglévő `<app-gallery>`-vel (mockban csak hover-jelzés) |
| „Bejelentői fotók" | `kind === 'ReportPhoto'` csoport — MVP-ben üres-állapot (dashed sáv); a feltöltés IT-MN-1 (külön feature) |

## 5. Validációs korlátok (UI-ban megjelenítve, szerver a forrás)

JPEG / PNG / WebP · max **10 MB**/kép · max **10** fotó/bejelentés · `resolutionNote` max **2000** karakter · feltöltés/törlés csak nem-végállapotban (`409 invalid_state`).

## 6. Megfigyelések a spec-csapatnak / fejlesztőnek

1. **AC-13 vs meglévő mock-timeline.** A spec szerint a fotó-feltöltés **nem** ír `ActivityLog`-eseményt. A meglévő A1 mock Folyamatban-timeline-jában van egy `AttachmentAdded` esemény (2026.05-ös mock-adat) — a portoláskor ez NE legyen minta a `ResolutionPhoto`-ágra; a kurátorált napló elve él.
2. **`ticket.resolution.dialog.*` kulcsok** a spec §4.6-on túlmutatnak (title, noteLabel, rule, stb.) — a dialógushoz szükséges teljes készletet az `i18n-keys-mgr.json` hordozza; a spec-beli 10 kulcs mind lefedve, változatlan szöveggel.
3. **README.md kulcs-szám (351) és organism-szám (42) elavult** — +~20 i18n-kulcs, +1 organism. Szándékosan nem frissítettük a 2026.05.27-i csomag-leírást; ez a delta-doksi a hiteles kiegészítés.
4. **NY-LF-2 (polgári `resolutionNote` vs `resolutionMessage`)** — a dialógus-textarea placeholder-e semleges; ha a polgári spec külön mezőt hoz, a felirat („Hogyan oldottuk meg?") változatlan maradhat.

*— Urbino Manager UI-csapat · 2026.07.07*
