docs(etalon): bump после workdays-hardcode + resync-gate fix (fc0b885)
§1 git: HEAD889717a→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 изолированных тенантов (commitff50759chore(demo) split-tenants). cspell-words.txt +5 (Незакоммиченного / petr / mariya / хардкодил / Ресинк). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1543,3 +1543,10 @@ vsya
|
||||
учёток
|
||||
залогиненному
|
||||
незакоммичено
|
||||
|
||||
# Workdays/resync supplier sync fix (2026-05-20)
|
||||
Незакоммиченного
|
||||
petr
|
||||
mariya
|
||||
хардкодил
|
||||
Ресинк
|
||||
|
||||
@@ -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 +
|
||||
|
||||
Reference in New Issue
Block a user