3225 Commits

Author SHA1 Message Date
coopops cba0d41020 fix(desktop): устранить белый экран на первом холодном заходе (PWA boot race)
Гонка на первом заходе в проде: ленивый чанк маршрута падал на import()
из-за конкуренции за сеть с фоновым precache только что установленного SW,
а перехватить ошибку было некому → пустой router-view до ручной перезагрузки.

- FIX-1: router.onError ловит провал загрузки чанка и делает авто-reload на
  целевой путь (с защитой от reload-цикла через sessionStorage).
- FIX-2: регистрацию Service Worker откладываем до window 'load', чтобы
  precache-шторм не конкурировал с первой отрисовкой и догрузкой чанков.
- Диагностика: таймстемп-логи [BOOTRACE] по всей boot-цепочке (initApp,
  router beforeEach/afterEach/onError, App.onMounted/isLoaded, SW register,
  safety-timeout) для грепа порядка инициализации на проде.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 16:48:51 +00:00
coopops 7ca3c21079 chore(release): publish
Build bootstrap container / build (push) Successful in 3m6s
Release / release (push) Successful in 26m46s
Release / publish-packages (push) Failing after 8m13s
Release / trigger-coopenomics-docs (push) Successful in 2s
Release / trigger-mono-docs (push) Successful in 2s
v2026.6.9-13
2026-06-09 15:37:07 +00:00
coopops 045204754b chore(release): publish
Build bootstrap container / build (push) Has been cancelled
Release / release (push) Has been cancelled
Release / publish-packages (push) Has been cancelled
Release / trigger-coopenomics-docs (push) Has been cancelled
Release / trigger-mono-docs (push) Has been cancelled
v2026.6.9-alpha-12
2026-06-09 15:36:50 +00:00
coopops b7c56bd948 fix(payment): добавить legacy-поле kpp в BankAccountDetails
Старые клиенты селектят kpp на BankAccountDetails → GraphQL-валидация
падала (Cannot query field "kpp"). Добавлено nullable-поле в DTO + во все
места Zeus-селектора SDK (иначе сборка десктопа падает на MakeAllFieldsRequired).
Помечено TODO «удалить после 1 августа».

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 15:33:59 +00:00
coopops 3bfd5d219a fix(desktop): карточки платежей не лезут на десктоп + DataRow стек на мобиле
- Реестр платежей: мобильные карточки (.payments-cards.pmt-mobile) показывались
  и на десктопе поверх таблицы. Причина — .payments-cards{display:flex} имел ту
  же специфичность, что одиночный .pmt-mobile{display:none}, и перебивал его по
  порядку источника. Скрытие/показ переведены на двойной селектор
  .payments-cards.pmt-mobile (специфичнее) — на десктопе только таблица.
- Удостоверение/DataRow: горизонтальная пара label|value на телефоне (≤599px)
  стекается в одну колонку — длинный публичный ключ занимает всю ширину
  карточки вместо узких ~150px и больше не рвётся в столбик по буквам.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 15:27:01 +00:00
coopops 7c01011a51 [@ant] fix(push): обработчик push в генерируемом SW + видимые логи доставки
Корень «push отправлен, но не виден»: workboxMode GenerateSW игнорирует
sourceFiles.serviceWorker, поэтому push/notificationclick из
custom-service-worker.ts в прод не попадали — браузер push получал, но SW его
не показывал (бэкенд честно «sent to N subscription(s)»). Доказано: прод
/service-worker.js содержит 0 push-обработчиков.

- desktop: public/push-sw.js (push → showNotification, notificationclick →
  focus/openWindow) + importScripts('push-sw.js') в extendGenerateSWOptions
- controller: «Доставлено»/«Канал пропущен» debug→info + сводка
  «web-push → user: N подписок» — чтобы доставка была видна в логах без БД
2026-06-09 15:25:31 +00:00
coopops 31b6f5805a fix(desktop): убрать посимвольный перенос и наезд бейджей на мобиле
Корень: overflow-wrap:anywhere рвал имена/email по буквам в столбик, а
бейджи статуса воровали ширину у имени рядом.

- BaseBadge: white-space:nowrap + flex-shrink:0 — бейдж не сжимается/не
  переносится (фикс глобально для всех экранов).
- components.css мобильный .table: anywhere → break-word (перенос по словам).
- Реестр платежей (pay-card): имя обрезается «…», сумма flex-shrink:0,
  тип переносится по словам.
- Реестр пайщиков (ParticipantCard): имя/аккаунт/email обрезаются «…»;
  попутно FontAwesome-иконка аватара → Material person.
- Журнал уведомлений: восстановлен задуманный горизонтальный скролл
  таблицы на мобиле (перебит глобальный min-width:0!important), 7 колонок
  с кнопкой действия больше не схлопываются в буквы-в-столбик.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 15:16:32 +00:00
coopops 5cf6c20ff2 chore(release): publish
Release / publish-packages (push) Has been cancelled
Release / trigger-coopenomics-docs (push) Has been cancelled
Release / trigger-mono-docs (push) Has been cancelled
Release / release (push) Has been cancelled
Build bootstrap container / build (push) Has been cancelled
v2026.6.9-11
2026-06-09 14:28:38 +00:00
coopops ef3fffecda chore(release): publish
Build bootstrap container / build (push) Successful in 3m9s
Release / release (push) Successful in 24m4s
Release / trigger-coopenomics-docs (push) Has been cancelled
Release / trigger-mono-docs (push) Has been cancelled
Release / publish-packages (push) Has been cancelled
v2026.6.9-10
2026-06-09 14:28:02 +00:00
coopops fd9b14a98b chore(release): publish
Build bootstrap container / build (push) Successful in 3m26s
Release / release (push) Successful in 23m22s
Release / publish-packages (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
v2026.6.9-alpha-9
2026-06-09 14:27:46 +00:00
coopops 4a39c976a1 fix(desktop): ужать зазор между «Выйти» и версией в LeftDrawerMenu
Нижний padding rail__signout 12→4px, version padding-top 4→0px,
шрифт версии 11→10px — версия идёт сразу под кнопкой, не висит крупной.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 14:11:01 +00:00
coopops 7df88f48b7 [@ant] fix(desktop/notifications): панель уведомлений во всю ширину на мобиле
Было: q-menu прижат справа фиксированной шириной 360px → правый край резался
(«Прочитать в…», тексты заявок), снизу горизонтальный скролл. На мобиле (≤600px)
раскрываем меню во всю ширину вьюпорта (left/right 8px), панель width:100%.
2026-06-09 13:42:21 +00:00
coopops 354e2d2be0 [@ant] fix(desktop/notifications): чистка HTML в теле, гейт push-кнопки по реальному SW, нерасползающаяся strip
- тело уведомления приходит с <br>/HTML (шарится с email/push-шаблонами), а
  in-app панель рендерит как текст с переносом \n — нормализую HTML→plain в toItem
- push-strip и кнопку «Включить на устройстве» показываем только когда SW реально
  активен (hasActiveServiceWorker), иначе клик умирал на «Service Worker не активен»;
  в dev/без-PWA strip не рисуем (не путать с «браузер не поддерживает»)
- strip не переносит текст/кнопку на узких экранах (nowrap + flex 0 0 auto)
2026-06-09 13:32:52 +00:00
coopops cb0d6365ba chore(release): publish
Release / release (push) Successful in 27m4s
Build bootstrap container / build (push) Successful in 39s
Release / publish-packages (push) Failing after 8m11s
Release / trigger-coopenomics-docs (push) Successful in 2s
Release / trigger-mono-docs (push) Successful in 1s
v2026.6.9-8
2026-06-09 13:07:28 +00:00
coopops f608119278 Merge branch 'main' of ssh://git.coopenomics.world:222/C9S/mono
# Conflicts:
#	components/blago-cli/package.json
#	components/boot/package.json
#	components/cleos/package.json
#	components/contracts/package.json
#	components/controller/package-lock.json
#	components/controller/package.json
#	components/cooptypes/package.json
#	components/desktop/package.json
#	components/docs-harness/package-lock.json
#	components/docs-harness/package.json
#	components/docs/package.json
#	components/email-relay/package.json
#	components/factory/package.json
#	components/inter/package.json
#	components/migrator/package.json
#	components/notifications/package.json
#	components/parser/package-lock.json
#	components/parser/package.json
#	components/sdk/package.json
#	components/setup/package.json
#	lerna.json
2026-06-09 13:07:14 +00:00
coopops 3c3b6a76c4 chore(release): publish
Build bootstrap container / build (push) Successful in 3m9s
Release / release (push) Successful in 25m21s
Release / publish-packages (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
v2026.6.9-alpha-7
2026-06-09 13:02:21 +00:00
coopops 8f3fdd49a1 Merge branch 'testnet' of ssh://git.coopenomics.world:222/C9S/mono into testnet
# Conflicts:
#	components/email-relay/package.json
2026-06-09 12:58:16 +00:00
coopops 9ffe184062 [@dark-sun] fix(desktop): реестр платежей — карточки на мобиле вместо ломаной таблицы
На телефоне (≤599px) таблица из 7–8 колонок схлопывалась в нечитаемые
буквы-в-столбик: глобальный канон components.css форсит
.table{min-width:0!important} + overflow-wrap:anywhere на ячейках, что
перебивало scoped min-width/горизонтальный скролл виджета. Канон запрещает
горизонтальный скролл таблиц.

Решение как в реестре документов: десктоп — канон-таблица, мобайл —
карточная раскладка (имя+статус, сумма+направление, тип·дата, действия,
раскрытие деталей). Переключение чисто на CSS @media (SSR-safe).
Заодно иконки направления fa-* → Material (канон запрещает FontAwesome).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 12:52:42 +00:00
coopops 9ae811dae3 [@ant] fix(desktop/push): device-aware подписка + кнопка переподписки в колокольчике
Корень бага «push приходит только на одно устройство»: autoSubscribe
гейтился store.isSubscribed (= у аккаунта есть подписка на ЛЮБОМ устройстве),
поэтому второе устройство никогда не подписывалось. Введён endpoint текущего
браузера + computed isThisDeviceSubscribed; autoSubscribe теперь идемпотентно
регистрирует каждое устройство. Добавлены resubscribe()/refreshDeviceState()
и строка статуса push с кнопкой «Включить/Переподписать» в виджете колокольчика.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 11:51:26 +00:00
coopops a77fa945a6 [C28-28][@ant] chore(email-relay): вынести релей из mono в C9S/email-relay
Релей переехал в отдельный репозиторий C9S/email-relay, собирается локально
плейбуком (playbooks/email-relay) — релиз mono его больше не пересобирает.
Прод-образ mono-base (prune --prod) не подходил для standalone-сервиса.

Удалено: components/email-relay, build_service в release.yaml, dev-сервис в
docker-compose. Контроллерный relay-режим (EMAIL_RELAY_URL/TOKEN в
email-channel.adapter + config) ОСТАЁТСЯ — он и активирует отправку через релей.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 11:47:59 +00:00
Alex Ant fd24efb63a chore(release): publish
Build bootstrap container / build (push) Successful in 3m19s
Release / release (push) Successful in 28m31s
Release / publish-packages (push) Has been cancelled
Release / trigger-coopenomics-docs (push) Has been cancelled
Release / trigger-mono-docs (push) Has been cancelled
v2026.6.9-6
2026-06-09 15:49:05 +05:00
Alex Ant 01fc0872ae chore(release): publish
Build bootstrap container / build (push) Has been cancelled
Release / publish-packages (push) Has been cancelled
Release / trigger-coopenomics-docs (push) Has been cancelled
Release / trigger-mono-docs (push) Has been cancelled
Release / release (push) Has been cancelled
v2026.6.9-alpha-5
2026-06-09 15:48:49 +05:00
Alex Ant 271de60831 Merge branch 'dev' of ssh://git.coopenomics.world:222/C9S/mono into dev 2026-06-09 15:48:32 +05:00
coopops be7e1585b0 [C28-28][@ant] fix(email-relay): ts-node+typescript в dependencies (переживают prune --prod)
Прод-образ mono-base делает `pnpm prune --prod` (Dockerfile:74) — devDeps
вырезаются. ts-node был в devDependencies → в проде `sh: ts-node: not found`,
контейнер в restart-loop, /health не отвечал. controller держит ts-node в
dependencies — повторяем паттерн. (Коммит из закрытого PR #115 не попал в dev,
вношу прямо.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 10:47:15 +00:00
Alex Ant addb527f3c chore(release): publish
Build bootstrap container / build (push) Successful in 3m16s
Release / release (push) Successful in 26m2s
Release / publish-packages (push) Failing after 8m18s
Release / trigger-coopenomics-docs (push) Successful in 3s
Release / trigger-mono-docs (push) Successful in 1s
v2026.6.9-4
2026-06-09 14:10:52 +05:00
Alex Ant 9e271a6ce9 chore(release): publish
Build bootstrap container / build (push) Has been cancelled
Release / release (push) Has been cancelled
Release / publish-packages (push) Has been cancelled
Release / trigger-coopenomics-docs (push) Has been cancelled
Release / trigger-mono-docs (push) Has been cancelled
v2026.6.9-alpha-3
2026-06-09 14:10:33 +05:00
Alex Ant f37605b343 migrations 2026-06-09 14:10:09 +05:00
ant f728563bdb Merge pull request '[C28-28] feat(email-relay): HTTP→SMTP релей для коопов с закрытым SMTP' (#115) from feature/C28-28-email-relay into dev
Reviewed-on: #115
Reviewed-by: Алексей Муравьев <chairman.voskhod@gmail.com>
2026-06-09 07:54:56 +00:00
coopops 468c946610 [C28-28][@ant] fix(email-relay): убрать mailpit из compose, env_file как coopback
Typecheck / desktop (pull_request) Successful in 13m51s
Typecheck / controller (pull_request) Has been cancelled
mailpit был только локальным SMTP-перехватчиком для теста — в поставке не нужен.
email-relay сам ходит в реальный SMTP через nodemailer; конфиг (RELAY_TOKEN,
SMTP_*) выносим в components/email-relay/.env по образцу coopback, без отдельного
контейнера и inline-параметров.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 07:51:58 +00:00
coopops 7e2b26a02e [C28-28][@ant] feat(email-relay): HTTP→SMTP релей для коопов с закрытым SMTP
Typecheck / desktop (pull_request) Has been cancelled
Typecheck / controller (pull_request) Has been cancelled
Хостинги коопов режут исходящий SMTP → письма controller'а уходят в timeout
(раньше хабом был Novu, его убрали). Новый компонент @coopenomics/email-relay
принимает письма по HTTPS с Bearer-токеном и форвардит по SMTP. Ставится на
сервер с открытыми портами (плейбук в playbooks/email-relay).

- components/email-relay: express + nodemailer, POST /send + GET /health,
  Bearer-токен (constant-time), опц. IP-allowlist, конфиг из ENV
- controller: email-channel.adapter получил relay-режим — если задан
  EMAIL_RELAY_URL, письмо уходит POST'ом на релей; иначе прямой SMTP как
  раньше (opt-in, без регрессии)
- docker-compose: дев-сервисы email-relay + mailpit (SMTP-перехватчик для E2E)
- release.yaml: сборка образа dicoop/email-relay

E2E проверен локально: controller-формат письма → релей → SMTP → mailpit,
тело с <br> и заголовки целы; 401 на отсутствие/неверный токен, 400 на пустое тело.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 07:42:15 +00:00
coopops a76f875725 [C28-27][@ant] fix(desktop): in-app уведомления видны на тёмной теме
Build bootstrap container / build (push) Successful in 3m2s
В колоколе уведомлений на тёмной теме элементы сливались с фоном панели:
разделители на --p-line (0.06 white) почти невидимы, а непрочитанные
отличались лишь цветом текста + точкой — всё тонуло в --p-surface. На светлой
контраст тёмного текста на белом спасал.

Канон-токенами (обе темы, светлую не ухудшает): панели — рамка --p-line-1
для контура; разделители между уведомлениями — --p-line-1 (заметнее); у
непрочитанных подложка --p-primary-soft + левый акцент-бар --p-primary,
hover/focus — --p-primary-line.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 07:22:39 +00:00
coopops 1d235e5caf chore(release): publish
Build bootstrap container / build (push) Successful in 3m5s
Release / release (push) Successful in 24m54s
Release / publish-packages (push) Failing after 8m23s
Release / trigger-coopenomics-docs (push) Successful in 2s
Release / trigger-mono-docs (push) Successful in 2s
v2026.6.9-2
2026-06-09 07:18:39 +00:00
coopops 98b9c03977 chore(release): publish
Build bootstrap container / build (push) Successful in 3m5s
Release / release (push) Successful in 26m40s
Release / publish-packages (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
v2026.6.9-alpha-1
2026-06-09 07:09:56 +00:00
ant c05daad8fd Merge pull request 'feat(pwa): надёжное оповещение об обновлении через version-watch' (#114) from feat/pwa-version-watch into dev
Reviewed-on: #114
2026-06-09 07:06:53 +00:00
ant c3ff628dac Merge pull request 'feat(desktop): статусы пайщиков бейджами + удаление непринятых аккаунтов из реестра' (#112) from fix/participants-registry-status-badges into dev
Build bootstrap container / build (push) Successful in 3m7s
Reviewed-on: #112
Reviewed-by: Алексей Муравьев <chairman.voskhod@gmail.com>
2026-06-09 06:52:52 +00:00
coopops 3ba3a867ad feat(pwa): надёжное оповещение об обновлении через version-watch
Typecheck / desktop (pull_request) Successful in 15m5s
Typecheck / controller (pull_request) Successful in 13m12s
Заменяет ненадёжный триггер от lifecycle service worker'а (не срабатывал
на iOS standalone PWA, при первой установке и когда бинарь SW не менялся)
на сравнение версий: запечённая в бандл package-версия (process.env.APP_VERSION)
сверяется с self-report SSR-ноды (/version). При расхождении — существующий тост.

- quasar.config: APP_VERSION из package.json в build.env; middleware 'version'
- src-ssr/middlewares/version.ts: self-report /version (JSON, no-store)
- entities/AppVersion: стор useUpdateWatch (реестр компонентов, сейчас shell),
  опрос /version раз в 5 мин + при возврате на вкладку; SPA-safe (нет ноды -> no-op)
- init-app: старт version-watch рядом с systemMonitoring
- register-service-worker: убран SW-триггер; applyUpdate устойчив (waiting -> SKIP_WAITING, иначе reload)
- LeftDrawerMenu: версия приложения в футере рейла

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 06:46:04 +00:00
coopops 15813d91ef [@ant] fix(desktop): правка текста предупреждения при удалении registered-аккаунта
Typecheck / desktop (pull_request) Successful in 15m1s
Typecheck / controller (pull_request) Successful in 13m41s
«исчезнет» → «исчезает»; убрано предложение про отзыв заявки на повестке —
кнопка доступна только когда аккаунт уже в цепи (after оплаты), решение совета
тут неприменимо.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 06:44:31 +00:00
coopops 955142cf84 [@ant] feat: удаление любого непринятого аккаунта из реестра (гард только participant_account)
Typecheck / controller (pull_request) Has been cancelled
Typecheck / desktop (pull_request) Has been cancelled
Прежний allow-list статусов исключал Registered — но именно туда попадают
отклонённые советом и оплаченные брошенные регистрации (отказ/возврат
оставляют статус registered; failed/refunded users.status никем не
выставляются). То есть чистка не работала для своей же цели «убрать
незавершённые/отклонённые регистрации (тестеры)».

- backend deleteAccount: убран allow-list по статусу, остаётся единственный
  гард — НЕ принят в кооператив (нет participant_account).
- frontend isDeletable: !participant_account. Кнопка удаления теперь и у
  Registered (оплачен/на рассмотрении совета/отклонён/возврат).
- confirm-диалог: для blockchain-registered (Registered) предупреждение, что
  on-chain аккаунт неудаляем (имя в цепи занято навсегда) + про отзыв заявки
  на повестке, если ещё на рассмотрении совета.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 06:32:10 +00:00
coopops 7efbf90c9b [C28-27][@ant] fix(desktop): таблицы переносят содержимое, не скроллят по горизонтали
На мобиле (и в узком окне десктопа) canon-таблицы выходили за ширину: левая
колонка обрезалась, появлялся внутренний горизонтальный скролл — из-за
фиксированной min-width (780–1000px), которую виджеты ставят локально, а
скелетон inline-стилем.

Централизовал в каноне components.css: `.table { min-width: 0 !important }`
снимает форс-ширину на всех экранах (!important — иначе scoped/inline
перебивают канон), таблица всегда влезает (width:100%) и переносит содержимое
на следующую строку вместо скролла. На узких экранах (≤599px) дополнительно
table-layout:auto + перенос в ячейках + плотнее паддинги, чтобы многоколоночная
таблица читалась переносом, а не клиппингом.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 06:29:07 +00:00
coopops 0e9542fff4 [@ant] feat(desktop): статусы пайщиков бейджами в реестре + enrich registration_payment
Typecheck / desktop (pull_request) Successful in 13m49s
Typecheck / controller (pull_request) Has been cancelled
- ParticipantsTable/ParticipantCard: галочка «Активен» → BaseBadge с
  человекочитаемым статусом; колонка «Активен» → «Статус».
- entities/Account/lib/accountStatus.ts: getAccountStatusBadge — сводит
  participant_account (accepted|blocked) + provider_account.status +
  отказ совета (Registered + возврат взноса) → «Отклонён советом».
- controller getAccounts: enrich registration_payment через this.getAccount,
  иначе на списке реестра отказ совета неотличим от «ожидает совет».

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 06:14:46 +00:00
ant 8ffe4bea94 Merge pull request 'feat: Центр уведомлений DC v3 (замена Novu) [C28-22…27] — код-комплит, 6/6 эпиков' (#60) from feat/notification-center-dc-v3 into dev
Reviewed-on: #60
Reviewed-by: Алексей Муравьев <chairman.voskhod@gmail.com>
2026-06-08 08:37:29 +00:00
coopops 70bd1323c7 chore(release): publish
Build bootstrap container / build (push) Successful in 3m8s
Release / release (push) Successful in 25m6s
Release / publish-packages (push) Failing after 8m25s
Release / trigger-coopenomics-docs (push) Successful in 2s
Release / trigger-mono-docs (push) Successful in 1s
v2026.6.8-6
2026-06-08 07:03:58 +00:00
coopops 765af3cbef chore(release): publish
Build bootstrap container / build (push) Successful in 2m57s
Release / release (push) Successful in 25m7s
Release / publish-packages (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
v2026.6.8-alpha-5
2026-06-08 07:03:41 +00:00
ant 9cdee035b9 Merge pull request 'fix(controller): приложения-оферты ЦПП к заявлению на повестке (wallet::signagree)' (#108) from fix/agenda-program-offer-links into dev
Reviewed-on: #108
2026-06-08 07:03:13 +00:00
ant 9553697f2b Merge pull request 'fix(desktop): чистить технические детали ассертов цепи в тостах ошибок' (#110) from fix/sanitize-blockchain-error-toast into dev
Reviewed-on: #110
2026-06-08 07:02:47 +00:00
ant 124782a8d9 Merge pull request 'fix(controller): не фиксировать возврат паевого взноса в БД при ошибке блокчейна' (#109) from fix/wallet-withdraw-no-phantom-payment into dev
Reviewed-on: #109
2026-06-08 07:02:39 +00:00
coopops f10b49ac8f [@ant] fix(desktop): чистить технические детали ассертов цепи в тостах ошибок
Typecheck / desktop (pull_request) Successful in 13m28s
Typecheck / controller (pull_request) Successful in 12m29s
Пользователю в тост летел сырой ассерт контракта, напр.
`walletop TRANSFER: недостаточно средств на кошельке w.wal.share`.
Ему не нужны ни scope-префикс операции, ни служебное имя кошелька — он
нажал конкретную кнопку и так понимает, о каком кошельке речь.

Добавлен универсальный санитайзер sanitizeBlockchainError, встроенный в
единую точку показа ошибок FailAlert:
- снимает ведущий технический scope-префикс (`walletop TRANSFER:`,
  `ledger2::apply:`, `o.mkt.supply:`) — распознаёт идентификатор с
  `.`/`::` либо слово+ALLCAPS-опкод, кириллицу не трогает;
- убирает служебные имена ledger2-кошельков (`w.wal.share` и т.п.);
- нормализует пробелы и ставит заглавную первую букву.

Результат для примера выше — «Недостаточно средств на кошельке».
Обычные (нетехнические) сообщения проходят без изменений.

Полный технический текст остаётся разработчикам: FailAlert дублирует
сырой message в console.error, бэкенд пишет его в логи контроллера.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 06:42:22 +00:00
coopops 75548036f4 chore(release): publish
Release / release (push) Successful in 24m41s
Build bootstrap container / build (push) Successful in 38s
Release / publish-packages (push) Failing after 8m22s
Release / trigger-coopenomics-docs (push) Successful in 2s
Release / trigger-mono-docs (push) Successful in 1s
v2026.6.8-4
2026-06-08 06:27:19 +00:00
coopops ec0427c778 chore(release): publish
Build bootstrap container / build (push) Successful in 3m8s
Release / release (push) Failing after 14m44s
Release / publish-packages (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
v2026.6.8-alpha-3
2026-06-08 06:27:02 +00:00
coopops 29417dd425 [@ant] fix(controller): не фиксировать возврат паевого взноса в БД при ошибке блокчейна
Typecheck / desktop (pull_request) Successful in 13m22s
Typecheck / controller (pull_request) Successful in 15m49s
Баг: при «Получить возврат» с суммой больше L3-баланса платёж писался в
gateway-БД (AWAITING_AUTHORIZATION) ДО on-chain транзакции. Контракт wallet
отклонял заявку (недостаточно L3-средств), а в разделе «Платежи» оставался
висеть фантомный исходящий платёж со статусом FAILED.

Фикс — порядок операций в WalletInteractor.createWithdraw:
1. prepareWithdraw — все валидации (символ, дубликат hash, платёжный метод)
   и сборка записи, БЕЗ записи в БД;
2. on-chain wallet::createwthd — при недостатке средств падает здесь,
   ни одной записи о платеже не создаётся;
3. persistWithdraw — фиксация платежа в БД только после успешной заявки.

GatewayInteractor.createWithdraw разбит на prepareWithdraw/persistWithdraw
(старый combined-метод сохранён как обёртка). Порт и оба адаптера обновлены.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 06:00:02 +00:00