Назначение эпика: реестр объектов (Units) и карточка юнита с вкладками — единая точка управления свойством: профиль, зоны, задачи/события/проблемы по объекту, инвентарь и его движения, инфраструктура, дефолтные назначения по департаментам.
Участвует в use-cases: UC-1 (recalc engine — Assignments/Services как вход), UC-2 (task lifecycle — Tasks/Issues/History-вкладки), UC-3 (инвентарь и его движения).
Сущности (owns/touches): owns — Unit, UnitArea, InventoryItem, InventoryMove, InfraItem, AssignmentDefault. touches (read-only внутри эпика) — Task, Issue, Service, Reservation.
Экраны: S08 (Property Card — реестр), S10 + S56 (Unit Profile/Details/Areas), S12 (Tasks-вкладка), S16 (History-вкладка), S06 + S17 (Issues-вкладка), S09 + S27 (Inventory + Moves), S18 (Infrastructure), S39 (Assignments / Department Defaults). «Copy of …»-дубли сведены в единые экраны с вкладками/состояниями.
Открытые findings: F (NIT) filter-hierarchy-assignee — каскад фильтра назначения Department > Cluster > Assignee (задевает Assignments + фильтры таблиц); F (NIT) units-scope-live-only — показывать в реестре все юниты или только «live» (задевает S08).
Карта вкладок карточки юнита (единый tab-bar на всех экранах юнита):
Profile · Areas · Tasks · Issues · History · Inventory · Infrastructure · Assignments. Header каждой вкладки:Unit Name+ tab-bar. В прототипе вкладкиIInventory/Infrustructure— опечатки исходника; здесь нормализованы какInventory/Infrastructure.
Property Card (id 3458764671288294568). controls: input_button×9, input_text×1, input_toggle×9.fast filters + filters → data-table (строка = юнит). Toggle в каждой строке (×9 = ряды таблицы) — переключатель видимости/активности юнита (см. 🟡).Unit, Group, Location, ID, Status, Lark ID, Location Link, Vacancy. Пример строки: Villa Alaya / Cluster 1 / Ubud / 123456 / … / OCCUPIED|VACANT.fast filters (filter) — быстрые предустановленные фильтры.filters (filter) — расширенные/сохранённые фильтры.Profile (S10).Location Link (button) — открыть Google Map локацию объекта.Unit (+ геоиерархия Region→Area→SubArea→Cluster через Group/Location, текущая Vacancy из активных Reservation). Открывает карточку юнита (вкладочные экраны эпика).Unit.active, 🟡). Создание/редактирование юнита в прототипе не выявлено — read+navigate.Unit.active), т.к. это единственное row-level действие и связано с findings units-scope-live-only. (2) + add unit — не было в прототипе; не добавляем (юниты, вероятно, заводятся извне/при онбординге), отмечаем как пробел.Unit/Location — усечение с tooltip; Vacancy отсутствует (нет брони) → пусто/—; нет прав → реестр скрыт.Profile (id 3458764671312528295) — содержит под-секции Details и Areas; S56 (id 3458764671315309813) — «скелет» той же вкладки Profile (пустое состояние / каркас tab-bar). Сведено: S10 = заполненный Profile, S56 = его loading/empty-каркас.Unit Name + tab-bar) → две колонки: левая Details (форма-паспорт), правая Areas (список зон с количеством) + блок Services.Details: Property Name (Alaya), Lark ID (12345), Region (Bali), Area (Seminyak), Sub-Area (Legian), Cluster (1), Google Map Location, Tag, Priority, Keybox, Wifi Login, Wifi Password, PLN Meter.Areas (UnitArea, name + count): General 1, Entrance 1, Pool 1, Bedroom 2, Bathroom 2, Living Room 2, Kitchen 1, Rooftop 0, Outside 1, Parking 1.Services (привязанные сервисы объекта): Check-In, AC Maintenance.Google Map Location (link) → карта. Прочее — отображение полей. Edit-режим полей в прототипе явно не показан → read (🟡).Profile; S56 = empty/loading-каркас (поля ещё не загружены).Unit, UnitArea, и список Service где connected_properties содержит юнит (вход для recalc-движка UC-1). Areas — справочник зон для Requirements задач и фото-отчётов (E06).Wifi Password, Keybox) — ограничить по роли (🟡).Wifi Password/Keybox для не-Operations ролей — безопасность; добавлено как требование, не как экран.Rooftop 0 (зона декларирована, но count=0) — показывать; отсутствие сервисов → блок Services пуст; длинный Google Map Location — усечение/ссылка.Assignments / Department Defaults (id 3458764671318828829).Unit Name + tab-bar, активна Assignments) → секция Department Defaults (список департаментов с + назначить) + секции Items, Systems, Services (тоже с +).Department Defaults (департаменты): Cleaning, Inspection, Maintenance, Accounting, Property Services, Owner Services, Vendors → у каждого default-исполнитель.Services (с привязкой назначения): Check-In, AC Maintenance.Items, Systems — привязка дефолтных назначений к инвентарю/инфраструктуре.+ (button, ×3+) рядом с Department Defaults / Services / Items-Systems → добавить назначение (выбрать assignee/vendor для департамента или объекта). tab-bar (button) → вкладки.Assignments; empty (нет дефолтов — все департаменты без назначенного исполнителя).AssignmentDefault (department → assignee/vendor). Кормит recalc-движок (UC-1): при генерации service-task назначение берётся из Department Defaults юнита (см. 00-overview §5 «assign by Department Defaults»). Departments-список = роли из 00-overview §3.AssignmentDefault через + и редактирование строки.Department > Cluster > Assignee (открытый finding filter-hierarchy-assignee) — структуру каскада подтвердить у заказчика; здесь фиксируем как «department → assignee/vendor», cluster-уровень помечен открытым.Tasks per-unit (id 3458764671290782337). controls: input_text×1, input_button×5.Unit Name + tab-bar, активна Tasks) → fast filters + filters → data-table.ID, Task Name, Task, Status, Task Type, Created, Due, Finished, Assignment, Department, Sub-Department, Report. Примеры: 1 / AC Maintenance / Planned / … / Sarah Martinez / Operations; 2 / Check Wifi / Direct; 3 / Plumbing Repair / Maintenance Issue / Issue.fast filters/filters (filter); search (input_text); row click (button) → Task Detail (экран E03); Report (button) → связанный Maintenance/Area report (E06). Кнопки (×5) = фильтры/действия таблицы.Tasks; filtered (по Status/Type/Department); empty (нет задач у юнита).Task где unit = текущий (тип Direct|Schedule|Issue|Reservation, статусы Planned|New|In Progress|Finished). Источник задач — recalc-движок (Service+Template), прямое создание, Issue. Уходит в Task Detail (E03), Reports (E06).Finished пуст для не завершённых; задача без Assignment (см. S39 fallback).History per-unit (id 3458764671310179054). controls: input_text×1, input_dropdown×1, input_button×1.Unit Name + tab-bar, активна History) → фильтр-дропдаун (тип события) → data-table.Event Date, Event Type, Event, Task Type, Assignment, Department, Sub-Department, Created, Due, Finished, Report. Примеры строк: Reservation / Check Out; Task / Task Finished / Direct; Issue / Issue Reported / Maintenance Issue.Report (button) → отчёт.History; filtered (по Event Type); empty (нет событий).Reservation (check-in/out), Task (finished), Issue (reported) для данного юнита. Read-only лента (события — immutable past-tense, см. 00-overview §5).Report → пусто.Issues per-unit (id 3458764672842040021) — issue-ориентированный список; S06 (id 3458764672829442950) — расширенная вкладка Tasks/Issues/History с задаче-ориентированными колонками. Сведено: одна вкладка Issues с двумя представлениями (Issues-view = S17, Linked-Tasks-view = S06).Unit Name + tab-bar, активна Issues; видны под-табы Tasks · Issues · History) → fast filters + filters → data-table.ID, Issue, Description, Reported at, Department, Associated Task, Task Status, Task Report. Примеры: 1 / AC Maintenance / Operations; 2 / Check Wifi / Direct; 3 / Plumbing Repair / Maintenance Issue.
ID, Task Name, Task, Status, Task Type, Created, Due, Finished, Assignment, Department, Sub-Department, Report (= задачи, порождённые issue).fast filters/filters (filter); search (input_text); row click (button) → Issue detail (S40, эпик E05) или Associated Task (E03); Task Report (button) → отчёт. Кнопки (×4) = действия/фильтры таблицы.Issues, два представления (Issues / Linked Tasks); filtered; empty (нет проблем у юнита).Issue где unit = текущий (+ Associated Task через Task.issue_id). Создание/детали issue — эпик E05 (S40). Здесь — список+навигация в контексте юнита.Associated Task (ещё не назначена) → Task Status пуст; пустой список; длинный Description — усечение.Inventory per-unit (id 3458764671316196158) — список предметов; S09 (id 3458764672820350781) — журнал InventoryMove (движения с балансами). Сведено: вкладка Inventory = список предметов (S27) + drill-in в журнал движений предмета (S09).Unit Name + tab-bar, активна Inventory) → fast filters + filters → data-table предметов; клик по предмету → таблица движений (S09).Item, Item Type (Furniture/Kitchenware/…), Status, Amount, Room, Created, Written Off, Photos, Comments. Примеры: Chair / Furniture / 1 / Kitchen 1; Table / Furniture / 0 / Living Room 1; Spoon / Kitchenware / 10 / Kitchen 1.Move ID, Item, Item ID, Item Type, Status, Action, Amount, Balance Before, Balance After, Created, Voided, Reason, Created by, Voided by, Photos, Comments. Actions: New Item Purchase, Entry Error (= void/correction).fast filters/filters (filter); search (input_text); кнопки (×6–8) = действия/фильтры; < / > (button) — навигация назад/детали; row click (item) → журнал движений предмета; Photos/Comments (button) → вложения/комментарии.Inventory; under-view: Items / Moves; filtered; empty (нет инвентаря).InventoryItem + InventoryMove. Текущий Amount = Balance After последнего непогашенного move. Voided-движения (Entry Error) не меняют баланс задним числом — корректируются новым move (append-only журнал).InventoryMove (New Item Purchase, списание); void move (Voided/Voided by/Reason = Entry Error); create InventoryItem. Прямое редактирование Amount запрещено — только через move (🟡).Balance Before/After+Voided, но прямо не подписано; фиксируем как инвариант. (2) + add item / + new move — кнопки-действия подразумеваются (input_button×6–8), точные лейблы в прототипе не текстованы.Amount 0 (Table) — показывать как «out of stock», не скрывать; voided move → отдельная пометка, исключён из текущего баланса; предмет без движений (только заведён); длинный Reason/Comments — усечение.Infrastructure per-unit (id 3458764671317560393). controls: input_button×5, input_text×1.Unit Name + tab-bar, активна Infrastructure) → fast filters + filters → data-table.Item, System (Fire Safety/Pool/CCTV), Status, UID, Room, Created, Written Off, Photos, Documents. Примеры: Smoke Detector / Fire Safety / Kitchen 1 / uid 12333534234; Pool Pump / Pool / Pool; Camera / CCTV / Entrance.fast filters/filters (filter); search (input_text); кнопки (×5) = действия/фильтры (+ add item, фильтры по System/Status); row click (button) → деталь инфра-элемента (вложения/документы); Photos/Documents (button) → файлы.Infrastructure; filtered (по System/Status); empty (нет инфра-элементов).InfraItem (per-unit). Связь с Issue (S40 поле Infrastructure Item:) — issue может ссылаться на инфра-элемент; связь с Service/Template (системы → TaskTemplate sections). Read+manage в контексте юнита.InfraItem; Written Off (списание/вывод из эксплуатации); attach Photos/Documents.Written Off как переход состояния (а не просто дата) — трактуем как вывод из эксплуатации (аналог inventory void); прямо подписана только колонка-дата.Room; Written Off заполнен → показывать приглушённо/в отдельном фильтре «decommissioned»; нет фото/документов → пустые ячейки; длинный UID — моноширинный/усечение.S08 Property Card (registry)
└─ row click ─► Unit Card (общий tab-bar):
Profile (S10 / S56 каркас)
Areas (часть S10, правая колонка)
Tasks (S12) ──► Task Detail (E03) / Report (E06)
Issues (S06+S17) ──► Issue detail (E05·S40) / Associated Task (E03)
History (S16) ──► источник события (Task/Issue/Reservation)
Inventory (S27 items) ──► Moves journal (S09)
Infrastructure (S18) ──► item detail (photos/documents) ; ←→ Issue.Infrastructure Item (E05)
Assignments (S39) ──► Department Defaults кормят recalc-движок (UC-1, E02)
Profile.Services (S10) ──► Service (E02) ──recalc──► Tasks (S12)
Assignments.Department Defaults (S39) ──► assignee для сгенерированных service-tasks
Ответы со встречи Akira × Sergey (реестр
00-client-questions.md). Перекрывают соответствующие 🟡-допущения ниже. Перенос в вёрстку — отдельными PDD-проходами.
units-scope-live-only):
pmStatus != "not in management" (статусы launching / live / terminated).live (активные).Unit добавить поле larkStatus (pmStatus) в дополнение к внутреннему status/active — две раздельные колонки Status (внутр.) и Lark Status (из Lark).все → live; добавить поле/колонку Lark Status. → Tier B (Properties).Vacancy (S08) = производная Occupied/Vacant из броней Hostify (ровно два значения). Подтверждает текущие OCCUPIED/VACANT.Department > Cluster > Assignee (finding filter-hierarchy-assignee) — та же иерархия.Profile · Areas · Tasks · Issues · History · Inventory · Infrastructure · Assignments на всех экранах юнита; исправлены опечатки прототипа IInventory→Inventory, Infrustructure→Infrastructure. Отклонение от прототипа: косметика, состав вкладок не меняется.InventoryMove (включая void Entry Error), прямого редактирования Amount нет. Вытекает из колонок Balance Before/After+Voided, прямо не подписано.Wifi Password / Keybox Code для не-Operations ролей (паспорт юнита). Требование, не экран.units-scope-live-only (все юниты vs только «live»).Department > Cluster > Assignee помечен открытым (finding filter-hierarchy-assignee); в спеке зафиксировано минимальное department → assignee/vendor, cluster-уровень требует подтверждения.