Дмитрий
9443b5b446
feat(supplier): manual queue section in AdminSupplierIntegrationView
...
Таблица pending-записей яруса 3 + кнопка «Отметить выполнено» с confirm-
диалогом, дёргает POST .../manual-queue/{id}/resolve. Реюз существующего
админ-экрана интеграции с поставщиком (после «Истории сверок»).
NB: spec в tests/Frontend/ (vitest include — tests/Frontend/**, не
resources/.../__tests__/ как указал план Step 11.1). loadManualQueue
defensive Array.isArray-guard — иначе onMounted в чужих spec'ах
(mockResolvedValue без queue-ключа) ловил undefined.length.
Spec §4.6. Task 11 of 12. Vitest 5/5 (2 новых + 3 существующих).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-19 12:55:10 +03:00
Дмитрий
66320166b8
feat(supplier): UI-экран «Интеграция с поставщиком» — здоровье CSV-канала
2026-05-18 17:58:53 +03:00
Дмитрий
1412d3fefd
feat(deals/drawer): inline status picker — статус-chip кликабельный, без мутации props
...
UX-request 18.05.2026 (п.3):
- DealDetailHero: v-chip → v-menu со списком всех статусов из lead_statuses
store; форма и цвет chip'а не меняются
- DealDetailBody: emit 'status-changed' наверх (без мутации props.deal)
- DealDetailDrawer: forward события наружу
- DealsView: onDrawerStatusChanged → optimistic update dealsState + PATCH
/api/deals/{id} + rollback
- KanbanView: onDrawerStatusChanged → перенос карточки между колонками
dealsByStatus + transitionDeals + rollback на ошибку
Vue правило vue/no-mutating-props соблюдено (логика в parent'е, не в Body).
Vitest 5 файлов / 38 passed на затронутых; build 2.29s.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 15:34:07 +03:00
Дмитрий
789e7dcdb6
feat(deals/drawer): убрать «Менеджер», добавить «Тип» + «Источник» read-only
...
UX-request 18.05.2026 (пп.4/6/7):
- удалена секция «Менеджер»/«Не назначен» (менеджеров в системе пока нет)
- добавлен параметр «Тип» (Сайт/Звонок/СМС) — project.signal_type
- добавлен параметр «Источник» (read-only):
- site/call → project.signal_identifier (домен или телефон)
- sms → sms_senders[0] + ' (KEYWORD)' если sms_keyword не пустой
- удалён hardcoded «Я.Директ → landing-1»
Backend: DealController index + show + update payload расширены 4 полями
project_signal_type/identifier/sms_keyword/sms_senders + eager-load
project relation расширен.
Редактирование источника — только в карточке проекта (Task 5 плана).
Larastan baseline bumped (DealShowTest: tenant 13→20, getJson 7→10 для 3 новых тестов).
Pest 51/51 на Deal-endpoints.
Vitest 108 files / 875 passed / 3 skipped (5 новых тестов DealDetailBody).
Build 2.30s.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 15:24:57 +03:00
Дмитрий
3bedf10449
feat(deals): drawer виден при selected≤1, bulk-полоса только при ≥2
...
UX-request 18.05.2026:
- selected.length === 1 → drawer авто-открывается на этой сделке,
bulk-полоса скрыта (одну сделку проще менять через drawer)
- selected.length >= 2 → drawer закрыт, bulk-полоса видна
- selected.length === 0 → как сейчас (drawer по row-click)
Vitest 12/12 на DealsView.spec (2 новых теста + 10 существующих, none broken).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 15:14:03 +03:00
Дмитрий
36ea9cde04
feat(deals): убрать префикс B1_/B2_/B3_ из отображения «Источник»
...
Поставщик crm.bp префиксует имена проектов признаком канала-провайдера
(B1_/B2_/B3_ — три базы лидов). В UI Лидерры префикс — шум: пользователю
интересен сам проект, не канал.
Трансформация display-only — данные в БД не трогаем, фильтрация идёт по
project_id (не name).
Утилита: app/resources/js/composables/projectName.ts → stripChannelPrefix.
Регэксп ^B[123]_ case-insensitive; null/undefined/'' → ''.
Применено в 4 точках:
- DealsTable «Источник» (item.project)
- DealsFilters «Проект» dropdown (через computed-маппинг в DealsView)
- KanbanCard карточка
- DealDetailBody параметры панели
Тесты: 8 unit-тестов на утилиту (B1/B2/B3 case-insensitive, не трогать
B0/B4/Bx, не трогать префикс в середине строки, null/undefined/''),
38/38 на затронутых компонентах, 868/3sk/0 full Vitest, build 2.62s.
Smoke /deals: 20 строк, ни одна не начинается с B1_/B2_/B3_ (был
«B1_73912557675 [35]», стал «73912557675 [35]»; «B3_krk-finance.ru/...»
→ «krk-finance.ru/...»). Скриншот deals-no-bprefix-2026-05-18.png.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 14:33:33 +03:00
Дмитрий
0f4f7161c8
feat(deals): Kanban — 5-column funnel (comment + test sync)
2026-05-18 03:42:41 +03:00
Дмитрий
b4138bbc82
feat(deals): sweep 14->5 funnel slugs — controllers, mocks, stories, tests
2026-05-18 03:42:41 +03:00
Дмитрий
90be402106
test(deals): make 'one loadDeals' regression test non-vacuous (exercise page!=1)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-18 03:42:41 +03:00
Дмитрий
78333da3d5
test(deals): rewrite DealsView spec for redesign; drop DealsViewRedesign spec + DEALS_TABS
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 03:42:40 +03:00
Дмитрий
d78a72c286
refactor(deals): A9 review nits — drop duplicate spec, single Pinia, accurate comment
2026-05-18 03:42:40 +03:00
Дмитрий
ba12fecc5c
refactor(deals): extract DealDetailBody; DealDetailDrawer = overlay/inline wrapper
2026-05-18 03:42:40 +03:00
Дмитрий
74cc4408c7
feat(deals): DealsBulkBar — status-change only (drop export/delete/trash)
2026-05-18 03:42:40 +03:00
Дмитрий
ccf194ed8a
feat(deals): DealsTable — lead-registry columns (Телефон/Источник/Город/Статус/Напоминание/Комментарий/Поставлен)
2026-05-18 03:42:40 +03:00
Дмитрий
a2bfeafcea
feat(deals): DealsFilters — phone search + Status/Project/City selects
2026-05-18 03:42:40 +03:00
Дмитрий
a3167d5783
feat(deals): mapApiDeal maps city/comment/signalType/receivedAt/nextReminderAt
2026-05-18 03:42:40 +03:00
Дмитрий
7bcfbf6bd4
feat(deals): api/deals — ApiDeal +4 fields, date-range list params, exportDealsByRange
2026-05-18 03:42:40 +03:00
Дмитрий
55a34af986
feat(deals): redesign groundwork — spec, plan, mockups + sidebar nav cleanup
...
Deals page redesign: design spec + implementation plan (Phase A page redesign,
Phase B 14->5 status funnel) + v8 HTML mockups (variants comparison + final).
AppSidebar: remove Импорт данных / Отчёты nav links (routes stay reachable by
direct URL); AppLayout.spec updated to 6 nav items. stylelint --fix on mockups;
cspell-words += deals-redesign terms.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 03:42:39 +03:00
Дмитрий
54451d2ea6
feat(projects): RegionsBulkDialog — subject-level regions (89 RF subjects) #1426
...
Bulk regions dialog reworked from federal-district bitmask to subject/region
selection, consistent with ProjectDetailsDrawer/NewProjectDialog. Full-stack:
add_regions/remove_regions on projects.regions INT[], BulkProjectActionRequest
split validation, ProjectService model-instance update. federal-districts.ts
removed (zero consumers). +menuRepositionFix util for v-autocomplete menu.
phpstan-baseline: bump actingAs ignore count 14->15 (new validation test).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 03:41:46 +03:00
Дмитрий
b1e903f31a
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
Дмитрий
ec6ebc57e0
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
Дмитрий
fad1c895a1
merge: Sprint 3E (D6/D7 — убрать placeholder-вкладки SettingsView) в портал
2026-05-17 09:03:21 +03:00
Дмитрий
6230c0fa61
fix(a11y): aria-label с ключом на edit-кнопках AdminSystem — Sprint 6 G9
2026-05-17 08:18:44 +03:00
Дмитрий
e41844a13b
test(admin): явный stubEnv DEV=true в dev-баннер тесте — Sprint 6 B6 review-fixup
2026-05-17 08:18:43 +03:00
Дмитрий
11baaefe21
feat(admin): DEV-only баннер о застабленном auth-gate — Sprint 6 B6
2026-05-17 08:18:43 +03:00
Дмитрий
97a27fdfbf
fix(a11y): focus-visible ring + keyboard-activation тест на eye-toggle — Sprint 6 A9 review-fixup
2026-05-17 08:18:43 +03:00
Дмитрий
d41471c818
fix(a11y): accessible eye-toggle на полях пароля — Sprint 6 A9
2026-05-17 08:18:43 +03:00
Дмитрий
0d2c64aa8c
test(deals): T1 fixup — DealsListIntegration/KanbanRedesign под I3 (убран MOCK_DEALS-fallback)
2026-05-17 07:13:51 +03:00
Дмитрий
256acf8781
fix(admin): I4 — devPlainCode-баннер за import.meta.env.DEV
2026-05-17 07:13:51 +03:00
Дмитрий
a0b1cfdcae
fix(admin): I3 — убрать mock fallback в System/Tenants
2026-05-17 07:13:50 +03:00
Дмитрий
2b04bbd4f8
fix(admin): I3 — убрать mockAdmin fallback в Billing/Incidents
2026-05-17 07:13:50 +03:00
Дмитрий
888b7563cd
fix(deals): I3 — убрать mock-fallback в NewDealDialog/DealDetailDrawer
2026-05-17 07:13:50 +03:00
Дмитрий
3a58090db9
test(deals): T1 review-fixup — I3-тесты через onMounted-путь
2026-05-17 07:13:50 +03:00
Дмитрий
23579dd9be
fix(deals): I3 — убрать MOCK_DEALS fallback в DealsView/KanbanView
2026-05-17 07:13:50 +03:00
Дмитрий
2172d2ba45
fix(admin): G7 review-fixup — сброс effective_from при открытии редактора + boundary-тест
2026-05-17 05:24:44 +03:00
Дмитрий
915335aea6
feat(admin): G10 — браузерный confirm() удаления сетки → v-dialog
2026-05-17 05:24:44 +03:00
Дмитрий
9f791f9f93
feat(admin): G7 — выбор effective_from тарифной сетки через date-picker
2026-05-17 05:24:44 +03:00
Дмитрий
c31e199e45
refactor(admin): G3 — pricing-tiers/suppliers вьюхи на типизированный api/admin.ts
2026-05-17 05:24:44 +03:00
Дмитрий
42409ddec0
feat(billing): E4 — убрать mock pending-баннер (нет платёжного шлюза до Б-1)
2026-05-17 05:24:44 +03:00
Дмитрий
d667feda0f
feat(billing): E2 — disabled+tooltip на кнопках Автопополнение/Сменить тариф
2026-05-17 05:24:43 +03:00
Дмитрий
bc24420ad4
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
Дмитрий
788c7ab336
feat(ui): C6 — degradation-alert в NewDealDialog при провале загрузки списков
2026-05-17 03:48:39 +03:00
Дмитрий
eb41b65dad
fix(ui): C3 — сброс toast-текста + типизация теста (review-fixup)
2026-05-17 03:44:50 +03:00
Дмитрий
095032a231
feat(ui): C3 — кнопка «Экспорт» в шапке DealsView экспортирует весь список
2026-05-17 03:39:32 +03:00
Дмитрий
adb5d87d1d
fix(ui): B3 — ⌘K open-only + DOM-тесты палитры (review-fixup)
2026-05-17 03:33:51 +03:00
Дмитрий
8b3ea3ed2e
feat(ui): B3 — минимальная ⌘K command-palette навигации
2026-05-17 03:28:05 +03:00
Дмитрий
4b0809a82d
feat(ui): B2 — счётчик «Сделки» в сайдбаре из API вместо хардкода
2026-05-17 03:14:13 +03:00
Дмитрий
be51c97dce
feat(auth): A6 — реальный обратный отсчёт TOTP-окна в 2FA (Sprint 5A)
2026-05-17 02:23:26 +03:00
Дмитрий
4a1663b426
test(auth): A5 — regression generic fallback ForgotPassword (Sprint 5A)
2026-05-17 02:23:26 +03:00
Дмитрий
17d9f16b7d
feat(auth): A4 — ResetPassword ошибка несовпадения паролей (Sprint 5A)
2026-05-17 02:23:26 +03:00