make invest statement
This commit is contained in:
@@ -1,10 +0,0 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: true
|
||||
---
|
||||
ВАЖНО!!! Мы работаем в МОНО-репозитории pnpm, любая установка пакетов производится ЧЕРЕЗ ФИЛЬТР компонента в корне: pnpm add glob --filter notificator2.
|
||||
|
||||
ВАЖНО!!! НИКОГДА НЕ ЗАПУСКАЙ ПРИЛОЖЕНИЕ ИЛИ ЕГО СБОРКУ!!! Просто отчитайся что всё сделал.
|
||||
|
||||
ВАЖНО! НИКОГДА НЕ ЗАПУСКАЙ ТЕСТЫ ИЛИ ПРОВЕРКУ ТИПОВ ИЛИ ЛИНТЕР!!!
|
||||
@@ -1,151 +0,0 @@
|
||||
---
|
||||
description:
|
||||
globs: **/controller/**/*.ts
|
||||
alwaysApply: false
|
||||
---
|
||||
# NestJS Controller и Чистая архитектура
|
||||
|
||||
## Основные принципы
|
||||
1. Чистая архитектура - главный архитектурный подход. Пиши код с комментариями.
|
||||
2. Типы IName, IChecksum256, ITimePointSec - это просто строки.
|
||||
3. Домен должен быть полностью изолирован от инфраструктурных деталей.
|
||||
4. Направление зависимостей - внутрь (к ядру, домену).
|
||||
5. Домен, инфраструктура и приложение связаны через App.module, НЕ НУЖНО импортировать их друг в друга, а достаточно просто импортировать домен на уровне приложения чтобы использовать все экспорты домена.
|
||||
|
||||
## Структура проекта
|
||||
- `domain/` - доменный слой (бизнес-логика, независимая от инфраструктуры)
|
||||
- `infrastructure/` - инфраструктурный слой (адаптеры к внешним системам)
|
||||
- `modules/` - слой приложения (DTO, резолверы, сервисы)
|
||||
|
||||
## Слои и их взаимодействие
|
||||
1. **Домен**:
|
||||
- Содержит чистые доменные интерфейсы и реализованные на них сущности
|
||||
- НЕ должен зависеть от `cooptypes` (инфраструктурный контракт)
|
||||
- Использует собственные доменные типы (например, Date вместо строковых timestamp)
|
||||
- Интерфейсы портов описывают взаимодействие с внешними системами
|
||||
|
||||
2. **Инфраструктура**:
|
||||
- Содержит адаптеры к внешним системам (блокчейн, БД и т.д.)
|
||||
- Осуществляет преобразование между доменными и инфраструктурными типами
|
||||
- Общая логика преобразования выносится в утилитарные классы (например, `DomainToBlockchainUtils`)
|
||||
|
||||
3. **Модули (приложение)**:
|
||||
- DTO имплементируют доменные интерфейсы напрямую
|
||||
- Резолвер вызывает сервис, который принимает DTO
|
||||
- Сервис передает объекты DTO в интерактор приложения (юз-кейс)
|
||||
|
||||
## Поток данных
|
||||
1. Резолвер принимает входные данные и передает их в сервис
|
||||
2. Сервис вызывает интерактор приложения (юзкейс), передавая ему объекты DTO (имплементирующие доменный интерфейс)
|
||||
3. Интерактор выполняет бизнес-логику и взаимодействует с портами домена
|
||||
4. Адаптеры (инфраструктурный слой) преобразуют доменные объекты в формат внешних систем (JSON для хранения мета-данных, ISO для дат и т.д.)
|
||||
5. Адаптеры возвращают результаты в домен, домен возвращает данные в сервис, который возвращает их в резолвер
|
||||
|
||||
## Правила преобразования данных
|
||||
1. Преобразование DTO → доменный объект: не требуется, если DTO имплементирует доменный интерфейс
|
||||
2. Преобразование доменный объект → инфраструктурный тип: происходит в адаптерах
|
||||
3. Преобразование документов, дат и других сложных объектов: используются утилитарные классы уровня инфраструктуры
|
||||
|
||||
## Работа с типами данных
|
||||
1. **Даты**:
|
||||
- В доменных интерфейсах используется тип `Date`
|
||||
- В DTO используется тип `Date` с декораторами `@IsDate()` и `@Type(() => Date)`
|
||||
- В инфраструктурном слое происходит преобразование `Date` → `string` (ISO формат)
|
||||
```typescript
|
||||
// Доменный интерфейс
|
||||
interface MeetDomainInterface {
|
||||
open_at: Date;
|
||||
}
|
||||
|
||||
// DTO
|
||||
@Field(() => Date)
|
||||
@IsDate()
|
||||
@Type(() => Date)
|
||||
open_at!: Date;
|
||||
|
||||
// Адаптер
|
||||
const blockchainData = {
|
||||
open_at: domainToBlockchainUtils.convertDateToBlockchainFormat(data.open_at)
|
||||
};
|
||||
```
|
||||
|
||||
2. **Документы**:
|
||||
- В доменных интерфейсах используется собственный тип `SignedDocumentDomainInterface<T>`
|
||||
- В DTO используется соответствующий DTO-класс (например, `SignedDigitalDocumentInputDTO`)
|
||||
- В инфраструктурном слое происходит преобразование между форматами (meta-поля в JSON и т.д.)
|
||||
|
||||
## Типовые ошибки
|
||||
1. **Нарушение изоляции домена**: домен должен быть изолирован от инфраструктуры. Не используйте импорты из `cooptypes` в доменных интерфейсах.
|
||||
```typescript
|
||||
// Неправильно
|
||||
import { MeetContract } from 'cooptypes';
|
||||
export type VoteDomainInterface = MeetContract.Actions.Vote.IInput;
|
||||
|
||||
// Правильно
|
||||
export interface VoteDomainInterface {
|
||||
coopname: string;
|
||||
hash: string;
|
||||
// ... доменные поля
|
||||
}
|
||||
```
|
||||
|
||||
2. **Преобразование в неправильном слое**: преобразование доменных объектов в инфраструктурные типы должно происходить в адаптерах, а не в доменном слое или сервисе.
|
||||
```typescript
|
||||
// Неправильно (в интеракторе)
|
||||
async vote(data: VoteDomainInterface) {
|
||||
const blockchainData = { ...data, meta: JSON.stringify(data.meta) };
|
||||
// ...
|
||||
}
|
||||
|
||||
// Правильно (в адаптере)
|
||||
async vote(data: VoteDomainInterface) {
|
||||
const blockchainData = this.convertToBlockchainFormat(data);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
3. **Дублирование логики преобразования**: общая логика преобразования должна быть вынесена в утилитарные классы.
|
||||
```typescript
|
||||
// Неправильно (дублирование в разных адаптерах)
|
||||
// В MeetAdapter
|
||||
private convertDoc(doc) { return { ...doc, meta: JSON.stringify(doc.meta) }; }
|
||||
// В BranchAdapter
|
||||
private convertDoc(doc) { return { ...doc, meta: JSON.stringify(doc.meta) }; }
|
||||
|
||||
// Правильно (общий утилитарный класс)
|
||||
// DomainToBlockchainUtils
|
||||
convertSignedDocumentToBlockchainFormat(doc) {
|
||||
return { ...doc, meta: JSON.stringify(doc.meta) };
|
||||
}
|
||||
```
|
||||
|
||||
## Примеры
|
||||
```typescript
|
||||
// Доменный интерфейс - чистый, без зависимостей от инфраструктуры
|
||||
export interface VoteOnAnnualGeneralMeetInputDomainInterface {
|
||||
coopname: string;
|
||||
hash: string;
|
||||
member: string;
|
||||
ballot: VoteItemInputDomainInterface[];
|
||||
}
|
||||
|
||||
// DTO имплементирует доменный интерфейс напрямую
|
||||
@InputType('VoteOnAnnualGeneralMeetInput')
|
||||
export class VoteOnAnnualGeneralMeetInputDTO implements VoteOnAnnualGeneralMeetInputDomainInterface {
|
||||
@Field(() => String)
|
||||
@IsString()
|
||||
coopname!: string;
|
||||
// ... остальные поля
|
||||
}
|
||||
|
||||
// Адаптер преобразует доменный объект в инфраструктурный тип
|
||||
async vote(data: VoteOnAnnualGeneralMeetInputDomainInterface): Promise<TransactionResult> {
|
||||
// Преобразуем доменный объект в инфраструктурный тип
|
||||
const blockchainData: MeetContract.Actions.Vote.IInput = {
|
||||
coopname: data.coopname,
|
||||
hash: data.hash,
|
||||
// ... преобразование других полей
|
||||
};
|
||||
// ... отправка данных во внешнюю систему
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
description: Общие правила
|
||||
alwaysApply: true
|
||||
---
|
||||
Мы работаем в МОНО-репозитории pnpm, любая установка пакетов производится ЧЕРЕЗ ФИЛЬТР компонента в корне: pnpm add glob --filter <package>.
|
||||
|
||||
НИКОГДА НЕ ЗАПУСКАЙ ПРИЛОЖЕНИЕ ИЛИ ЕГО СБОРКУ!!! Просто отчитайся что всё сделал.
|
||||
|
||||
НИКОГДА НЕ ЗАПУСКАЙ ТЕСТЫ ИЛИ ПРОВЕРКУ ТИПОВ ИЛИ ЛИНТЕР!!!
|
||||
|
||||
Никаких ANY типов! Строгая типизация всегда.
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
description: О правилах на бэкенде
|
||||
globs: **/controller/**/*.ts
|
||||
---
|
||||
# NestJS Controller и Чистая архитектура
|
||||
|
||||
## Основные принципы
|
||||
1. Чистая архитектура - главный архитектурный подход. Пиши код с комментариями.
|
||||
2. Типы IName, IChecksum256, ITimePointSec - это просто строки.
|
||||
3. Домен должен быть полностью изолирован от инфраструктурных деталей.
|
||||
4. Направление зависимостей - внутрь (к ядру, домену).
|
||||
5. Домен, инфраструктура и приложение связаны через App.module, НЕ НУЖНО импортировать их друг в друга, а достаточно просто импортировать домен на уровне приложения чтобы использовать все экспорты домена.
|
||||
|
||||
## Структура проекта
|
||||
- `domain/` - доменный слой (бизнес-логика, независимая от инфраструктуры)
|
||||
- `infrastructure/` - инфраструктурный слой (адаптеры к внешним системам)
|
||||
- `modules/` - слой приложения (DTO, резолверы, сервисы)
|
||||
|
||||
## Слои и их взаимодействие
|
||||
1. **Домен**:
|
||||
- Содержит чистые доменные интерфейсы и реализованные на них сущности
|
||||
- НЕ должен зависеть от `cooptypes` (инфраструктурный контракт)
|
||||
- Использует собственные доменные типы (например, Date вместо строковых timestamp)
|
||||
- Интерфейсы портов описывают взаимодействие с внешними системами
|
||||
|
||||
2. **Инфраструктура**:
|
||||
- Содержит адаптеры к внешним системам (блокчейн, БД и т.д.)
|
||||
- Осуществляет преобразование между доменными и инфраструктурными типами
|
||||
- Общая логика преобразования выносится в утилитарные классы (например, `DomainToBlockchainUtils`)
|
||||
|
||||
3. **Модули (приложение)**:
|
||||
- DTO имплементируют доменные интерфейсы напрямую
|
||||
- Резолвер вызывает сервис, который принимает DTO
|
||||
- Сервис передает объекты DTO в интерактор приложения (юз-кейс)
|
||||
|
||||
## Правила
|
||||
|
||||
Чистая фрактальная трехуровневая архитектура срезов домена (domain) и инфраструктуры (infrastructure), оркестрируемая приложением (application). Фрактал раскрывается в расширениях (extensions), каждое из которых также выстраивается по правилам чистой трехуровневой архитектуры срезов домена и инфраструктуры с окрестрацией на уровне своего приложения.
|
||||
|
||||
Общая архитектура связей:
|
||||
- AppResolver -> AppService[DTO<->Domain] -> AppInteractor -> DomainService -> DomainPort <- InfraAdapter -> [при необходимости] AnyAppOrDomainService
|
||||
|
||||
Все сервисы внедряются через инъекцию (DI) с указанием символа реализации. Импорты разрешены только вглубь - к домену. Из домена переход разрешен только в инфраструктуру через порт и его адаптер.
|
||||
|
||||
Прямые импорты без DI запрещены. Импорты из соседних срезов того же архитектурного уровня запрещены. Направление зависимостей от приложения - к домену, от домена через порт в его инфраструктурный адаптер.
|
||||
|
||||
Взаимодействие расширений с основным приложением осуществляется только через порты домена основного приложения.
|
||||
|
||||
Глобальные модули запрещены. В редких случаях сложных циклических зависимостей на период рефакторинга разрешается обоснованно использовать forwardRef.
|
||||
|
||||
Уровень приложения оркестрирует вызовы доменов через порты в инфраструктуру. Домены не обращаются друг к друга. Срезы уровня приложений не обращаются друг к другу, а только вызывают порты домена.
|
||||
|
||||
```
|
||||
+1
@@ -1,4 +1,5 @@
|
||||
---
|
||||
description: О правилах на фронтенде
|
||||
globs: **/desktop/**
|
||||
alwaysApply: false
|
||||
---
|
||||
+1
-2
@@ -1,6 +1,5 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
description: Правила работы с макросом main.py в компоненте docs
|
||||
alwaysApply: false
|
||||
---
|
||||
Файл [main.py](mdc:monocoop/monocoop/monocoop/components/docs/main.py) автоматически генерит ссылки на документацию SDK и GraphQL, которые формируются и публикуются автоматически. При создании документации к методам всегда применяй ссылки на SDK и GraphQL по форме:
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
---
|
||||
description: Правила формирования агрегатов документов в controller
|
||||
alwaysApply: false
|
||||
globs: **/controller/**/*.resolver.ts
|
||||
---
|
||||
## 📋 Правила формирования агрегатов документов
|
||||
|
||||
+2
-3
@@ -1,9 +1,7 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
description: Правила контроля изменений документов в фабрике (factory)
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# Структура файлов шаблонов документов и алгоритм правки
|
||||
|
||||
## Основные директории и файлы
|
||||
@@ -94,3 +92,4 @@ alwaysApply: false
|
||||
- Поддерживаются конструкции: `{% if %}`, `{% for %}`, `{% trans %}`
|
||||
- Переменные вставляются через `{{ variable }}`
|
||||
- Переводы через `{% trans 'KEY' %}`
|
||||
- Дополнительно поддерживается передача переменной в перевод через `{% trans 'KEY', some_var1, some_var2 %}`, при этом в самом переводе необходимо использовать порядковые ключи {0}, {1} для доступа к переданным переменным.
|
||||
+1
-2
@@ -1,6 +1,5 @@
|
||||
---
|
||||
description:
|
||||
globs: **/controller/src/extensions/**
|
||||
description: Архитектура и правила расширений extensions в controller
|
||||
alwaysApply: false
|
||||
---
|
||||
# Архитектура расширений в MonoCoop
|
||||
+1
@@ -1,4 +1,5 @@
|
||||
---
|
||||
description: Создание шаблона документа без шапки из его основной версии в фабрике документов
|
||||
alwaysApply: false
|
||||
---
|
||||
Смотри, у меня есть проект документа оферты, @cooptypes/src/cooperative/registry/999.BlagorostOfferTemplate/index.ts мы его принимаем затем, чтобы получить данные для генерации @cooptypes/src/cooperative/registry/1000.BlagorostOffer/index.ts уже самой пользовательской оферты. Они в целом почти абсолютно идентичны за той лишь разницей, что в проекте кругом прочерки остаются вместо переменных для заполнения, и нет шапки с надписью "УТВЕРЖДЕНО" протоколом решения № ___ и дата ___. Т.е. мы как бы из первого в итоге получаем второе. Приняв первое - мы можем начать генерировать второе.
|
||||
+1
-2
@@ -1,6 +1,5 @@
|
||||
---
|
||||
description:
|
||||
globs: src/**/*.ts
|
||||
description: Правила работы с фабрикой документов кооперативов (factory)
|
||||
alwaysApply: false
|
||||
---
|
||||
# Фабрика Документов Кооперативов
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
---
|
||||
globs: **/controller/**/*.ts
|
||||
description: Логирование и логгер на бэкенде (controller)
|
||||
alwaysApply: false
|
||||
---
|
||||
# Logger Rule
|
||||
@@ -1,9 +1,8 @@
|
||||
---
|
||||
description:
|
||||
globs: components/sdk/**
|
||||
description: Как добавлять селекторы, мутации и запросы в SDK
|
||||
globs: **/sdk/**
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# Руководство по работе с GraphQL Zeus в SDK
|
||||
|
||||
## Основной процесс
|
||||
@@ -4403,7 +4403,7 @@ input CreateProjectInvestInput {
|
||||
project_hash: String!
|
||||
|
||||
"""Заявление на инвестирование"""
|
||||
statement: SignedDigitalDocumentInput!
|
||||
statement: GenerationMoneyInvestStatementSignedDocumentInput!
|
||||
|
||||
"""Имя инвестора"""
|
||||
username: String!
|
||||
@@ -5631,6 +5631,117 @@ input GenerationContractSignedMetaDocumentInput {
|
||||
version: String!
|
||||
}
|
||||
|
||||
input GenerationMoneyInvestStatementGenerateDocumentInput {
|
||||
"""Сумма инвестирования"""
|
||||
amount: String!
|
||||
|
||||
"""Номер блока, на котором был создан документ"""
|
||||
block_num: Int
|
||||
|
||||
"""Название кооператива, связанное с документом"""
|
||||
coopname: String!
|
||||
|
||||
"""Дата и время создания документа"""
|
||||
created_at: String
|
||||
|
||||
"""Имя генератора, использованного для создания документа"""
|
||||
generator: String
|
||||
|
||||
"""Язык документа"""
|
||||
lang: String
|
||||
|
||||
"""Ссылки, связанные с документом"""
|
||||
links: [String!]
|
||||
|
||||
"""Хэш проекта"""
|
||||
project_hash: String!
|
||||
|
||||
"""Часовой пояс, в котором был создан документ"""
|
||||
timezone: String
|
||||
|
||||
"""Название документа"""
|
||||
title: String
|
||||
|
||||
"""Имя пользователя, создавшего документ"""
|
||||
username: String!
|
||||
|
||||
"""Версия генератора, использованного для создания документа"""
|
||||
version: String
|
||||
}
|
||||
|
||||
input GenerationMoneyInvestStatementSignedDocumentInput {
|
||||
"""Хэш содержимого документа"""
|
||||
doc_hash: String!
|
||||
|
||||
"""Общий хэш (doc_hash + meta_hash)"""
|
||||
hash: String!
|
||||
|
||||
"""Метаинформация для документа заявления об инвестировании в генерацию"""
|
||||
meta: GenerationMoneyInvestStatementSignedMetaDocumentInput!
|
||||
|
||||
"""Хэш мета-данных"""
|
||||
meta_hash: String!
|
||||
|
||||
"""Вектор подписей"""
|
||||
signatures: [SignatureInfoInput!]!
|
||||
|
||||
"""Версия стандарта документа"""
|
||||
version: String!
|
||||
}
|
||||
|
||||
input GenerationMoneyInvestStatementSignedMetaDocumentInput {
|
||||
"""Сумма инвестирования"""
|
||||
amount: String!
|
||||
|
||||
"""Дата создания приложения к проекту"""
|
||||
appendix_created_at: String!
|
||||
|
||||
"""Хэш приложения к проекту"""
|
||||
appendix_hash: String!
|
||||
|
||||
"""Номер блока, на котором был создан документ"""
|
||||
block_num: Int!
|
||||
|
||||
"""Дата создания участника"""
|
||||
contributor_created_at: String!
|
||||
|
||||
"""Хэш участника"""
|
||||
contributor_hash: String!
|
||||
|
||||
"""Название кооператива, связанное с документом"""
|
||||
coopname: String!
|
||||
|
||||
"""Дата и время создания документа"""
|
||||
created_at: String!
|
||||
|
||||
"""Имя генератора, использованного для создания документа"""
|
||||
generator: String!
|
||||
|
||||
"""Язык документа"""
|
||||
lang: String!
|
||||
|
||||
"""Ссылки, связанные с документом"""
|
||||
links: [String!]!
|
||||
|
||||
"""Хэш проекта"""
|
||||
project_hash: String!
|
||||
|
||||
"""ID документа в реестре"""
|
||||
registry_id: Int!
|
||||
|
||||
"""Часовой пояс, в котором был создан документ"""
|
||||
timezone: String!
|
||||
|
||||
"""Название документа"""
|
||||
title: String!
|
||||
|
||||
"""Имя пользователя, создавшего документ"""
|
||||
username: String!
|
||||
|
||||
"""Версия генератора, использованного для создания документа"""
|
||||
version: String!
|
||||
}
|
||||
|
||||
input GetAccountInput {
|
||||
"""Имя аккаунта пользователя"""
|
||||
username: String!
|
||||
@@ -6563,7 +6674,7 @@ type Mutation {
|
||||
capitalGenerateGenerationContract(data: GenerationContractGenerateDocumentInput!, options: GenerateDocumentOptionsInput): GeneratedDocument!
|
||||
|
||||
"""Сгенерировать заявление об инвестировании в генерацию"""
|
||||
capitalGenerateGenerationMoneyInvestStatement(data: GenerateDocumentInput!, options: GenerateDocumentOptionsInput): GeneratedDocument!
|
||||
capitalGenerateGenerationMoneyInvestStatement(data: GenerationMoneyInvestStatementGenerateDocumentInput!, options: GenerateDocumentOptionsInput): GeneratedDocument!
|
||||
|
||||
"""Сгенерировать заявление о возврате неиспользованных средств генерации"""
|
||||
capitalGenerateGenerationMoneyReturnUnusedStatement(data: GenerateDocumentInput!, options: GenerateDocumentOptionsInput): GeneratedDocument!
|
||||
|
||||
+3
-3
@@ -39,7 +39,7 @@ export class ComponentGenerationContractSignedMetaDocumentInputDTO extends Inter
|
||||
) {
|
||||
@Field({ description: 'Хэш дополнения к приложению (для компонента)' })
|
||||
@IsString()
|
||||
component_appendix_hash!: string;
|
||||
appendix_hash!: string;
|
||||
|
||||
@Field({ description: 'Хэш родительского приложения (к родительскому проекту)' })
|
||||
@IsString()
|
||||
@@ -59,7 +59,7 @@ export class ComponentGenerationContractSignedMetaDocumentInputDTO extends Inter
|
||||
|
||||
@Field({ description: 'ID компонента' })
|
||||
@IsString()
|
||||
component_id!: string;
|
||||
component_hash!: string;
|
||||
|
||||
@Field({ description: 'Название проекта' })
|
||||
@IsString()
|
||||
@@ -67,7 +67,7 @@ export class ComponentGenerationContractSignedMetaDocumentInputDTO extends Inter
|
||||
|
||||
@Field({ description: 'ID проекта' })
|
||||
@IsString()
|
||||
project_id!: string;
|
||||
project_hash!: string;
|
||||
}
|
||||
|
||||
@InputType(`ComponentGenerationContractSignedDocumentInput`)
|
||||
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
import { InputType, Field, IntersectionType, OmitType } from '@nestjs/graphql';
|
||||
import { IsString, IsNotEmpty } from 'class-validator';
|
||||
import { Cooperative } from 'cooptypes';
|
||||
import { GenerateMetaDocumentInputDTO } from '~/application/document/dto/generate-meta-document-input.dto';
|
||||
import { MetaDocumentInputDTO } from '~/application/document/dto/meta-document-input.dto';
|
||||
import { SignedDigitalDocumentInputDTO } from '~/application/document/dto/signed-digital-document-input.dto';
|
||||
|
||||
// утилита для выборки повторяющихся параметров из базовых интерфейсов
|
||||
type ExcludeCommonProps<T> = Omit<T, 'coopname' | 'username' | 'registry_id' | 'block_num' | 'lang'>;
|
||||
|
||||
// интерфейс параметров для генерации
|
||||
type action = Cooperative.Registry.GenerationMoneyInvestStatement.Action;
|
||||
|
||||
@InputType(`BaseGenerationMoneyInvestStatementMetaDocumentInput`)
|
||||
class BaseGenerationMoneyInvestStatementMetaDocumentInputDTO implements ExcludeCommonProps<Pick<action, 'project_hash' | 'amount'>> {
|
||||
@Field({ description: 'Хэш проекта' })
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
project_hash!: string;
|
||||
|
||||
@Field({ description: 'Сумма инвестирования' })
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
amount!: string;
|
||||
}
|
||||
|
||||
@InputType(`GenerationMoneyInvestStatementGenerateDocumentInput`)
|
||||
export class GenerationMoneyInvestStatementGenerateDocumentInputDTO extends IntersectionType(
|
||||
BaseGenerationMoneyInvestStatementMetaDocumentInputDTO,
|
||||
OmitType(GenerateMetaDocumentInputDTO, ['registry_id'] as const)
|
||||
) {
|
||||
registry_id!: number;
|
||||
}
|
||||
|
||||
@InputType(`GenerationMoneyInvestStatementSignedMetaDocumentInput`)
|
||||
export class GenerationMoneyInvestStatementSignedMetaDocumentInputDTO extends IntersectionType(
|
||||
BaseGenerationMoneyInvestStatementMetaDocumentInputDTO,
|
||||
MetaDocumentInputDTO
|
||||
) {
|
||||
@Field({ description: 'Хэш приложения к проекту' })
|
||||
@IsString()
|
||||
appendix_hash!: string;
|
||||
|
||||
@Field({ description: 'Дата создания приложения к проекту' })
|
||||
@IsString()
|
||||
appendix_created_at!: string;
|
||||
|
||||
@Field({ description: 'Хэш участника' })
|
||||
@IsString()
|
||||
contributor_hash!: string;
|
||||
|
||||
@Field({ description: 'Дата создания участника' })
|
||||
@IsString()
|
||||
contributor_created_at!: string;
|
||||
}
|
||||
|
||||
@InputType(`GenerationMoneyInvestStatementSignedDocumentInput`)
|
||||
export class GenerationMoneyInvestStatementSignedDocumentInputDTO extends SignedDigitalDocumentInputDTO {
|
||||
@Field(() => GenerationMoneyInvestStatementSignedMetaDocumentInputDTO, {
|
||||
description: 'Метаинформация для документа заявления об инвестировании в генерацию',
|
||||
})
|
||||
public readonly meta!: GenerationMoneyInvestStatementSignedMetaDocumentInputDTO;
|
||||
}
|
||||
+1
-1
@@ -50,7 +50,7 @@ export class ProjectGenerationContractSignedMetaDocumentInputDTO extends Interse
|
||||
|
||||
@Field({ description: 'ID проекта' })
|
||||
@IsString()
|
||||
project_id!: string;
|
||||
project_hash!: string;
|
||||
}
|
||||
|
||||
@InputType(`ProjectGenerationContractSignedDocumentInput`)
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
export enum ProgramKey {
|
||||
/** Программа Генерация - вклад временем, имуществом или деньгами в конкретные проекты */
|
||||
GENERATION = 'generation',
|
||||
GENERATION = 'GENERATION',
|
||||
|
||||
/** Программа Капитализация - вклад имуществом или денег в систему */
|
||||
CAPITALIZATION = 'capitalization',
|
||||
CAPITALIZATION = 'CAPITALIZATION',
|
||||
}
|
||||
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
import { Field, InputType } from '@nestjs/graphql';
|
||||
import { IsNotEmpty, IsString } from 'class-validator';
|
||||
import type { CreateProjectInvestDomainInput } from '~/extensions/capital/domain/actions/create-project-invest-domain-input.interface';
|
||||
import { SignedDigitalDocumentInputDTO } from '~/application/document/dto/signed-digital-document-input.dto';
|
||||
import { Type } from 'class-transformer';
|
||||
import { GenerationMoneyInvestStatementSignedDocumentInputDTO } from '~/application/document/documents-dto/generation-money-invest-statement-document.dto';
|
||||
|
||||
/**
|
||||
* GraphQL DTO для инвестирования в проект CAPITAL контракта
|
||||
@@ -29,7 +29,7 @@ export class CreateProjectInvestInputDTO implements Omit<CreateProjectInvestDoma
|
||||
@IsString({ message: 'Сумма инвестиции должна быть строкой' })
|
||||
amount!: string;
|
||||
|
||||
@Field(() => SignedDigitalDocumentInputDTO, { description: 'Заявление на инвестирование' })
|
||||
@Type(() => SignedDigitalDocumentInputDTO)
|
||||
statement!: SignedDigitalDocumentInputDTO;
|
||||
@Field(() => GenerationMoneyInvestStatementSignedDocumentInputDTO, { description: 'Заявление на инвестирование' })
|
||||
@Type(() => GenerationMoneyInvestStatementSignedDocumentInputDTO)
|
||||
statement!: GenerationMoneyInvestStatementSignedDocumentInputDTO;
|
||||
}
|
||||
|
||||
+6
-5
@@ -24,7 +24,6 @@ import { Throttle } from '@nestjs/throttler';
|
||||
import { AuthRoles } from '~/application/auth/decorators/auth.decorator';
|
||||
import { CurrentUser } from '~/application/auth/decorators/current-user.decorator';
|
||||
import type { MonoAccountDomainInterface } from '~/domain/account/interfaces/mono-account-domain.interface';
|
||||
import { TransactionDTO } from '~/application/common/dto/transaction-result-response.dto';
|
||||
import { StoryOutputDTO } from '../dto/generation/story.dto';
|
||||
import { IssueOutputDTO } from '../dto/generation/issue.dto';
|
||||
import { CommitOutputDTO } from '../dto/generation/commit.dto';
|
||||
@@ -32,6 +31,7 @@ import { CycleOutputDTO } from '../dto/generation/cycle.dto';
|
||||
import { createPaginationResult, PaginationInputDTO, PaginationResult } from '~/application/common/dto/pagination.dto';
|
||||
import { GeneratedDocumentDTO } from '~/application/document/dto/generated-document.dto';
|
||||
import { GenerateDocumentInputDTO } from '~/application/document/dto/generate-document-input.dto';
|
||||
import { GenerationMoneyInvestStatementGenerateDocumentInputDTO } from '~/application/document/documents-dto/generation-money-invest-statement-document.dto';
|
||||
import { GenerateDocumentOptionsInputDTO } from '~/application/document/dto/generate-document-options-input.dto';
|
||||
|
||||
// Пагинированные результаты
|
||||
@@ -358,12 +358,13 @@ export class GenerationResolver {
|
||||
@UseGuards(GqlJwtAuthGuard, RolesGuard)
|
||||
@AuthRoles(['chairman', 'member'])
|
||||
async generateGenerationMoneyInvestStatement(
|
||||
@Args('data', { type: () => GenerateDocumentInputDTO })
|
||||
data: GenerateDocumentInputDTO,
|
||||
@Args('data', { type: () => GenerationMoneyInvestStatementGenerateDocumentInputDTO })
|
||||
data: GenerationMoneyInvestStatementGenerateDocumentInputDTO,
|
||||
@Args('options', { type: () => GenerateDocumentOptionsInputDTO, nullable: true })
|
||||
options: GenerateDocumentOptionsInputDTO
|
||||
options: GenerateDocumentOptionsInputDTO,
|
||||
@CurrentUser() currentUser: MonoAccountDomainInterface
|
||||
): Promise<GeneratedDocumentDTO> {
|
||||
return this.generationService.generateGenerationMoneyInvestStatement(data, options);
|
||||
return this.generationService.generateGenerationMoneyInvestStatement(data, options, currentUser);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+10
-4
@@ -29,7 +29,6 @@ import { IssueOutputDTO } from '../dto/generation/issue.dto';
|
||||
import { CommitOutputDTO } from '../dto/generation/commit.dto';
|
||||
import { CycleOutputDTO } from '../dto/generation/cycle.dto';
|
||||
import { PaginationInputDTO, PaginationResult } from '~/application/common/dto/pagination.dto';
|
||||
import type { TransactResult } from '@wharfkit/session';
|
||||
import { StoryStatus } from '../../domain/enums/story-status.enum';
|
||||
import { IssuePriority } from '../../domain/enums/issue-priority.enum';
|
||||
import { IssueStatus } from '../../domain/enums/issue-status.enum';
|
||||
@@ -43,8 +42,10 @@ import type { ICycleDatabaseData } from '../../domain/interfaces/cycle-database.
|
||||
import { GenerateDocumentOptionsInputDTO } from '~/application/document/dto/generate-document-options-input.dto';
|
||||
import { GeneratedDocumentDTO } from '~/application/document/dto/generated-document.dto';
|
||||
import { GenerateDocumentInputDTO } from '~/application/document/dto/generate-document-input.dto';
|
||||
import { GenerationMoneyInvestStatementGenerateDocumentInputDTO } from '~/application/document/documents-dto/generation-money-invest-statement-document.dto';
|
||||
import { DocumentInteractor } from '~/application/document/interactors/document.interactor';
|
||||
import { Cooperative } from 'cooptypes';
|
||||
import { InvestsManagementInteractor } from '../use-cases/invests-management.interactor';
|
||||
import { IssuePermissionsService } from './issue-permissions.service';
|
||||
import { PermissionsService } from './permissions.service';
|
||||
import { ProjectMapperService } from './project-mapper.service';
|
||||
@@ -88,6 +89,7 @@ export class GenerationService {
|
||||
private readonly contributorRepository: ContributorRepository,
|
||||
private readonly issueIdGenerationService: IssueIdGenerationService,
|
||||
private readonly documentInteractor: DocumentInteractor,
|
||||
private readonly investsManagementInteractor: InvestsManagementInteractor,
|
||||
private readonly issuePermissionsService: IssuePermissionsService,
|
||||
private readonly permissionsService: PermissionsService,
|
||||
private readonly projectMapperService: ProjectMapperService,
|
||||
@@ -711,12 +713,16 @@ export class GenerationService {
|
||||
* Генерация заявления об инвестировании в генерацию
|
||||
*/
|
||||
async generateGenerationMoneyInvestStatement(
|
||||
data: GenerateDocumentInputDTO,
|
||||
options: GenerateDocumentOptionsInputDTO
|
||||
data: GenerationMoneyInvestStatementGenerateDocumentInputDTO,
|
||||
options: GenerateDocumentOptionsInputDTO,
|
||||
currentUser: MonoAccountDomainInterface
|
||||
): Promise<GeneratedDocumentDTO> {
|
||||
// Подготавливаем данные через интерактор
|
||||
const enrichedData = await this.investsManagementInteractor.prepareGenerationMoneyInvestStatementData(data, currentUser);
|
||||
|
||||
const document = await this.documentInteractor.generateDocument({
|
||||
data: {
|
||||
...data,
|
||||
...enrichedData,
|
||||
registry_id: Cooperative.Registry.GenerationMoneyInvestStatement.registry_id,
|
||||
},
|
||||
options,
|
||||
|
||||
+75
@@ -5,6 +5,8 @@ import type { ReturnUnusedDomainInput } from '../../domain/actions/return-unused
|
||||
import type { TransactResult } from '@wharfkit/session';
|
||||
import { INVEST_REPOSITORY, InvestRepository } from '../../domain/repositories/invest.repository';
|
||||
import { PROGRAM_INVEST_REPOSITORY, ProgramInvestRepository } from '../../domain/repositories/program-invest.repository';
|
||||
import { APPENDIX_REPOSITORY, AppendixRepository } from '../../domain/repositories/appendix.repository';
|
||||
import { CONTRIBUTOR_REPOSITORY, ContributorRepository } from '../../domain/repositories/contributor.repository';
|
||||
import { InvestDomainEntity } from '../../domain/entities/invest.entity';
|
||||
import { ProgramInvestDomainEntity } from '../../domain/entities/program-invest.entity';
|
||||
import type { InvestFilterInputDTO } from '../dto/invests_management/invest-filter.input';
|
||||
@@ -16,6 +18,9 @@ import { DomainToBlockchainUtils } from '~/shared/utils/domain-to-blockchain.uti
|
||||
import type { MonoAccountDomainInterface } from '~/domain/account/interfaces/mono-account-domain.interface';
|
||||
import { InvestSyncService } from '../syncers/invest-sync.service';
|
||||
import { WinstonLoggerService } from '~/application/logger/logger-app.service';
|
||||
import { GenerationMoneyInvestStatementGenerateDocumentInputDTO } from '~/application/document/documents-dto/generation-money-invest-statement-document.dto';
|
||||
import { CurrencyValidationUtil } from '~/utils/currency-validation.util';
|
||||
import { Cooperative } from 'cooptypes';
|
||||
|
||||
/**
|
||||
* Интерактор домена для управления инвестициями CAPITAL контракта
|
||||
@@ -30,6 +35,10 @@ export class InvestsManagementInteractor {
|
||||
private readonly investRepository: InvestRepository,
|
||||
@Inject(PROGRAM_INVEST_REPOSITORY)
|
||||
private readonly programInvestRepository: ProgramInvestRepository,
|
||||
@Inject(APPENDIX_REPOSITORY)
|
||||
private readonly appendixRepository: AppendixRepository,
|
||||
@Inject(CONTRIBUTOR_REPOSITORY)
|
||||
private readonly contributorRepository: ContributorRepository,
|
||||
private readonly domainToBlockchainUtils: DomainToBlockchainUtils,
|
||||
private readonly investSyncService: InvestSyncService,
|
||||
private readonly logger: WinstonLoggerService
|
||||
@@ -37,6 +46,72 @@ export class InvestsManagementInteractor {
|
||||
this.logger.setContext(InvestsManagementInteractor.name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Подготавливает данные для генерации заявления об инвестировании в генерацию
|
||||
* Находит соглашения пользователя по project_hash и извлекает родительское соглашение
|
||||
*/
|
||||
async prepareGenerationMoneyInvestStatementData(
|
||||
data: GenerationMoneyInvestStatementGenerateDocumentInputDTO,
|
||||
currentUser: MonoAccountDomainInterface
|
||||
): Promise<Cooperative.Registry.GenerationMoneyInvestStatement.Action> {
|
||||
const projectHash = data.project_hash;
|
||||
if (!projectHash) {
|
||||
throw new Error('project_hash обязателен для генерации заявления об инвестировании');
|
||||
}
|
||||
|
||||
// 1. Находим подтвержденное приложение пользователя по project_hash
|
||||
const userAppendix = await this.appendixRepository.findConfirmedByUsernameAndProjectHash(
|
||||
currentUser.username,
|
||||
projectHash
|
||||
);
|
||||
|
||||
if (!userAppendix) {
|
||||
throw new Error(`Не найдено подтвержденное соглашение пользователя ${currentUser.username} для проекта ${projectHash}`);
|
||||
}
|
||||
|
||||
// 2. Получаем contributor_hash и contributor_created_at из приложения к проекту
|
||||
const contributorHash = userAppendix.appendix?.meta?.contributor_hash;
|
||||
const contributorCreatedAt = userAppendix.appendix?.meta?.contributor_created_at;
|
||||
|
||||
if (!contributorHash || !contributorCreatedAt) {
|
||||
throw new Error('Не найдены данные участника в приложении к проекту');
|
||||
}
|
||||
console.log('userAppendix.appendix?.meta', userAppendix.appendix?.meta)
|
||||
// 3. Получаем parent_hash из метаданных документа приложения к проекту
|
||||
const parentAppendixHash = userAppendix.appendix?.meta?.parent_appendix_hash;
|
||||
|
||||
if (!parentAppendixHash) {
|
||||
throw new Error('Не найден parent_appendix_hash в метаданных приложения к проекту');
|
||||
}
|
||||
|
||||
// 4. Находим родительское приложение по parent_appendix_hash
|
||||
const parentAppendix = await this.appendixRepository.findByAppendixHash(parentAppendixHash);
|
||||
|
||||
if (!parentAppendix) {
|
||||
throw new Error(`Не найдено родительское соглашение с hash ${parentAppendixHash}`);
|
||||
}
|
||||
|
||||
// 5. Получаем created_at из метаданных родительского документа
|
||||
const appendixCreatedAt = parentAppendix.appendix?.meta?.created_at;
|
||||
|
||||
if (!appendixCreatedAt) {
|
||||
throw new Error('Не найдена дата создания родительского соглашения');
|
||||
}
|
||||
|
||||
// Проверяем, что amount содержит правильный символ валюты
|
||||
CurrencyValidationUtil.validateCurrencySymbol(data.amount, 'сумме инвестирования');
|
||||
|
||||
// 6. Возвращаем enriched data с данными родительского соглашения
|
||||
return {
|
||||
...data,
|
||||
appendix_hash: parentAppendix.appendix_hash,
|
||||
appendix_created_at: appendixCreatedAt,
|
||||
contributor_hash: contributorHash,
|
||||
contributor_created_at: contributorCreatedAt,
|
||||
project_hash: projectHash,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Инвестирование в проект CAPITAL контракта
|
||||
*/
|
||||
|
||||
+7
-5
@@ -202,6 +202,7 @@ export class ParticipationManagementInteractor {
|
||||
* Теперь принимает минимальный набор данных и подписанный документ
|
||||
*/
|
||||
async makeClearance(data: MakeClearanceInputDTO): Promise<TransactResult> {
|
||||
console.log('data', data)
|
||||
// Извлекаем документ из базы данных для верификации
|
||||
const document = await this.documentInteractor.getDocumentByHash(
|
||||
data.document.doc_hash
|
||||
@@ -217,6 +218,7 @@ export class ParticipationManagementInteractor {
|
||||
// Извлекаем appendix_hash из метаданных документа
|
||||
const appendix_hash = (document.meta as any).appendix_hash;
|
||||
|
||||
//TODO: адаптировать или документ или код ниже к parent_appendix_hash
|
||||
if (!appendix_hash) {
|
||||
throw new HttpApiError(
|
||||
httpStatus.BAD_REQUEST,
|
||||
@@ -415,7 +417,7 @@ export class ParticipationManagementInteractor {
|
||||
contributor_hash: contributor.contributor_hash,
|
||||
contributor_created_at: contributor.created_at,
|
||||
project_name: project.title || project.data || '',
|
||||
project_id: project.project_hash,
|
||||
project_hash: project.project_hash,
|
||||
};
|
||||
|
||||
// 6. Генерируем документ
|
||||
@@ -504,7 +506,7 @@ export class ParticipationManagementInteractor {
|
||||
}
|
||||
|
||||
// 7. Генерируем уникальный хэш для дополнения к приложению
|
||||
const component_appendix_hash = generateUniqueHash();
|
||||
const appendix_hash = generateUniqueHash();
|
||||
|
||||
// 8. Формируем данные для генерации документа
|
||||
const documentData = {
|
||||
@@ -512,14 +514,14 @@ export class ParticipationManagementInteractor {
|
||||
username: data.username,
|
||||
lang: data.lang || 'ru',
|
||||
registry_id: Cooperative.Registry.ComponentGenerationContract.registry_id,
|
||||
component_appendix_hash,
|
||||
appendix_hash,
|
||||
parent_appendix_hash: parentAppendix.appendix_hash,
|
||||
contributor_hash: contributor.contributor_hash,
|
||||
contributor_created_at: contributor.created_at,
|
||||
component_name: component.title || component.data || '',
|
||||
component_id: component.project_hash,
|
||||
component_hash: component.project_hash,
|
||||
project_name: parentProject.title || parentProject.data || '',
|
||||
project_id: parentProject.project_hash,
|
||||
project_hash: parentProject.project_hash,
|
||||
};
|
||||
|
||||
// 9. Генерируем документ
|
||||
|
||||
@@ -74,6 +74,44 @@ export class GraphQLExceptionFilter implements GqlExceptionFilter {
|
||||
}
|
||||
}
|
||||
|
||||
// Обработка GraphQL Validation ошибок (например, несоответствие типов переменных)
|
||||
else if (exception instanceof GraphQLError && exception.message.includes('used in position expecting type')) {
|
||||
statusCode = HttpStatus.BAD_REQUEST;
|
||||
message = exception.message;
|
||||
|
||||
// Специальное логирование для ошибок типов GraphQL
|
||||
logger.error({
|
||||
message: `GraphQL Type Validation Error: ${message}`,
|
||||
statusCode,
|
||||
stack: exception.stack,
|
||||
username: user?.username || null,
|
||||
operation: operationName || null,
|
||||
field: fieldName || null,
|
||||
path: path || null,
|
||||
locations: exception.locations || locations,
|
||||
extensions: exception.extensions,
|
||||
originalError: exception.originalError?.message || null,
|
||||
});
|
||||
}
|
||||
// Обработка других GraphQLError
|
||||
else if (exception instanceof GraphQLError) {
|
||||
statusCode = HttpStatus.BAD_REQUEST;
|
||||
message = exception.message;
|
||||
|
||||
// Логируем все GraphQL ошибки для отладки
|
||||
logger.error({
|
||||
message: `GraphQL Error: ${message}`,
|
||||
statusCode,
|
||||
stack: exception.stack,
|
||||
username: user?.username || null,
|
||||
operation: operationName || null,
|
||||
field: fieldName || null,
|
||||
path: path || null,
|
||||
locations: exception.locations || locations,
|
||||
extensions: exception.extensions,
|
||||
originalError: exception.originalError?.message || null,
|
||||
});
|
||||
}
|
||||
// Обработка конкретных типов исключений
|
||||
else if (exception instanceof RpcError) {
|
||||
message = exception.json.error.details[0].message.replace('assertion failure with message: ', '');
|
||||
@@ -152,6 +190,7 @@ export class GraphQLExceptionFilter implements GqlExceptionFilter {
|
||||
return new GraphQLError(message, {
|
||||
extensions: {
|
||||
code: statusCode,
|
||||
isExecutionError: true, // Флаг для отличия execution ошибок от validation ошибок
|
||||
...(process.env.NODE_ENV === 'development' && { stacktrace: exception.stack }),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -6,6 +6,7 @@ import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
|
||||
import { docDirectiveTransformer } from './directives/doc.directive';
|
||||
import { GraphQLError, GraphQLFormattedError } from 'graphql';
|
||||
import { fieldAuthDirectiveTransformer } from './directives/fieldAuth.directive';
|
||||
import logger from '~/config/logger';
|
||||
|
||||
@Global()
|
||||
@Module({
|
||||
@@ -53,13 +54,27 @@ import { fieldAuthDirectiveTransformer } from './directives/fieldAuth.directive'
|
||||
context.res.locals.errorMessage = message;
|
||||
}
|
||||
|
||||
// Логирование (Unauthorized ошибки уже залогированы в GraphQLExceptionFilter)
|
||||
// if (extensions.code !== 401) {
|
||||
// logger.error({
|
||||
// message: `GraphQL Error: ${message}`,
|
||||
// extensions,
|
||||
// });
|
||||
// }
|
||||
|
||||
// Логирование GraphQL ошибок (только validation ошибки, execution ошибки логируются в GraphQLExceptionFilter)
|
||||
if (extensions.code !== 401 && !formattedError.extensions?.isExecutionError) {
|
||||
// Извлекаем информацию о типе операции из запроса
|
||||
const queryText = context?.req?.body?.query || '';
|
||||
const operationType = queryText.trim().startsWith('mutation') ? 'mutation' :
|
||||
queryText.trim().startsWith('query') ? 'query' :
|
||||
queryText.trim().startsWith('subscription') ? 'subscription' : 'unknown';
|
||||
|
||||
logger.error({
|
||||
message: `GraphQL Error: ${message}`,
|
||||
errorType: message.includes('used in position expecting type') ? 'GRAPHQL_TYPE_VALIDATION' : 'GRAPHQL_VALIDATION',
|
||||
extensions,
|
||||
locations: formattedError.locations,
|
||||
path: formattedError.path,
|
||||
username: context?.req?.user?.username || null,
|
||||
operation: context?.req?.body?.operationName || null,
|
||||
operationType,
|
||||
// Не показываем полный запрос, только тип операции
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
message,
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
import { config } from '~/config';
|
||||
|
||||
/**
|
||||
* Утилитарный класс для валидации валютных сумм
|
||||
* Проверяет соответствие символа валюты конфигурации системы
|
||||
*/
|
||||
export class CurrencyValidationUtil {
|
||||
/**
|
||||
* Проверяет, что сумма содержит правильный символ валюты
|
||||
* @param amount Сумма в формате "число символ" (например, "1000 RUB")
|
||||
* @returns boolean - true если символ валюты правильный
|
||||
*/
|
||||
static hasValidCurrencySymbol(amount: string): boolean {
|
||||
if (!amount || typeof amount !== 'string') {
|
||||
return false;
|
||||
}
|
||||
|
||||
const expectedSymbol = config.blockchain.root_govern_symbol;
|
||||
return amount.includes(expectedSymbol);
|
||||
}
|
||||
|
||||
/**
|
||||
* Валидирует сумму и выбрасывает ошибку, если символ валюты неправильный
|
||||
* @param amount Сумма в формате "число символ" (например, "1000 RUB")
|
||||
* @param fieldName Название поля для сообщения об ошибке (по умолчанию "сумма")
|
||||
* @throws Error если символ валюты неправильный
|
||||
*/
|
||||
static validateCurrencySymbol(amount: string, fieldName = 'сумма'): void {
|
||||
if (!this.hasValidCurrencySymbol(amount)) {
|
||||
const expectedSymbol = config.blockchain.root_govern_symbol;
|
||||
throw new Error(`Неверный символ валюты в ${fieldName}. Ожидался: ${expectedSymbol}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Извлекает символ валюты из суммы
|
||||
* @param amount Сумма в формате "число символ"
|
||||
* @returns string - символ валюты или пустая строка, если не найден
|
||||
*/
|
||||
static extractCurrencySymbol(amount: string): string {
|
||||
if (!amount || typeof amount !== 'string') {
|
||||
return '';
|
||||
}
|
||||
|
||||
const parts = amount.trim().split(' ');
|
||||
return parts.length > 1 ? parts[parts.length - 1] : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Извлекает числовое значение из суммы
|
||||
* @param amount Сумма в формате "число символ"
|
||||
* @returns number - числовое значение или NaN, если не удалось распарсить
|
||||
*/
|
||||
static extractAmountValue(amount: string): number {
|
||||
if (!amount || typeof amount !== 'string') {
|
||||
return NaN;
|
||||
}
|
||||
|
||||
const parts = amount.trim().split(' ');
|
||||
const numericPart = parts.length > 1 ? parts[0] : amount;
|
||||
return parseFloat(numericPart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Форматирует сумму с правильным символом валюты
|
||||
* @param value Числовое значение
|
||||
* @param precision Количество знаков после запятой (по умолчанию из конфига)
|
||||
* @returns string - отформатированная сумма
|
||||
*/
|
||||
static formatAmount(value: number, precision?: number): string {
|
||||
const actualPrecision = precision ?? config.blockchain.root_govern_precision;
|
||||
const symbol = config.blockchain.root_govern_symbol;
|
||||
return `${value.toFixed(actualPrecision)} ${symbol}`;
|
||||
}
|
||||
}
|
||||
@@ -1144,7 +1144,7 @@
|
||||
"required": [
|
||||
"coopname",
|
||||
"decision_id",
|
||||
"project_id",
|
||||
"project_hash",
|
||||
"username"
|
||||
],
|
||||
"properties": {
|
||||
@@ -1172,7 +1172,7 @@
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"project_id": {
|
||||
"project_hash": {
|
||||
"type": "string"
|
||||
},
|
||||
"timezone": {
|
||||
@@ -1793,7 +1793,7 @@
|
||||
"type": "object",
|
||||
"required": [
|
||||
"coopname",
|
||||
"project_id",
|
||||
"project_hash",
|
||||
"username"
|
||||
],
|
||||
"properties": {
|
||||
@@ -1818,7 +1818,7 @@
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"project_id": {
|
||||
"project_hash": {
|
||||
"type": "string"
|
||||
},
|
||||
"timezone": {
|
||||
@@ -1867,7 +1867,7 @@
|
||||
"generator",
|
||||
"lang",
|
||||
"links",
|
||||
"project_id",
|
||||
"project_hash",
|
||||
"registry_id",
|
||||
"timezone",
|
||||
"title",
|
||||
@@ -1893,7 +1893,7 @@
|
||||
"links": {
|
||||
"type": "string"
|
||||
},
|
||||
"project_id": {
|
||||
"project_hash": {
|
||||
"type": "string"
|
||||
},
|
||||
"registry_id": {
|
||||
@@ -3869,4 +3869,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -10,7 +10,7 @@ export interface Action extends IGenerate {
|
||||
contributor_hash: string
|
||||
contributor_created_at: string
|
||||
project_name: string
|
||||
project_id: string
|
||||
project_hash: string
|
||||
}
|
||||
|
||||
export type Meta = IMetaDocument & Action
|
||||
@@ -27,13 +27,13 @@ export interface Model {
|
||||
short_contributor_hash: string
|
||||
contributor_created_at: string
|
||||
project_name: string
|
||||
project_id: string
|
||||
project_hash: string
|
||||
}
|
||||
|
||||
export const title = 'Приложение к договору участия в проекте'
|
||||
export const description = 'Приложение к договору участия в хозяйственной деятельности для проектов'
|
||||
|
||||
export const context = `<div class="digital-document"><div style="text-align: center"><h1>ПРИЛОЖЕНИЕ № {{ short_appendix_hash }}</h1><h2>к Договору об участии в хозяйственной деятельности № УХД-{{ short_contributor_hash }}</h2></div><p style="text-align: right">{{ meta.created_at }}, {{ coop.city }}</p><p>{% trans 'parties_intro' %} "{{ vars.name }}" {% trans 'in_face_of_chairman' %} {{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}, {% trans 'acting_on_basis_of_charter' %}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'society' %}", {% trans 'and_participant' %} {{ user.full_name_or_short_name }}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'participant' %}", {% trans 'jointly_referred_to_as' %} "{% trans 'parties' %}", {% trans 'have_concluded_this_appendix' %} {% trans 'hereinafter_referred_to_as' %} "{% trans 'appendix' %}" {% trans 'to_agreement' %} УХД-{{ short_contributor_hash }} {% trans 'from_date' %} {{ contributor_created_at }} {% trans 'of_the_following' %}:</p><p>{% trans 'according_to_regulations' %} "{{ vars.generation_contract_template.protocol_number }}" {% trans 'from_date' %} {{ vars.generation_contract_template.protocol_day_month_year }}), {% trans 'participant_commits_project' %} "{{ project_name }}" (№{{ project_id }}).</p><h2>{% trans 'details_and_signatures_of_parties' %}</h2><p><strong>{% trans 'society' %}/{{ vars.full_abbr }} "{{ vars.name }}"/:</strong></p><p>ИНН {{ coop.details.inn }}, КПП {{ coop.details.kpp }}, ОГРН {{ coop.details.ogrn }}</p><p>{% trans 'legal_address' %}: {{ coop.full_address }}</p><p>{% trans 'contact_phone' %}: {{ coop.phone }}</p><p>{% trans 'email' %}: {{ coop.email }}</p><p>{% trans 'bank_account' %}: {{ coop.defaultBankAccount.account_number }}</p><p>{% trans 'bank_name' %}: {{ coop.defaultBankAccount.bank_name }}</p><p>{% trans 'bik' %}: {{ coop.defaultBankAccount.details.bik }}</p><p>{% trans 'correspondent_account' %}: {{ coop.defaultBankAccount.details.corr }}</p><p>{% trans 'chairman' %} {{ vars.full_abbr_genitive }} "{{ vars.name }}"</p><p>{{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}</p><p>{% trans 'signed_by_digital_signature' %}</p><p><strong>{% trans 'participant' %}:</strong></p><p>{{ user.full_name_or_short_name }}</p><p>{% trans 'contact_phone' %}: {{ user.phone }}</p><p>{% trans 'email' %}: {{ user.email }}</p><p>{% trans 'signed_by_digital_signature' %}</p></div><style>.digital-document {padding: 20px;white-space: pre-wrap;}</style>`
|
||||
export const context = `<div class="digital-document"><div style="text-align: center"><h1>ПРИЛОЖЕНИЕ № {{ short_appendix_hash }}</h1><h2>к Договору об участии в хозяйственной деятельности № УХД-{{ short_contributor_hash }}</h2></div><p style="text-align: right">{{ meta.created_at }}, {{ coop.city }}</p><p>{% trans 'parties_intro' %} "{{ vars.name }}" {% trans 'in_face_of_chairman' %} {{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}, {% trans 'acting_on_basis_of_charter' %}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'society' %}", {% trans 'and_participant' %} {{ user.full_name_or_short_name }}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'participant' %}", {% trans 'jointly_referred_to_as' %} "{% trans 'parties' %}", {% trans 'have_concluded_this_appendix' %} {% trans 'hereinafter_referred_to_as' %} "{% trans 'appendix' %}" {% trans 'to_agreement' %} УХД-{{ short_contributor_hash }} {% trans 'from_date' %} {{ contributor_created_at }} {% trans 'of_the_following' %}:</p><p>{% trans 'according_to_regulations' %} "{{ vars.generation_contract_template.protocol_number }}" {% trans 'from_date' %} {{ vars.generation_contract_template.protocol_day_month_year }}), {% trans 'participant_commits_project' %} "{{ project_name }}" (№{{ project_hash }}).</p><h2>{% trans 'details_and_signatures_of_parties' %}</h2><p><strong>{% trans 'society' %}/{{ vars.full_abbr }} "{{ vars.name }}"/:</strong></p><p>ИНН {{ coop.details.inn }}, КПП {{ coop.details.kpp }}, ОГРН {{ coop.details.ogrn }}</p><p>{% trans 'legal_address' %}: {{ coop.full_address }}</p><p>{% trans 'contact_phone' %}: {{ coop.phone }}</p><p>{% trans 'email' %}: {{ coop.email }}</p><p>{% trans 'bank_account' %}: {{ coop.defaultBankAccount.account_number }}</p><p>{% trans 'bank_name' %}: {{ coop.defaultBankAccount.bank_name }}</p><p>{% trans 'bik' %}: {{ coop.defaultBankAccount.details.bik }}</p><p>{% trans 'correspondent_account' %}: {{ coop.defaultBankAccount.details.corr }}</p><p>{% trans 'chairman' %} {{ vars.full_abbr_genitive }} "{{ vars.name }}"</p><p>{{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}</p><p>{% trans 'signed_by_digital_signature' %}</p><p><strong>{% trans 'participant' %}:</strong></p><p>{{ user.full_name_or_short_name }}</p><p>{% trans 'contact_phone' %}: {{ user.phone }}</p><p>{% trans 'email' %}: {{ user.email }}</p><p>{% trans 'signed_by_digital_signature' %}</p></div><style>.digital-document {padding: 20px;white-space: pre-wrap;}</style>`
|
||||
|
||||
export const translations = {
|
||||
ru: {
|
||||
@@ -76,7 +76,7 @@ export const exampleData = {
|
||||
short_contributor_hash: 'ED3BCFC5B681AA83D',
|
||||
contributor_created_at: '11.04.2024',
|
||||
project_name: 'Проект цифровой платформы',
|
||||
project_id: 'B2C3D4E5F6789ABC',
|
||||
project_hash: 'B2C3D4E5F6789ABC',
|
||||
vars: {
|
||||
generation_contract_template: {
|
||||
protocol_number: 'СС-11-04-24',
|
||||
|
||||
+12
-12
@@ -6,14 +6,14 @@ export const registry_id = 1003
|
||||
// Модель действия для генерации
|
||||
export interface Action extends IGenerate {
|
||||
registry_id: number
|
||||
component_appendix_hash: string
|
||||
appendix_hash: string
|
||||
parent_appendix_hash: string
|
||||
contributor_hash: string
|
||||
contributor_created_at: string
|
||||
component_name: string
|
||||
component_id: string
|
||||
component_hash: string
|
||||
project_name: string
|
||||
project_id: string
|
||||
project_hash: string
|
||||
}
|
||||
|
||||
export type Meta = IMetaDocument & Action
|
||||
@@ -24,23 +24,23 @@ export interface Model {
|
||||
coop: ICooperativeData
|
||||
vars: IVars
|
||||
user: ICommonUser
|
||||
component_appendix_hash: string
|
||||
short_component_appendix_hash: string
|
||||
appendix_hash: string
|
||||
short_appendix_hash: string
|
||||
parent_appendix_hash: string
|
||||
short_parent_appendix_hash: string
|
||||
contributor_hash: string
|
||||
short_contributor_hash: string
|
||||
contributor_created_at: string
|
||||
component_name: string
|
||||
component_id: string
|
||||
component_hash: string
|
||||
project_name: string
|
||||
project_id: string
|
||||
project_hash: string
|
||||
}
|
||||
|
||||
export const title = 'Дополнение к приложению договора участия в компоненте'
|
||||
export const description = 'Дополнение к приложению договора участия в хозяйственной деятельности для компонентов проекта'
|
||||
|
||||
export const context = `<div class="digital-document"><div style="text-align: center"><h1>ДОПОЛНЕНИЕ № {{ short_component_appendix_hash }}</h1><h2>к ПРИЛОЖЕНИЮ № {{ short_parent_appendix_hash }}</h2><h2>к Договору об участии в хозяйственной деятельности № УХД-{{ short_contributor_hash }}</h2></div><p style="text-align: right">{{ meta.created_at }}, {{ coop.city }}</p><p>{% trans 'parties_intro' %} "{{ vars.name }}" {% trans 'in_face_of_chairman' %} {{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}, {% trans 'acting_on_basis_of_charter' %}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'society' %}", {% trans 'and_participant' %} {{ user.full_name_or_short_name }}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'participant' %}", {% trans 'jointly_referred_to_as' %} "{% trans 'parties' %}", {% trans 'have_concluded_this_supplement' %} {% trans 'hereinafter_referred_to_as' %} "{% trans 'supplement' %}" {% trans 'to_appendix' %} {{ short_parent_appendix_hash }} {% trans 'to_agreement' %} УХД-{{ short_contributor_hash }} {% trans 'from_date' %} {{ contributor_created_at }} {% trans 'of_the_following' %}:</p><p>{% trans 'within_obligations' %} {{ short_parent_appendix_hash }} {% trans 'to_agreement' %} УХД-{{ short_contributor_hash }} {% trans 'from_date' %} {{ contributor_created_at }}, {% trans 'parties_agreed' %} {% trans 'participant_commits_component' %} "{{ component_name }}" {% trans 'to_project' %} № {{ project_id }}.</p><h2>{% trans 'details_and_signatures_of_parties' %}</h2><p><strong>{% trans 'society' %}/{{ vars.full_abbr }} "{{ vars.name }}"/:</strong></p><p>ИНН {{ coop.details.inn }}, КПП {{ coop.details.kpp }}, ОГРН {{ coop.details.ogrn }}</p><p>{% trans 'legal_address' %}: {{ coop.full_address }}</p><p>{% trans 'contact_phone' %}: {{ coop.phone }}</p><p>{% trans 'email' %}: {{ coop.email }}</p><p>{% trans 'bank_account' %}: {{ coop.defaultBankAccount.account_number }}</p><p>{% trans 'bank_name' %}: {{ coop.defaultBankAccount.bank_name }}</p><p>{% trans 'bik' %}: {{ coop.defaultBankAccount.details.bik }}</p><p>{% trans 'correspondent_account' %}: {{ coop.defaultBankAccount.details.corr }}</p><p>{% trans 'chairman' %} {{ vars.full_abbr_genitive }} "{{ vars.name }}"</p><p>{{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}</p><p>{% trans 'signed_by_digital_signature' %}</p><p><strong>{% trans 'participant' %}:</strong></p><p>{{ user.full_name_or_short_name }}</p><p>{% trans 'contact_phone' %}: {{ user.phone }}</p><p>{% trans 'email' %}: {{ user.email }}</p><p>{% trans 'signed_by_digital_signature' %}</p></div><style>.digital-document {padding: 20px;white-space: pre-wrap;}</style>`
|
||||
export const context = `<div class="digital-document"><div style="text-align: center"><h1>ДОПОЛНЕНИЕ № {{ short_appendix_hash }}</h1><h2>к ПРИЛОЖЕНИЮ № {{ short_parent_appendix_hash }}</h2><h2>к Договору об участии в хозяйственной деятельности № УХД-{{ short_contributor_hash }}</h2></div><p style="text-align: right">{{ meta.created_at }}, {{ coop.city }}</p><p>{% trans 'parties_intro' %} "{{ vars.name }}" {% trans 'in_face_of_chairman' %} {{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}, {% trans 'acting_on_basis_of_charter' %}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'society' %}", {% trans 'and_participant' %} {{ user.full_name_or_short_name }}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'participant' %}", {% trans 'jointly_referred_to_as' %} "{% trans 'parties' %}", {% trans 'have_concluded_this_supplement' %} {% trans 'hereinafter_referred_to_as' %} "{% trans 'supplement' %}" {% trans 'to_appendix' %} {{ short_parent_appendix_hash }} {% trans 'to_agreement' %} УХД-{{ short_contributor_hash }} {% trans 'from_date' %} {{ contributor_created_at }} {% trans 'of_the_following' %}:</p><p>{% trans 'within_obligations' %} {{ short_parent_appendix_hash }} {% trans 'to_agreement' %} УХД-{{ short_contributor_hash }} {% trans 'from_date' %} {{ contributor_created_at }}, {% trans 'parties_agreed' %} {% trans 'participant_commits_component' %} "{{ component_name }}" {% trans 'to_project' %} № {{ project_hash }}.</p><h2>{% trans 'details_and_signatures_of_parties' %}</h2><p><strong>{% trans 'society' %}/{{ vars.full_abbr }} "{{ vars.name }}"/:</strong></p><p>ИНН {{ coop.details.inn }}, КПП {{ coop.details.kpp }}, ОГРН {{ coop.details.ogrn }}</p><p>{% trans 'legal_address' %}: {{ coop.full_address }}</p><p>{% trans 'contact_phone' %}: {{ coop.phone }}</p><p>{% trans 'email' %}: {{ coop.email }}</p><p>{% trans 'bank_account' %}: {{ coop.defaultBankAccount.account_number }}</p><p>{% trans 'bank_name' %}: {{ coop.defaultBankAccount.bank_name }}</p><p>{% trans 'bik' %}: {{ coop.defaultBankAccount.details.bik }}</p><p>{% trans 'correspondent_account' %}: {{ coop.defaultBankAccount.details.corr }}</p><p>{% trans 'chairman' %} {{ vars.full_abbr_genitive }} "{{ vars.name }}"</p><p>{{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}</p><p>{% trans 'signed_by_digital_signature' %}</p><p><strong>{% trans 'participant' %}:</strong></p><p>{{ user.full_name_or_short_name }}</p><p>{% trans 'contact_phone' %}: {{ user.phone }}</p><p>{% trans 'email' %}: {{ user.email }}</p><p>{% trans 'signed_by_digital_signature' %}</p></div><style>.digital-document {padding: 20px;white-space: pre-wrap;}</style>`
|
||||
|
||||
export const translations = {
|
||||
ru: {
|
||||
@@ -80,17 +80,17 @@ export const exampleData = {
|
||||
meta: {
|
||||
created_at: '11.04.2024 12:00',
|
||||
},
|
||||
component_appendix_hash: 'A002ZSA2',
|
||||
short_component_appendix_hash: 'A002ZSA2',
|
||||
appendix_hash: 'A002ZSA2',
|
||||
short_appendix_hash: 'A002ZSA2',
|
||||
parent_appendix_hash: 'A001ZSA1',
|
||||
short_parent_appendix_hash: 'A001ZSA1',
|
||||
contributor_hash: 'ED3BCFC5B681AA83D123456789ABCDEF',
|
||||
short_contributor_hash: 'ED3BCFC5B681AA83D',
|
||||
contributor_created_at: '11.04.2024',
|
||||
component_name: 'Компонент разработки',
|
||||
component_id: 'A1B2C3D4E5F6789A',
|
||||
component_hash: 'A1B2C3D4E5F6789A',
|
||||
project_name: 'Проект цифровой платформы',
|
||||
project_id: 'B2C3D4E5F6789ABC',
|
||||
project_hash: 'B2C3D4E5F6789ABC',
|
||||
vars: {
|
||||
generation_contract_template: {
|
||||
protocol_number: 'СС-11-04-24',
|
||||
|
||||
@@ -7,9 +7,9 @@ export const registry_id = 1005
|
||||
export interface Action extends IGenerate {
|
||||
registry_id: number
|
||||
project_name: string
|
||||
project_id: string
|
||||
project_hash: string
|
||||
component_name: string
|
||||
component_id: string
|
||||
component_hash: string
|
||||
is_component: boolean
|
||||
}
|
||||
|
||||
@@ -22,16 +22,16 @@ export interface Model {
|
||||
vars: IVars
|
||||
user: ICommonUser
|
||||
project_name: string
|
||||
project_id: string
|
||||
project_hash: string
|
||||
component_name: string
|
||||
component_id: string
|
||||
component_hash: string
|
||||
is_component: boolean
|
||||
}
|
||||
|
||||
export const title = 'Заявление на инициализацию проекта'
|
||||
export const description = 'Заявление на инициализацию проекта или компонента'
|
||||
|
||||
export const context = `<div class="digital-document"><div style="text-align: center"><h1>ЗАЯВЛЕНИЕ</h1><h2>на инициализацию проекта</h2></div><p style="text-align: right">{{ meta.created_at }}, {{ coop.city }}</p><p>{% trans 'parties_intro' %} "{{ vars.name }}" {% trans 'in_face_of_chairman' %} {{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}, {% trans 'acting_on_basis_of_charter' %}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'society' %}", {% trans 'and_participant' %} {{ user.full_name_or_short_name }}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'participant' %}", {% trans 'jointly_referred_to_as' %} "{% trans 'parties' %}", {% trans 'have_concluded_this_statement' %} {% trans 'hereinafter_referred_to_as' %} "{% trans 'statement' %}" {% trans 'of_the_following' %}:</p><p>{% if is_component %}{% trans 'participant_requests_component_init' %} "{{ component_name }}" (№{{ component_id }}) {% trans 'as_part_of_project' %} "{{ project_name }}" (№{{ project_id }}).{% else %}{% trans 'participant_requests_project_init' %} "{{ project_name }}" (№{{ project_id }}).{% endif %}</p><h2>{% trans 'details_and_signatures_of_parties' %}</h2><p><strong>{% trans 'society' %}/{{ vars.full_abbr }} "{{ vars.name }}"/:</strong></p><p>ИНН {{ coop.details.inn }}, КПП {{ coop.details.kpp }}, ОГРН {{ coop.details.ogrn }}</p><p>{% trans 'legal_address' %}: {{ coop.full_address }}</p><p>{% trans 'contact_phone' %}: {{ coop.phone }}</p><p>{% trans 'email' %}: {{ coop.email }}</p><p>{% trans 'bank_account' %}: {{ coop.defaultBankAccount.account_number }}</p><p>{% trans 'bank_name' %}: {{ coop.defaultBankAccount.bank_name }}</p><p>{% trans 'bik' %}: {{ coop.defaultBankAccount.details.bik }}</p><p>{% trans 'correspondent_account' %}: {{ coop.defaultBankAccount.details.corr }}</p><p>{% trans 'chairman' %} {{ vars.full_abbr_genitive }} "{{ vars.name }}"</p><p>{{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}</p><p>{% trans 'signed_by_digital_signature' %}</p><p><strong>{% trans 'participant' %}:</strong></p><p>{{ user.full_name_or_short_name }}</p><p>{% trans 'contact_phone' %}: {{ user.phone }}</p><p>{% trans 'email' %}: {{ user.email }}</p><p>{% trans 'signed_by_digital_signature' %}</p></div><style>.digital-document {padding: 20px;white-space: pre-wrap;}</style>`
|
||||
export const context = `<div class="digital-document"><div style="text-align: center"><h1>ЗАЯВЛЕНИЕ</h1><h2>на инициализацию проекта</h2></div><p style="text-align: right">{{ meta.created_at }}, {{ coop.city }}</p><p>{% trans 'parties_intro' %} "{{ vars.name }}" {% trans 'in_face_of_chairman' %} {{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}, {% trans 'acting_on_basis_of_charter' %}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'society' %}", {% trans 'and_participant' %} {{ user.full_name_or_short_name }}, {% trans 'hereinafter_referred_to_as' %} "{% trans 'participant' %}", {% trans 'jointly_referred_to_as' %} "{% trans 'parties' %}", {% trans 'have_concluded_this_statement' %} {% trans 'hereinafter_referred_to_as' %} "{% trans 'statement' %}" {% trans 'of_the_following' %}:</p><p>{% if is_component %}{% trans 'participant_requests_component_init' %} "{{ component_name }}" (№{{ component_hash }}) {% trans 'as_part_of_project' %} "{{ project_name }}" (№{{ project_hash }}).{% else %}{% trans 'participant_requests_project_init' %} "{{ project_name }}" (№{{ project_hash }}).{% endif %}</p><h2>{% trans 'details_and_signatures_of_parties' %}</h2><p><strong>{% trans 'society' %}/{{ vars.full_abbr }} "{{ vars.name }}"/:</strong></p><p>ИНН {{ coop.details.inn }}, КПП {{ coop.details.kpp }}, ОГРН {{ coop.details.ogrn }}</p><p>{% trans 'legal_address' %}: {{ coop.full_address }}</p><p>{% trans 'contact_phone' %}: {{ coop.phone }}</p><p>{% trans 'email' %}: {{ coop.email }}</p><p>{% trans 'bank_account' %}: {{ coop.defaultBankAccount.account_number }}</p><p>{% trans 'bank_name' %}: {{ coop.defaultBankAccount.bank_name }}</p><p>{% trans 'bik' %}: {{ coop.defaultBankAccount.details.bik }}</p><p>{% trans 'correspondent_account' %}: {{ coop.defaultBankAccount.details.corr }}</p><p>{% trans 'chairman' %} {{ vars.full_abbr_genitive }} "{{ vars.name }}"</p><p>{{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}</p><p>{% trans 'signed_by_digital_signature' %}</p><p><strong>{% trans 'participant' %}:</strong></p><p>{{ user.full_name_or_short_name }}</p><p>{% trans 'contact_phone' %}: {{ user.phone }}</p><p>{% trans 'email' %}: {{ user.email }}</p><p>{% trans 'signed_by_digital_signature' %}</p></div><style>.digital-document {padding: 20px;white-space: pre-wrap;}</style>`
|
||||
|
||||
export const translations = {
|
||||
ru: {
|
||||
@@ -68,9 +68,9 @@ export const exampleData = {
|
||||
created_at: '11.04.2024 12:00',
|
||||
},
|
||||
project_name: 'Проект цифровой платформы',
|
||||
project_id: 'B2C3D4E5F6789ABC',
|
||||
project_hash: 'B2C3D4E5F6789ABC',
|
||||
component_name: 'Компонент разработки',
|
||||
component_id: 'A1B2C3D4E5F6789A',
|
||||
component_hash: 'A1B2C3D4E5F6789A',
|
||||
is_component: true,
|
||||
vars: {
|
||||
name: 'ВОСХОД',
|
||||
|
||||
@@ -9,9 +9,9 @@ export const registry_id = 1006
|
||||
export interface Action extends IGenerate {
|
||||
decision_id: number
|
||||
project_name: string
|
||||
project_id: string
|
||||
project_hash: string
|
||||
component_name: string
|
||||
component_id: string
|
||||
component_hash: string
|
||||
is_component: boolean
|
||||
}
|
||||
|
||||
@@ -24,15 +24,15 @@ export interface Model {
|
||||
decision: IDecisionData
|
||||
vars: IVars
|
||||
project_name: string
|
||||
project_id: string
|
||||
project_hash: string
|
||||
component_name: string
|
||||
component_id: string
|
||||
component_hash: string
|
||||
is_component: boolean
|
||||
}
|
||||
|
||||
export const title = 'Протокол решения совета об инициализации проекта'
|
||||
export const description = 'Форма протокола решения совета об инициализации проекта или компонента'
|
||||
export const context = '<style> \nh1 {\nmargin: 0px; \ntext-align:center;\n}\nh3{\nmargin: 0px;\npadding-top: 15px;\n}\n.about {\npadding: 20px;\n}\n.about p{\nmargin: 0px;\n}\n.signature {\npadding-top: 20px;\n}\n.digital-document {\npadding: 20px;\nwhite-space: pre-wrap;\n}\n.subheader {\npadding-bottom: 20px; \n}\ntable {\n width: 100%;\n border-collapse: collapse;\n}\nth, td {\n border: 1px solid #ccc;\n padding: 8px;\n text-align: left;\n word-wrap: break-word; \n overflow-wrap: break-word; \n}\nth {\n background-color: #f4f4f4;\n width: 30%;\n}\n</style>\n\n<div class="digital-document"><h1 class="header">{% trans \'protocol_number\', decision.id %}</h1>\n<p style="text-align:center" class="subheader">{% trans \'council_meeting_name\' %} {{vars.full_abbr_genitive}} "{{vars.name}}"</p>\n<p style="text-align: right"> {{ meta.created_at }}, {{ coop.city }}</p>\n<table class="about">\n<tbody>\n<tr>\n<th>{% trans \'meeting_format\' %}</th>\n<td>{% trans \'meeting_format_value\' %}</td>\n</tr>\n<tr>\n<th>{% trans \'meeting_place\' %}</th>\n<td>{{ coop.full_address }}</td>\n</tr>\n<tr>\n<th>{% trans \'meeting_date\' %}</th>\n<td>{{ decision.date }}</td>\n</tr>\n<tr>\n<th>{% trans \'opening_time\' %}</th>\n<td>{{ decision.time }}</td>\n</tr>\n</tbody>\n</table>\n<h3>{% trans \'council_members\' %}</h3>\n<table>\n<tbody>\n{% for member in coop.members %}\n<tr>\n<th>{% if member.is_chairman %}{% trans \'chairman_of_the_council\' %}{% else %}{% trans \'member_of_the_council\' %}{% endif %}</th>\n<td>{{ member.last_name }} {{ member.first_name }} {{ member.middle_name }}</td>\n</tr>\n{% endfor %}\n</tbody>\n</table>\n<h3>{% trans \'meeting_legality\' %} </h3>\n<p>{% trans \'voting_results\', decision.voters_percent %} {% trans \'quorum\' %} {% trans \'chairman_of_the_meeting\', coop.chairman.last_name, coop.chairman.first_name, coop.chairman.middle_name %}.</p>\n<h3>{% trans \'agenda\' %}</h3>\n<table>\n<tbody>\n<tr>\n<th>№</th>\n<td>{% trans \'question\' %}</td>\n</tr>\n<tr>\n<th>1</th>\n<td>{% if is_component %}{% trans \'init_component_question\', component_name, component_id, project_name, project_id %}{% else %}{% trans \'init_project_question\', project_name, project_id %}{% endif %}</td>\n</tr>\n</tbody>\n</table>\n<h3>{% trans \'voting\' %}</h3>\n<p>{% trans \'vote_results\' %} </p><table>\n<tbody>\n<tr>\n<th>{% trans \'votes_for\' %}</th>\n<td>{{ decision.votes_for }}</td>\n</tr>\n<tr>\n<th>{% trans \'votes_against\' %}</th>\n<td>{{ decision.votes_against }}</td>\n</tr>\n<tr>\n<th>{% trans \'votes_abstained\' %}</th>\n<td>{{ decision.votes_abstained }}</td>\n</tr>\n</tbody>\n</table>\n<h3>{% trans \'decision_made\' %}</h3>\n<table>\n<tbody>\n<tr>\n<th>№</th>\n<td>{% trans \'decision\' %}</td>\n</tr>\n<tr>\n<th>1</th>\n<td>{% if is_component %}{% trans \'init_component_decision\', component_name, component_id, project_name, project_id %}{% else %}{% trans \'init_project_decision\', project_name, project_id %}{% endif %}</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<p>{% trans \'closing_time\', decision.time %}</p>\n<div class="signature"><p>{% trans \'signature\' %}</p><p>{% trans \'chairman\' %} {{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}</p></div></div>\n'
|
||||
export const context = '<style> \nh1 {\nmargin: 0px; \ntext-align:center;\n}\nh3{\nmargin: 0px;\npadding-top: 15px;\n}\n.about {\npadding: 20px;\n}\n.about p{\nmargin: 0px;\n}\n.signature {\npadding-top: 20px;\n}\n.digital-document {\npadding: 20px;\nwhite-space: pre-wrap;\n}\n.subheader {\npadding-bottom: 20px; \n}\ntable {\n width: 100%;\n border-collapse: collapse;\n}\nth, td {\n border: 1px solid #ccc;\n padding: 8px;\n text-align: left;\n word-wrap: break-word; \n overflow-wrap: break-word; \n}\nth {\n background-color: #f4f4f4;\n width: 30%;\n}\n</style>\n\n<div class="digital-document"><h1 class="header">{% trans \'protocol_number\', decision.id %}</h1>\n<p style="text-align:center" class="subheader">{% trans \'council_meeting_name\' %} {{vars.full_abbr_genitive}} "{{vars.name}}"</p>\n<p style="text-align: right"> {{ meta.created_at }}, {{ coop.city }}</p>\n<table class="about">\n<tbody>\n<tr>\n<th>{% trans \'meeting_format\' %}</th>\n<td>{% trans \'meeting_format_value\' %}</td>\n</tr>\n<tr>\n<th>{% trans \'meeting_place\' %}</th>\n<td>{{ coop.full_address }}</td>\n</tr>\n<tr>\n<th>{% trans \'meeting_date\' %}</th>\n<td>{{ decision.date }}</td>\n</tr>\n<tr>\n<th>{% trans \'opening_time\' %}</th>\n<td>{{ decision.time }}</td>\n</tr>\n</tbody>\n</table>\n<h3>{% trans \'council_members\' %}</h3>\n<table>\n<tbody>\n{% for member in coop.members %}\n<tr>\n<th>{% if member.is_chairman %}{% trans \'chairman_of_the_council\' %}{% else %}{% trans \'member_of_the_council\' %}{% endif %}</th>\n<td>{{ member.last_name }} {{ member.first_name }} {{ member.middle_name }}</td>\n</tr>\n{% endfor %}\n</tbody>\n</table>\n<h3>{% trans \'meeting_legality\' %} </h3>\n<p>{% trans \'voting_results\', decision.voters_percent %} {% trans \'quorum\' %} {% trans \'chairman_of_the_meeting\', coop.chairman.last_name, coop.chairman.first_name, coop.chairman.middle_name %}.</p>\n<h3>{% trans \'agenda\' %}</h3>\n<table>\n<tbody>\n<tr>\n<th>№</th>\n<td>{% trans \'question\' %}</td>\n</tr>\n<tr>\n<th>1</th>\n<td>{% if is_component %}{% trans \'init_component_question\', component_name, component_hash, project_name, project_hash %}{% else %}{% trans \'init_project_question\', project_name, project_hash %}{% endif %}</td>\n</tr>\n</tbody>\n</table>\n<h3>{% trans \'voting\' %}</h3>\n<p>{% trans \'vote_results\' %} </p><table>\n<tbody>\n<tr>\n<th>{% trans \'votes_for\' %}</th>\n<td>{{ decision.votes_for }}</td>\n</tr>\n<tr>\n<th>{% trans \'votes_against\' %}</th>\n<td>{{ decision.votes_against }}</td>\n</tr>\n<tr>\n<th>{% trans \'votes_abstained\' %}</th>\n<td>{{ decision.votes_abstained }}</td>\n</tr>\n</tbody>\n</table>\n<h3>{% trans \'decision_made\' %}</h3>\n<table>\n<tbody>\n<tr>\n<th>№</th>\n<td>{% trans \'decision\' %}</td>\n</tr>\n<tr>\n<th>1</th>\n<td>{% if is_component %}{% trans \'init_component_decision\', component_name, component_hash, project_name, project_hash %}{% else %}{% trans \'init_project_decision\', project_name, project_hash %}{% endif %}</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<p>{% trans \'closing_time\', decision.time %}</p>\n<div class="signature"><p>{% trans \'signature\' %}</p><p>{% trans \'chairman\' %} {{ coop.chairman.last_name }} {{ coop.chairman.first_name }} {{ coop.chairman.middle_name }}</p></div></div>\n'
|
||||
|
||||
export const translations = {
|
||||
ru: {
|
||||
@@ -75,9 +75,9 @@ export const exampleData = {
|
||||
created_at: '12.02.2024 00:01',
|
||||
},
|
||||
project_name: 'Проект цифровой платформы',
|
||||
project_id: 'B2C3D4E5F6789ABC',
|
||||
project_hash: 'B2C3D4E5F6789ABC',
|
||||
component_name: 'Компонент разработки',
|
||||
component_id: 'A1B2C3D4E5F6789A',
|
||||
component_hash: 'A1B2C3D4E5F6789A',
|
||||
is_component: true,
|
||||
coop: {
|
||||
city: 'Москва',
|
||||
|
||||
+65
-4
@@ -1,3 +1,4 @@
|
||||
import type { ICommonUser, ICooperativeData, IVars } from '../../model'
|
||||
import type { IGenerate, IMetaDocument } from '../../document'
|
||||
|
||||
export const registry_id = 1020
|
||||
@@ -5,6 +6,12 @@ export const registry_id = 1020
|
||||
// Модель действия для генерации
|
||||
export interface Action extends IGenerate {
|
||||
registry_id: number
|
||||
appendix_hash: string
|
||||
appendix_created_at: string
|
||||
contributor_hash: string
|
||||
contributor_created_at: string
|
||||
project_hash: string
|
||||
amount: string
|
||||
}
|
||||
|
||||
export type Meta = IMetaDocument & Action
|
||||
@@ -12,11 +19,65 @@ export type Meta = IMetaDocument & Action
|
||||
// Модель данных документа
|
||||
export interface Model {
|
||||
meta: IMetaDocument
|
||||
coop: ICooperativeData
|
||||
vars: IVars
|
||||
user: ICommonUser
|
||||
appendix_hash: string
|
||||
short_appendix_hash: string
|
||||
contributor_hash: string
|
||||
short_contributor_hash: string
|
||||
contributor_created_at: string
|
||||
appendix_created_at: string
|
||||
project_hash: string
|
||||
amount: string
|
||||
}
|
||||
|
||||
export const title = 'Заявление об инвестировании денежных средств в генерацию'
|
||||
export const description = 'Форма заявления об инвестировании денежных средств в генерацию кооператива'
|
||||
export const context = '<div class="digital-document"><div style="text-align: center"><h2>ЗАЯВЛЕНИЕ ОБ ИНВЕСТИРОВАНИИ СРЕДСТВ В ГЕНЕРАЦИЮ</h2></div><p>Прошу принять мои денежные средства в качестве инвестиций в генерацию кооператива.</p><p>Подпись: Иван Иванович</p></div>'
|
||||
export const description = 'Заявление о зачете части паевого взноса в качестве инвестиции в проект'
|
||||
|
||||
export const translations = {}
|
||||
export const exampleData = {}
|
||||
export const context = `<div class="digital-document"><p style="text-align: right">{% trans 'council_of' %} {{ vars.full_abbr_genitive }} "{{ vars.name }}"</p><p style="text-align: right">{% trans 'from_shareholder' %} {{ user.full_name_or_short_name }}</p><div style="text-align: center"><h1>{% trans 'statement' %}</h1></div><p>{% trans 'in_accordance_with_appendix' %} №{{ short_appendix_hash }} {% trans 'from_date' %} {{ appendix_created_at }} {% trans 'to_agreement' %} УХД-{{ short_contributor_hash }} {% trans 'from_date' %} {{ contributor_created_at }}, {% trans 'request_to_credit' %} {% trans 'target_share_contribution' %} {% trans 'target_consumer_program' %} "{% trans 'digital_wallet' %}" {% trans 'in_amount' %} {{ amount }} {% trans 'as_share_contribution' %} {% trans 'to_project' %} №{{ project_hash }}.</p><p style="text-align: right">{{ meta.created_at }}</p><p style="text-align: right">{% trans 'signed_by_digital_signature' %}</p></div><style>.digital-document {padding: 20px;white-space: pre-wrap;}</style>`
|
||||
|
||||
export const translations = {
|
||||
ru: {
|
||||
council_of: 'В Совет',
|
||||
from_shareholder: 'От пайщика',
|
||||
statement: 'ЗАЯВЛЕНИЕ',
|
||||
in_accordance_with_appendix: 'В соответствии с Приложением',
|
||||
from_date: 'от',
|
||||
to_agreement: 'к Договору об участии в хозяйственной деятельности №',
|
||||
request_to_credit: 'прошу зачесть часть моего',
|
||||
target_share_contribution: 'целевого паевого взноса',
|
||||
target_consumer_program: 'по Целевой Потребительской Программе',
|
||||
digital_wallet: 'ЦИФРОВОЙ КОШЕЛЕК',
|
||||
in_amount: 'в размере',
|
||||
as_share_contribution: 'в качестве паевого взноса',
|
||||
to_project: 'в Проект',
|
||||
signed_by_digital_signature: 'Подписано электронной подписью',
|
||||
},
|
||||
}
|
||||
|
||||
export const exampleData = {
|
||||
meta: {
|
||||
created_at: '15.01.2026 14:30',
|
||||
},
|
||||
appendix_hash: 'A001INV1',
|
||||
short_appendix_hash: 'A001INV1',
|
||||
contributor_hash: 'INV123456789ABCDEF',
|
||||
short_contributor_hash: 'INV123456789',
|
||||
contributor_created_at: '10.01.2026',
|
||||
appendix_created_at: '12.01.2026',
|
||||
project_hash: 'PRJ20260115001',
|
||||
amount: '50000.00 RUB',
|
||||
vars: {
|
||||
name: 'ВОСХОД',
|
||||
full_abbr_genitive: 'Потребительского Кооператива',
|
||||
},
|
||||
user: {
|
||||
full_name_or_short_name: 'Иванов Иван Иванович',
|
||||
phone: '+7 999 123-45-67',
|
||||
email: 'ivanov@example.com',
|
||||
},
|
||||
coop: {
|
||||
city: 'Москва',
|
||||
},
|
||||
}
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
В Совет {{vars.full_abbr_genitive}} “{{vars.name}}”
|
||||
От пайщика: {{common_user.full_name_or_short_name}}
|
||||
|
||||
ЗАЯВЛЕНИЕ
|
||||
|
||||
В соответствии с Приложением №{{short_appendix_hash}} от{{appendix_created_at}} к Договору об участии в хозяйственной деятельности № УХД-{{short_contributor_hash}} от {{contributor_created_at}}, прошу зачесть часть моего целевого паевого взноса по Целевой Потребительской Программе “ЦИФРОВОЙ КОШЕЛЕК” в размере {{amount}} в качестве паевого взноса в Проект №{{project_hash}}.
|
||||
|
||||
{{meta.created_at}}
|
||||
Подписано электронной подписью.
|
||||
+4
-2
@@ -39,7 +39,7 @@ export function useCreateProjectInvest() {
|
||||
}
|
||||
|
||||
// Генерация заявления на инвестицию
|
||||
async function generateInvestStatement(): Promise<IGeneratedDocumentOutput | null> {
|
||||
async function generateInvestStatement(projectHash: string, amount: string): Promise<IGeneratedDocumentOutput | null> {
|
||||
try {
|
||||
isGenerating.value = true;
|
||||
generationError.value = false;
|
||||
@@ -48,6 +48,8 @@ export function useCreateProjectInvest() {
|
||||
const data = {
|
||||
coopname: system.info.coopname,
|
||||
username: session.username,
|
||||
project_hash: projectHash,
|
||||
amount: parseFloat(amount).toFixed(system.info.symbols.root_govern_precision) + ' ' + system.info.symbols.root_govern_symbol,
|
||||
};
|
||||
|
||||
generatedDocument.value = await api.generateGenerationMoneyInvestStatement(data);
|
||||
@@ -71,7 +73,7 @@ export function useCreateProjectInvest() {
|
||||
isGenerating.value = true;
|
||||
|
||||
// Генерируем заявление
|
||||
const document = await generateInvestStatement();
|
||||
const document = await generateInvestStatement(projectHash, amount);
|
||||
if (!document) {
|
||||
throw new Error('Не удалось сгенерировать заявление');
|
||||
}
|
||||
|
||||
@@ -132,7 +132,16 @@ export function useCreateUser() {
|
||||
const capitalizationDoc = registrationStore.getDocumentById('blagorost_offer');
|
||||
const generatorDoc = registrationStore.getDocumentById('generator_offer');
|
||||
|
||||
const data: ISendStatement & { blagorost_offer?: IDocument; generator_offer?: IDocument; program_key?: string } = {
|
||||
// Преобразуем program_key в правильный enum формат
|
||||
let programKey: Zeus.ProgramKey | undefined;
|
||||
if (registratorStore.state.selectedProgramKey) {
|
||||
const key = registratorStore.state.selectedProgramKey;
|
||||
if (key === 'CAPITALIZATION' || key === 'GENERATION') {
|
||||
programKey = key as Zeus.ProgramKey;
|
||||
}
|
||||
}
|
||||
|
||||
const data: ISendStatement & { blagorost_offer?: IDocument; generator_offer?: IDocument; program_key?: Zeus.ProgramKey } = {
|
||||
username: store.account.username,
|
||||
braname: store.selectedBranch,
|
||||
statement: store.statement,
|
||||
@@ -140,9 +149,11 @@ export function useCreateUser() {
|
||||
privacy_agreement: privacyDoc?.signed_document || store.privacyAgreement,
|
||||
signature_agreement: signatureDoc?.signed_document || store.signatureAgreement,
|
||||
user_agreement: userDoc?.signed_document || store.userAgreement,
|
||||
program_key: registratorStore.state.selectedProgramKey as Zeus.ProgramKey | undefined,
|
||||
program_key: programKey,
|
||||
};
|
||||
|
||||
console.log('Sending data with program_key:', data.program_key);
|
||||
|
||||
// Добавляем blagorost_offer если есть
|
||||
if (capitalizationDoc?.signed_document) {
|
||||
data.blagorost_offer = capitalizationDoc.signed_document;
|
||||
|
||||
@@ -44,7 +44,7 @@ export class Factory extends DocFactory<ProjectGenerationContract.Action> {
|
||||
short_contributor_hash: this.getShortHash(data.contributor_hash),
|
||||
contributor_created_at: data.contributor_created_at,
|
||||
project_name: data.project_name,
|
||||
project_id: data.project_id,
|
||||
project_hash: data.project_hash,
|
||||
}
|
||||
|
||||
await this.validate(combinedData, template.model)
|
||||
|
||||
@@ -38,17 +38,17 @@ export class Factory extends DocFactory<ComponentGenerationContract.Action> {
|
||||
coop,
|
||||
vars,
|
||||
user,
|
||||
component_appendix_hash: data.component_appendix_hash,
|
||||
short_component_appendix_hash: this.getShortHash(data.component_appendix_hash),
|
||||
appendix_hash: data.appendix_hash,
|
||||
short_appendix_hash: this.getShortHash(data.appendix_hash),
|
||||
parent_appendix_hash: data.parent_appendix_hash,
|
||||
short_parent_appendix_hash: this.getShortHash(data.parent_appendix_hash),
|
||||
contributor_hash: data.contributor_hash,
|
||||
short_contributor_hash: this.getShortHash(data.contributor_hash),
|
||||
contributor_created_at: data.contributor_created_at,
|
||||
component_name: data.component_name,
|
||||
component_id: data.component_id,
|
||||
component_hash: data.component_hash,
|
||||
project_name: data.project_name,
|
||||
project_id: data.project_id,
|
||||
project_hash: data.project_hash,
|
||||
}
|
||||
|
||||
await this.validate(combinedData, template.model)
|
||||
|
||||
@@ -34,9 +34,9 @@ export class Factory extends DocFactory<InitProjectStatement.Action> {
|
||||
vars,
|
||||
user,
|
||||
project_name: data.project_name,
|
||||
project_id: data.project_id,
|
||||
project_hash: data.project_hash,
|
||||
component_name: data.component_name,
|
||||
component_id: data.component_id,
|
||||
component_hash: data.component_hash,
|
||||
is_component: data.is_component,
|
||||
}
|
||||
|
||||
|
||||
@@ -59,9 +59,9 @@ export class Factory extends DocFactory<InitProjectDecision.Action> {
|
||||
coop,
|
||||
decision,
|
||||
project_name: data.project_name,
|
||||
project_id: data.project_id,
|
||||
project_hash: data.project_hash,
|
||||
component_name: data.component_name,
|
||||
component_id: data.component_id,
|
||||
component_hash: data.component_hash,
|
||||
is_component: data.is_component,
|
||||
vars,
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import { GenerationMoneyInvestStatement } from '../Templates'
|
||||
import { DocFactory } from '../Factory'
|
||||
import type { IGeneratedDocument, IGenerationOptions, IMetaDocument, ITemplate } from '../Interfaces'
|
||||
import type { MongoDBConnector } from '../Services/Databazor'
|
||||
import { formatDateTime } from '../Utils'
|
||||
|
||||
export { GenerationMoneyInvestStatement as Template } from '../Templates'
|
||||
|
||||
@@ -22,8 +23,25 @@ export class Factory extends DocFactory<GenerationMoneyInvestStatement.Action> {
|
||||
}
|
||||
|
||||
const meta: IMetaDocument = await this.getMeta({ title: template.title, ...data })
|
||||
const coop = await super.getCooperative(data.coopname, data.block_num)
|
||||
const vars = await super.getVars(data.coopname, data.block_num)
|
||||
const userData = await super.getUser(data.username, data.block_num)
|
||||
const user = super.getCommonUser(userData)
|
||||
|
||||
const combinedData: GenerationMoneyInvestStatement.Model = {meta}
|
||||
const combinedData: GenerationMoneyInvestStatement.Model = {
|
||||
meta,
|
||||
coop,
|
||||
vars,
|
||||
user,
|
||||
appendix_hash: data.appendix_hash,
|
||||
short_appendix_hash: this.getShortHash(data.appendix_hash),
|
||||
contributor_hash: data.contributor_hash,
|
||||
short_contributor_hash: this.getShortHash(data.contributor_hash),
|
||||
contributor_created_at: formatDateTime(data.contributor_created_at),
|
||||
appendix_created_at: formatDateTime(data.appendix_created_at),
|
||||
project_hash: data.project_hash,
|
||||
amount: super.formatAsset(data.amount),
|
||||
}
|
||||
|
||||
await this.validate(combinedData, template.model)
|
||||
|
||||
|
||||
@@ -28,9 +28,9 @@ export const Schema: JSONSchemaType<Model> = {
|
||||
short_contributor_hash: { type: 'string' },
|
||||
contributor_created_at: { type: 'string' },
|
||||
project_name: { type: 'string' },
|
||||
project_id: { type: 'string' },
|
||||
project_hash: { type: 'string' },
|
||||
},
|
||||
required: ['meta', 'coop', 'vars', 'user', 'appendix_hash', 'short_appendix_hash', 'contributor_hash', 'short_contributor_hash', 'contributor_created_at', 'project_name', 'project_id'],
|
||||
required: ['meta', 'coop', 'vars', 'user', 'appendix_hash', 'short_appendix_hash', 'contributor_hash', 'short_contributor_hash', 'contributor_created_at', 'project_name', 'project_hash'],
|
||||
additionalProperties: true,
|
||||
}
|
||||
|
||||
|
||||
@@ -22,19 +22,19 @@ export const Schema: JSONSchemaType<Model> = {
|
||||
coop: CooperativeSchema,
|
||||
vars: VarsSchema,
|
||||
user: CommonUserSchema,
|
||||
component_appendix_hash: { type: 'string' },
|
||||
short_component_appendix_hash: { type: 'string' },
|
||||
appendix_hash: { type: 'string' },
|
||||
short_appendix_hash: { type: 'string' },
|
||||
parent_appendix_hash: { type: 'string' },
|
||||
short_parent_appendix_hash: { type: 'string' },
|
||||
contributor_hash: { type: 'string' },
|
||||
short_contributor_hash: { type: 'string' },
|
||||
contributor_created_at: { type: 'string' },
|
||||
component_name: { type: 'string' },
|
||||
component_id: { type: 'string' },
|
||||
component_hash: { type: 'string' },
|
||||
project_name: { type: 'string' },
|
||||
project_id: { type: 'string' },
|
||||
project_hash: { type: 'string' },
|
||||
},
|
||||
required: ['meta', 'coop', 'vars', 'user', 'component_appendix_hash', 'short_component_appendix_hash', 'parent_appendix_hash', 'short_parent_appendix_hash', 'contributor_hash', 'short_contributor_hash', 'contributor_created_at', 'component_name', 'component_id', 'project_name', 'project_id'],
|
||||
required: ['meta', 'coop', 'vars', 'user', 'appendix_hash', 'short_appendix_hash', 'parent_appendix_hash', 'short_parent_appendix_hash', 'contributor_hash', 'short_contributor_hash', 'contributor_created_at', 'component_name', 'component_hash', 'project_name', 'project_hash'],
|
||||
additionalProperties: true,
|
||||
}
|
||||
|
||||
|
||||
@@ -23,12 +23,12 @@ export const Schema: JSONSchemaType<Model> = {
|
||||
vars: VarsSchema,
|
||||
user: CommonUserSchema,
|
||||
project_name: { type: 'string' },
|
||||
project_id: { type: 'string' },
|
||||
project_hash: { type: 'string' },
|
||||
component_name: { type: 'string' },
|
||||
component_id: { type: 'string' },
|
||||
component_hash: { type: 'string' },
|
||||
is_component: { type: 'boolean' },
|
||||
},
|
||||
required: ['meta', 'coop', 'vars', 'user', 'project_name', 'project_id', 'component_name', 'component_id', 'is_component'],
|
||||
required: ['meta', 'coop', 'vars', 'user', 'project_name', 'project_hash', 'component_name', 'component_hash', 'is_component'],
|
||||
additionalProperties: true,
|
||||
}
|
||||
|
||||
|
||||
@@ -46,12 +46,12 @@ export const Schema: JSONSchemaType<Model> = {
|
||||
},
|
||||
vars: VarsSchema,
|
||||
project_name: { type: 'string' },
|
||||
project_id: { type: 'string' },
|
||||
project_hash: { type: 'string' },
|
||||
component_name: { type: 'string' },
|
||||
component_id: { type: 'string' },
|
||||
component_hash: { type: 'string' },
|
||||
is_component: { type: 'boolean' },
|
||||
},
|
||||
required: ['meta', 'coop', 'decision', 'project_name', 'project_id', 'component_name', 'component_id', 'is_component'],
|
||||
required: ['meta', 'coop', 'decision', 'project_name', 'project_hash', 'component_name', 'component_hash', 'is_component'],
|
||||
additionalProperties: true,
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { JSONSchemaType } from 'ajv'
|
||||
import { Cooperative } from 'cooptypes'
|
||||
import type { ITemplate } from '../Interfaces'
|
||||
import { CommonUserSchema, CooperativeSchema, VarsSchema } from '../Schema'
|
||||
import { IMetaJSONSchema } from '../Schema/MetaSchema'
|
||||
|
||||
export const registry_id = Cooperative.Registry.GenerationMoneyInvestStatement.registry_id
|
||||
@@ -16,8 +17,32 @@ export const Schema: JSONSchemaType<Model> = {
|
||||
type: 'object',
|
||||
properties: {
|
||||
meta: IMetaJSONSchema,
|
||||
coop: CooperativeSchema,
|
||||
vars: VarsSchema,
|
||||
user: CommonUserSchema,
|
||||
appendix_hash: { type: 'string' },
|
||||
short_appendix_hash: { type: 'string' },
|
||||
contributor_hash: { type: 'string' },
|
||||
short_contributor_hash: { type: 'string' },
|
||||
contributor_created_at: { type: 'string' },
|
||||
appendix_created_at: { type: 'string' },
|
||||
project_hash: { type: 'string' },
|
||||
amount: { type: 'string' },
|
||||
},
|
||||
required: ['meta'],
|
||||
required: [
|
||||
'meta',
|
||||
'coop',
|
||||
'vars',
|
||||
'user',
|
||||
'appendix_hash',
|
||||
'short_appendix_hash',
|
||||
'contributor_hash',
|
||||
'short_contributor_hash',
|
||||
'contributor_created_at',
|
||||
'appendix_created_at',
|
||||
'project_hash',
|
||||
'amount',
|
||||
],
|
||||
additionalProperties: true,
|
||||
}
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ describe('тест генератора документов с registry_id >= 1
|
||||
contributor_hash: 'ED3BCFC5B681AA83D123456789ABCDEF',
|
||||
contributor_created_at: '11.04.2024',
|
||||
project_name: 'Проект цифровой платформы',
|
||||
project_id: 'B2C3D4E5F6789ABC',
|
||||
project_hash: 'B2C3D4E5F6789ABC',
|
||||
lang: 'ru',
|
||||
})
|
||||
})
|
||||
@@ -85,14 +85,14 @@ describe('тест генератора документов с registry_id >= 1
|
||||
registry_id: 1003,
|
||||
coopname: 'voskhod',
|
||||
username: 'ant',
|
||||
component_appendix_hash: 'A002ZSA2',
|
||||
appendix_hash: 'A002ZSA2',
|
||||
parent_appendix_hash: 'A001ZSA1',
|
||||
contributor_hash: 'ED3BCFC5B681AA83D123456789ABCDEF',
|
||||
contributor_created_at: '11.04.2024',
|
||||
component_name: 'Компонент разработки',
|
||||
component_id: 'A1B2C3D4E5F6789A',
|
||||
component_hash: 'A1B2C3D4E5F6789A',
|
||||
project_name: 'Проект цифровой платформы',
|
||||
project_id: 'B2C3D4E5F6789ABC',
|
||||
project_hash: 'B2C3D4E5F6789ABC',
|
||||
lang: 'ru',
|
||||
})
|
||||
})
|
||||
@@ -103,9 +103,9 @@ describe('тест генератора документов с registry_id >= 1
|
||||
coopname: 'voskhod',
|
||||
username: 'ant',
|
||||
project_name: 'Проект цифровой платформы',
|
||||
project_id: 'B2C3D4E5F6789ABC',
|
||||
project_hash: 'B2C3D4E5F6789ABC',
|
||||
component_name: 'Компонент разработки',
|
||||
component_id: 'A1B2C3D4E5F6789A',
|
||||
component_hash: 'A1B2C3D4E5F6789A',
|
||||
is_component: true,
|
||||
lang: 'ru',
|
||||
})
|
||||
@@ -118,9 +118,9 @@ describe('тест генератора документов с registry_id >= 1
|
||||
username: 'ant',
|
||||
decision_id: 1,
|
||||
project_name: 'Проект цифровой платформы',
|
||||
project_id: 'B2C3D4E5F6789ABC',
|
||||
project_hash: 'B2C3D4E5F6789ABC',
|
||||
component_name: 'Компонент разработки',
|
||||
component_id: 'A1B2C3D4E5F6789A',
|
||||
component_hash: 'A1B2C3D4E5F6789A',
|
||||
is_component: true,
|
||||
lang: 'ru',
|
||||
})
|
||||
@@ -152,6 +152,12 @@ describe('тест генератора документов с registry_id >= 1
|
||||
coopname: 'voskhod',
|
||||
username: 'ant',
|
||||
lang: 'ru',
|
||||
appendix_hash: 'A001INV1',
|
||||
appendix_created_at: '12.01.2026',
|
||||
contributor_hash: 'INV123456789ABCDEF',
|
||||
contributor_created_at: '10.01.2026',
|
||||
project_hash: 'PRJ20260115001',
|
||||
amount: '50000.00 RUB',
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
---
|
||||
globs: notifications/src/workflows/**/*.ts
|
||||
description: Правила создания воркфлоу оповещений (notifications)
|
||||
globs: **/notifications/src/**/**.ts
|
||||
alwaysApply: false
|
||||
---
|
||||
# Правила валидации воркфлоу
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import { $, type GraphQLTypes, type InputType, type ModelTypes, Selector } from
|
||||
export const name = 'capitalGenerateGenerationMoneyInvestStatement'
|
||||
|
||||
export const mutation = Selector('Mutation')({
|
||||
[name]: [{ data: $('data', 'GenerateDocumentInput!'), options: $('options', 'GenerateDocumentOptionsInput') }, documentSelector],
|
||||
[name]: [{ data: $('data', 'GenerationMoneyInvestStatementGenerateDocumentInput!'), options: $('options', 'GenerateDocumentOptionsInput') }, documentSelector],
|
||||
})
|
||||
|
||||
export interface IInput {
|
||||
@@ -13,7 +13,7 @@ export interface IInput {
|
||||
*/
|
||||
[key: string]: unknown
|
||||
|
||||
data: ModelTypes['GenerateDocumentInput']
|
||||
data: ModelTypes['GenerationMoneyInvestStatementGenerateDocumentInput']
|
||||
options?: ModelTypes['GenerateDocumentOptionsInput']
|
||||
}
|
||||
|
||||
|
||||
@@ -308,7 +308,7 @@ export const AllTypesProps: Record<string,any> = {
|
||||
|
||||
},
|
||||
CreateProjectInvestInput:{
|
||||
statement:"SignedDigitalDocumentInput"
|
||||
statement:"GenerationMoneyInvestStatementSignedDocumentInput"
|
||||
},
|
||||
CreateProjectPropertyInput:{
|
||||
|
||||
@@ -430,6 +430,16 @@ export const AllTypesProps: Record<string,any> = {
|
||||
},
|
||||
GenerationContractSignedMetaDocumentInput:{
|
||||
|
||||
},
|
||||
GenerationMoneyInvestStatementGenerateDocumentInput:{
|
||||
|
||||
},
|
||||
GenerationMoneyInvestStatementSignedDocumentInput:{
|
||||
meta:"GenerationMoneyInvestStatementSignedMetaDocumentInput",
|
||||
signatures:"SignatureInfoInput"
|
||||
},
|
||||
GenerationMoneyInvestStatementSignedMetaDocumentInput:{
|
||||
|
||||
},
|
||||
GetAccountInput:{
|
||||
|
||||
@@ -683,7 +693,7 @@ export const AllTypesProps: Record<string,any> = {
|
||||
options:"GenerateDocumentOptionsInput"
|
||||
},
|
||||
capitalGenerateGenerationMoneyInvestStatement:{
|
||||
data:"GenerateDocumentInput",
|
||||
data:"GenerationMoneyInvestStatementGenerateDocumentInput",
|
||||
options:"GenerateDocumentOptionsInput"
|
||||
},
|
||||
capitalGenerateGenerationMoneyReturnUnusedStatement:{
|
||||
|
||||
@@ -3993,7 +3993,7 @@ export type ValueTypes = {
|
||||
/** Хэш проекта */
|
||||
project_hash: string | Variable<any, string>,
|
||||
/** Заявление на инвестирование */
|
||||
statement: ValueTypes["SignedDigitalDocumentInput"] | Variable<any, string>,
|
||||
statement: ValueTypes["GenerationMoneyInvestStatementSignedDocumentInput"] | Variable<any, string>,
|
||||
/** Имя инвестора */
|
||||
username: string | Variable<any, string>
|
||||
};
|
||||
@@ -4837,6 +4837,82 @@ export type ValueTypes = {
|
||||
username: string | Variable<any, string>,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version: string | Variable<any, string>
|
||||
};
|
||||
["GenerationMoneyInvestStatementGenerateDocumentInput"]: {
|
||||
/** Сумма инвестирования */
|
||||
amount: string | Variable<any, string>,
|
||||
/** Номер блока, на котором был создан документ */
|
||||
block_num?: number | undefined | null | Variable<any, string>,
|
||||
/** Название кооператива, связанное с документом */
|
||||
coopname: string | Variable<any, string>,
|
||||
/** Дата и время создания документа */
|
||||
created_at?: string | undefined | null | Variable<any, string>,
|
||||
/** Имя генератора, использованного для создания документа */
|
||||
generator?: string | undefined | null | Variable<any, string>,
|
||||
/** Язык документа */
|
||||
lang?: string | undefined | null | Variable<any, string>,
|
||||
/** Ссылки, связанные с документом */
|
||||
links?: Array<string> | undefined | null | Variable<any, string>,
|
||||
/** Хэш проекта */
|
||||
project_hash: string | Variable<any, string>,
|
||||
/** Часовой пояс, в котором был создан документ */
|
||||
timezone?: string | undefined | null | Variable<any, string>,
|
||||
/** Название документа */
|
||||
title?: string | undefined | null | Variable<any, string>,
|
||||
/** Имя пользователя, создавшего документ */
|
||||
username: string | Variable<any, string>,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version?: string | undefined | null | Variable<any, string>
|
||||
};
|
||||
["GenerationMoneyInvestStatementSignedDocumentInput"]: {
|
||||
/** Хэш содержимого документа */
|
||||
doc_hash: string | Variable<any, string>,
|
||||
/** Общий хэш (doc_hash + meta_hash) */
|
||||
hash: string | Variable<any, string>,
|
||||
/** Метаинформация для документа заявления об инвестировании в генерацию */
|
||||
meta: ValueTypes["GenerationMoneyInvestStatementSignedMetaDocumentInput"] | Variable<any, string>,
|
||||
/** Хэш мета-данных */
|
||||
meta_hash: string | Variable<any, string>,
|
||||
/** Вектор подписей */
|
||||
signatures: Array<ValueTypes["SignatureInfoInput"]> | Variable<any, string>,
|
||||
/** Версия стандарта документа */
|
||||
version: string | Variable<any, string>
|
||||
};
|
||||
["GenerationMoneyInvestStatementSignedMetaDocumentInput"]: {
|
||||
/** Сумма инвестирования */
|
||||
amount: string | Variable<any, string>,
|
||||
/** Дата создания приложения к проекту */
|
||||
appendix_created_at: string | Variable<any, string>,
|
||||
/** Хэш приложения к проекту */
|
||||
appendix_hash: string | Variable<any, string>,
|
||||
/** Номер блока, на котором был создан документ */
|
||||
block_num: number | Variable<any, string>,
|
||||
/** Дата создания участника */
|
||||
contributor_created_at: string | Variable<any, string>,
|
||||
/** Хэш участника */
|
||||
contributor_hash: string | Variable<any, string>,
|
||||
/** Название кооператива, связанное с документом */
|
||||
coopname: string | Variable<any, string>,
|
||||
/** Дата и время создания документа */
|
||||
created_at: string | Variable<any, string>,
|
||||
/** Имя генератора, использованного для создания документа */
|
||||
generator: string | Variable<any, string>,
|
||||
/** Язык документа */
|
||||
lang: string | Variable<any, string>,
|
||||
/** Ссылки, связанные с документом */
|
||||
links: Array<string> | Variable<any, string>,
|
||||
/** Хэш проекта */
|
||||
project_hash: string | Variable<any, string>,
|
||||
/** ID документа в реестре */
|
||||
registry_id: number | Variable<any, string>,
|
||||
/** Часовой пояс, в котором был создан документ */
|
||||
timezone: string | Variable<any, string>,
|
||||
/** Название документа */
|
||||
title: string | Variable<any, string>,
|
||||
/** Имя пользователя, создавшего документ */
|
||||
username: string | Variable<any, string>,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version: string | Variable<any, string>
|
||||
};
|
||||
["GetAccountInput"]: {
|
||||
/** Имя аккаунта пользователя */
|
||||
@@ -5409,7 +5485,7 @@ capitalGenerateComponentGenerationContract?: [{ data: ValueTypes["ComponentGener
|
||||
capitalGenerateExpenseDecision?: [{ data: ValueTypes["GenerateDocumentInput"] | Variable<any, string>, options?: ValueTypes["GenerateDocumentOptionsInput"] | undefined | null | Variable<any, string>},ValueTypes["GeneratedDocument"]],
|
||||
capitalGenerateExpenseStatement?: [{ data: ValueTypes["GenerateDocumentInput"] | Variable<any, string>, options?: ValueTypes["GenerateDocumentOptionsInput"] | undefined | null | Variable<any, string>},ValueTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationContract?: [{ data: ValueTypes["GenerationContractGenerateDocumentInput"] | Variable<any, string>, options?: ValueTypes["GenerateDocumentOptionsInput"] | undefined | null | Variable<any, string>},ValueTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationMoneyInvestStatement?: [{ data: ValueTypes["GenerateDocumentInput"] | Variable<any, string>, options?: ValueTypes["GenerateDocumentOptionsInput"] | undefined | null | Variable<any, string>},ValueTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationMoneyInvestStatement?: [{ data: ValueTypes["GenerationMoneyInvestStatementGenerateDocumentInput"] | Variable<any, string>, options?: ValueTypes["GenerateDocumentOptionsInput"] | undefined | null | Variable<any, string>},ValueTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationMoneyReturnUnusedStatement?: [{ data: ValueTypes["GenerateDocumentInput"] | Variable<any, string>, options?: ValueTypes["GenerateDocumentOptionsInput"] | undefined | null | Variable<any, string>},ValueTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationPropertyInvestAct?: [{ data: ValueTypes["GenerateDocumentInput"] | Variable<any, string>, options?: ValueTypes["GenerateDocumentOptionsInput"] | undefined | null | Variable<any, string>},ValueTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationPropertyInvestDecision?: [{ data: ValueTypes["GenerateDocumentInput"] | Variable<any, string>, options?: ValueTypes["GenerateDocumentOptionsInput"] | undefined | null | Variable<any, string>},ValueTypes["GeneratedDocument"]],
|
||||
@@ -10847,7 +10923,7 @@ export type ResolverInputTypes = {
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** Заявление на инвестирование */
|
||||
statement: ResolverInputTypes["SignedDigitalDocumentInput"],
|
||||
statement: ResolverInputTypes["GenerationMoneyInvestStatementSignedDocumentInput"],
|
||||
/** Имя инвестора */
|
||||
username: string
|
||||
};
|
||||
@@ -11691,6 +11767,82 @@ export type ResolverInputTypes = {
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version: string
|
||||
};
|
||||
["GenerationMoneyInvestStatementGenerateDocumentInput"]: {
|
||||
/** Сумма инвестирования */
|
||||
amount: string,
|
||||
/** Номер блока, на котором был создан документ */
|
||||
block_num?: number | undefined | null,
|
||||
/** Название кооператива, связанное с документом */
|
||||
coopname: string,
|
||||
/** Дата и время создания документа */
|
||||
created_at?: string | undefined | null,
|
||||
/** Имя генератора, использованного для создания документа */
|
||||
generator?: string | undefined | null,
|
||||
/** Язык документа */
|
||||
lang?: string | undefined | null,
|
||||
/** Ссылки, связанные с документом */
|
||||
links?: Array<string> | undefined | null,
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** Часовой пояс, в котором был создан документ */
|
||||
timezone?: string | undefined | null,
|
||||
/** Название документа */
|
||||
title?: string | undefined | null,
|
||||
/** Имя пользователя, создавшего документ */
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version?: string | undefined | null
|
||||
};
|
||||
["GenerationMoneyInvestStatementSignedDocumentInput"]: {
|
||||
/** Хэш содержимого документа */
|
||||
doc_hash: string,
|
||||
/** Общий хэш (doc_hash + meta_hash) */
|
||||
hash: string,
|
||||
/** Метаинформация для документа заявления об инвестировании в генерацию */
|
||||
meta: ResolverInputTypes["GenerationMoneyInvestStatementSignedMetaDocumentInput"],
|
||||
/** Хэш мета-данных */
|
||||
meta_hash: string,
|
||||
/** Вектор подписей */
|
||||
signatures: Array<ResolverInputTypes["SignatureInfoInput"]>,
|
||||
/** Версия стандарта документа */
|
||||
version: string
|
||||
};
|
||||
["GenerationMoneyInvestStatementSignedMetaDocumentInput"]: {
|
||||
/** Сумма инвестирования */
|
||||
amount: string,
|
||||
/** Дата создания приложения к проекту */
|
||||
appendix_created_at: string,
|
||||
/** Хэш приложения к проекту */
|
||||
appendix_hash: string,
|
||||
/** Номер блока, на котором был создан документ */
|
||||
block_num: number,
|
||||
/** Дата создания участника */
|
||||
contributor_created_at: string,
|
||||
/** Хэш участника */
|
||||
contributor_hash: string,
|
||||
/** Название кооператива, связанное с документом */
|
||||
coopname: string,
|
||||
/** Дата и время создания документа */
|
||||
created_at: string,
|
||||
/** Имя генератора, использованного для создания документа */
|
||||
generator: string,
|
||||
/** Язык документа */
|
||||
lang: string,
|
||||
/** Ссылки, связанные с документом */
|
||||
links: Array<string>,
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** ID документа в реестре */
|
||||
registry_id: number,
|
||||
/** Часовой пояс, в котором был создан документ */
|
||||
timezone: string,
|
||||
/** Название документа */
|
||||
title: string,
|
||||
/** Имя пользователя, создавшего документ */
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version: string
|
||||
};
|
||||
["GetAccountInput"]: {
|
||||
/** Имя аккаунта пользователя */
|
||||
@@ -12263,7 +12415,7 @@ capitalGenerateComponentGenerationContract?: [{ data: ResolverInputTypes["Compon
|
||||
capitalGenerateExpenseDecision?: [{ data: ResolverInputTypes["GenerateDocumentInput"], options?: ResolverInputTypes["GenerateDocumentOptionsInput"] | undefined | null},ResolverInputTypes["GeneratedDocument"]],
|
||||
capitalGenerateExpenseStatement?: [{ data: ResolverInputTypes["GenerateDocumentInput"], options?: ResolverInputTypes["GenerateDocumentOptionsInput"] | undefined | null},ResolverInputTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationContract?: [{ data: ResolverInputTypes["GenerationContractGenerateDocumentInput"], options?: ResolverInputTypes["GenerateDocumentOptionsInput"] | undefined | null},ResolverInputTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationMoneyInvestStatement?: [{ data: ResolverInputTypes["GenerateDocumentInput"], options?: ResolverInputTypes["GenerateDocumentOptionsInput"] | undefined | null},ResolverInputTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationMoneyInvestStatement?: [{ data: ResolverInputTypes["GenerationMoneyInvestStatementGenerateDocumentInput"], options?: ResolverInputTypes["GenerateDocumentOptionsInput"] | undefined | null},ResolverInputTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationMoneyReturnUnusedStatement?: [{ data: ResolverInputTypes["GenerateDocumentInput"], options?: ResolverInputTypes["GenerateDocumentOptionsInput"] | undefined | null},ResolverInputTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationPropertyInvestAct?: [{ data: ResolverInputTypes["GenerateDocumentInput"], options?: ResolverInputTypes["GenerateDocumentOptionsInput"] | undefined | null},ResolverInputTypes["GeneratedDocument"]],
|
||||
capitalGenerateGenerationPropertyInvestDecision?: [{ data: ResolverInputTypes["GenerateDocumentInput"], options?: ResolverInputTypes["GenerateDocumentOptionsInput"] | undefined | null},ResolverInputTypes["GeneratedDocument"]],
|
||||
@@ -17643,7 +17795,7 @@ export type ModelTypes = {
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** Заявление на инвестирование */
|
||||
statement: ModelTypes["SignedDigitalDocumentInput"],
|
||||
statement: ModelTypes["GenerationMoneyInvestStatementSignedDocumentInput"],
|
||||
/** Имя инвестора */
|
||||
username: string
|
||||
};
|
||||
@@ -18458,6 +18610,82 @@ export type ModelTypes = {
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version: string
|
||||
};
|
||||
["GenerationMoneyInvestStatementGenerateDocumentInput"]: {
|
||||
/** Сумма инвестирования */
|
||||
amount: string,
|
||||
/** Номер блока, на котором был создан документ */
|
||||
block_num?: number | undefined | null,
|
||||
/** Название кооператива, связанное с документом */
|
||||
coopname: string,
|
||||
/** Дата и время создания документа */
|
||||
created_at?: string | undefined | null,
|
||||
/** Имя генератора, использованного для создания документа */
|
||||
generator?: string | undefined | null,
|
||||
/** Язык документа */
|
||||
lang?: string | undefined | null,
|
||||
/** Ссылки, связанные с документом */
|
||||
links?: Array<string> | undefined | null,
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** Часовой пояс, в котором был создан документ */
|
||||
timezone?: string | undefined | null,
|
||||
/** Название документа */
|
||||
title?: string | undefined | null,
|
||||
/** Имя пользователя, создавшего документ */
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version?: string | undefined | null
|
||||
};
|
||||
["GenerationMoneyInvestStatementSignedDocumentInput"]: {
|
||||
/** Хэш содержимого документа */
|
||||
doc_hash: string,
|
||||
/** Общий хэш (doc_hash + meta_hash) */
|
||||
hash: string,
|
||||
/** Метаинформация для документа заявления об инвестировании в генерацию */
|
||||
meta: ModelTypes["GenerationMoneyInvestStatementSignedMetaDocumentInput"],
|
||||
/** Хэш мета-данных */
|
||||
meta_hash: string,
|
||||
/** Вектор подписей */
|
||||
signatures: Array<ModelTypes["SignatureInfoInput"]>,
|
||||
/** Версия стандарта документа */
|
||||
version: string
|
||||
};
|
||||
["GenerationMoneyInvestStatementSignedMetaDocumentInput"]: {
|
||||
/** Сумма инвестирования */
|
||||
amount: string,
|
||||
/** Дата создания приложения к проекту */
|
||||
appendix_created_at: string,
|
||||
/** Хэш приложения к проекту */
|
||||
appendix_hash: string,
|
||||
/** Номер блока, на котором был создан документ */
|
||||
block_num: number,
|
||||
/** Дата создания участника */
|
||||
contributor_created_at: string,
|
||||
/** Хэш участника */
|
||||
contributor_hash: string,
|
||||
/** Название кооператива, связанное с документом */
|
||||
coopname: string,
|
||||
/** Дата и время создания документа */
|
||||
created_at: string,
|
||||
/** Имя генератора, использованного для создания документа */
|
||||
generator: string,
|
||||
/** Язык документа */
|
||||
lang: string,
|
||||
/** Ссылки, связанные с документом */
|
||||
links: Array<string>,
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** ID документа в реестре */
|
||||
registry_id: number,
|
||||
/** Часовой пояс, в котором был создан документ */
|
||||
timezone: string,
|
||||
/** Название документа */
|
||||
title: string,
|
||||
/** Имя пользователя, создавшего документ */
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version: string
|
||||
};
|
||||
["GetAccountInput"]: {
|
||||
/** Имя аккаунта пользователя */
|
||||
@@ -24582,7 +24810,7 @@ export type GraphQLTypes = {
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** Заявление на инвестирование */
|
||||
statement: GraphQLTypes["SignedDigitalDocumentInput"],
|
||||
statement: GraphQLTypes["GenerationMoneyInvestStatementSignedDocumentInput"],
|
||||
/** Имя инвестора */
|
||||
username: string
|
||||
};
|
||||
@@ -25426,6 +25654,82 @@ export type GraphQLTypes = {
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version: string
|
||||
};
|
||||
["GenerationMoneyInvestStatementGenerateDocumentInput"]: {
|
||||
/** Сумма инвестирования */
|
||||
amount: string,
|
||||
/** Номер блока, на котором был создан документ */
|
||||
block_num?: number | undefined | null,
|
||||
/** Название кооператива, связанное с документом */
|
||||
coopname: string,
|
||||
/** Дата и время создания документа */
|
||||
created_at?: string | undefined | null,
|
||||
/** Имя генератора, использованного для создания документа */
|
||||
generator?: string | undefined | null,
|
||||
/** Язык документа */
|
||||
lang?: string | undefined | null,
|
||||
/** Ссылки, связанные с документом */
|
||||
links?: Array<string> | undefined | null,
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** Часовой пояс, в котором был создан документ */
|
||||
timezone?: string | undefined | null,
|
||||
/** Название документа */
|
||||
title?: string | undefined | null,
|
||||
/** Имя пользователя, создавшего документ */
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version?: string | undefined | null
|
||||
};
|
||||
["GenerationMoneyInvestStatementSignedDocumentInput"]: {
|
||||
/** Хэш содержимого документа */
|
||||
doc_hash: string,
|
||||
/** Общий хэш (doc_hash + meta_hash) */
|
||||
hash: string,
|
||||
/** Метаинформация для документа заявления об инвестировании в генерацию */
|
||||
meta: GraphQLTypes["GenerationMoneyInvestStatementSignedMetaDocumentInput"],
|
||||
/** Хэш мета-данных */
|
||||
meta_hash: string,
|
||||
/** Вектор подписей */
|
||||
signatures: Array<GraphQLTypes["SignatureInfoInput"]>,
|
||||
/** Версия стандарта документа */
|
||||
version: string
|
||||
};
|
||||
["GenerationMoneyInvestStatementSignedMetaDocumentInput"]: {
|
||||
/** Сумма инвестирования */
|
||||
amount: string,
|
||||
/** Дата создания приложения к проекту */
|
||||
appendix_created_at: string,
|
||||
/** Хэш приложения к проекту */
|
||||
appendix_hash: string,
|
||||
/** Номер блока, на котором был создан документ */
|
||||
block_num: number,
|
||||
/** Дата создания участника */
|
||||
contributor_created_at: string,
|
||||
/** Хэш участника */
|
||||
contributor_hash: string,
|
||||
/** Название кооператива, связанное с документом */
|
||||
coopname: string,
|
||||
/** Дата и время создания документа */
|
||||
created_at: string,
|
||||
/** Имя генератора, использованного для создания документа */
|
||||
generator: string,
|
||||
/** Язык документа */
|
||||
lang: string,
|
||||
/** Ссылки, связанные с документом */
|
||||
links: Array<string>,
|
||||
/** Хэш проекта */
|
||||
project_hash: string,
|
||||
/** ID документа в реестре */
|
||||
registry_id: number,
|
||||
/** Часовой пояс, в котором был создан документ */
|
||||
timezone: string,
|
||||
/** Название документа */
|
||||
title: string,
|
||||
/** Имя пользователя, создавшего документ */
|
||||
username: string,
|
||||
/** Версия генератора, использованного для создания документа */
|
||||
version: string
|
||||
};
|
||||
["GetAccountInput"]: {
|
||||
/** Имя аккаунта пользователя */
|
||||
@@ -29015,6 +29319,9 @@ type ZEUS_VARIABLES = {
|
||||
["GenerationContractGenerateDocumentInput"]: ValueTypes["GenerationContractGenerateDocumentInput"];
|
||||
["GenerationContractSignedDocumentInput"]: ValueTypes["GenerationContractSignedDocumentInput"];
|
||||
["GenerationContractSignedMetaDocumentInput"]: ValueTypes["GenerationContractSignedMetaDocumentInput"];
|
||||
["GenerationMoneyInvestStatementGenerateDocumentInput"]: ValueTypes["GenerationMoneyInvestStatementGenerateDocumentInput"];
|
||||
["GenerationMoneyInvestStatementSignedDocumentInput"]: ValueTypes["GenerationMoneyInvestStatementSignedDocumentInput"];
|
||||
["GenerationMoneyInvestStatementSignedMetaDocumentInput"]: ValueTypes["GenerationMoneyInvestStatementSignedMetaDocumentInput"];
|
||||
["GetAccountInput"]: ValueTypes["GetAccountInput"];
|
||||
["GetAccountsInput"]: ValueTypes["GetAccountsInput"];
|
||||
["GetBranchesInput"]: ValueTypes["GetBranchesInput"];
|
||||
|
||||
Reference in New Issue
Block a user