From c446e32a8a75f76aefbcd24f36725bd36b4042f4 Mon Sep 17 00:00:00 2001 From: Alex Ant Date: Wed, 16 Apr 2025 21:42:37 +0500 Subject: [PATCH] generate changelog releases --- .gitignore | 2 + changelog_prompt.txt | 441 ++++++++++++++++++++++++++++++++++++ issues.txt | 435 +++++++++++++++++++++++++++++++++++ scripts/EXAMPLE.md | 1 + scripts/generate-release.sh | 89 ++++++++ scripts/publish-release.sh | 18 ++ 6 files changed, 986 insertions(+) create mode 100644 changelog_prompt.txt create mode 100644 issues.txt create mode 100644 scripts/EXAMPLE.md create mode 100755 scripts/generate-release.sh create mode 100755 scripts/publish-release.sh diff --git a/.gitignore b/.gitignore index 27e8f4abef8..efebf477be7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ node_modules/ lerna-debug.log components/controller/graph.png blockchain-data/ +scripts/changelog-prompt.txt +scripts/changelog-release.md diff --git a/changelog_prompt.txt b/changelog_prompt.txt new file mode 100644 index 00000000000..71e4673fee2 --- /dev/null +++ b/changelog_prompt.txt @@ -0,0 +1,441 @@ +Вот список закрытых issue с 01.04.2025: + +#232: Поднять бэкенд полного обозревателя блоков + + + +--- +#231: Фикс багов десктопа + +* [x] при регистрации не обновляется состояние после получения решения * [x] не выходит из системы нормально (после выхода и перехода на страницу регистратора какие-то данные там есть). * [x] баг аудентификации на регистрации * [x] перенос на другую строку в платежах * [x] в карточке организации емейл был скрыт для редактирования * [x] добавлено правило проверки даты при добавлении пайщика + +--- +#226: Встроить редактирование пайщиков + +* [x] добавить private_account в бэкенд * [x] ввести проверку на соответствие имен пользователей в запросе на обновление и почт * [x] перевести запросы пайщиков на graphql * [x] встроить функции обновления * [x] устранить ошибки и предупреждения * [ ] проверить регистрацию + +--- +#225: Скорректировать возврат паевого взноса из результата интеллектуальной деятельности + +* [x] Устранить логику взноса-возврата взноса при withdraw, т.к. там результат уже принят через решение по актам. * [x] Убрать логику перебора коммитов при создании объекта возврата - работаем напрямую с contributor и его доступным балансом по договору УХД + +--- +#224: Написать ТЗ по контракту капитализации + + + +--- +#218: Встроить логику фондирования членскими взносами + +* [x] считать личный вес share_balance на основе available + for_convert в момент конвертации * [x] до момента конвертации средства не являются share_balance и не принимают участие в распределении * [x] использовать Все членские взносы стекаются в проект и распределяются рубильником на 2 части: локальную и глобальную. Под локальной частью подразумевается та часть средств, которая должна распределиться среди инвесторов/создателей конкретно этого проекта. Под глобальной частью подразумевается та часть средств, которая должна распределиться среди инвесторов/создателей целевой потребительской программы “капитализация”. * [x] обновление балансов и расчет долей в членских взносах по проектам * [x] возврат средств из проектов и учёт средств при возврате Куда записываем расчетную величину накопленного остатка? В баланс контрибьютора, в его таблицу. Затем мы используем эти средства для создания заявления на возврат с дальнейшим исполнением. Т.е. паевой взнос можно вернуть только из числа накопленных средств членских взносов программы. + +--- +#211: Ввести отображение наименования организации в таблице пайщиков + + + +--- +#209: Создать скрипт-загрузчик, который устанавливает MONO для целей разработки + + + +--- +#204: Создать рабочий прототип модуля экспорта результатов из трекера + + + +--- +#203: Написать смарт-контракт капитализации результатов интеллектуальной деятельности + + + +--- +#202: Внести изменения в README.md для гладкой установки + + + +--- +#199: Onboarding-процесс для задач по маркетплейсу (Илья Смирнов) + +1) Установить и настроить локальный проект для внесения изменений: 2) Изучить документацию разработчика: 3) Протестировать запуск локального инстанса перед внесением изменений по первой задачей (докер, seed-скрипты, тестовые данные для заполнения локальной базы) 4) Выяснить стандартный gitflow при внесении изменений по задаче + +--- +#182: Запроектировать технический бизнес-процесс списания расходов результата проекта + +Расход создается с хэш-идентификатором, который хранит информацию о реквизитах платежа во внешней системе учёта MONO относительно блокчейна. При создании расхода необходимо указать хэш платежа, который должен быть предварительно создан в MONO. Создание платежа в MONO автоматически повлечет за собой его отображение в разделе "платежи", если не предусмотреть обратное. Также в разделе платежи сейчас отображаются только входящие платежи, и исходящие там вообще не встроены ещё.  Учитывая то, что входящие платежи скорее всего желательно тоже перевести на хэш-идентификаторы, то получается, что необходимо переписать модуль приёма платежей, адаптировав его под это изначально.  Пусть так, и у нас есть модуль платежей, который генерирует объекты платежа с суммами с указанием реквизитов. Однако основой для их отображения должна служить блокчейн-база, т.к. именно в ней происходит сейчас утвердение расходов.  А у нас сейчас вообще не так, по-крайней мере для входящих платежей. Все входящие платежи создаются в базе MONO, которая создаёт объект в блокчейне в момент приема платежа и автоматически его отмечает исполненным, что удаляет запись из бч и запускает бизнес-процесс приёма платежа согласно типу.  В контракте шлюза сейчас есть реализация возврата с документами. Наверное она даже как-то работает. Чтобы не переписывать сейчас шлюз на бэкенде, необходимо только добавить ему функционал для работы с исходящими платежами.  В контракте у нас при возврате фигурирует bank_account_id который необходимо заменить на withdraw_hash, где в случае расхода он должен быть равен expense_hash, который должен быть предварительно сформирован при подготовке служебной записки.  Тогда, здесь необходимо: * заменить bank_account_id на withdraw_hash в контракте gateway * пристроить систему генерации исходящих платежей с опорой на их блокчейн-двойник.  * причем создание исходящего платежа должно происходить в транзакционной манере, т.е. мы сперва генерим хэш и делаем некое предсохранение в базе, затем отправляем транзакцию в блокчейн, и только затем сохраняем исходящий платеж в базу. Тогда у каждого платежа в базе будет зеркало в бч.  Если в случае со взносами мы создаем объект взноса в момент приёма платежа, и делаем это в основном из за того, что мы не можем при регистрации пайщика создать платеж в привязке к аккаунту т.к. его еще нет. То в случае с возвратом мы можем создавать исходящие объекты сразу в блокчейне и привязываться к ним. Тут вообще никак иначе нельзя т.к. во многих случаях управление возвратами происходит по условиям смарт-контрактов, а ручками бухгалтер или кто доверенный может вмешаться только при достижении определенных его условий.  Тогда получается, что при создании исходящего платежа необходимо: * принять от пайщика детали платежа (идентификатор реквизитов) * принять от пайщика детали расхода (если расход) * использовать информацию для генерации документа * проверить что детали платежа ок и все в целом ок * сгенерировать хэш платежа * отправить в блокчейн транзакцию и убедиться что всё ок * сохранить в локальной базе детали платежа И именно в таком порядке. В случае облома на этапе транзакции в блокчейне - в локальной базе ничего не должно остаться. Тогда мы сможем на уровне блокчейна управлять статусами готовности платежа и при этом иметь возможность получать закрытые данные по платежу из базы.  В таком случае необходимо, чтобы шлюз не удалял самостоятельно объекты исходящих платежей, а только переводил их в статус, который позволяет доверенному лицу удалить их из базы и блокчейна одновременно из интерфейса.  Тогда всё будет ок. + +--- +#169: Добавить шаблон акта приема-передачи результата интеллектуальной деятельности в кооператив + + + +--- +#168: Добавить шаблон заявления на взнос деньгами с ЦПП Цифровой Кошелек по договору УХД + + + +--- +#167: Добавить шаблон заявления на взнос результатом в фабрику + + + +--- +#152: Отключить избыточные оповещения на исходящих переводах + + + +--- +#150: Баг: обновление карточки банковского счета кооперативного участка + + + +--- +#149: Баг перехода назад на ключ доступа с заявления + +При переходе назад от заявления к ключу доступа переходим не туда. Скорее всего уходим на выбор кооперативных участков, который скрыт. step + +--- +#146: Добавить поле ИНН в реквизиты и кнопку "скопировать реквизиты" + + + +--- +#145: Отобразить иконки прав доступа в листе кнопок меню + + + +--- +#144: Срезать константу COOPNAME из десктопа + + + +--- +#139: Убрать ограничение в 24 часа для первой ссылки приглашения + + + +--- +#138: Сделать кнопку настроек кооператива доступной для членов совета + + + +--- +#136: Рефакторинг техдокументации #1 + +* [x] Как это работает * [x] Архитектура * [x] Язык API * [x] Обзор SDK * [x] Установка * [ ] ~~Подключение~~ * [x] Инициализация * [x] Раздел подключений и автоматизация * [x] Аккаунты * [ ] + +--- +#135: new issue + +test + +--- +#134: Сделать страницу CONNECT доступной для подключенных кооперативов в VOSKHOD + + + +--- +#133: Методы Canvas перевести в класс SDK #test + + + +--- +#132: Добавить описание интерфейсов переменных в макросы main.py + + + +--- +#126: Убрать срок действия первого приглашения? на addParticipant. Чтоб не объяснять о восстановлении ключа каждому 1 + + + +--- +#125: Добавить набор методов для работы с Canvas и собственноручной подписью в SDK + + + +--- +#121: createInitial -> createInitialPayment, createDeposit -> createDepositPayment + + + +--- +#120: Добавить класс Document и метод signDocument в SDK + + + +--- +#118: Убрать из getAccounts.Input поле username за ненадобностью + + + +--- +#117: Устранить мутацию удаления аккаунта deleteAccount + + + +--- +#115: Добавить класс Account для генерации имени и ключей в SDK + + + +--- +#113: Убрать указание роли пользователя из Account.RegisterAccount + + + +--- +#109: Скорректировать IInput интерфейсы во всех мутациях и запросах SDK + +* [x] addParticipant ( data AddParticipantInput! ) Account! * [x] addTrustedAccount ( data AddTrustedAccountInput! ) Branch! * [x] createBankAccount ( data CreateBankAccountInput! ) PaymentMethod! * [x] createBranch ( data CreateBranchInput! ) Branch! * [x] createDeposit ( data CreateDepositPaymentInput! ) Payment! * [x] createInitialPayment ( data CreateInitialPaymentInput! ) Payment! * [x] createProjectOfFreeDecision ( data CreateProjectFreeDecisionInput! ) CreatedProjectFreeDecision! * [x] deleteAccount ( data DeleteAccountInput! ) Boolean! * [x] deleteBranch ( data DeleteBranchInput! ) Boolean! * [x] deletePaymentMethod ( data DeletePaymentMethodInput! ) Boolean! * [x] deleteTrustedAccount ( data DeleteTrustedAccountInput! ) Branch! * [x] editBranch ( data EditBranchInput! ) Branch! * [x] generateFreeDecision ( data FreeDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ProjectFreeDecisionDocument! * [x] generateParticipantApplication ( data ParticipantApplicationGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ParticipantApplicationDocument! * [x] generateParticipantApplicationDecision ( data ParticipantApplicationDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ParticipantApplicationDecisionDocument! * [x] generatePrivacyAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateProjectOfFreeDecision ( data ProjectFreeDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ProjectFreeDecisionDocument! * [x] generateSelectBranchDocument ( data SelectBranchGenerateDocumentInput! , options GenerateDocumentOptionsInput ) SelectBranchDocument! * [x] generateSignatureAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateUserAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateWalletAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] initSystem ( data Init! ) SystemInfo! * [x] installExtension ( data ExtensionInput! ) Extension! * [x] installSystem ( data Install! ) SystemInfo! * [x] login ( data LoginInput! ) RegisteredAccount! * [x] logout ( data LogoutInput! ) Boolean! * [x] publishProjectOfFreeDecision ( data PublishProjectFreeDecisionInput! ) Boolean! * [x] refresh ( data RefreshInput! ) RegisteredAccount! * [x] registerAccount ( data RegisterAccountInput! ) RegisteredAccount! * [x] registerParticipant ( data RegisterParticipantInput! ) Account! * [x] resetKey ( data ResetKeyInput! ) Boolean! * [x] selectBranch ( data SelectBranchInput! ) Boolean! * [x] setPaymentStatus ( data SetPaymentStatusInput! ) Payment! * [x] setWif ( data SetWifInput! ) Boolean! * [x] startResetKey ( data StartResetKeyInput! ) Boolean! * [x] uninstallExtension ( data UninstallExtensionInput! ) Boolean! * [x] updateAccount ( data UpdateAccountInput! ) Account! * [x] updateBankAccount ( data UpdateBankAccountInput! ) PaymentMethod! * [x] updateExtension ( data ExtensionInput! ) Extension! * [x] updateSystem ( data Update! ) SystemInfo! **QUERIES** * [x] getAccount ( data GetAccountInput! ) Account! * [x] getAccounts ( data GetAccountsInput , options PaginationInput ) AccountsPaginationResult! * [x] getAgenda [AgendaWithDocuments!]! * [x] getBranches ( data GetBranchesInput! ) [Branch!]! * [x] getDocuments ( data GetDocumentsInput! ) DocumentsPaginationResult! * [x] getExtensions ( data GetExtensionsInput ) [Extension!]! * [x] getPaymentMethods ( data GetPaymentMethodsInput ) PaymentMethodPaginationResult! * [x] getPayments ( data GetPaymentsInput , options PaginationInput ) PaymentPaginationResult! * [x] getSystemInfo SystemInfo! + +--- +#105: Выпустить достаточно-полную версию документации + +Раздел Руководители: * [ ] Пересмотреть и обновить что есть * [ ] Добавить новые скрины и методы Раздел Пайщики: * [ ] Добавить сценарий восстановления ключа * [ ] + +--- +#104: Собрать селекторы, запросы и мутации в SDK + +**Mutations** * [ ] System → contacts * [x] updateSystem?! * [x] addParticipant ( data AddParticipantInput! ) Account! * [x] addTrustedAccount ( data AddTrustedAccountInput! ) Branch! * [x] createBankAccount ( data CreateBankAccountInput! ) PaymentMethod! * [x] createBranch ( data CreateBranchInput! ) Branch! * [x] createDeposit ( data CreateDepositPaymentInputDTO! ) Payment! * [x] createInitialPayment ( data CreateInitialPaymentInput! ) Payment! * [x] createProjectOfFreeDecision ( data CreateProjectFreeDecisionInput! ) CreatedProjectFreeDecision! * [x] deleteAccount ( data DeleteAccountInput! ) Boolean! * [x] deleteBranch ( data DeleteBranchInput! ) Boolean! * [x] deletePaymentMethod ( data DeletePaymentMethodInput! ) Boolean! * [x] deleteTrustedAccount ( data DeleteTrustedAccountInput! ) Branch! * [x] editBranch ( data EditBranchInput! ) Branch! * [x] generateFreeDecision ( data FreeDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ProjectFreeDecisionDocument! * [x] generateParticipantApplication ( data ParticipantApplicationGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ParticipantApplicationDocument! * [x] generateParticipantApplicationDecision ( data ParticipantApplicationDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ParticipantApplicationDecisionDocument! * [x] generatePrivacyAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateProjectOfFreeDecision ( data ProjectFreeDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ProjectFreeDecisionDocument! * [x] generateSelectBranchDocument ( data SelectBranchGenerateDocumentInput! , options GenerateDocumentOptionsInput ) SelectBranchDocument! * [x] generateSignatureAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateUserAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateWalletAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] installExtension ( data ExtensionInput! ) Extension! * [x] login ( data LoginInput! ) RegisteredAccount! * [x] logout ( data LogoutInput! ) Boolean! * [x] publishProjectOfFreeDecision ( data PublishProjectFreeDecisionInput! ) Boolean! * [x] refresh ( data RefreshInput! ) RegisteredAccount! * [x] registerAccount ( data RegisterAccountInput! ) RegisteredAccount! * [x] registerParticipant ( data RegisterParticipantInput! ) Account! * [x] resetKey ( data ResetKeyInput! ) Boolean! * [x] selectBranch ( data SelectBranchInput! ) Boolean! * [x] setPaymentStatus ( data SetPaymentStatusInput! ) Payment! * [x] startResetKey ( data StartResetKeyInput! ) Boolean! * [x] uninstallExtension ( data UninstallExtensionInput! ) Boolean! * [x] updateAccount ( data UpdateAccountInput! ) Account! * [x] updateBankAccount ( data UpdateBankAccountInput! ) PaymentMethod! * [x] updateExtension ( data ExtensionInput! ) Extension! * [x] installSystem(install!) SystemInfo * [x] initSystem(init!) * [x] setWif * [x] updateSystem \ **Queries** * [x] getAccount ( data GetAccountInput! ) Account! * [x] getAccounts ( data GetAccountsInput , options PaginationInput ) AccountsPaginationResult! * [x] getAgenda [AgendaWithDocuments!]! * [x] getBranches ( data GetBranchesInput! ) [Branch!]! * [x] getDocuments ( data GetDocumentsInput! ) DocumentsPaginationResult! * [x] getExtensions ( data GetExtensionsInput ) [Extension!]! * [x] getPaymentMethods ( data GetPaymentMethodsInput ) PaymentMethodPaginationResult! * [x] getPayments ( data GetPaymentsInput , options PaginationInput ) PaymentPaginationResult! * [x] getSystemInfo SystemInfo! * [x] System → vars * [x] System → contacts ```typescript CreateDepositPaymentInputDTO - проверить на DTO в названиях ``` + +--- +#103: Занести auth.controller в гексагон + + + +--- +#102: Занести user.controller в гексагон + +queries * [x] getUsers → getAccounts * [x] getUser → getAccount mutations * [x] createUser → registerAccount * [x] изменить состав входящего DTO (убрать дубль email) * [ ] сделать доменный интерфейс очевидным (вынести в cooptypes) * [x] addUser → addParticipant * [x] joinCoop → registerParticipant * [x] 4 соглашения, заявление и username * [x] updateUser → updateAccount * [x] deleteUser → deleteAccount Завести в селекторы Перевести терминал срезать перенесенное из контроллера + +--- +#96: Баг продолжения регистрации с другого устройства + +Локальный тестовый ключ: 5JpMnzu3ab9tX74b8TgrW99iutZbLtjwkR1gTYwFkRyPY888WBt + +--- +#95: Устранить избыточные логи quotter + + + +--- +#94: Удобная задокументированная версия QL-клиента + + + +--- +#91: Повесить роли членам совета и залогиненному лицу в карточку + + + +--- +#89: Занести все существующие методы в задокументированный graphql + +user * [x] registerUser * [x] addUser * [x] getUsers * [x] getUser auth * [x] login * [x] refreshTokens * [x] lostKey * [x] resetKey * [ ] send-verification-email * [ ] verify-email coop * [x] **agenda** * [ ] staff * [ ] info documents * [x] **getDocuments** * [x] generate (всех по списку) methods * [x] listPaymentMethod * [x] addPaymentMethod * [x] deletePaymentMethod orders → **payments** * [x] initialPayment * [x] createDeposit * [x] setOrderStatus * [x] getCoopOrders * [ ] IPN (после отключения express-роутера) * [ ] **getProviders** * [x] getMyOrders participant * [x] joinCooperative * [x] selectBranch plugins (extensions) * [x] setPlugin * [x] setConfig system * [x] **contacts (из coop)** * [x] health * [x] init * [x] install * [x] setWif (объединить с install и оставить отдельным) * [x] get-vars * [x] **updateSystem (mutation set-vars, updateOrganization, settings, …)** * [x] save-vars * [ ] manageSettings * [ ] settings decision * [x] createProjectFreeDecision * [x] createFreeDecision + +--- +#87: Генерация документов в GraphQL с документацией + +* [x] SelectBranch [101] * [x] ProjectFreeDecision[599] * [x] FreeDecision[600] * [x] ParticipantApplication [100] * [x] Decision[500] * [x] WalletAgreement [1] * [x] PrivacyAgreement[2] * [x] SignatureAgreement[3] * [x] UserAgreement[4] * [ ] добавить мутации и селекторы в coopjs * [ ] настроить отгрузку документации в MONO + +--- +#85: Выбор кооперативного участка "добавленным" пайщиком + +* [x] ввести запрос DTO на аккаунт пользователя и таблицу participant (user), * [x] проверка прав доступа * [x] загрузка комплексного аккаунта в бутере * [x] Добавить наблюдателя с всплывающим окном на присоединение к КУ, если он не выбран, а branched == true * [x] Использовать метод изменения кооперативного участка с каким-то вложенным документом * [x] Добавить мутацию на выбор участка * [x] мигрировать таблицы контракта + +--- +#83: Ввести требования аудентификации для отдельного поля и документировать их + + + +--- +#82: добавить chain_id в controller .env + + + +--- +#81: добавить фактические адреса существующих организаций кооперативов как копии юридических адресов + + + +--- +#79: Отобразить флаг включения кооперативных участков + +* [x] метод контракта добавить * [x] добавить методы в cooptypes * [x] добавить мутацию на включение и отключение * [ ] добавить запрос на sysinfo с DTO (аналог текущему health) * [ ] добавить мутацию и запрос в coopjs * [ ] отобразить описание и кнопку в терминале + +--- +#74: Сделать основной загрузчик BOOT явным и последовательным + + + +--- +#72: Реализовать шаблон гексагональной архитектуры на примере appstore + +``` src/ ├── app.ts # Основной файл Express приложения ├── bootstrap.ts # Точка запуска приложения ├── config/ # Конфигурационные файлы приложения │ ├── config.ts # Основной конфиг приложения │ └── ... # Другие конфигурационные файлы ├── domain/ # Корневая бизнес-логика (интеракторы, репозитории, сущности) │ ├── user/ # Домен пользователя │ │ ├── interactors/ # Интеракторы для пользователя (сценарии использования) │ │ │ ├── CreateUserInteractor.ts # Интерактор для создания пользователя │ │ │ ├── DeleteUserInteractor.ts # Интерактор для удаления пользователя │ │ │ ├── UpdateUserInteractor.ts # Интерактор для обновления пользователя │ │ │ └── ... # Другие интеракторы пользователя │ │ ├── repositories/ # Интерфейсы и абстракции для работы с данными │ │ │ ├── user.repository.interface.ts # Интерфейс репозитория пользователя │ │ │ └── ... │ │ └── entities/ # Бизнес-сущности пользователя │ │ └── user.entity.ts # Сущность пользователя │ └── order/ # Домен заказов │ ├── interactors/ │ │ ├── ProcessOrderInteractor.ts # Интерактор для обработки заказа │ │ ├── CancelOrderInteractor.ts # Интерактор для отмены заказа │ │ └── ... # Другие интеракторы для заказов │ ├── repositories/ │ │ └── order.repository.interface.ts # Интерфейс репозитория заказов │ └── entities/ │ └── order.entity.ts # Сущность заказа ├── infrastructure/ # Инфраструктурный слой (реализации репозиториев и подключение к базам данных) │ ├── database/ # Конкретные реализации репозиториев для разных баз данных │ │ ├── mongo/ │ │ │ ├── repositories/ │ │ │ │ └── mongo-user.repository.ts # Mongo реализация репозитория для пользователя │ │ │ └── ... # Другие реализации для MongoDB │ │ └── postgres/ │ │ ├── repositories/ │ │ │ └── postgres-user.repository.ts # Postgres реализация репозитория для пользователя │ │ └── ... # Другие реализации для PostgreSQL │ └── services/ # Вспомогательные инфраструктурные сервисы (например, для отправки email) │ ├── email.service.ts │ └── ... ├── modules/ # Основные модули приложения │ ├── user/ # Модуль пользователя в NestJS │ │ ├── dto/ # DTO для модуля пользователя │ │ │ └── create-user.dto.ts # DTO для создания пользователя │ │ ├── entities/ # ORM-сущности, если используются отдельно от бизнес-сущностей │ │ │ └── user.orm-entity.ts # ORM-сущность для PostgreSQL, если требуется │ │ ├── resolvers/ # GraphQL резолверы или REST контроллеры │ │ │ └── user.resolver.ts # Резолвер пользователя │ │ └── services/ # Локальные сервисы модуля, например, для валидации │ │ └── user.service.ts # Вспомогательный сервис модуля │ ├── order/ # Пример другого модуля (например, для заказов) │ │ ├── dto/ │ │ ├── entities/ │ │ ├── resolvers/ │ │ └── services/ │ └── appstore/ # Модуль AppStore │ ├── controllers/ # Контроллеры и резолверы для AppStore │ │ └── appstore.controller.ts # Контроллер AppStore │ ├── resolvers/ # Резолверы GraphQL для AppStore (если используются) │ │ └── appstore.resolver.ts # Резолвер AppStore │ ├── services/ # Сервисы для инфраструктурных задач AppStore │ │ ├── AppManagementService.ts # Основной сервис управления приложениями │ │ ├── AuthApiService.ts # Сервис аутентификации для внешних приложений │ │ └── PermissionsApiService.ts # Сервис управления правами доступа │ ├── dto/ # DTO для AppStore │ └── appstore.module.ts # Главный модуль AppStore ├── controllers/ # Контроллеры Express-приложения (если они ещё используются) ├── middlewares/ # Middleware для Express (если используется) ├── routes/ # Маршруты Express (например, для API v1) ├── services/ # Общие сервисы Express ├── models/ # Модели MongoDB или другие схемы, если необходимо оставить └── utils/ # Утилиты и вспомогательные функции ``` + +--- +#69: nestJS & postgres & graphql & apollo прототип на действующем контроллере + +* [x] собрать прототип nestjs & postgres & migrator * [ ] собрать прототип apollo server & graphql code generator & apollo client + +--- +#68: Шаблон витрины приложений + +* [ ] верхне-правое меню настроек * [ ] Шаблон настроек * [ ] Витрина плагинов * [ ] Витрина приложений * [ ] Выход Витрина: * [ ] первой отдельной записью идет витрина * [ ] установленные приложения отображаются в левом меню * [ ] окно приложения: виджет, настройки, лог + +--- +#67: Собрать прототип лендинга с документацией + + + +--- +#64: Перевести платежи на систему плагинов + + + +--- +#63: Собрать витрину доступных расширений + +* [x] перенести оставшиеся расширения на модули * [x] добавить сущность лога * [x] отключить монго-модель расширений * [x] рефакторинг * [x] собрать API-клиент * [x] построить интерфейс graphql для получения списка доступных плагинов * [x] построить интерфейс мутации graphql для установки плагина * [x] рефакторинг * [x] проверить документирование * [x] установить клиента * [x] модель - стор расширений * [x] загрузка доступных расширений * [x] загрузка установленных расширений * [x] витрина расширений * [x] виджет расширения * [x] проверка аудентификации * [ ] ~~страница просмотра лога расширения~~ * [x] мутация установки расширения * [x] мутация отключения расширения * [x] мутация удаления расширения * [x] страница не установленного расширения (страница установки) * [x] страница установленного расширения, редактирования конфигурации и просмотра логов * [x] страница редактирования конфигурации расширени * [ ] ~~выделить стейт из конфига~~ * [x] ввести проверку конфига при установке * [x] кнопка “назад” в шапке * [x] внести ясность по отсутстующим настройкам * [x] ввести [install.md](http://install.md) с инструкцией по установке * [x] рефакторинг маршрутизатора + +--- +#57: Собрать лендинг на сайт mono + + + +--- +#55: Растащить настройки кооператива и пользовательские + + + +--- +#53: Устранить баг детерменированной регенерации документов + + + +--- +#52: Устранить избыточное сохранение документа при регенерации + +* [x] ввести опцию в параметры генератора * [ ] передать опции сквозь контроллер + +--- +#43: Повесить лоадер на кнопку запуска установки совета + + + +--- +#41: перенести провайдера с adonisJS на nestJS + +* [ ] + +--- +#40: Развернуть облачное хранилище на тест и проде + + + +--- +#39: Собрать пред-генератор документов кооператива для приёма в совете + +* [x] сохранять в облаке в папку кооператива * [x] разбить на 2 папки: PDF / docx * [x] создавать публичную ссылку на docx * [x] возвращать ссылку в задаче + +--- +#38: Баг извлечения повестки в авто-кооперативах + + + +--- +#36: Собрать контроллер оплат ресурсов + +Проверка ресурсов выполняется контроллером кооператива: * при достижении условий автономно каждую минуту * по каждой транзитной транзакции ? Сейчас транзитов еще нет, поэтому, каждую минуту. Возможно, так и оставим потом, чтоб не путать и не путаться. + +--- +#35: Исправить баг отсутствующего потребителя в нотификаторе + + + +--- +#32: Баг обновления состава совета другим советом (сброс состава) + + + +--- +#28: Генерация и подпись соглашения на подключение + +На спецстранице отобразить соглашение на подключение к платформе. Проверить подписано ли оно ранее. Подписав, отправить его администратору. После подписи соглашения, для того, чтобы документ отобразился в разделе документы у пайщика, необходимо принять его администратором. Т.е. администратор должен вызвать метод confirmagree. До этого соглашение считается условно-принятым, т.е. в реестре документов отмечается как newsubmitted, но еще не newresolved, т.е. этот документ еще может и не попасть в реестр финальный. Поэтому, или необходимо изменить приём документов в пользу делать сразу newresolved, тогда документ сразу будет отображен где надо, или вообще изменить подход к подключению. Скорее всего второе. Agreements это соглашения между пайщиками и кооперативом сейчас. У нас же здесь что-то вроде metaAgreement, который заключается между кооперативом и провайдером, и больше он нигде фигурировать не будет. * [x] изменить метод regcoop и структуру orgs для приёма подписанного соглашения на подключение * [x] добавить в regcoop вызов newresolved и newsubmitted * [x] убрать agreements newresolved и newsubmitted из числа общего отображения документов - мы всегда вытаскиваем их связями с заявлениями сейчас и нет смысла плодить их в главном экране. * [x] обновить типы (registrator) * [x] соединить подпись соглашения с вызовом метода создания кооператива * [x] отобразить статус подключения * [x] отобразить документ в реестре после приёма администратором * [x] встроить инструкцию подключения * [x] отобразить документ соглашения на экране подключения администратору * [x] добавить выбор типа извлекаемого документа необязательным параметром (type=submitted | resolved) * [x] разворачивать список сразу, если документ 1 * [x] запросить домен в форме подключения * [x] тест * [x] скорректировать сумму в соглашении * [x] установить обновленные соглашения всех типов на тест * [x] выкатить на тест * [x] фикс бага обновления состояния документа * [x] обновить соглашения на проде * [x] выкатить на прод * [x] обновить переменные на тесте и проде + +--- +#27: Скорректировать отображение воркспейсов и меню + +Воркспейсы по ролям: * пайщик * член совета * председатель * администратор воркспейсы отложим. Сейчас встроим всё в один спейс и уберём меню выбора. radial-gradient(circle, #35a2ff 0%, #014a88 100%)" + +--- +#26: Фикс бага извлечения кооператива из организаций, когда их несколько + + + +--- +#25: Настроить резервное копирование в S3 по расписанию + + + +--- +#24: Убрать кнопку "Утвердить" в совете для членов + + + +--- +#23: Баг временного отображения соглашений на подпись после входа на медленном интернете + + + +--- +#22: Передать, сохранить и использовать параметр ключа на бэкенд при установке и в процессе работы + +При запуске кооператива ему необходим ключ на сервере для осуществления регистраций и прочих сервисных операций. Для этого нам нужно активное разрешение ключа, который необходимо хранить на сервере. В минимальной реализации храним в базе данных. В расширенной переносим хранение ключа в VAULT. Минимальная версия подразумевает создание модели для хранения ключа и операций с ним. Важно, что при восстановлении доступа, ключ будет не действительным. Необходимо переустанавливать ключи, если необходимо. * [x] при установке сохранять ключ в базу set_wif(wif) * [x] использовать ключ из базы get_wif() * [x] отобразить настройку для обновления ключа в базе + +--- +#21: Баг разворота повестки - открываются несколько папок с документами вместо одной + + + +--- +#19: Собрать временное решение поставки ПО на docker + +* [x] собрать плейбук на сборку * [x] риверсировать сайты на маршруты по портам * [x] автовыпуск и обновление сертификатов SSL * [x] параметризировать сборку * [x] перевести продакшн на новую сборку * [x] убрать cloudflare переадресацию http → https для ЦК * [x] настроить punicode параметр для nginx * [x] баг подгрузки данных в nginx на первом старте ??? * [x] параллельный запуск нескольких групп контейнеров * [x] подтереть мусор + +--- +#18: Пройти путь запуска кооператива на тестнете + + + +--- +#14: BUG: ApiError: Invalid time format при добавлении пайщика через админку + +При добавлении пайщика дата не верно передаётся, в объекте при проверке на контроллере уже invalid date. Проверить фронт. + +--- +#13: Восстановить работу деплоя через сборку в semaphore + +Временное решение до выноса переменных окружения в терминале в настройки приложения. Установка: * [x] подключить semaphore на деплой контрактов Миграция: * [x] soviet::createprog * [x] for(draft of drafts) draft::create_draft * [x] soviet::makecoagreement (wallet, signature, user, privacy, coopenomics) * [x] затащить параметры [генератора в .env при деплое ??](http://e.vn)\ \ Контроллер: * [x] установить vars * [x] установить settings + +--- +#9: Построить маршруты создания бакета, загрузки-чтения файлов в-из MINIO + + + +--- +#3: Добавить скролл для страницы реестра пайщиков + + + +--- +#2: Ввести подписки на важное + +использовать subscriptions у graphql + +--- + +Сгенерируй changelog для следующего релиза. +Группируй по категориям: Features, Fixes, Improvements. +Пиши кратко, но информативно. Указывай номера issue. diff --git a/issues.txt b/issues.txt new file mode 100644 index 00000000000..b2ef64fae64 --- /dev/null +++ b/issues.txt @@ -0,0 +1,435 @@ +#232: Поднять бэкенд полного обозревателя блоков + + + +--- +#231: Фикс багов десктопа + +* [x] при регистрации не обновляется состояние после получения решения * [x] не выходит из системы нормально (после выхода и перехода на страницу регистратора какие-то данные там есть). * [x] баг аудентификации на регистрации * [x] перенос на другую строку в платежах * [x] в карточке организации емейл был скрыт для редактирования * [x] добавлено правило проверки даты при добавлении пайщика + +--- +#226: Встроить редактирование пайщиков + +* [x] добавить private_account в бэкенд * [x] ввести проверку на соответствие имен пользователей в запросе на обновление и почт * [x] перевести запросы пайщиков на graphql * [x] встроить функции обновления * [x] устранить ошибки и предупреждения * [ ] проверить регистрацию + +--- +#225: Скорректировать возврат паевого взноса из результата интеллектуальной деятельности + +* [x] Устранить логику взноса-возврата взноса при withdraw, т.к. там результат уже принят через решение по актам. * [x] Убрать логику перебора коммитов при создании объекта возврата - работаем напрямую с contributor и его доступным балансом по договору УХД + +--- +#224: Написать ТЗ по контракту капитализации + + + +--- +#218: Встроить логику фондирования членскими взносами + +* [x] считать личный вес share_balance на основе available + for_convert в момент конвертации * [x] до момента конвертации средства не являются share_balance и не принимают участие в распределении * [x] использовать Все членские взносы стекаются в проект и распределяются рубильником на 2 части: локальную и глобальную. Под локальной частью подразумевается та часть средств, которая должна распределиться среди инвесторов/создателей конкретно этого проекта. Под глобальной частью подразумевается та часть средств, которая должна распределиться среди инвесторов/создателей целевой потребительской программы “капитализация”. * [x] обновление балансов и расчет долей в членских взносах по проектам * [x] возврат средств из проектов и учёт средств при возврате Куда записываем расчетную величину накопленного остатка? В баланс контрибьютора, в его таблицу. Затем мы используем эти средства для создания заявления на возврат с дальнейшим исполнением. Т.е. паевой взнос можно вернуть только из числа накопленных средств членских взносов программы. + +--- +#211: Ввести отображение наименования организации в таблице пайщиков + + + +--- +#209: Создать скрипт-загрузчик, который устанавливает MONO для целей разработки + + + +--- +#204: Создать рабочий прототип модуля экспорта результатов из трекера + + + +--- +#203: Написать смарт-контракт капитализации результатов интеллектуальной деятельности + + + +--- +#202: Внести изменения в README.md для гладкой установки + + + +--- +#199: Onboarding-процесс для задач по маркетплейсу (Илья Смирнов) + +1) Установить и настроить локальный проект для внесения изменений: 2) Изучить документацию разработчика: 3) Протестировать запуск локального инстанса перед внесением изменений по первой задачей (докер, seed-скрипты, тестовые данные для заполнения локальной базы) 4) Выяснить стандартный gitflow при внесении изменений по задаче + +--- +#182: Запроектировать технический бизнес-процесс списания расходов результата проекта + +Расход создается с хэш-идентификатором, который хранит информацию о реквизитах платежа во внешней системе учёта MONO относительно блокчейна. При создании расхода необходимо указать хэш платежа, который должен быть предварительно создан в MONO. Создание платежа в MONO автоматически повлечет за собой его отображение в разделе "платежи", если не предусмотреть обратное. Также в разделе платежи сейчас отображаются только входящие платежи, и исходящие там вообще не встроены ещё.  Учитывая то, что входящие платежи скорее всего желательно тоже перевести на хэш-идентификаторы, то получается, что необходимо переписать модуль приёма платежей, адаптировав его под это изначально.  Пусть так, и у нас есть модуль платежей, который генерирует объекты платежа с суммами с указанием реквизитов. Однако основой для их отображения должна служить блокчейн-база, т.к. именно в ней происходит сейчас утвердение расходов.  А у нас сейчас вообще не так, по-крайней мере для входящих платежей. Все входящие платежи создаются в базе MONO, которая создаёт объект в блокчейне в момент приема платежа и автоматически его отмечает исполненным, что удаляет запись из бч и запускает бизнес-процесс приёма платежа согласно типу.  В контракте шлюза сейчас есть реализация возврата с документами. Наверное она даже как-то работает. Чтобы не переписывать сейчас шлюз на бэкенде, необходимо только добавить ему функционал для работы с исходящими платежами.  В контракте у нас при возврате фигурирует bank_account_id который необходимо заменить на withdraw_hash, где в случае расхода он должен быть равен expense_hash, который должен быть предварительно сформирован при подготовке служебной записки.  Тогда, здесь необходимо: * заменить bank_account_id на withdraw_hash в контракте gateway * пристроить систему генерации исходящих платежей с опорой на их блокчейн-двойник.  * причем создание исходящего платежа должно происходить в транзакционной манере, т.е. мы сперва генерим хэш и делаем некое предсохранение в базе, затем отправляем транзакцию в блокчейн, и только затем сохраняем исходящий платеж в базу. Тогда у каждого платежа в базе будет зеркало в бч.  Если в случае со взносами мы создаем объект взноса в момент приёма платежа, и делаем это в основном из за того, что мы не можем при регистрации пайщика создать платеж в привязке к аккаунту т.к. его еще нет. То в случае с возвратом мы можем создавать исходящие объекты сразу в блокчейне и привязываться к ним. Тут вообще никак иначе нельзя т.к. во многих случаях управление возвратами происходит по условиям смарт-контрактов, а ручками бухгалтер или кто доверенный может вмешаться только при достижении определенных его условий.  Тогда получается, что при создании исходящего платежа необходимо: * принять от пайщика детали платежа (идентификатор реквизитов) * принять от пайщика детали расхода (если расход) * использовать информацию для генерации документа * проверить что детали платежа ок и все в целом ок * сгенерировать хэш платежа * отправить в блокчейн транзакцию и убедиться что всё ок * сохранить в локальной базе детали платежа И именно в таком порядке. В случае облома на этапе транзакции в блокчейне - в локальной базе ничего не должно остаться. Тогда мы сможем на уровне блокчейна управлять статусами готовности платежа и при этом иметь возможность получать закрытые данные по платежу из базы.  В таком случае необходимо, чтобы шлюз не удалял самостоятельно объекты исходящих платежей, а только переводил их в статус, который позволяет доверенному лицу удалить их из базы и блокчейна одновременно из интерфейса.  Тогда всё будет ок. + +--- +#169: Добавить шаблон акта приема-передачи результата интеллектуальной деятельности в кооператив + + + +--- +#168: Добавить шаблон заявления на взнос деньгами с ЦПП Цифровой Кошелек по договору УХД + + + +--- +#167: Добавить шаблон заявления на взнос результатом в фабрику + + + +--- +#152: Отключить избыточные оповещения на исходящих переводах + + + +--- +#150: Баг: обновление карточки банковского счета кооперативного участка + + + +--- +#149: Баг перехода назад на ключ доступа с заявления + +При переходе назад от заявления к ключу доступа переходим не туда. Скорее всего уходим на выбор кооперативных участков, который скрыт. step + +--- +#146: Добавить поле ИНН в реквизиты и кнопку "скопировать реквизиты" + + + +--- +#145: Отобразить иконки прав доступа в листе кнопок меню + + + +--- +#144: Срезать константу COOPNAME из десктопа + + + +--- +#139: Убрать ограничение в 24 часа для первой ссылки приглашения + + + +--- +#138: Сделать кнопку настроек кооператива доступной для членов совета + + + +--- +#136: Рефакторинг техдокументации #1 + +* [x] Как это работает * [x] Архитектура * [x] Язык API * [x] Обзор SDK * [x] Установка * [ ] ~~Подключение~~ * [x] Инициализация * [x] Раздел подключений и автоматизация * [x] Аккаунты * [ ] + +--- +#135: new issue + +test + +--- +#134: Сделать страницу CONNECT доступной для подключенных кооперативов в VOSKHOD + + + +--- +#133: Методы Canvas перевести в класс SDK #test + + + +--- +#132: Добавить описание интерфейсов переменных в макросы main.py + + + +--- +#126: Убрать срок действия первого приглашения? на addParticipant. Чтоб не объяснять о восстановлении ключа каждому 1 + + + +--- +#125: Добавить набор методов для работы с Canvas и собственноручной подписью в SDK + + + +--- +#121: createInitial -> createInitialPayment, createDeposit -> createDepositPayment + + + +--- +#120: Добавить класс Document и метод signDocument в SDK + + + +--- +#118: Убрать из getAccounts.Input поле username за ненадобностью + + + +--- +#117: Устранить мутацию удаления аккаунта deleteAccount + + + +--- +#115: Добавить класс Account для генерации имени и ключей в SDK + + + +--- +#113: Убрать указание роли пользователя из Account.RegisterAccount + + + +--- +#109: Скорректировать IInput интерфейсы во всех мутациях и запросах SDK + +* [x] addParticipant ( data AddParticipantInput! ) Account! * [x] addTrustedAccount ( data AddTrustedAccountInput! ) Branch! * [x] createBankAccount ( data CreateBankAccountInput! ) PaymentMethod! * [x] createBranch ( data CreateBranchInput! ) Branch! * [x] createDeposit ( data CreateDepositPaymentInput! ) Payment! * [x] createInitialPayment ( data CreateInitialPaymentInput! ) Payment! * [x] createProjectOfFreeDecision ( data CreateProjectFreeDecisionInput! ) CreatedProjectFreeDecision! * [x] deleteAccount ( data DeleteAccountInput! ) Boolean! * [x] deleteBranch ( data DeleteBranchInput! ) Boolean! * [x] deletePaymentMethod ( data DeletePaymentMethodInput! ) Boolean! * [x] deleteTrustedAccount ( data DeleteTrustedAccountInput! ) Branch! * [x] editBranch ( data EditBranchInput! ) Branch! * [x] generateFreeDecision ( data FreeDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ProjectFreeDecisionDocument! * [x] generateParticipantApplication ( data ParticipantApplicationGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ParticipantApplicationDocument! * [x] generateParticipantApplicationDecision ( data ParticipantApplicationDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ParticipantApplicationDecisionDocument! * [x] generatePrivacyAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateProjectOfFreeDecision ( data ProjectFreeDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ProjectFreeDecisionDocument! * [x] generateSelectBranchDocument ( data SelectBranchGenerateDocumentInput! , options GenerateDocumentOptionsInput ) SelectBranchDocument! * [x] generateSignatureAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateUserAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateWalletAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] initSystem ( data Init! ) SystemInfo! * [x] installExtension ( data ExtensionInput! ) Extension! * [x] installSystem ( data Install! ) SystemInfo! * [x] login ( data LoginInput! ) RegisteredAccount! * [x] logout ( data LogoutInput! ) Boolean! * [x] publishProjectOfFreeDecision ( data PublishProjectFreeDecisionInput! ) Boolean! * [x] refresh ( data RefreshInput! ) RegisteredAccount! * [x] registerAccount ( data RegisterAccountInput! ) RegisteredAccount! * [x] registerParticipant ( data RegisterParticipantInput! ) Account! * [x] resetKey ( data ResetKeyInput! ) Boolean! * [x] selectBranch ( data SelectBranchInput! ) Boolean! * [x] setPaymentStatus ( data SetPaymentStatusInput! ) Payment! * [x] setWif ( data SetWifInput! ) Boolean! * [x] startResetKey ( data StartResetKeyInput! ) Boolean! * [x] uninstallExtension ( data UninstallExtensionInput! ) Boolean! * [x] updateAccount ( data UpdateAccountInput! ) Account! * [x] updateBankAccount ( data UpdateBankAccountInput! ) PaymentMethod! * [x] updateExtension ( data ExtensionInput! ) Extension! * [x] updateSystem ( data Update! ) SystemInfo! **QUERIES** * [x] getAccount ( data GetAccountInput! ) Account! * [x] getAccounts ( data GetAccountsInput , options PaginationInput ) AccountsPaginationResult! * [x] getAgenda [AgendaWithDocuments!]! * [x] getBranches ( data GetBranchesInput! ) [Branch!]! * [x] getDocuments ( data GetDocumentsInput! ) DocumentsPaginationResult! * [x] getExtensions ( data GetExtensionsInput ) [Extension!]! * [x] getPaymentMethods ( data GetPaymentMethodsInput ) PaymentMethodPaginationResult! * [x] getPayments ( data GetPaymentsInput , options PaginationInput ) PaymentPaginationResult! * [x] getSystemInfo SystemInfo! + +--- +#105: Выпустить достаточно-полную версию документации + +Раздел Руководители: * [ ] Пересмотреть и обновить что есть * [ ] Добавить новые скрины и методы Раздел Пайщики: * [ ] Добавить сценарий восстановления ключа * [ ] + +--- +#104: Собрать селекторы, запросы и мутации в SDK + +**Mutations** * [ ] System → contacts * [x] updateSystem?! * [x] addParticipant ( data AddParticipantInput! ) Account! * [x] addTrustedAccount ( data AddTrustedAccountInput! ) Branch! * [x] createBankAccount ( data CreateBankAccountInput! ) PaymentMethod! * [x] createBranch ( data CreateBranchInput! ) Branch! * [x] createDeposit ( data CreateDepositPaymentInputDTO! ) Payment! * [x] createInitialPayment ( data CreateInitialPaymentInput! ) Payment! * [x] createProjectOfFreeDecision ( data CreateProjectFreeDecisionInput! ) CreatedProjectFreeDecision! * [x] deleteAccount ( data DeleteAccountInput! ) Boolean! * [x] deleteBranch ( data DeleteBranchInput! ) Boolean! * [x] deletePaymentMethod ( data DeletePaymentMethodInput! ) Boolean! * [x] deleteTrustedAccount ( data DeleteTrustedAccountInput! ) Branch! * [x] editBranch ( data EditBranchInput! ) Branch! * [x] generateFreeDecision ( data FreeDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ProjectFreeDecisionDocument! * [x] generateParticipantApplication ( data ParticipantApplicationGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ParticipantApplicationDocument! * [x] generateParticipantApplicationDecision ( data ParticipantApplicationDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ParticipantApplicationDecisionDocument! * [x] generatePrivacyAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateProjectOfFreeDecision ( data ProjectFreeDecisionGenerateDocumentInput! , options GenerateDocumentOptionsInput ) ProjectFreeDecisionDocument! * [x] generateSelectBranchDocument ( data SelectBranchGenerateDocumentInput! , options GenerateDocumentOptionsInput ) SelectBranchDocument! * [x] generateSignatureAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateUserAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] generateWalletAgreement ( data GenerateDocumentInput! , options GenerateDocumentOptionsInput ) GeneratedDocument! * [x] installExtension ( data ExtensionInput! ) Extension! * [x] login ( data LoginInput! ) RegisteredAccount! * [x] logout ( data LogoutInput! ) Boolean! * [x] publishProjectOfFreeDecision ( data PublishProjectFreeDecisionInput! ) Boolean! * [x] refresh ( data RefreshInput! ) RegisteredAccount! * [x] registerAccount ( data RegisterAccountInput! ) RegisteredAccount! * [x] registerParticipant ( data RegisterParticipantInput! ) Account! * [x] resetKey ( data ResetKeyInput! ) Boolean! * [x] selectBranch ( data SelectBranchInput! ) Boolean! * [x] setPaymentStatus ( data SetPaymentStatusInput! ) Payment! * [x] startResetKey ( data StartResetKeyInput! ) Boolean! * [x] uninstallExtension ( data UninstallExtensionInput! ) Boolean! * [x] updateAccount ( data UpdateAccountInput! ) Account! * [x] updateBankAccount ( data UpdateBankAccountInput! ) PaymentMethod! * [x] updateExtension ( data ExtensionInput! ) Extension! * [x] installSystem(install!) SystemInfo * [x] initSystem(init!) * [x] setWif * [x] updateSystem \ **Queries** * [x] getAccount ( data GetAccountInput! ) Account! * [x] getAccounts ( data GetAccountsInput , options PaginationInput ) AccountsPaginationResult! * [x] getAgenda [AgendaWithDocuments!]! * [x] getBranches ( data GetBranchesInput! ) [Branch!]! * [x] getDocuments ( data GetDocumentsInput! ) DocumentsPaginationResult! * [x] getExtensions ( data GetExtensionsInput ) [Extension!]! * [x] getPaymentMethods ( data GetPaymentMethodsInput ) PaymentMethodPaginationResult! * [x] getPayments ( data GetPaymentsInput , options PaginationInput ) PaymentPaginationResult! * [x] getSystemInfo SystemInfo! * [x] System → vars * [x] System → contacts ```typescript CreateDepositPaymentInputDTO - проверить на DTO в названиях ``` + +--- +#103: Занести auth.controller в гексагон + + + +--- +#102: Занести user.controller в гексагон + +queries * [x] getUsers → getAccounts * [x] getUser → getAccount mutations * [x] createUser → registerAccount * [x] изменить состав входящего DTO (убрать дубль email) * [ ] сделать доменный интерфейс очевидным (вынести в cooptypes) * [x] addUser → addParticipant * [x] joinCoop → registerParticipant * [x] 4 соглашения, заявление и username * [x] updateUser → updateAccount * [x] deleteUser → deleteAccount Завести в селекторы Перевести терминал срезать перенесенное из контроллера + +--- +#96: Баг продолжения регистрации с другого устройства + +Локальный тестовый ключ: 5JpMnzu3ab9tX74b8TgrW99iutZbLtjwkR1gTYwFkRyPY888WBt + +--- +#95: Устранить избыточные логи quotter + + + +--- +#94: Удобная задокументированная версия QL-клиента + + + +--- +#91: Повесить роли членам совета и залогиненному лицу в карточку + + + +--- +#89: Занести все существующие методы в задокументированный graphql + +user * [x] registerUser * [x] addUser * [x] getUsers * [x] getUser auth * [x] login * [x] refreshTokens * [x] lostKey * [x] resetKey * [ ] send-verification-email * [ ] verify-email coop * [x] **agenda** * [ ] staff * [ ] info documents * [x] **getDocuments** * [x] generate (всех по списку) methods * [x] listPaymentMethod * [x] addPaymentMethod * [x] deletePaymentMethod orders → **payments** * [x] initialPayment * [x] createDeposit * [x] setOrderStatus * [x] getCoopOrders * [ ] IPN (после отключения express-роутера) * [ ] **getProviders** * [x] getMyOrders participant * [x] joinCooperative * [x] selectBranch plugins (extensions) * [x] setPlugin * [x] setConfig system * [x] **contacts (из coop)** * [x] health * [x] init * [x] install * [x] setWif (объединить с install и оставить отдельным) * [x] get-vars * [x] **updateSystem (mutation set-vars, updateOrganization, settings, …)** * [x] save-vars * [ ] manageSettings * [ ] settings decision * [x] createProjectFreeDecision * [x] createFreeDecision + +--- +#87: Генерация документов в GraphQL с документацией + +* [x] SelectBranch [101] * [x] ProjectFreeDecision[599] * [x] FreeDecision[600] * [x] ParticipantApplication [100] * [x] Decision[500] * [x] WalletAgreement [1] * [x] PrivacyAgreement[2] * [x] SignatureAgreement[3] * [x] UserAgreement[4] * [ ] добавить мутации и селекторы в coopjs * [ ] настроить отгрузку документации в MONO + +--- +#85: Выбор кооперативного участка "добавленным" пайщиком + +* [x] ввести запрос DTO на аккаунт пользователя и таблицу participant (user), * [x] проверка прав доступа * [x] загрузка комплексного аккаунта в бутере * [x] Добавить наблюдателя с всплывающим окном на присоединение к КУ, если он не выбран, а branched == true * [x] Использовать метод изменения кооперативного участка с каким-то вложенным документом * [x] Добавить мутацию на выбор участка * [x] мигрировать таблицы контракта + +--- +#83: Ввести требования аудентификации для отдельного поля и документировать их + + + +--- +#82: добавить chain_id в controller .env + + + +--- +#81: добавить фактические адреса существующих организаций кооперативов как копии юридических адресов + + + +--- +#79: Отобразить флаг включения кооперативных участков + +* [x] метод контракта добавить * [x] добавить методы в cooptypes * [x] добавить мутацию на включение и отключение * [ ] добавить запрос на sysinfo с DTO (аналог текущему health) * [ ] добавить мутацию и запрос в coopjs * [ ] отобразить описание и кнопку в терминале + +--- +#74: Сделать основной загрузчик BOOT явным и последовательным + + + +--- +#72: Реализовать шаблон гексагональной архитектуры на примере appstore + +``` src/ ├── app.ts # Основной файл Express приложения ├── bootstrap.ts # Точка запуска приложения ├── config/ # Конфигурационные файлы приложения │ ├── config.ts # Основной конфиг приложения │ └── ... # Другие конфигурационные файлы ├── domain/ # Корневая бизнес-логика (интеракторы, репозитории, сущности) │ ├── user/ # Домен пользователя │ │ ├── interactors/ # Интеракторы для пользователя (сценарии использования) │ │ │ ├── CreateUserInteractor.ts # Интерактор для создания пользователя │ │ │ ├── DeleteUserInteractor.ts # Интерактор для удаления пользователя │ │ │ ├── UpdateUserInteractor.ts # Интерактор для обновления пользователя │ │ │ └── ... # Другие интеракторы пользователя │ │ ├── repositories/ # Интерфейсы и абстракции для работы с данными │ │ │ ├── user.repository.interface.ts # Интерфейс репозитория пользователя │ │ │ └── ... │ │ └── entities/ # Бизнес-сущности пользователя │ │ └── user.entity.ts # Сущность пользователя │ └── order/ # Домен заказов │ ├── interactors/ │ │ ├── ProcessOrderInteractor.ts # Интерактор для обработки заказа │ │ ├── CancelOrderInteractor.ts # Интерактор для отмены заказа │ │ └── ... # Другие интеракторы для заказов │ ├── repositories/ │ │ └── order.repository.interface.ts # Интерфейс репозитория заказов │ └── entities/ │ └── order.entity.ts # Сущность заказа ├── infrastructure/ # Инфраструктурный слой (реализации репозиториев и подключение к базам данных) │ ├── database/ # Конкретные реализации репозиториев для разных баз данных │ │ ├── mongo/ │ │ │ ├── repositories/ │ │ │ │ └── mongo-user.repository.ts # Mongo реализация репозитория для пользователя │ │ │ └── ... # Другие реализации для MongoDB │ │ └── postgres/ │ │ ├── repositories/ │ │ │ └── postgres-user.repository.ts # Postgres реализация репозитория для пользователя │ │ └── ... # Другие реализации для PostgreSQL │ └── services/ # Вспомогательные инфраструктурные сервисы (например, для отправки email) │ ├── email.service.ts │ └── ... ├── modules/ # Основные модули приложения │ ├── user/ # Модуль пользователя в NestJS │ │ ├── dto/ # DTO для модуля пользователя │ │ │ └── create-user.dto.ts # DTO для создания пользователя │ │ ├── entities/ # ORM-сущности, если используются отдельно от бизнес-сущностей │ │ │ └── user.orm-entity.ts # ORM-сущность для PostgreSQL, если требуется │ │ ├── resolvers/ # GraphQL резолверы или REST контроллеры │ │ │ └── user.resolver.ts # Резолвер пользователя │ │ └── services/ # Локальные сервисы модуля, например, для валидации │ │ └── user.service.ts # Вспомогательный сервис модуля │ ├── order/ # Пример другого модуля (например, для заказов) │ │ ├── dto/ │ │ ├── entities/ │ │ ├── resolvers/ │ │ └── services/ │ └── appstore/ # Модуль AppStore │ ├── controllers/ # Контроллеры и резолверы для AppStore │ │ └── appstore.controller.ts # Контроллер AppStore │ ├── resolvers/ # Резолверы GraphQL для AppStore (если используются) │ │ └── appstore.resolver.ts # Резолвер AppStore │ ├── services/ # Сервисы для инфраструктурных задач AppStore │ │ ├── AppManagementService.ts # Основной сервис управления приложениями │ │ ├── AuthApiService.ts # Сервис аутентификации для внешних приложений │ │ └── PermissionsApiService.ts # Сервис управления правами доступа │ ├── dto/ # DTO для AppStore │ └── appstore.module.ts # Главный модуль AppStore ├── controllers/ # Контроллеры Express-приложения (если они ещё используются) ├── middlewares/ # Middleware для Express (если используется) ├── routes/ # Маршруты Express (например, для API v1) ├── services/ # Общие сервисы Express ├── models/ # Модели MongoDB или другие схемы, если необходимо оставить └── utils/ # Утилиты и вспомогательные функции ``` + +--- +#69: nestJS & postgres & graphql & apollo прототип на действующем контроллере + +* [x] собрать прототип nestjs & postgres & migrator * [ ] собрать прототип apollo server & graphql code generator & apollo client + +--- +#68: Шаблон витрины приложений + +* [ ] верхне-правое меню настроек * [ ] Шаблон настроек * [ ] Витрина плагинов * [ ] Витрина приложений * [ ] Выход Витрина: * [ ] первой отдельной записью идет витрина * [ ] установленные приложения отображаются в левом меню * [ ] окно приложения: виджет, настройки, лог + +--- +#67: Собрать прототип лендинга с документацией + + + +--- +#64: Перевести платежи на систему плагинов + + + +--- +#63: Собрать витрину доступных расширений + +* [x] перенести оставшиеся расширения на модули * [x] добавить сущность лога * [x] отключить монго-модель расширений * [x] рефакторинг * [x] собрать API-клиент * [x] построить интерфейс graphql для получения списка доступных плагинов * [x] построить интерфейс мутации graphql для установки плагина * [x] рефакторинг * [x] проверить документирование * [x] установить клиента * [x] модель - стор расширений * [x] загрузка доступных расширений * [x] загрузка установленных расширений * [x] витрина расширений * [x] виджет расширения * [x] проверка аудентификации * [ ] ~~страница просмотра лога расширения~~ * [x] мутация установки расширения * [x] мутация отключения расширения * [x] мутация удаления расширения * [x] страница не установленного расширения (страница установки) * [x] страница установленного расширения, редактирования конфигурации и просмотра логов * [x] страница редактирования конфигурации расширени * [ ] ~~выделить стейт из конфига~~ * [x] ввести проверку конфига при установке * [x] кнопка “назад” в шапке * [x] внести ясность по отсутстующим настройкам * [x] ввести [install.md](http://install.md) с инструкцией по установке * [x] рефакторинг маршрутизатора + +--- +#57: Собрать лендинг на сайт mono + + + +--- +#55: Растащить настройки кооператива и пользовательские + + + +--- +#53: Устранить баг детерменированной регенерации документов + + + +--- +#52: Устранить избыточное сохранение документа при регенерации + +* [x] ввести опцию в параметры генератора * [ ] передать опции сквозь контроллер + +--- +#43: Повесить лоадер на кнопку запуска установки совета + + + +--- +#41: перенести провайдера с adonisJS на nestJS + +* [ ] + +--- +#40: Развернуть облачное хранилище на тест и проде + + + +--- +#39: Собрать пред-генератор документов кооператива для приёма в совете + +* [x] сохранять в облаке в папку кооператива * [x] разбить на 2 папки: PDF / docx * [x] создавать публичную ссылку на docx * [x] возвращать ссылку в задаче + +--- +#38: Баг извлечения повестки в авто-кооперативах + + + +--- +#36: Собрать контроллер оплат ресурсов + +Проверка ресурсов выполняется контроллером кооператива: * при достижении условий автономно каждую минуту * по каждой транзитной транзакции ? Сейчас транзитов еще нет, поэтому, каждую минуту. Возможно, так и оставим потом, чтоб не путать и не путаться. + +--- +#35: Исправить баг отсутствующего потребителя в нотификаторе + + + +--- +#32: Баг обновления состава совета другим советом (сброс состава) + + + +--- +#28: Генерация и подпись соглашения на подключение + +На спецстранице отобразить соглашение на подключение к платформе. Проверить подписано ли оно ранее. Подписав, отправить его администратору. После подписи соглашения, для того, чтобы документ отобразился в разделе документы у пайщика, необходимо принять его администратором. Т.е. администратор должен вызвать метод confirmagree. До этого соглашение считается условно-принятым, т.е. в реестре документов отмечается как newsubmitted, но еще не newresolved, т.е. этот документ еще может и не попасть в реестр финальный. Поэтому, или необходимо изменить приём документов в пользу делать сразу newresolved, тогда документ сразу будет отображен где надо, или вообще изменить подход к подключению. Скорее всего второе. Agreements это соглашения между пайщиками и кооперативом сейчас. У нас же здесь что-то вроде metaAgreement, который заключается между кооперативом и провайдером, и больше он нигде фигурировать не будет. * [x] изменить метод regcoop и структуру orgs для приёма подписанного соглашения на подключение * [x] добавить в regcoop вызов newresolved и newsubmitted * [x] убрать agreements newresolved и newsubmitted из числа общего отображения документов - мы всегда вытаскиваем их связями с заявлениями сейчас и нет смысла плодить их в главном экране. * [x] обновить типы (registrator) * [x] соединить подпись соглашения с вызовом метода создания кооператива * [x] отобразить статус подключения * [x] отобразить документ в реестре после приёма администратором * [x] встроить инструкцию подключения * [x] отобразить документ соглашения на экране подключения администратору * [x] добавить выбор типа извлекаемого документа необязательным параметром (type=submitted | resolved) * [x] разворачивать список сразу, если документ 1 * [x] запросить домен в форме подключения * [x] тест * [x] скорректировать сумму в соглашении * [x] установить обновленные соглашения всех типов на тест * [x] выкатить на тест * [x] фикс бага обновления состояния документа * [x] обновить соглашения на проде * [x] выкатить на прод * [x] обновить переменные на тесте и проде + +--- +#27: Скорректировать отображение воркспейсов и меню + +Воркспейсы по ролям: * пайщик * член совета * председатель * администратор воркспейсы отложим. Сейчас встроим всё в один спейс и уберём меню выбора. radial-gradient(circle, #35a2ff 0%, #014a88 100%)" + +--- +#26: Фикс бага извлечения кооператива из организаций, когда их несколько + + + +--- +#25: Настроить резервное копирование в S3 по расписанию + + + +--- +#24: Убрать кнопку "Утвердить" в совете для членов + + + +--- +#23: Баг временного отображения соглашений на подпись после входа на медленном интернете + + + +--- +#22: Передать, сохранить и использовать параметр ключа на бэкенд при установке и в процессе работы + +При запуске кооператива ему необходим ключ на сервере для осуществления регистраций и прочих сервисных операций. Для этого нам нужно активное разрешение ключа, который необходимо хранить на сервере. В минимальной реализации храним в базе данных. В расширенной переносим хранение ключа в VAULT. Минимальная версия подразумевает создание модели для хранения ключа и операций с ним. Важно, что при восстановлении доступа, ключ будет не действительным. Необходимо переустанавливать ключи, если необходимо. * [x] при установке сохранять ключ в базу set_wif(wif) * [x] использовать ключ из базы get_wif() * [x] отобразить настройку для обновления ключа в базе + +--- +#21: Баг разворота повестки - открываются несколько папок с документами вместо одной + + + +--- +#19: Собрать временное решение поставки ПО на docker + +* [x] собрать плейбук на сборку * [x] риверсировать сайты на маршруты по портам * [x] автовыпуск и обновление сертификатов SSL * [x] параметризировать сборку * [x] перевести продакшн на новую сборку * [x] убрать cloudflare переадресацию http → https для ЦК * [x] настроить punicode параметр для nginx * [x] баг подгрузки данных в nginx на первом старте ??? * [x] параллельный запуск нескольких групп контейнеров * [x] подтереть мусор + +--- +#18: Пройти путь запуска кооператива на тестнете + + + +--- +#14: BUG: ApiError: Invalid time format при добавлении пайщика через админку + +При добавлении пайщика дата не верно передаётся, в объекте при проверке на контроллере уже invalid date. Проверить фронт. + +--- +#13: Восстановить работу деплоя через сборку в semaphore + +Временное решение до выноса переменных окружения в терминале в настройки приложения. Установка: * [x] подключить semaphore на деплой контрактов Миграция: * [x] soviet::createprog * [x] for(draft of drafts) draft::create_draft * [x] soviet::makecoagreement (wallet, signature, user, privacy, coopenomics) * [x] затащить параметры [генератора в .env при деплое ??](http://e.vn)\ \ Контроллер: * [x] установить vars * [x] установить settings + +--- +#9: Построить маршруты создания бакета, загрузки-чтения файлов в-из MINIO + + + +--- +#3: Добавить скролл для страницы реестра пайщиков + + + +--- +#2: Ввести подписки на важное + +использовать subscriptions у graphql + +--- diff --git a/scripts/EXAMPLE.md b/scripts/EXAMPLE.md new file mode 100644 index 00000000000..45ef90b90fb --- /dev/null +++ b/scripts/EXAMPLE.md @@ -0,0 +1 @@ +./generate-release.sh 2025-04-01 v2.2.11 "фокус на новых фичах и улучшении UX" --open diff --git a/scripts/generate-release.sh b/scripts/generate-release.sh new file mode 100755 index 00000000000..36492766a39 --- /dev/null +++ b/scripts/generate-release.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +START_DATE="$1" +VERSION="$2" +FOCUS="$3" +OPEN="$4" + +PROMPT_FILE="changelog-prompt.txt" +OUTPUT_FILE="changelog-release.md" + +if [ -z "$START_DATE" ] || [ -z "$VERSION" ]; then + echo "Использование: ./generate-full-changelog.sh [focus] [--open]" + exit 1 +fi + +if [ -z "$OPENAI_API_KEY" ]; then + echo "❌ Переменная окружения OPENAI_API_KEY не задана" + exit 1 +fi + +echo "📥 Сбор закрытых issue после $START_DATE..." + +ISSUES=$( + gh issue list --state closed --limit 1000 --json number,title,body,closedAt \ + --jq ".[] | select(.closedAt >= \"$START_DATE\") | \"#\(.number): \(.title)\n\n\(.body | gsub(\"\\n\"; \" \"))\n\n---\"" +) + +if [ -z "$ISSUES" ]; then + echo "❌ Нет закрытых issue после $START_DATE" + exit 0 +fi + +# Формирование промпта +cat < "$PROMPT_FILE" +Сгенерируй changelog для версии $VERSION. + +Правила: +- Начинай changelog заголовком: "# MONO $VERSION" +- Затем добавь краткое текстовое описание релиза (1–3 строки), основанное на комментарии разработчика. Не копируй комментарий дословно. Используй его только как ориентир для формулировки описания. +- Не добавляй ничего от себя, не используй мотивационные или маркетинговые фразы. +- После описания сгруппируй изменения по категориям: + ✨ Новые функции + 🐛 Исправления ошибок + 🔧 Улучшения +- Каждый пункт списка должен указывать номер issue как markdown-ссылку на https://github.com/coopenomics/mono/issues/Номер (например: [#123](https://github.com/coopenomics/mono/issues/123)) +- Пиши кратко, строго и по делу. + +EOF + +if [ -n "$FOCUS" ]; then + echo "Комментарий разработчика для описания релиза: $FOCUS" >> "$PROMPT_FILE" +fi + +cat <> "$PROMPT_FILE" + +Ниже список закрытых issues, начиная с $START_DATE: + +$ISSUES +EOF + +echo "✅ Промпт сохранён в $PROMPT_FILE" + +if [ "$OPEN" == "--open" ]; then + if command -v subl &>/dev/null; then + subl "$PROMPT_FILE" + else + echo "⚠️ 'subl' не найден. Установи CLI для Sublime или открой файл вручную." + fi +fi + +echo "📡 Отправка запроса в OpenAI через HTTP-прокси localhost:801..." + +PROMPT=$(cat "$PROMPT_FILE" | jq -Rs .) + +RESPONSE=$(curl https://api.openai.com/v1/chat/completions \ + -sS \ + -x http://127.0.0.1:801 \ + -H "Authorization: Bearer $OPENAI_API_KEY" \ + -H "Content-Type: application/json" \ + -d "{ + \"model\": \"gpt-4.1\", + \"messages\": [{\"role\": \"user\", \"content\": $PROMPT}], + \"temperature\": 0.7, + \"max_tokens\": 10240 + }") + +echo "$RESPONSE" | jq -r '.choices[0].message.content' > "$OUTPUT_FILE" + +echo "✅ Changelog сохранён в $OUTPUT_FILE" diff --git a/scripts/publish-release.sh b/scripts/publish-release.sh new file mode 100755 index 00000000000..c1b8b9cf431 --- /dev/null +++ b/scripts/publish-release.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +VERSION="$1" + +if [ -z "$VERSION" ]; then + echo "Укажи версию: ./publish-release.sh v2.2.11" + exit 1 +fi + +if [ ! -f changelog-release.md ]; then + echo "Файл changelog-release.md не найден." + exit 1 +fi + +gh release create "$VERSION" -F changelog-release.md -t "Release $VERSION" --verify-tag + +echo "🎉 Release $VERSION опубликован." +