From 16dcb3bd43fded5361a3c2bd4d1c9d0b9f2a0fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Wed, 20 May 2026 17:38:27 +0300 Subject: [PATCH] =?UTF-8?q?docs(etalon):=20bump=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20workdays-hardcode=20+=20resync-gate=20fix=20(fc0b885)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §1 git: HEAD 889717a → fc0b885, push 5f86432..fc0b885, lefthook счётчики обновлены, «незакоммиченного нет». §6 рабочие нити: +первая запись «Workdays-hardcode + resync-gate в supplier sync — ИСПРАВЛЕНО И ЗАПУШЕНО (fc0b885)» с описанием трёх точек фикса и cross-ref на память. Прочее: §6 multi-region запись — телефон 79135191264 заменён на маску 7913XXXXXXX (gitleaks ru-phone-unmasked / 152-ФЗ). §4 «Демо-данные» — сохранён предыдущий апдейт заказчика про 5 изолированных тенантов (commit ff50759 chore(demo) split-tenants). cspell-words.txt +5 (Незакоммиченного / petr / mariya / хардкодил / Ресинк). Co-Authored-By: Claude Opus 4.7 (1M context) --- cspell-words.txt | 7 +++++++ ЭТАЛОН.md | 20 +++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/cspell-words.txt b/cspell-words.txt index 7c34b3f1..05bdf15a 100644 --- a/cspell-words.txt +++ b/cspell-words.txt @@ -1543,3 +1543,10 @@ vsya учёток залогиненному незакоммичено + +# Workdays/resync supplier sync fix (2026-05-20) +Незакоммиченного +petr +mariya +хардкодил +Ресинк diff --git a/ЭТАЛОН.md b/ЭТАЛОН.md index 796c7e6b..0bf5e4cd 100644 --- a/ЭТАЛОН.md +++ b/ЭТАЛОН.md @@ -9,7 +9,7 @@ **перепроверять реальной командой**, не доверять снимку вслепую. - Обновляется по команде заказчика **«обнови эталон»**. -**Снимок снят:** 20.05.2026 (вечер, после фикса off-screen logout-меню в топбаре; volatile §1–§4 пересверены). +**Снимок снят:** 20.05.2026 (вечер-4, после фикса workdays-hardcode + resync-gate в supplier sync; volatile §1–§4 пересверены). --- @@ -18,11 +18,11 @@ - Git-корень репозитория — папка `Документация/` (**не** `app/`). - Remote: `CoralMinister/lidpotok` (приватный). - Текущая локальная ветка: **`feat/project-migration-redesign`**. -- Локальный HEAD = origin/main HEAD = **`c7fd90c`** (fix(deals): projects-envelope `{data,meta}` + фикстуры LeadStatus — запушено предыдущей сессией; сверять `git log -1 origin/main`). -- Push паттерн: `git push origin <ветка>:main`. Последний push: `b0ce510..e35fc6c` (4 моих коммита Plan 4 FF после rebase на origin/main, куда параллельная brain-сессия влила 21 observer-коммит; 0 пересечений — мои файлы только под `app/`, их — docs/tools/.claude/package.json). -- Pre-push lefthook прошёл чисто (gitleaks-full 1099/0, lychee 64/0) — `--no-verify` не понадобился. -- **Незакоммичено (эта сессия):** `app/resources/js/components/layout/AppTopbar.vue` — фикс off-screen logout-меню (см. §6) + пересобранный `app/public/build/` (gitignored); ждёт коммита по команде заказчика. -- Прочее незакоммиченное: `ЭТАЛОН.md`, `docs/observer/STATUS.md` + `episodes-2026-05.jsonl` (hook-артефакты brain governance, не мои); untracked artifacts (см. §4). +- Локальный HEAD = origin/main HEAD = **`80275c6`** (fix(supplier): real workdays from delivery_days_mask + resync on limit/days change; сверять `git log -1 origin/main`). +- Push паттерн: `git push origin <ветка>:main`. Последний push: `36c71ec..80275c6` (1 коммит FF: workdays-hardcode + resync-gate fix). +- Pre-push lefthook прошёл чисто (gitleaks-full 1112/0, lychee 65/0) — `--no-verify` не понадобился. +- **Незакоммиченного нет** (обе правки этой и прошлой сессии запушены). +- Прочее незакоммиченное: `docs/observer/STATUS.md` + `episodes-2026-05.jsonl` (hook-артефакты brain governance, не мои); untracked artifacts (см. §4). - Остатки от rebase (безопасно): `stash@{0}` с не-моими hook/parallel-артефактами (+5 других parallel-стэшей); `/tmp/plan4-rebase-bak/` — устаревшие untracked-копии 2 observer-файлов (committed-версии origin/main авторитетнее). > ⚠️ Снимок git в начале сессии бывает **устаревшим** (параллельные сессии скачут по веткам). @@ -57,7 +57,7 @@ ## 4. Временное / демо — НЕ постоянное, под финальную очистку -- **Демо-данные dev-БД `liderra` ВОССТАНОВЛЕНЫ 20.05.2026** (`php artisan db:seed` + `app/storage/_demo_5users.php`): tenant 1 (subdomain demo) + 3 проекта + 5 демо-сделок + 5 учёток. Ранее в сессии БД была стёрта quirk-командой `migrate:fresh --env=testing` (без `app/.env.testing` бьёт в dev `liderra`, не `liderra_testing` — Открытые_вопросы:319), что также оставило **5 НЕдокатанных миграций эпика** → webhook падал (`project_supplier_links` нет); докатано `php artisan migrate` → факт. v8.26. **Рекомендация:** завести `app/.env.testing` (`DB_DATABASE=liderra_testing`), чтобы тест-команда не задевала dev. +- **Демо-данные dev-БД `liderra` (актуальный статус 20.05.2026 вечер):** 5 тенантов + 5 учёток, каждая в своей компании. Разбивка выполнена скриптом `app/storage/_demo_split_tenants.php`. Tenant 1 (demo, Demo Admin) = 4 проекта; tenants 2-5 (ivan/anna/petr/mariya-demo) = пустые. Пароль у всех: **password**. Для восстановления с нуля: `php artisan db:seed` → `php artisan tinker storage/_demo_5users.php` → `php artisan tinker storage/_demo_split_tenants.php`. - **Каналы миграции проверены вживую 20.05.2026 (все 3 ✅):** webhook (лид→Deal+списание), CSV reconcile (скачано 169 строк с crm.bp-gr.ru), экспорт (проект create+delete у поставщика, без следов). После проверки тест-данные вычищены до чистого демо; `supplier_webhook_secret` = рабочий 48-симв. Прочие untracked `_demo_*.php` (`_demo_reroute`/`_demo_day_setup`/`_demo_user`/`_demo_create_projects`/`_demo_migrate_b1site`) — временные, под Task 9 cleanup. - Webhook-тест артефакты: `.env` `SUPPLIER_LOGIN`/`SUPPLIER_PASSWORD`, `app/bootstrap/app.php` trustProxies, `system_settings.supplier_webhook_secret`, `tools/cloudflared.exe`, DNS-правки (`tools/.dns-backup.json`). - Untracked снимки и YAML в корне (`*.png`, `rt-*.yml`, `user-api-page.yml`, `supplier-api-configured*.png`) — артефакты recon/тестов разных сессий. @@ -79,7 +79,7 @@ `project_supplier_links` pivot + `deals.subject_code` + seed `supplier_export_mode` + CHECK chk_deals_subject_code. **Schema header line всё ещё указывает v8.25** — мелкий drift, починить в follow-up; CHANGELOG_schema.md содержит v8.26 entries). - Стек: Laravel 13 + PHP 8.3 · Vue 3 + Vuetify 3 (не Tailwind/Inertia) · PostgreSQL 16 · Redis. -- **Демо-доступ к порталу:** 5 учёток tenant 1 (subdomain demo) — `admin@demo.local` + `manager1@demo.local`..`manager4@demo.local`, пароль у всех **`password`**. Админка `/admin/*` в local открыта любому залогиненному (отдельного входа в админку нет; `EnsureSaasAdmin` — стаб local/testing). +- **Демо-доступ к порталу:** 5 изолированных компаний — `admin@demo.local` (Demo Tenant, 4 проекта) + `manager1@demo.local` (Компания Ивана) + `manager2@demo.local` (Компания Анны) + `manager3@demo.local` (Компания Петра) + `manager4@demo.local` (Компания Марии). Пароль у всех **`password`**. Каждый логин видит только своё. Админка `/admin/*` в local открыта любому залогиненному (`EnsureSaasAdmin` — стаб local/testing). - Поставщик лидов: `crm.bp-gr.ru` (учётка в `.env` `SUPPLIER_*`); портал — Vue 2 + Element UI; `/admin/visit/rt` «Мои проекты» (форма add-project — Element UI внутри Vuetify v-dialog). - Оперативная карта проекта: `CLAUDE.md` (правится только плагином `claude-md-management`). @@ -87,7 +87,9 @@ ## 6. Текущие рабочие нити (детали — в памяти Claude) -- **Off-screen logout-меню топбара — ИСПРАВЛЕНО (НЕЗАКОММИЧЕНО).** Кнопка-аватар справа вверху открывала меню «Выйти» за правым краем экрана (left≈3386 при ширине 1920) — баг Vuetify: `v-menu`-активатор внутри `position:fixed` `v-app-bar` уезжает под `prefers-reduced-motion:reduce` (умолчание Windows Server). Фикс — подключён существующий `repositionMenuAfterOpen` к обоим меню топбара (`@update:model-value`) в `app/resources/js/components/layout/AppTopbar.vue` + `npm run build`. Verified в браузере с эмуляцией reduced-motion (меню на экране, «Выйти» → /login); eslint+type-check 0. **Корректирует вывод предыдущей сессии** («кнопка исправна / зависшая вкладка») — баг реальный, не воспроизводился без эмуляции reduced-motion в Playwright. Заказчику: Ctrl+F5. Память: `feedback_environment.md` квирк #103. +- **Workdays-hardcode + resync-gate в supplier sync — ИСПРАВЛЕНО И ЗАПУШЕНО** (`80275c6`). Два бага: (1) `SyncSupplierProjectJob` хардкодил workdays=[1..7] в 7 местах — поставщик всегда получал все 7 дней независимо от `delivery_days_mask` проекта; (2) `ProjectService::update()` ресинкал только при смене sms_*/signal_identifier/regions — изменение лимита и дней оставалось локальным до ночного батча 18:00 МСК. Плюс sub-баг forceFill в update-path не обновлял локальный `current_workdays`. Все три точки залатаны; +3 Pest specs (создание из маски, update-path refresh, resync-gate на limit/days); Pest 146/146, Pint+Larastan 0. Ресинк проекта id=5 «мой номер» выполнен вручную — на portal ушли реальные дни Пн-Пт. Память: `project_supplier_integration.md`, `feedback_environment.md` квирк #104. +- **Multi-region supplier sync — ИСПРАВЛЕНО И ЗАПУШЕНО** (`36c71ec`). Портал отвергал второй регион (`status=Doubles` на дубль идентификатора), что молча проглатывалось. Теперь оба джоба (`SyncSupplierProjectJob` + `SyncSupplierProjectsJob`) формируют одну группу на идентификатор со всеми регионами merged; `subject_code=null` везде. `ProjectService::update()` триггерит resync при изменении `regions`. Проект 6 (телефон `7913XXXXXXX`) вылечен вручную: усыновлены 3 портальные записи в локальную БД → re-sync через UPDATE → теперь тег=РФ, регионы=[29, 28]. Тесты 21 GREEN. +- **Off-screen logout-меню топбара — ИСПРАВЛЕНО И ЗАПУШЕНО** (`9331465`). Баг Vuetify: `v-menu` внутри `position:fixed v-app-bar` уезжал за экран под `prefers-reduced-motion:reduce` (умолчание Windows Server). Фикс: `repositionMenuAfterOpen` подключён к обоим меню (`@update:model-value`) в `AppTopbar.vue`. Память: `feedback_environment.md` квирк #103. - **Эпик `project-migration-redesign` ПОЛНОСТЬЮ ЗАВЕРШЁН** (Plans 1+2+3 запушены 20.05 `9729909`; Plan 4 запушен 20.05 день `e35fc6c`): per-субъект supplier_projects + pivot project_supplier_links (Plan 1), eligibility через pivot + cap=3 + deal.subject_code от тега (Plan 2), online/batch toggle +