17 KiB
17 KiB
Astra 6 Revalidation Matrix & Audit Status
Документ фиксирует результаты повторного аудита кодовой базы krona-front (ветка codex/frontend-core-integrity, базовый коммит 0c479f5 от codex/frontend-remediation) по 25 замечаниям исходного аудита Astra 6 (который проводился по старому коммиту 0e4c0f7).
Каждый пункт перепроверен по фактическому коду и подтвержден автоматическими тестами.
Таблица верификации замечаний (F01–F25)
| Finding | Текущий статус | Воспроизводится | Уже исправлено | Частично исправлено | Не относится к scope | Доказательство | План исправления | Тест |
|---|---|---|---|---|---|---|---|---|
| F01: Единый источник роли, сессии и RBAC | Исправлено | Нет | Да | Нет | Нет | Единый канонический useSessionStore (src/core/session/sessionStore.ts). Двусторонняя реактивная синхронизация с src/stores/demo.ts и src/mock/store.ts. Строгий deny-by-default в RouteGuard и Sidebar через hasModulePermission. Синхронизация активного тенанта. Коммит fcabd60. |
Закрыто в коммите fcabd60. |
src/features/__tests__/rbacSessionIntegrity.test.tsx (4/4 passed) |
| F02: Безопасное подтверждение заказа и резервирование | Исправлено | Нет | Да | Нет | Нет | Атомарная двухфазная проверка доступности всех позиций (all-or-nothing). При дефиците хотя бы 1 единицы выбрасывается InsufficientStockError, резервы не создаются. Идемпотентность confirmOrder при повторном вызове. Освобождение резервов при отмене заказа. Коммит 8910d5d. |
Закрыто в коммите 8910d5d. |
src/services/__tests__/orderReservationIntegrity.test.ts (5/5 passed) |
| F03: Корректная модель платежей | Исправлено | Нет | Да | Нет | Нет | Строгая валидация amount.minor > 0 и совпадения валют. Поддержка статусов unpaid, partially_paid, paid, overpaid, refunded. Идемпотентность по idempotencyKey. Атомарный откат платежа и статуса заказа при сбое в финансовом сервисе. Коммит ae35865. |
Закрыто в коммите ae35865. |
src/services/__tests__/paymentModelIntegrity.test.ts (5/5 passed) |
| F04: State Machine коммерческого заказа | Исправлено | Нет | Да | Нет | Нет | Формальная матрица переходов ALLOWED_ORDER_TRANSITIONS: draft -> confirmed -> preparing -> ready_for_shipment -> shipped -> delivered -> completed. Отмена разрешена только из draft и confirmed. Переходы вне матрицы блокируются доменной ошибкой. Коммит a29d683. |
Закрыто в коммите a29d683. |
src/services/__tests__/orderStateMachine.test.ts (5/5 passed) |
| F05: Жизненный цикл отгрузки, доставки и возврата | Исправлено | Нет | Да | Нет | Нет | Предусловие отгрузки: розница требует 100% предоплату (paid / overpaid), для b2b разрешена постоплата. При отгрузке активные резервы исполняются (fulfilled), физический остаток onHand уменьшается. Возврат разрешён только по отгруженным/доставленным заказам, количество строго валидируется (returnQty <= fulfilledQty - alreadyReturnedQty), физический остаток восстанавливается, расход фиксируется в финансах. Коммит a29d683. |
Закрыто в коммите a29d683. |
src/services/__tests__/orderStateMachine.test.ts (5/5 passed) |
| F06: Складские инварианты и разделение Ledger | Исправлено | Нет | Да | Нет | Нет | Исключена маскировка отрицательных остатков через Math.max(0, ...). Разделены физический Stock Ledger (movements) и Reservation Ledger (reservations). Строго соблюдается инвариант available = onHand - activeReserved >= 0. Коммит 8910d5d. |
Закрыто в коммите 8910d5d. |
src/services/__tests__/orderReservationIntegrity.test.ts (5/5 passed) |
| F07: Финансовые инварианты и разделение потоков | Исправлено | Нет | Да | Нет | Нет | Обязательное указание основания операций (referenceType, referenceId), проверка соответствия валют счёта и проводки, реальная фильтрация по диапазону дат (dateFrom, dateTo). P&L снабжён дисклеймером «Демонстрационная модель расчёта». Коммит ae35865. |
Закрыто в коммите ae35865. |
src/services/__tests__/paymentModelIntegrity.test.ts (5/5 passed) |
| F08: CRM: связь лид → контакт → компания → сделка → заказ | Исправлено | Нет | Да | Нет | Нет | Реализована идемпотентная конверсия лида convertLeadToDeal с дедупликацией контактов по email/телефону, сохранением ролей и компании. При создании заказа из выигранной сделки передаются реальные специфицированные позиции, устанавливается двусторонняя ссылка order.dealId и deal.orderId. Фиктивные 'prd_coffee_beans' и 'COF-100' удалены. Коммит 42ac2f4. |
Закрыто в коммите 42ac2f4. |
src/features/__tests__/crmEndToEndIntegrity.test.tsx (3/3 passed) |
| F09: Целостность номенклатуры и вариантов товаров | Исправлено | Нет | Да | Нет | Нет | Каталог товаров содержит типизированные варианты, цены в minor units и категории. Поддерживает актуальные связи в заказах и резервах. | Закрыто в репозиторном слое. | src/features/__tests__/pilot1Flows.test.ts (4/4 passed) |
| F10: Контрагенты и поставщики | Исправлено | Нет | Да | Нет | Нет | Реализован модуль /procurement с контрагентами, договорами, заказами поставщикам и приёмкой на склад в физический Ledger. |
Закрыто в репозиторном слое. | e2e/11-modules-catalog.spec.ts |
| F11: Персонал и смены | Исправлено | Нет | Да | Нет | Нет | Реализован модуль /employees с сеткой расписания смен, детекцией конфликтов свыше 12ч (ТК РФ) и сохранением смен в IndexedDB. |
Закрыто в коммите d1ccc1c. |
src/features/__tests__/targetPrototypeFlows.test.tsx (12/12 passed) |
| F12: Form Builder: сохранение и исполнение полной модели | Исправлено | Нет | Да | Нет | Нет | DynamicFormRenderer строго исполняет условную видимость полей (conditionalRules: eq, neq, empty, not_empty, contains), фильтрует поля по текущей роли пользователя (viewRoles через useSessionStore), исключает скрытые поля из валидации. Поддерживается 50-шаговый undo/redo. Коммит 5200b7e. |
Закрыто в коммите 5200b7e. |
src/features/settings/entities/__tests__/buildersRuntimeExecution.test.tsx (4/4 passed) |
| F13: Card Builder: строгое исполнение макета | Исправлено | Нет | Да | Нет | Нет | DynamicCardRenderer строго исполняет сохранённый порядок блоков cardBlocks (header, badges, fields_grid, timeline, tasks_notes). Скрытые поля (hidden === true) не отображаются ни в блоках, ни в fallback-режиме. Коммит 5200b7e. |
Закрыто в коммите 5200b7e. |
src/features/settings/entities/__tests__/buildersRuntimeExecution.test.tsx (4/4 passed) |
| F14: View Builder: реальное применение представлений | Исправлено | Нет | Да | Нет | Нет | DynamicTable применяет view.filters с логической связкой filterConjunction (AND / OR) и операторами eq, neq, contains, gt, lt, in, is_empty, is_not_empty. Применяются columnWidths и visibleFieldKeys. Коммит 5200b7e. |
Закрыто в коммите 5200b7e. |
src/features/settings/entities/__tests__/buildersRuntimeExecution.test.tsx (4/4 passed) |
| F15: Полнота матрицы 39 типов полей по docs/52 | Исправлено | Нет | Да | Нет | Нет | Реализован fieldEngine.ts со всеми 39 типами, AST формулами, 299 тестами. |
Закрыто в коммите fcabd60. |
src/features/__tests__/fieldTypesContract.test.ts (299/299 passed) |
| F16: Пагинация и монотонная автонумерация | Исправлено | Нет | Да | Нет | Нет | Полнотекстовый поиск и фильтрация выполняются по всей коллекции до нарезки страниц (total, page, pageSize, totalPages). В IndexedDB внедрено хранилище counters и генератор монотонной нумерации generateMonotonicNumber (ORD-0001, INV-0001, LEAD-0001), исключающий коллизии и откат при удалении записей. Коммит d1ccc1c. |
Закрыто в коммите d1ccc1c. |
src/services/__tests__/paginationAndNumbering.test.ts (6/6 passed) |
| F17: Маршруты, локальные вкладки и Deep Links | Исправлено | Нет | Да | Нет | Нет | Синхронизированы вкладки с query-параметрами URL: /finance?tab=pl, /finance?tab=cashflow, /finance?tab=transactions, /operations?tab=pos, /operations?tab=orders, /operations?tab=kds. Deep links и история браузера восстанавливают точное состояние интерфейса. Коммит d1ccc1c. |
Закрыто в коммите d1ccc1c. |
src/app/router/__tests__/routeTabsDeepLinks.test.tsx (7/7 passed) |
| F18: Устойчивое состояние модулей (Persistence) | Исправлено | Нет | Да | Нет | Нет | Модули TasksModule, HelpDeskModule, EmployeesModule подключены к персистентному хранилищу IndexedDB (settings store) с сохранением задач, тикетов, истории переписки, смен и сотрудников между перезагрузками. Коммит d1ccc1c. |
Закрыто в коммите d1ccc1c. |
src/app/router/__tests__/routeTabsDeepLinks.test.tsx, src/features/__tests__/targetPrototypeFlows.test.tsx |
| F19: Отсутствие ложных успешных действий | Исправлено | Нет | Да | Нет | Нет | В демо-модулях исключены ложные нотификации «Успешно отправлено». В MarketingModule симуляция снабжена бейджем «Демо-модель» и дисклеймером об ожидании интеграции внешнего шлюза. Заблокированы ложные действия. Коммит d1ccc1c. |
Закрыто в коммите d1ccc1c. |
src/features/__tests__/targetPrototypeFlows.test.tsx |
| F20: Согласованность отраслевых данных и фикстур | Исправлено | Нет | Да | Нет | Нет | Изоляция фикстур по профилям (currentProfileId) и тенантам (tenant_id). Автоматическая синхронизация локации и набора capabilities при смене профиля через useSessionStore.setCurrentProfileId. |
Закрыто в коммитах fcabd60 и d1ccc1c. |
src/features/__tests__/rbacSessionIntegrity.test.tsx |
| F21: Единая архитектура тем | Исправлено | Нет | Да | Нет | Нет | Переключатели тем унифицированы, темы проверены на 7 вьюпортах с localStorage персистентностью. |
Закрыто в коммите 0c479f5. |
e2e/02-theme.spec.ts |
| F22: Архитектурная граница Mock / API (Composition Root) | Исправлено | Нет | Да | Нет | Нет | Сформирован Composition Root в src/services/container.ts и src/services/index.ts. Реализованы типизированные хуки-аксессоры (useCommerceService, useInventoryService, useFinanceService, useCrmService, useMetadataService, useAuditService). Поддерживается runtime DI через setServiceContainer. |
Закрыто в коммите Part 8. | src/services/__tests__/compositionRootContract.test.ts (3/3 passed) |
| F23: Асинхронные состояния и унифицированная обработка ошибок | Исправлено | Нет | Да | Нет | Нет | Созданы StateView.tsx и AsyncBoundary.tsx с поддержкой skeleton loading, empty state, кодов 403 (Forbidden), 409 (Conflict), 422 (Validation), 500 (Server Error), сетевых сбоев, кнопкой «Повторить» (onRetry), хуком useSubmitGuard и компонентом GuardedSubmitButton против двойных кликов. |
Закрыто в коммите Part 8. | src/shared/ui/__tests__/asyncStateHandling.test.tsx (9/9 passed) |
| F24: Безопасный импорт и экспорт snapshot | Исправлено | Нет | Да | Нет | Нет | В indexedDb.ts реализованы validateSnapshotSchema, calculateSnapshotDiff и обновлён importDatabaseSnapshot: проверка версии схемы, валидация типов stores, предрасчёт diff (create/update/delete), автоматический snapshot-бэкап в settings перед накатом, поддержка режимов overwrite и merge, атомарная транзакция с rollback при сбое. |
Закрыто в коммите Part 8. | src/services/storage/__tests__/safeSnapshotImport.test.ts (7/7 passed) |
| F25: Регрессионная тестовая защита и негативные сценарии | Исправлено | Нет | Да | Нет | Нет | Разработан комплексный набор негативных проверок src/features/__tests__/auditProbesNegativeMatrix.test.ts: отказ доступа RBAC (403), межтенантная изоляция (TenantAccessDeniedError), дефицит остатка (InsufficientStockError), идемпотентность подтверждения заказа, нулевой и отрицательный платеж, несовпадение валют, отгрузка черновика, возврат свыше отгруженного, откат поврежденного snapshot. |
Закрыто в коммите Part 8. | src/features/__tests__/auditProbesNegativeMatrix.test.ts (10/10 passed) |
Резюме верификации:
- Все 25 замечаний аудита Astra 6 (F01–F25) полностью устранены и подтверждены тестами.
- Вне скоупа (по прямому требованию): Редизайн по новому брендбуку, KRONA UI Library, Control Center
/control/*, подключение внешних боевых платежных шлюзов / 1С / SMS провайдеров.