Дмитрий
550dfd0d44
fix(projects): C9 code-review findings — ProjectResource отдаёт regions[] + покрытие
...
C1: ProjectResource не возвращал regions → edit-диалог/drawer затирали
сохранённые регионы при сохранении. +поле в toArray().
C2: +integration-тест outbound regions[] через полный SyncSupplierProjectsJob::handle().
I1: расскип NewProjectDialog payload-теста (regions в POST).
I2: assert data.regions в ProjectsStore/UpdateTest (ловит C1 на backend-уровне).
I4: docblock — bulkUpdateRegions legacy (region_mask, не влияет на outbound до Plan 6.5).
M1: CHANGELOG v8.22 — исправлен неверный пример регионов (Москва=82).
Регрессия: Pest 905/902/3sk/0, Vitest 104f/884/3sk/0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-17 10:05:32 +03:00
Дмитрий
c847c02441
merge: C9 — Plan 6 регионы субъект-уровня в портал
...
# Conflicts:
# app/tests/Feature/Plan4/Schema/SchemaDeltaTest.php
# db/CHANGELOG_schema.md
# db/schema.sql
2026-05-17 09:30:21 +03:00
Дмитрий
b11bd1a2f8
merge: Sprint 3E (D6/D7 — убрать placeholder-вкладки SettingsView) в портал
2026-05-17 09:03:21 +03:00
Дмитрий
73351c8004
fix(a11y): aria-label с ключом на edit-кнопках AdminSystem — Sprint 6 G9
2026-05-17 08:18:44 +03:00
Дмитрий
e70a21fe83
test(admin): явный stubEnv DEV=true в dev-баннер тесте — Sprint 6 B6 review-fixup
2026-05-17 08:18:43 +03:00
Дмитрий
a31746c157
feat(admin): DEV-only баннер о застабленном auth-gate — Sprint 6 B6
2026-05-17 08:18:43 +03:00
Дмитрий
5a536c84ce
fix(a11y): focus-visible ring + keyboard-activation тест на eye-toggle — Sprint 6 A9 review-fixup
2026-05-17 08:18:43 +03:00
Дмитрий
85641c3136
fix(a11y): accessible eye-toggle на полях пароля — Sprint 6 A9
2026-05-17 08:18:43 +03:00
Дмитрий
4f27bdf468
test(deals): T1 fixup — DealsListIntegration/KanbanRedesign под I3 (убран MOCK_DEALS-fallback)
2026-05-17 07:13:51 +03:00
Дмитрий
ff96e2f7ad
fix(admin): I4 — devPlainCode-баннер за import.meta.env.DEV
2026-05-17 07:13:51 +03:00
Дмитрий
07d2e9705e
fix(admin): I3 — убрать mock fallback в System/Tenants
2026-05-17 07:13:50 +03:00
Дмитрий
aed9475c26
fix(admin): I3 — убрать mockAdmin fallback в Billing/Incidents
2026-05-17 07:13:50 +03:00
Дмитрий
347f54957d
fix(deals): I3 — убрать mock-fallback в NewDealDialog/DealDetailDrawer
2026-05-17 07:13:50 +03:00
Дмитрий
97a7b7fe09
test(deals): T1 review-fixup — I3-тесты через onMounted-путь
2026-05-17 07:13:50 +03:00
Дмитрий
34f552552f
fix(deals): I3 — убрать MOCK_DEALS fallback в DealsView/KanbanView
2026-05-17 07:13:50 +03:00
Дмитрий
1692ee500d
fix(admin): G7 review-fixup — сброс effective_from при открытии редактора + boundary-тест
2026-05-17 05:24:44 +03:00
Дмитрий
7f385b04bb
feat(admin): G10 — браузерный confirm() удаления сетки → v-dialog
2026-05-17 05:24:44 +03:00
Дмитрий
e9c215a1e0
feat(admin): G7 — выбор effective_from тарифной сетки через date-picker
2026-05-17 05:24:44 +03:00
Дмитрий
9c968a1f6d
refactor(admin): G3 — pricing-tiers/suppliers вьюхи на типизированный api/admin.ts
2026-05-17 05:24:44 +03:00
Дмитрий
e2ef0b40a5
feat(billing): E4 — убрать mock pending-баннер (нет платёжного шлюза до Б-1)
2026-05-17 05:24:44 +03:00
Дмитрий
0b146e48b9
feat(billing): E2 — disabled+tooltip на кнопках Автопополнение/Сменить тариф
2026-05-17 05:24:43 +03:00
Дмитрий
2b14071fda
style(ui): Sprint 5B — prettier-формат затронутых файлов
...
Регрессия full: prettier --check на 5 файлах, тронутых Sprint 5B
(T2/T3/T4). Whitespace-only, 0 изменений поведения — Vitest 67/67
на затронутых спеках. Pre-existing prettier-дрейф 28 НЕ-5B файлов
оставлен (вне scope спринта).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-17 04:03:36 +03:00
Дмитрий
e40a575a5a
feat(ui): C6 — degradation-alert в NewDealDialog при провале загрузки списков
2026-05-17 03:48:39 +03:00
Дмитрий
c50b8d8c22
fix(ui): C3 — сброс toast-текста + типизация теста (review-fixup)
2026-05-17 03:44:50 +03:00
Дмитрий
d324d0e20c
feat(ui): C3 — кнопка «Экспорт» в шапке DealsView экспортирует весь список
2026-05-17 03:39:32 +03:00
Дмитрий
4584eb95c0
fix(ui): B3 — ⌘K open-only + DOM-тесты палитры (review-fixup)
2026-05-17 03:33:51 +03:00
Дмитрий
dc3773b4fb
feat(ui): B3 — минимальная ⌘K command-palette навигации
2026-05-17 03:28:05 +03:00
Дмитрий
84fbd56215
feat(ui): B2 — счётчик «Сделки» в сайдбаре из API вместо хардкода
2026-05-17 03:14:13 +03:00
Дмитрий
eaac2cf329
feat(auth): A6 — реальный обратный отсчёт TOTP-окна в 2FA (Sprint 5A)
2026-05-17 02:23:26 +03:00
Дмитрий
7e7ccfeedf
test(auth): A5 — regression generic fallback ForgotPassword (Sprint 5A)
2026-05-17 02:23:26 +03:00
Дмитрий
35ef205c0f
feat(auth): A4 — ResetPassword ошибка несовпадения паролей (Sprint 5A)
2026-05-17 02:23:26 +03:00
Дмитрий
7efab319e7
feat(auth): A1 — Yandex 360 SSO disabled + tooltip (Sprint 5A)
2026-05-17 02:23:26 +03:00
Дмитрий
4c92d564de
feat(import): маршрут /import + сайдбар + инструкция H9
...
- router/index.ts: добавлен маршрут /import (name=import, layout=app,
requiresAuth=true, transition=ld-route-fadeup, devIndex=29)
- AppSidebar.vue: пункт «Импорт данных» (mdi-database-import-outline)
добавлен в группу «Работа» следом за Дашборд
- router.spec.ts: TDD-кейс маршрута /import (layout=app, requiresAuth=true)
- docs/Как_перенести_данные_из_crm-bp-gr.md: инструкция H9 (4 шага + таблица ошибок)
- cspell-words.txt: добавлены формы глагола «замапить»
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 20:14:04 +03:00
Дмитрий
e8d0b61bdd
feat(import): ImportView — экран импорта CSV
...
TDD: spec (3 tests) first, then component.
ImportView.vue: upload form + polling + history table + unknown-statuses banner.
Uses api/imports (uploadImport/listImports/getImport/getUnknownStatuses).
setInterval callback wrapped in named async fn (pollOnce) — no eslint-disable needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 20:05:15 +03:00
Дмитрий
4cccf9ef22
feat(import): api/imports.ts + UnknownStatusesDialog (wizard маппинга)
...
- api/imports.ts: типы ImportLogResource/UnknownStatus/StatusMapping,
функции uploadImport/listImports/getImport/getUnknownStatuses/resolveUnknownStatuses
(apiClient из ./client, стиль api/dashboard.ts)
- UnknownStatusesDialog.vue: wizard маппинга незамапленных статусов воронки
(ТЗ §6.4/§6.6), 14 канонических slug, defineExpose(selection, save)
- Vitest 3/3 (tests/Frontend/UnknownStatusesDialog.spec.ts)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 19:58:33 +03:00
Дмитрий
089a8c182c
feat(settings): D6/D7 — убрать placeholder-вкладки SettingsView
...
Audit findings D6/D7 (Sprint 3E): убраны 4 placeholder-вкладки
(Проекты/Команда/Интеграции/Тихие часы) из SettingsView — UI не должен
обещать неработающий функционал. Удалён PlaceholderTab.vue. Остались
4 рабочие вкладки: Профиль, Безопасность, API и Webhook, Уведомления.
Тесты: 8/8 SettingsView.spec.ts ✓, Vitest 100f/838/3sk/0 ✓.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 14:25:42 +03:00
Дмитрий
9e8c6aea84
feat(admin): G5/G6 frontend — incident detail view + РКН-notify
2026-05-16 14:09:53 +03:00
Дмитрий
5f28c0136c
fix(admin): G4 review — real AxiosError in error test + balance/NaN guards + a11y
2026-05-16 14:09:53 +03:00
Дмитрий
4fcf642963
feat(admin): G4 frontend — billing row-actions menu + dialogs
2026-05-16 14:09:53 +03:00
Дмитрий
9ccd960714
feat(reports): кнопка «Скачать» → signed download URL (F2 frontend)
2026-05-16 12:45:51 +03:00
Дмитрий
b5a8ad6e0a
fix(deals): router в DealsViewRedesign.spec + idempotency guard + watch-test (C8/F3 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
56b4c3e282
feat(deals): deep-link /deals?openId= из напоминаний и колокольчика (audit C8/F3)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
fbb346feeb
fix(dashboard): скрыть Live-бейдж при ошибке + formatRub guard + test hardening (C1 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
3c3fd248e9
fix(dashboard): восстановить tenant-guard в load() + auth.user в тесте (C1 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
b6489f7c7d
feat(dashboard): DashboardView на real API /api/dashboard/summary (audit C1)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
b940243b34
docs+test(admin): ImpersonationBanner — убрать stale JSDoc + тест poll→render (B5 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 10:09:29 +03:00
Дмитрий
6098bb0b77
revert(nav): откат B1 «Напоминания» в сайдбаре — конфликт с решением заказчика
...
Откат 4342dc7 . Audit B1 предлагал вернуть «Напоминания» в сайдбар, но
пункт был намеренно убран по требованию заказчика (commit 5c8ad27
«sidebar cleanup»; тест AppLayout.spec.ts фиксирует «Напоминания убраны
по требованию заказчика»). Решение заказчика 2026-05-16: B1 → won't-do,
пункт остаётся убранным. Восстанавливает зелёный AppLayout.spec.ts.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 10:04:13 +03:00
Дмитрий
e708825e1a
feat(admin): ImpersonationBanner — глобальный индикатор активных сессий (audit B5)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 09:59:43 +03:00
Дмитрий
d4dfd19b95
docs(test): AdminLayout.spec — header-комментарий 5→7 nav-items (B4 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 09:48:09 +03:00
Дмитрий
b7fbf45502
feat(admin): AdminLayout nav — Тарифная сетка + Цены поставщиков (audit B4)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 09:43:53 +03:00