New 3-Agent logic

This commit is contained in:
2025-08-24 11:49:41 +03:00
parent 7816bb3464
commit 64c8d5d893
8 changed files with 1361 additions and 379 deletions

View File

@@ -0,0 +1,564 @@
<?xml version="1.0" encoding="UTF-8"?>
<PROJECT_MANIFEST>
<!-- ================================================================================== -->
<!-- МЕТАДАННЫЕ ПРОЕКТА -->
<!-- ================================================================================== -->
<METADATA>
<PROJECT_INFO>
<name>Homebox Lens</name>
<description>Android-клиент для системы управления инвентарем Homebox. Позволяет пользователям управлять своим инвентарем, взаимодействуя с экземпляром сервера Homebox.</description>
</PROJECT_INFO>
<TECHNICAL_DECISIONS>
<!-- Общие технические решения -->
<DECISION id="tech_ui_framework" status="implemented">
<summary>UI Framework</summary>
<description>Пользовательский интерфейс приложения построен с использованием Jetpack Compose, современного декларативного UI-фреймворка от Google. Это обеспечивает быстрое создание, гибкость и поддержку динамических данных.</description>
</DECISION>
<DECISION id="tech_async" status="implemented">
<summary>Асинхронные операции</summary>
<description>Все асинхронные операции, такие как сетевые запросы или доступ к базе данных, выполняются с использованием Kotlin Coroutines. Это обеспечивает эффективное управление фоновыми задачами без блокировки основного потока.</description>
</DECISION>
<DECISION id="tech_networking" status="implemented">
<summary>Сетевое взаимодействие</summary>
<description>Для взаимодействия с API сервера Homebox используется стек технологий: Retrofit для создания типобезопасных HTTP-клиентов, OkHttp в качестве HTTP-клиента и Moshi для парсинга JSON.</description>
</DECISION>
<DECISION id="tech_database" status="implemented">
<summary>Локальное хранилище</summary>
<description>Для кэширования данных на устройстве используется библиотека Room. Она предоставляет абстракцию над SQLite и обеспечивает надежное локальное хранение данных.</description>
</DECISION>
<DECISION id="tech_logging" status="implemented">
<summary>Библиотека логирования</summary>
<description>В проекте используется Timber (timber.log.Timber) для всех целей логирования. Он предоставляет простой и расширяемый API для логирования.</description>
</DECISION>
<DECISION id="tech_i18n" status="implemented">
<summary>Интернационализация (Мультиязычность)</summary>
<description>
Приложение должно поддерживать несколько языков для обеспечения доступности для глобальной аудитории.
- Все строки, видимые пользователю, вынесены в `app/src/main/res/values/strings.xml`.
- Язык по умолчанию - русский (ru).
- В коде для доступа к строкам используются ссылки на ресурсы (например, `R.string.app_name`).
</description>
</DECISION>
<!-- Внедрение зависимостей (DI) -->
<DECISION id="tech_di" status="implemented">
<summary>Внедрение зависимостей (Dependency Injection)</summary>
<description>Для управления зависимостями в проекте используется Hilt. Он интегрирован с компонентами Jetpack и упрощает внедрение зависимостей в Android-приложениях.</description>
</DECISION>
<DECISION id="di_app" status="implemented">
<summary>Модуль Hilt для зависимостей уровня приложения</summary>
<description>AppModule.kt предоставляет зависимости на уровне приложения, такие как контекст приложения и другие синглтоны.</description>
</DECISION>
<!-- Навигация -->
<DECISION id="tech_navigation" status="implemented">
<summary>Навигация</summary>
<description>Навигация между экранами (Composable-функциями) реализована с помощью библиотеки Navigation Compose, которая является частью Jetpack Navigation.</description>
</DECISION>
<DECISION id="nav_graph" status="implemented">
<summary>Навигационный граф</summary>
<description>NavGraph.kt определяет структуру навигации приложения, связывая экраны и их маршруты.</description>
</DECISION>
<DECISION id="nav_screen" status="implemented">
<summary>Определение маршрутов экранов</summary>
<description>Screen.kt определяет все возможные маршруты (экраны) в приложении в виде запечатанного класса для типобезопасной навигации.</description>
</DECISION>
</TECHNICAL_DECISIONS>
<SECURITY_SPEC>
<Description>Спецификация безопасности проекта.</Description>
<PRINCIPLE>Все сетевые взаимодействия должны быть защищены HTTPS. Аутентификация пользователя хранится в EncryptedSharedPreferences. Обработка ошибок аутентификации должна включать logout и редирект на экран логина.</PRINCIPLE>
<RULE name="AuthHandling">Использовать JWT или API-ключ для авторизации запросов. При истечении токена автоматически обновлять.</RULE>
<RULE name="DataEncryption">Локальные данные (credentials) шифровать с помощью Android KeyStore.</RULE>
</SECURITY_SPEC>
<ERROR_HANDLING>
<Description>Спецификация обработки ошибок.</Description>
<PRINCIPLE>Все потенциальные ошибки (сеть, БД, валидация) должны быть обработаны с использованием sealed classes для ошибок (e.g., NetworkError, ValidationError) и отображаться пользователю через Snackbar или Dialog.</PRINCIPLE>
<SCENARIO name="NetworkFailure">При сетевых ошибках показывать сообщение "No internet connection" и предлагать retry.</SCENARIO>
<SCENARIO name="ServerError">Для HTTP 4xx/5xx отображать user-friendly сообщение на основе response body.</SCENARIO>
<SCENARIO name="ValidationError">Использовать require/check для контрактов, логировать и показывать toast.</SCENARIO>
</ERROR_HANDLING>
<ICONOGRAPHY_GUIDE>
<summary>Руководство по использованию иконок</summary>
<description>Этот раздел определяет стандартный набор иконок 'androidx.compose.material.icons.Icons.Filled' для использования в приложении. Для некоторых иконок указаны их AutoMirrored версии для корректного отображения в RTL-языках.</description>
<ICON name="AccountBox" path="Icons.Filled.AccountBox" />
<ICON name="AccountCircle" path="Icons.Filled.AccountCircle" />
<ICON name="Add" path="Icons.Filled.Add" />
<ICON name="AddCircle" path="Icons.Filled.AddCircle" />
<ICON name="ArrowBack" path="Icons.AutoMirrored.Filled.ArrowBack" note="Использовать AutoMirrored версию" />
<ICON name="ArrowDropDown" path="Icons.Filled.ArrowDropDown" />
<ICON name="ArrowForward" path="Icons.AutoMirrored.Filled.ArrowForward" note="Использовать AutoMirrored версию" />
<ICON name="Build" path="Icons.Filled.Build" />
<ICON name="Call" path="Icons.Filled.Call" />
<ICON name="Check" path="Icons.Filled.Check" />
<ICON name="CheckCircle" path="Icons.Filled.CheckCircle" />
<ICON name="Clear" path="Icons.Filled.Clear" />
<ICON name="Close" path="Icons.Filled.Close" />
<ICON name="Create" path="Icons.Filled.Create" />
<ICON name="DateRange" path="Icons.Filled.DateRange" />
<ICON name="Delete" path="Icons.Filled.Delete" />
<ICON name="Done" path="Icons.Filled.Done" />
<ICON name="Edit" path="Icons.Filled.Edit" />
<ICON name="Email" path="Icons.Filled.Email" />
<ICON name="ExitToApp" path="Icons.AutoMirrored.Filled.ExitToApp" note="Использовать AutoMirrored версию" />
<ICON name="Face" path="Icons.Filled.Face" />
<ICON name="Favorite" path="Icons.Filled.Favorite" />
<ICON name="FavoriteBorder" path="Icons.Filled.FavoriteBorder" />
<ICON name="Home" path="Icons.Filled.Home" />
<ICON name="Info" path="Icons.AutoMirrored.Filled.Info" note="Использовать AutoMirrored версию" />
<ICON name="KeyboardArrowDown" path="Icons.Filled.KeyboardArrowDown" />
<ICON name="KeyboardArrowLeft" path="Icons.AutoMirrored.Filled.KeyboardArrowLeft" note="Использовать AutoMirrored версию" />
<ICON name="KeyboardArrowRight" path="Icons.AutoMirrored.Filled.KeyboardArrowRight" note="Использовать AutoMirrored версию" />
<ICON name="KeyboardArrowUp" path="Icons.Filled.KeyboardArrowUp" />
<ICON name="Label" path="Icons.AutoMirrored.Filled.Label" note="Использовать AutoMirrored версию" />
<ICON name="List" path="Icons.AutoMirrored.Filled.List" note="Использовать AutoMirrored версию" />
<ICON name="LocationOn" path="Icons.Filled.LocationOn" />
<ICON name="Lock" path="Icons.Filled.Lock" />
<ICON name="MailOutline" path="Icons.Filled.MailOutline" />
<ICON name="Menu" path="Icons.Filled.Menu" />
<ICON name="MoreVert" path="Icons.Filled.MoreVert" />
<ICON name="Notifications" path="Icons.Filled.Notifications" />
<ICON name="Person" path="Icons.Filled.Person" />
<ICON name="Phone" path="Icons.Filled.Phone" />
<ICON name="Place" path="Icons.Filled.Place" />
<ICON name="PlayArrow" path="Icons.Filled.PlayArrow" />
<ICON name="Refresh" path="Icons.Filled.Refresh" />
<ICON name="Search" path="Icons.Filled.Search" />
<ICON name="Send" path="Icons.AutoMirrored.Filled.Send" note="Использовать AutoMirrored версию" />
<ICON name="Settings" path="Icons.Filled.Settings" />
<ICON name="Share" path="Icons.Filled.Share" />
<ICON name="ShoppingCart" path="Icons.Filled.ShoppingCart" />
<ICON name="Star" path="Icons.Filled.Star" />
<ICON name="ThumbUp" path="Icons.Filled.ThumbUp" />
<ICON name="Warning" path="Icons.Filled.Warning" />
</ICONOGRAPHY_GUIDE>
</METADATA>
<!-- ================================================================================== -->
<!-- ГРАФ ПРОЕКТА -->
<!-- ================================================================================== -->
<PROJECT_GRAPH>
<!-- ================================================================================== -->
<!-- КОНЦЕПТУАЛЬНЫЕ УЗЛЫ (ФИЧИ) -->
<!-- ================================================================================== -->
<NODE id="feat_dashboard" type="feature" status="implemented">
<summary>Экран панели управления</summary>
<description>Отображает сводку по инвентарю, включая статистику, такую как общее количество товаров, общая стоимость и количество по местоположениям/меткам.</description>
<RELATIONS>
<EDGE type="HAS_UI" target_id="screen_dashboard"/>
<EDGE type="IMPLEMENTS" target_id="uc_get_stats"/>
<EDGE type="IMPLEMENTS" target_id="uc_get_recent_items"/>
</RELATIONS>
<FUNCTIONALITY>
<FUNCTION id="func_get_stats">
<summary>Получение и отображение статистики</summary>
<implementation_note>Использован Flow для reactive обновлений; обработка ошибок через sealed class.</implementation_note>
</FUNCTION>
<FUNCTION id="func_get_recent_items">
<summary>Получение и отображение недавно добавленных товаров</summary>
<implementation_note>Данные берутся из локального кэша (Room) для быстрого отображения.</implementation_note>
</FUNCTION>
</FUNCTIONALITY>
</NODE>
<NODE id="feat_inventory_list" type="feature" status="implemented">
<summary>Экран списка инвентаря</summary>
<description>Отображает список всех инвентарных позиций с возможностью поиска и фильтрации.</description>
<RELATIONS>
<EDGE type="HAS_UI" target_id="screen_inventory_list"/>
<EDGE type="IMPLEMENTS" target_id="uc_search_items"/>
<EDGE type="IMPLEMENTS" target_id="uc_sync_inventory"/>
</RELATIONS>
</NODE>
<NODE id="feat_item_details" type="feature" status="implemented">
<summary>Экран сведений о товаре</summary>
<description>Показывает все сведения о конкретном инвентарном товаре.</description>
<RELATIONS>
<EDGE type="HAS_UI" target_id="screen_item_details"/>
<EDGE type="IMPLEMENTS" target_id="uc_get_item_details"/>
</RELATIONS>
</NODE>
<NODE id="feat_item_management" type="feature" status="implemented">
<summary>Создание/редактирование/удаление товаров</summary>
<description>Позволяет пользователям создавать новые товары, обновлять существующие и удалять их.</description>
<RELATIONS>
<EDGE type="HAS_UI" target_id="screen_item_edit"/>
<EDGE type="IMPLEMENTS" target_id="uc_create_item"/>
<EDGE type="IMPLEMENTS" target_id="uc_update_item"/>
<EDGE type="IMPLEMENTS" target_id="uc_delete_item"/>
</RELATIONS>
</NODE>
<NODE id="feat_labels_locations" type="feature" status="implemented">
<summary>Управление метками и местоположениями</summary>
<description>Позволяет пользователям просматривать списки всех доступных меток и местоположений.</description>
<RELATIONS>
<EDGE type="HAS_UI" target_id="screen_labels_list"/>
<EDGE type="HAS_UI" target_id="screen_locations_list"/>
<EDGE type="IMPLEMENTS" target_id="uc_get_all_labels"/>
<EDGE type="IMPLEMENTS" target_id="uc_get_all_locations"/>
</RELATIONS>
</NODE>
<NODE id="feat_search" type="feature" status="implemented">
<summary>Экран поиска</summary>
<description>Предоставляет специальный пользовательский интерфейс для поиска товаров.</description>
<RELATIONS>
<EDGE type="HAS_UI" target_id="screen_search"/>
<EDGE type="IMPLEMENTS" target_id="uc_search_items"/>
</RELATIONS>
</NODE>
<!-- ================================================================================== -->
<!-- УЗЛЫ СЛОЯ DOMAIN -->
<!-- ================================================================================== -->
<!-- Data Models -->
<NODE id="model_item" type="data_model" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/model/Item.kt">
<summary>Модель инвентарного товара.</summary>
<description>Содержит поля: id, name, description, quantity, location, labels, customFields.</description>
</NODE>
<NODE id="model_label" type="data_model" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/model/Label.kt">
<summary>Модель метки.</summary>
<description>Содержит поля: id, name, color.</description>
</NODE>
<NODE id="model_location" type="data_model" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/model/Location.kt">
<summary>Модель местоположения.</summary>
<description>Содержит поля: id, name, parentLocation.</description>
</NODE>
<NODE id="model_statistics" type="data_model" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/model/Statistics.kt">
<summary>Модель статистики инвентаря.</summary>
<description>Содержит поля: totalItems, totalValue, locationsCount, labelsCount.</description>
</NODE>
<!-- Repository Interfaces -->
<NODE id="repo_interface" type="repository_interface" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt">
<summary>Интерфейс, определяющий контракт для операций с данными, связанными с товарами, метками и местоположениями.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="model_item_create"/>
<EDGE type="DEPENDS_ON" target_id="model_item_summary"/>
<EDGE type="DEPENDS_ON" target_id="model_item_out"/>
<EDGE type="DEPENDS_ON" target_id="model_item_update"/>
<EDGE type="DEPENDS_ON" target_id="model_pagination_result"/>
<EDGE type="DEPENDS_ON" target_id="model_group_statistics"/>
<EDGE type="DEPENDS_ON" target_id="model_location_out_count"/>
<EDGE type="DEPENDS_ON" target_id="model_label_out"/>
<EDGE type="DEPENDS_ON" target_id="model_label_create"/>
<EDGE type="DEPENDS_ON" target_id="model_location"/>
<EDGE type="DEPENDS_ON" target_id="model_result"/>
</RELATIONS>
</NODE>
<NODE id="func_get_location_details" type="function" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt">
<summary>Получает детальную информацию о местоположении по его идентификатору.</summary>
<RELATIONS>
<EDGE type="BELONGS_TO" target_id="repo_interface"/>
<EDGE type="RETURNS" target_id="model_location"/>
</RELATIONS>
</NODE>
<NODE id="func_create_location" type="function" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt">
<summary>Создает новое местоположение.</summary>
<RELATIONS>
<EDGE type="BELONGS_TO" target_id="repo_interface"/>
<EDGE type="ACCEPTS" target_id="model_location"/>
</RELATIONS>
</NODE>
<NODE id="func_update_location" type="function" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt">
<summary>Обновляет существующее местоположение.</summary>
<RELATIONS>
<EDGE type="BELONGS_TO" target_id="repo_interface"/>
<EDGE type="ACCEPTS" target_id="model_location"/>
</RELATIONS>
</NODE>
<!-- Use Cases -->
<NODE id="uc_get_stats" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt">
<summary>Сценарий использования для получения статистики по инвентарю.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_get_recent_items" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/GetRecentlyAddedItemsUseCase.kt">
<summary>Сценарий использования для получения недавно добавленных товаров.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_create_item" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/CreateItemUseCase.kt">
<summary>Сценарий использования для создания нового товара.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_create_label" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/CreateLabelUseCase.kt">
<summary>Сценарий использования для создания новой метки.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_delete_item" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/DeleteItemUseCase.kt">
<summary>Сценарий использования для удаления товара.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_get_all_labels" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt">
<summary>Сценарий использования для получения всех меток.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_get_all_locations" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt">
<summary>Сценарий использования для получения всех местоположений.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_get_item_details" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/GetItemDetailsUseCase.kt">
<summary>Сценарий использования для получения деталей товара.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_login" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/LoginUseCase.kt">
<summary>Сценарий использования для аутентификации пользователя.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_search_items" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/SearchItemsUseCase.kt">
<summary>Сценарий использования для поиска товаров.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_sync_inventory" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/SyncInventoryUseCase.kt">
<summary>Сценарий использования для синхронизации инвентаря.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<NODE id="uc_get_location_details" type="use_case" status="implemented" file_path="domain/src/main/java/com/homebox/lens/domain/usecase/GetLocationDetailsUseCase.kt">
<summary>Сценарий использования для получения детальной информации о местоположении.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="repo_interface"/>
</RELATIONS>
</NODE>
<!-- ================================================================================== -->
<!-- УЗЛЫ СЛОЯ DATA -->
<!-- ================================================================================== -->
<NODE id="repo_impl" type="repository_implementation" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt">
<summary>Реализация ItemRepository, координирующая данные из API и локальной БД.</summary>
<description>Реализация ItemRepository, координирующая данные из API и локальной БД. Включает методы для работы с товарами, метками и местоположениями.</description>
<RELATIONS>
<EDGE type="IMPLEMENTS" target_id="repo_interface"/>
<EDGE type="DEPENDS_ON" target_id="api_service"/>
<EDGE type="DEPENDS_ON" target_id="database"/>
<EDGE type="CALLS" target_id="api_service_get_location"/>
<EDGE type="CALLS" target_id="api_service_create_location"/>
<EDGE type="CALLS" target_id="api_service_update_location"/>
<EDGE type="DEPENDS_ON" target_id="func_location_to_domain"/>
<EDGE type="DEPENDS_ON" target_id="func_location_to_create_dto"/>
</RELATIONS>
</NODE>
<NODE id="api_service_get_location" type="api_endpoint" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/api/HomeboxApiService.kt">
<summary>API endpoint for getting a single location.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="dto_location"/>
</RELATIONS>
</NODE>
<NODE id="api_service_create_location" type="api_endpoint" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/api/HomeboxApiService.kt">
<summary>API endpoint for creating a location.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="dto_location_create"/>
</RELATIONS>
</NODE>
<NODE id="api_service_update_location" type="api_endpoint" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/api/HomeboxApiService.kt">
<summary>API endpoint for updating a location.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="dto_location_create"/>
</RELATIONS>
</NODE>
<NODE id="api_service" type="api_service" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/api/HomeboxApiService.kt">
<summary>Интерфейс сервиса Retrofit для Homebox API.</summary>
</NODE>
<NODE id="database" type="database" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/db/HomeboxDatabase.kt">
<summary>Определение базы данных Room для локального кэширования.</summary>
</NODE>
<!-- ================================================================================== -->
<!-- УЗЛЫ СЛОЯ APP -->
<!-- ================================================================================== -->
<!-- UI Screens -->
<NODE id="screen_dashboard" type="ui_screen" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt">
<summary>Главный экран "Панель управления"</summary>
<description>Экран предоставляет обзорную информацию и быстрый доступ к основным функциям.</description>
<RELATIONS>
<EDGE type="HAS_VIEWMODEL" target_id="vm_dashboard"/>
</RELATIONS>
<LAYOUT>
<COMPONENT type="TopAppBar" description="Верхняя панель с иконкой навигационного меню и сканера."/>
<COMPONENT type="NavigationDrawer" description="Боковое меню с разделами: Главная, Локации, Поиск, Профиль, Выйти."/>
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
<SUB_COMPONENT type="Section" title="Быстрая статистика" description="Сетка из 2x2 карточек (стоимость, вещи, локации, метки)."/>
<SUB_COMPONENT type="Section" title="Недавно добавлено" description="Горизонтальный список карточек недавних предметов."/>
</COMPONENT>
</LAYOUT>
<USER_INTERACTIONS>
<INTERACTION action="Нажатие на чип местоположения/метки" reaction="Навигация на экран списка инвентаря с фильтром."/>
<INTERACTION action="Нажатие на кнопку 'Создать'" reaction="Открытие экрана редактирования нового товара."/>
</USER_INTERACTIONS>
</NODE>
<NODE id="screen_locations_list" type="ui_screen" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt">
<summary>Экран "Локации"</summary>
<description>Отображает вертикальный список всех доступных местоположений.</description>
<RELATIONS>
<EDGE type="HAS_VIEWMODEL" target_id="vm_locations_list"/>
</RELATIONS>
<LAYOUT>
<COMPONENT type="List" name="LocationsList" description="Вертикальный, прокручиваемый список (LazyColumn) всех местоположений."/>
<COMPONENT type="FloatingActionButton" icon="add" description="Кнопка для добавления нового местоположения."/>
</LAYOUT>
<USER_INTERACTIONS>
<INTERACTION action="Нажатие на элемент списка локаций" reaction="Навигация на экран списка инвентаря, отфильтрованного по локации."/>
</USER_INTERACTIONS>
</NODE>
<NODE id="screen_labels_list" type="ui_screen" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt">
<summary>Экран "Метки"</summary>
<description>Отображает вертикальный список всех доступных меток.</description>
<RELATIONS>
<EDGE type="HAS_VIEWMODEL" target_id="vm_labels_list"/>
</RELATIONS>
</NODE>
<NODE id="screen_inventory_list" type="ui_screen" status="stub" file_path="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt">
<summary>Экран "Список инвентаря"</summary>
<description>Отображает список всех инвентарных позиций с поиском и фильтрацией.</description>
<RELATIONS>
<EDGE type="HAS_VIEWMODEL" target_id="vm_inventory_list"/>
</RELATIONS>
</NODE>
<NODE id="screen_item_details" type="ui_screen" status="stub" file_path="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt">
<summary>Экран сведений о товаре</summary>
<description>Показывает все сведения о конкретном инвентарном товаре.</description>
<RELATIONS>
<EDGE type="HAS_VIEWMODEL" target_id="vm_item_details"/>
</RELATIONS>
</NODE>
<NODE id="screen_item_edit" type="ui_screen" status="stub" file_path="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt">
<summary>Экран создания/редактирования товара</summary>
<description>Позволяет пользователям создавать новые товары или редактировать существующие.</description>
<RELATIONS>
<EDGE type="HAS_VIEWMODEL" target_id="vm_item_edit"/>
</RELATIONS>
</NODE>
<NODE id="screen_location_edit" type="ui_screen" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/locationedit/LocationEditScreen.kt">
<summary>Экран создания/редактирования местоположения</summary>
<description>Позволяет пользователям создавать новые местоположения или редактировать существующие.</description>
<RELATIONS>
<EDGE type="HAS_VIEWMODEL" target_id="vm_location_edit"/>
</RELATIONS>
</NODE>
<NODE id="func_location_edit_screen" type="function" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/locationedit/LocationEditScreen.kt">
<summary>Entry point for the Location Edit screen.</summary>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="vm_location_edit"/>
<EDGE type="CALLS" target_id="func_location_edit_content"/>
</RELATIONS>
</NODE>
<NODE id="func_location_edit_content" type="function" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/locationedit/LocationEditScreen.kt">
<summary>Displays the UI for the Location Edit screen.</summary>
<RELATIONS>
<EDGE type="CONSUMES_STATE" target_id="data_class_ui_state_location_edit_viewmodel"/>
</RELATIONS>
</NODE>
<!-- ViewModels -->
<NODE id="vm_dashboard" type="view_model" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt">
<summary>ViewModel для экрана панели управления.</summary>
<description>Обрабатывает бизнес-логику для DashboardScreen, используя сценарии GetStatisticsUseCase и GetRecentlyAddedItemsUseCase.</description>
<RELATIONS>
<EDGE type="CALLS" target_id="uc_get_stats"/>
<EDGE type="CALLS" target_id="uc_get_recent_items"/>
</RELATIONS>
</NODE>
<NODE id="vm_locations_list" type="view_model" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListViewModel.kt">
<summary>ViewModel для экрана списка местоположений.</summary>
<RELATIONS>
<EDGE type="CALLS" target_id="uc_get_all_locations"/>
</RELATIONS>
</NODE>
<NODE id="vm_labels_list" type="view_model" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListViewModel.kt">
<summary>ViewModel для экрана списка меток.</summary>
<RELATIONS>
<EDGE type="CALLS" target_id="uc_get_all_labels"/>
</RELATIONS>
</NODE>
<NODE id="vm_item_details" type="view_model" status="stub" file_path="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsViewModel.kt">
<summary>ViewModel для экрана сведений о товаре.</summary>
<RELATIONS>
<EDGE type="CALLS" target_id="uc_get_item_details"/>
</RELATIONS>
</NODE>
<NODE id="vm_item_edit" type="view_model" status="stub" file_path="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt">
<summary>ViewModel для экрана создания/редактирования товара.</summary>
<RELATIONS>
<EDGE type="CALLS" target_id="uc_create_item"/>
<EDGE type="CALLS" target_id="uc_update_item"/>
</RELATIONS>
</NODE>
<NODE id="vm_location_edit" type="view_model" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/locationedit/LocationEditViewModel.kt">
<summary>ViewModel for the location creation/editing screen.</summary>
<description>Manages the UI state, interacts with UseCases, and handles user events for creating and updating locations.</description>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="uc_get_location_details"/>
<EDGE type="DEPENDS_ON" target_id="uc_create_location"/>
<EDGE type="DEPENDS_ON" target_id="uc_update_location"/>
<EDGE type="EMITS_STATE" target_id="data_class_ui_state_location_edit_viewmodel"/>
</RELATIONS>
</NODE>
<NODE id="data_class_ui_state_location_edit_viewmodel" type="data_model" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/locationedit/LocationEditViewModel.kt">
<summary>UI state for the Location Edit screen.</summary>
</NODE>
<NODE id="vm_search" type="view_model" status="stub" file_path="app/src/main/java/com/homebox/lens/ui/screen/search/SearchViewModel.kt">
<summary>ViewModel для экрана поиска.</summary>
<RELATIONS>
<EDGE type="CALLS" target_id="uc_search_items"/>
</RELATIONS>
</NODE>
<NODE id="vm_setup" type="view_model" status="implemented" file_path="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupViewModel.kt">
<summary>ViewModel для экрана настройки.</summary>
<RELATIONS>
<EDGE type="CALLS" target_id="uc_login"/>
</RELATIONS>
</NODE>
<!-- New Nodes for Location DTOs and Mappers -->
<NODE id="dto_location" type="data_model" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/api/dto/LocationDto.kt">
<summary>Data Transfer Object for location information.</summary>
<description>Contains DTOs for receiving and sending location data, and mappers for conversion to/from domain models.</description>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="model_location"/>
</RELATIONS>
</NODE>
<NODE id="dto_location_create" type="data_model" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/api/dto/LocationDto.kt">
<summary>Data Transfer Object for creating/updating location information.</summary>
<description>Used for sending location data to the API.</description>
<RELATIONS>
<EDGE type="DEPENDS_ON" target_id="model_location"/>
</RELATIONS>
</NODE>
<NODE id="func_location_to_domain" type="function" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/api/dto/LocationDto.kt">
<summary>Converts LocationDto to domain Location model.</summary>
<RELATIONS>
<EDGE type="CONVERTS" target_id="model_location"/>
</RELATIONS>
</NODE>
<NODE id="func_location_to_create_dto" type="function" status="implemented" file_path="data/src/main/java/com/homebox/lens/data/api/dto/LocationDto.kt">
<summary>Converts domain Location model to LocationCreateDto.</summary>
<RELATIONS>
<EDGE type="CONVERTS" target_id="dto_location_create"/>
</RELATIONS>
</NODE>
</PROJECT_GRAPH>
</PROJECT_MANIFEST>