Files
mono/issues.txt
T
2025-04-16 21:42:37 +05:00

436 lines
48 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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) Установить и настроить локальный проект для внесения изменений: <https://github.com/coopenomics/mono> 2) Изучить документацию разработчика: <https://цифровой-кооператив.рф/documentation/> 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
---