main
3225 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
81df662cfa |
chore(release): publish
|
||
|
|
845c13605d |
fix(reports): разрешить 10-значный рег.номер СФР наравне с XXX-XXX-XXXXXX
XSD-схема ЕФС-1 (ТипРегНомерОбщ) допускает регистрационный номер страхователя в двух форматах: действующий XXX-XXX-XXXXXX (12 цифр, 3-3-6) или прежний — 10 цифр без разделителей. Валидация на бэке и фронте (форма реквизитов кооператива + редактор нулевого отчёта ЕФС-1) принимала только 12-значный формат с тире, из-за чего кооперативы со старым 10-значным номером ФСС не могли его сохранить. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
76b4988da8 | migrate | ||
|
|
3db80a30e9 |
chore(release): publish
Release / release (push) Failing after 2m16s
Release / publish-packages (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
Build bootstrap container / build (push) Successful in 49s
|
||
|
|
1b457b8f87 |
fix(controller): stop migration failures being masked as success
Backfill-миграция V2.3.2 падала на testnet TS-ошибкой компиляции
(mongo.db возможно undefined, strictNullChecks), но deploy-скрипт
(blue-green-deploy.sh) рапортовал успех — 2.3.2 не появилась в
таблице migrations, extensions.capital_program_doc_data_hash осталась
пустой, а Semaphore-лог показывал "Database migrations completed
successfully".
Причина ложноположительного результата — не баг деплой-скрипта, а
Sentry: в production Sentry.init() (enabled: config.env==='production')
ставит process.on('unhandledRejection', ...) с дефолтным mode:'warn',
который перехватывает необработанный reject из bootstrap()'а --migrate
ветки и не роняет процесс — в отличие от штатного поведения голого
Node. В dev (Sentry выключен) тот же баг воспроизводимо валит процесс
exit 1; на testnet — exit 0. Подтверждено локальным воспроизведением
обеих версий на идентичном коде.
Фикс на двух уровнях:
1. index.ts: явный try/catch + process.exit(1) вокруг --migrate и
--migrations-only веток. Не полагаемся на ambient unhandled-rejection
поведение (Sentry/Node/версия) — exit code теперь детерминирован
независимо от окружения.
2. V2.3.2: mongo.db действительно типизирован как возможно undefined —
явная runtime-проверка с throw вместо каста.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
ba6d3d1310 |
chore(release): publish
Build bootstrap container / build (push) Successful in 1m10s
Release / publish-packages (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
Release / release (push) Successful in 28m13s
Release / trigger-coopenomics-docs (push) Has been skipped
|
||
|
|
8e01373179 |
Merge pull request 'feat(capital): CPP document templates via PrivateData' (#154) from feature/capital-cpp-private-data-templates into dev
Build bootstrap container / build (push) Successful in 3m30s
Reviewed-on: #154 Reviewed-by: Алексей Муравьев <chairman.voskhod@gmail.com> |
||
|
|
31940461c6 |
fix(desktop): remove electron dependency, fix latent typecheck errors
electron был не нужен вообще — тянулся транзитивно только через неиспользуемую devDependency @vue/devtools (нет ни одного импорта в коде). Убрана из desktop/package.json и из onlyBuiltDependencies корня; lockfile пересобран. Это устраняет флап CI: pnpm install изредка валился на сетевой ошибке при скачивании ~200MB бинарника electron (run #745 и run #732 на этом PR), из-за чего typecheck падал до первой TS-проверки. Так как install перестал падать раньше срока, vue-tsc теперь реально доходит до конца и вскрывает предсуществующие баги: - useCapitalProgramDocParams.ts, CapitalProgramDocumentParametersWidget.vue: импорт `CapitalProgramPrivateData` напрямую из 'cooptypes' никогда не работал — тип лежит в Cooperative.Registry, не на верхнем уровне (остальной код capital-расширения уже импортирует так же). Каст результата Object.fromEntries (индексная сигнатура) в интерфейс с именованными полями TS отклоняет как insufficient overlap; вместо unknown-каста — каст в Record<EditableFieldKey, string> (тот же паттерн, что и в соседней createEmptyForm), который затем обычной структурной проверкой присваивается в CapitalProgramPrivateData, т.к. набор из 11 полей совпадает один в один. - CapitalProgramDocumentParametersWidget.vue: legacy draft.activeTab стал optional при переходе на wizardStepKey и больше не записывается читалкой драфта — добавлен фолбэк на дефолт 994, как и в самой readCapitalProgramDocParamsDraft. - CapitalProgramInlineDocumentPreview.vue: querySelectorAll с составным CSS-селектором типизируется как NodeListOf<Element>; cleanupEditors использовал узел как HTMLTextAreaElement без сужения (соседняя syncInlineEditors уже делает `as HTMLTextAreaElement` для той же ситуации). - ExtensionInstall.vue: prop schema был типизирован как unknown, хотя передаётся напрямую в ZodForm, которому нужен IExtensionConfigSchema — типизирован точно под фактическое использование. - sdk/queries/paymentMethods/getPaymentMethods.ts: `const name` был без export вопреки конвенции всех остальных query-модулей (Queries.X.Y.name используется для чтения ключа GraphQL-ответа). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
37b0227735 |
fix(ci): skip electron binary download in typecheck workflow
electron тянется транзитивно через @vue/devtools-electron (dev-only,
приложение devtools вне браузера) и попадает в onlyBuiltDependencies —
pnpm install качает ~200MB бинарник с github releases, который здесь
никогда не запускается. Изредка скачивание валит install сетевым
таймаутом/TLS-обрывом до того, как дело доходит до vue-tsc/tsc.
Run #745 (PR #154): desktop job упал именно на этом шаге, не на
типах — коммит
|
||
|
|
2cfb37c5d7 |
fix(agenda): resolve program-agreement links via soviet::newresolved, not wallet::signagree
Прошлый фикс менял receiver=coopname на data.coopname прямо в explorer-запросе к wallet::signagree — рабочий, но не объясняющий, почему стандартный receiver-фильтр не подходил именно здесь: wallet::signagree не делает require_recipient(coopname) сам по себе, поэтому explorer индексирует его только под receiver='wallet'. На самом деле уведомление уже существует и не требует правки контракта: Soviet::make_complete_document (lib/core/soviet/soviet.hpp) на КАЖДЫЙ вызов — из soviet::sndagreement И из wallet::signagree одинаково — шлёт inline soviet::newresolved/newsubmitted, а require_recipient(coopname/username) зашит централизованно внутри самих newresolved.cpp/newsubmitted.cpp (soviet/src/doc/*.cpp). Проверено на живом хэше оферты Благорост: newresolved уже приходит с receiver=voskhod, receiver=veszmgpjteqs, receiver=soviet — без единой правки на контрактах. Правильный fallback для findLinkedAgreementDocument — искать soviet::newresolved (с обычным receiver=coopname, как везде), а не действие wallet::signagree напрямую (у которого никакого receiver-уведомления и не предполагалось). Расширять notification-поверхность wallet::signagree не нужно — единственное место для этого уже newresolved.cpp/newsubmitted.cpp. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
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). |
||
|
|
024d46ff64 | fix update | ||
|
|
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. |
||
|
|
ed9b0879d5 |
chore(release): publish
Build bootstrap container / build (push) Successful in 2m42s
Release / release (push) Successful in 22m23s
Release / publish-packages (push) Successful in 14m53s
Release / trigger-coopenomics-docs (push) Successful in 2s
Release / trigger-mono-docs (push) Successful in 2s
|
||
|
|
c94043e77f |
fix(docker): не скачивать бинарники electron/puppeteer в mono-base
Их postinstall тянет тяжёлые сетевые загрузки (Electron zip, Chromium), не нужные ни для build (unbuild/tsc/vite), ни для runtime — периодически валил release job TLS-таймаутом, из-за чего publish-packages (needs: release) не запускался вообще. |
||
|
|
c1a8f3e637 |
fix(boot/Dockerfile): изолировать pnpm install от electron/puppeteer
Build bootstrap container / build (push) Successful in 2m37s
--filter не ограничивает lifecycle-скрипты общего lockfile store — тянулись и падали по сети чужие тяжёлые постинсталлы (electron/puppeteer из desktop/notifications), boot их не использует. --ignore-scripts + точечный pnpm rebuild --filter решают. |
||
|
|
15fdf35dd3 |
chore(release): publish
Release / trigger-coopenomics-docs (push) Has been skipped
Release / trigger-mono-docs (push) Has been skipped
Build bootstrap container / build (push) Failing after 2m10s
Release / release (push) Failing after 15m13s
Release / publish-packages (push) Has been skipped
|
||
|
|
79b89695d1 | chore(release): publish | ||
|
|
7b27d0805c |
chore(release): publish
Release / release (push) Successful in 43m2s
Release / publish-packages (push) Has been cancelled
Release / trigger-coopenomics-docs (push) Has been cancelled
Release / trigger-mono-docs (push) Has been cancelled
Build bootstrap container / build (push) Successful in 46s
|
||
|
|
e089dbd3fb |
ci(release): чинить publish-packages — генерировать controller/schema.gql перед publish
С 24 июня (минимум) publish-packages падает на каждом релизе main: @coopenomics/sdk's prepublishOnly (pnpm run docs → generate-index-comments.ts) читает components/controller/schema.gql, которого нет в чекауте и никто не генерирует — ENOENT. lerna publish атомарный, поэтому НИ ОДИН пакет не публикуется. Итог: main давно на v2026.7.9, а npm видел последний раз 2026.5.30-3 — полтора месяца фиксов (включая убранный kpp из BankAccountDetailsInput, PR #81) не долетали до потребителей SDK. Фикс: добавлен шаг generate-schema (изолированный, GraphQLSchemaBuilderModule, без БД) ПОСЛЕ lerna run build — порядок важен, иначе ts-node падает на устаревших dist соседних workspace-пакетов (проверено локально: cooptypes → factory → inter → notifications, каждый был stale и валил компиляцию controller'а по цепочке). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
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> |
||
|
|
5de7e7c65b | update | ||
|
|
bfbcd2d57f |
fix(desktop): починить «Продолжить» в оверлее выбора КУ
Кнопка снова submit формы из footer, BranchSelector синхронизирует selectedBranch, ошибки генерации документа показываются пользователю. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
ff5df68bce |
chore(release): publish
Release / publish-packages (push) Failing after 21m11s
Release / release (push) Successful in 1h35m7s
Release / trigger-coopenomics-docs (push) Successful in 3s
Release / trigger-mono-docs (push) Successful in 3s
Build bootstrap container / build (push) Successful in 10m29s
|
||
|
|
a948f07a1b |
fix(desktop): закрепить кнопки оверлея выбора КУ на мобильных
Кнопки «Продолжить» и «подписать» вынесены в footer BaseDialog, чтобы они не уезжали за пределы экрана при прокрутке контента. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
85bd044cd6 |
fix(desktop): перезагрузка списка КУ при показе оверлея выбора
Оверлей выбора кооперативного участка теперь подгружает список при переходе в мажоритарный режим, показывает лоадер и блокирует «Продолжить» без выбора. 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 с акцентом на ключевые шаги выхода. Исправлены комментарии и типы для лучшего понимания кода. |