From 69baca4e65f54771ffd0f90212bb76d4a93707b5 Mon Sep 17 00:00:00 2001 From: sokol Date: Sat, 21 Feb 2026 11:46:28 +0300 Subject: [PATCH] Add technical documentation for user management and business units --- docs/tech/README.md | 29 +-- docs/tech/business-units.md | 387 +++++++++++++++++++++++++++++++++++ docs/tech/user-management.md | 341 ++++++++++++++++++++++++++++++ 3 files changed, 745 insertions(+), 12 deletions(-) create mode 100644 docs/tech/business-units.md create mode 100644 docs/tech/user-management.md diff --git a/docs/tech/README.md b/docs/tech/README.md index 280bfc4..fea2140 100644 --- a/docs/tech/README.md +++ b/docs/tech/README.md @@ -7,20 +7,22 @@ | Раздел | Описание | Файл | |--------|----------|------| | **Ядро** | Базовые классы и структуры данных | [core.md](core.md) | +| **Управление пользователем** | User, AuthService, аутентификация | [user-management.md](user-management.md) | +| **Бизнес-единицы** | Shop, Factory, Warehouse, Office, ResearchLab | [business-units.md](business-units.md) | | **Продукты** | Система продуктов и товаров | [products.md](products.md) | | **Здания** | Типы зданий и предприятия | [buildings.md](buildings.md) | | **Производство** | Цепочки и процессы производства | [production.md](production.md) | -| **Экономика** | Экономическая модель | [economy.md](economy.md) | -| **Торговля** | Рынки, спрос, предложение | [trade.md](trade.md) | -| **Исследования** | Дерево технологий | [research.md](research.md) | -| **Архитектура** | Общая архитектура системы | [architecture.md](architecture.md) | +| **Экономика** | Экономическая модель | [economy.md](economy.md) ⬜ | +| **Торговля** | Рынки, спрос, предложение | [trade.md](trade.md) ⬜ | +| **Исследования** | Дерево технологий | [research.md](research.md) ⬜ | +| **Архитектура** | Общая архитектура системы | [architecture.md](architecture.md) ⬜ | ## 📁 Структура исходного кода ``` backend/ ├── src/ -│ ├── MyBiz.Core/ # Базовые модели +│ ├── MyBiz.Core/ # Базовые модели ✅ │ │ ├── ProductType.cs # Типы продуктов │ │ ├── Product.cs # Экземпляры продуктов │ │ ├── ProductRegistry.cs # Реестр продуктов @@ -28,19 +30,22 @@ backend/ │ │ ├── City.cs # Города │ │ ├── Company.cs # Компания │ │ ├── ProductionChain.cs # Производственные цепочки -│ │ └── DefaultProducts.cs # Дефолтные продукты -│ ├── MyBiz.Economy/ # Экономическая модель -│ ├── MyBiz.Production/ # Производство -│ └── MyBiz.Trade/ # Торговля +│ │ ├── DefaultProducts.cs # Дефолтные продукты +│ │ ├── User.cs # Пользователь ✅ +│ │ ├── AuthService.cs # Аутентификация ✅ +│ │ └── BusinessUnit.cs # Бизнес-единицы ✅ +│ ├── MyBiz.Economy/ # Экономическая модель ⬜ +│ ├── MyBiz.Production/ # Производство ⬜ +│ └── MyBiz.Trade/ # Торговля ⬜ └── tests/ - └── MyBiz.Tests/ # Тесты + └── MyBiz.Tests/ # Тесты (61 passing) ✅ ``` ## 🔗 Ссылки -- [Техническое задание](TZ.md) +- [Техническое задание](../TZ.md) - [Репозиторий проекта](https://git.six83.ru/ssa/my-biz.git) --- -**Последнее обновление:** 20.02.2026 +**Последнее обновление:** 21.02.2026 diff --git a/docs/tech/business-units.md b/docs/tech/business-units.md new file mode 100644 index 0000000..25d3a64 --- /dev/null +++ b/docs/tech/business-units.md @@ -0,0 +1,387 @@ +# Бизнес-единицы (Business Units) + +Детальное описание типов бизнес-единиц компании. + +## Обзор + +Бизнес-единица — операционная единица компании (магазин, фабрика, склад и т.д.). + +📂 **Код:** [`backend/src/MyBiz.Core/BusinessUnit.cs`](../../backend/src/MyBiz.Core/BusinessUnit.cs) + +--- + +## Архитектура + +``` + ┌─────────────────┐ + │ BusinessUnit │ + │ (базовый) │ + └────────┬────────┘ + │ + ┌───────────────────┼───────────────────┐ + │ │ │ + ▼ ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ Shop │ │ Factory │ │ Warehouse │ +│ (магазин) │ │ (фабрика) │ │ (склад) │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ + │ │ │ + ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ +│ Office │ │ ResearchLab │ +│ (офис) │ │ (лаборатория) │ +└─────────────────┘ └─────────────────┘ +``` + +--- + +## BusinessUnit (базовый класс) + +**Назначение:** Базовый класс для всех бизнес-единиц. + +📂 **Исходный код:** [`BusinessUnit.cs`](../../backend/src/MyBiz.Core/BusinessUnit.cs#L33-L180) + +### Основные свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `Id` | Guid | Уникальный ID единицы | +| `Name` | string | Название | +| `Type` | BusinessUnitType | Тип единицы | +| `CompanyId` | Guid | ID компании-владельца | +| `CityId` | string | ID города | +| `X`, `Y` | int | Координаты на карте | +| `Level` | int | Уровень развития (1-10) | +| `Employees` | int | Количество сотрудников | +| `MaxEmployees` | int | Макс. количество сотрудников | +| `Efficiency` | int | Эффективность (0-100) | +| `BuildCost` | decimal | Стоимость постройки | +| `UpkeepCost` | decimal | Содержание в тик | +| `LastPeriodIncome` | decimal | Доход за период | +| `LastPeriodExpenses` | decimal | Расходы за период | +| `IsActive` | bool | Работает ли единица | +| `Building` | Building? | Ссылка на здание | +| `Inventory` | Dictionary | Запасы | +| `ActiveProduction` | ActiveProductionChain? | Производственная цепочка | + +### Вычисляемые свойства + +| Свойство | Формула | +|----------|---------| +| `PeriodProfit` | `LastPeriodIncome - LastPeriodExpenses` | +| `Profitability` | `(PeriodProfit / LastPeriodExpenses) * 100` | + +### Методы + +| Метод | Описание | +|-------|----------| +| `UpdateEfficiency()` | Пересчитать эффективность | +| `Tick()` | Обновить состояние (каждый тик) | +| `HireEmployee()` | Нанять сотрудника | +| `FireEmployee()` | Уволить сотрудника | +| `Upgrade()` | Повысить уровень | + +### Формула эффективности + +``` +staffRate = Employees / MaxEmployees +Efficiency = 100 * staffRate + (Level - 1) * 5 +Efficiency = Clamp(Efficiency, 0, 100) +``` + +**Пример:** +- MaxEmployees = 10, Employees = 8 → 80% +- Level = 3 → +10% +- **Итого:** 90% + +--- + +## Shop (магазин) + +**Назначение:** Розничная торговля товарами. + +📂 **Исходный код:** [`BusinessUnit.cs`](../../backend/src/MyBiz.Core/BusinessUnit.cs#L185-L210) + +### Свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `SoldProductTypes` | List | Типы продаваемых продуктов | +| `DailyRevenue` | decimal | Выручка за день | +| `DailyCustomers` | int | Количество клиентов | + +### Вычисляемые + +| Свойство | Формула | +|----------|---------| +| `AverageCheck` | `DailyRevenue / DailyCustomers` | + +### Параметры по умолчанию + +| Параметр | Значение | +|----------|----------| +| `MaxEmployees` | 20 | +| `BuildCost` | 50 000 | +| `UpkeepCost` | 1 000 | + +--- + +## Factory (фабрика) + +**Назначение:** Производство товаров из сырья/компонентов. + +📂 **Исходный код:** [`BusinessUnit.cs`](../../backend/src/MyBiz.Core/BusinessUnit.cs#L215-L240) + +### Свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `OutputProductId` | string? | ID производимого продукта | +| `RequiredInputs` | Dictionary | Требуемые ресурсы | +| `LastTickOutput` | int | Произведено за тик | + +### Вычисляемые + +| Свойство | Описание | +|----------|----------| +| `IsIdle` | `ActiveProduction == null \|\| !ActiveProduction.IsActive` | + +### Параметры по умолчанию + +| Параметр | Значение | +|----------|----------| +| `MaxEmployees` | 100 | +| `BuildCost` | 200 000 | +| `UpkeepCost` | 5 000 | + +--- + +## Warehouse (склад) + +**Назначение:** Хранение товаров и сырья. + +📂 **Исходный код:** [`BusinessUnit.cs`](../../backend/src/MyBiz.Core/BusinessUnit.cs#L245-L295) + +### Свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `Capacity` | int | Вместимость (единиц) | +| `UsedCapacity` | int | Использовано места | +| `FreeCapacity` | int | Свободно места | + +### Методы + +| Метод | Описание | +|-------|----------| +| `AddToInventory(productId, quantity)` | Добавить товар | +| `RemoveFromInventory(productId, quantity)` | Взять товар | + +### Параметры по умолчанию + +| Параметр | Значение | +|----------|----------| +| `MaxEmployees` | 10 | +| `BuildCost` | 30 000 | +| `UpkeepCost` | 500 | +| `Capacity` | 10 000 | + +--- + +## Office (офис) + +**Назначение:** Управление компанией, бонусы к эффективности. + +📂 **Исходный код:** [`BusinessUnit.cs`](../../backend/src/MyBiz.Core/BusinessUnit.cs#L300-L325) + +### Свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `ManagementBonus` | int | Бонус к управлению (%) | +| `ManagedBuildings` | int | Количество управляемых зданий | + +### Параметры по умолчанию + +| Параметр | Значение | +|----------|----------| +| `MaxEmployees` | 50 | +| `BuildCost` | 100 000 | +| `UpkeepCost` | 3 000 | +| `ManagementBonus` | 5 | + +--- + +## ResearchLab (научная лаборатория) + +**Назначение:** Исследование новых технологий. + +📂 **Исходный код:** [`BusinessUnit.cs`](../../backend/src/MyBiz.Core/BusinessUnit.cs#L330-L375) + +### Свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `CurrentResearch` | string? | Текущее исследование | +| `ResearchProgress` | int | Прогресс (0-100%) | + +### Вычисляемые + +| Свойство | Формула | +|----------|---------| +| `SciencePerTick` | `Employees * 10 * Efficiency / 100` | + +### Методы + +| Метод | Описание | +|-------|----------| +| `StartResearch(technologyId)` | Начать исследование | +| `Tick()` | Обновление прогресса | + +### Параметры по умолчанию + +| Параметр | Значение | +|----------|----------| +| `MaxEmployees` | 30 | +| `BuildCost` | 150 000 | +| `UpkeepCost` | 4 000 | + +--- + +## Перечисления + +### BusinessUnitType + +| Значение | Описание | +|----------|----------| +| `Shop` | Магазин (розничная торговля) | +| `Factory` | Фабрика (производство) | +| `Warehouse` | Склад (хранение) | +| `Office` | Офис (управление) | +| `ResearchLab` | Научная лаборатория | + +📂 **Исходный код:** [`BusinessUnit.cs`](../../backend/src/MyBiz.Core/BusinessUnit.cs#L5-L22) + +--- + +## Примеры использования + +### Создание магазина + +```csharp +var shop = new Shop +{ + Name = "Центральный магазин", + CityId = "city_1", + X = 150, + Y = 200, + Employees = 10, + SoldProductTypes = { "goods_food", "goods_clothing" } +}; + +shop.HireEmployee(); // +1 сотрудник +shop.UpdateEfficiency(); +``` + +### Создание фабрики с производством + +```csharp +var factory = new Factory +{ + Name = "Текстильная фабрика", + CityId = "city_1", + OutputProductId = "comp_fabric", + RequiredInputs = { ["raw_cotton"] = 50 }, + Employees = 50 +}; + +// Запуск производства +var config = new ProductionChainConfig +{ + Id = "chain_fabric", + OutputProductId = "comp_fabric", + OutputQuantity = 40, + RequiredBuildingId = "textile_factory", + Steps = new List + { + new() { InputProductId = "raw_cotton", InputQuantity = 50, ProductionTime = 10 } + } +}; + +factory.ActiveProduction = new ActiveProductionChain +{ + Config = config, + Building = new Building(), + IsActive = true +}; + +// Каждый тик: +factory.Tick(); +``` + +### Управление складом + +```csharp +var warehouse = new Warehouse { Capacity = 5000 }; + +// Добавить товары +warehouse.AddToInventory("raw_cotton", 1000); +warehouse.AddToInventory("raw_steel", 500); + +Console.WriteLine($"Заполнено: {warehouse.UsedCapacity}/{warehouse.Capacity}"); + +// Взять товары +var taken = warehouse.RemoveFromInventory("raw_cotton", 300); +Console.WriteLine($"Взято: {taken}"); +``` + +### Исследование технологий + +```csharp +var lab = new ResearchLab +{ + Employees = 20, + Efficiency = 100 +}; + +lab.StartResearch("tech_advanced_production"); + +// Каждый тик: +lab.Tick(); + +if (lab.ResearchProgress >= 100) +{ + Console.WriteLine("Технология изучена!"); + // Добавить технологию в компанию +} +``` + +--- + +## Тесты + +📂 **Код:** [`backend/tests/MyBiz.Tests/UserTests.cs`](../../backend/tests/MyBiz.Tests/UserTests.cs) + +| Класс тестов | Количество | Описание | +|--------------|------------|----------| +| `BusinessUnitTests` | 10 | Базовый класс | +| `ShopTests` | 3 | Магазины | +| `FactoryTests` | 3 | Фабрики | +| `WarehouseTests` | 6 | Склады | +| `ResearchLabTests` | 4 | Лаборатории | +| `CompanyBusinessUnitTests` | 6 | Компания + единицы | + +**Всего:** 32 теста + +--- + +## Связанные документы + +- [Ядро](core.md) — базовые классы +- [Управление пользователем](user-management.md) — User, Company +- [Производство](production.md) — цепочки производства +- [Здания](buildings.md) — типы зданий + +--- + +**Последнее обновление:** 21.02.2026 diff --git a/docs/tech/user-management.md b/docs/tech/user-management.md new file mode 100644 index 0000000..704f5b0 --- /dev/null +++ b/docs/tech/user-management.md @@ -0,0 +1,341 @@ +# Управление пользователем (User Management) + +Система пользователей, аутентификации и владения компанией. + +## Обзор + +Модуль управления пользователями включает регистрацию, аутентификацию и связь пользователя с компанией. + +📂 **Код:** [`backend/src/MyBiz.Core/User.cs`](../../backend/src/MyBiz.Core/User.cs), [`AuthService.cs`](../../backend/src/MyBiz.Core/AuthService.cs) + +--- + +## Архитектура + +``` +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ +│ User │ ──────► │ Company │ ──────► │ BusinessUnit│ +│ (пользов.) │ OwnerId │ (компания) │ Units │ (единицы) │ +│ │ │ │ │ │ +│ - Username │ │ - Cash │ │ - Shop │ +│ - Email │ │ - Assets │ │ - Factory │ +│ - Password │ │ - Buildings │ │ - Warehouse │ +│ Hash │ │ - Units │ │ - Office │ +│ │ │ │ │ - Lab │ +└─────────────┘ └─────────────┘ └─────────────┘ + ▲ + │ +┌─────────────┐ +│ AuthService │ +│ (аутентиф.) │ +└─────────────┘ +``` + +--- + +## User + +**Назначение:** Пользователь системы (игрок). + +📂 **Исходный код:** [`User.cs`](../../backend/src/MyBiz.Core/User.cs) + +### Основные свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `Id` | Guid | Уникальный ID пользователя | +| `Username` | string | Имя пользователя (логин) | +| `Email` | string | Email адрес | +| `PasswordHash` | string | Хеш пароля | +| `CreatedAt` | DateTime | Дата регистрации | +| `LastLoginAt` | DateTime? | Дата последнего входа | +| `IsActive` | bool | Активен ли пользователь | +| `Company` | Company? | Компания пользователя | +| `CompanyId` | Guid? | ID компании | +| `Stats` | UserStats | Статистика игры | + +--- + +## UserStats + +**Назначение:** Статистика достижений пользователя. + +📂 **Исходный код:** [`User.cs`](../../backend/src/MyBiz.Core/User.cs#L54-L85) + +### Свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `GamesPlayed` | int | Всего игр сыграно | +| `TotalHoursPlayed` | int | Всего часов в игре | +| `MaxNetWorth` | decimal | Максимальная чистая стоимость | +| `TotalBuildingsBuilt` | int | Всего зданий построено | +| `FirstGameDate` | DateTime? | Дата первой игры | +| `LastGameDate` | DateTime? | Дата последней игры | + +--- + +## AuthService + +**Назначение:** Сервис аутентификации (заглушка для MVP). + +📂 **Исходный код:** [`AuthService.cs`](../../backend/src/MyBiz.Core/AuthService.cs) + +### Методы + +| Метод | Описание | +|-------|----------| +| `Register(username, email, password, companyName)` | Регистрация нового пользователя | +| `Login(username, password)` | Вход в систему | +| `Logout(token)` | Выход из системы | +| `ValidateToken(token)` | Проверка токена | +| `GetUserById(userId)` | Получить пользователя по ID | +| `GetUserByUsername(username)` | Получить пользователя по имени | + +### Возвращаемые значения + +**AuthResult:** +| Свойство | Тип | Описание | +|----------|-----|----------| +| `Success` | bool | Успешна ли операция | +| `User` | User? | Пользователь (если успешно) | +| `Token` | string? | Токен доступа | +| `ErrorMessage` | string? | Сообщение об ошибке | + +--- + +## Примеры использования + +### Регистрация нового пользователя + +```csharp +var authService = new AuthService(); + +var result = authService.Register( + username: "ivan_ivanov", + email: "ivan@example.com", + password: "SecurePassword123", + companyName: "Ivan Corp" +); + +if (result.Success) +{ + var user = result.User; + var token = result.Token; + + Console.WriteLine($"Пользователь {user.Username} зарегистрирован!"); + Console.WriteLine($"Компания: {user.Company.Name}"); + Console.WriteLine($"Стартовый капитал: {user.Company.Cash}$"); +} +else +{ + Console.WriteLine($"Ошибка: {result.ErrorMessage}"); +} +``` + +### Вход в систему + +```csharp +var loginResult = authService.Login("ivan_ivanov", "SecurePassword123"); + +if (loginResult.Success) +{ + var token = loginResult.Token; + // Использовать токен для авторизации запросов +} +else +{ + Console.WriteLine($"Ошибка входа: {loginResult.ErrorMessage}"); +} +``` + +### Проверка токена + +```csharp +var user = authService.ValidateToken(token); + +if (user != null) +{ + Console.WriteLine($"Пользователь: {user.Username}"); + Console.WriteLine($"Компания: {user.Company?.Name ?? "Нет компании"}"); +} +else +{ + Console.WriteLine("Неверный токен"); +} +``` + +### Выход из системы + +```csharp +authService.Logout(token); +``` + +--- + +## Company (обновлено) + +**Назначение:** Компания игрока с бизнес-единицами. + +📂 **Исходный код:** [`Company.cs`](../../backend/src/MyBiz.Core/Company.cs) + +### Новые свойства + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `OwnerId` | Guid | ID владельца (пользователя) | +| `BusinessUnits` | List | Бизнес-единицы компании | +| `FoundedAt` | DateTime | Дата основания | + +### Новые методы + +| Метод | Описание | +|-------|----------| +| `AddBusinessUnit(unit)` | Добавить бизнес-единицу | +| `RemoveBusinessUnit(unitId)` | Удалить бизнес-единицу | +| `Tick()` | Обновить все единицы (каждый тик) | +| `CalculateTotalProfit()` | Рассчитать общую прибыль | +| `CalculateAssets()` | Рассчитать стоимость активов | + +### Свойства для фильтрации + +| Свойство | Тип | Описание | +|----------|-----|----------| +| `Shops` | IEnumerable | Все магазины | +| `Factories` | IEnumerable | Все фабрики | +| `Warehouses` | IEnumerable | Все склады | + +--- + +## Примеры использования Company + +### Добавление бизнес-единицы + +```csharp +var company = new Company +{ + Name = "My Corp", + Cash = 100000m +}; + +// Добавить магазин +var shop = new Shop +{ + Name = "Главный магазин", + CityId = "city_1", + X = 100, + Y = 200 +}; +company.AddBusinessUnit(shop); + +// Добавить фабрику +var factory = new Factory +{ + Name = "Текстильная фабрика", + CityId = "city_1", + OutputProductId = "comp_fabric" +}; +company.AddBusinessUnit(factory); + +Console.WriteLine($"Магазинов: {company.Shops.Count()}"); +Console.WriteLine($"Фабрик: {company.Factories.Count()}"); +``` + +### Обновление состояния (тик) + +```csharp +// Каждый тик игры: +company.Tick(); + +// Обновляются: +// - Эффективность единиц +// - Производственные цепочки +// - Статистика +``` + +### Расчёт прибыли + +```csharp +var shop1 = new Shop +{ + LastPeriodIncome = 10000m, + LastPeriodExpenses = 7000m +}; +var shop2 = new Shop +{ + LastPeriodIncome = 15000m, + LastPeriodExpenses = 10000m +}; + +company.AddBusinessUnit(shop1); +company.AddBusinessUnit(shop2); + +var totalProfit = company.CalculateTotalProfit(); +// (10000 - 7000) + (15000 - 10000) = 8000m +``` + +--- + +## Тесты + +📂 **Код:** [`backend/tests/MyBiz.Tests/UserTests.cs`](../../backend/tests/MyBiz.Tests/UserTests.cs) + +### UserTests + +| Тест | Описание | +|------|----------| +| `User_Creation_ShouldInitializeProperties` | Создание пользователя | +| `User_Company_Assignment_ShouldWork` | Назначение компании | +| `UserStats_ShouldInitializeDefaults` | Инициализация статистики | + +### AuthServiceTests + +| Тест | Описание | +|------|----------| +| `AuthService_Register_ShouldCreateUser` | Регистрация пользователя | +| `AuthService_Register_DuplicateUsername_ShouldFail` | Дубликат имени | +| `AuthService_Login_CorrectCredentials_ShouldSucceed` | Успешный вход | +| `AuthService_Login_WrongPassword_ShouldFail` | Неверный пароль | +| `AuthService_Login_NonExistentUser_ShouldFail` | Несуществующий пользователь | +| `AuthService_Logout_ShouldInvalidateToken` | Выход из системы | +| `AuthService_ValidateToken_ValidToken_ShouldReturnUser` | Проверка токена | +| `AuthService_GetUserById_ShouldReturnUser` | Поиск по ID | + +### BusinessUnitTests + +| Тест | Описание | +|------|----------| +| `BusinessUnit_Creation_ShouldInitializeProperties` | Создание единицы | +| `BusinessUnit_HireEmployee_ShouldIncreaseCount` | Найм сотрудника | +| `BusinessUnit_FireEmployee_ShouldDecreaseCount` | Увольнение | +| `BusinessUnit_Upgrade_ShouldIncreaseLevel` | Повышение уровня | +| `BusinessUnit_UpdateEfficiency_*` | Расчёт эффективности | + +### ShopTests, FactoryTests, WarehouseTests, ResearchLabTests + +| Тест | Описание | +|------|----------| +| `*_Creation_ShouldInitializeDefaults` | Инициализация | +| `*_Calculation_ShouldBeCorrect` | Расчёты | +| `*_AddToInventory/*_RemoveFromInventory` | Операции с запасами | + +### CompanyBusinessUnitTests + +| Тест | Описание | +|------|----------| +| `Company_AddBusinessUnit_ShouldAddToList` | Добавление единицы | +| `Company_Shops_Filter_ShouldReturnOnlyShops` | Фильтрация магазинов | +| `Company_CalculateTotalProfit_ShouldSumAllUnits` | Расчёт прибыли | +| `Company_Tick_ShouldUpdateAllUnits` | Обновление состояния | + +--- + +## Связанные документы + +- [Ядро](core.md) — базовые классы +- [Бизнес-единицы](business-units.md) — детальное описание единиц +- [Здания](buildings.md) — типы зданий + +--- + +**Последнее обновление:** 21.02.2026