Dev Specs

Spec · E11 — Mobile shell & dashboards [mobile]

Epic E11 — Mobile shell & dashboards [mobile · 375×812]

Назначение эпика: Оболочка мобильного приложения field-персонала (Housekeeping, Handyman, Coordinators в поле): нижняя навигация из 5 табов и три «дашборд»-экрана — Home (анонсы + операционная сводка дня + отзывы), Units (мои/закреплённые юниты с прогрессом уборки), Profile (моя смена, посещаемость, балансы отпусков, предупреждения). Tasks и Messager специфицированы в своих эпиках — здесь только как пункты shell. Участвует в use-cases: UC field-исполнения (вход → ориентация в дне → задачи → связь → профиль/отметки). Конкретные UC-номера в 00-overview не пронумерованы для mobile → см. cross-ref ниже. Сущности (owns/touches): Announcement (read), Reservation (read, сводка), Review (read, сводка), Unit (read, сводка), Task (read, сводка), Employee + Attendance + LeaveRequest (read — для Profile). Сам shell сущностей не владеет, только агрегирует чужие. Экраны: S28 (Home), S47 (Units), S51 (Profile) + нижняя навигация (Home · Units · Tasks · Messager · Profile). Cross-ref: S50 My Tasks → E04, S49 Messager → E10. Открытые findings: F-filter-hierarchy-assignee (видимость «своих» юнитов/задач для field-роли и vendors — см. 00-overview §3); см. также §«Дозумано».


Mobile shell — нижняя навигация [mobile]

  • Назначение: постоянный bottom tab-bar, связывающий 5 разделов приложения; единая точка переключения контекста для field-персонала.
  • Источник (Miro): граф навигации в Miro машиночитаемо отсутствовал (00-overview §2) → tab-bar выстроен логически из набора mobile-экранов. Сами экраны реальны (S28/S47/S50/S49/S51), сам контейнер-таб-бар — 🟡.
  • Layout: фиксированный нижний бар на всех mobile-экранах; 5 равных иконок-табов с подписью; активный таб подсвечен (electric-green токен). Контент над баром скроллится, бар — нет.
  • Данные на экране: 5 пунктов — Home, Units, Tasks, Messager, Profile. Опционально badge-счётчик на Tasks (число due/overdue) и Messager (непрочитанные/Notifications) 🟡.
  • Контролы и действия:
    • Home (tab) → S28 Home dashboard.
    • Units (tab) → S47 Units list.
    • Tasks (tab) → S50 My Tasks (E04) — мои назначенные задачи + исполнение (checklist+timer).
    • Messager (tab) → S49 Messager (E10) — Chats/Groups/Notifications.
    • Profile (tab) → S51 Profile.
  • Состояния/вкладки: active / inactive per tab; опционально badge present/absent.
  • Связи (data-flow): чистый навигационный слой — не читает доменных данных сам (кроме badge-агрегатов). Каждый таб монтирует свой экран; экраны независимы.
  • Мутации: нет (навигация). Badge-счётчики — derived read.
  • Права: виден всем mobile-ролям (Housekeeping, Handyman, Coordinators в поле, Vendors). Состав табов одинаков; разграничение — на уровне контента экранов (например, Vendors видят только назначенные задачи в Tasks).
  • 🟡 [не было додумано]: сам tab-bar как компонент, badge-счётчики, подсветка активного таба, скролл-поведение. Обоснование: пять mockup-экранов существуют, но связующая оболочка в Miro не нарисована — без неё mobile-приложение не навигируемо. Минимально: 5 табов = ровно набор mobile-экранов, ничего сверх.
  • Edge cases: глубокий экран (исполнение задачи, чат, карточка юнита) — bottom-bar остаётся видим, переключение таба возвращает к корню раздела; offline — bar активен, контент экранов показывает свой empty/error.

S28 — Home [mobile]

  • Назначение: стартовый дашборд дня: что нового (анонсы), операционная сводка (заезды/выезды), свежие отзывы — ориентация field-сотрудника «здесь и сейчас».
  • Источник (Miro): «Screen 7», id 3458764673066832684, 375×812 (texts=33, mockups=3, images=4).
  • Layout (сверху вниз):
    1. Announcements — таб-переключатель New / Archive + список карточек-анонсов.
    2. Reservations — сводка-карточки: Check Outs (счётчик) и Check Ins (счётчик) с примером строки (дата · вилла · гость).
    3. Reviews — таб-переключатель Good Reviews / Bad Reviews / All Reviews + таблица-список (Date · Villa · Guest · Rating · Comment).
  • Данные на экране (дословные лейблы):
    • Announcements: New, Archive; карточка — заголовок (New Villa Alaya Check In Policy!), дата (22/05/2026), текст-превью.
    • Reservations: счётчики 5, 2, 1; подписи Reservations, Check Outs, Check Ins; строка — 22/05/2026 · Alaya Villa · Guest Name.
    • Reviews: Good Reviews, Bad Reviews, All Reviews; колонки Date, Villa, Guest, Rating, Comment; строка — 22/05/2026 · Alaya Villa · Guest Name · 4 · Comment comment comment comment ....
  • Контролы и действия:
    • New / Archive (filter/tab) → переключает список анонсов (свежие / архив прочитанных).
    • Карточка анонса (button) → раскрытие полного текста 🟡 (в скелете — только превью; full-view не нарисован).
    • Check Outs / Check Ins (button/счётчик) → переход к списку соответствующих резерваций 🟡 (целевой экран в скелете не задан).
    • Good / Bad / All Reviews (filter/tab) → фильтрует таблицу отзывов по тональности.
    • Строка отзыва (button) → деталь отзыва (E08 Reviews) 🟡 навигация на mobile не нарисована.
  • Состояния/вкладки: Announcements NewArchive; Reviews GoodBadAll; empty (нет анонсов / нет резерваций на дату / нет отзывов); loading; filtered.
  • Связи (data-flow):
    • Announcements ← Announcement (создаются в desktop-контуре коммуникаций, E10).
    • Reservations-сводка ← Reservation (заезды/выезды на дату; та же сущность, что триггерит cleaning/check-in задачи — 00-overview §5).
    • Reviews ← Review (заполняются после check-out; полный дашборд — E08, здесь read-срез).
    • Действий-мутаций экран не инициирует (read-only дашборд).
  • Мутации: нет (read-only). Опционально mark-announcement-as-read при открытии 🟡.
  • Права: все mobile-роли. Reservations/Reviews — сводка по department-scoped / закреплённым юнитам (F-filter-hierarchy-assignee).
  • 🟡 [не было додумано]: целевые экраны переходов (full-анонс, список check-ins/outs, mobile-деталь отзыва) не нарисованы — помечены выше; mark-as-read для New/Archive логически следует из наличия двух состояний, но в скелете не показан.
  • Edge cases: нет анонсов → empty в New; счётчики резерваций = 0 → «No check-ins/outs today»; длинный заголовок анонса / длинный comment отзыва → truncate с ... (как в макете); нет прав на юнит → строка не показывается.

S47 — Units [mobile]

  • Назначение: мобильный срез закреплённых юнитов, сгруппированный по статусу занятости, с прогрессом сегодняшней уборки — field-сотрудник видит «где я нужен».
  • Источник (Miro): «Screen 13», id 3458764673077372470, 375×812 (texts=18, mockups=3).
  • Layout: заголовок Units; список секциями по статусу OCCUPIED / VACANT; в каждой секции — карточки юнитов; на карточке задача-индикатор (Daily Cleaning) со статус-чипом on track и временем-дедлайном.
  • Данные на экране (дословные лейблы): Units; секции OCCUPIED, VACANT; чип on track; время 12:00 26/06/2026; задача Daly Cleaning (в макете опечатка — целевой лейбл Daily Cleaning).
  • Контролы и действия:
    • Секции OCCUPIED / VACANT (группировка) — визуальная группировка по статусу занятости юнита.
    • Карточка юнита (button) → карточка юнита (E01 Properties/Units) 🟡 mobile-навигация на детали не нарисована.
    • Строка Daily Cleaning + чип (button) → соответствующая задача в Tasks (E04) 🟡 связь логическая.
  • Состояния/вкладки: группы OCCUPIED / VACANT; статус-чип задачи on track / (амбер) due / (red) overdue — единые токены (00-overview §4); empty (нет закреплённых юнитов); filtered.
  • Связи (data-flow):
    • ← Unit (статус OCCUPIED/VACANT — производное от Reservation: занят/свободен).
    • ← Task (today cleaning task на юните: дедлайн + on-track статус; та же сущность, что в S50/E04).
    • Read-only; действия ведут в E01/E04, мутаций здесь нет.
  • Мутации: нет (read-only обзор). Завершение/старт уборки — в исполнении задачи (E04).
  • Права: field-роли — только закреплённые/department-scoped юниты; Coordinator — свои юниты (F-filter-hierarchy-assignee).
  • 🟡 [не было додумано]: переходы на карточку юнита и на задачу не нарисованы; чипы due/overdue экстраполированы из единой статус-палитры (00-overview §4) — в макете виден только on track. Опечатка Daly Cleaning → каноничный лейбл Daily Cleaning.
  • Edge cases: нет юнитов в статусе → секция скрыта/empty; несколько задач на юните → несколько строк-индикаторов (в макете по одной Daily Cleaning на карточку); просроченная уборка → red-чип overdue; нет прав → юнит не в списке.

S51 — Profile [mobile]

  • Назначение: личный экран сотрудника: кто я, моя сегодняшняя смена и факт прихода/ухода, балансы отпусков и предупреждения — самообслуживание HR-контура в поле.
  • Источник (Miro): «Screen 14», id 3458764673078779088, 375×812 (texts=12, mockups=3, images=1).
  • Layout (сверху вниз): шапка профиля (аватар + имя + роль + дата); блок смены (плановое окно + check-in/check-out факт); блок балансов (Annual Leave Balance, Public Days Balance); блок Warnings со счётчиком.
  • Данные на экране (дословные лейблы):
    • Шапка: Agung Putri (имя), Housekeeping Coordinator (роль), 25/06/2026 (дата).
    • Смена: 09:00 - 18:00 (плановое окно), 08:46 (факт check-in), --:-- (check-out ещё не отмечен).
    • Балансы: Annual Leave Balance = 10, Public Days Balance = 5.
    • Warnings = 10.
  • Контролы и действия:
    • Check-out отметка 🟡 — в макете check-out = --:-- (пусто), кнопка отметки не нарисована, но подразумевается симметрия с check-in (Attendance, E09).
    • Annual Leave Balance / Public Days Balance (button) → история/запрос отпуска (Leave Management, E09) 🟡 навигация не нарисована.
    • Warnings (button) → список предупреждений 🟡 целевой экран не нарисован.
  • Состояния/вкладки: check-out отмечен / не отмечен (--:--); балансы > 0 / 0; warnings > 0 / 0; loading.
  • Связи (data-flow):
    • ← Employee (имя, роль, плановая смена 09:00 - 18:00).
    • ← Attendance (факт check-in 08:46, check-out; пишется при отметке прихода/ухода — 00-overview §5: «Employee check-in/out (mobile) → Attendance»).
    • ← LeaveRequest / Leave balance (Annual/Public day balances — обновляются при approve отпуска, E09).
    • ← Warnings (HR-дисциплина; источник-сущность в скелете не назван — 🟡).
  • Мутации: потенциально check-out (write Attendance) 🟡 — единственная возможная мутация на экране; в макете кнопка не нарисована, поведение симметрично check-in из E09.
  • Права: только own-профиль (каждый видит свой). Чужие профили / редактирование — desktop HR (E09).
  • 🟡 [не было додумано]: кнопка check-out (симметрия с зафиксированным check-in 08:46 и пустым --:--); переходы из балансов/warnings на детали; источник сущности Warnings. Обоснование: check-in уже зафиксирован фактическим временем → парная отметка ухода неизбежна для attendance-цикла; без неё --:-- навсегда.
  • Edge cases: смена не начата → check-in --:--; оба отмечены → показ обоих времён; баланс 0 → 0 (не скрывать); warnings 0 → блок пустой/скрыт; данные смены отсутствуют (выходной) → «No shift today» 🟡.

Cross-screen relations (внутри эпика)

            ┌──────────────── bottom tab-bar (Home · Units · Tasks · Messager · Profile) ────────────────┐
            ▼              ▼                         ▼ (E04)            ▼ (E10)            ▼
        S28 Home       S47 Units                 S50 My Tasks        S49 Messager     S51 Profile
            │              │                                                              │
            │ (read)       │ Daily Cleaning task ──► S50 (E04, исполнение)                │ check-out
   Announcement/          Unit ──► карточка юнита (E01)                                    ▼
   Reservation/                                                                   Attendance (E09)
   Review (read)
  • Tab-bar — единственный связующий слой: каждый таб монтирует корень своего раздела; глубокие переходы (карточка юнита E01, исполнение задачи E04, чат E10, leave E09) уходят за пределы эпика.
  • Home, Units, Profile между собой не связаны прямыми переходами — только через tab-bar. Это намеренно (три независимых дашборда под одной оболочкой).

Дозумано на уровне эпика 🟡

ЧтоЗачемОтклонение от прототипа
Bottom tab-bar как компонент (5 табов, active-подсветка, опц. badge)Mobile-экраны в Miro нарисованы, но связующая оболочка отсутствует — без неё приложение не навигируемоКонтейнер не нарисован; состав табов = ровно набор существующих mobile-экранов, ничего сверх
Целевые экраны переходов (full-анонс, список check-ins/outs, mobile-деталь отзыва, карточка юнита, leave-history, warnings-list)Тапабельные элементы подразумевают навигациюВ скелете нарисованы только текущие экраны; переходы помечены 🟡 пер-экранно, новые экраны НЕ специфицируются (живут в E01/E04/E08/E09/E10)
Check-out отметка на S51Зафиксирован факт check-in 08:46 и пустой --:-- → парная отметка ухода неизбежна для attendance-циклаКнопка не нарисована; поведение наследуется из E09
Login / онбординг экранПрототип не содержит ни одного экрана входа/аутентификации, при этом роль определяет видимость (00-overview §3 «роль фиксируется на входе»)Полностью отсутствует в Miro. Для прототипа допустимо начинать сразу с Home (роль — мок-параметр); для реализации — нужен экран входа. Помечено как пробел скелета, экран НЕ досочиняется здесь
Статус-чипы due/overdue на S47Единая статус-палитра 00-overview §4В макете виден только on track; остальные экстраполированы из общих токенов, новых данных не вводят