1c605dd2a511364daac279223f1dc90f63d36d9b
3202 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
1c605dd2a5 |
fix(agenda): resolve wallet::signagree linked documents by data.coopname, not receiver
findLinkedAgreementDocument искал wallet::signagree по фильтру receiver=coopname, но wallet::signagree не делает require_recipient(coopname) (в отличие от Soviet::make_complete_document) — explorer индексирует это действие только с receiver='wallet'. Фильтр receiver=coopname всегда давал 0 строк, поэтому buildLinkedAggregate молча возвращал null, а программные оферты (capital: Благорост/Генератор, program_id>0, подписываются через wallet::signagree, не soviet::sndagreement) пропадали из links повестки совета — платформенные соглашения (wallet/signature/privacy/user, идут через sndagreement) отображались, а оферта ЦПП — нет, хотя её hash был на месте в meta.links и сам документ был в реестре. Воспроизведено и проверено на живом кандидате voskhod: 5 хэшей в meta.links, но до фикса только 4 резолвились в документ-агрегаты. Скоуп по кооперативу берём из payload действия (data.coopname), а не из индекса receiver. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
b1b1775277 |
fix(contracts): migrate voskhod programs.program_type back to 'capital'
Автоматическая CI/CD-миграция (soviet::migrate) раньше переименовывала programs.program_type[id=4] voskhod в 'blagorost', но coagreements.type для той же программы никогда не переименовывался и остаётся 'capital' — отсюда расхождение двух таблиц на одном и том же боевом кооперативе, которое видно любым прямым запросом к цепочке и вносит путаницу. 'capital' — каноничное значение по всей цепочке решений в этой сессии: это то, что реально в coagreements.type, то, на что рассчитывает _capital_program в lib/consts.hpp, и то, что теперь везде в controller/boot. Новый блок в migrate() приводит programs.program_type к нему же — идемпотентно, сработает автоматически на следующем деплое soviet, без ручных действий на проде. soviet и capital пересобраны локально — компилируются чисто. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
5f4281ac01 |
revert(contracts): _capital_program back to 'capital', drop stray blagorost migration
Единственный источник правды — продовая цепочка voskhod: coagreements.type
для program_id=4 буквально 'capital' (проверено прямым запросом к
185.70.105.87), это боевое неизменяемое значение. Contract-константа
_capital_program в lib/consts.hpp была переименована в 'blagorost' коммитом
|
||
|
|
d35e88d951 |
revert(capital): keep BLAGOROST_AGREEMENT_TYPE='capital', fix boot seed drift instead
Прямой запрос к продовой цепочке voskhod (185.70.105.87) показал реальный
on-chain тип программы Благорост — 'capital' (program_id=4), не 'blagorost'.
Прод годами работает с этим значением, ошибок в логах нет. Предыдущий коммит
(
|
||
|
|
5360daa471 |
fix(capital): correct BLAGOROST_AGREEMENT_TYPE to match on-chain 'blagorost'
Константа хранила 'capital', но boot/src/init/cooperative.ts createPrograms() сеет программу с type='blagorost' на генезисе (soviet::createprog), на всех кооперативах. account.adapter.ts искал coagreement по 'capital' — не находил, programId откатывался на 0, и вместо wallet::signagree уходил soviet::sndagreement, который на цепи падает: get_coagreement_or_fail не находит type='capital' в coagreements — «Соглашение указанного типа не найдено». Ловилось при приёме платежа регистрации (registerBlockchainAccount из gateway.interactor при PaymentType.REGISTRATION), падало для КАЖДОГО участника, зарегистрированного по офферте Благорост. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
652f7c722e |
fix(cooptypes): add missing space after colon before eoap_definition placeholder
п.1.1 «а именно:{{ doc_data.eoap_definition }}» без пробела — во всех шести
шаблонах ЦПП (994/995/996/998/999/1000), фраза идентична во всех программах.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
||
|
|
a2b132b457 |
fix(registration): resolve doc_data_hash for extension offers via registry spec
Шаблоны оферт ЦПП (#996/#1000) с
|
||
|
|
a6cc71d6a3 |
fix(extension): unwrap TypeORM [rows, count] tuple in patchConfig UPDATE...RETURNING
TypeORM возвращает для UPDATE/DELETE кортеж [rows, affectedCount] (в отличие от INSERT с голым rows-массивом) — без распаковки row оказывался кортежем и все поля config читались как undefined, роняя buildState онбординга. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
b67581ce80 |
fix(extension): atomic jsonb config patch to stop onboarding flag lost-updates
extensions.config is a single jsonb blob shared by every flag/hash the L1 onboarding wizards (capital, chairman) write to. Every write site did the classic read-modify-write: findByName() the whole row, spread+mutate one key in app memory, then update() the whole config back. Two DecisionTrackedEvent handlers firing concurrently (two council decisions tracked near-simultaneously) each read the same stale snapshot and each write their own flag back — whichever write lands last wins and silently reverts the other one's flag to its old value. Symptom hit live: onboarding_generator_program_template_done reverted to false (with its hash still present, proving the decision really was tracked) after onboarding_generation_contract_template_done raced it to true. Added ExtensionDomainRepository.patchConfig(name, patch), implemented as a single `UPDATE extensions SET config = config || patch::jsonb ... RETURNING *` — no app-side read before the write, Postgres serializes concurrent UPDATEs on the row so two different-key patches can no longer clobber each other. Replaced every config read-modify-write in capital's and chairman's onboarding services (the events handler's flag write, loadPlugin's init/expire timestamps, the hash writes in completeStep/completeGeneralMeet, saveProgramDocDataHash) with this atomic patch. update() is untouched for other callers. Live data recovered manually: onboarding_generator_program_template_done was patched back to true for voskhod/capital (hash was already present, confirming the decision had in fact been tracked before the race reverted the flag). |
||
|
|
9030d28c6b |
fix(cooptypes): remove п.8.1 «Под Сайтом» from BlagorostProgramTemplate, renumber
По решению: универсал-документ (ЦПП БЛАГОРОСТ_финал_универсал.docx.rtf, ~/blago/production/shared) — новый правильный эталон. В нём раздел 8 «Прочие условия» содержит только 2 пункта (8.1 «Общество и Участник...», 8.2 «Изменения и дополнения...»), без пункта про «Под Сайтом... прочие программные продукты» — ни в Положении, ни в Оферте БЛАГОРОСТ (universal) такого пункта нет. Убрал п.8.1 из rawContext, сдвинул 8.2→8.1, 8.3→8.2. Ссылка "(п. 7.1.)" в новом 8.2 не требует правки — форс-мажор остаётся разделом 7 независимо от сдвига в разделе 8. Теперь 998 совпадает с универсалом точь-в-точь (сверено скриптом по номерам пунктов и по тексту под каждым номером). |
||
|
|
6e0e68c1e7 |
fix(cooptypes): correct cross-reference in GeneratorProgramTemplate п.12.3
Systematic clause-numbering comparison against Положение_ЦПП_ГЕНЕРАТОР_универсал.docx.rtf (~/blago/production/shared) found п.12.3 pointing at "(п. 12.1.)" — that's the "Под Сайтом" definition clause, unrelated. The universal document (and the sentence's own subject — "изменения условий ЦПП... возможность внесения которых прямо предусмотрена настоящим Положением") both point to п.11.1, the форс-мажор/legislative-changes clause that actually grants this right. Fixed the reference in rawContext only; left the orphaned translations copy (994's dead legacy i18n block, unused by rendering) untouched. |
||
|
|
c079785019 |
fix(cooptypes): remove orphaned п.5.2 in BlagorostProgramTemplate, renumber section 5
Сверил с ЦПП БЛАГОРОСТ_финал_универсал.docx.rtf (~/blago/production/shared) — в
актуальной версии Положения самостоятельный п.5.2 «Основной экономический эффект
функционирования Платформы достигается за счет членских взносов Участников при
расширении круга пользователей Платформы» отсутствует: его смысл слит в п.5.1
("...экономический эффект от функционирования которого заключается в следующем: ...").
Оферта (999/1000.Blagorost*, уже сверено) была такой всегда — 4.1 (источник) сразу
за которым 4.2 (дополнительный источник), без промежуточного пункта.
Убрал п.5.2 из rawContext, сдвинул 5.3–5.10 на 5.2–5.9, поправил внутреннюю ссылку
"указанными в п. 5.9." → "указанными в п. 5.8." в новом 5.9 (бывший 5.10). Дублирующий
текст в дохлом export const translations (не используется рендером, см. context) не трогал.
|
||
|
|
bbc6453b24 |
fix(capital): await onSaved before advancing wizard past БЛАГОРОСТ step
goNext() checked getFirstAvailableCouncilGroup() (which reads isDocParamsReady, derived from onboardingState.capital_program_doc_data_hash) synchronously right after saveParams() resolved. But saveParams() fired options.onSaved(hash) without awaiting it, and the card's onSaved handler did `void handleDocParamsSaved()` — an async refetch of onboarding state — so isDocParamsReady was still stale at the moment goNext() decided which council group to jump to. getFirstAvailableCouncilGroup() returned null, setWizardStepKey never ran, and the wizard just re-rendered the same БЛАГОРОСТ step, looking like the just-saved params were never registered. Fix: onSaved is now awaited inside saveParams(), and the card passes the handleDocParamsSaved() promise through instead of firing it and forgetting it. |
||
|
|
b5eb0ea51f |
fix(capital): address PR #154 review — proper interface instead of as-cast, IInput['data'] canon
document-domain.service.ts: replaced the inline `as Cooperative.Document.IGenerate & {...}`
hack with a dedicated GenerateDocumentWithPrivateDataDomainInterface for the doc_data
pre-generation branch (Cooperative.Document.IGenerate already carries a `[key: string]: any`
index signature, so the narrow interface is assignable without any cast at all).
Onboarding api/index.ts: saveProgramDocDataHash now takes
Mutations.Capital.SaveCapitalProgramDocDataHash.IInput['data'] and forwards it as-is to
variables.data, matching the SDK IInput['data'] canon used by completeStep right above it
instead of taking a bare string and rebuilding the payload inline. Updated both call sites.
|
||
|
|
a072364d00 |
fix(capital): auto-generate CPP doc preview on step entry, restore section header formatting
Preview for ГЕНЕРАТОР/БЛАГОРОСТ params no longer requires a manual button click on first visit — onMounted now calls ensurePreview for the active wizard step. Also fixes wizardStepOrder typing (was narrower than the runtime string values it holds). Restores <h3> centered section-title markup in registry templates 994/995/996/998/999/1000 that was lost during the "parameterize CPP templates via private data" refactor, when translations+context i18n structure was flattened into raw HTML. |
||
|
|
5230fab7c6 |
fix(capital): add blagorost_goal_reason field, stop reusing blagorost_goal_expansion in clause 2.1.1
Clause 2.1.1 of БЛАГОРОСТ Положение/Оферта needs different text than the intro paragraph, but both were wired to the same doc_data.blagorost_goal_expansion variable (confirmed against the original "универсал" RTF sources), so 2.1.1 rendered with the wrong sentence in all three registries (998, 999, 1000). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
345aadbd6a | update | ||
|
|
33f1ac1a15 |
fix(capital): restore CPP templates from RTF sources and improve parameter constructor
Align cooptypes/factory templates 994–1000 with original document wording, correct doc_data substitution points, update voskhod backfill values, and add onboarding UI with descriptive field labels and doc data hash saving. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
45feef2676 |
fix(capital): correct CPP template mapping and onboarding widget canon
Fix swapped doc_data placeholders in generator/blagorost templates, align the install widget with Base* components, and use one shared PrivateData hash in factory tests. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
02ce9400a2 |
fix(capital): remove unsafe any from CPP onboarding changes
Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
bfa2830650 |
feat(capital): collect CPP document parameters in onboarding
Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
c7824545cf | feat(capital): parameterize CPP templates via private data | ||
|
|
b9107e9ee9 |
chore(release): publish
Build bootstrap container / build (push) Successful in 1m45s
Release / release (push) Failing after 55m53s
Release / publish-packages (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
|
||
|
|
4d151befe0 |
fix(install): блокировать «Продолжить» до минимума совета, удаление без ограничений.
На prod требуется 3 человека (на dev — 1): кнопка и подсказка, состав редактируется свободно до перехода на следующий шаг. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
eb16d85abc |
fix(install): разблокировать мастер при прерванной установке и валидировать состав совета по окружению.
Не показываем заглушку техобслуживания на /install, разрешаем повтор install из maintenance без vars, проверяем минимум членов совета до записи в цепь (3 на prod, 1 на dev). Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
ee5f7e1850 |
Merge pull request 'feat: выход из кооператива (выход пайщика, возврат паевого взноса)' (#137) from feat/membership-exit into dev
Reviewed-on: #137 |
||
|
|
10bacaad13 |
refactor(membership-exit): обновление интерфейса и логики выхода из кооператива
Изменены компоненты, связанные с выходом из кооператива. В меню заменены иконки и пути для поддержки и выхода. Обновлены метаданные и названия для кнопок и страниц, чтобы улучшить пользовательский интерфейс. В ExitButton добавлены параметры для настройки иконки и метки. Упрощена структура MembershipExitPage с акцентом на ключевые шаги выхода. Исправлены комментарии и типы для лучшего понимания кода. |
||
|
|
1f68169b94 |
feat(exit): возврат при выходе — сет из 3 паевых кошельков (minshr+share+blago)
confirmexit теперь обходит сет LEDGER2_EXIT_REFUND_WALLETS (w.reg.minshr + w.wal.share + w.cap.blago): собирает доступные L3-балансы каждого (>0), консолидирует на главный паевой (w.reg.minshr→o.reg.mvmin, w.cap.blago→ o.cap.wthcap) и ставит полную сумму на возврат единым платежом. Раньше хардкодил только minshr+share — паевой в Благоросте оставался висеть. Сет задан один раз в wallets.hpp (источник истины), генерируется gen:from-cpp в cooptypes (LEDGER2_EXIT_REFUND_WALLETS / EXIT_REFUND_WALLET_NAMES) и обходится backend-preview (getReturnPreview) — расчёт на фронте всегда совпадает с тем, что реально вернёт контракт. Подпись «планируемая сумма / итог фиксирует Совет» убрана из ExitButton и ExitOverlay (сумма теперь авторитетна). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
95891b2319 |
fix(desktop): развёл иконки меню «Подключение» и «Реквизиты»
Обе были 'fas fa-link' (одинаковые + FontAwesome запрещён каноном). На Material: - Подключение → 'link' - Реквизиты → 'account_balance' (банковские реквизиты) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
f41f1444b1 |
fix(desktop): реестр пайщиков — статус «Вышел из кооператива», дата вступления, без удаления
- статус: вышедший пайщик (participant_account стёрт delpartcpnt + user_account blocked) больше не показывается «Активный пайщик» — добавлен терминал «Вышел из кооператива» по user_account.status - дата вступления: фолбэк participant_account.created_at → user_account.registered_at (у вышедших пайщик-запись стёрта, дата больше не «отсутствует») - убрана кнопка удаления пайщика (таблица + карточка + диалог + машинерия): пайщика из реестра не удаляют Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
da450ec605 |
fix(desktop): «платёжка» → «чек об оплате» в UI реестра платежей
Подсказки/лейблы переименованы под каноничную терминологию (чек об оплате — подтверждающий документ, не «платёжка»): - тултипы «Чек об оплате приложен / не приложен» (desktop + mobile) - fileKindLabel PAYMENT_PROOF → «Чек об оплате» - расчётный ПЛАТЁЖ возврата/доплаты (вместо «платёжка») в подсказках/алертах ReportExpenseAdvance + согласование рода - комментарии приведены к новой терминологии (чек / расчётный платёж) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
7fdfd8385a |
feat(gateway): ядровый «чек об оплате» исходящих платежей по payment_hash
Культура денег: входящие — подтверждением, исходящие — чеком. Единый механизм на уровне ядра (gateway), привязка по payment_hash — один на все исходящие (возврат паевого/withdrawal/registration-refund/аванс расхода), переиспользуется расширениями. Контроль мягкий: статус не трогаем, но зеркалим proof_count → реестр рисует «чек приложен / не приложен». Backend (core gateway): - таблица payment_files + бакет gateway:files (@UseBucket), PaymentFilesService (upload/read-url/list/delete + зеркалирование proof_count в платёж) - enum PaymentFileKind (PAYMENT_PROOF), DTO, резолвер uploadPaymentProof / paymentProofs / paymentFile; провайдеры в typeorm.module + gateway.module SDK: selectors/mutations/queries gateway + zeus regen Desktop: - features/Payment/AttachPaymentProof — панель чека по payment-hash - реестр: панель + индикатор «чек приложен» для ЛЮБОГО исходящего (PAID/COMPLETED) - конвергенция expense: чек ушёл в ядро, AttachExpenseProof оставляет только закрывающие документы (DIRECT) Терминология: «чек об оплате» (не «платёжка»/«первичка»). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
39433753c2 |
fix(membership-exit): терминальный экран после выхода + гард повторного выхода
После completexit строка registrator::exits стирается (терминал=erase) → getMembershipExit возвращал null → оверлей пропадал, кабинет разблокировался, пайщик видел стол и мог подать выход повторно (гарда не было). - enum MembershipExitStatus += COMPLETED - getMembershipExit: терминальная фаза по blocked-аккаунту + персистентному MEMBERSHIP_EXIT-платежу (сумма возврата + статус 'Оплачено') - createMembershipExit: гард — заблокированный аккаунт не может выйти повторно (контракт уже блокирует через get_participant_or_fail; отсекаем раньше) - ExitOverlay: терминальная фаза 'Вы вышли из кооператива' (сумма + 'Оплачено' + ожидайте поступления), она же UX-гард — перекрывает кабинет - SDK Zeus regen под новый enum Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
560321853c | Merge remote-tracking branch 'origin/dev' into feat/membership-exit | ||
|
|
f42b703098 |
Merge pull request 'ci(release): независимый деплой окружений (testnet/main разным темпом)' (#150) from ci/independent-env-deploy into dev
Reviewed-on: #150 |
||
|
|
d7e08785eb |
Merge pull request 'fix(capital): регистрация долей Благороста при создании проекта по событию (не ждать крон)' (#151) from fix/capital-share-onproject-event into dev
Reviewed-on: #151 Reviewed-by: Алексей Муравьев <chairman.voskhod@gmail.com> |
||
|
|
7efd19f1bd |
chore(release): publish
Build bootstrap container / build (push) Has been cancelled
Release / publish-packages (push) Failing after 8m37s
Release / release (push) Successful in 27m21s
Release / trigger-coopenomics-docs (push) Successful in 1s
Release / trigger-mono-docs (push) Successful in 2s
|
||
|
|
cce099748a |
fix(capital/state): program_expense_* в хвост через binary_extension — фикс нечитаемой таблицы state на проде
Инцидент 2026-06-16: коммит
|
||
|
|
3d04f76446 |
fix(capital): заводить доли только в active-проектах, не в pending
По решению пользователя заход долей Благороста — только в активные проекты. В pending больше не заводим: при переходе pending→active придёт новая дельта capital::projects со status=active, на ней листенер и зарегистрирует. - Листенер ProgramShareRegistrationOnProjectDeltaListener: гейт pending|active → только active. - ProgramShareRegistrationService.findActiveProjects (путь крона и wallet-листенера): фильтр pending|active → только active. - Тест: pending теперь НЕ реагирует; active — позитивный кейс. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
532e34c53b |
ci(release): promote по умолчанию шлёт текущий HEAD (не последний тег)
Дефолт promote.sh — текущий HEAD чекаута; второй аргумент по-прежнему задаёт явный ref (ветка/тег/sha). Типичный путь: cut на dev → promote testnet → promote main, все три от того же HEAD. testnet/main остаются независимыми FF-указателями. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
a0e0c9310c |
fix(desktop): confirm-выхода — auth-aware навигация вместо молчаливого бойнса на логин
Ссылка из письма открывается часто без сессии кабинета (другой браузер/инкогнито/ после logout). Подтверждение работает по токену без входа, но wallet защищён — гард молча редиректил на login-redirect, и пайщик не понимал, что произошло. - есть сессия → 'Перейти в кабинет' → wallet (глобальный ExitOverlay сам покажет 'на рассмотрении Совета') - нет сессии → 'Войти в кабинет' → signin + пояснение, что войти нужно для слежения за статусом и суммой возврата Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
0d51973a7b |
fix(capital): регистрировать доли Благороста при создании проекта по событию, без ожидания крона
Доли пайщиков Благороста регистрировались в проект только периодическим scheduler'ом (regshare) и точечным листенером на дельту кошелька. Новый проект баланс не меняет → wallet-листенер молчит, и наполнение нового проекта зависело ТОЛЬКО от крона. Если компонент быстро прогнали pending→…→result до тика крона, пайщики в него не попадали, а откат result→active контракт не допускает — доли в компоненте терялись безвозвратно (voskhod, компонент 011bcd92…, 2026-06-16). - Новый ProgramShareRegistrationOnProjectDeltaListener на delta::capital::projects: при появлении проекта в статусе pending|active сразу регистрирует доли всех активных пайщиков (неблокирующе, fire-and-forget, переиспользуя ядро syncContributor — тот же путь, что и крон). - ProgramShareRegistrationService.syncProgramSharesForProject — обход пайщиков по одному проекту; syncContributor переведён с ProjectDomainEntity[] на projectHashes: string[]. - Крон ОСТАВЛЕН как reconciliation-бэкстоп: он ещё и ДОобновляет уже зарегистрированные доли при дрейфе баланса (контракт upsert_contributor_segment это допускает) и подбирает события, потерянные при downtime контроллера. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
9c2729d243 |
ci(release): независимый деплой окружений — testnet/main как FF-указатели на теги dev
Паровоз dev→testnet→main заменён независимыми указателями: каждое окружение — самостоятельный fast-forward-указатель на выбранный релизный тег dev. Прод и тест катятся разным темпом и на разные версии одновременно, без диверджа и конфликтов (оба — FF-указатели на линейную историю dev). - promote.sh <testnet|main> [ref]: FF выбранного тега (по умолчанию — последний на origin/dev) на ветку окружения; main больше не зависит от testnet; только вперёд. - release.yaml: workflow_dispatch получил inputs environment+ref — откат на старую версию / редеплой без бампа / hotfix в один контур (то, что FF не умеет). Сборка идёт из вычекнутого ref, окружение — из inputs.environment. Авто-триггер по изменению lerna.json сохранён. - RELEASE.md: модель и инварианты переписаны под независимые указатели. Принципы деплоя сохранены: бамп версии один раз на dev, образы по версии, BUILD_MODE по окружению, webhooks per env, npm publish/доки только на main. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
00e15be65e |
fix(desktop): убрал '*/' из SCSS-комментария — ломал sass-парсер
'text-h*/inline' досрочно закрывал блочный комментарий → expected '{'.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
a349cfcf6a |
fix(desktop): диалог выхода — придавил заголовок заявления к канону + soft-панель итога
- заголовок документа из DocumentHtmlReader (3rem) прижат к h2 по канону, :deep + !important как в ReadStatement.vue - 'Сумма к возврату' оформлена soft-панелью (label+hint слева, mono-значение справа) вместо висящего снизу текста Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
07ec6d9a5b |
chore(release): publish
Build bootstrap container / build (push) Failing after 1m27s
Release / release (push) Failing after 16m43s
Release / trigger-mono-docs (push) Has been skipped
Release / publish-packages (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
|
||
|
|
102eeb319e |
fix(desktop): суммы выхода через formatAsset2Digits + одна сумма без разбивки
- Суммы к возврату форматируются канонной formatAsset2Digits ("300.0000 RUB"
→ "300,00 RUB") в диалоге заявления и в оверлее — вместо сырого asset.
- Убрана разбивка "целевой + минимальный" (оба паевые, суммируются): показываем
одну строку "Сумма к возврату".
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
2f1e078fe2 |
fix(desktop): один лоадер в диалоге заявления о выходе
Было две крутилки рядом («Формирование заявления…» + «Расчёт суммы…»). Теперь заявление и сумма грузятся параллельно (Promise.allSettled) под одним центрированным лоадером и показываются вместе. Тот же стиль лоадера — на фазе проверки реквизитов. Сумма некритична: документ подписывается и без предрасчёта. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
554798b74b |
fix(desktop): пункт «Выход из кооператива» в конец меню + надёжный гейт реквизитов
- Пункт меню «Выход из кооператива» перенесён в самый низ (после «Поддержки»), иконка group_remove вместо logout — чтобы не сливаться с кнопкой «Выйти» (выход из кабинета, дверь-logout) внизу панели. - Гейт реквизитов сделан fail-open: блокируем выход ТОЛЬКО при достоверно пустом списке методов; null/непонятный ответ не блокирует. + реактивный фолбэк: если бэкенд отклонил подачу из-за отсутствия реквизитов — диалог переключается на баннер. Авторитетный источник — бэкенд (createMembershipExit). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
0ae8702ade |
Merge pull request 'fix(registration): pending-счёт не показывать как «платёж принят»' (#149) from fix/registration-pending-display into dev
Build bootstrap container / build (push) Has been cancelled
Reviewed-on: #149 Reviewed-by: Алексей Муравьев <chairman.voskhod@gmail.com> |