Назначение эпика: Сбор отзывов гостей по завершённым бронированиям (per-reservation ratings + comment) и операционная аналитика — какие юниты и какие сотрудники дают какое качество гостевого опыта. Участвует в use-cases: UC-5 (review request → review → reviews dashboard, см. 00-overview §5). Сущности (owns/touches): Review (owns), Reservation (touches — источник review request), Unit (touches), Employee (touches — heat-grid строится по сотрудникам). Экраны: S05 (Reviews list per-reservation), S52 (Reviews heat-grid: Employees × Units). Открытые findings: F-rating-scale-airbnb-vs-booking (CRITICAL для модели Review — см. findings.md; нормализация шкал описана ниже).
Статус реализации (2026-06-21):
- ✅ WP-1 DONE + PROD LIVE (PR #22
41ca688, DEV+PROD на /staffapp/reviews): S05 Reviews list (/reviews, standalone) — FiltersBar (search + Platform + Unit dropdown + inertFilters🟡) + DataTable 14 колонок (горизонт-скролл, normalized rating) + Drawer (row-click → comment + разбивка под-рейтингов normalized+raw). OwnsReview/ReviewListItem/ReviewSubRatings/ReviewFilters+ReviewPlatform/RatingScale. РешаетF-rating-scale-airbnb-vs-booking(прототип): raw+scale хранятся, normalized к 5 отображается (Booking/2), null под-рейтинг → «—». utilsnormalizeRating/formatRating/filterReviews/toReviewListItem. План:docs/superpowers/plans/2026-06-21-e08-reviews-wp1.md. Read-only (мутаций нет).- ✅ WP-2 DONE (2026-06-22, ветка
feat/e08-reviews-wp2): S52 heat-grid (/reviews/heat-grid, Employees × Units). Новый 2D-grid примитивcore/ui/heat-grid(sticky оси, горизонт/верт-скролл); heat-cell = цвет по avg normalized (high/mid/low/none токены, AA-контраст) + число = count. Pure-utilsheatLevel/buildHeatGrid(sparse cells, оси sort alpha, avg по normalized 5-scale) /filterHeatRows(rows-only, units сохраняются) + actiongetHeatGrid. Связь Review→Employee — явное опциональное полеReview.attributedEmployees?: string[](домен-правило A/B/C/D заказчик выберет позже; фронт независим). Drill-down: клик по ячейке → атомарныйapplyDrill(employee, unit)в reviews-filters store →/reviewsотфильтрован + drill-context banner «{employee} · {unit}» с Clear. Toggle List↔Heat-grid. Fast-filter = employee-search + Platform; period(today)/advanced — inert 🟡. PDD blind: pre-review 3 CRIT+2 IMP (resolved-in-plan: sparse cells, units-preserve, i18n-strings, store-init+atomic drill, employee-allowlist) → validation 661/661 первый прогон (+77) → post-review 1 IMP (heat-cell AA contrast) +1 NIT (banner unit) fix-now → verify-feature SHIP 9/9 (real-browser, EN/ID, 0 console errors). План:docs/superpowers/plans/2026-06-22-e08-reviews-wp2.md. E08 desktop завершён.
Reviews · id 3458764672705780426 (1440×900, input_text×1 — поле fast filters).fast filters + кнопка filters (расширенные/сохранённые) → широкая data-table со скроллом по горизонтали (много колонок под-рейтингов). Detail отзыва — 🟡 через right-side drawer (см. ниже).ID — идентификатор отзыва/брони (в данных: 34324324, 234234324, 224324324).Platform — источник: Booking.com / Airbnb.Guest — имя гостя (placeholder John Wick).Review Date — дата отзыва (22/05/2026).Unit — юнит (Alaya).Check In / Check Out — даты проживания (22/05/2026).Rating — общий рейтинг отзыва.Value, Cleanliness, Location, Communication, Accuracy, Check In.3 3 3 3 3 3 3 + хвост 1; 4 4 4 4 4 4 4 + 2; 5 5 5 5 5 5 5 + 3) — общий + 6 под-рейтингов; хвостовое значение (1/2/3) — 🟡 интерпретируем как агрегированный балл/нормализованную оценку (см. эпик-уровень).fast filters (input/filter) → быстрый поиск/фильтр по строкам.filters (button) → панель расширенных фильтров. Фильтруемые поля из контента: Reservation, Comments, Communication, Accuracy, Check In (+ предполагаемо Platform, Unit, Rating — 🟡).🟡 (в скелете detail-экрана отзыва нет).0.Copy of Reviews · id 3458764672713018874 (1440×900, mockups×29 = ячейки сетки, input_text×1 = fast filters).fast filters со встроенным пресетом (today) + кнопка filters → двумерная grid-таблица: строки = Employees, колонки = Units (в данных колонки Alaya ×6). Ячейки (29 mockups) — цветовые/числовые маркеры рейтинга (heat-cell).Employees (список сотрудников; конкретные имена в скелете не заполнены).Units (Alaya повторяется — placeholder под список юнитов).🟡 — точная метрика ячейки в скелете не подписана.fast filters (filter) с пресетом (today) → временно́е окно агрегации (today и др. периоды).filters (button) → расширенные фильтры (период, platform, department 🟡).🟡 drill-down к отфильтрованному S05 (отзывы этого сотрудника по этому юниту). В скелете переход не задан.today / иной) · empty (нет отзывов в окне) · loading. Вкладок нет.🟡 через Task/Assignment, обслуживавший бронь (точная связь Review→Employee в модели не задана — см. эпик-уровень).today без данных → empty-state по всей сетке.S05 (плоский реестр отзывов) ──агрегация по Employee×Unit──► S52 (heat-grid)
S52 ячейка ─клик (🟡 drill-down)─► S05 (отфильтрованный по employee+unit)
Оба читают одну сущность Review; ни один не мутирует её.
Ответы со встречи Akira × Sergey (реестр
00-client-questions.md). Перекрывают соответствующие 🟡-допущения ниже.
Review.attributedEmployees? (WP-2) бэкенд заполняет командой кластера — фронт heat-grid не меняется.platform_scale: 5 | 10) — без потери исходных данных./2), показывая нормализованное значение; сырое — в tooltip/drawer.Value/Cleanliness/Location/Communication/Accuracy/Check In) — категории Airbnb; Booking даёт частично иной набор → при отсутствии категории ячейка пустая (не 0), агрегаты считают только присутствующие.