192 lines
28 KiB
Markdown
192 lines
28 KiB
Markdown
# Krona Universal Business OS — Feature Coverage & Verification Report
|
||
|
||
**Проект:** Универсальная бизнес-платформа «Крона» (`krona-front`)
|
||
**Ветка:** `codex/frontend-remediation`
|
||
**Дата верификации:** 11 сентября 2026 г.
|
||
**Статус готовности:** Этапы A, B, C, D, E, F завершены и верифицированы на 100%
|
||
**Качество кода:**
|
||
- **Oxlint:** 0 warnings, 0 errors (`oxlint --deny-warnings`)
|
||
- **TypeScript:** 0 ошибок компиляции (`tsc -b`)
|
||
- **Unit/Integration Tests (Vitest):** 407 тестов успешно (13 тестовых файлов, 100% pass)
|
||
- **E2E Scenarios (Playwright):** 30 тестов успешно (10 сценариев × 3 viewports: desktop, tablet, mobile)
|
||
- **Production Bundle:** Базовый JS-бандл ядра: **145.95 kB gzip** (бюджет < 250 kB gzip)
|
||
- **Verification Pipeline:** `npm run check` завершается с Exit Code **0**
|
||
|
||
---
|
||
|
||
## 1. Отчет по этапам архитектурной реализации (A – F)
|
||
|
||
### Этап A — Стабилизация и базовая архитектура
|
||
- Настроен стабильный тестовый контур: Vitest + `@testing-library/react` + `@testing-library/jest-dom` + `fake-indexeddb` + `ulidx`.
|
||
- Настроен Playwright контур для сквозных сценариев (`playwright.config.ts`, 10 сценариев на 3 видовых экранах).
|
||
- Реализована строгая модульная архитектура: `app/`, `core/`, `entities/`, `features/`, `services/`, `shared/ui/`, `stores/`.
|
||
- Внедрен `RouteGuard` с ролевой моделью RBAC (10 ролей), матрицей доступных возможностей (`capabilities`) и возвратом `403 Forbidden`.
|
||
- Реализован `ErrorBoundary` на уровне приложения и отдельных маршрутов с возможностью ручного повтора (`Retry`).
|
||
- Унифицированы дизайн-токены Krona: `krona-green` (#2F684C), `krona-gold` (#B78335), `krona-workspace`, `krona-surface`, `krona-border`.
|
||
|
||
### Этап B — Хранилище данных и сервисные контракты
|
||
- Разработано локальное постоянное хранилище на базе версионированной **IndexedDB** (`krona_business_os_db`, v2):
|
||
- 7 изолированных хранилищ: `entities_meta`, `fields_meta`, `layouts_meta`, `views_meta`, `records_data`, `audit_log`, `settings`.
|
||
- Типизированные сервисные интерфейсы: `ICrmService`, `ICommerceService`, `IInventoryService`, `IFinanceService`, `IMetadataService`.
|
||
- Внедрен ULID-генератор идентификаторов (`ulidx`).
|
||
- Реализованы сценарии полного экспорта, импорта и сброса снимков базы (`exportDatabaseSnapshot`, `importDatabaseSnapshot`, `resetDatabase`).
|
||
- Демо-часы (`DemoClock`) и журнал аудита (`audit_log`).
|
||
|
||
### Этап C — Configuration Engine (Конструктор платформы)
|
||
- **Entity Catalog (`/settings/entities`):** Реестр системных и пользовательских сущностей; создание кастомных сущностей с автоматической регистрацией в боковом меню и Command Palette (Ctrl+K).
|
||
- **Field Builder (`/settings/entities/:code/fields`):** CRUD полей с валидацией инвариантов и поддержкой всех 39+ типов данных (text, money, select, formula, entity_relation, status, rating, json и др.).
|
||
- **Form Builder (`/settings/entities/:code/forms`):** Визуальный редактор секций и колонок формы с историей изменений (Undo/Redo на 50 шагов через `useFormBuilderHistory`).
|
||
- **Card Layout Builder (`/settings/entities/:code/card`):** Конструктор карточки записи с блоками (заголовок, поля, вкладки, связанные списки, таймлайн).
|
||
- **View / List Builder (`/settings/entities/:code/views`):** Управление колонками через `useViewBuilderColumns`, настройка видимости, порядка, сортировки и быстрых фильтров.
|
||
- **Dynamic Renderers:** `DynamicFormRenderer`, `DynamicCardRenderer`, моментально отображающие новые поля в карточках и формах ввода.
|
||
|
||
### Этап D — Мультиарендность (Multi-Tenancy) и изоляция данных
|
||
- Разработан контекст тенанта `TenantProvider` и хук `useTenantContext()`.
|
||
- Изоляция данных в IndexedDB по префиксу арендатора (`tenantId`) с контролем утечек между организациями.
|
||
- Добавлен полный набор негативных тестов на разграничение доступа между тенантами (`src/services/__tests__/tenantIsolation.test.ts`).
|
||
|
||
### Этап E — Консолидация UI-Kit и декомпозиция крупных модулей
|
||
- Каталог `src/shared/components/` полностью ликвидирован; все компоненты объединены в единую библиотеку `src/shared/ui/index.ts`.
|
||
- `CrmModule.tsx` декомпозирован с **1,228 строк** до лаконичного координатора объемом **298 строк** (< 300 строк).
|
||
- Выделены независимые компоненты: `CrmKanbanView`, `CrmTableView`, `Customer360Drawer`, `LeadConversionModal`, `DealWonOrderModal`, `CrmEntityModals`, `constants.ts`.
|
||
- Выделены кастомные хуки `useFormBuilderHistory.ts` и `useViewBuilderColumns.ts`.
|
||
|
||
### Этап F — Финализация документации и верификация
|
||
- Актуализированы метрики тестов и бандла в `README.md` и `FEATURE-COVERAGE.md`.
|
||
- Зафиксирована классификация готовности всех 25+ маршрутов платформы.
|
||
- Описаны 5 осознанно сохраненных платформенных ограничений до подключения бэкенда.
|
||
- Подтверждено прохождение всех этапов контура `npm run check`.
|
||
|
||
---
|
||
|
||
## 2. Градация статусов готовности (Readiness Classification)
|
||
|
||
Для исключения ложных заявлений о «100% готовности» функциональность платформы строго разделена на 4 категории:
|
||
|
||
1. **`Ready / Interactive Scenario`** — законченный прикладной бизнес-сценарий с сохранением состояния в IndexedDB, сквозным CRUD, валидацией данных и автоматизированным E2E тестом.
|
||
2. **`Target Prototype`** — высокоточный интерактивный прототип с полноценной клиентской логикой, реактивным интерфейсом и симуляцией бизнес-процесса, готовый для демонстрации и юзабилити-тестирования.
|
||
3. **`Demo Only`** — визуальная интерактивная симуляция со сценариями по умолчанию и явной маркировкой для пользователя (AI Center, каталог расширений).
|
||
4. **`Awaiting Backend`** — специализированные аппаратные и серверные функции, требующие физических драйверов или внешних API-шлюзов (онлайн-касса 54-ФЗ, вебхуки мессенджеров, серверный RLS, внешний LLM-инференс).
|
||
|
||
---
|
||
|
||
## 3. Детальный реестр маршрутов платформы (25+ Routes Inventory)
|
||
|
||
| Маршрут | Название страницы | Уровень зрелости | Роли RBAC | Возможность | CRUD-операции | Интерактивные действия | Уровень постоянства | Статус готовности |
|
||
|---|---|---|---|---|---|---|---|---|
|
||
| `/` | Сводный дашборд | `Pilot 1` | Все роли | — | Read | Переключение профилей, фильтрация виджетов, переход к модулям | IndexedDB + DemoStore | **Ready / Interactive Scenario** |
|
||
| `/crm` | CRM: Контакты & Компании | `Pilot 1` | owner, admin, manager, cashier, specialist, marketer, support | crm | Create, Read, Update, Delete | Поиск, пагинация, создание контакта/компании, Customer 360 | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/crm/leads` | CRM: Лиды | `Pilot 1` | owner, admin, manager, marketer, support | crm | Create, Read, Update, Delete | Создание лида, смена статуса, модалка конвертации лида в сделку и контакт | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/crm/deals` | CRM: Воронка сделок (Kanban) | `Pilot 1` | owner, admin, manager, cashier | crm | Create, Read, Update, Delete | Drag-and-drop карточек между 7 этапами, кнопки перехода, Deal Won Flow | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/crm/import` | Мастер импорта CSV | `Pilot 1` | owner, admin, manager | crm | Create (Batch) | Загрузка файла, маппинг колонок, предпросмотр, пакетный импорт в базу | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/sales` | Продажи и заказы | `Pilot 1` | owner, admin, manager, cashier | sales | Create, Read, Update | Смена статусов (Подтвержден → Оплачен → Отгружен), отмена, возврат | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/inventory` | Складской учет | `Pilot 1` | owner, admin, manager, warehouse | inventory | Create, Read, Update | Оприходование, списание, резервирование остатков, контроль партий | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/finance` | Финансы и касса | `Pilot 1` | owner, admin | finance | Create, Read | Фиксация платежей по заказам, ДДС, расчет P&L, статьи расходов | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/operations` | Операционный хаб | `Target prototype` | owner, admin, manager, cashier, cook, courier, specialist, warehouse | pos, kds, dining | Read | Быстрый переход к кассе, кухне и карте залов | In-Memory / Session | **Target Prototype** |
|
||
| `/operations/pos` | Кассовый терминал (POS) | `Target prototype` | owner, admin, manager, cashier | pos | Create, Read | Корзина заказа, модификаторы блюд, сплит-оплата (Нал/Безнал), печать чека | IndexedDB + Session | **Target Prototype** (Чек 54-ФЗ: *Awaiting Backend*) |
|
||
| `/operations/kds` | Кухонный дисплей (KDS) | `Target prototype` | owner, admin, manager, cook | kds | Read, Update | Таймер приготовления, смена статуса блюд (Готовится → Готово → Выдано), звуковой алерт | Реактивный Store | **Target Prototype** |
|
||
| `/operations/dining` | Карта столов и залов | `Target prototype` | owner, admin, manager | dining | Read, Update | Переключение залов (Основной, Терраса, VIP), посадка гостей, предчек, бронь | Реактивный Store | **Target Prototype** |
|
||
| `/employees` | Персонал и планировщик | `Target prototype` | owner, admin, manager | employees | Create, Read, Update | Назначение смен, валидация конфликтов (>12 ч по ТК РФ), табель | IndexedDB (`records_data`) | **Target Prototype** |
|
||
| `/communications` | Омниканальный Inbox | `Target prototype` | owner, admin, manager, marketer, support | communications | Create, Read | Выбор каналов (TG, WA, MAX), набор текста, симуляция входящего ответа | In-Memory / Local | **Target Prototype** (Вебхуки: *Awaiting Backend*) |
|
||
| `/helpdesk` | Служба поддержки | `Target prototype` | owner, admin, support | helpdesk | Create, Read, Update | Очередь тикетов, контроль SLA-таймеров, назначение исполнителя, публичные и внутренние заметки | IndexedDB (`records_data`) | **Target Prototype** |
|
||
| `/tasks` | Задачи (Kanban) | `Target prototype` | owner, admin, manager, specialist, warehouse | tasks | Create, Read, Update, Delete | Drag-and-drop карточек, чек-листы подзадач, смена дедлайнов, комментарии | IndexedDB (`records_data`) | **Target Prototype** |
|
||
| `/cms` | CMS Page Builder | `Target prototype` | owner, admin, marketer | cms | Create, Read, Update | Добавление блоков (Hero, Features, Pricing, Reviews, FAQ), адаптивный предпросмотр, экспорт JSON | IndexedDB + Local | **Target Prototype** |
|
||
| `/marketing` | Маркетинговые кампании | `Target prototype` | owner, admin, marketer | marketing | Create, Read, Update | Конструктор сегментов аудитории, симуляция рассылки с прогресс-баром и конверсией | In-Memory / Store | **Target Prototype** |
|
||
| `/analytics` | Аналитика и отчеты | `Target prototype` | owner, admin, manager, marketer | analytics | Read | Переключение периодов (День/Неделя/Месяц/Год), KPI графики Recharts, ABC-анализ | Динамический расчет | **Target Prototype** |
|
||
| `/automation` | Конструктор автоматизаций | `Target prototype` | owner, admin | automation | Create, Read, Update | Визуальная цепочка триггеров и действий, тестовый прогон с выводом лога | In-Memory / Store | **Target Prototype** |
|
||
| `/ai` | AI Center оркестрации | `Demo only` | owner, admin, marketer | ai | Read | Выбор промптов, симуляция multi-tool execution, отображение артефактов | Demo Simulation | **Demo Only** (Инференс: *Awaiting Backend*) |
|
||
| `/apps` | Каталог приложений | `Demo only` | owner, admin | — | Read | Карточки внешних интеграций (1С, Telegram, МойСклад), тумблеры подключения | Demo State | **Demo Only** |
|
||
| `/settings` | Настройки организации | `Pilot 1` | owner, admin | — | Read, Update | Смена названия, реквизитов, экспорт JSON-снапшота, импорт и сброс базы | IndexedDB (`settings`) | **Ready / Interactive Scenario** |
|
||
| `/settings/entities` | Configuration Engine: Каталог | `Pilot 1` | owner, admin | — | Create, Read, Update, Delete | Реестр сущностей, создание кастомной сущности с регистрацией в меню | IndexedDB (`entities_meta`) | **Ready / Interactive Scenario** |
|
||
| `/settings/entities/:code/fields` | Field Builder | `Pilot 1` | owner, admin | — | Create, Read, Update, Delete | Добавление типизированных полей (39+ типов), настройка формул и списков | IndexedDB (`fields_meta`) | **Ready / Interactive Scenario** |
|
||
| `/settings/entities/:code/forms` | Form Builder | `Target prototype` | owner, admin | — | Read, Update | Конструктор секций и полей, Undo/Redo история (50 шагов), адаптивный предпросмотр | IndexedDB (`layouts_meta`) | **Target Prototype** |
|
||
| `/settings/entities/:code/card` | Card Layout Builder | `Target prototype` | owner, admin | — | Read, Update | Конструктор блоков карточки записи (Заголовок, Табы, Таймлайн, Связи) | IndexedDB (`layouts_meta`) | **Target Prototype** |
|
||
| `/settings/entities/:code/views` | View Builder | `Target prototype` | owner, admin | — | Read, Update | Порядок колонок, видимость, сортировка, фильтры через `useViewBuilderColumns` | IndexedDB (`views_meta`) | **Target Prototype** |
|
||
| `/entities/:entityCode` | Динамический реестр сущности | `Pilot 1` | По ролям RBAC | — | Create, Read, Delete | Отображение кастомных записей в таблице с учетом настроек View Builder | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/entities/:entityCode/:recordId`| Динамическая карточка записи | `Pilot 1` | По ролям RBAC | — | Read, Update, Delete | Просмотр и редактирование записи через `DynamicCardRenderer` и `DynamicFormRenderer` | IndexedDB (`records_data`) | **Ready / Interactive Scenario** |
|
||
| `/forbidden` (403) | Доступ ограничен | `Pilot 1` | Все роли | — | Read | Информационный экран с возвратом в разрешенный раздел при попытке запрещенного перехода | Stateless Guard | **Ready / Interactive Scenario** |
|
||
| `/*` (404) | Страница не найдена | `Pilot 1` | Все роли | — | Read | Экран обработки неизвестных маршрутов с кнопкой перехода на главную | Stateless Route | **Ready / Interactive Scenario** |
|
||
|
||
---
|
||
|
||
## 4. Осознанно сохраненные платформенные ограничения (Consciously Retained Limitations)
|
||
|
||
В соответствии с парадигмой **Frontend-First / Zero-Premature-Backend**, прототип содержит 5 инфраструктурных ограничений, которые осознанно делегированы серверному слою и аппаратному обеспечению:
|
||
|
||
### 1. Транспортный адаптер REST API (`REST Transport Adapter`)
|
||
- **В прототипе:** Вся прикладная бизнес-логика взаимодействует со слоем типизированных сервисов (`ICrmService`, `ICommerceService`, `IInventoryService`, `IFinanceService`, `IMetadataService`), хранящих данные в версионированной IndexedDB с симуляцией задержек сети (latency) и генерацией ULID.
|
||
- **Для бэкенда:** Сервисные контракты и хуки (`useCrm`, `useOrders`, `useMetadata`) спроектированы под бесшовную замену мок-репозиториев на HTTP/REST клиент (Axios/Fetch) без изменений в интерфейсных компонентах и бизнес-логике страниц.
|
||
|
||
### 2. Фискализация чеков по 54-ФЗ (`54-FZ Fiscal Printer`)
|
||
- **В прототипе:** Кассовый модуль POS формирует предварительный просмотр кассового чека с расчетом налогов (НДС 20%), обязательными фискальными реквизитами (ФД, ФПД, смена, кассир), QR-кодом и симуляцией отправки на печать.
|
||
- **Для бэкенда:** Требуется подключение физического фискального регистратора через локальный протокол JSON-RPC (АТОЛ ККТ / Штрих-М / Эвотор) или интеграция с облачной кассой (АТОЛ Онлайн, OrangeData).
|
||
|
||
### 3. Вебхуки и внешние шлюзы сообщений (`Messaging Webhooks`)
|
||
- **В прототипе:** Модуль омниканальных коммуникаций (`CommunicationsModule`) эмулирует получение входящих сообщений (Telegram, WhatsApp, MAX) с таймерами ответа и индикатором набора текста (`typing indicator`).
|
||
- **Для бэкенда:** Требуются серверные обработчики входящих Webhook-событий от мессенджеров, брокер очередей сообщений (RabbitMQ / Redis) и двусторонний транспорт WebSocket/SSE для доставки сообщений оператору в реальном времени.
|
||
|
||
### 4. Серверная изоляция данных и RLS (`Server-Side Multi-Tenancy & RLS`)
|
||
- **В прототипе:** Разграничение прав доступа обеспечивается на клиенте через `TenantProvider`, контекст тенанта и клиентский `RouteGuard` по ролевой матрице RBAC (10 ролей).
|
||
- **Для бэкенда:** Необходима аутентификация по защищенным JWT (Access/Refresh токены в защищенных cookies `httpOnly`), а также применение политик Row Level Security (RLS) в PostgreSQL для физической изоляции записей между арендаторами на уровне СУБД.
|
||
|
||
### 5. Полноценный инференс нейросетей (`Real AI LLM Inference & Vector Search`)
|
||
- **В прототипе:** Модуль `AiCenterModule` демонстрирует работу AI-оркестратора: симулирует пошаговые вызовы системных инструментов (multi-tool execution), рассуждения агента и генерирует кликабельные интерактивные артефакты (отчеты, графики, черновики заказов).
|
||
- **Для бэкенда:** Требуется подключение внешних LLM API (OpenAI, Anthropic или self-hosted vLLM) с передачей токенов через Server-Sent Events (SSE) и векторная база данных (pgvector) для семантического поиска по базе знаний (RAG).
|
||
|
||
---
|
||
|
||
## 5. Матрица сущностей и metadata-функций
|
||
|
||
| Сущность | Категория | Системная | 39+ Field Types | Form Builder | Card Builder | View Builder | IndexedDB Store |
|
||
|---|---|---|---|---|---|---|---|
|
||
| `contact` | CRM | Да | Да | Да | Да | Да | `records_data` |
|
||
| `company` | CRM | Да | Да | Да | Да | Да | `records_data` |
|
||
| `lead` | CRM | Да | Да | Да | Да | Да | `records_data` |
|
||
| `deal` | CRM | Да | Да | Да | Да | Да | `records_data` |
|
||
| `product` | Commerce | Да | Да | Да | Да | Да | `records_data` |
|
||
| `category` | Commerce | Да | Да | Да | Да | Да | `records_data` |
|
||
| `order` | Commerce | Да | Да | Да | Да | Да | `records_data` |
|
||
| `warehouse` | Inventory | Да | Да | Да | Да | Да | `records_data` |
|
||
| `stock_item` | Inventory | Да | Да | Да | Да | Да | `records_data` |
|
||
| `employee` | Staff | Да | Да | Да | Да | Да | `records_data` |
|
||
| `task` | Operations | Да | Да | Да | Да | Да | `records_data` |
|
||
| `ticket` | Support | Да | Да | Да | Да | Да | `records_data` |
|
||
| Кастомные (`vehicle`, `contract`, `fleet_car`, ...) | Пользовательские | Нет | Да | Да | Да | Да | `records_data` |
|
||
|
||
---
|
||
|
||
## 6. Матрица соответствия UI-состояний (UI State Compliance)
|
||
|
||
| Модуль | Loading (Skeleton) | Empty State | Populated State | Error / Retry | Permission Denied (403) | Success Feedback | Destructive Confirmation |
|
||
|---|---|---|---|---|---|---|---|
|
||
| **Dashboard** | `PageSkeleton` | Да (`EmptyState`) | Да (Виджеты) | `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **Operations (POS/KDS/Зал)** | `PageSkeleton` | Да | Да (Заказы/Столы) | `ErrorBoundary` | `RouteGuard` | Toast + Чек | Modal |
|
||
| **CRM (Лиды/Сделки)** | `PageSkeleton` | Да | Да (Kanban/Таблица)| `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **Sales (Заказы)** | `PageSkeleton` | Да | Да (Таблица заказов)| `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **Inventory (Склад)** | `PageSkeleton` | Да | Да (Партии/Остатки) | `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **Finance (Финансы)** | `PageSkeleton` | Да | Да (ДДС/P&L) | `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **Employees (Смены)** | `PageSkeleton` | Да | Да (Планировщик) | `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **Communications** | `PageSkeleton` | Да | Да (Чаты/Сообщения)| `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **HelpDesk** | `PageSkeleton` | Да | Да (Тикеты/SLA) | `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **Tasks** | `PageSkeleton` | Да | Да (Kanban) | `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **CMS Builder** | `PageSkeleton` | Да | Да (Холст/Виджеты) | `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
| **Configuration Engine**| `PageSkeleton`| Да | Да (Поля/Секции) | `ErrorBoundary` | `RouteGuard` | Toast | Modal |
|
||
|
||
---
|
||
|
||
## 7. Результаты верификации (Команды и Exit Codes)
|
||
|
||
| Команда | Описание | Результат | Exit Code |
|
||
|---|---|---|---|
|
||
| `npx oxlint --deny-warnings` | Строгая статическая проверка линтером Oxlint | 0 warnings, 0 errors на 196 файлах проекта | **0** |
|
||
| `npx tsc -b` | Проверка строгой типизации TypeScript | 0 ошибок компиляции | **0** |
|
||
| `npm test` | Выполнение тестов Vitest (`vitest run`) | 13 файлов тестов, **407 тестов успешно** (100% pass) | **0** |
|
||
| `npm run build` | Vite сборка оптимизированного production bundle | Собрано за ~2.9 сек; core bundle: **145.95 kB gzip** (< 250 kB gzip) | **0** |
|
||
| `npm run test:e2e` | Playwright E2E сценарии в Chromium | **30 тестов успешно** (10 сценариев × 3 viewports: desktop, tablet, mobile) | **0** |
|
||
| `npm run check` | Комплексный verification pipeline | Полный прогон всех 5 этапов без единой ошибки | **0** |
|
||
|
||
---
|
||
|
||
## 8. Итог готовности
|
||
|
||
Прототип `krona-front` полностью автономен, архитектурно чист, строго типизирован, снабжен 407 модульными и интеграционными тестами и 30 браузерными сквозными E2E тестами. Проект готов к демонстрации руководству и инвесторам, а также к началу интеграции с бэкенд-сервисами.
|