docs & bpmn story type

This commit is contained in:
Alex Ant
2026-03-23 00:40:49 +05:00
parent 62ab4ac379
commit f7fffe2859
178 changed files with 137953 additions and 18751 deletions
File diff suppressed because it is too large Load Diff
+12
View File
@@ -3300,6 +3300,9 @@ type CapitalStory {
"""Имя аккаунта кооператива"""
coopname: String!
"""Формат содержимого (markdown-текст или BPMN 2.0 XML в description)"""
content_format: CapitalStoryContentFormat!
"""Имя пользователя, создавшего историю"""
created_by: String!
@@ -4614,6 +4617,9 @@ input CreateStoryInput {
"""Имя аккаунта кооператива"""
coopname: String!
"""Формат содержимого; по умолчанию MARKDOWN"""
content_format: CapitalStoryContentFormat = MARKDOWN
"""Описание истории"""
description: String
@@ -10259,6 +10265,12 @@ enum StoryStatus {
PENDING
}
"""Формат содержимого требования (истории) в CAPITAL"""
enum CapitalStoryContentFormat {
BPMN
MARKDOWN
}
input SubmitVoteInput {
"""Имя аккаунта кооператива"""
coopname: String!
+10 -3
View File
@@ -1,4 +1,4 @@
import express from 'express';
import express, { type Request, type Response, type NextFunction } from 'express';
import helmet from 'helmet';
import xss from 'xss-clean';
import mongoSanitize from 'express-mongo-sanitize';
@@ -23,8 +23,15 @@ app.use(express.json({ limit: '2mb' }));
// parse urlencoded request body
app.use(express.urlencoded({ extended: true, limit: '2mb' }));
// sanitize request data
app.use(xss());
// sanitize request data (GraphQL variables могут содержать сырой XML/HTML — xss-clean ломает BPMN и пр.)
const xssMiddleware = xss();
app.use((req: Request, res: Response, next: NextFunction) => {
const p = req.path ?? '';
if (p === '/v1/graphql' || p.endsWith('/v1/graphql')) {
return next();
}
return xssMiddleware(req, res, next);
});
app.use(mongoSanitize());
// gzip compression
@@ -0,0 +1,17 @@
/**
* Минимальная валидная BPMN 2.0 диаграмма со стартовым событием (совместима с bpmn-js).
* Используется при создании story с форматом BPMN без тела.
*/
export const EMPTY_BPMN_STORY_XML = `<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Coopenomics" exporterVersion="1.0">
<bpmn:process id="Process_1" isExecutable="true">
<bpmn:startEvent id="StartEvent_1" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="159" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>`;
@@ -1,6 +1,7 @@
import { Field, InputType, Int } from '@nestjs/graphql';
import { IsNotEmpty, IsString, IsOptional, IsEnum, Min } from 'class-validator';
import { StoryStatus } from '../../../domain/enums/story-status.enum';
import { StoryContentFormat } from '../../../domain/enums/story-content-format.enum';
/**
* GraphQL Input DTO для создания истории
@@ -36,6 +37,15 @@ export class CreateStoryInputDTO {
@IsString({ message: 'Описание истории должно быть строкой' })
description?: string;
@Field(() => StoryContentFormat, {
nullable: true,
description: 'Формат содержимого; по умолчанию MARKDOWN',
defaultValue: StoryContentFormat.MARKDOWN,
})
@IsOptional()
@IsEnum(StoryContentFormat, { message: 'Неверный формат содержимого истории' })
content_format?: StoryContentFormat;
@Field(() => StoryStatus, {
nullable: true,
description: 'Статус истории',
@@ -1,5 +1,6 @@
import { ObjectType, Field, Int } from '@nestjs/graphql';
import { StoryStatus } from '../../../domain/enums/story-status.enum';
import { StoryContentFormat } from '../../../domain/enums/story-content-format.enum';
import { BaseOutputDTO } from '~/shared/dto/base.dto';
/**
@@ -30,6 +31,11 @@ export class StoryOutputDTO extends BaseOutputDTO {
})
description?: string;
@Field(() => StoryContentFormat, {
description: 'Формат содержимого (markdown-текст или BPMN 2.0 XML в description)',
})
content_format!: StoryContentFormat;
@Field(() => StoryStatus, {
description: 'Статус истории',
})
@@ -29,6 +29,9 @@ import { CommitOutputDTO } from '../dto/generation/commit.dto';
import { CycleOutputDTO } from '../dto/generation/cycle.dto';
import { PaginationInputDTO, PaginationResult } from '~/application/common/dto/pagination.dto';
import { StoryStatus } from '../../domain/enums/story-status.enum';
import { StoryContentFormat } from '../../domain/enums/story-content-format.enum';
import { normalizeBpmnStoryDescription } from '../../domain/utils/bpmn-story-description.util';
import { EMPTY_BPMN_STORY_XML } from '../constants/empty-bpmn-story-xml';
import { IssuePriority } from '../../domain/enums/issue-priority.enum';
import { IssueStatus } from '../../domain/enums/issue-status.enum';
import { CycleStatus } from '../../domain/enums/cycle-status.enum';
@@ -149,13 +152,23 @@ export class GenerationService {
throw new Error('Требование должно быть привязано либо к проекту, либо к задаче');
}
const contentFormat = data.content_format ?? StoryContentFormat.MARKDOWN;
let description = data.description;
if (contentFormat === StoryContentFormat.BPMN) {
const trimmed = description?.trim();
if (!trimmed) {
description = EMPTY_BPMN_STORY_XML;
}
}
// Создаем данные для доменной сущности
const storyDatabaseData: IStoryDatabaseData = {
_id: '',
story_hash: data.story_hash,
coopname: data.coopname,
title: data.title,
description: data.description,
description,
content_format: contentFormat,
status: data.status || StoryStatus.PENDING,
project_hash: data.project_hash,
// Нормализация: пустая строка или undefined преобразуется в undefined
@@ -201,13 +214,19 @@ export class GenerationService {
// Определяем issue_hash с нормализацией
const issueHash = data.issue_hash ?? existingStory.issue_hash;
let nextDescription = data.description ?? existingStory.description;
if (existingStory.content_format === StoryContentFormat.BPMN && data.description !== undefined) {
nextDescription = normalizeBpmnStoryDescription(data.description, StoryContentFormat.BPMN);
}
// Создаем обновленные данные для доменной сущности
const updatedStoryDatabaseData: IStoryDatabaseData = {
_id: existingStory._id,
story_hash: existingStory.story_hash,
coopname: existingStory.coopname,
title: data.title ?? existingStory.title,
description: data.description ?? existingStory.description,
description: nextDescription,
content_format: existingStory.content_format,
status: data.status ?? existingStory.status,
project_hash: data.project_hash ?? existingStory.project_hash,
// Нормализация: пустая строка или undefined преобразуется в undefined
@@ -1,4 +1,5 @@
import { StoryStatus } from '../enums/story-status.enum';
import { StoryContentFormat } from '../enums/story-content-format.enum';
import type { IStoryDatabaseData } from '../interfaces/story-database.interface';
import { BaseDomainEntity } from '~/shared/sync/entities/base-domain.entity';
@@ -19,7 +20,7 @@ export class StoryDomainEntity extends BaseDomainEntity<IStoryDatabaseData> {
public issue_hash?: string; // Хеш задачи (если история привязана к задаче)
public created_by: string; // Имя пользователя, создавшего историю
public sort_order: number; // Порядок сортировки
public content_format: StoryContentFormat; // Формат содержимого истории
/**
* Конструктор для создания доменной сущности
*
@@ -34,6 +35,7 @@ export class StoryDomainEntity extends BaseDomainEntity<IStoryDatabaseData> {
this.coopname = databaseData.coopname;
this.title = databaseData.title;
this.description = databaseData.description;
this.content_format = databaseData.content_format ?? StoryContentFormat.MARKDOWN;
this.status = databaseData.status; // Переопределяем статус с правильным типом
this.project_hash = databaseData.project_hash?.toLowerCase();
this.issue_hash = databaseData.issue_hash;
@@ -0,0 +1,14 @@
import { registerEnumType } from '@nestjs/graphql';
/**
* Формат тела требования (story): markdown-текст или BPMN 2.0 XML в поле description.
*/
export enum StoryContentFormat {
MARKDOWN = 'MARKDOWN',
BPMN = 'BPMN',
}
registerEnumType(StoryContentFormat, {
name: 'CapitalStoryContentFormat',
description: 'Формат содержимого требования (истории) в CAPITAL',
});
@@ -1,4 +1,5 @@
import type { StoryStatus } from '../enums/story-status.enum';
import type { StoryContentFormat } from '../enums/story-content-format.enum';
import type { IBaseDatabaseData } from '~/shared/sync/interfaces/base-database.interface';
/**
@@ -9,6 +10,7 @@ export interface IStoryDatabaseData extends IBaseDatabaseData {
coopname: string; // Имя аккаунта кооператива
title: string; // Название истории
description?: string; // Описание истории
content_format: StoryContentFormat; // Формат тела (markdown или BPMN XML)
status: StoryStatus; // Статус истории
project_hash?: string; // Хеш проекта (если история привязана к проекту)
issue_hash?: string; // Хеш задачи (если история привязана к задаче)
@@ -0,0 +1,38 @@
import { StoryContentFormat } from '../enums/story-content-format.enum';
function decodeHtmlEntitiesOnce(s: string): string {
return s
.replace(/&amp;/g, '&')
.replace(/&lt;/g, '<')
.replace(/&gt;/g, '>')
.replace(/&quot;/g, '"')
.replace(/&#39;/g, "'");
}
/**
* Глобальный middleware xss-clean экранирует `<` в теле JSON (в т.ч. GraphQL variables).
* BPMN XML в БД мог сохраниться как `&lt;?xml ...`; восстанавливаем валидный XML только для BPMN.
*/
export function normalizeBpmnStoryDescription(
description: string | undefined,
contentFormat: StoryContentFormat,
): string | undefined {
if (description === undefined || description === '') {
return description;
}
if (contentFormat !== StoryContentFormat.BPMN) {
return description;
}
if (!description.includes('&lt;') && !description.includes('&amp;lt;')) {
return description;
}
let out = description;
for (let i = 0; i < 4; i += 1) {
const next = decodeHtmlEntitiesOnce(out);
if (next === out) {
break;
}
out = next;
}
return out;
}
@@ -1,5 +1,6 @@
import { Entity, Column, Index, ManyToOne, JoinColumn } from 'typeorm';
import { StoryStatus } from '../../domain/enums/story-status.enum';
import { StoryContentFormat } from '../../domain/enums/story-content-format.enum';
import { ProjectTypeormEntity } from './project.typeorm-entity';
import { IssueTypeormEntity } from './issue.typeorm-entity';
import { BaseTypeormEntity } from '~/shared/sync/entities/base-typeorm.entity';
@@ -26,6 +27,13 @@ export class StoryTypeormEntity extends BaseTypeormEntity {
@Column({ type: 'text', nullable: true })
description?: string;
@Column({
type: 'enum',
enum: StoryContentFormat,
default: StoryContentFormat.MARKDOWN,
})
content_format!: StoryContentFormat;
@Column({
type: 'enum',
enum: StoryStatus,
@@ -1,4 +1,6 @@
import { StoryDomainEntity } from '../../domain/entities/story.entity';
import { StoryContentFormat } from '../../domain/enums/story-content-format.enum';
import { normalizeBpmnStoryDescription } from '../../domain/utils/bpmn-story-description.util';
import { StoryTypeormEntity } from '../entities/story.typeorm-entity';
import type { IStoryDatabaseData } from '../../domain/interfaces/story-database.interface';
@@ -10,12 +12,14 @@ export class StoryMapper {
* Преобразование TypeORM сущности в доменную сущность
*/
static toDomain(entity: StoryTypeormEntity): StoryDomainEntity {
const contentFormat = entity.content_format ?? StoryContentFormat.MARKDOWN;
const databaseData: IStoryDatabaseData = {
_id: entity._id,
story_hash: entity.story_hash,
coopname: entity.coopname,
title: entity.title,
description: entity.description,
description: normalizeBpmnStoryDescription(entity.description, contentFormat),
content_format: contentFormat,
status: entity.status,
project_hash: entity.project_hash,
// Нормализация: пустая строка преобразуется в undefined
@@ -41,6 +45,7 @@ export class StoryMapper {
coopname: domain.coopname,
title: domain.title,
description: domain.description,
content_format: domain.content_format,
status: domain.status,
project_hash: domain.project_hash,
// Нормализация: undefined/пустая строка преобразуется в undefined для правильной работы с БД
@@ -0,0 +1 @@
export * from './ui';
@@ -0,0 +1,183 @@
<template lang="pug">
.bpmn-story-editor(
ref="rootEl"
:class="{ 'bpmn-story-editor--app-dark': isAppDark }"
:style="rootStyle"
)
</template>
<script setup lang="ts">
import { ref, computed, watch, onBeforeUnmount, onMounted, nextTick } from 'vue';
import { useQuasar } from 'quasar';
import { EMPTY_BPMN_STORY_XML, decodeBpmnXmlIfEscaped } from 'app/extensions/capital/shared/lib';
const $q = useQuasar();
const isAppDark = computed(() => $q.dark.isActive);
interface BpmnToolkit {
destroy: () => void;
importXML: (xml: string) => Promise<unknown>;
on: (event: string, fn: () => void) => void;
off?: (event: string, fn: () => void) => void;
saveXML: (options: { format?: boolean }) => Promise<{ xml?: string }>;
}
const props = withDefaults(
defineProps<{
modelValue: string;
readonly?: boolean;
minHeight?: number;
}>(),
{
readonly: false,
minHeight: 400,
},
);
const emit = defineEmits<{
'update:modelValue': [value: string];
}>();
const rootEl = ref<HTMLElement | null>(null);
const toolkit = ref<BpmnToolkit | null>(null);
const internalXml = ref(props.modelValue || EMPTY_BPMN_STORY_XML);
let suppressXmlEmit = false;
const rootStyle = computed(() => ({
minHeight: `${props.minHeight}px`,
height: '100%',
}));
async function loadStyles(): Promise<void> {
await import('bpmn-js/dist/assets/diagram-js.css');
await import('bpmn-js/dist/assets/bpmn-font/css/bpmn.css');
}
async function initToolkit(): Promise<void> {
const el = rootEl.value;
if (!el || typeof window === 'undefined') return;
await loadStyles();
const xml = props.modelValue?.trim() ? props.modelValue : EMPTY_BPMN_STORY_XML;
internalXml.value = xml;
if (props.readonly) {
const { default: NavigatedViewer } = await import('bpmn-js/lib/NavigatedViewer');
const viewer = new NavigatedViewer({ container: el }) as unknown as BpmnToolkit;
toolkit.value = viewer;
suppressXmlEmit = true;
try {
await viewer.importXML(xml);
} finally {
suppressXmlEmit = false;
}
return;
}
const { default: BpmnModeler } = await import('bpmn-js/lib/Modeler');
const modeler = new BpmnModeler({ container: el }) as unknown as BpmnToolkit;
toolkit.value = modeler;
const onChange = (): void => {
if (props.readonly || suppressXmlEmit) return;
void modeler.saveXML({ format: true }).then(({ xml: out }) => {
if (out === undefined) return;
if (out === internalXml.value) return;
internalXml.value = out;
emit('update:modelValue', out);
});
};
modeler.on('commandStack.changed', onChange);
suppressXmlEmit = true;
try {
await modeler.importXML(xml);
} finally {
suppressXmlEmit = false;
}
}
function destroyToolkit(): void {
const t = toolkit.value;
if (t) {
t.destroy();
toolkit.value = null;
}
}
onMounted(() => {
void initToolkit();
});
onBeforeUnmount(() => {
destroyToolkit();
});
watch(
() => props.readonly,
async () => {
destroyToolkit();
await nextTick();
void initToolkit();
},
);
watch(
() => props.modelValue,
async (next) => {
const t = toolkit.value;
if (!t) return;
const raw = next?.trim() ? next : EMPTY_BPMN_STORY_XML;
const normalized = decodeBpmnXmlIfEscaped(raw);
if (normalized === internalXml.value) return;
internalXml.value = normalized;
suppressXmlEmit = true;
try {
await t.importXML(normalized);
} finally {
suppressXmlEmit = false;
}
},
);
</script>
<style lang="scss" scoped>
/* bpmn-js рассчитан на светлую схему; при body--dark Quasar даёт светлый color — наследуется
direct-editing (contenteditable) → невидимый текст на светлом холсте. */
.bpmn-story-editor {
--bpmn-story-fg: hsl(225, 10%, 15%);
width: 100%;
border: 1px solid rgba(0, 0, 0, 0.12);
border-radius: 4px;
overflow: hidden;
background: #fff;
color: var(--bpmn-story-fg);
color-scheme: light;
isolation: isolate;
&.bpmn-story-editor--app-dark {
border-color: rgba(255, 255, 255, 0.14);
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.35);
}
:deep(.djs-container) {
height: 100%;
min-height: inherit;
}
:deep([contenteditable='true']) {
color: var(--bpmn-story-fg) !important;
caret-color: var(--bpmn-story-fg);
}
:deep(textarea),
:deep(input[type='text']),
:deep(input[type='search']) {
color: var(--bpmn-story-fg);
caret-color: var(--bpmn-story-fg);
}
}
</style>
@@ -0,0 +1 @@
export { default as BpmnStoryEditor } from './BpmnStoryEditor.vue';
@@ -5,29 +5,48 @@ CreateDialog(
submit-text="Создать"
dialog-style="width: 500px; max-width: 100% !important;"
:is-submitting="isSubmitting"
:disable-submit="!canCreate"
:disabled="!canCreate"
@submit="handleSubmit"
@dialog-closed="clear"
)
template(#form-fields)
q-input(
ref='titleInput'
autofocus
type="textarea"
rows=3
v-model='formData.title',
standout='bg-teal text-white',
label='Кратко сформулируйте требование',
:rules='[(val) => notEmpty(val)]',
autocomplete='off'
@keydown.enter.prevent='handleSubmit'
)
.create-requirement-form
.crf-block
.crf-block__head
.crf-block__title.text-weight-medium Формат содержимого
.crf-block__caption.text-grey-7 Текст в Markdown или диаграмма BPMN выберите до сохранения.
.crf-toggle-shell.q-pa-xs.rounded-borders
q-btn-toggle.crf-toggle(
v-model="contentFormat"
spread
no-caps
dense
rounded
unelevated
toggle-color="primary"
:options="contentFormatOptions"
)
q-checkbox(
v-model='createAnother',
label='Создать еще одно требование'
)
.crf-block
q-input.crf-input(
ref='titleInput'
autofocus
outlined
v-model='formData.title'
label='Суть требования'
hint='Коротко опишите ожидаемое поведение или результат — детали можно добавить позже. Ctrl+Enter или ⌘+Enter — создать.'
:rules='[(val) => notEmpty(val)]'
autocomplete='off'
@keydown='handleTitleKeydown'
)
.crf-extras
q-checkbox.crf-checkbox(
v-model='createAnother'
dense
label='Создать ещё одно требование'
)
</template>
<script setup lang="ts">
@@ -36,6 +55,7 @@ import { useSystemStore } from 'src/entities/System/model';
import { CreateDialog } from 'src/shared/ui/CreateDialog';
import { useCreateStory } from '../../model';
import { FailAlert, SuccessAlert } from 'src/shared/api/alerts';
import { Zeus } from '@coopenomics/sdk';
const props = defineProps<{
filter?: {
@@ -60,6 +80,13 @@ const { createStory } = useCreateStory();
const createAnother = ref(false);
const isSubmitting = ref(false);
const markdownFormat = Zeus.CapitalStoryContentFormat.MARKDOWN;
const contentFormat = ref<Zeus.CapitalStoryContentFormat>(markdownFormat);
const contentFormatOptions = [
{ label: 'Markdown', value: markdownFormat },
{ label: 'BPMN', value: Zeus.CapitalStoryContentFormat.BPMN },
];
const formData = ref({
title: '',
description: '',
@@ -69,11 +96,19 @@ const notEmpty = (val: any) => {
return !!val || 'Это поле обязательно для заполнения';
};
const handleTitleKeydown = (e: KeyboardEvent): void => {
if (e.key !== 'Enter') return;
if (!e.ctrlKey && !e.metaKey) return;
e.preventDefault();
void handleSubmit();
};
const clearForm = async () => {
formData.value = {
title: '',
description: '',
};
contentFormat.value = markdownFormat;
// Сбрасываем валидацию
titleInput.value?.resetValidation();
@@ -91,10 +126,12 @@ const clear = async () => {
const handleSubmit = async () => {
isSubmitting.value = true;
try {
const isBpmn = contentFormat.value === Zeus.CapitalStoryContentFormat.BPMN;
const inputData = {
coopname: system.info.coopname,
title: formData.value.title,
description: formData.value.description,
description: isBpmn ? '' : formData.value.description,
content_format: contentFormat.value,
story_hash: '',
...props.filter, // Добавляем фильтр (project_hash или issue_id)
};
@@ -126,3 +163,46 @@ defineExpose({
clear: () => dialogRef.value?.clear(),
});
</script>
<style lang="scss" scoped>
.create-requirement-form {
display: flex;
flex-direction: column;
gap: 1.25rem;
}
.crf-block__head {
display: flex;
flex-direction: column;
gap: 4px;
margin-bottom: 10px;
}
.crf-block__title {
font-size: 0.9375rem;
line-height: 1.35;
}
.crf-block__caption {
font-size: 0.8125rem;
line-height: 1.45;
}
.crf-toggle-shell {
border: 1px solid rgba(127, 127, 127, 0.22);
}
.crf-toggle-shell :deep(.q-btn) {
min-height: 36px;
}
.crf-input :deep(.q-field__native) {
line-height: 1.45;
}
.crf-extras {
margin-top: 0.125rem;
padding-top: 0.75rem;
border-top: 1px solid rgba(127, 127, 127, 0.22);
}
</style>
@@ -5,40 +5,84 @@ CreateDialog(
title="Создать требование"
submit-text="Создать"
:is-submitting="isSubmitting"
:disable-submit="!canCreate"
:disabled="!canCreate"
@submit="handleSubmit"
@dialog-closed="clear"
)
template(#form-fields)
q-input(
ref='titleInput'
autofocus
type="textarea"
rows=2
v-model='formData.title',
standout='bg-teal text-white',
label='Заголовок требования',
placeholder='Кратко сформулируйте требование',
:rules='[(val) => notEmpty(val)]',
autocomplete='off'
).q-mb-md
.text-subtitle2.q-mb-sm Описание требования
Editor(
v-model='formData.description'
placeholder='Опишите требование подробно в формате Markdown...'
:minHeight="300",
:padded="false"
)
.create-requirement-form
.crf-block
.crf-block__head
.crf-block__title.text-weight-medium Формат содержимого
.crf-block__caption.text-grey-7 Текст в Markdown или диаграмма BPMN выберите до сохранения.
.crf-toggle-shell.q-pa-xs.rounded-borders
q-btn-toggle.crf-toggle(
v-model="contentFormat"
spread
no-caps
dense
rounded
unelevated
toggle-color="primary"
:options="contentFormatOptions"
)
.crf-block
q-input.crf-input(
ref='titleInput'
autofocus
outlined
v-model='formData.title'
label='Заголовок'
placeholder='Кратко сформулируйте требование'
hint='Ctrl+Enter или ⌘+Enter — создать требование.'
:rules='[(val) => notEmpty(val)]'
autocomplete='off'
@keydown='handleTitleKeydown'
)
template(v-if="contentFormat === markdownFormat")
.crf-block
.crf-block__head
.crf-block__title.text-weight-medium Описание
.crf-block__caption.text-grey-7 Markdown: списки, выделение, ссылки как в обычной документации.
.crf-editor-frame
Editor(
v-model='formData.description'
placeholder='Опишите требование подробно...'
:minHeight="300"
:padded="false"
)
template(v-else)
.crf-block
.crf-bpmn-note.q-pa-md.rounded-borders.bg-grey-2
.row.no-wrap.items-start.q-gutter-sm
q-icon(name="info" color="primary" size="22px").crf-bpmn-note__icon
.col.text-body2.text-grey-8
| Тело диаграммы создаётся автоматически. После нажатия «Создать» откроется редактор BPMN там можно нарисовать процесс.
EditRequirementDialog(
ref="followUpEditRef"
:requirement="storyForFollowUpEdit"
:canEdit="true"
@close="onFollowUpClose"
@updated="onFollowUpUpdated"
)
</template>
<script setup lang="ts">
import { ref, nextTick, computed } from 'vue';
import { Zeus } from '@coopenomics/sdk';
import { useSystemStore } from 'src/entities/System/model';
import { CreateDialog } from 'src/shared/ui/CreateDialog';
import { Editor } from 'src/shared/ui';
import { useCreateStory } from '../../model';
import { FailAlert, SuccessAlert } from 'src/shared/api/alerts';
import { EditRequirementDialog } from 'app/extensions/capital/features/Story/EditRequirement';
import type { IStory } from 'app/extensions/capital/entities/Story/model';
const props = defineProps<{
filter?: {
@@ -49,14 +93,24 @@ const props = defineProps<{
const emit = defineEmits<{
success: [];
error: [error: any];
error: [error: unknown];
}>();
const dialogRef = ref();
const titleInput = ref();
const followUpEditRef = ref();
const system = useSystemStore();
const { createStory } = useCreateStory();
const markdownFormat = Zeus.CapitalStoryContentFormat.MARKDOWN;
const contentFormat = ref<Zeus.CapitalStoryContentFormat>(markdownFormat);
const contentFormatOptions = [
{ label: 'Markdown', value: markdownFormat },
{ label: 'BPMN', value: Zeus.CapitalStoryContentFormat.BPMN },
];
const storyForFollowUpEdit = ref<IStory | null>(null);
const isSubmitting = ref(false);
const formData = ref({
@@ -68,7 +122,7 @@ const canCreate = computed(() => {
return formData.value.title.trim().length > 0;
});
const notEmpty = (val: any) => {
const notEmpty = (val: string) => {
return !!val || 'Это поле обязательно для заполнения';
};
@@ -77,11 +131,10 @@ const clearForm = async () => {
title: '',
description: '',
};
contentFormat.value = markdownFormat;
// Сбрасываем валидацию
titleInput.value?.resetValidation();
// Устанавливаем фокус на первое поле после очистки
await nextTick();
titleInput.value?.focus();
};
@@ -90,24 +143,40 @@ const clear = async () => {
await clearForm();
};
const onFollowUpClose = () => {
storyForFollowUpEdit.value = null;
};
const onFollowUpUpdated = (updated: IStory) => {
storyForFollowUpEdit.value = updated;
};
const handleSubmit = async () => {
isSubmitting.value = true;
try {
const isBpmn = contentFormat.value === Zeus.CapitalStoryContentFormat.BPMN;
const inputData = {
coopname: system.info.coopname,
title: formData.value.title,
description: formData.value.description,
description: isBpmn ? '' : formData.value.description,
content_format: contentFormat.value,
story_hash: '',
...props.filter, // Добавляем фильтр (project_hash или issue_id)
...props.filter,
};
await createStory(inputData);
const created = await createStory(inputData);
SuccessAlert('Требование успешно создано');
// Закрываем диалог после успешного создания
dialogRef.value?.clear();
emit('success');
if (created.content_format === Zeus.CapitalStoryContentFormat.BPMN) {
storyForFollowUpEdit.value = created;
await nextTick();
followUpEditRef.value?.openDialog();
}
} catch (error) {
FailAlert(error);
emit('error', error);
@@ -116,9 +185,64 @@ const handleSubmit = async () => {
}
};
// Экспортируем функции для внешнего использования
const handleTitleKeydown = (e: KeyboardEvent): void => {
if (e.key !== 'Enter') return;
if (!e.ctrlKey && !e.metaKey) return;
e.preventDefault();
void handleSubmit();
};
defineExpose({
openDialog: () => dialogRef.value?.openDialog(),
clear: () => dialogRef.value?.clear(),
});
</script>
<style lang="scss" scoped>
.create-requirement-form {
display: flex;
flex-direction: column;
gap: 1.25rem;
}
.crf-block__head {
display: flex;
flex-direction: column;
gap: 4px;
margin-bottom: 10px;
}
.crf-block__title {
font-size: 0.9375rem;
line-height: 1.35;
}
.crf-block__caption {
font-size: 0.8125rem;
line-height: 1.45;
}
.crf-toggle-shell :deep(.q-btn) {
min-height: 36px;
}
.crf-input :deep(.q-field__native) {
line-height: 1.45;
}
.crf-editor-frame {
border: 1px solid rgba(127, 127, 127, 0.28);
border-radius: 4px;
overflow: hidden;
}
.crf-bpmn-note {
line-height: 1.45;
border: 1px solid rgba(127, 127, 127, 0.22);
}
.crf-bpmn-note__icon {
flex-shrink: 0;
margin-top: 1px;
}
</style>
@@ -32,9 +32,18 @@ q-dialog(
q-tooltip Закрыть
q-card-section.col.scroll
// Отображаем markdown редактор
template(v-if="requirement && isBpmnFormat")
ClientOnly
template(#fallback)
.flex.flex-center.bpmn-fallback
q-spinner(color="primary" size="48px")
BpmnStoryEditor(
v-model="localDescription"
:readonly="!canEdit"
:min-height="480"
)
Editor(
v-if="requirement"
v-else-if="requirement"
v-model='localDescription'
:readonly="!canEdit"
:placeholder="canEdit ? 'Опишите требование подробно...' : 'Описание отсутствует'"
@@ -66,7 +75,9 @@ q-dialog(
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { Zeus } from '@coopenomics/sdk';
import { Editor } from 'src/shared/ui';
import { BpmnStoryEditor } from 'app/extensions/capital/features/Story/BpmnStoryEditor';
import { useUpdateStory } from '../../UpdateStory/model';
import { FailAlert, SuccessAlert } from 'src/shared/api';
import type { IStory } from 'app/extensions/capital/entities/Story/model';
@@ -94,6 +105,11 @@ const originalDescription = ref('');
const isSaving = ref(false);
const { updateStory } = useUpdateStory();
const isBpmnFormat = computed(() => {
const fmt = props.requirement?.content_format;
return fmt === Zeus.CapitalStoryContentFormat.BPMN;
});
// Проверяем, есть ли изменения
const hasChanges = computed(() => {
return localTitle.value !== originalTitle.value ||
@@ -180,4 +196,9 @@ defineExpose({
.q-card {
height: 100vh;
}
.bpmn-fallback {
min-height: 480px;
width: 100%;
}
</style>
@@ -1,7 +1,9 @@
<template lang="pug">
div
// Виджет списка требований в виде таблицы
.flex.flex-center.q-pa-lg(v-if='!permissionsLoaded')
q-spinner(color='primary' size='40px')
RequirementsListWidget(
v-else
:filter='requirementsFilter',
:maxItems='50'
:permissions='componentPermissions'
@@ -9,7 +11,7 @@ div
</template>
<script lang="ts" setup>
import { computed, ref, onMounted } from 'vue';
import { computed, ref, onMounted, watch } from 'vue';
import { useRoute } from 'vue-router';
import { RequirementsListWidget } from 'app/extensions/capital/widgets/RequirementsListWidget';
import { useProjectStore } from 'app/extensions/capital/entities/Project/model';
@@ -19,6 +21,7 @@ const route = useRoute();
const projectStore = useProjectStore();
const componentPermissions = ref<IProjectPermissions | null>(null);
const permissionsLoaded = ref(false);
// Получаем hash проекта из параметров маршрута
const projectHash = computed(() => route.params.project_hash as string);
@@ -30,19 +33,23 @@ const requirementsFilter = computed(() => ({
show_issues_requirements: false,
}));
// Загрузка разрешений компонента
const loadComponentPermissions = async () => {
permissionsLoaded.value = false;
try {
const component = await projectStore.loadProject({ hash: projectHash.value });
if (component?.permissions) {
componentPermissions.value = component.permissions;
}
componentPermissions.value = component?.permissions ?? null;
} catch (error) {
console.error('Ошибка при загрузке разрешений компонента:', error);
componentPermissions.value = null;
} finally {
permissionsLoaded.value = true;
}
};
// Инициализация
watch(projectHash, () => {
void loadComponentPermissions();
});
onMounted(async () => {
await loadComponentPermissions();
});
@@ -1,7 +1,9 @@
<template lang="pug">
div
// Виджет списка требований в виде таблицы
.flex.flex-center.q-pa-lg(v-if='!permissionsLoaded')
q-spinner(color='primary' size='40px')
RequirementsListWidget(
v-else
:filter='requirementsFilter',
:maxItems='50'
:permissions='projectPermissions'
@@ -9,7 +11,7 @@ div
</template>
<script lang="ts" setup>
import { computed, ref, onMounted } from 'vue';
import { computed, ref, onMounted, watch } from 'vue';
import { useRoute } from 'vue-router';
import { RequirementsListWidget } from 'app/extensions/capital/widgets/RequirementsListWidget';
import { useProjectStore } from 'app/extensions/capital/entities/Project/model';
@@ -19,6 +21,7 @@ const route = useRoute();
const projectStore = useProjectStore();
const projectPermissions = ref<IProjectPermissions | null>(null);
const permissionsLoaded = ref(false);
// Получаем hash проекта из параметров маршрута
const projectHash = computed(() => route.params.project_hash as string);
@@ -30,19 +33,24 @@ const requirementsFilter = computed(() => ({
show_issues_requirements: false,
}));
// Загрузка разрешений проекта
// Загрузка разрешений проекта (до списка требований — иначе canEdit временно false)
const loadProjectPermissions = async () => {
permissionsLoaded.value = false;
try {
const project = await projectStore.loadProject({ hash: projectHash.value });
if (project?.permissions) {
projectPermissions.value = project.permissions;
}
projectPermissions.value = project?.permissions ?? null;
} catch (error) {
console.error('Ошибка при загрузке разрешений проекта:', error);
projectPermissions.value = null;
} finally {
permissionsLoaded.value = true;
}
};
// Инициализация
watch(projectHash, () => {
void loadProjectPermissions();
});
onMounted(async () => {
await loadProjectPermissions();
});
@@ -0,0 +1,24 @@
function decodeHtmlEntitiesOnce(s: string): string {
return s
.replace(/&amp;/g, '&')
.replace(/&lt;/g, '<')
.replace(/&gt;/g, '>')
.replace(/&quot;/g, '"')
.replace(/&#39;/g, "'");
}
/** Восстанавливает XML после ошибочного HTML-экранирования в теле запроса / старых данных в БД. */
export function decodeBpmnXmlIfEscaped(xml: string): string {
if (!xml.includes('&lt;') && !xml.includes('&amp;lt;')) {
return xml;
}
let out = xml;
for (let i = 0; i < 4; i += 1) {
const next = decodeHtmlEntitiesOnce(out);
if (next === out) {
break;
}
out = next;
}
return out;
}
@@ -0,0 +1,17 @@
/**
* Должен совпадать с controller:
* extensions/capital/application/constants/empty-bpmn-story-xml.ts
*/
export const EMPTY_BPMN_STORY_XML = `<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Coopenomics" exporterVersion="1.0">
<bpmn:process id="Process_1" isExecutable="true">
<bpmn:startEvent id="StartEvent_1" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="159" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>`;
@@ -1,3 +1,5 @@
export * from './emptyBpmnStoryXml';
export * from './decodeBpmnXmlIfEscaped';
export * from './projectStatus';
export * from './segmentStatus';
export * from './issueStatus';
@@ -31,7 +31,7 @@ div
.col-auto(style='width: 32px; flex-shrink: 0')
q-icon(
v-if="props.row"
name='description',
:name='storyContentIcon(props.row)',
size='sm',
style='cursor: pointer; color: #666'
@click.stop='handleRequirementTypeClick(props.row)'
@@ -70,6 +70,7 @@ div
<script lang="ts" setup>
import { ref, onMounted, computed, watch } from 'vue';
import { useRouter } from 'vue-router';
import { Zeus } from '@coopenomics/sdk';
import {
type IStory,
useStoryStore,
@@ -113,6 +114,12 @@ const loadingTitles = ref<Record<string, boolean>>({});
const loading = ref(false);
const storyContentIcon = (row: IStory): string => {
return row.content_format === Zeus.CapitalStoryContentFormat.BPMN
? 'account_tree'
: 'description';
};
// Реактивная связь с store
const requirements = computed(() => {
if (!storyStore.stories) return null;
@@ -362,8 +369,11 @@ const handleRequirementClick = (requirement: IStory) => {
// Обработчик обновления требования
const handleRequirementUpdated = (updatedRequirement: IStory) => {
// Требование будет автоматически обновлено в store
console.log('Требование обновлено:', updatedRequirement);
if (
selectedRequirement.value?.story_hash === updatedRequirement.story_hash
) {
selectedRequirement.value = updatedRequirement;
}
};
// Обработчик закрытия диалога
+1
View File
@@ -53,6 +53,7 @@
"@wharfkit/session": "^1.4.0",
"@wharfkit/wallet-plugin-privatekey": "^1.1.0",
"axios": "^1.13.5",
"bpmn-js": "^18.13.1",
"compression": "^1.7.4",
"cooptypes": "workspace:*",
"dompurify": "^3.3.1",
+108 -26
View File
@@ -1,47 +1,129 @@
"""
Проверка макросов документации: SDK, TypeDoc, GraphQL.
Соответствует тому, что видно на собранных страницах MkDocs (префикс ⚠️ у макросов).
"""
import contextlib
import io
import os
import re
import sys
sys.path.append('.')
# Импортируем main.py для получения доступа к sdk_doc_links
sys.path.append(".")
import main
# Настройка
class FakeEnv:
def __init__(self):
self.variables = {}
env = FakeEnv()
main.define_env(env)
# Получаем функцию get_sdk_doc
get_sdk_doc = env.variables['get_sdk_doc']
get_sdk_doc = env.variables["get_sdk_doc"]
get_graphql_doc = env.variables["get_graphql_doc"]
get_typedoc_desc = env.variables["get_typedoc_desc"]
get_typedoc_input = env.variables["get_typedoc_input"]
get_typedoc_definition = env.variables["get_typedoc_definition"]
def _is_macro_problem(result: str) -> bool:
if not isinstance(result, str):
return False
return result.strip().startswith("⚠️")
def _call_macro(fn, *args):
"""Вызов макроса без мусора в stdout (get_typedoc_desc печатает отладку при промахе)."""
buf = io.StringIO()
with contextlib.redirect_stdout(buf):
return fn(*args)
# Сканируем все .md файлы
docs_dir = 'docs'
problems = []
docs_dir = "docs"
problems: list[str] = []
seen: set[tuple[str, str, str]] = set()
for root, dirs, files in os.walk(docs_dir):
def _add(filepath: str, macro: str, detail: str) -> None:
key = (filepath, macro, detail)
if key in seen:
return
seen.add(key)
problems.append(f"{filepath}: {macro}{detail}")
for root, _dirs, files in os.walk(docs_dir):
for file in files:
if file.endswith('.md'):
filepath = os.path.join(root, file)
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# Ищем все вызовы get_sdk_doc
pattern = r'{{ get_sdk_doc\("([^"]+)", "([^"]+)", "([^"]+)"\) }}'
matches = re.findall(pattern, content)
for match in matches:
namespace, module, method = match
result = get_sdk_doc(namespace, module, method)
if "не найден" in result:
problems.append(f"{filepath}: {namespace}.{module}.{method}")
except Exception as e:
print(f"Ошибка при обработке {filepath}: {e}")
if not file.endswith(".md"):
continue
filepath = os.path.join(root, file)
try:
with open(filepath, encoding="utf-8") as f:
content = f.read()
except OSError as e:
print(f"Ошибка при чтении {filepath}: {e}")
continue
print("Проблемные ссылки в документации:")
# --- get_sdk_doc ---
for match in re.findall(
r'{{\s*get_sdk_doc\("([^"]+)",\s*"([^"]+)",\s*"([^"]+)"\)\s*}}',
content,
):
namespace, module, method = match
full = f"{namespace}.{module}.{method}"
result = _call_macro(get_sdk_doc, namespace, module, method)
if _is_macro_problem(result):
_add(filepath, "get_sdk_doc", full)
# --- get_graphql_doc ---
for match in re.findall(
r'{{\s*get_graphql_doc\("([^"]+)"\)\s*}}',
content,
):
ref = match
result = _call_macro(get_graphql_doc, ref)
if _is_macro_problem(result):
_add(filepath, "get_graphql_doc", ref)
# --- get_typedoc_desc ---
for match in re.findall(
r'{{\s*get_typedoc_desc\("([^"]+)"\)\s*}}',
content,
):
ref = match
result = _call_macro(get_typedoc_desc, ref)
if _is_macro_problem(result):
_add(filepath, "get_typedoc_desc", ref)
# --- get_typedoc_input (второй аргумент опционален) ---
for m in re.finditer(
r'{{\s*get_typedoc_input\(\s*"([^"]+)"\s*(?:,\s*"([^"]+)"\s*)?\)\s*}}',
content,
):
ref, iface = m.group(1), m.group(2) or "IInput"
result = _call_macro(get_typedoc_input, ref, iface)
if _is_macro_problem(result):
_add(filepath, "get_typedoc_input", f"{ref} ({iface})")
# --- get_typedoc_definition ---
for m in re.finditer(
r'{{\s*get_typedoc_definition\(\s*"([^"]+)"\s*(?:,\s*"([^"]+)"\s*)?\)\s*}}',
content,
):
ref, iface = m.group(1), m.group(2)
if iface:
result = _call_macro(get_typedoc_definition, ref, iface)
detail = f"{ref} ({iface})"
else:
result = _call_macro(get_typedoc_definition, ref)
detail = ref
if _is_macro_problem(result):
_add(filepath, "get_typedoc_definition", detail)
print("Проблемные макросы в документации (SDK / TypeDoc / GraphQL):")
for problem in problems:
print(f"{problem}")
-1
View File
@@ -1 +0,0 @@
# Блог
@@ -1,24 +0,0 @@
---
draft: false
pin: true
date: 2024-06-21
# categories:
# - Hello
# - World
# tags:
# - Foo
# - Bar
title: Приглашение к тестированию минимального функционала бета-версии Цифрового Кошелька
---
Привет, Ко-общество! Мы готовы представить вашему вниманию минимальный продукт системы электронного документооборота для потребительских кооперативов, который в ближайшем будущем будет поставляться участникам кооперативной экономики.
Тестовый функционал для одного кооператива запущен по ссылке: [https://testnet.copenomics.world](https://testnet.copenomics.world).
Справка для проведения тестов находится здесь:
[https://copenomics.world/info](https://copenomics.world/info)
Мы предлагаем Кообществу принять участие в тестировании минимального функционала на предмет готовности идти в основную сеть. Сообщайте о любых проблемах, которые возникнут у вас в процессе, подкрепляя скриншотами, и по-возможности, инструкциями действий, которыми разработчики смогут повторить вашу проблему у себя и устранить её на форуме: [https://forum.copenomics.world](https://forum.copenomics.world).
Если же проблем нет, и всё прошло гладко, пожалуйста, сообщите нам и об этом.
-30
View File
@@ -1,30 +0,0 @@
---
draft: false
pin: true
date: 2024-06-21
categories:
- Hello
- World
tags:
- Foo
- Bar
description: Nullam urna elit, malesuada eget finibus ut, ac tortor.
---
# Hello world!
Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.
Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.
<!-- more -->
Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.
test Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.
test Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.
test Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.Nullam urna elit, malesuada eget finibus ut, ac tortor.
-61
View File
@@ -1,61 +0,0 @@
<iframe style="border: 0px !important;" src="https://workflow.coopenomics.world/form/0376bcbf-52c6-4a33-900c-cc16699a2f8d" width="100%" height="1000"></iframe>
<!-- # Подключить кооператив
Подключение к Платформе позволяет автоматизировать документооборот Потребительского Кооператива и выражается в том, что у него появляется выделенный сайт/мобильное приложение, где под кнопками действий (регистрации, заказа, поставки, и т.д.) находятся алгоритмы формирования электронных документов и применения цифровых подписей.
Регламент для подключения к Платформе и запуска Цифрового Кооператива на своём домене, следующий:
## 1. Заполнить анкету
После заполнения анкеты для сопровождения по процедуре подключения к Платформе будет определен Ваш персональный аккаунт-менеджер ПК “ВОСХОД”, который выйдет с Вами на связь согласно указанного Вами в анкете способа контакта.
<iframe style="border: 5px solid grey;" src="https://docs.google.com/forms/d/e/1FAIpQLSe2OGLI0ow43_m-6XmJ5icDskYLmz-r6UuF8fa98avmzIwUPA/viewform" width="100%" height="600"></iframe>
### 1.1 Если у Вас уже есть действующий потребительский кооператив - Передать документы Вашего кооператива на проверку
При заполнении анкеты от действующего кооператива, Вам потребуется направить актуальные документы Вашего кооператива ( Устав, утвержденные Положения) на адрес, указанный Вашим персональным аккаунт-менеджером. При необходимости и по результатам проверки, провести консультации со специалистами-методологами Союза Потребительских Обществ “РУСЬ” и внести изменения в документы Вашего потребительского кооператива, для соответствия заложенной методологии на Платформе методологии.
### 1.2 Если Вам требуется создать потребительский кооператив - Заполнить анкету для подгтовки учредительных документов Вашего потребительского кооператива
<iframe style="border: 5px solid grey;" src="https://docs.google.com/forms/d/1Dt20DkHB58R6o509DPEM2LhY51_Z8NqNfkH2wjFVSvg/viewform" width="100%" height="600"></iframe> Устав и Протокол №1 (учредительный) будут сгенерированы автоматически в соответствии с шаблонами, составленными специалистами Союза Потребительских Обществ “РУСЬ”. Сгенерированные и заполненные Устав и Протокол № 1 будут направлены Вам на указанный адрес электронной почты.
Помимо учредительных документов Вам нужно будет заполнить форму Р11001, которая доступна для заполнения на сайте nalog.ru, распечатать ее вместе с Уставом и Протоколом №1, приложить гарантийное письмо о предоставлении юридического адреса для вновь создаваемого потребительского кооператива и обратиться к Нотариусу по месту регистрации в полном составе всех учредителей (не менее 5 (пяти). При необходимости, Вам предоставляется возможность запросить сопровождение по регистрации Вашего кооператива, обратившись в ПК “ВОСХОД” через Вашего персонального аккаунт-менеджера.
## 2. Стать участником (членом) Союза Потребительских Обществ “РУСЬ” и пайщиком ПК “ВОСХОД”
После проведения проверки документов (для уже действующего кооператива) или получения государственной регистрации вновь образованного потребительского кооператива (выписки из ЕГРЮЛ и Свидетельства о постановке на налоговый учет), Вам следует произвести действия в следующем порядке:
Оформить от лица Вашего кооператива заявление на членство в Союз Потребительских Обществ “РУСЬ” (СПО “РУСЬ”), согласиться с основными условиями членства в СПО “РУСЬ” https://xn----mtbukben7em.xn--p1ai/anketa и оплатить вступительный и ежемесячный членский взнос согласно Устава СПО “РУСЬ” в размере 1500 рублей и 1000 рублей соответственно.
### ! Только для вновь создаваемых кооперативов:
Перед подключением к Платформе и в целях постановки базового документооборота, обязательного и необходимого для ведения операционной деятельности потребительского кооператива, а именно Положений, регламентирующих его деятельность, разработанных в соответствии с методологическими основами Платформы, в адрес СПО “РУСЬ” выплачивается единовременный целевой членский взнос в ПК “ВОСХОД” в размере 50 (пятьдесят) тысяч рублей.
После подтверждения приема заявления в СПО “РУСЬ” и оплаты взносов, оформить от лица Вашего кооператива заявление на вступление в ПК “ВОСХОД” в качестве пайщика, согласиться с основными условиями членства (включая согласия с прилагаемыми соглашениями и офертами) и оплатить вступительный и минимальный паевой взносы согласно Устава ПК “ВОСХОД” в размере 1000 рублей и 3000 рублей соответственно https://xn--j1ab.xn----8sbecnpeek0bbdaogk9aw0b.xn--p1ai/
## 3. Подключение к Платформе
Для всех кооперативов:
После решения Совета ПК “ВОСХОД” о приеме в пайщики Вашего потребительского кооператива, Вам открывается доступ на страницу, где Вы можете осуществить подключение к Платформе, ознакомившись с Пользовательским Соглашением (Офертой) по присоединению пайщиков Потребительского Кооператива “ВОСХОД” к платформе “КООПЕРАТИВНАЯ ЭКОНОМИКА” и инструкцией ниже (Делегировать домен) и, в соответствии с которым, оплатив членский целевой взнос в ПК “ВОСХОД” в размере 2500 RUB (оплачивается ежемесячно в соответствии с условиями Пользовательского Соглашения - 3 месяца).
**Итого платежи по взносам**:
Для вновь создаваемого кооператива (без учета сопровождения по регистрации кооператива) - вступительные, минимальный паевой и паушальный взносы - **55 500 рублей единовременно** и целевые членские взносы - **3500 рублей ежемесячно**;
Для действующего кооператива (без учета консультаций по изменениям документов по результатам аудита) - вступительные и минимальный паевой взносы - **5500 рублей единовременно** и целевые членские взносы - **3500 рублей ежемесячно**.
## 4. Делегировать домен
Фактическое подключение к системе осуществляется посредством делегирования домена на сервер Цифрового Кооператива. Для этого необходимо перенаправить все запросы по переходу на домен на IP-адрес, который будет предоставлен менеджером.
Например, на сервисе reg.ru, для перенаправления домена необходимо в личном кабинете reg.ru выбрать домен, перейти в раздел “DNS-серверы и управление зоной”, убедится, что в качестве DNS-серверов используются бесплатные DNS-сервера ns1.reg.ru и ns2.reg.ru, после чего, добавить ресурсную запись типа A:
**Для домена первого уровня, например, “цифровойкооператив.рф”**:
- subdomain: @ (”собачка”)
- IP-адрес: XXX.XXX.XXX.XXX (выдан менеджером)
**Для домена второго уровня, например: “лк.цифровойкооператив.рф”**:
- subdomain: лк
- IP-адрес: XXX.XXX.XXX.XXX (выдан менеджером)
После изменения может потребоваться до 24 часов для активации домена и системы Цифрового Кооператива на вашем домене. Более детально процесс подключения поможет пройти ваш менеджер.
![IMG-20240203181955808.png](/assets/A-record.png)
-->
-13
View File
@@ -1,13 +0,0 @@
# Контакты
| Потребительский кооператив | ВОСХОД |
|----------|------------------------------|
| ИНН | 9728130611 |
| КПП | 772801001 |
| ОГРН | 1247700283346 |
| Председатель | Муравьёв Алексей Николаевич |
| Е-почта | [chairman.voskhod@gmail.com](mailto:chairman.voskhod@gmail.com) |
| Telegram | [@mr_alex_ant](telegram:/mr_alex_ant) |
<!-- [Подпишись на мой телеграм-канал :fontawesome-solid-paper-plane:](https://t.me/dao_ants){ .md-button } -->
-63
View File
@@ -1,63 +0,0 @@
# Кооперативная Экономика
Кооперативная Экономика (“COOPENOMICS”) - это платформа, основанная на технологии распределенного реестра, представляющая из себя программный комплекс для цифрового автоматизированного взаимодействия субъектов различных правовых форм и юрисдикций в рамках Закона РФ "О Потребительской Кооперации" № 3085-1, Гражданского Кодекса РФ и в соответствии с методологией Союза Потребительских Обществ “РУСЬ”.
Платформа предоставляет единую цифровую среду для кооперации и средства автоматизации деятельности потребительских и производственных кооперативов по общим протоколам, которые соответствуют законодательству и методологии кооперации в РФ.
Протоколы платформы кооперативной экономики состоят из верхнеуровневых правил кооперации, которые необходимо соблюдать для соответствия законодательству. Они определяют формат и порядок этичного взамного действия пайщиков и кооперативов в единой цифровой среде, функционирующей на основе смарт-контрактов и стандартизированных правил цифровых целевых потребительских программ, которые они реализуют.
<!-- <figure markdown="span">
![Среда кооперативной экономики](/assets/coopenomics_1.png){ width="100%" }
<figcaption>Среда кооперативной экономики</figcaption>
</figure> -->
## Кооперативы
Каждый кооператив на Платформе представляет собой автономную организацию с экономической системой хозяйствования, основанной на учете вкладов и их возвратов для удовлетворения потребностей пайщиков.
## Cовет Кооператива
Совет кооператива - это орган управления кооператива, состав которого избирается на общем собрании уполномоченных пайщиков кооператива по принципу: 1 пайщик == 1 голос. Каждый уполномоченный пайщик, в свою очередь, избирается на своём кооперативном участке по аналогичному принципу равенства голосов всеми пайщиками этого кооперативного участка.
Совет реализует достижение целей своего Кооператива согласно Уставу - удовлетворять потребности своих Пайщиков. Для этого, он принимает меры по организации хозяйственной деятельности, принимая паевые и членские взносы, и совершая их возвраты. Каждый акт действия фиксируется голосованием и документом протокола заседания совета в цифровом реестре документов кооператива на Платформе.
## Кооперативные участки
Кооперативные участки объединяют пайщиков по географическому или функциональному признаку. Каждый пайщик кооператива прикреплен для голосований только к одному кооперативному участку. При этом, пайщик может состоять и принимать участие в деятельности нескольких кооперативных участков без ограничений.
Проведение общих собраний также обеспечиваются Платформой на основе протоколов и смарт-контрактов, реализующих их. Таким образом, Платформа Кооперативной Экономики и Цифровой Кооператив реализуют принципы DAO (децентрализованных автономных организаций), действующих в единой прозрачной цифровой среде в интересах Пайщиков и под их управлением.
<!-- <figure markdown="span">
![Форма Кооперативов](/assets/coopenomics_2.png){ width="100%" }
<figcaption>Форма Кооперативов</figcaption>
</figure> -->
## Протоколы
Протоколы кооперативной экономики - это набор правил, определяющих формат и порядок обмена данными между кооперативами и пайщиками в сети. Все протоколы реализуются посредством смарт-контрактов, написанных на языке C/C++, которые исполняются в цифровой среде распределенной базы данных под управлением Кооперативов.
Подробное описание протоколов Платформы Кооперативной Экономики выходит за пределы данной документации и располагается на сайте: <a href="https://coopenomics.world.">https://coopenomics.world</a>.
## Целевые Программы
Пайщики Кооператива присоединяются к Целевым Программам, которые принял Совет Кооператива к исполнению. Все целевые программы стандартизированы в своих протоколах, каждый из которых реализует алгоритм достижения цели удовлетворения потребности Пайщика.
Взаимное действие Пайщика и Кооператива происходит на кооперативных участках, выделяемых по географическому или функциональному признаку, где Уполномоченный действует от лица Кооператива на основании решения Совета по заявлениям Пайщиков.
<!-- <figure markdown="span">
![Целевые Программы](/assets/coopenomics_3.png){ width="100%" }
<figcaption>Целевые Программы</figcaption>
</figure> -->
## Цифровой Кооператив
"Цифровой Кооператив" (MONOCOOP) - это программный продукт, реализующий подключение производственных и потребительских кооперативов к платформе Цифровой Экономики. Реализация подключения производится посредством запуска сайта и прогрессивного веб-приложения (PWA), доступного для установки на мобильные устройства.
<!-- <figure markdown="span">
![Цифровой Кооператив](/assets/coopenomics_4.png){ width="100%" }
<figcaption>Цифровой Кооператив</figcaption>
</figure> -->
Запуск производится по WHITE-LABEL на доменах и поддоменах подключаемых Кооперативов. Кооператив, подключенний к "Цифровому Кооперативу", получает NOCODE-конструктор рабочих столов для своих пайщиков, что позволяет отображать на нём все, или только выборочные целевые потребительские программы для удовлетворения их потребностей.
Данный сайт описывает продукт "Цифровой Кооператив" (MONOCOOP), который реализует подключение к цифровой среде и деятельность по протоколам Платформы Кооперативной Экономики.
@@ -1,114 +0,0 @@
# Аккаунты
Аккаунты в системе MONO представляют собой многоуровневую структуру, которая связывает пользователей платформы с блокчейном-системой COOPOS. Каждый аккаунт содержит информацию о пользователе в различных контекстах: как участника блокчейна, как пользователя платформы MONO, и как потенциального или действующего пайщика кооператива.
## Структура аккаунта
Аккаунт в MONO состоит из нескольких компонентов:
- **Blockchain Account** — системная информация блокчейна (публичные ключи, ресурсы)
- **MONO Account** — данные в системе MONO (email, настройки)
- **User Account** — базовая информация пользователя
- **Participant Account** — информация о статусе пайщика
- **Private Account** — персональные данные (ФИО, документы)
## Получить информацию об аккаунте
{{ get_sdk_doc("Queries", "Accounts", "GetAccount") }} | {{ get_graphql_doc("Query.getAccount") }}
{{ get_typedoc_input("Queries.Accounts.GetAccount") }}
Результат:
{{ get_typedoc_definition("Queries.Accounts.GetAccount", "IOutput") }}
## Получить список аккаунтов
{{ get_sdk_doc("Queries", "Accounts", "GetAccounts") }} | {{ get_graphql_doc("Query.getAccounts") }}
{{ get_typedoc_input("Queries.Accounts.GetAccounts") }}
Результат:
{{ get_typedoc_definition("Queries.Accounts.GetAccounts", "IOutput") }}
## Поиск по приватным данным
{{ get_sdk_doc("Queries", "Accounts", "SearchPrivateAccounts") }} | {{ get_graphql_doc("Query.searchPrivateAccounts") }}
{{ get_typedoc_input("Queries.Accounts.SearchPrivateAccounts") }}
Результат:
{{ get_typedoc_definition("Queries.Accounts.SearchPrivateAccounts", "IOutput") }}
Поиск осуществляется по полям ФИО, ИНН, ОГРН, наименованию организации и другим приватным данным.
## Зарегистрировать аккаунт
{{ get_sdk_doc("Mutations", "Accounts", "RegisterAccount") }} | {{ get_graphql_doc("Mutation.registerAccount") }}
{{ get_typedoc_input("Mutations.Accounts.RegisterAccount") }}
Результат:
{{ get_typedoc_definition("Mutations.Accounts.RegisterAccount", "IOutput") }}
Регистрация нового аккаунта пользователя в системе MONO. При регистрации создается аккаунт в блокчейне и связанная запись в базе данных MONO.
## Обновить аккаунт
{{ get_sdk_doc("Mutations", "Accounts", "UpdateAccount") }} | {{ get_graphql_doc("Mutation.updateAccount") }}
{{ get_typedoc_input("Mutations.Accounts.UpdateAccount") }}
Результат:
{{ get_typedoc_definition("Mutations.Accounts.UpdateAccount", "IOutput") }}
Обновление аккаунта пользователя производится по username. Мутация позволяет изменить приватные данные пользователя, а также адрес электронной почты в MONO. Использовать мутацию может только председатель совета.
## Восстановление доступа
### Начать восстановление приватного ключа
{{ get_sdk_doc("Mutations", "Accounts", "StartResetKey") }} | {{ get_graphql_doc("Mutation.startResetKey") }}
{{ get_typedoc_input("Mutations.Accounts.StartResetKey") }}
Результат:
{{ get_typedoc_definition("Mutations.Accounts.StartResetKey", "IOutput") }}
Инициация процедуры восстановления доступа к аккаунту при утере приватного ключа. Метод отправляет секретную фразу на указанную электронную почту для подтверждения права на восстановление.
### Заменить приватный ключ
{{ get_sdk_doc("Mutations", "Accounts", "ResetKey") }} | {{ get_graphql_doc("Mutation.resetKey") }}
{{ get_typedoc_input("Mutations.Accounts.ResetKey") }}
Результат:
{{ get_typedoc_definition("Mutations.Accounts.ResetKey", "IOutput") }}
Финальный этап восстановления доступа. Пользователь предоставляет новый публичный ключ и токен, полученный по email. После успешной замены старый приватный ключ становится недействительным.
!!!warning "Безопасность"
Процедура восстановления ключа требует подтверждения от члена совета кооператива. Восстановление доступа возможно только для зарегистрированных пайщиков с подтвержденной электронной почтой.
## Типы аккаунтов
Система поддерживает три типа аккаунтов:
- **individual** — физическое лицо
- **entrepreneur** — индивидуальный предприниматель
- **organization** — юридическое лицо
Каждый тип имеет специфичные поля данных и требования к документам.
## Жизненный цикл аккаунта
1. **Регистрация** — создание аккаунта в блокчейне и MONO
2. **Верификация** — подтверждение email и данных
3. **Активация** — получение статуса пайщика (опционально)
4. **Использование** — работа с системой кооператива
5. **Деактивация** — приостановка доступа (опционально)
@@ -1,52 +0,0 @@
Соглашение - это цифровой документ, подтверждающий согласие пайщика с условиями участия.
Соглашения между пайщиком и кооперативом фиксируются в блокчейне с учётом их версий. При обновлении шаблона соглашения в блокчейне - пайщику будет необходимо обновить свою подпись на соглашении.
Подробнее о параметрах генерации цифровых документов смотри в разделе [Документы](/documentation/documents)
## Соглашение о ЦПП "Цифровой Кошелёк"
{{ get_sdk_doc("Mutations", "Agreements", "GenerateWalletAgreement") }} | {{ get_graphql_doc("Mutation.generateWalletAgreement") }}
Соглашение описывает условия участия в целевой потребительской программе "Цифровой Кошелёк", участие в которой предоставляет пайщику возможность совершать паевые взносы в цифровой среде платформы "Кооперативной Экономики".
{{ get_typedoc_desc("Mutations.Agreements.GenerateWalletAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GenerateWalletAgreement") }}
## Согласие с политикой конфиденциальности
{{ get_sdk_doc("Mutations", "Agreements", "GeneratePrivacyAgreement") }} | {{ get_graphql_doc("Mutation.generatePrivacyAgreement") }}
{{ get_typedoc_desc("Mutations.Agreements.GeneratePrivacyAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GeneratePrivacyAgreement") }}
## Соглашение о простой электронной подписи
{{ get_sdk_doc("Mutations", "Agreements", "GenerateSignatureAgreement") }} | {{ get_graphql_doc("Mutation.generateSignatureAgreement") }}
{{ get_typedoc_desc("Mutations.Agreements.GenerateSignatureAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GenerateSignatureAgreement") }}
## Пользовательское соглашение
{{ get_sdk_doc("Mutations", "Agreements", "GenerateUserAgreement") }} | {{ get_graphql_doc("Mutation.generateUserAgreement") }}
{{ get_typedoc_desc("Mutations.Agreements.GenerateUserAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GenerateUserAgreement") }}
## Отправить соглашение
{{ get_sdk_doc("Mutations", "Agreements", "GenerateUserAgreement") }} | {{ get_graphql_doc("Mutation.generateUserAgreement") }}
{{ get_typedoc_desc("Mutations.Agreements.GenerateUserAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GenerateUserAgreement") }}
@@ -1,159 +0,0 @@
Блокчейн [Кооперативной Экономики](https://coopenomics.world) содержит кооперативные смарт-контракты целевых потребительских программ и шаблоны документов, которые стандартизируют процессы в кооперативе: от регистрации пайщика и до его выхода из кооператива.
`MONO` применяет стандарты [Кооперативной Экономики](https://coopenomics.world) и реализует их в универсальном приложении, которое предоставляет API и пользовательский интерфейс для учёта взаимодействия пайщиков с кооперативом. `MONO` предоставляет сервис подключения к кооперативной экономике, а "ПК ВОСХОД" - провайдером.
```mermaid
graph TD
%% Главные подсистемы
subgraph "MONO"
subgraph "Клиентский уровень"
F["SDK"]
G["Рабочий стол"]
H["Расширения"]
end
subgraph "GraphQL-API"
E["Контроллер"]
end
subgraph "Реестры и Хранилище"
C["Фабрика документов"]
B["Парсер"]
D["База данных"]
end
end
subgraph "Блокчейн"
A1["Смарт-контракты"] --> A2["Нода блокчейна"]
end
%% Взаимодействие между блоками
A2 -->|Читает транзакции| B
B -->|Сохраняет события| D
C -->|Извлекает данные| D
C -->|Сохраняет документы| D
E -->|Вызывает генерацию документов| C
D -->|Предоставляет доступ| E
E -->|Обрабатывает API-запросы| F
E -->|Обрабатывает API-запросы| G
E -->|Расширяется с| H
E -->|Отправляет транзакции| A2
```
`MONO` может быть запущен на выделенном сервере любым кооперативом, который подключен к кооперативной экономике, т.к. `MONO` - это открытый исходный код. Однако, поскольку этот процесс требует технических ресурсов и навыков, "ПК ВОСХОД" предоставляет сервис хостинга `MONO` на своих серверах.
Каждый экземпляр `MONO` - это приложение кооператива, способное работать полностью автономно, когда хранение документов, их генерация, а также контроль доступа к ним осуществляется самим кооперативом, и при этом, он продолжает находиться в общем контуре [Кооперативной Экономики](https://coopenomics.world) и иметь возможность взаимодействовать с другими кооперативами по общим стандартам.
Такая архитектура является `федеративной`, поскольку каждый экземпляр MONO представляет собой автономный узел, управляемый отдельным кооперативом, но продолжающий работать в общей экосистеме, используя единые стандарты взаимодействия и блокчейн как общий реестр данных. И при этом, любой кооператив (и даже пайщик) могут просмотреть анонимизированную историю всех действий в [Кооперативной Экономике](https://coopenomics.world).
Анонимизированная история действий в блокчейне является стержнем, вокруг которого формируется информация в каждом экземпляре `MONO` только для одного кооператива. `MONO` создан быть выделенным, автономным, работающим независимо, но с общей для всех кооперативов информацией блокчейна.
Для этого, `MONO` дважды в секунду с помощью `парсера` считывает информацию о новом блоке из блокчейна, обрабатывает его содержимое, и сохраняет его в свою приватную базу данных. Эта операция синхронизации приватной базы данных `MONO` с блокчейном позволяет в случае необходимости провести полное восстановление всех реестров кооператива во внутренней базе данных, произведя синхронизацию с блокчейном заново.
`MONO` можно рассматривать как ноду, которая обслуживает один кооператив и не содержит в себе блокчейна, а только подключается к нему. При подключении к блочейну, `MONO` поблочно синхронизирует публичную историческую информацию кооператива и предоставляет её для использования по API с возможностью извлечь состояние реестров кооператива в любой конкретный момент времени.
Каждый раз, когда `MONO` при сканировании блокчейна получает [действие](https://coopenomics.world/documentation/blockchain/transactions/), в котором есть ссылка на документ и его мета-данные, `MONO` использует его для построения реестра. Т.е. основанием реестра является публичные данные, зафиксированные в блокчейне с помощью транзакций, и содержащихся в них действиях.
Публичные данные документов содержат информацию, которая позволяет идентифицировать пайщика, кооператив, тип документа, который был создан, и эффект, который был получен. Используя информацию о имени аккаунта пайщика, `MONO` находит приватные данные пайщика, которые хранит в своей базе, и не публикует в блокчейне. Таким образом, `MONO` сопоставляет публичные части документы с пайщиками, которые их создали.
А используя публичный хэш документа, `MONO` извлекает весь документ из своей приватной базы данных, который хранится в PDF и HTML форматах. Собирая всё это вместе, `MONO` формирует реестр пакетов документов, которые формируются на основе информации в блокчейне и дополняется приватной информации из базы данных `MONO`.
```mermaid
flowchart TD
subgraph Блокчейн["Блокчейн"]
Transactions["Транзакции"]
Actions["Действия с документами"]
PublicData["Публичные данные документов"]
end
subgraph MONO["MONO"]
Parser["Парсер блоков"]
Sync["Синхронизация с блокчейном"]
PrivateDB["Приватная база данных"]
DocumentReestr["Реестр документов"]
API["API для работы с документами"]
Generator["Генератор документов"]
end
%% Взаимодействия
Transactions -->|Считывание новых блоков| Parser
Parser -->|Обработка содержимого блоков| Sync
Sync -->|Сохранение данных в базу| PrivateDB
Actions -->|Ссылки на документы| PrivateDB
PublicData -->|Сопоставление с приватными данными| PrivateDB
PrivateDB -->|Извлечение данных и метаданных| Generator
Generator -->|Создание документов в форматах PDF и HTML| DocumentReestr
DocumentReestr -->|Обновление и хранение данных| PrivateDB
API -->|Предоставление доступа к документам| DocumentReestr
```
При регистрации новых пайщиков, `MONO` сохраняет приватную информацию в своей `фабрике` документов с привязкой к текущему номеру блока в цепочке (блокчейна). Это позволяет извлекать из фабрики не только ранее сгенерированные и сохраненные документы, но и иметь возможность сверить их, произведя повторную регенерацию документов на основании сохраненной ранее в `MONO` персональной информации.
При генерации документов `MONO` извлекает шаблон документа и подставляет в него переменные, которые хранит в своей базе данных. Затем, он хэширует документы, подписывает хэши цифровой подписью пайщика, отправляет эти уже анонимизированные документы в блокчейн, параллельно, сохраняя полную версию у себя в базе.
После считывания информации из блокчейна о том, что совершенная транзакция принята успешно, документ попадает в реестр `MONO`, который использует ранее сохраненный документ в приватной базе данных для отображения членам совета и пайщику кооператива. Таким образом, `MONO` может генерировать любое количество любых документов, но принимать в реестр для отображения членам совета и пайщикам только те из них, которые опубликованы в блокчейне.
`MONO` применяет `GraphQL` в качестве API. Поверх `GraphQL-API` создан `SDK`, который обеспечивает упрощенный и чрезвычайно гибкий доступ к функционалу `MONO` для разработчиков.
В основе своей, `MONO` предоставляет систему управления реестрами пайщиков, взносов и документов на основе стандартов [Кооперативной Экономики](https://coopenomic.world). Базовый функционал реестров пайщиков, взносов и документов расширяется с помощью `Расширений`, которые дополняют API и интерфейсы рабочих столов.
Рабочий стол - это универсальное веб-приложение, обеспечивающее пользовательский интерфейс `MONO` на сайтах, мобильных и десктопных приложениях. Рабочий стол `MONO` реализует подключение контроллеру `MONO` для доступа к реестрам, а через него - к блочейну [Кооперативной Экономики](https://coopenomics.world).
Рабочий стол `MONO` предоставляет функционал для управления отношениями с пайщиками кооператива. Он включает в себя все доступные возможности кооперативной экономики через `Расширения`. Каждое расширение увеличивает функциональные возможности `MONO`.
Однако, использование `MONO` не принуждает к использованию рабочих столов `MONO`. Контроллер `MONO`, предоставляющий мутации, запрос и подписки GraphQL-API, может использоваться отдельно от рабочих столов при сохранении полной его функциональности.
## Компоненты
MONO состоит из следующих компонентов и построен на следующем технологическом стеке, что обеспечивает его функциональность и гибкость для кооперативов.
### Блокчейн COOPOS
[![Просмотреть на GitHub](https://img.shields.io/badge/Просмотреть%20на-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/coopenomics/coopos)
Блокчейн COOPOS является основой Кооперативной Экономики. Он содержит кооперативные смарт-контракты, шаблоны документов и стандарты взаимодействия. COOPOS обеспечивает хранение публичных данных о транзакциях, позволяя кооперативам вести прозрачный учёт действий, связанных с пайщиками. Анонимизированные данные блокчейна используются для синхронизации с реестрами MONO.
### Смарт-контракты
[![Просмотреть на GitHub](https://img.shields.io/badge/Просмотреть%20на-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/coopenomics/coopenomics)
Смарт-контракты, работающие на COOPOS, реализуют целевые потребительские программы, регламентируют процессы кооперации и стандартизируют взаимодействие между участниками. Они позволяют автоматизировать такие операции, как регистрация пайщиков, учёт взносов, создание и обработка документов. Смарт-контракты обеспечивают юридическую прозрачность и устойчивость системы.
### Парсер
[![Просмотреть на GitHub](https://img.shields.io/badge/Просмотреть%20на-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/coopenomics/monocoop/tree/main/components/parser)
Парсер обрабатывает данные из блокчейна COOPOS, извлекая действия и транзакции для дальнейшего использования в системе. Он обеспечивает синхронизацию приватной базы данных MONO с блокчейном, фиксируя все действия, связанные с пайщиками и документами. Используется Express для реализации производительной обработки данных, а строгая типизация через TypeScript обеспечивает устойчивость к ошибкам и надёжность.
### Фабрика документов
[![Просмотреть на GitHub](https://img.shields.io/badge/Просмотреть%20на-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/coopenomics/monocoop/tree/main/components/factory)
Фабрика документов — это компонент, отвечающий за создание и управление документами. На основе данных из блокчейна и приватной базы данных она формирует документы в форматах PDF и HTML. Документы можно регенерировать, сверяя их с сохранённой информацией. Фабрика поддерживает шаблоны, которые стандартизируют форматы документов согласно стандартам [Кооперативной Экономики](https://coopenomics.world).
### Контроллер
[![Просмотреть на GitHub](https://img.shields.io/badge/Просмотреть%20на-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/coopenomics/monocoop/tree/main/components/controller)
Контроллер предоставляет централизованный доступ ко всем функциям MONO через GraphQL API. Он управляет запросами, мутациями и подписками, а также обеспечивает авторизацию пользователей. Благодаря архитектуре NestJS, контроллер легко расширяется и поддерживает подключение новых модулей или интеграцию с внешними системами.
### База данных
MONO использует PostgreSQL в качестве основного хранилища данных. Эта база данных обеспечивает надёжное хранение приватных данных кооператива, включая реестры пайщиков, документы и метаданные транзакций. MongoDB поддерживается для legacy-систем, но постепенно заменяется PostgreSQL для унификации инфраструктуры.
### SDK
[![Просмотреть на GitHub](https://img.shields.io/badge/Просмотреть%20на-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/coopenomics/monocoop/tree/main/components/sdk)
SDK разработан для упрощения интеграции с MONO. Он предоставляет разработчикам удобный инструмент для работы с API, подключения к блокчейну COOPOS, управления фабрикой документов и доступа к данным кооператива. SDK построен на TypeScript и поддерживает гибкую настройку для различных платформ.
### Рабочий стол
[![Просмотреть на GitHub](https://img.shields.io/badge/Просмотреть%20на-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/coopenomics/monocoop/tree/main/components/desktop)
Рабочий стол — это универсальное веб-приложение, созданное с использованием Quasar, VueJS и TypeScript. Он обеспечивает удобные интерфейсы для пайщиков и администрации кооператива. Рабочий стол интегрируется с контроллером MONO для управления реестрами, документами и взаимодействия с блокчейном. Он поддерживает модульное подключение расширений, добавляющих новые функции для конкретных нужд.
### Расширения
Расширения позволяют адаптировать MONO под специфические нужды каждого кооператива. Они расширяют API и интерфейсы рабочих столов, добавляя новые функции. Расширения интегрируются через контроллер, поддерживая модульность системы.
### Документация
[![Просмотреть на GitHub](https://img.shields.io/badge/Просмотреть%20на-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/coopenomics/monocoop/tree/main/components/docs)
Полный набор технической документации к MONO, SDK и GraphQL API. Документация включает описание схем данных, примеры запросов, инструкции по интеграции и рекомендации для разработчиков, позволяя быстро и эффективно настроить систему.
@@ -1,62 +0,0 @@
# Аутентификация
Система аутентификации платформы MONO основана на цифровых подписях EOSIO. Каждый пользователь владеет парой криптографических ключей — приватным и публичным. Приватный ключ используется для создания цифровой подписи, а публичный ключ позволяет проверить подлинность этой подписи. Аутентификация происходит путем подписания случайного вызова сервера приватным ключом пользователя.
В системе MONO используется двухтокенная схема аутентификации:
- **Access Token** — для доступа к API с коротким временем жизни
- **Refresh Token** — для обновления access token с длительным временем жизни
Это обеспечивает баланс между безопасностью и удобством использования.
## Вход в систему
{{ get_sdk_doc("Mutations", "Auth", "Login") }} | {{ get_graphql_doc("Mutation.login") }}
{{ get_typedoc_input("Mutations.Auth.Login") }}
Результат:
{{ get_typedoc_definition("Mutations.Auth.Login", "IOutput") }}
Процесс входа в систему:
1. Клиент отправляет имя пользователя
2. Сервер возвращает случайный challenge
3. Клиент подписывает challenge приватным ключом
4. Сервер проверяет подпись и выдает токены
## Обновление токена
{{ get_sdk_doc("Mutations", "Auth", "Refresh") }} | {{ get_graphql_doc("Mutation.refresh") }}
{{ get_typedoc_input("Mutations.Auth.Refresh") }}
Результат:
{{ get_typedoc_definition("Mutations.Auth.Refresh", "IOutput") }}
Refresh token имеет более длительное время жизни и используется для получения новых access token без повторной аутентификации.
## Выход из системы
{{ get_sdk_doc("Mutations", "Auth", "Logout") }} | {{ get_graphql_doc("Mutation.logout") }}
{{ get_typedoc_input("Mutations.Auth.Logout") }}
Результат:
{{ get_typedoc_definition("Mutations.Auth.Logout", "IOutput") }}
При выходе из системы refresh token добавляется в черный список, что делает невозможным его дальнейшее использование.
## Роли и права доступа
Система поддерживает следующие роли:
- **chairman** — председатель совета (полные права)
- **member** — член совета (ограниченные права)
- **user** — обычный пользователь (минимальные права)
Права доступа проверяются для каждого GraphQL запроса с помощью декораторов `@AuthRoles`.
## Безопасность
- Все токены имеют ограниченное время жизни
- Используется криптография уровня блокчейна EOSIO
- Поддерживается черный список refresh token
- Процесс восстановления ключей защищен email-верификацией (см. раздел "Аккаунты")
@@ -1,106 +0,0 @@
# Кооперативные участки
Кооперативные участки — это организационная структура крупных кооперативов для эффективного управления и представительства интересов пайщиков в различных регионах или сферах деятельности.
## Получить список участков
{{ get_sdk_doc("Queries", "Branches", "GetBranches") }} | {{ get_graphql_doc("Query.getBranches") }}
{{ get_typedoc_input("Queries.Branches.GetBranches") }}
Результат:
{{ get_typedoc_definition("Queries.Branches.GetBranches", "IOutput") }}
## Создать участок
{{ get_sdk_doc("Mutations", "Branches", "CreateBranch") }} | {{ get_graphql_doc("Mutation.createBranch") }}
{{ get_typedoc_input("Mutations.Branches.CreateBranch") }}
Результат:
{{ get_typedoc_definition("Mutations.Branches.CreateBranch", "IOutput") }}
Создание нового кооперативного участка с назначением уполномоченного лица.
## Изменить участок
{{ get_sdk_doc("Mutations", "Branches", "EditBranch") }} | {{ get_graphql_doc("Mutation.editBranch") }}
{{ get_typedoc_input("Mutations.Branches.EditBranch") }}
Результат:
{{ get_typedoc_definition("Mutations.Branches.EditBranch", "IOutput") }}
Редактирование информации о кооперативном участке.
## Удалить участок
{{ get_sdk_doc("Mutations", "Branches", "DeleteBranch") }} | {{ get_graphql_doc("Mutation.deleteBranch") }}
{{ get_typedoc_input("Mutations.Branches.DeleteBranch") }}
Результат:
{{ get_typedoc_definition("Mutations.Branches.DeleteBranch", "IOutput") }}
Удаление кооперативного участка из системы.
## Управление доверенными лицами
### Добавить доверенное лицо
{{ get_sdk_doc("Mutations", "Branches", "AddTrustedAccount") }} | {{ get_graphql_doc("Mutation.addTrustedAccount") }}
{{ get_typedoc_input("Mutations.Branches.AddTrustedAccount") }}
Результат:
{{ get_typedoc_definition("Mutations.Branches.AddTrustedAccount", "IOutput") }}
Добавление доверенного лица для кооперативного участка.
### Удалить доверенное лицо
{{ get_sdk_doc("Mutations", "Branches", "DeleteTrustedAccount") }} | {{ get_graphql_doc("Mutation.deleteTrustedAccount") }}
{{ get_typedoc_input("Mutations.Branches.DeleteTrustedAccount") }}
Результат:
{{ get_typedoc_definition("Mutations.Branches.DeleteTrustedAccount", "IOutput") }}
Удаление доверенного лица кооперативного участка.
## Выбор участка пайщиком
### Выбрать участок
{{ get_sdk_doc("Mutations", "Branches", "SelectBranch") }} | {{ get_graphql_doc("Mutation.selectBranch") }}
{{ get_typedoc_input("Mutations.Branches.SelectBranch") }}
Результат:
{{ get_typedoc_definition("Mutations.Branches.SelectBranch", "IOutput") }}
Выбор кооперативного участка пайщиком для делегирования голоса.
### Сгенерировать документ выбора
{{ get_sdk_doc("Mutations", "Branches", "GenerateSelectBranchDocument") }} | {{ get_graphql_doc("Mutation.generateSelectBranchDocument") }}
{{ get_typedoc_input("Mutations.Branches.GenerateSelectBranchDocument") }}
Результат:
{{ get_typedoc_definition("Mutations.Branches.GenerateSelectBranchDocument", "IOutput") }}
Генерация документа, подтверждающего выбор кооперативного участка.
## Мажоритарная система
В мажоритарной системе управления (≥3 участков) пайщики делегируют свои голоса уполномоченным лицам участков, которые представляют их интересы на общих собраниях кооператива.
## Процедуры участков
1. **Создание** — создание участка с назначением уполномоченного
2. **Настройка** — добавление доверенных лиц и настройка параметров
3. **Регистрация пайщиков** — привязка пайщиков к участку
4. **Представительство** — участие в управлении кооперативом
@@ -1,244 +0,0 @@
MONO SDK предоставляет набор вспомогательных классов для работы с различными аспектами системы. Все классы доступны через пространство имён `Classes` в SDK клиенте.
```ts
import { Classes } from '@coopenomics/sdk'
```
## Account
Класс {{ get_class_doc("Account") }} предназначен для генерации новых аккаунтов с уникальными именами и криптографическими ключами.
{{ get_typedoc_desc("Classes.Account") }}
### Основные методы
- **`constructor()`** - создаёт новый экземпляр аккаунта
- **`generateUsername()`** - генерирует случайное имя аккаунта (12 символов)
- **`generateKeys()`** - создаёт пару ключей (приватный/публичный)
### Пример использования
```ts
import { Classes } from '@coopenomics/sdk'
// Создание нового аккаунта
const newAccount = new Classes.Account()
console.log(newAccount.username) // "abcdxyzuvwrs"
console.log(newAccount.private_key) // "5JxyzABC1234567890defGHIJKLMNopqRSTUV"
console.log(newAccount.public_key) // "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5SozEZ8i8jUBS6yX79y6"
```
## Canvas
Класс {{ get_class_doc("Canvas") }} обеспечивает создание интерактивного холста для сбора собственноручной подписи пайщика в формате, совместимом с требованиями MONO.
{{ get_typedoc_desc("Classes.Canvas") }}
### Основные методы
- **`constructor(container, options)`** - создаёт холст в указанном контейнере
- **`clearCanvas()`** - очищает содержимое холста
- **`getSignature()`** - извлекает подпись в формате base64
- **`destroy()`** - освобождает ресурсы и удаляет обработчики событий
### Пример использования
```ts
import { Classes } from '@coopenomics/sdk'
// Получаем контейнер для размещения холста
const container = document.getElementById('signature-container') as HTMLElement
// Создаём экземпляр Canvas для работы с подписью
const signatureCanvas = new Classes.Canvas(container, {
lineWidth: 5,
strokeStyle: '#000'
})
// Пользователь рисует подпись...
// Извлечение подписи в формате base64
const signature = signatureCanvas.getSignature()
console.log('Подпись в формате base64:', signature)
// Очистка холста при необходимости
signatureCanvas.clearCanvas()
// Освобождение ресурсов
signatureCanvas.destroy()
```
## Document
Класс {{ get_class_doc("Document") }} предоставляет инструменты для цифрового подписания документов с использованием WIF-ключей и проверки подписей.
{{ get_typedoc_desc("Classes.Document") }}
### Основные методы
- **`constructor(wifKey?)`** - инициализация с опциональным WIF-ключом
- **`setWif(wifKey)`** - установка/замена WIF-ключа
- **`signDocument(document, account, signatureId, existingSignedDocuments?)`** - подписание документа
- **`static validateDocument(document)`** - валидация подписанного документа
- **`static finalize(document)`** - финализация документа для отправки в блокчейн
- **`static parse(document)`** - парсинг документа из блокчейна
### Пример использования
```ts
import { Classes } from '@coopenomics/sdk'
const wifKey = "your-wif-private-key"
const docSigner = new Classes.Document(wifKey)
const generatedDoc = {
full_title: "Пример документа",
html: "<p>Это пример документа</p>",
hash: "hash_of_document",
meta: { author: "Автор документа" },
binary: "binary_data"
}
// Подписание документа
const signedDoc = await docSigner.signDocument(generatedDoc, "username", 1)
// Проверка валидности подписанного документа
const isValid = Classes.Document.validateDocument(signedDoc)
console.log('Документ валиден:', isValid)
```
## Blockchain
Класс {{ get_class_doc("Blockchain") }} обеспечивает взаимодействие с блокчейном COOPOS, включая выполнение транзакций и работу с таблицами смарт-контрактов.
{{ get_typedoc_desc("Classes.Blockchain") }}
### Основные методы
- **`constructor(config)`** - инициализация с конфигурацией блокчейна
- **`setWif(username, wif, permission?)`** - установка приватного ключа для транзакций
- **`getInfo()`** - получение информации о блокчейне
- **`transact(actions, broadcast?)`** - выполнение транзакций
- **`getAllRows(code, scope, tableName)`** - получение всех строк таблицы
- **`query(code, scope, tableName, options)`** - запрос строк с фильтрацией
- **`getRow(code, scope, tableName, primaryKey, indexPosition?)`** - получение одной строки
### Пример использования
```ts
import { Classes } from '@coopenomics/sdk'
const blockchain = new Classes.Blockchain({
chain_url: "https://api.coopenomics.world",
chain_id: "6e37f9ac0f0ea717bfdbf57d1dd5d7f0e2d773227d9659a63bbf86eec0326c1b"
})
// Установка ключа для подписания транзакций
blockchain.setWif("username", "your-wif-key")
// Получение информации о блокчейне
const info = await blockchain.getInfo()
console.log('Блокчейн инфо:', info)
// Выполнение транзакции
const result = await blockchain.transact({
account: 'eosio.token',
name: 'transfer',
data: {
from: 'sender',
to: 'receiver',
quantity: '1.0000 EOS',
memo: 'Перевод'
}
})
// Получение данных из таблицы
const accounts = await blockchain.getAllRows('eosio.token', 'EOS', 'accounts')
console.log('Аккаунты:', accounts)
```
## Crypto
Класс {{ get_class_doc("Crypto") }} предоставляет криптографические функции, работающие как в браузере, так и в Node.js окружении.
{{ get_typedoc_desc("Classes.Crypto") }}
### Основные методы
- **`static sha256(data)`** - получение SHA-256 хэша от строки или числа
### Пример использования
```ts
import { Classes } from '@coopenomics/sdk'
// Получение хэша строки
const hash1 = await Classes.Crypto.sha256("Hello World")
console.log('Хэш строки:', hash1)
// Получение хэша числа
const hash2 = await Classes.Crypto.sha256(12345)
console.log('Хэш числа:', hash2)
// Работает в браузере и Node.js
```
## Vote
Класс {{ get_class_doc("Vote") }} предназначен для создания и проверки цифровых подписей при голосовании членов совета кооператива.
{{ get_typedoc_desc("Classes.Vote") }}
### Основные методы
- **`constructor(wifKey?)`** - инициализация с опциональным WIF-ключом
- **`setWif(wifKey)`** - установка/замена WIF-ключа
- **`voteFor(coopname, username, decision_id)`** - создание подписи для голоса "ЗА"
- **`voteAgainst(coopname, username, decision_id)`** - создание подписи для голоса "ПРОТИВ"
- **`static validateVote(data)`** - валидация подписи голоса
- **`static validateVoteWithHashCheck(data)`** - расширенная валидация с проверкой хэша
### Пример использования
```ts
import { Classes } from '@coopenomics/sdk'
const wifKey = "your-wif-private-key"
const voteSigner = new Classes.Vote(wifKey)
// Голосование за решение
const voteForData = await voteSigner.voteFor("coop1", "member1", 123)
console.log('Голос ЗА:', voteForData)
// Голосование против решения
const voteAgainstData = await voteSigner.voteAgainst("coop1", "member1", 124)
console.log('Голос ПРОТИВ:', voteAgainstData)
// Проверка валидности голоса
const isValid = Classes.Vote.validateVote(voteForData)
console.log('Голос валиден:', isValid)
// Расширенная проверка с валидацией хэша
const isValidWithHash = await Classes.Vote.validateVoteWithHashCheck(voteForData)
console.log('Голос валиден (с проверкой хэша):', isValidWithHash)
```
## Использование в SDK клиенте
Все классы также доступны через экземпляр SDK клиента:
```ts
import { Client } from '@coopenomics/sdk'
const client = Client.create({
api_url: "http://127.0.0.1:2998/v1/graphql",
chain_url: "https://api.coopenomics.world",
chain_id: "6e37f9ac0f0ea717bfdbf57d1dd5d7f0e2d773227d9659a63bbf86eec0326c1b"
})
// Доступ к классам через клиент
const newAccount = new client.Classes.Account()
const signature = client.Classes.Canvas(container)
const docSigner = client.Classes.Document(wifKey)
```
@@ -1,217 +0,0 @@
`Решение` - это утвержденное протоколом собрания совета юридическое действие в кооперативе.
Все решения принимаются онлайн-голосованием членов совета на платформе. После успешного голосования председатель утверждает автоматически-сформированный протокол собрания совета, а блокчейн - исполняет его.
Решения бывают: `стандартизированные` и `свободные`.
```mermaid
graph TD
A[Решение] -->|создаётся и исполняется автоматически| B[Стандартизированное]
A -->|создаётся и исполняется вручную| C[Свободное]
B -->|Предложение поступает от смарт-контрактов| D[Повестка]
D -->|Вопрос выносится на голосование| E[Голосование]
E -->|Решение принято| F[Утверждение председателем]
F -->|Фиксация в реестре| G[Исполняется автоматически]
C -->|Предложение поступает от членов совета| H[Повестка]
H -->|Вопрос выносится на голосование| I[Голосование]
I -->|Решение принято| J[Утверждение председателем]
J -->|Фиксация в реестре| K[Исполняется вручную]
```
`Стандартизированные` решения принимаются по типичным вопросам, такие как: приём пайщика, приём паевого взноса финансовыми средствами, приём паевого взноса имуществом, возврат паевого взноса финансовыми средствами, возврат паевого взноса имуществом, выход пайщика из кооператива, и т.д. и т.п.
`Стандартизированные` решения полностью автоматизированы, предложения на вопросы для голосование в них формируются автоматически и фиксируются в повестке для дальнейшего голосования совета. После проведения голосования и утверждения председателем совета, решение будет исполнено автоматически - например, пайщик будет добавлен в реестр, взносы зафиксируются в фондах, и т.д. и т.п..
Таким образом, `стандартизированные` решения полностью автоматизированы в том плане, что входящие данные по ним формируются системой автоматически на основе действий пайщика и не требуют участия администрации кооператива в подготовке документов - документы по стандартазированным решениям готовятся и исполняются автоматически.
`Свободные` решения свободны в том плане, что вопрос на повестку и проект решения по этому вопросу предлагается членом совета на голосование всему совету. Если голосование прошло успешно и решение принято, то оно фиксируется в реестре документов и не приводит к автоматическому исполнению содержимого. Исполнение свободного решения производится советом `вручную`,
`Свободные` и `стандартизированные` решения предоставляют совету возможность легко и просто принимать решения по любым вопросам удаленно, на основе простой электронной подписи.
__Общий порядок принятия решений__
```mermaid
sequenceDiagram
participant Смарт-контракт/Член совета
participant Платформа
participant Члены совета
participant Председатель
participant Блокчейн
participant Реестр
Смарт-контракт/Член совета ->> Платформа: Формирует предложение (стандартизированное/свободное)
Платформа ->> Члены совета: Выставляет на голосование (48 часов)
loop В течение 48 часов
Члены совета ->> Платформа: Голосуют (ЗА / ПРОТИВ / Воздержался)
end
alt Проголосовало 50%+ ЗА
Платформа ->> Председатель: Генерация протокола
Председатель ->> Платформа: Подписывает протокол
Платформа ->> Блокчейн: Фиксирует решение
alt Решение стандартизированное
Блокчейн ->> Блокчейн: Исполняет решение (изменение статусов, балансов и т. д.)
end
Блокчейн ->> Реестр: Записывает в реестр решений
else Решение не принято
Платформа ->> Платформа: Вопрос снимается с повестки
end
```
__I. В смарт-контракт совета поступает `стандартизированное` или `свободное` предложение на повестку дня для голосования совета.__
`Стандартизированные` предложения поступают от кооперативных смарт-контрактов, которые каждый согласно своей бизнес-логике подразумевают необходимость решения совета на каком-либо этапе своего исполнения. Например, `стандартизированное` предложение на повестку о приёме пайщика возникает сразу после получения оплаты вступительного взноса, и никак иначе.
Исполнение `стандартизированных` решений приводит к появлению эффектов, например, таких как "изменение баланса лицевого счёта", или "изменение статуса пайщика", которые фиксируются в блокчейне согласно бизнес-логике смарт-контрактов [Кооперативной Экономики](https://coopenomics.world).
`Свободные` предложения и проекты решения по ним формируются членами совета вручную. Они не предлагаются автоматически и решения по ним не приводят к эффектам в блокчейне.
__II. Члены совета голосуют ЗА, ПРОТИВ, или воздерживаются от голосования по вопросу.__
Каждый вопрос на повестке - это отдельное собрание совета, решение которого фиксируется отдельным протоколом. Один вопрос - один протокол. За один день может быть проведено неограниченное количество собраний совета и получено неограниченное количество протоколов решений.
Решение по вопросу необходимо принять за 48 часов. Решение считается принятым, если ЗА него проголосовало 50% членов совета. По истечению 48 часов, если решение не принято, вопрос с повестки снимается автоматически.
__III. Принятое решение утверждается председателем совета.__
Если совет кооператива принял положительное решение, то оно должно быть утверждено простой электронной подписью председателя совета на протоколе.
Протоколы формируются полностью автоматически на основе информации о пайщике, совершаемом им `стандартизированном` действии (если такое есть), о членах совета, и информации о их голосовании по вопросу. На основе всей этой информации система автоматически генерирует по запросу председателя протокол собрания совета.
Председатель подписывает сгенерированный протокол собрания совета своей электронной подписью, и отправляет его в блокчейн, тем самым, утверждая и исполняя принятое решение.
`Свободные` решения принимаются идентично `стандартизированным`, однако вопрос на голосование и предлагаемое решение формируется членом совета через заполнение двух полей: `предлагаемый вопрос на повестку` и `предлагаемое решение`. На основе этих данных формируется цифровой документ предложения повестки дня, которая используется при формировании протокола принятого решения.
__IV. Все принятые решения фиксируются в реестре.__
Все принятые решения фиксируются в реестре. Подробнее о реестре документов смотри раздел [Документы](/documentation/documents).
## Просмотреть повестку
{{ get_sdk_doc("Queries", "Agenda", "GetAgenda") }} | {{ get_graphql_doc("Mutation.getAgenda") }}
{{ get_typedoc_desc("Queries.Agenda.GetAgenda") }}
{{ get_typedoc_input("Queries.Agenda.GetAgenda") }}
В результате исполнения запроса будет возвращён массив пакетов документов, каждый из которых содержит информацию о состоянии голосования по вопросу, о членах совета, их персональных данных и подписах, которые они оставили, а также о пайщике, который является участником юридического действия, и его личных данных.
Выполнение запроса доступно только для членов совета. Подробнее о содержании пакета документов смотри раздел [Документы](/documentation/documents).
## Проголосовать за решение
{{ get_class_doc("Vote") }}
Для голосования "ЗА" используется метод `voteFor()` класса `Classes.Vote`. Данный метод создает цифровую подпись голоса члена совета.
```ts
import { Classes } from '@coopenomics/sdk'
const wifKey = "your-wif-private-key"
const voteSigner = new Classes.Vote(wifKey)
// Голосование за решение
const voteForResult = await voteSigner.voteFor("coopname", "username", 123)
console.log(voteForResult)
```
## Проголосовать против решения
{{ get_class_doc("Vote") }}
Для голосования "ПРОТИВ" используется метод `voteAgainst()` класса `Classes.Vote`. Данный метод создает цифровую подпись голоса члена совета.
```ts
import { Classes } from '@coopenomics/sdk'
const wifKey = "your-wif-private-key"
const voteSigner = new Classes.Vote(wifKey)
// Голосование против решения
const voteAgainstResult = await voteSigner.voteAgainst("coopname", "username", 123)
console.log(voteAgainstResult)
```
## Воздержаться от голосования
Для того, чтобы члену совета воздержаться от голосования, достаточно не голосовать ЗА или ПРОТИВ решения в течение 48 часов. Специального действия для воздержания не предусмотрено.
<a id="authorize-decision"></a>
## Утвердить решение
{{ get_graphql_doc("Mutation.authorize") }}
Утверждение решения производится председателем совета путем отправки транзакции `authorize` напрямую в блокчейн с подписанным протоколом решения.
**Примечание:** В настоящее время в SDK нет готовой мутации для утверждения решений. Операция выполняется через прямое взаимодействие с блокчейном при помощи класса `Classes.Blockchain`.
## Исполнить решение
{{ get_graphql_doc("Mutation.exec") }}
Исполнение решения производится путем отправки транзакции `exec` напрямую в блокчейн для фиксации принятого решения в реестре.
**Примечание:** В настоящее время в SDK нет готовой мутации для исполнения решений. Операция выполняется через прямое взаимодействие с блокчейном при помощи класса `Classes.Blockchain`.
## Стандартизированные решения
### Решение о приёме пайщика
{{ get_sdk_doc("Mutations", "Participants", "GenerateParticipantApplicationDecision") }} | {{ get_graphql_doc("Mutation.generateParticipantApplicationDecision") }}
Предложение на повестку формируется автоматически при [регистрации пайщика](/documentation/participants) на основании заполненного и подписанного заявления о вступлении в кооператив. Решение по вопросу приёма пайщика принимается советом на голосовании. После принятия положительного решения, председатель должен сформировать протокол решения собрания совета с помощью мутации:
{{ get_typedoc_input("Mutations.Participants.GenerateParticipantApplicationDecision") }}
Полученный с помощью этой мутации цифровой документ необходимо использовать при [Утверждении решения](/documentation/decisions#authorize-decision). Не обязательные параметры в мутации выше устанавливаются автоматически и передаются только для повторной регенации документа на основе ранее полученных мета-данных.
## Свободные решения
Процесс предложения решения на повестку состоит из трех этапов:
1. Создать предложение и сохранить его в базе MONO для дальнейшей генерации документа.
2. Сгенерировать документ повестки собрания совета.
3. Опубликовать вопрос в повестке собрания совета.
После голосования совета и принятия решения председатель вызывает метод генерации протокола свободного решения и использует его для [утверждения](/documentation/decisions/#authorize-decision).
### Создать предложение решения
{{ get_sdk_doc("Mutations", "FreeDecisions", "CreateProjectOfFreeDecision") }} | {{ get_graphql_doc("Mutation.createProjectOfFreeDecision") }}
Предложение вопроса и его решения создаётся с помощью мутации `CreateProjectOfFreeDecision`, которая получает информацию о вопросе и его решении, и сохраняет для дальнейшего использования при генерации документа.
{{ get_typedoc_input("Mutations.FreeDecisions.CreateProjectOfFreeDecision") }}
### Сгенерировать документ предложения решения
{{ get_sdk_doc("Mutations", "FreeDecisions", "GenerateProjectOfFreeDecision") }} | {{ get_graphql_doc("Mutation.generateProjectOfFreeDecision") }}
{{ get_typedoc_input("Mutations.FreeDecisions.GenerateProjectOfFreeDecision") }}
### Опубликовать документ повестки с предложением
{{ get_sdk_doc("Mutations", "FreeDecisions", "PublishProjectOfFreeDecision") }} | {{ get_graphql_doc("Mutation.publishProjectOfFreeDecision") }}
Предложение повестки дня публикуется в смарт-контракте с помощью мутации `PublishProjectOfFreeDecision`. Сразу после публикации повестки совет может приступать к голосованию.
{{ get_typedoc_input("Mutations.FreeDecisions.PublishProjectOfFreeDecision") }}
### Сгенерировать протокол свободного решения по предложению
{{ get_sdk_doc("Mutations", "FreeDecisions", "GenerateFreeDecision") }} | {{ get_graphql_doc("Mutation.generateFreeDecision") }}
Протокол свободного решения генерируется на основании принятого решения, а также документа с предложением, которое было опубликовано членом совета. После генерации протокола свободного решения председатель должен [утвердить](/documentation/decisions/#authorize-decision) его для фиксации в реестре [Документов](/documentation/documents).
{{ get_typedoc_input("Mutations.FreeDecisions.GenerateFreeDecision") }}
Результат исполнения:
{{ get_typedoc_definition("Mutations.FreeDecisions.GenerateFreeDecision", "IOutput") }}
@@ -1,23 +0,0 @@
Рабочий стол MONO предоставляет унифицированный интерфейс доступа к приложениям кооператива. Система автоматически формирует состав доступных приложений на основе установленных приложений и базовых модулей платформы.
## Получение состава рабочего стола
{{ get_sdk_doc("Queries", "Desktop", "GetDesktop") }} | {{ get_graphql_doc("Query.getDesktop") }}
Метод возвращает полный состав приложений рабочего стола, включая базовые модули MONO и установленные приложения.
{{ get_typedoc_input("Queries.Desktop.GetDesktop") }}
Результат:
{{ get_typedoc_definition("Queries.Desktop.GetDesktop", "IOutput") }}
## Структура данных
Рабочий стол включает следующие типы приложений:
- **Базовые приложения** - встроенные модули MONO (аккаунты, платежи, документы)
- **Приложения** - дополнительные модули, установленные председателем
- **Системные утилиты** - административные инструменты управления кооперативом
Каждое приложение содержит метаданные о своем назначении, версии, правах доступа и интерфейсных элементах для отображения в пользовательском интерфейсе.
@@ -1,266 +0,0 @@
Документ — это объект, несущий юридически-значимую информацию, необходимую для работы кооператива и подтверждения прав пайщиков или других участников. Взаимодействие с документом включает в себя его подготовку, подписание и публикацию в блокчейне. При этом документ всегда состоит из двух частей:
`Публичная часть` — хранится в блокчейне в анонимизированном виде, не раскрывает конфиденциальных данных пайщика и включает минимальный набор сведений, достаточный для проверки подлинности документа. При наличии приватных данных, хранящихся вне блокчейна, этот документ может быть полностью восстановлен.
`Приватная часть` — хранится во внутренней базе данных платформы MONO. Эта часть содержит личные или иные конфиденциальные данные пайщика, информацию о содержании документа, подписи, дополнительные детали и всё то, что не должно публиковаться публично. Из неё же берётся необходимая информация для генерации, регенерации и сверки документа с его публичной частью, которая была зафиксирована в блокчейне.
При этом все документы, публикуемые в блокчейне, анонимизированно фиксируются через соответствующие смарт-контракты, что обеспечивает прозрачный и неизменяемый учёт без раскрытия приватных сведений.
```mermaid
flowchart TD
A("Цифровой Документ")
B("Обезличенная часть")
C("Приватная часть")
A -->|зафиксировано в блокчейне| B
A -->|хранится в MONO| C
```
## Получение документов
### Получить список документов
{{ get_sdk_doc("Queries", "Documents", "GetDocuments") }} | {{ get_graphql_doc("Query.getDocuments") }}
Получение списка документов пайщика с фильтрацией по статусу, типу и другим параметрам. Возвращает как публичную информацию из блокчейна, так и приватные данные из внутренней базы MONO.
{{ get_typedoc_input("Queries.Documents.GetDocuments") }}
Результат:
{{ get_typedoc_definition("Queries.Documents.GetDocuments", "IOutput") }}
## Фиксация документов
Каждый раз, когда пользователь (пайщик) формирует документ, он генерируется платформой MONO на основании данных, которые уже есть во внутренней базе кооператива. При генерации создаётся как PDF-версия (бинарное представление), так и HTML-версия (для удобного отображения в интерфейсе). Параллельно формируется hash PDF-файла и метаданные, необходимые для будущей регенерации.
Когда пользователь подписывает сформированный документ (PDF-хэш), подпись вместе с публичным ключом и мета-данными отправляется обратно на платформу MONO, и уже MONO публикует эту информацию в блокчейн через вызов соответствующих мутаций смарт-контрактов.
Таким образом, пайщик напрямую не отправляет документ в блокчейн: за него это делает MONO, храня всю детальную информацию у себя, но публикуя в блокчейне лишь зашифрованные или анонимизированные данные, достаточные для удостоверения подлинности документа.
## Структура данных в блокчейне
Смарт-контракты в блокчейне фиксируют документ в обезличенном виде. Вызов мутации, отвечающей за публикацию документа, сохраняет в блокчейне следующую структуру:
```ts
interface ISignedDocument {
hash: <string> // Хэш-сумма подписанного PDF-документа
signature: <string> // Подпись хэш-суммы
public_key: <string> // Публичный ключ, которым подписан документ
meta: <object> // Строка с JSON-объектом мета-информации о документе
}
```
Где `hash` - позволяет однозначно идентифицировать документ, `signature` и `public_key` обеспечивают криптографическую верификацию подлинности подписи, а `meta` содержит дополнительную информацию (в формате JSON), позволяющую в будущем восстановить содержание документа (используя данные из внутренней базы MONO).
Таким образом, вся конфиденциальная часть документа (тексты, личные данные, детали договора и т.д.) не вводятся в публичный реестр блокчейна. Блокчейн хранит лишь контрольные суммы и ограниченный набор открытых сведений, необходимые для проверки и восстановления документа.
## Процесс генерации и подписания документа
```mermaid
sequenceDiagram
participant U as Пайщик (Пользователь)
participant M as MONO
participant BC as Блокчейн (смарт-контракт)
U->>M: 1) Запрос на генерацию документа (Generate...)
M->>U: Возвращает IGeneratedDocument <br/>(PDF/HTML, хэш, метаданные)
U->>U: 2) Подписывает документ<br/>(hash) приватным ключом
U->>M: Передаёт подписанный документ (signature, public_key)
M->>BC: 3) Публикует ISignedDocument<br/>(hash, signature, public_key, meta)
BC-->>M: Извлекает и сохраняет публичные данные (хэш и пр.)
```
### Инициирующее действие
Пользователь инициирует процесс, вызывая мутацию с префиксом Generate. На примере генерации ползовательского соглашения:
{{ get_sdk_doc("Mutations", "Agreements", "GenerateUserAgreement") }}
На примере подписи пользовательского соглашения {{ get_sdk_doc("Mutations", "Agreements", "GenerateUserAgreement") }}:
{{ get_typedoc_input("Mutations.Agreements.GenerateUserAgreement") }}
В ответ `MONO` формирует документ:
```ts
interface IGeneratedDocument {
binary: <string> // base64-кодированное содержимое PDF
full_title: <string> // Полное название документа
hash: <string> // Хэш-сумма PDF-файла
html: <string> // HTML-версия документа
meta: <MetaDocument> // Объект метаданных
}
```
### Подпись документа
На полученный `hash` документ пользователь накладывает цифровую подпись с помощью своего приватного ключа в классе Document
```ts
import { Classes } from '@coopenomics/sdk'
//создать фабрику и установить ключ для подписи
const documentFactory = new Classes.Document(<wif>)
//подписать ранее сгенерированный документ
const signedDocument: ISignedDocument = documentFactory.sign(generatedDocument)
```
Также вместо создания новой фабрики документов, можно использовать фабрику из ранее созданного клиента:
```ts
//устанавливаем ключ, если ранее вход в клиенте с помощью login не исполнялся
client.document.setWif(<wif>)
//подписываем документ
const signedDocument: ISignedDocument = client.document.sign(generatedDocument)
```
!!!note ""
Если экземпляр клиента ранее вызывал метод `client.login(...)` для входа, то класс `client.Document` уже содержит приватный ключ `wif` и может подписывать документы без повторной установки ключа.
В результате, будет получен объект с подписанным документом, пригодным к использованию в мутациях `MONO`.
### Публикация в блокчейне
Для отправки документа необходимо вызвать соответствующую ему мутацию `MONO` и передать подписанный документ в качестве аргумента. `MONO` произведет необходимые проверки и опубликует документ в блокчейне, вызвав соответствующий мутации кооперативный смарт-контракт.
Например, в процессе [регистрации пайщика](/documentation/participants) необходимо отправить сразу несколько сгенерированных и подписанных документов:
{{ get_typedoc_input("Mutations.Participants.RegisterParticipant") }}
В результате её исполнения, публичные данные документов (хэш, подпись, публичный ключ и мета-данные) зафиксируются в блокчейне, а кооперативный смарт-контракт регистрации продолжит своё исполнение по ходу своей бизнес-логики.
## Пакет документов
Пакет документов представляет собой набор всех документов, относящихся к определённому процессу внутри кооператива (например, вступление в кооператив, взнос или возврат имущества имущества, подписание соглашений и т.д.).
Минимальный пакет всегда содержит хотя бы одно заявление (StatementDetail), опубликованное в блокчейне. В зависимости от бизнес-логики смарт-контракта, к заявлению могут добавляться и другие
документы:
- Протокол Решения (DecisionDetail), содержащий данные о том, как совет кооператива принял решение по заявлению.
- Акты (ActDetail), завершающие юридически значимые действия, например, передача имущества.
- Связанные документы (GeneratedDocument), которые могут прикладываться к заявлению и подписываться вместе с ним (соглашения об использовании платформы, политике конфиденциальности и т.д.).
`MONO` собирает документы, связанные с исходным заявлением, в единый пакет. В этом пакете сохраняются как публичные данные, извлечённые из блокчейна (подписи, хэши, статусы), так и приватные данные (конкретное содержимое документов), которые могут быть показаны только тем, кто имеет право их видеть (пайщик, члены совета, председатель и т.д.).
Если после публикации документа в блокчейне с помощью соответствующей мутации, логика смарт-контракта подразумевает, что необходимо собрать совет кооператива для голосования по вопросу в заявлении, то автоматически создаётся объект будущего протокола решения (DecisionDetail), в котором фиксируется процесс голосования и утверждения.
Структурно пакет может выглядеть так, как показано в диаграмме (см. «Структурная диаграмма пакета документов»).
```mermaid
graph LR
A["📂 Пакет документов (DocumentPackage)"] -->|Содержит| B["📄 Заявление (StatementDetail)"]
A -->|Может содержать| C["📜 Протокол Решения (DecisionDetail)"]
A -->|Может содержать| D["📜 Акты (ActDetail)"]
A -->|Может содержать| E["🔗 Связанные документы (GeneratedDocument)"]
B -->|Основано на| F["⚡ Расширенное действие в блокчейне (ExtendedBlockchainAction)"]
B -->|Содержит| G["📑 Документ заявления (GeneratedDocument)"]
C -->|Основано на| H["⚡ Расширенное действие в блокчейне (ExtendedBlockchainAction)"]
C -->|Содержит| I["📑 Документ протокола решения (GeneratedDocument)"]
C -->|Голоса| J["✅ Голоса 'за' (ExtendedBlockchainAction)"] & K["❌ Голоса 'против' (ExtendedBlockchainAction)"]
D -->|Может содержать| L["⚡ Расширенное действие в блокчейне (ExtendedBlockchainAction)"]
D -->|Связан с| M["📑 Документ акта (GeneratedDocument)"]
F -->|Содержит| Z["👤 Информацию о заявителе"]
H -->|Содержит| X["👤 Информацию о председателе"]
J & K -->|Содержит| O["👤 Информацию о члене совета"]
L -->|Содержит| MM["👤 Информацию о председателе (КУ)"]
L -->|Содержит| NN["👤 Информацию о пайщике"]
```
## Статусы документов
При публикации в блокчейне каждый документ, в зависимости от контекста и бизнес-логики, получает статус:
- `submitted` (входящий) — документ ещё не завершён, ему требуется решение совета или иное дальнейшее действие.
- `resolved` (принятый) — документ получил финальную юридическую силу. Это означает, что все необходимые действия выполнены, голоса совета собраны (если были нужны), акт подписан (если требовалось), и смарт-контракт отметил его как завершённый.
- `rejected` (отклонённый) - документ отклонён. Это означает, что изначально входящий документ отклонён в процессе рассмотрения советом.
```mermaid
flowchart LR
A("submitted (входящий)") --> B("rejected (отклоненный)")
A --> C("resolved (принятый)")
```
При этом все статусы навсегда сохраняются в блокчейне для каждого документа. Даже если документ, находящийся в статусе `submitted`, в итоге отклонён советом, он всё равно останется в этом статусе (и дополнительно переходит в `rejected`), так как данные в публичном реестре не редактируются и не удаляются задним числом.
Соответственно:
- Входящий (`submitted`) документ отражает факт, что не все требования закрыты и решение по нему ещё может быть не принято либо принято отрицательно (но мы увидим это не по статусу, а по факту отсутствия закрывающего действия).
- Принятый (`resolved`) документ свидетельствует о завершённом процессе и имеет всю юридическую силу в реестре кооператива.
- Отклоненный (`rejected`) документ свидетельствует о прерванном процессе и не имеет юридической силы.
## Регенерация документов и хранение в MONO
Внутренняя база MONO хранит всё документы, их приватные части, исторические данные, а также привязку к хэшам, которые были опубликованы в блокчейне. Когда пользователь или член совета запрашивает пакет документов, `MONO`:
- Извлекает публичные данные по документам из блокчейна (через смарт-контракты).
- Находит приватные данные в своей БД, сопоставляя их по `hash`.
- Собирает итоговый пакет, в котором каждому опубликованному действию (ExtendedBlockchainAction) соответствует документ с нужными вложениями (PDF, HTML, метаданные).
Благодаря этому подходу, платформа может регенерировать любой документ в том же виде, в котором он был подписан и отправлен в блокчейн, и сверить заново сгенерированный документ с тем, который был опубликован в блокчейне, тем самым, верифицировав то, что документ создан корректно, а цифровая подпись на нём - валидна.
## Связанные документы
Часто к заявлению или другому документу требуется приложить дополнительные договоры, согласия, соглашения и прочие документы, которые, в свою очередь, могут быть подписаны и закреплены криптографически. Это делается путём добавления в поле `meta` списка (массива) хэш-сумм связанных документов. Подписывая один документ, пайщик тем самым подтверждает связь с другими документами и своё согласие с ними именно в той версии, с которой он ознакомлен.
Пример: когда пользователь вступает в кооператив, он одновременно потверждает согласие с политикой конфиденциальности, условиями целевой программы «Цифрового Кошелька», а также правила использования простой электронной подписи и пользовательское соглашение. Хэши всех этих документов указываются в поле `meta` инициирующего заявления на вступление в кооператив, а подробное содержимое каждого документа хранится в базе `MONO`.
В итоге, вся последовательность от первого инициирующего заявления до заключительного акта, если он предусмотрен бизнес-логикой, превращается в связный пакет документов:
```mermaid
flowchart LR
Z("Инициирующее заявление<br/>(submitted)") -->|Если требуется решение совета| A("Собрание совета и голосование")
Z -->|Если решение совета не требуется| B("Перевод<br/>в resolved")
A -->|Решение принято| D("Подпись актов (при необходимости)")
A -->|Решение не принято| C("Отклонение -> rejected")
D -->|Подписи получены| B("resolved")
```
- Заявление (StatementDetail) и его подпись в блокчейне инициирует цепочку принятия решений или сразу переводит документ в статус `resolved` (принятое), если решение по вопросу не требуется;
- Протокол решения (DecisionDetail) собирает голоса членов совета и ожидает утверждения подписью председателя, если это предусмотрено смарт-контрактом как реакция на инициирующее заявление;
- Акты (ActDetail) подписывается пайщиком и председателем (кооперативного участка), если такое требование есть у смарт-контракта как реакция на инициирующее заявление. Крайняя подпись на акте переводит документ в статус `resolved` и фиксирует его в реестре;
- Прикреплённые (связанные) документы, позволяющие зафиксировать другие важные файлы в рамках этого же пакета;
Такой пакет становится частью списка всех «принятых» решений и документов кооператива, который в любой момент может быть выгружен для проведения аудита, юридических проверок или отчетности перед надзорными органами.
## Получить список пакетов документов
{{ get_sdk_doc("Queries", "Documents", "GetDocuments") }} | {{ get_graphql_doc("Query.getDocuments") }}
{{ get_typedoc_input("Queries.Documents.GetDocuments") }}
Результат исполнения:
{{ get_typedoc_definition("Queries.Documents.GetDocuments", "IOutput") }}
@@ -1,44 +0,0 @@
# Приложения
Приложения позволяют кооперативам подключать дополнительные функции и витрины для расширения возможностей платформы MONO.
## Получить список приложений
{{ get_sdk_doc("Queries", "Extensions", "GetExtensions") }} | {{ get_graphql_doc("Query.getExtensions") }}
{{ get_typedoc_input("Queries.Extensions.GetExtensions") }}
Результат:
{{ get_typedoc_definition("Queries.Extensions.GetExtensions", "IOutput") }}
## Установить приложение
{{ get_sdk_doc("Mutations", "Extensions", "InstallExtension") }} | {{ get_graphql_doc("Mutation.installExtension") }}
{{ get_typedoc_input("Mutations.Extensions.InstallExtension") }}
Результат:
{{ get_typedoc_definition("Mutations.Extensions.InstallExtension", "IOutput") }}
## Обновить приложение
{{ get_sdk_doc("Mutations", "Extensions", "UpdateExtension") }} | {{ get_graphql_doc("Mutation.updateExtension") }}
{{ get_typedoc_input("Mutations.Extensions.UpdateExtension") }}
Результат:
{{ get_typedoc_definition("Mutations.Extensions.UpdateExtension", "IOutput") }}
## Удалить приложение
{{ get_sdk_doc("Mutations", "Extensions", "UninstallExtension") }} | {{ get_graphql_doc("Mutation.uninstallExtension") }}
{{ get_typedoc_input("Mutations.Extensions.UninstallExtension") }}
Результат:
{{ get_typedoc_definition("Mutations.Extensions.UninstallExtension", "IOutput") }}
## Опубликовать приложение
Функционал добавления внешних приложений временно не доступен.
-113
View File
@@ -1,113 +0,0 @@
Фонды - это счета кооператива в [кошельке](/documentation/wallet) для учёта движения паевых, членских и вступительных взносов пайщиков.
Фонды бывают: `возвратные` и `невозвратные`.
Единственным возвратным фондом является паевой фонд. При поступлении средств на него у кооператива возникает обязательство по возврату средств пайщику. Все прочие фонды являются невозвратными, т.е. при поступлении средств в эти фонды у кооператива уже нет обязательств по их возврату пайщикам.
Фонды бывают: `накопительные` и `списания`.
Накопительные фонды накапливают финансовые средства в себя с каждого [членского взноса](/documentation/payments) пайщиков согласно распределению в процентах между всеми накопительными фондами. Фонды списания подобны статьям, по которым кооператив может списывать доступные, ранее накопленные финансовые средства.
<!-- Фонды бывают: `обязательные` и `не обязательные`. -->
В Кошельке фондов кооператива есть следующие обязательные счета, использование которых регулируется смарт-контрактами [Кооперативной Экономики](https://coopenomics.world):
- __Паевой__ - учитывает все паевые взносы пайщиков, увеличивается при взносах и уменьшается при их возврате пайщикам. Является возвратным фондом. Всё что вносится в паевой фонд - подлежит возврату, и должно использоваться кооперативом только для удовлетворения потребности пайщика по его поручению.
- __Неделимый__ - обязательный накопительный фонд членских взносов пайщиков, который передаётся какому-либо кооперативу при ликвидации кооператива.
- __Резервный__ - обязательный накопительный фонд членских взносов пайщиков, который формирует резерв для погашения финансовых обязательств кооператива, которые могут возникнуть в процессе его операционной деятельности.
- __Развития кооперации__ - обязательный накопительный фонд членских взносов пайщиков, который используется для финансирования образовательных, консультационных, инфраструктурных и иных программ, направленных на развитие и укрепление кооператива.
- __Вступительный__ - обязательный накопительный фонд вступительных взносов пайщиков, которые по закону должны использоваться только для списания через счет хозяйственной деятельности.
- __Остаточный__ - обязательный накопительный фонд членских взносов пайщиков, которые остались после распределения по всем фондам накопления кооператива и будут использоваться для дальнейшего списания в будущем.
- __Хозяйственной деятельности__ - обязательный фонд списания расходов, через который проходят все расходы кооператива с `остаточного` счёта.
- __Взаимопомощи__ - обязательный фонд списания на нужды помощи пайщикам, который использует `остаточный` счет как источник средств.
## Как это работает
```mermaid
graph LR;
%% Внешние платежи пайщика
A[Регистрационный платеж] -->|Обработан| B[Вступительный и паевой взнос]
B -- Вступительный --> C[Фонд вступительных взносов]
B -- Паевой --> D[Паевой фонд кооператива]
%% Паевой взнос
X[Паевой платеж] -->|Обработан| E[Паевой взнос]
E[Паевой взнос] -->|Увеличение| D
E -->|Увеличение| F[Паевой счёт пайщика]
%% Возврат паевого взноса
G[Заявление на возврат] -->|Решение| H[Платеж возврата]
H -->|Уменьшение| D
H -->|Уменьшение| F
%% Участие в программе
I[Участие в программе] -->|Членский взнос| J{Распределение}
%% Распределение членского взноса
J -- 1% --> K[Неделимый фонд]
J -- 15% --> L[Резервный фонд]
J -- 5% --> M[Фонд развития кооперации]
J -- 79% --> N[Остаточный фонд]
%% Списание из остаточного фонда
N -->|Списание| O{Фонды списания}
O -- Расходы --> P[Фонд хозяйственной деятельности]
O -- Помощь пайщикам --> Q[Фонд взаимопомощи]
```
Первые взносы, которые оплачивает пайщик одним [Регистрационным Платежом](/documentation/payments) - это вступительный и минимальный паевый взносы. Вступительные взнос фиксируется в фонде вступительных взносов кооператива, а минимальный паевый взнос - в паевом фонде.
В кошельке пайщике отображается сумма минимально-паевого взноса, которая будет возвращена при выходе пайщика из кооператива. При возврате минимального паевого взноса - паевой фонд будет уменьшен на эту сумму.
Следующий взнос, который может совершить пайщик - паевой, который будет зафиксирован в [Кошельке](documentation/wallet) пайщика и паевом фонде. Кошелёк позволяет пополнять себя платежами и использовать себя как "буфер" для взносов в целевые потребительские программы кооператива и дальнейших возвратов из них.
Платежи, которые поступают в Кошелёк на паевой счёт - безусловно возвратные. Пайщик может сформировать заявление на возврат и получить платежом возврата свой паевой взнос обратно на банковский счёт. При совершении платежа возврата паевой фонд будет уменьшен на сумму возврата.
Когда пайщик принимает решение участвовать в какой-либо [целевой потребительской программе](/documentation/programs) кооператива, то он принимает её условия. В её условиях описан принцип взымания членских взносов, или их отсутствие. Членские взносы взымаются по условиям программы и отправляются для распределения по невозвратным фондам.
Членский взнос пайщика распределяется среди всех фондов накопления в их процентном соотношении, которое всегда составляет 100% от суммы взноса. Обычно, при старте `MONO` в кооперативе 4 фонда накопления со следующим распределением:
- Неделимый фонд - 1%
- Резервный фонд - 15%
- Фонд развития кооперации - 5%
- Остаточный фонд - 79%
Кооператив может создавать дополнительные фонды накопления из числа средств остаточного фонда, всего до 12 штук. Редактировать наименования и процентные распределения между обязательными фондами кооператив не может. Все добавляемые кооперативом фонды накопления будут уменьшать остаточный фонд, но не будут влиять на процентное соотношение распределений неделимого, резервного фонда и фонда развития кооперации.
Остаточный фонд может использоваться кооперативом для списания по любому фонду списания. Среди них два обязательных фонда: `хозяйственной деятельности` и `взаимопомощи` и любое количество не обязательных, которые может добавить кооператив.
Использование средств любого фонда регулируется смарт-контрактами на основании требуемых для этого документов и процессов. Так, остаточный фонд списывается на расходы по служебным запискам и решениям совета, а неделимый, резервный и фонд развития кооперации могут использоваться только по решениям общего собрания пайщиков.
## Текущие API по фондам
В актуальной версии SDK/GraphQL отдельные методы `Funds.*` отсутствуют. Управление фондами реализуется через бизнес-процессы кошелька и платежей, см. разделы:
- [Платежи](/documentation/payments) — создание и обработка платежей.
- [Кошелёк](/documentation/wallet) — операции с кошельком пайщика/кооператива.
Отдельные SDK/GraphQL-методы для прямой работы с фондами появятся после их повторной публикации в схеме.
@@ -1,125 +0,0 @@
Всё взаимодействие между компонентами MONO осуществляется через [GraphQL-API](/graphql). Он предоставляет язык запросов и среду их выполнения, позволяя клиентам запрашивать только необходимые данные и минимизируя избыточную передачу информации. Кроме того, единая схема API объединяет в себе все сервисы, включая запросы, мутации и подписки на данные как самого приложения MONO, так и его [расширений](/documentation/extensions).
## Преимущества
Язык запросов GraphQL-API позволяет сократить количество отдельных методов на бэкенде MONO, которые обычно предназначены для получения или обновления информации о небольших аспектах одной рабочей сущности. В традиционном подходе количество методов API и сопутствующего кода постоянно растёт, но полезная нагрузка каждого вызова становится всё меньше. GraphQL решает эту проблему, предоставляя единую схему запросов, которая позволяет клиенту определять только те данные, которые ему действительно нужны.
Язык [GraphQL-API](/graphql) позволяет объединить все внутренние и внешние сервисы (включая сторонние) в единую конечную точку. Это упрощает интеграцию сервисов, даже если они написаны на разных языках программирования, и создаёт единую динамичную документацию, которая автоматически обновляется в реальном времени на основе схем объектов из программного кода.
С помощью языка [GraphQL-API](/graphql) мы можем накладывать требования прав доступа не только на вызов отдельных методов запросов, мутаций и подписок, но и на конкретные поля, доступные для каждого уровня прав. Например, один и тот же запрос может быть использован как пайщиком, так и председателем совета, при этом председатель получит доступ к большему числу полей.
Для сайтов и мобильных приложений, где критически важно обеспечить реактивность и быструю загрузку, GraphQL-API позволяет минимизировать объём передаваемой информации. Разработчики могут выбирать только те поля, которые необходимы для выполнения текущей бизнес-задачи, обеспечивая оптимальную производительность.
Для работы с запросами, мутациями и подписками достаточно одного SDK-клиента, который создаётся на основе схем GraphQL-API с использованием GraphQL-zeus. Такой подход обеспечивает доступ ко всем сервисам, подключённым к GraphQL-API, и предоставляет автогенерируемый клиент с высокой типизацией и связностью данных. Это упрощает интеграцию и сокращает количество ошибок при разработке.
Кроме того, GraphQL-API исключает необходимость внедрения дополнительных технологий для обмена данными в реальном времени. Подписки GraphQL позволяют серверу MONO отправлять обновления клиенту с использованием встроенных возможностей, таких как WebSocket, без дополнительных решений.
Таким образом, GraphQL-API объединяет в себе обработку запросов, мутаций и подписок, заменяя собой отдельные инструменты и технологии, что делает его универсальным решением для разработки и интеграции.
## Как с этим работать
GraphQL — это язык запросов и среда выполнения, позволяющие клиентам получать только те данные, которые нужны, и тем самым снижать лишнюю передачу информации. В `MONO` все операции — чтение (queries), запись (mutations) и подписки (subscriptions) — описаны в единой схеме, доступной через GraphQL-API. Эта схема объединяет сервисы самого `MONO` и всех его расширений.
В GraphQL все входные и выходные данные описаны типами в схемах. Если у поля или аргумента есть ! (например, String!), значит это поле обязательное и не может быть null. Если в схеме просто String, значит поле необязательное. Благодаря такому типизированному описанию вы чётко знаете, какие данные ожидаются на вход и какие поля можно запросить на выходе.
### Playground
Для удобства тестирования рекомендуется применять `playground`, например, [Altair](https://altairgraphql.dev/#download).
Playground - это визуальный инструмент, где вы пишете и тестируете запросы, мутации, подписки. Справа находится вкладка Docs. В ней перечислены все доступные типы, поля и операции, а также их описания и требования к ролям для выполнения.
Также, вся документация ко всем запросам, мутациям и подпискам доступна по ссылке: [GraphQL-API](/graphql).
## Запросы
Например, мы хотим извлечь информацию об аккаунте с помощью запроса getAccount. Ссылка на схему в документации {{get_graphql_doc("query.getAccount")}}
Запрос getAccount, согласно схеме, возвращает объект Account, в котором есть следующие поля:
```
username: String! — имя аккаунта кооператива
blockchain_account: BlockchainAccount — системный аккаунт в блокчейне
participant_account: ParticipantAccount — пайщик кооператива
provider_account: MonoAccount — учётная запись провайдера
user_account: UserAccount — пользовательский аккаунт кооперативной экономики
```
Чтобы получить эти данные, в Playground можно написать:
```graphql
query getAccountExample($username: String!) {
getAccount(data: { username: $username }) {
username
blockchain_account {
account_name
# Укажите прочие нужные поля схемы
}
provider_account {
username
# Укажите прочие нужные поля схемы
}
participant_account {
username
# Укажите прочие нужные поля схемы
}
user_account {
username
# Укажите прочие нужные поля схемы
}
}
}
```
Во вкладке Query Variables в `Playground` задайте:
```
{
"username": "имя_аккаунта"
}
```
Все методы, которым требуется авторизацию ролью помечены в GraphQL-API соответствующей подписью, например: `требуемые роли: 'chairman'`, что означает - только председатель может выполить вызов.
После отправки запроса, в ответе вы получите только те поля, которые запросили. Если появится ошибка о недостатке прав, убедитесь, что ваш пользователь имеет требуемую роль (например, chairman, member и т.п.).
## Мутации
Для изменения или добавления данных GraphQL использует мутации. Например, мутация createDeposit создаёт объект платёжа паевого взноса. Ссылка на схему в документации {{get_graphql_doc("mutation.createDeposit")}}
Пример:
```graphql
mutation createDepositExample($username: String!, $quantity: String!) {
createDeposit(data: {
username: $username
quantity: $quantity
}) {
id
amount
status
data
# любые другие поля Payment
}
}
```
И передаём переменные через Variables в `Playground`:
```
{
"username": "voskhod",
"quantity": "100.00 RUB"
}
```
Результат вернёт новый объект Payment, поля которого мы выбрали (id, amount, status, data)
## Подписки
Подписка на изменение тех или иных параметров системы осуществляется аналогично запросам и мутациям. Они позволяют получать обновления в реальном времени, например, когда статус платежа меняется. Структура подписки схожа с запросом, только начинается словом subscription.
@@ -1,35 +0,0 @@
__`MONO`__ - это программное обеспечение для управления взаимоотношениями с пайщиками.
`MONO` запускается в выделенных копиях и ведёт реестры пайщиков, взносов и документов. Все данные кооперативов в MONO - выделены в отдельные базы, что позволяет легко переносить их между облаками и собственными серверами, в случае возникновения такой необходимости.
```mermaid
flowchart TD
U[Пайщик / Пользователь] --> UI[Рабочие столы]
UI --> API_M[API]
API_M --> DB[Приватная БД кооператива]
API_M --> BC[Распределенная БД COOPOS]
BC --> SmartContracts[Смарт-контракты]
SmartContracts --> Axon[Токен AXON]
O[Оператор ПК 'ВОСХОД'] -.Членство.-> BC
Axon -.Контроль оборота.-> O
```
Вся основная бизнес-логика, отвечающая за процессы кооперации, хранится в блокчейне ["Кооперативной Экономики"](https://coopenomics.world), который называется COOPOS - операционная система для кооперации. В COOPOS исполняются кооперативные смарт-контракты, реализующие сценарии кооперации согласно методологии [союза потребительских обществ "РУСЬ"](https://союз-русь.рф).
Чтобы иметь возможность подключить `MONO` или другой экземпляр программного продукта к платформе ["Кооперативной Экономики"](https://coopenomics.world) к блокчейну COOPOS, кооперативу необходимо стать пайщиком операта платформы ("ПК ВОСХОД") и заключить с ним соглашение о подключении к Платформе.
Однако, поскольку блокчейн и смарт-контракты платформы ["Кооперативной Экономики"](https://coopenomics.world) распространяются по открытой лицензии и исходный код опубликован на ["Github"](https://https://github.com/coopenomics), то любой кооператив имеет техническую возможность запустить альтернативную платформу COOPOS и быть оператором на ней - в этом наша децентрализация.
!!! note "Подключение без оператора"
Подключение к платформе без членства в кооперативе-операторе невозможно по той причине, что в рамках цифровой среды блокчейна ["Кооперативной Экономики"](https://coopenomics.world) используются утилити-токен AXON для учёта количества хранимой, обрабатываемой и передаваемой информации в каждом конкретном кооперативе, и оборот этих токенов легально допустим только в рамках ограниченного круга лиц кооперативного контура.
`MONO` предоставляет API и пользовательские интерфейсы (рабочие столы), которые осуществляют подключение конечного пользователя к платформе ["Кооперативной Экономики"](https://coopenomics.world). При нажатии на кнопи интерфейса, сигнал поступает на бэкенд `MONO` по `API`, где в зависимисти от команды, производится проверка контроля прав доступа, и затем вызывается API платформы ["Кооперативной Экономики"](https://coopenomics.world), если это необходимо. Также, если необходимо, производится модификация приватной базы данных кооператива - сохранение документов, информации о пайщиках, платежах, и т.д. и т.п.
Таким образом, `MONO` является клиентом для подключения к блокчейн-платформе ["Кооперативной Экономики"](https://coopenomics.world), обеспечивая реализацию кнопок в интерфейсе и набор API, чтобы все эти кнопки работали на создание кооперативной выгоды для пайщиков, а совет кооператива - обладал всей полнотой необходимой информацией для принятия решений и дальнейшей отчетности по операциям перед контролирующими органами.
-335
View File
@@ -1,335 +0,0 @@
Добро пожаловать в раздел технической документации платформы MONO. Платформа MONO предназначена автоматизировать взаимоотношения между пайщиками и кооперативом в ["Кооперативной Экономике"](https://coopenomics.world), и предоставляет систему управления взаимоотношениями с пайщиками (SRM - Shareholder Relation Management).
Платформа MONO подключается к ["Кооперативной Экономике"](https://coopenomics.world), и предоставляет средства для автоматизированного сбора первичных документов, управления принятием решений членам совета кооператива, для генерации и цифровой подписи электронных документов, для просмотра и управления реестром пайщиков, платежей и всех произведенных документов кооператива.
Кроме того, MONO позволяет расширять базовый функционал взаимоотношений с пайщиками с помощью расширений витринами или утилитами, где каждая витрина - это доступ пайщиков к целевой потребительской программе, принятой в кооперативе, а утилита - это средство автоматизации для руководства кооператива.
<!--
## Как пользоваться документацией
Документация
позволяя расширять базовый функционал цифровыми целевыми потребительскими программами чер.
{{ get_sdk_doc("Mutations", "Accounts", "UpdateAccount") }}
{{ get_graphql_doc("Mutation.updateAccount") }}
## Назначение
Система предназначена автоматизировать документооборот в потребительских кооперативах посредством [кооперативных смарт-контрактов](/#-) и технологии блокчейн, реализующих принципы [методологии](/metodology) потребительской кооперации ["СПО РУСЬ"](https://союз-русь.рф/). -->
<!-- Запуская программный комплекс Цифрового Кошелька и подключаясь к Кооперативной Экономике, вы поддерживаете создание справедливого мира единого сознания без ссудного процента и циклических кризисов перепроизводства долга. [Подробнее](/). -->
<!-- ## Компоненты
Ниже представлены ссылки на низкоуровневую техническую документацию. Данный раздел, как и сам продукт Цифрового Кошелька, находится в разработке, поэтому, финализация документации в этом разделе пока преждевременна. -->
<!-- [Смарт-контракты](#){ .md-button .md-button--primary } [Блокчейн](#){ .md-button .md-button--primary } [API](#){ .md-button .md-button--primary } [Библиотека типов](#){ .md-button .md-button--primary } [Генератор документов](#){ .md-button .md-button--primary } -->
<!--
<div class="grid cards" markdown>
- __Операционная система__
---
Документация к операционной системе coopOS, которая основана на блокчейне EOSIO & ANTELOPE.
[:octicons-arrow-right-24: Подробнее](https://developers.eos.io)
[:octicons-arrow-right-24: Репозиторий](https://github.com/coopenomics/blockchain)
- __Смарт-контракты__
---
Документация к кооперативным смарт-контрактам, реализующие протоколы целевых потребительских программ.
[:octicons-arrow-right-24: Подробнее](https://coopenomics.world/contracts)
[:octicons-arrow-right-24: Репозиторий](https://github.com/coopenomics/contracts)
- __Библиотека типов__
---
Библиотека типов предоставит информацию о интерфейсах действий и таблиц смарт-контрактов.
[:octicons-arrow-right-24: Подробнее](https://coopenomics.world/cooptypes)
[:octicons-arrow-right-24: Репозиторий](https://github.com/coopenomics/cooptypes)
- __Контроллер кооператива__
---
Основной бэкенд-сервис, представляющий систему авторизации для доступа к документам кооператива и инструментам управления им.
[:octicons-arrow-right-24: Подробнее](/graphql)
</div> -->
<!--
## Архитектура доступа
Архитектура доступа к Цифровому Кооперативу принципиально состоит из двух слоёв:
- Публичный слой хранит кооперативные смарт-контракты, аккаунты пользователей и свод программных правил бизнес-логики системы, написанные на языке C/C++. Бизнес логика смарт-контрактов едина для всех кооперативов системы и поставляется вместе с нодой блокчейна в процессе её синхронизации. Блокчейн не хранит никакую чувствительную личную информацию пользователей или кооперативов, а только лишь обезличенные и стандартизированные правила участия в кооперативной экономике. Авторизация производится посредством проверки прав доступа на основе цифровой подписи идентификатора аккаунта пользователя.
- Приватный слой хранит личную информацию пользователей конкретных кооператива. Все кооперативы запускаются на выделенных серверах, где каждый кооператив контролирует свои данные самостоятельно, и никто кроме него не имеет доступа к его данным, если это не предусмотрено. В этом слое хранится реестр пайщиков, их заявлений и решений совета. Никто кроме совета не имеет доступа к этому хранилищу. Авторизация производится посредством проверки прав доступа на основе JWT-токена, извлекаемого из приватного ключа пользователя.
Таким образом, для каждого пользователя в системе есть как минимум две точки авторизации и две базы данных.
## Подготовка
Для того, чтобы начать работу с системой, вам потребуется подготовить соответствующее программное окружение.
### Блокчейн
Запуск блокчейна осуществляется посредством сборки из исходного кода репозитория или запуском контейнера. Запуск блокчейна может осуществляться в нескольких режимах для разных целей:
- режим локального тестнета. Здесь запускается "чистый" блокчейн, в котором могут быть развернуты смарт-контракты для тестов. Эта сборка необходима разработчикам смарт-контрактов и делегатам, которые тестируют их перед обновлением согласно [протоколу](/protocols).
- режим рабочей сети. Здесь запускается блокчейн для синхронизации с основной сетью. Режим используется делегатами для того, чтобы принимать участие в производстве блоков, а также, API-нодами, которые могут являться доверенными источниками данных для кооперативов.
- режим тестовой сети. Режим аналогичен рабочей сети, только в любой момент сеть может быть перезагружена. Используется разработчикам для тестов в обход необходимости полной установки всех смарт-контрактов и их инициализации согласно протоколу.
Мы здесь и далее будем рассматривать режим запуска локального тестнета в окружении операционной системы UBUNTU 22.04. Если вам требуется синхронизировать блокчейн с рабочей сетью или тестнетом, пожалуйста, обратитесь к [протоколу синхронизации](/protocol/sync) за дополнительными инструкциями.
__Запуск из контейнера__
Для запуска блокчейна из контейнера вам потребуется установленный [docker](https://docker.io). После установки для своей операционной системы, предварительно создаём папку для блокчейна, его конфига и данных:
```
mkdir $HOME/blockchain
mkdir $HOME/blockchain/config
mkdir $HOME/blockchain/eosio-wallet
```
Создаём файл конфига
```
touch $HOME/blockchain/config/config.ini
```
И помещаем в него конфигурацию:
```
# подключаем плагины
plugin = eosio::chain_plugin
plugin = eosio::producer_plugin
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin
plugin = eosio::producer_api_plugin
plugin = eosio::state_history_plugin
# устанавливаем системного производителя блоков и его ключи
producer-name = eosio
# это стардартные ключи для локального тестнета
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
# включаем режим производства блоков
enable-stale-production = true
# устанавливаем предельное время исполнения транзакции в микросекундах
max-transaction-time = 300000
abi-serializer-max-time-ms = 30000
http-max-response-time-ms = 30000
# открываем порт для подключения командного кошелька
http-server-address = 0.0.0.0:8888
# подключаем вывод консоли контрактов в лог ноды
contracts-console = true
# подключаем трассировку истории состояния
trace-history = true
state-history-endpoint = 0.0.0.0:8080
```
После чего, производим запуск контейнера:
```
docker run --name node -d -p 8888:8888 -p 8080:8080 \-v $HOME/blockchain/data:/mnt/dev/data \-v $HOME/blockchain/config:/mnt/dev/config \-v $HOME/blockchain/eosio-wallet:/root/eosio-wallet \dicoop/leap_v4.0.5 \/bin/bash -c '/usr/local/bin/nodeos -d /mnt/dev/data --config-dir /mnt/dev/config --disable-replay-opts'
```
В результате запуска, в логах контейнера вы увидите процесс производства блоков:
![screen_blocks2.jpg](assets/screen_blocks2.jpg)
__Сборка из исходников__
Инструкция сборки из исходного кода описана в [репозитории](https://github.com/copenomics/blockchain).
### Смарт-контракты
Для того, чтобы компилировать смарт-контракты, вам потребуется пакет [Contract Develpment Tools](https://github.com/copenomics/cdt). Его также можно установить из контейнера или собрать из исходников.
__Запуск из контейнера__
Для запуска из контейнера создайте папку, в которой будут находится смарт-контракты:
```
mkdir $HOME/contracts
```
Выполните команду для запуска контейнера:
```
docker run -it --name cdt \
--volume $HOME/contracts:/project \
-w /project \
dicoop/cdt_v4.1.0 /bin/bash
```
Теперь вы находитесь в контейнере и директории с вашими контрактами, которые можете компилировать. Подробнее о работе с контрактами и командным кошельком смотри соответствующий раздел.
__Сборка из исходников__
Процесс сборки CDT из исходного кода описан в [репозитории](https://github.com/copenomics/cdt).
### Бэкенд
Для программной работы с любым кооперативом вам потребуется бэкенд-контроллер. Контроллер - это проприетарный программный комплекс, который распространяется по лицензии CC BY-NC-SA 4.0 для кооперативов, подключенных к системе.
Если вы разрабатываете программное обеспечение для уже подключенного к системе кооператива, то запросите доступ к репозиторию контроллера у председателя или воспользуйтесь публичным контроллером тестового кооператива, который доступен для разработчиков по ссылке: https://docs.copenomics.world/controller.
### Фронтенд
Для разработки фронтенда, вы можете использовать любой javascript-подобный фреймворк и подключить его с помощью прилагающихся библиотек к контроллеру и блокчейну.
Мы поставляем проприетарное программное обеспечение мультиплатформенного терминала доступа на основе фреймворка QUASAR по лицензии CC BY-NC-SA 4.0 для кооперативов, подключенных к системе.
Запросите доступ к репозиторию терминала у председателя действующего кооператива или воспользуйтесь начальным скелетоном для начала новой разработки по ссылке: https://github.com/copenomics/terminal-skeleton.
### Кошелёк
Если Ваш кооператив уже подключен к системе, то у вас есть идентификатор кооператива и приватный ключ доступа, с помощью которого, мы уже можете начать строительство своего кооперативного приложения. Для этого, как минимум, вам необходимо инициализировать кошелёк с приватным ключом для подписи действий смарт-контрактов.
Мы рекомендуем использовать ![SDK Wharfkit](https://wharfkit.com).
Инструкция подготовки:
```
import { Session } from "@wharfkit/session"
import { WalletPluginPrivateKey } from "@wharfkit/wallet-plugin-privatekey"
const args = {
chain: {
id: "73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d",
url: "https://testnet.copenomics.world",
},
actor: "tester111111",
permission: "active",
walletPlugin: new WalletPluginPrivateKey(
"5Jtoxgny5tT7NiNFp1MLogviuPJ9NniWjnU4wKzaX4t7pL4kJ8s"
),
}
const options = {
// Additional options
}
const session = new Session(args, options)
```
Теперь вы можете применять сформированную сессию для отправки транзакций в любые смарт-контракты системы. Для чтения же информации из таблиц блокчейна вам потребуется ApiClient:
```
import { APIClient } from "@wharfkit/antelope"
const client = new APIClient({
url: "https://testnet.copenomics.world",
})
```
Теперь вы можете получать информацию о состоянии блокчейна и его таблиц:
```
client.v1.chain.get_info().then((response) => {
console.log(response)
})
```
Все доступные действия в смарт-контрактах и таблицах ЦК можно найти в пакете документации ![cooptypes](/cooptypes). Подробнее о том, как совершать транзакции и получать информацию из таблиц, смотри в документации ![wharfkit](https://wharfkit.com)
## Методы действий
Теперь, когда подготовка завершена, мы можем перейти к основной части - методам управления цифровым кооперативом. Начнём с самого начала. У Вас есть потребительский кооператив, который подключился к системе ![на сайте](/connect).
### Совет
При подключении цифрового кооператива председателю и членам совета были выданы ключи и права доступа, с помощью которых они могут управлять кооперативом. Рассмотрим основные процессы управления.
## Вход
Для того, чтобы иметь возможность совершать действия управления, членам совета, да и просто пайщикам, необходимо войти в бэкенд кооператива. Фронтенд обеспечивает вход автоматически, но поскольку эта документация для разработчиков и инженеров, то давайте детально рассмотрим процесс.
При регистрации пайщику / члену совета / председателю был выдан идентификатор аккаунта и ключ доступа. Они, как пара, используются для входа в систему кооператива.
## Получить повестку
## Администраторы
## Регистрация аккаунта
## Приём пайщика
## Получение таблиц
## Получение документов
## Получение истории
## Получение пользователей
## Получение повестки
## Голосование по вопросам
## Протокол собрания
## Общее собрание
## Создание кооперативного участка
## Управление
## Стать делегатом
-->
<!-- - Регистрация пайщика
- Создать документ
- Восстановить документ
- Получить каталог документов
-
-->
<!--
Данная документация предоставляет техническое описание экосистемы Цифрового Кооператива. Экосистема базируется на технологиях блокчейна и смарт-контрактов, создавая стандартизированное окружение для ведения онлайн деятельности в соответствии с законодательством.
Цифровой Кооператив соединяет принципы кооперативного движения с возможностями блокчейн технологий. Стандартизированные смарт-контракты обеспечивают автоматизацию и прозрачность процессов, соответствуя нормам законодательства.
Подробнее о ЦЭ тут потом.
**Ключевые характеристики:**
- Прозрачность: Все операции внутри кооператива являются открытыми для проверки участниками.
- Стандартизация: Экосистема предоставляет унифицированные инструменты для работы, адаптируемые под различные нужды.
- Соответствие законам: Смарт-контракты разработаны с учетом требований законодательства.
- Открытый код: Экосистема включает в себя репозитории, обозреватели документов и маркетплейсы, делая цифровые решения доступными всем участникам.
- Цифровые подписи: Все операции подтверждаются и защищаются с помощью цифровых подписей, гарантируя их подлинность и безопасность.
... дополнить и развернуть
## Подключить кооператив
Вы можете подключить свой кооператив к платформе цифровой экономики. Для подключения, вам необходимо заполнить заявление на вступление у одного из верифицированных кооперативов на платформе:
!!! note "Список верифицированных регистраторов"
Подключение к цифровой экономике осуществляется с помощью веб-клиента (сайта, мобильного или десктопного приложения), которые поставляются кооперативами для кооперативов. Некоторые клиенты можно получить в маркетплейсе сразу после регистрации юридического лица на платформе:
[Открыть маркетплейс](#){ .md-button .md-button--primary }
-->
-209
View File
@@ -1,209 +0,0 @@
После установки программного обеспечения `MONO` его необходимо инициализировать, предоставим информацию о кооперативе, который будет обслуживаться системой. Для инициализации потребуется приватный ключ доступа, который выдаётся оператором платформы [Кооперативной Экономики](https://coopenomics.world). Для получения ключа перейдите в раздел [Подключение](/connect) и действуйте по инструкциям.
!!!note "В целях тестирования"
В целях тестирования вы можете воспользоваться тестовым (общедоступным) кооперативом по адресу https://testnet.coopenomics.world, воспользовавшись электронной почтой: `chairman.voskhod@gmail.com` и ключом `5Hs46kBWGMKnsqntqLCinp6QSCuuWkc39DLMzaNaUjv3TFLif2U` для входа. Также, эти данные могут использоваться для подключения SDK к GraphQL-API по адресу `https://testnet.coopenomics.world/backend/v1/graphql`
## Инициализация
Для начала работы вашему приложению `MONO` необходимо сообщить информацию о том кооперативе, для которого он будет работать. Для этого используйте мутацию `initSystem`:
{{ get_sdk_doc("Mutations", "System", "InitSystem") }} | {{ get_graphql_doc("mutation.initSystem") }}
Пример вызова:
```typescript
import { Mutations, OrganizationType } from "@coopenomics/sdk";
const variables: Mutations.System.InitSystem.IInput = {
data: {
organization_data: {
bank_account: {
account_number: "40703810338000220228",
bank_name: "АО Альфа-Банк",
currency: "RUB",
details: {
bik: "044525593",
corr: "30101810200000000593",
kpp: "770801001"
}
},
city: "Санкт-Петербург",
country: "Russia",
details: {
inn: "7826012345",
kpp: "782601001",
ogrn: "1234567890123"
},
fact_address: "190000, г. Санкт-Петербург, ул. Ленина, д. 5, офис 12",
full_address: "190000, г. Санкт-Петербург, ул. Ленина, д. 5, офис 12",
full_name: 'Потребительский Кооператив "Ромашка"',
phone: "+78121234567",
represented_by: {
based_on: "Решение общего собрания №2",
first_name: "Иван",
last_name: "Петров",
middle_name: "Сергеевич",
position: "Председатель"
},
short_name: "ПК Ромашка",
type: OrganizationType.COOP
},
vars: {
confidential_email: "privacy@romashka-coop.ru",
confidential_link: "romashka-coop.ru/privacy",
contact_email: "contact@romashka-coop.ru",
coopname: "romashka",
full_abbr: "потребительский кооператив",
full_abbr_dative: "потребительскому кооперативу",
full_abbr_genitive: "потребительского кооператива",
name: "Ромашка",
participant_application: {
protocol_day_month_year: "15 мая 2024 г.",
protocol_number: "15-05-2024"
},
passport_request: "yes",
privacy_agreement: {
protocol_day_month_year: "15 мая 2024 г.",
protocol_number: "15-05-2024"
},
short_abbr: "ПК",
signature_agreement: {
protocol_day_month_year: "15 мая 2024 г.",
protocol_number: "15-05-2024"
},
user_agreement: {
protocol_day_month_year: "15 мая 2024 г.",
protocol_number: "15-05-2024"
},
wallet_agreement: {
protocol_day_month_year: "15 мая 2024 г.",
protocol_number: "15-05-2024"
},
website: "ромашка-кооп.рф"
}
}
};
// вызываем метод SDK для инициализации и передаём объект с переменными
const { [Mutations.System.InitSystem.name]: result } = await client.Mutation(
Mutations.System.InitSystem.mutation, { variables }
);
```
В результате успешного выполнения мутации, в хранилище приватных данных кооператива будет добавлена запись об организации, пайщиками которой будут становиться пользователи.
## Установка ключа
Бэкенд приложения `MONO` хранит приватный ключ кооператива, которым он подписывает транзакции в блокчейне. Ключ хранится в зашифрованном виде в базе данных, извлекается оттуда и расшифровывается для использования только когда это необходимо. Работа системы без приватного ключа невозможна. Чтобы предоставить ключ бэкенду MONO, необходимо выполнить мутацию `setWif`:
{{ get_sdk_doc("Mutations", "System", "SetWif") }} | {{ get_graphql_doc("Mutation.setWif") }}
```typescript
import { Mutations } from "@coopenomics/sdk";
const variables: Mutations.System.InstallSystem.IInput = {
data: {
permission: "active",
username: "имя_аккаунта_кооператива",
wif: "приватный_ключ"
}
}
```
Ключ будет зашифрован и сохранён в базе данных кооператива для дальнейшего использования системой по мере необходимости.
## Установка совета
После успешного выполнения инициализации необходимо установить членов совета с указанием их приватных данных. Для этого используем метод installSystem:
{{ get_sdk_doc("Mutations", "System", "InstallSystem") }} | {{ get_graphql_doc("Mutation.installSystem") }}
```typescript
import { Mutations } from "@coopenomics/sdk";
// Формируем объект для добавления в систему chairman (председатель) и member (член совета)
const variables: Mutations.System.InstallSystem.IInput = {
data: {
soviet: [
{
individual_data: {
birthdate: "1980-05-15",
first_name: "Иван",
last_name: "Петров",
middle_name: "Алексеевич",
full_address: "Москва, ул. Тверская, д. 10, кв. 5",
phone: "+79161234567",
email: 'ivan-petrov@romashka.com'
},
role: "chairman"
},
{
individual_data: {
birthdate: "1992-09-23",
first_name: "Алексей",
last_name: "Смирнов",
middle_name: "Владимирович",
full_address: "Санкт-Петербург, пр. Невский, д. 45, кв. 12",
phone: "+79217654321"
email: "aleksei-smirnov@yandex.ru"
},
role: "member"
}
//... продолжить столько раз, сколько членов в совете кооператива
]
}
}
const { [Mutations.System.InstallSystem.name]: result } = await client.Mutation(
Mutations.System.InstallSystem.mutation,
{
variables,
}
);
```
!!!warning "Важно!"
Один из членов совета обязательно должен обладать ролью 'chairman' (председатель).
Всем указанным физическим лицам будут зарегистрированы имена аккаунтов в блокчейне, а MONO сохранит данные физических лиц в своей базе и отправит приглашения для членов совета на указанные электронные почтовые адреса.
!!! note ""
При регистрации аккаунтов в блокчейне с аккаунта кооператива списываются AXON. Поэтому, убедитесь, что у вас есть AXON в достаточном количестве. Стоимость регистрации одного аккаунта ~1 AXON, или ~10 рублей. Токены `AXON` выдаются оператором системы при подключении и оплате членского взноса.
## Выпуск ключей
После того, как все члены совета будут добавлены методом installSystem, каждый из них получит оповещение на электронную почту с приглашением получить приватный ключ доступа к системе своего кооператива. Срок действия ссылки для выпуска ключа - 24 часа.
Если по истечению 24 часов ссылка не будет использована, то члену совета для входа будет необходимо воспользоваться методом сброса приватного ключа к его аккаунту. Для этого в терминале ему необходимо нажать кнопку "потяряли ключ?" и следовать инструкциям (см. подробнее [здесь](/participants/restore).
Выпуск ключа осуществляется на стороне пользователя в браузерне, и для этого ему необходимо перейти по ссылке, которую он получит. После чего, отправить его публичную часть в MONO для установки в блокчейне методом resetKey.
{{ get_sdk_doc("Mutations", "System", "InstallSystem") }} | {{ get_graphql_doc("Mutation.installSystem") }}
```typescript
import { Mutations } from "@coopenomics/sdk";
const variables: Mutations.Auth.ResetKey.IInput = {
data: {
public_key: "EOS....публичный_ключ",
token: "токен,_полученный_на_email"
}
}
const { [Mutations.Auth.ResetKey.name]: result } = await client.Mutation(
Mutations.Auth.ResetKey.mutation,
{
variables,
}
);
```
После выпуска ключа и установки его в блокчейне методом ResetKey, пайщик может воспользоваться входом.
@@ -1,113 +0,0 @@
# Установка
## Быстрый старт
Самый быстрый и удобный способ установки блокчейна - воспользоваться подготовленным скриптом, который запустит докер-контейнер и произведет его конфигурацию для начала работы.
Для запуска вам потребуется установленный и запущенный Docker. Воспользуйтесь инструкцией по установке с официального сайта для вашей операционной системы: https://www.docker.com/products/docker-desktop/
После установки Docker, клонируем моно-репозиторий системных контрактов и установщика блокчейна:
``` { .bash .copy .annotate }
git clone https://github.com/coopenomics/mono
```
Переходим в репозиторий установщика:
``` { .bash .copy .annotate}
cd mono
```
Запускаем установку:
``` { .bash .copy .annotate}
pnpm install
```
Также перед продолжением необходимо установить фабрику документов `weasyprint` для вашей операционной системы: https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#installation
## Для фронтенд-разработки
Не требует запущенного блокчейна и его бэкенда локально. Подключение осуществляется к блокчейну осуществляется через `testnet-api.coopenomics.world` и бэкенду кооператива через `testnet.coopenomics.world/backend/api`.
Для запуска необходимо произвести конфигурацию, выбрав режим фронтенд-разработчика.
``` { .bash .copy .annotate}
pnpm run setup
```
После конфигурации осуществляем запуск фронтенда:
``` { .bash .copy .annotate}
pnpm run dev:desktop
```
Фронтенд запустится на 3005 порту и подключится к тестовому кооперативу. Для входа можно использовать следующие данные:
!!! warn ""
__Почта__: chairman.voskhod@gmail.com
__Ключ__: 5Hs46kBWGMKnsqntqLCinp6QSCuuWkc39DLMzaNaUjv3TFLif2U
## Для фуллстек-разработки
Нам потребуется инфраструктура - базы данных mongo, postgres, а также локально установленный и запущенный в производство блоков контейнер блокчейна. Все они поднимаются одной командой:
``` { .bash .copy .annotate}
docker compose up -d
```
После запуска инфраструктуры необходимо произвести конфигурацию для фуллстек разработчика:
``` { .bash .copy .annotate}
pnpm run setup
```
Команда произведет сборку всех компонент и смарт-контрактов.
Теперь, нам необходимо запустить установку смарт-контрактов в блокчейн и конфигурацию локального окружения:
``` { .bash .copy .annotate}
pnpm run boot
```
Команда boot запускает последовательный процесс полной установки всех смарт-контрактов и необходимых записей в базы данных для полностью локальной работы с системой.
Запуск фронтенда:
``` { .bash .copy .annotate}
pnpm run dev:desktop
```
Фронтенд будет запущен на 3005 порту.
Запуск бэкенда:
``` { .bash .copy .annotate}
pnpm run dev:backend
```
После запуска воспользуйтесь данными для входа на localhost:3005:
!!! warn ""
__Почта__: ivanov@example.com
__Ключ__: 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
Блокчейн открывает API на 8888 порту запросов и транзакций, 8080 для ws-соединений, 9876 для p2p-синронизации между нодами.
Бэкенд открывает API на 2998 порту и предоставляет GraphQL-API на localhost:2998/v1/graphql, а также на 4000 порту для извлечения исторических данных блокчейна.
### Рабочий цикл
В случае, если в процессе установки возникли сбои, или требуется в рамках производственного процесса полностью перезапустить систему с нуля, то необходимо остановить, очистить данные и вновь запустить контейнер блокчейна командой:
``` { .bash .copy .annotate}
pnpm run clear
```
После чего вновь произвести загрузку смарт-контрактов:
``` { .bash .copy .annotate}
pnpm run boot
```
!!! danger "ВАЖНО!"
В момент перезапуска все бэкенд-сервисы должен быть полностью отключены.
## Для использования
При запуске для продакшн-использования запуск осуществляется аналогично режимам для разработчиков, но с заменой тестовых-общедоступных переменных окружения всех компонент - на реальные.
@@ -1,153 +0,0 @@
# Общие собрания
Общие собрания пайщиков являются высшим органом управления кооперативом. Система MONO обеспечивает полный цифровой документооборот для проведения общих собраний, включая уведомления, голосование и оформление решений.
## Получить информацию о собрании
{{ get_sdk_doc("Queries", "Meet", "GetMeet") }} | {{ get_graphql_doc("Query.getMeet") }}
{{ get_typedoc_input("Queries.Meet.GetMeet") }}
Результат:
{{ get_typedoc_definition("Queries.Meet.GetMeet", "IOutput") }}
## Получить список собраний
{{ get_sdk_doc("Queries", "Meet", "GetMeets") }} | {{ get_graphql_doc("Query.getMeets") }}
{{ get_typedoc_input("Queries.Meet.GetMeets") }}
Результат:
{{ get_typedoc_definition("Queries.Meet.GetMeets", "IOutput") }}
## Создание общего собрания
{{ get_sdk_doc("Mutations", "Meet", "CreateAnnualGeneralMeet") }} | {{ get_graphql_doc("Mutation.createAnnualGeneralMeet") }}
{{ get_typedoc_input("Mutations.Meet.CreateAnnualGeneralMeet") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.CreateAnnualGeneralMeet", "IOutput") }}
Создание предложения повестки очередного общего собрания пайщиков.
## Уведомление о собрании
{{ get_sdk_doc("Mutations", "Meet", "NotifyOnAnnualGeneralMeet") }} | {{ get_graphql_doc("Mutation.notifyOnAnnualGeneralMeet") }}
{{ get_typedoc_input("Mutations.Meet.NotifyOnAnnualGeneralMeet") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.NotifyOnAnnualGeneralMeet", "IOutput") }}
Отправка уведомлений всем пайщикам о проведении общего собрания.
## Голосование на собрании
{{ get_sdk_doc("Mutations", "Meet", "VoteOnAnnualGeneralMeet") }} | {{ get_graphql_doc("Mutation.voteOnAnnualGeneralMeet") }}
{{ get_typedoc_input("Mutations.Meet.VoteOnAnnualGeneralMeet") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.VoteOnAnnualGeneralMeet", "IOutput") }}
Голосование пайщика по вопросам повестки общего собрания.
## Подписание секретарем
{{ get_sdk_doc("Mutations", "Meet", "SignBySecretaryOnAnnualGeneralMeet") }} | {{ get_graphql_doc("Mutation.signBySecretaryOnAnnualGeneralMeet") }}
{{ get_typedoc_input("Mutations.Meet.SignBySecretaryOnAnnualGeneralMeet") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.SignBySecretaryOnAnnualGeneralMeet", "IOutput") }}
Подписание решения секретарём на общем собрании пайщиков.
## Подписание председателем
{{ get_sdk_doc("Mutations", "Meet", "SignByPresiderOnAnnualGeneralMeet") }} | {{ get_graphql_doc("Mutation.signByPresiderOnAnnualGeneralMeet") }}
{{ get_typedoc_input("Mutations.Meet.SignByPresiderOnAnnualGeneralMeet") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.SignByPresiderOnAnnualGeneralMeet", "IOutput") }}
Подписание решения председателем на общем собрании пайщиков.
## Перезапуск собрания
{{ get_sdk_doc("Mutations", "Meet", "RestartAnnualGeneralMeet") }} | {{ get_graphql_doc("Mutation.restartAnnualGeneralMeet") }}
{{ get_typedoc_input("Mutations.Meet.RestartAnnualGeneralMeet") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.RestartAnnualGeneralMeet", "IOutput") }}
Перезапуск общего собрания пайщиков при необходимости.
## Генерация документов
### Повестка собрания
{{ get_sdk_doc("Mutations", "Meet", "GenerateAnnualGeneralMeetAgendaDocument") }} | {{ get_graphql_doc("Mutation.generateAnnualGeneralMeetAgendaDocument") }}
{{ get_typedoc_input("Mutations.Meet.GenerateAnnualGeneralMeetAgendaDocument") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.GenerateAnnualGeneralMeetAgendaDocument", "IOutput") }}
Генерация документа предложения повестки общего собрания пайщиков.
### Уведомление о собрании
{{ get_sdk_doc("Mutations", "Meet", "GenerateAnnualGeneralMeetNotificationDocument") }} | {{ get_graphql_doc("Mutation.generateAnnualGeneralMeetNotificationDocument") }}
{{ get_typedoc_input("Mutations.Meet.GenerateAnnualGeneralMeetNotificationDocument") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.GenerateAnnualGeneralMeetNotificationDocument", "IOutput") }}
Генерация документа уведомления о проведении общего собрания.
### Бюллетень для голосования
{{ get_sdk_doc("Mutations", "Meet", "GenerateBallotForAnnualGeneralMeetDocument") }} | {{ get_graphql_doc("Mutation.generateBallotForAnnualGeneralMeetDocument") }}
{{ get_typedoc_input("Mutations.Meet.GenerateBallotForAnnualGeneralMeetDocument") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.GenerateBallotForAnnualGeneralMeetDocument", "IOutput") }}
Генерация бюллетеня для голосования на общем собрании.
### Решение собрания
{{ get_sdk_doc("Mutations", "Meet", "GenerateAnnualGeneralMeetDecisionDocument") }} | {{ get_graphql_doc("Mutation.generateAnnualGeneralMeetDecisionDocument") }}
{{ get_typedoc_input("Mutations.Meet.GenerateAnnualGeneralMeetDecisionDocument") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.GenerateAnnualGeneralMeetDecisionDocument", "IOutput") }}
Генерация документа решения общего собрания пайщиков.
### Решение совета о проведении собрания
{{ get_sdk_doc("Mutations", "Meet", "GenerateSovietDecisionOnAnnualMeetDocument") }} | {{ get_graphql_doc("Mutation.generateSovietDecisionOnAnnualMeetDocument") }}
{{ get_typedoc_input("Mutations.Meet.GenerateSovietDecisionOnAnnualMeetDocument") }}
Результат:
{{ get_typedoc_definition("Mutations.Meet.GenerateSovietDecisionOnAnnualMeetDocument", "IOutput") }}
Генерация документа решения Совета о проведении общего собрания.
## Жизненный цикл общего собрания
1. **Инициация** - создание повестки собрания
2. **Решение совета** - принятие решения о проведении
3. **Уведомление** - извещение всех пайщиков
4. **Проведение** - само собрание и голосование
5. **Оформление** - подписание решений секретарем и председателем
6. **Завершение** - публикация итоговых документов
@@ -1,233 +0,0 @@
Пайщик - это пользователь, у которого есть принадлежащий ему объект аккаунта пайщика {{ get_graphql_definition("ParticipantAccount") }}, содержащий информацию о его членстве в кооперативе. Аккаунт пайщика выдаётся кооперативом, при прохождении полной процедуры регистрации пайщика, или при добавлении ранее зарегистрированного пайщика в систему.
<!-- Для генерации заявления должна использоваться собственноручная подпись пайщика в формате png, закодированная в base64. В мета-данных заявления должны присутствовать ссылки на хэши 4 подписанных соглашений. После генерации заявления с ссылками на соглашения и валидной собственноручной подписью, на заявление накладывается цифровая подпись пайщика. -->
## Регистрация пайщика
Аккаунт пайщика {{ get_graphql_definition("ParticipantAccount") }} выдаётся пользователю смарт-контрактом при прохождении полной процедуры регистрации пайщика. После завершения процедуры аккаунт пайщика будет доступен в объекте {{ get_graphql_definition("Account") }} -> {{ get_graphql_definition("ParticipantAccount") }} при [получении аккаунта пользователя](/documentation/accounts/#get-account).
```mermaid
sequenceDiagram
autonumber
participant U as Пользователь
participant SDK as SDK
participant SYS as Блокчейн
participant GOV as Совет Кооператива
Note over U,SYS: Общий процесс регистрации пайщика
U->>SDK: Регистрация аккаунта
SDK->>SYS: Проверка мажоритарности кооператива
alt Кооператив мажоритарен
U->>SDK: Выбор кооперативного участка
else
Note over U,SYS: Участок не требуется
end
U->>SDK: Предгенерация 4х соглашений и заявления на вступление
SDK->>U: Отображение документов
U->>SDK: Приём собственноручной подписи
U->>SDK: Генерация заявления с собственнручной подписью
SDK->>U: Заявление с собственноручной подписью
U->>SDK: Цифровая подпись пакета документов
SDK->>SYS: Отправка пакета документов
U->>SDK: Оплата вступительного и паевого взноса
SDK->>SYS: Подтверждение оплаты
SYS->>GOV: Вынесение вопроса в повестку
GOV->>SYS: Решение совета
SYS->>U: Уведомление о принятии в кооператив
```
### 1. Регистрация аккаунта
Пользователь заполняет форму и регистрирует аккаунт провайдера, как это описано в разделе [Регистрация Аккаунта](/documentation/accounts/#register-account).
### 2. Выбор кооперативного участка
Пользователю необходимо выбрать кооперативный участок в том случае, если кооператив перешёл на мажоритарную систему управления, организовав `>= 3` кооперативных участков в своём кооперативе. В случае, если кооператив - мажоритарен, пользователю потребуется предоставить выбор идентификатора кооперативного участка, председателю которого он делегирует свой голос на общих собраниях.
Для того, чтобы выяснить, является ли кооператив мажоритарным, необходимо [извлечь объект системной информации SystemInfo](/documentation/system), обратиться в нём к {{ get_graphql_definition("CooperativeOperatorAccount") }}, и извлечь булево свойство `is_branched`.
Значение `true` в `is_branched` означает, что кооператив - мажоритарный, и пайщику при регистрации будет необходимо предоставить идентификатор имени кооперативного участка, иначе, регистрация пайщика будет отклонена. Извлечение списка кооперативных участков описано в разделе [Получить Кооперативные Участки](/documentation/branches). Для отправки последующей отправки документов на регистрацию пайщика, потребуется выбрать из списка параметр `braname` - имя аккаунта кооперативного участка, при котором регистрируется пайщик.
<!-- TODO подправить ссылку выше после добавления раздела -->
### 3. Предгенерация документов
Для того, чтобы сгенерировать пайщику персональное заявление на вступление и все сопутствующие соглашения, и показать их ему в том виде, в котором он будет подписывать, необходимо произвести предгенерацию пакета документов.
<a id="pregeneration-applicaion"></a>
#### Заявление на вступление
{{ get_sdk_doc("Mutations", "Participants", "GenerateParticipantApplication") }} | {{ get_graphql_doc("Mutation.generateParticipantApplication") }}
Мутация для генерации заявления на вступление пайщика в кооператив вызывается с параметром signature, который может быть пустым для пред-генерации, или содержать png изображение подписи в кодировке base64 для основной генерации. Массив links будет пустым для пред-генерации, но обязательно должен содержать хэши 4-х соглашений для основной генерации.
{{ get_typedoc_input("Mutations.Participants.GenerateParticipantApplication") }}
#### Соглашение о ЦПП "Цифровой Кошелёк"
{{ get_sdk_doc("Mutations", "Agreements", "GenerateWalletAgreement") }} | {{ get_graphql_doc("Mutation.generateWalletAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GenerateWalletAgreement") }}
#### Соглашение о простой электронной подписи
{{ get_sdk_doc("Mutations", "Agreements", "GenerateSignatureAgreement") }} | {{ get_graphql_doc("Mutation.generateSignatureAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GenerateSignatureAgreement") }}
#### Пользовательское соглашение
{{ get_sdk_doc("Mutations", "Agreements", "GenerateUserAgreement") }} | {{ get_graphql_doc("Mutation.generateUserAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GenerateUserAgreement") }}
#### Согласие с политикой конфиденциальности
{{ get_sdk_doc("Mutations", "Agreements", "GeneratePrivacyAgreement") }} | {{ get_graphql_doc("Mutation.generatePrivacyAgreement") }}
{{ get_typedoc_input("Mutations.Agreements.GeneratePrivacyAgreement") }}
В результате предгенерации будет получены объекты с документами, которые могут быть продемонстрированы пользователю перед запросом его собственноручной подписи. Кроме того, предгенерация необходима, чтобы криптографически связать заявление на вступление с соглашениями на этапе основной генерации после получения собственноручной подписи.
### 4. Собственноручная подпись
Для получения собственноручной подписи пользователя используется вспомогательный набор методов {{ get_sdk_doc("Methods", "Canvas") }}. Для начала процесса получения собственноручной подписи необходимо создать область для подписи с помощью `Canvas.createCanvas()`, передав `id` элемента `div`, в котором будет размещен `canvas`.
```ts
import { Classes } from '@coopenomics/sdk'
// Указываем контейнер, где будет размещён холст
const container = document.getElementById('signature-container') as HTMLElement
// Создаём экземпляр Canvas для работы с подписью
const signatureCanvas = new Classes.Canvas(container, {
lineWidth: 5,
strokeStyle: '#000',
})
```
После завершения процесса собственноручной подписи, необходимо извлечь её и, при необходимости, очистить область:
```ts
// Извлечение подписи в формате base64
const signature = signatureCanvas.getSignature()
console.log('Подпись в формате base64:', signature)
// Очистка холста при необходимости
signatureCanvas.clearCanvas()
// Освобождение ресурсов, если холст больше не нужен
signatureCanvas.destroy()
```
В результате, у вас будет строковое представление изображения собственноручной подписи пользователя, которое теперь необходимо использовать на основной генерации заявления на вступление в кооператив.
### 5. Генерация заявления
{{ get_sdk_doc("Mutations", "Participants", "GenerateParticipantApplication") }} | {{ get_graphql_doc("Mutation.generateParticipantApplication") }}
Основная генерация заявления производится аналогично [предгенерации](/documentation/participants/pregeneration-applicaion), однако, в `signature` необходимо передать полученную ранее собственноручную подпись, а в массиве `links` указать хэши всех ранее сгенерированных соглашений.
```typescript
const variables: Mutations.Participants.GenerateParticipantApplication.IInput = {
data: {
singature: <полученная ранее строка с изображением подписи в png/base64>,
links: [participantApplication.hash, signatureAgreement.hash, userAgreement.hash, privacyAgreement.hash]
username: <имя аккаунта пользователя>,
coopname: <имя аккаунта кооператива>
}
const { [Mutations.Participants.GenerateParticipantApplication.name]: participantApplication2 } = await client.Mutation(
Mutations.Participants.GenerateParticipantApplication.mutation,
{
variables,
}
);
```
В результате исполнения мутации будет возвращён объект заявления, который сгенерирован с применением его собственноручной подписи. Все документы будут сохранены в MONO и криптографически связаны с пользователем, между собой, и его собственноручной подписью.
### 5. Подпись документов
Теперь у нас есть полный пакет документов: 4 соглашения с этапа пред-генерации и 1 заявление с предыдущего этапа, которое включает собственноручную подпись пользователя и хэш-ссылки на соглашения.
Теперь необходимо подписать все эти 5 документов. Цифровая подпись осуществляется методом класса {{ get_class_doc("Document", "sign") }}, активный инстанс которого есть в SDK-клиенте. Вы можете использовать `client.Document.sign(doc)` на действующем экземпляре клиента или создать новый экземпляр класса Document, импортировав его из SDK:
```ts
const wif = <приватный ключ>
//устанавливаем ключ в клиента, если необходимо
client.Document.setWif(wif)
//последовательно подписываем все документы:
const signedSignatureAgreement = client.Document.sign(signatureAgreement)
const signedUserAgreement = client.Document.sign(userAgreement)
const signedWalletAgreement = client.Document.sign(walletAgreement)
const signedPrivacyAgreement = client.Document.sign(privacyAgreement)
const signedParticipantApplication = client.Document.sign(participantApplication2)
```
Для успешной подписи документов в SDK-клиенте должен быть [установлен](/documentation/auth/#about-auth) приватный ключ. В результате, каждый документ будет подписан подготовлен к отправке приведением к необходимому формату.
### 6. Отправка документов
{{ get_sdk_doc("Mutations", "Participants", "RegisterParticipant") }} | {{ get_graphql_doc("Mutation.registerParticipant") }}
Регистрация пайщика производится мутацией RegisterParticipant с передачей подписанного заявления и соглашений. Отправленный пакет документов сохраняется в MONO для пользователя и ожидает поступления оплаты взносов перед отправкой в совет на голосование.
{{ get_typedoc_input("Mutations.Participants.RegisterParticipant") }}
### 7. Оплата взносов
{{ get_sdk_doc("Mutations", "Participants", "CreateInitialPayment") }} | {{ get_graphql_doc("Mutation.createInitialPayment") }}
Перед тем, как принятые документы будут отправлены в повестку совета на голосование, новому пайщику необходимо оплатить вступительный и минимальный паевый взносы (одним платежом).
{{ get_typedoc_input("Mutations.Participants.CreateInitialPayment") }}
Результат:
{{ get_typedoc_definition("Mutations.Payments.CreateInitialPayment", "IOutput") }}
Подробнее о доступных платежных провайдерах и управлении платежами смотри раздел [Платежи](/documentation/payments). После получения подтверждения о поступлении платежа (статус платежа `PAID`), пользователю будет зарегистрирован аккаунт в блокчейне, а пакет документов пайщика поставлен в повестку голосования совета кооператива.
### 8. Получение решения совета
После поступления платежа вопрос добавляется в повестку голосования совета, где каждый член совета голосует за решение о приёме нового пайщика, а председатель - утверждает это решение. Процесс принятия решения советом описан в разделе [Решения](/documentation/decisions).
После того, как совет примет решение, оно будет автоматически исполнено: обновятся все реестры, будут созданы счета, открыты кошельки и т.д., а пользователь получит уведомление на электронную почту о том, что он принят в кооператив. С этого момента он является пайщиком, обладает объектом {{ get_graphql_definition("ParticipantAccount") }} в {{ get_graphql_definition("Account") }}, и может участвовать во всех целевых потребительских программах кооператива.
## Добавление пайщика
{{ get_sdk_doc("Mutations", "Participants", "AddParticipant") }} | {{ get_graphql_doc("Mutation.addParticipant") }}
Иногда необходимо добавить в цифровую систему уже действующего пайщика кооператива. В таком случае, нам не нужно проводить регистрацию пайщика по полному процессу, а достаточно сразу добавить его в систему.
!!!danger ""
Данная мутация должна использоваться `ТОГДА И ТОЛЬКО ТОГДА`, когда решение совета кооператива уже принято и оформлено в `бумажном` протоколе, а пайщик фактически совершил взносы в кооператив. Т.е. юридически пользователь уже является пайщиком кооператива и его необходимо только добавить в систему, переведя взаимоотношения с ним в цифровую форму.
<!-- Использование данной мутации без наличия `бумажного` протокола решения собрания совета и оплаченных взносов пайщика, может привести к аннулированию им всех операций на платформе через суд. -->
{{ get_typedoc_input("Mutations.Participants.AddParticipant") }}
Результат:
{{ get_typedoc_definition("Mutations.Participants.AddParticipant", "IOutput") }}
В результате исполнения мутации, пайщик будет добавлен в кооператив, а ему на электронную почту выслано приглашение на получение приватного ключа доступа к системе. Воспользовавшись им, он сможет войти в систему.
Однако, для получения полной функциональности, ему необходимо предоставить 4 базовых подписанных соглашения, как это описано в разделе [Соглашения](/documentation/agreements). Без наличия подписанных соглашений, функционал платформы для него может быть ограничен.
@@ -1,78 +0,0 @@
# Методы платежа
Методы платежа определяют способы приема и обработки платежей в кооперативе. Система поддерживает различные платежные провайдеры и методы оплаты.
## Получить список методов оплаты
{{ get_sdk_doc("Queries", "PaymentMethods", "GetPaymentMethods") }} | {{ get_graphql_doc("Query.getPaymentMethods") }}
{{ get_typedoc_input("Queries.PaymentMethods.GetPaymentMethods") }}
Результат:
{{ get_typedoc_definition("Queries.PaymentMethods.GetPaymentMethods", "IOutput") }}
## Добавить банковский счёт
{{ get_sdk_doc("Mutations", "PaymentMethods", "CreateBankAccount") }} | {{ get_graphql_doc("Mutation.createBankAccount") }}
{{ get_typedoc_input("Mutations.PaymentMethods.CreateBankAccount") }}
Результат:
{{ get_typedoc_definition("Mutations.PaymentMethods.CreateBankAccount", "IOutput") }}
## Обновить банковский счёт
{{ get_sdk_doc("Mutations", "PaymentMethods", "UpdateBankAccount") }} | {{ get_graphql_doc("Mutation.updateBankAccount") }}
{{ get_typedoc_input("Mutations.PaymentMethods.UpdateBankAccount") }}
Результат:
{{ get_typedoc_definition("Mutations.PaymentMethods.UpdateBankAccount", "IOutput") }}
## Удалить метод оплаты
{{ get_sdk_doc("Mutations", "PaymentMethods", "DeletePaymentMethod") }} | {{ get_graphql_doc("Mutation.deletePaymentMethod") }}
{{ get_typedoc_input("Mutations.PaymentMethods.DeletePaymentMethod") }}
Результат:
Метод платежа - это реквизиты, по которым кооператив совершает возвраты взносов пайщику.
## Получить список методов платежа
{{ get_sdk_doc("Queries", "PaymentMethods", "GetPaymentMethods") }} | {{ get_graphql_doc("Query.getPaymentMethods") }}
{{ get_typedoc_input("Queries.PaymentMethods.GetPaymentMethods") }}
Результат:
{{ get_typedoc_definition("Queries.PaymentMethods.GetPaymentMethods", "IOutput") }}
## Добавить банковский счёт
{{ get_sdk_doc("Mutations", "PaymentMethods", "CreateBankAccount") }} | {{ get_graphql_doc("Mutation.createBankAccount") }}
{{ get_typedoc_input("Mutations.PaymentMethods.CreateBankAccount") }}
Результат:
{{ get_typedoc_definition("Mutations.PaymentMethods.CreateBankAccount", "IOutput") }}
## Удалить метод платежа
{{ get_sdk_doc("Mutations", "PaymentMethods", "DeletePaymentMethod") }} | {{ get_graphql_doc("Mutation.deletePaymentMethod") }}
{{ get_typedoc_input("Mutations.PaymentMethods.DeletePaymentMethod") }}
Результат:
{{ get_typedoc_definition("Mutations.PaymentMethods.DeletePaymentMethod", "IOutput") }}
## Обновить банковский счёт
{{ get_sdk_doc("Mutations", "PaymentMethods", "UpdateBankAccount") }} | {{ get_graphql_doc("Mutation.updateBankAccount") }}
{{ get_typedoc_input("Mutations.PaymentMethods.UpdateBankAccount") }}
Результат:
{{ get_typedoc_definition("Mutations.PaymentMethods.UpdateBankAccount", "IOutput") }}
@@ -1,125 +0,0 @@
## Типы взносов
[Кошельки](/documentation/wallet) управляют учётом взносов пайщиков на их лицевых счетах и фондах кооператива. Когда пайщик совершает взнос - это фиксируются на счетах в [кошельке](/documentation/wallet) пайщика и [фондах](/documentation/funds) кооператива.
Взносы бывают: `вступительные`, `паевые`, `членские`.
Вступительный взнос оплачивается пайщиком однократно при вступлении в кооператив.
Паевые взносы совершают пайщики, чтобы затем получить возврат паевого взноса с выгодой в качестве удовлетворения потребности.
Членские взносы берутся при участии в целевых потребительских программах в фиксированной сумме или как % от суммы паевого взноса, и используются для пополнения [невозвратных фондов](/documentation/funds) кооператива. Подробнее о членских взносах смотри разделы [Фондов](/documentation/funds) и [Программ](/documentation/programs).
`Вступительные` и `Паевые` взносы принимаются через совершение `Платежа`. Приём паевых взносов не ограничивается только платежами, и может осуществляться любым имуществом, но это выходит за описание данного раздела.
## Платежи
`Платеж` - это информационное сообщение, которое порождается, обрабатывается и преобразуется платежным провайдером и советом во взнос. Платеж создаётся и обрабатывается провайдером платежей на основании поручения пользователя, а взносы принимаются и обрабатываются смарт-контрактами после успешного получения платежа.
```mermaid
flowchart TB
%% Определение платежей
REG_PAYMENT["Регистрационный платеж"]
SHARE_PAYMENT["Паевой платеж"]
REFUND_PAYMENT["Платеж возврата"]
SHARE_REFUND["Возврат паевого взноса"]
%% Взносы
ENTRY_FEE["Вступительный взнос"]
MIN_SHARE["Минимальный паевой взнос"]
SHARE_CONTRIBUTION["Паевой взнос"]
%% Связи
REG_PAYMENT --> ENTRY_FEE
REG_PAYMENT --> MIN_SHARE
SHARE_PAYMENT --> SHARE_CONTRIBUTION
%% Добавленные блоки
SHARE_REFUND --> REFUND_PAYMENT
%% Цветовые стили (платежи выделены красным, шрифт принудительно чёрный)
style REG_PAYMENT stroke:#ff6666,stroke-width:2px
style SHARE_PAYMENT stroke:#ff6666,stroke-width:2px
style REFUND_PAYMENT stroke:#ff6666,stroke-width:2px
```
Платежи обладают суммой и типом. В системе предусмотрено два типа платежей: регистрационные и паевые. Регистрационные платежи порождают одновременно два типа взносов: вступительный и минимальный паевый взносы, которые требуются совершить при регистрации нового пайщика.
Вступительный взнос направляется в фонд кооператива для дальнейшего списания на расходы и хранится там до принятия советом соответствующего решения на списание. Минимальный паевый взнос помещается в кошелёк пайщика и паевый фонд кооператива. Причина же, почему эти взносы вообще появились - это успешный `регистрационный платеж`.
Кроме `регистрационного платежа`, который порождает вступительный и минимальные паевые взносы для регистрации пайщика, в системе существуют `паевые платежи`, которые после успешной обработки добавляются в кошелёк пайщика и увеличивают паевый фонд кооператива.
Паевые взносы отображаются в [Кошельке](/documentation/wallet) и могут быть использованы в [Целевых Программах](/documentation/programs) для удовлетворения потребностей пайщиков кооператива. При использовании паевых средств в [Целевых Программах](/documentation/programs) могут взыматься членские взносы, размер которых определяется условиями программы.
Все паевые взносы безусловно возвратные и должны быть возвращены кооперативом по требованию пайщика в границах баланса его паевого счёта. Минимальный паевый взнос, при этом, возвращается при выходе пайщика из кооператива. Управление возвратами паевых взносов производится смарт-контрактами, на основе которых бэкенд MONO создаёт `платежи возврата`, которые обрабатываются администрацией кооператива.
Подробнее о методологии кооперации смотри на сайте платформы "[Кооперативная Экономика](https://coopenomics.world). Здесь же нам важен принцип - платежи порождают взносы. Платежи обрабатываются платежными провайдерами, а взносы - смарт-контрактами.
## Платежные провайдеры
Подключение платежных провайдеров производится через установку и конфигурацию [расширений](/documentation/extensions). Получить список подключенных провайдеров с их идентификаторами возможно с помощью запроса [getPaymentProviders](/documentation/payments/get-payment-providers)
<!--
__Дефолтный провайдер__: `qrpay` - оплата по QR-коду.
__Опциональный провайдер__: `yookassa` - оплата через сервис виджета [Yookassa](https://yookassa.ru)
-->
Каждый провайдер умеет по-своему создавать платежи и обрабатывать платежи. Количество платежных провайдеров в системе не ограничено. Какие конкретно провайдеры подключены в конкретном кооперативе - определяет сам кооператив с помощью установки [расширений](/documentation/extensions).
Например, провайдер `qrpay` возвращает в `result.data` строку с реквизитами в формате, который при пребразовании в QR-код и его сканировании банковским приложением, распознаётся им и приводит к автоматическому заполнению полей реквизитов и суммы для оплаты. Обработка платежа производится "вручную" через изменение администратором статуса платежа.
Провайдер `yookassa` (если подключен и настроен) возвращает токен платежа `confirmation_token` в `result.data`, который может быть пребразован в [платежный виджет](https://yookassa.ru/developers/payment-acceptance/integration-scenarios/widget/quick-start#preparation-pages) и встроен в сайт для приёма платежей. Обработка происходит автоматически при поступлении оповещения от Yookassa на бэкенд MONO.
<a id="get-payment-providers"></a>
## Список активных провайдеров
{{ get_sdk_doc("Queries", "PaymentMethods", "GetPaymentMethods") }} | {{ get_graphql_doc("Query.getPaymentMethods") }}
Запрос по извлечению списка провайдеров возвращает идентификаторы провайдеров и схемы их данных.
## Вступительный и минимальный паевой взносы
{{ get_sdk_doc("Mutations", "Gateway", "CreateInitialPayment") }} | {{ get_graphql_doc("Mutation.createInitialPayment") }}
В процессе [регистрации пайщика](/documentation/participants) необходимо совершить вступительный и минимальный паевый взносы, выполнив регистрационный платеж. Для создания регистрационного платежа необходимо вызвать мутацию CreateInitialPayment.
{{ get_typedoc_desc("Mutations.Gateway.CreateInitialPayment") }}
{{ get_typedoc_input("Mutations.Gateway.CreateInitialPayment") }}
## Паевый взнос
{{ get_sdk_doc("Mutations", "Gateway", "CreateDepositPayment") }} | {{ get_graphql_doc("Mutation.createDepositPayment") }}
{{ get_typedoc_desc("Mutations.Gateway.CreateDepositPayment") }}
{{ get_typedoc_input("Mutations.Gateway.CreateDepositPayment") }}
## Список платежей
{{ get_sdk_doc("Queries", "Gateway", "GetPayments") }} | {{ get_graphql_doc("Query.getPayments") }}
{{ get_typedoc_desc("Queries.Gateway.GetPayments") }}
{{ get_typedoc_input("Queries.Gateway.GetPayments") }}
## Платеж возврата
{{ get_sdk_doc("Mutations", "Wallet", "CreateWithdraw") }} | {{ get_graphql_doc("Mutation.createWithdraw") }}
{{ get_typedoc_desc("Mutations.Wallet.CreateWithdraw") }}
{{ get_typedoc_input("Mutations.Wallet.CreateWithdraw") }}
## Управление платежами
{{ get_sdk_doc("Mutations", "Gateway", "SetPaymentStatus") }} | {{ get_graphql_doc("Mutation.setPaymentStatus") }}
{{ get_typedoc_desc("Mutations.Gateway.SetPaymentStatus") }}
{{ get_typedoc_input("Mutations.Gateway.SetPaymentStatus") }}
@@ -1,14 +0,0 @@
Целевые потребительские программы — это организованные кооперативом механизмы коллективного потребления, направленные на удовлетворение конкретных потребностей пайщиков. Они основаны на совместном финансировании, коллективных закупках или иных формах кооперации, обеспечивающих доступ к товарам, услугам или ресурсам на более выгодных условиях. Программы могут охватывать различные сферы, такие как жильё, транспорт, образование, здравоохранение, страхование и другие направления, способствуя повышению уровня жизни пайщиков за счёт объединения их ресурсов и интересов.
На платформе [Кооперативной Экономики](https://coopenomics.world) все целевые потребительские программы стандартизированы и связаны со смарт-контрактами, которые поддерживают их корректное исполнение согласно правил и положений программы. Непосредственными управлениями взносами и возвратами взносов управляют смарт-контракты, которые применяют данную целевую программу и подключены к ней. Каждый из них реализует свою логику реализации механизмов кооперации, но все они применяют общий способ расчёта стоимости участия в программе, который указан в объекте программы при её создании в кооперативе.
Кооператив может создавать целевые программы по шаблонам и использовать их в [Расширениях](/documentation/extensions) при использовании [Витрин](/documentation/extensions). При подключении какой-либо [Витрины](/documentation/extensions) потребуется указать параметры целевой потребительской программы, по которой она будет функционировать.
При создании целевой потребительской программы в кооперативе используется идентификатор шаблона стандартизированной целевой потребительской программы, описания программы для отображения на ветринах, а также, информация о способе расчёта членских взносов при участии в ней.
## Управление программами
Создание и управление целевыми потребительскими программами осуществляется напрямую через смарт-контракты блокчейна, а не через GraphQL API. Программы создаются при инициализации кооператива и могут быть изменены только через блокчейн-транзакции с соответствующими правами доступа.
Текущие активные программы можно просматривать через интерфейс расширений, где они используются для настройки витрин и утилит кооператива.
-173
View File
@@ -1,173 +0,0 @@
Для удобства интеграции с `MONO` доступен [SDK-клиент](/sdk), который обеспечивает структурированный по пространствам имён программный доступ к запросам, мутациям и подпискам [GraphQL-API](/graphql), а также, вспомогательным классам для работы с `MONO`.
Все вызовы мутаций, запросов и подписок и ответы строго типизированы в входных и выходных данных на TypeScript. Это упрощает программное взаимодействие с `MONO`, делая интеграцию максимально простой. В настоящий момент [SDK-клиент](/sdk) доступен только на TypeScript. Если ваш проект использует другой язык, вам потребуется обратиться к документации [GraphQL-API](/graphql) и создать собственный клиент на основе предоставленных схем данных.
## Установка
```sh
pnpm install @coopenomics/sdk
// или
yarn add @coopenomics/sdk
```
## Как пользоваться
[SDK](/sdk) основан на гененаторе [GraphQL-Zeus](https://github.com/graphql-editor/graphql-zeus), который на основании схемы данных [GraphQL-API](/graphql) генерирует типизированный клиент доступа к `MONO`.
Для начала, нам потребуется подключенный к `MONO` клиент:
```ts
import { Client } from '@coopenomics/sdk'
// создаём клиента
const client = Client.create({
api_url: "http://127.0.0.1:2998/v1/graphql", //адрес MONO GraphQL-API
chain_url: "https://api.coopenomics.world", //адрес конечной точки блокчейна
chain_id: "6e37f9ac0f0ea717bfdbf57d1dd5d7f0e2d773227d9659a63bbf86eec0326c1b", //идентификатор цепочки публичной сети
});
```
!!!note ""
При хостинге у ПК ВОСХОД адрес конечной точки GraphQL будет следующего формата: https://{{domain}}/backend/v1/graphql, где domain - это имя домена, по которому доступен рабочий стол кооператива.
Созданный клиент обладает встроенными фабриками для вызова мутаций, запросов, и подписок в `MONO`. Для аудентификации клиента необходимо токен доступа через вызов метода:
```ts
client.setToken(<token>)
```
Подробнее о получении токенов доступа смотри раздел [Аудентификация](/documentation/auth).
### Запросы
Для того, чтобы создать запрос на получение информации из `MONO`, необходимо извлечь его из пространства имён `Queries`, выбрав соответствующий область. Пространство каждого запроса включает в себя:
- Интерфейс входных данных `IInput`
- Интерфейс выходных данных `IOutput`
- Селектор запроса `query`
- Имя запроса `name`
<!-- - Требуемую роль `role` для выполнения запроса -->
Просмотреть все доступные пространства имён запросов можно в документации [SDK](/sdk). Все запросы составляются и выполняются типично. Рассмотрим на примере извлечения аккаунта {{ get_sdk_doc("Queries", "Accounts", "GetAccount") }}:
```ts
// импортируем пространство запросов
import { Queries } from '@coopenomics/sdk'
// формируем объект с параметрами запроса согласно интерфейсу IInput
const variables: Queries.Accounts.GetAccount.IInput = {
data: {
username: <string>; // Имя аккаунта пользователя
};
};
// отправляем запрос и получаем результат в result
const { [Queries.Accounts.GetAccount.name]: result } = await client.Query(
Queries.Accounts.GetAccount.query,
{ variables }
);
```
Где `Queries.Accounts.GetAccount.name` - это имя запроса, по ключу которого в ответе будет типизированный `result` в соответствии с интерфейсом `Queries.Accounts.GetAccount.IOutput`, а `Queries.Accounts.GetAccount.query` - это предварительно сформированный селектор, на основании которого выбираются поля переменной результата `result`.
Таким образом, для выполнения любого запроса необходимо только знать пространство имени в `SDK` и использовать данные из него для составления запроса.
<!-- В `role` же содержится вспомогательная информация, которая сообщает о том, какая минимальная роль пользователя допустима для совершения запроса. -->
### Мутации
Мутация - это способ изменения данных в `MONO` через [GraphQL-API](/graphql). Мутации производятся аналогично запросам, для их проведения необходимо извлечь её из пространства имён `Mutations` - пространство мутации с требуемым именем. Каждое пространство мутации включает в себя:
- Интерфейс входных данных `IInput`
- Интерфейс выходных данных `IOutput`
- Селектор мутации `mutation`
- Имя мутации `name`
<!-- - Требуемую роль `role` для выполнения мутации -->
Все мутации выполняются типично в следующем порядке на примере паевого взноса {{ get_sdk_doc("Mutations", "Gateway", "CreateDepositPayment") }}:
```ts
// импортируем пространство мутаций
import { Mutations } from '@coopenomics/sdk'
// формируем объект с параметрами запроса согласно интерфейсу IInput
const variables: Mutations.Gateway.CreateDepositPayment.IInput = {
data: {
username: <string>; // Имя аккаунта пользователя
quantity: <string>; // Сумма взноса
};
};
// отправляем мутацию и получаем результат в result
const { [Mutations.Gateway.CreateDepositPayment.name]: result } = await client.Mutation(
Mutations.Gateway.CreateDepositPayment.mutation,
{ variables }
);
```
Типизированный результат исполнения мутации согласно интерфейсу `Mutations.Payments.CreateDepositPayment.IOutput` будет возвращен в переменной `result`.
### Классы
Пространство имён классов содержит вспомогательные классы для работы с `MONO`. Доступ к классам осуществляется через пространство имён `Classes` на примере класса `Canvas` для извлечения собственноручной подписи пайщика:
```ts
import { Classes } from '@coopenomics/sdk'
//контейнер для собственноручной подписи пайщика
const container = document.getElementById('signature-container') as HTMLElement
//используем вспомогательный класс Canvas
const signatureCanvas = new Canvas(container, {
lineWidth: 5,
strokeStyle: '#000',
})
// ...
// Извлечение подписи в формате base64
const signature = signatureCanvas.getSignature()
console.log('Подпись в формате base64:', signature)
````
Доступные на текущий момент вспомогательные классы пространства имён Classes:
__`Blockchain`__ - отвечает за извлечение таблиц из блокчейна и отправку транзакций в блокчейн.
__`Canvas`__ - за извлечение собственноручной подписи пайщика в необходимом формате для `MONO`
__`Document`__ - за вычисление и восстановление цифровой подписи документов
__`Account`__ - за генерацию имени и ключей нового аккаунта
### Системное пространство
Иногда при создании запросов или выполнении мутаций могут требоваться специализированные списки или типы данных `MONO`, которые находятся в пространстве имён `Zeus`, т.к. генерируются автоматически с использованием GraphQL-Zeus.
На примере мутации для изменения статуса платежа:
```ts
import { Zeus, Mutations } from '@coopenomics/sdk'
const variables: Mutations.Payments.SetPaymentStatus.IInput = {
data: {
id: <string>; // Идентификатор платежа, для которого устанавливается статус
status: Zeus.PaymentStatus.PAID; // используем список статусов платежей для указания оплаченного платежа
};
};
const { [Mutations.Payments.SetPaymentStatus.name]: result } = await client.Mutation(
Mutations.Payments.SetPaymentStatus.mutation,
{ variables }
);
```
Полный набор списков доступен в документации [SDK](/documentation/sdk) в пространстве имён Zeus.
@@ -1,58 +0,0 @@
# Системная информация
Системная информация включает в себя данные о конфигурации кооператива, состоянии блокчейна, версии программного обеспечения и другие технические параметры, необходимые для корректной работы платформы MONO.
## Получить системную информацию
{{ get_sdk_doc("Queries", "System", "GetSystemInfo") }} | {{ get_graphql_doc("Query.getSystemInfo") }}
{{ get_typedoc_input("Queries.System.GetSystemInfo") }}
Результат:
{{ get_typedoc_definition("Queries.System.GetSystemInfo", "IOutput") }}
Метод возвращает публичную информацию о системе, включая настройки кооператива, версии компонентов и текущее состояние.
## Инициализация системы
{{ get_sdk_doc("Mutations", "System", "InitSystem") }} | {{ get_graphql_doc("Mutation.initSystem") }}
{{ get_typedoc_input("Mutations.System.InitSystem") }}
Результат:
{{ get_typedoc_definition("Mutations.System.InitSystem", "IOutput") }}
Произвести инициализацию программного обеспечения перед установкой совета методом install.
## Установка совета
{{ get_sdk_doc("Mutations", "System", "InstallSystem") }} | {{ get_graphql_doc("Mutation.installSystem") }}
{{ get_typedoc_input("Mutations.System.InstallSystem") }}
Результат:
{{ get_typedoc_definition("Mutations.System.InstallSystem", "IOutput") }}
Произвести установку членов совета перед началом работы.
## Обновление параметров
{{ get_sdk_doc("Mutations", "System", "UpdateSystem") }} | {{ get_graphql_doc("Mutation.updateSystem") }}
{{ get_typedoc_input("Mutations.System.UpdateSystem") }}
Результат:
{{ get_typedoc_definition("Mutations.System.UpdateSystem", "IOutput") }}
Обновить параметры системы.
## Сохранение приватного ключа
{{ get_sdk_doc("Mutations", "System", "SetWif") }} | {{ get_graphql_doc("Mutation.setWif") }}
{{ get_typedoc_input("Mutations.System.SetWif") }}
Результат:
{{ get_typedoc_definition("Mutations.System.SetWif", "IOutput") }}
Сохранить приватный ключ в зашифрованном серверном хранилище.
@@ -1,79 +0,0 @@
# Кошелёк
Кошелёк в системе MONO представляет собой модуль для управления паевыми взносами и финансовыми операциями пайщиков кооператива. Все операции проходят через платёжный шлюз и отражаются в блокчейне для обеспечения прозрачности и неизменности записей.
## Паевые взносы
Паевые взносы являются основой членства в кооперативе. Система поддерживает различные типы взносов и операций с ними.
### Создать депозитный платеж
{{ get_sdk_doc("Mutations", "Wallet", "CreateDepositPayment") }} | {{ get_graphql_doc("Mutation.createDepositPayment") }}
{{ get_typedoc_input("Mutations.Wallet.CreateDepositPayment") }}
Результат:
{{ get_typedoc_definition("Mutations.Wallet.CreateDepositPayment", "IOutput") }}
Создание объекта паевого платежа производится мутацией createDepositPayment. Выполнение мутации возвращает идентификатор платежа и данные для его совершения в зависимости от выбранного платежного провайдера.
### Создать заявку на вывод средств
{{ get_sdk_doc("Mutations", "Wallet", "CreateWithdraw") }} | {{ get_graphql_doc("Mutation.createWithdraw") }}
{{ get_typedoc_input("Mutations.Wallet.CreateWithdraw") }}
Результат:
{{ get_typedoc_definition("Mutations.Wallet.CreateWithdraw", "IOutput") }}
Создание заявки на вывод паевых средств из кооператива. Заявка проходит процедуру рассмотрения советом.
## Возврат паевых взносов
Система предоставляет полный документооборот для возврата паевых взносов при выходе из кооператива.
### Заявление на возврат
{{ get_sdk_doc("Mutations", "Wallet", "GenerateReturnByMoneyStatementDocument") }} | {{ get_graphql_doc("Mutation.generateReturnByMoneyStatementDocument") }}
{{ get_typedoc_input("Mutations.Wallet.GenerateReturnByMoneyStatementDocument") }}
Результат:
{{ get_typedoc_definition("Mutations.Wallet.GenerateReturnByMoneyStatementDocument", "IOutput") }}
Генерация документа заявления на возврат паевого взноса. Документ подписывается пайщиком и подается в совет для рассмотрения.
### Решение о возврате
{{ get_sdk_doc("Mutations", "Wallet", "GenerateReturnByMoneyDecisionDocument") }} | {{ get_graphql_doc("Mutation.generateReturnByMoneyDecisionDocument") }}
{{ get_typedoc_input("Mutations.Wallet.GenerateReturnByMoneyDecisionDocument") }}
Результат:
{{ get_typedoc_definition("Mutations.Wallet.GenerateReturnByMoneyDecisionDocument", "IOutput") }}
Генерация документа решения совета о возврате паевого взноса. Документ оформляется после рассмотрения заявления и принятия положительного решения.
## Процедура возврата паевых взносов
1. **Подача заявления** - пайщик генерирует и подписывает заявление на возврат
2. **Рассмотрение советом** - совет рассматривает заявление на собрании
3. **Принятие решения** - совет генерирует решение о возврате
4. **Выполнение возврата** - технический возврат средств через платёжную систему
## Безопасность операций
- Все финансовые операции требуют цифровой подписи
- Операции отражаются в неизменяемом блокчейне
- Многоступенчатая система подтверждений
- Аудит всех движений средств
## Интеграция с платёжными системами
Кошелёк интегрирован с различными платёжными провайдерами для удобства пайщиков:
- Банковские карты
- Банковские переводы
- Электронные кошельки
- Криптовалютные платежи (в планах)
-62
View File
@@ -1,62 +0,0 @@
# Вопрос - ответ
| Бизнес | Кооперация | Комментарий |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ПАО/ООО - это публичное акционерное общество или юридическое лицо с ограниченной ответственностью, соответственно. Основываются на принципах коммерческой деятельности с целью извлечения прибыли. | Кооператив - это добровольное объединение граждан и/или юридических лиц, основанное на принципах взаимопомощи и самоуправления, направленное на удовлетворение материальных и иных потребностей членов. | В то время как ООО фокусируется на финансовой выгоде и обслуживании широкого круга клиентов, кооператив акцентируется на взаимопомощи и удовлетворении потребностей своих членов. |
| Прибыль - это чистый финансовый доход компании после вычета всех расходов, направленный на обогащение акционеров или владельцев. | Выгода в кооперативе включает не только материальное вознаграждение, но и другие формы пользы для пайщиков, такие как социальные, экономические или культурные блага. | В бизнесе прибыль является основной целью деятельности и измеряется в денежных терминах, тогда как в кооперативе выгода охватывает более широкий спектр показателей, включая общее благосостояние и удовлетворение потребностей членов. |
| Владелец, инвестор, акционер, сотрудник, учредитель, подрядчик, клиент - различные участники процесса бизнеса, каждый с собственными интересами и целями. | Пайщик - участник кооператива, физическое или юридическое лицо, присоединяющееся к кооперативу и осуществляющее взаимодействие для удовлетворения своих потребностей и/или совместной работы. | В бизнесе участники имеют разнообразные роли и цели, включая получение прибыли и обслуживание клиентов, тогда как в кооперативе все пайщики объединены общими интересами и целями удовлетворения своих потребностей. |
| Директор - лицо, управляющее компанией и принимающее ключевые решения. Назначается акционерами на основе принципа “больше капитал - больше полномочий” | Председатель Совета Кооператива - пайщик, который выбирается другими пайщиками, представляет интересы кооператива, действует от его имени и управляет его деятельностью. Председатель Правления - лицо, назначаемое Советом кооператива и действующее от его имени в соответствии с полномочиями, определенными уставом кооператива. | |
| Совет Директоров - орган, принимающий стратегические решения в компании, формируется из представителей акционеров на основе большей доли (количества акций) | Совет Кооператива - орган, управляющий деятельностью кооператива и принимающий важные решения от имени его членов. Избирается пайщиками кооператива большинством голосов (один пайщик - один голос) | |
| Менеджмент - это группа лиц в компании, отвечающий за повседневное управление и реализацию стратегических планов. Назначаются Советом Директоров (владельцами) - для высшего управления - или нанимаются | Правление - исполнительный орган кооператива, осуществляющий руководство его повседневной деятельностью, назначается Советом кооперативаа и действующий в рамках полномочий, определенных уставом кооператива | |
| Общее собрание акционеров - высший орган управления компанией, состоящий из акционеров или учредителей. | Общее собрание пайщиков - высший орган управления кооперативом, в котором участвуют все пайщики - один пайщик - один голос. | В обоих случаях это ключевой орган управления, однако в кооперативах каждый пайщик имеет один голос, вне зависимости от размеров взносов, , что обеспечивает равное представительство и участие. |
| Покупка товара - процесс приобретения товара покупателем у продавца, основанный на рыночных отношениях. | Заказ товара - процесс, при котором пайщики заказывают товар через кооператив, который поставляет его, опираясь на их потребности и паевые взносы. | В бизнесе акцент на индивидуальном потреблении, в кооперативе - на коллективном удовлетворении потребностей и совместной закупке. |
| Продажа товара - деятельность, направленная на реализацию товаров конечным потребителям для получения прибыли. | Поставка товара - процесс, при котором кооператив распределяет или доставляет товары среди своих пайщиков, в основном, как возврат паевых взносы. | В бизнесе фокус на максимизации продаж и прибыли, в кооперативе - на обеспечении доступности товаров для пайщиков. |
| Подразделение - это структурная единица в компании, специализирующаяся на определенном аспекте деятельности или рынке. | Кооперативный участок - это часть потребительского кооператива, объединяющая пайщиков по территориальным, производственным или функциональным признакам. | В бизнесе подразделения создаются для эффективности и специализации, в то время как кооперативные участки сосредоточены на удовлетворении локальных или специфических потребностей своих членов. |
| Проект - это временная инициатива или задача, направленная на достижение конкретных целей бизнеса. | Целевая Потребительская Программа - это инициатива в рамках кооператива, цель которой - достижение определенных результатов для пайщиков. | В бизнесе проекты , в основном,фокусируются на финансовых результатах, в кооперативах - на удовлетворении конкретных потребностей членов и связанных с этим новаций. |
| Дивиденды - это доход, получаемый инвесторами от вложений в бизнес. | Материальная Помощь - это форма вознаграждения для пайщиков кооператива, осуществляющих деятельность в кооперативе, включающая финансовые и нефинансовые выгоды. | В бизнесе акцент на финансовой отдаче от инвестиций, в кооперативах - на обеспечении выгоды для членов, как финансовой, так и в форме улучшения условий работы или доступа к ресурсам. |
| Конкуренция - это рыночный механизм, где компании соревнуются за клиентов, ресурсы и рыночную долю с целью максимизации прибыли. | Кооперация - это подход, при котором участники объединяют свои ресурсы и усилия для достижения общих целей и удовлетворения потребностей членов. | В бизнесе конкуренция ориентирована на превосходство и индивидуальный успех, в то время как в кооперации акцент на удовлетворение общественных потребностей, совместной работе и взаимопомощи. |
| Индивидуальное владение - это когда собственность или бизнес принадлежит одному лицу или ограниченной группе лиц. | Коллективное владение - это когда собственность или организация принадлежит всем её членам, каждый из которых имеет равные права и обязанности. | В индивидуальном владении ключевой акцент на личной ответственности и выгоде, в то время как коллективное владение подразумевает совместное управление и распределение выгод. |
## Определения
### Кооперативная Экономика
(или коопэномика) -- это хозяйственный уклад, основанный на традиционных нравственных императивах, общественном управлении, равенстве экономических субъектов и эквивалентном обмене, воплощенный в сетевом цифровом формате.
### Сообщество
Совокупность кооперативов и их пайщиков, работающих совместно для достижения общих целей, основанных на принципах кооперативной экономики.
### Платформа
Технологическая инфраструктура, основанная на методологии соответствующей законодательству, инструмент онлайн-управления совместной хозяйственной деятельностью в кооперативах и между ними.
### Распределенная база данных (РБД)
База данных, реализованная с использованием технологии блокчейн, с ограниченным доступом пользователей, администрируемая сообществом через АНО "Кооперативная Экономика". В РБД хранится важная учетная, управленческая и другая информация, связанная с деятельностью сообщества.
### Смарт-контракты
Программы, реализующие логику изменения записей в РБД согласно хозяйственным, управленческим и иным операциям Сообщества.
### Учётная единица
Обеспеченный активами Сообщества токен, используемый как средство учета ценностей и операций в рамках кооперативной деятельности.
### Токен
Единица учета, не являющаяся криптовалютой, предназначенная для оценки стоимости имущества в рамках кооперативной экономики.
### Цифровой Кооператив
Кооператив, документооборот и управление которым осуществляется цифровым способом на Платформе с использованием электронной цифровой подписи (ЭЦП) членов Сообщества.
### ЭЦП
Неквалифицированная электронная цифровая подпись, позволяющая математически установить факт подписи пайщиком юридически значимого документа на Платформе.
### Цифровой Документ
Электронная версия юридически значимого документа, хранящаяся в Распределенной базе данных и подтвержденная ЭЦП членов Сообщества. Имеет такую же юридическую силу, как и его бумажный аналог.
### Блокчейн
Технология производства достоверной информации, обеспечивающая надежное и прозрачное хранение данных с использованием распределенных сетей.
<!--
### Паевой взнос
Вклад, который члены кооператива вносят для обеспечения его финансовой поддержки и участия в его экономической деятельности.
-->
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
function scrollSpy(){var l=5,e=document.querySelector("html"),c=(e&&(e=window.getComputedStyle(e).scrollPaddingTop)&&"string"==typeof e&&"auto"!==e&&e.endsWith("px")&&(l+=parseInt(e.split("px")[0])),"nav-scroll-active"),i=null,d=[];function t(){i=null;var e=document.querySelectorAll("[data-traverse-target]");Array.prototype.forEach.call(e,function(e){d.push({id:e.id,top:e.offsetTop})})}var n=debounce(function(){t(),o()},500),o=debounce(function(){var e,t,n,o,r=(e=>{for(var t=e+l,n=0;n<d.length;n++){var o=d[n+1];if(t>=d[n].top&&(!o||t<o.top))return n}return-1})(document.documentElement.scrollTop||document.body.scrollTop);r!==i&&(r=d[i=r],e=document.querySelector("."+c),t=s(r=r?document.querySelector('#nav a[href="#'+r.id+'"]'):null),n=(o=s(e))!==t,o&&n&&u(o,!1),t&&n&&u(t,!0),r&&(r.classList.add(c),r.scrollIntoViewIfNeeded?r.scrollIntoViewIfNeeded():!r.scrollIntoView||0<=(o=(o=r).getBoundingClientRect()).top&&0<=o.left&&o.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&o.right<=(window.innerWidth||document.documentElement.clientWidth)||r.scrollIntoView({block:"center",inline:"start"})),e)&&e.classList.remove(c)},100);function u(e,t){for(var n=t?"add":"remove";e;)e.classList[n]("nav-scroll-expand"),e=s(e.parentNode)}function s(e){return e&&e.closest?e.closest(".nav-group-section"):null}setTimeout(function(){t(),o(),window.addEventListener("scroll",o),window.addEventListener("resize",n)},300)}function toggleMenu(){var t="drawer-open",e=document.querySelector("#spectaql .sidebar-open-button"),n=document.querySelector("#spectaql #sidebar .close-button"),o=document.querySelector("#spectaql .drawer-overlay");function r(){var e=document.querySelector("#spectaql #page");e.classList.contains(t)?e.classList.remove(t):e.classList.add(t)}e.addEventListener("click",r),n.addEventListener("click",r),o.addEventListener("click",r)}function debounce(e,t){var n=null;return function(){clearTimeout(n),n=setTimeout(function(){e.apply(null)},t)}}window.addEventListener("DOMContentLoaded",e=>{toggleMenu(),scrollSpy()});
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
function scrollSpy(){var l=5,e=document.querySelector("html"),c=(e&&(e=window.getComputedStyle(e).scrollPaddingTop)&&"string"==typeof e&&"auto"!==e&&e.endsWith("px")&&(l+=parseInt(e.split("px")[0])),"nav-scroll-active"),i=null,d=[];function t(){i=null;var e=document.querySelectorAll("[data-traverse-target]");Array.prototype.forEach.call(e,function(e){d.push({id:e.id,top:e.offsetTop})})}var n=debounce(function(){t(),o()},500),o=debounce(function(){var e,t,n,o,r=(e=>{for(var t=e+l,n=0;n<d.length;n++){var o=d[n+1];if(t>=d[n].top&&(!o||t<o.top))return n}return-1})(document.documentElement.scrollTop||document.body.scrollTop);r!==i&&(r=d[i=r],e=document.querySelector("."+c),t=s(r=r?document.querySelector('#nav a[href="#'+r.id+'"]'):null),n=(o=s(e))!==t,o&&n&&u(o,!1),t&&n&&u(t,!0),r&&(r.classList.add(c),r.scrollIntoViewIfNeeded?r.scrollIntoViewIfNeeded():!r.scrollIntoView||0<=(o=(o=r).getBoundingClientRect()).top&&0<=o.left&&o.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&o.right<=(window.innerWidth||document.documentElement.clientWidth)||r.scrollIntoView({block:"center",inline:"start"})),e)&&e.classList.remove(c)},100);function u(e,t){for(var n=t?"add":"remove";e;)e.classList[n]("nav-scroll-expand"),e=s(e.parentNode)}function s(e){return e&&e.closest?e.closest(".nav-group-section"):null}setTimeout(function(){t(),o(),window.addEventListener("scroll",o),window.addEventListener("resize",n)},300)}function toggleMenu(){var t="drawer-open",e=document.querySelector("#spectaql .sidebar-open-button"),n=document.querySelector("#spectaql #sidebar .close-button"),o=document.querySelector("#spectaql .drawer-overlay");function r(){var e=document.querySelector("#spectaql #page");e.classList.contains(t)?e.classList.remove(t):e.classList.add(t)}e.addEventListener("click",r),n.addEventListener("click",r),o.addEventListener("click",r)}function debounce(e,t){var n=null;return function(){clearTimeout(n),n=setTimeout(function(){e.apply(null)},t)}}window.addEventListener("DOMContentLoaded",e=>{toggleMenu(),scrollSpy()});
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -101,4 +101,6 @@ graph BT
Потому, если вы пайщик, и ищите только то, что касается ваших возможностей на платформе, то воспользуйтесь поиском в шапке сайта, введя "Пайщик". Поиск отобразит все страницы, помеченные вашим тегом, что упростит исследование только нужных вам деталей. Аналогично для председателей, членов совета и разработчиков.
Альтернативно, обращайте внимание на заголовки страниц, на каждой из которых есть соответствующие теги. Это поможет не погружаться в то, что вам на текущий момент не нужно.
Альтернативно, обращайте внимание на заголовки страниц, на каждой из которых есть соответствующие теги. Это поможет не погружаться в то, что вам на текущий момент не нужно.
На многих страницах с бизнес-описанием внизу добавлен свёрнутый блок **«Техническая информация для разработчика»**: в нём перечислены соответствующие поля GraphQL (`Query` / `Mutation`) и пространства имён `@coopenomics/sdk`, не смешиваясь с текстом для председателя, совета или пайщика. Раскрывайте блок только при работе с API или интеграцией.
-80
View File
@@ -1,80 +0,0 @@
# Справка
Данная справка предназначена для руководителей потребительских кооперативов. Справка описывает процесс удаленной регистрации пайщиков в потребительском кооперативе с выпуском цифрового удостоверения (карты) пайщика, позволяющей перевести документооборот в электронную форму.
Процесс удаленной регистрации в кооперативе для ознакомления можно пройти самостоятельно на [https://testnet.copenomics.world](https://testnet.copenomics.world).
???+ note "Ключ доступа"
Для входа в качестве члена совета воспользуйтесь следующими данными:
- Идентификатор пользователя: vtdwpiojgfpl
- Ключ доступа: 5J3NoZNQZQxEV7auYUoWG76PW5E9eMbjA1wGVdJSBjBjS7BqVuj
Удаленная регистрация пайщика начинается с того, что он переходит на страницу регистрации в Вашем кооперативе.
![Untitled](assets/spravka/1.png)
## Решение совета
Членам совета для принятия любого решения, необходимо войти в свои кабинеты и произвести голосование по автоматически-сформированной повестке.
Голосование осуществляется с помощью нажатия кнопок - За (зеленый палец вверх) или Против (красный палец вниз). Член совета автоматически считается воздержавшимся, если не принимает участия в голосовании.
![Untitled](assets/spravka/12.png)
Детали каждого заявления перед голосованием можно (и нужно) развернуть, нажав на зеленый плюсик слева от повестки перед голосованием.
![Untitled](assets/spravka/13.png)
Каждое заявление можно скачать в PDF формате и использовать как юридически-значимый документ. Контрольная сумма документа рассчитывается в момент заполнения заявления с использованием собственноручной подписи на нём. За счёт чего устанавливается алгоритмическая связь между человеком, оставившим свою собственноручную подпись, и простой электронной подписью, которую он получил.
И с этого момента все документы, которые подписывает пайщик своей электронной подписью, считаются легитимными в кооперативе, ровно такими же, как и заполненные ручкой на бумаге. Любой контролирующий орган, которому предоставлен этот документ с электронной подписью, Вы, члены Совета, или сам пайщик, могут проверить документ и убедиться в том, что именно этот документ был подписан с помощью ключа, который принадлежит именно этому пайщику. Проверка осуществляется с помощью выполнения расчета хэш-суммы из скаченного документа и восстановления публичного ключа из цифровой подписи. Публичный ключ соответствует приватному ключу пайщика и хранится в блокчейне с момента его регистрации.
![Untitled](assets/spravka/14.png)
После того, как решение советом принято, председателю необходимо утвердить его. Для утверждения решения, ему необходимо нажать в квадратик для галочки под заголовком “утверждено”:
![Untitled](assets/spravka/15.png)
Сразу после утверждения решения председателем, оно будет исполнено - новому пайщику будет создан лицевой счёт в Вашем кооперативе, он получит удостоверение пайщика и доступ в кошелёк.
![Untitled](assets/spravka/16.png)
## Реестр документов
После того, как решение принято, соответствующая пачка документов появятся в разделе “Документы”. Каждая пачка включает в себя: заявление, решение, и в некоторых случаях - акты.
![Untitled](assets/spravka/17.png)
Каждая пачка документов может быть развернута нажатием на зеленый плюсик слева. При развороте все документы с соответствующими цифровыми подписями действующих лиц будут представлены для просмотра, скачивания и проверки.
![Untitled](assets/spravka/18.png)
![Untitled](assets/spravka/19.png)
## Реестр пайщиков
Раздел “Пайщики” позволяет детально просмотреть пайщиков кооператива и пачки документы каждого из них. Каждая пачка также может быть развернута в заявление, решение и акты, доступные к скачиванию и проверке.
![Untitled](assets/spravka/20.png)
## Дополнительно
Программное обеспечение поставляется Потребительским Кооперативам по WHITE LABEL - сайт запускается на вашем домене, все наименования и названия сменяются на Ваши. Каждый сайт работает как PWA-приложение, устанавливающееся на рабочий стол мобильного телефона.
Данное программное обеспечение формирует программную среду кооперативной экономики и является системообразующей платформой. В основе платформы лежит технология блокчейн и кооперативные смарт-контракты для: регистрации пайщиков, поставки-приобретения имущества, коллективного и розничного пользования имуществом, кооперативного инвестирования и спонсирования в имущество.
Основные дополнительные (планируемые) возможности платформы:
- Быстрая регистрация/вход пайщиков в кооперативы с помощью цифрового удостоверения.
- Бесшовная передача документов от кооператива к кооперативу.
- Формирование бухгалтерской отчетности для передачи в контролирующие органы.
- Голосование совета по произвольным повесткам.
- Образование кооперативных участков и управление ими.
- Общие собрания пайщиков / уполномоченных онлайн, по графику и внеочередные.
- Стандартизированная методология кооперации в кооперативных смарт-контрактах.
- Документация, SDK и API для интеграции действующих и создания новых интерфейсов для кооперации.
-104
View File
@@ -1,104 +0,0 @@
# ИНВЕСТИЦИОННОЕ ПРЕДЛОЖЕНИЕ
Кооперативы – это народные организации, в которых нет частной прибыли, но есть общая и личная выгода. Кооперативы существуют для удовлетворения потребностей их участников. В кооперативах нет продаж, но есть вклады и возвраты вкладов в виде денег и имущества. Это приводит к снижению налоговой нагрузки, стоимости товаров и услуг, и увеличению их качества.
ПК «Восход» разрабатывает цифровую платформу автоматизации документооборота для потребительских, производственных и сельхозяйственных кооперативов, которая включает:
- Блокчейн-среду для кооперативных смарт-контрактов под управлением участников;
- Стандартизированный пакет юридических документов для кооперации, которые автоматически заполняются при выполнении действий участниками в смарт-контрактах;
- Цифровой кошелёк и Удостоверение Пайщика для авторизации участников между кооперативами;
- Магазин приложений для поставки-приобретения, аренды и инвестиций в результаты деятельности кооперативов платформы;
- API для подключения действующих кооперативов к платформе;
Что позволит кооперативам:
- Дистанционно принимать и исключать пайщиков, вести реестры пайщиков и их документов с возможностью выгрузки;
- Автоматически формировать бухгалтерскую отчетность в 1C для отправки в контролирующие органы;
- Проводить удаленные голосования пайщиков и членов Совета с автоматическим созданием Протоколов и исполнением решений.
- Вести учет вступительных, членских и паевых взносов, их целевого использования и возврата.
- Выбирать и подключать сайты/приложения для удовлетворения потребностей пайщиков в потреблении качественных продуктов локальных производителей (__маркетплейсы__), в привлечении инвестиций (__краудинвестинг__ и __краудфандинг__) в локальных производителей, и совместной деятельности по производству продуктов (__краудсорсинг__).
- Разрабатывать кооперативные приложения, основанные на стандартизированных кооперативных смарт-контрактах и поставлять их кооперативам платформы с получением выгоды в виде членских взносов участников (__маркетплейс кооперативных приложений__);
- Автоматически подключаться во все новые приложения, которые применяют стандартизированные кооперативные смарт-контракты.
ПК «Восход» получает членские взносы за пользование сервисом документооборота:
- Регистрация нового пайщика – 10 рублей;
- Проведение одной операции целевого кооперативного контракта – 20 рублей.
В настоящее время в разработку платформы пайщиками ПК "Восход" вложено 25 млн. рублей – денежными средствами и результатами интеллектуальной деятельности в паевой фонд (складочный капитал). Для дальнейшей разработки последующих этапов платформы требуется 18 млн. руб.:
- для подготовки, запуска и тестирования Бета-версии Цифровой Платформы с минимально необходимым набором сервисов;
- организации деятельности выбранных для Бета-тестирования кооперативов и доработки Цифровой Платформы до рабочей версии масштабирования согласно экономической модели.
```mermaid
gantt
title Дорожная карта ПК «Восход» до 2025-06-01
dateFormat YYYY-MM-DD
Активные исследования :done, 2023-01-01, 180d
Бизнес-моделирование :done, 2023-06-01, 2023-12-01
Альфа-версия :done, 2023-08-12, 2023-12-20
Блокчейн-протокол: crit, 2023-12-20, 2025-06-01
Бета-версия: active, 2023-12-20, 2025-06-01
Кабинет Совета: milestone, 2024-06-19, 2024-06-22
Цифровой Кошелёк: milestone, 2024-06-19, 2024-06-22
Первые подключения: active, 2024-06-20, 2024-09-20
Приложение маркетплейса: milestone, 2024-08-01, 2024-08-01
1C-интеграция: milestone, 2024-09-01, 2024-09-01
Активные подключения: active, 2024-09-20, 2025-06-01
Приложение краудинвестинга: milestone, 2024-10-01, 2024-10-01
Приложение краудсорсинга: milestone, 2025-01-01, 2025-01-01
Магазин кооперативных приложений: milestone, 2025-06-01, 2025-06-01
API и документация: active, 2023-10-12, 2025-06-01
```
## Механизм возврата
(на примере 100 тыс. руб.)
Пайщик-инвестор вносит в ПК "Восход"»" денежные средства и становится совладельцем Цифровой платформы. 100 т.р. - минимальный паевой взнос.
ПК "Восход" использует денежные средства для разработки цифровой платформы. По мере разработки цифровой платформы возникают дополнительные результаты интеллектуальной деятельности (РИД), которые капитализируются у всех пайщиков, в том числе и у пайщиков-инвесторов, в зависимости от времени инвестирования:
| Внесение инвестиций (паевого взноса) деньгами | Сумма, тыс. руб | Расчетная капитализация | Расчет паевого взноса к возврату, тыс. руб |
| --------------------------------------------- | --------------- | ----------------------- | --------------------------------------- |
| В июне 2024 | 100 | 239% | 239 |
| В июле 2024 | 100 | 205% | 205 |
| В августе 2024 | 100 | 182% | 182 |
| В сентябре 2024 | 100 | 166% | 166 |
| В октябре 2024 | 100 | 153% | 153 |
| В ноябре 2024 | 100 | 142% | 142 |
Таким образом, на 18 млн. рублей складочного капитала, который требуется для создания минимальной рабочей бета-версии платформы, будет добавлено дополнительных паевых взносов РИД – 14.6 млн. рублей, таким образом, создав для пайщиков-инвесторов общую сумму для возвратов 32.6 млн рублей. И, кроме этого, будет создано и внесено РИД пайщиками-разработчиками на сумму 86.6 млн. рублей. Всего складочный капитал, включая пайщиков-разработчиков, составит 119.2 млн. рублей.
В сентябре 2024 года мы планируем активное подключение кооперативов и кооперативных участков к платформе. Всего за 1 год планируется подключить 2000 кооперативов с общей численностью 2 млн. пайщиков. По мере поступления оплаты от кооперативов за пользование сервисами платформы, всем пайщикам будут производиться выплаты - возвраты паевых взносов. Все возвраты будут произведены до конца февраля 2026 года в общей сумме 119.248 млн. рублей.
График расчета поступления оплаты за сервис и возвратов паевых взносов представлен на Рис. 1.
<figure markdown="span">
![invest_graph.png](assets/invest_graph.png)
<figcaption>Рис. 1</figcaption>
</figure>
## Как совершить вклад
По вопросу совершения вкладов свяжитесь с нами через [контакты](/contacts).
Binary file not shown.
@@ -1,43 +0,0 @@
# Установка и запуск MONO
После подключения к платформе Кооперативной Экономики и завершения процедуры вступления в ПК «ВОСХОД» ваша система MONO готова к работе. В зависимости от выбранного варианта размещения — на серверах ПК «ВОСХОД» или на собственной инфраструктуре — процесс запуска может различаться.
## Автоматическое развёртывание на серверах ПК «ВОСХОД»
При использовании хостинга ПК «ВОСХОД» (который временно предоставляется бесплатно) система развёртывается полностью автоматически. После делегирования вашего домена на предоставленный IP-адрес на серверах запускаются необходимые контейнеры MONO, и на вашем домене появляется интерфейс завершения установки.
Этот вариант обеспечивает полную техническую поддержку, автоматические обновления системы и резервное копирование данных. Вам не нужно заботиться о технических аспектах — достаточно завершить настройку кооператива через веб-интерфейс.
## Самостоятельное развёртывание
Если вы решили использовать собственную инфраструктуру, потребуется Linux-сервер с минимум 4 ГБ RAM, 50 ГБ дискового пространства и статическим IP-адресом. Самостоятельная установка требует опыта администрирования серверов и включает клонирование репозитория из GitHub, настройку окружения и запуск установочных скриптов.
Подробные технические инструкции доступны в [документации для разработчиков](../../documentation/install.md). Важно понимать, что при самостоятельном развёртывании вы берёте на себя ответственность за обслуживание системы, установку обновлений и обеспечение безопасности.
## Первоначальная настройка системы
После технического развёртывания вы получаете доступ к рабочему столу вашего кооператива. Для входа используется тот же приватный ключ, который применялся при регистрации в ПК «ВОСХОД» — это обеспечивает единую систему аутентификации и безопасности.
**Приватный ключ является вашей цифровой подписью** и должен храниться в абсолютной безопасности. Никому его не передавайте — это ключ к управлению всем кооперативом в цифровой среде.
После первого входа система проведёт вас через процесс базовой настройки: внесение данных совета кооператива, настройку основных параметров организации, конфигурацию уведомлений и выбор необходимых приложений для работы. Рекомендуется сначала настроить совет — это позволит другим членам совета помочь с дальнейшей настройкой системы.
## Интеграция с существующими системами
MONO предоставляет API и TypeScript SDK для интеграции с действующими сайтами и мобильными приложениями. Это позволяет встроить функционал кооперативной платформы в уже существующую IT-инфраструктуру без необходимости полной замены.
Если у вас уже есть действующие пайщики, их можно перенести в систему через API или интерфейс рабочего стола. Пайщики получат уведомления по email с приглашением получить электронную подпись, при этом повторное оформление документов не требуется.
<!--
## Поддержка и решение проблем
Техническая поддержка ПК «ВОСХОД» работает в рабочие дни с 9:00 до 18:00 МСК и отвечает на обращения в течение 24 часов. Помимо прямой технической поддержки доступны видео-уроки в личном кабинете, регулярные вебинары для руководителей и форум сообщества кооператоров для обмена опытом.
При возникновении проблем с загрузкой системы сначала проверьте корректность делегирования домена и обновление DNS-записей. Если система не загружается или возникают ошибки входа, попробуйте обновить страницу браузера, очистить кэш или использовать другой браузер. При сохранении проблем обратитесь в техническую поддержку с подробным описанием ситуации. -->
---
**Следующие шаги:**
- Изучите [стоимость использования](pricing.md) платформы
- Приступайте к [настройке кооператива](../cooperative-management/cooperative-settings/settings-management.md)
@@ -1,56 +0,0 @@
# Подключение к платформе Кооперативной Экономики
Подключение к основной сети платформы Кооперативной Экономики включает несколько этапов, каждый из которых обеспечивает юридическую и техническую готовность вашего кооператива к работе с системой.
## Обязательные условия подключения
Для работы в основной сети платформы Кооперативной Экономики необходимо выполнить два обязательных условия:
**Членство в Союзе Потребительских Обществ «РУСЬ»** — это гарантирует наличие у вашего кооператива корректного базового электронного документооборота и обеспечивает юридическую поддержку по всем кооперативным вопросам. Союз «РУСЬ» предоставляет базовый документооборот, а также стандартизированные тексты целевых потребительских программ, которые должны быть приняты в вашем кооперативе для использования платформы.
**Членство в ПК «ВОСХОД»** — как оператора платформы, который обеспечивает техническую инфраструктуру и управляет оборотом утилити-токена AXON для оплаты вычислительных ресурсов блокчейна.
## Вступление в ПК «ВОСХОД»
Процесс вступления в Потребительский Кооператив «ВОСХОД» происходит полностью в электронном виде через личный кабинет. Для получения ссылки на регистрацию необходимо заполнить форму в разделе ["Подключение"](../../connect.md) на данном сайте.
После получения ссылки процедура вступления включает:
**Заполнение электронного заявления** с указанием всех необходимых данных вашего кооператива. Заявление подписывается собственноручно — пальцем по экрану телефона, трекпадом или мышкой на компьютере, что создает юридически значимую простую электронную подпись.
**Оплата взносов** составляет 4000 рублей для организаций (вступительный и минимальный паевой взнос). Оплата производится через банковские карты или другие доступные способы платежа прямо в личном кабинете.
## Подписание соглашения о подключении
После успешной регистрации в ПК «ВОСХОД» в меню личного кабинета появляется раздел "Подключение". Здесь необходимо ознакомиться с соглашением о подключении к платформе Кооперативной Экономики и подписать его электронной подписью нажатием соответствующей кнопки.
В процессе подписания соглашения необходимо указать:
- **Суммы вступительного и минимального паевых взносов** для организаций и физических лиц в вашем кооперативе
- **Домен или поддомен**, на который должна быть установлена ваша копия MONO
!!! note "Самостоятельный запуск"
Каждый кооператив может самостоятельно запустить программное обеспечение MONO на своих серверах после того, как станет пайщиком ПК «ВОСХОД» и подпишет соглашение о подключении к платформе.
## Техническое развёртывание системы
Если ПК «ВОСХОД» предоставляет сервис хостинга для вашего кооператива (что в настоящее время временно предоставляется бесплатно), вам необходимо **делегировать имя домена** на предоставленный IP-адрес. Это делается через панель управления DNS у вашего регистратора домена.
После делегирования домена на сервере ПК «ВОСХОД» автоматически запускаются контейнеры MONO, и на вашем домене появляется интерфейс завершения установки кооператива.
## Завершение установки кооператива
Финальный этап требует участия уполномоченного лица вашего кооператива. С помощью **ключа установки**, который соответствует ключу пайщика в ПК «ВОСХОД» (используется тот же ключ для проверки прав доступа), необходимо внести данные членов совета кооператива в систему.
После внесения данных совета система автоматически отправляет на указанные электронные адреса приглашения получить простую электронную подпись и подписать ею положения о целевых потребительских программах, которые используются на платформе.
**Выдача подписей происходит уже на сайте нового кооператива.** Сразу после получения подписей всеми членами совета система становится полностью готовой к использованию — можно принимать регистрации новых пайщиков, проводить собрания совета, обрабатывать платежи и выполнять все остальные функции управления кооперативом.
## О стоимости использования
Стоимость использования платформы рассчитывается по прозрачной формуле на основе фактического потребления ресурсов вашим кооперативом. Базовый пакет составляет 1500 рублей в месяц и включает хостинг, техническую поддержку и базовую квоту операций.
Подробная информация о компонентах стоимости, формулах расчета и примерах представлена в разделе [«Стоимость использования»](pricing.md).
---
**Следующий шаг:** Изучите процесс [установки и запуска](installation.md) системы
@@ -1,147 +0,0 @@
# Стоимость использования платформы
Общие затраты на внедрение платформы Кооперативной Экономики включают первоначальные расходы на подключение и ежемесячную стоимость использования системы.
## Первоначальные затраты на подключение
Перед началом использования платформы необходимо внести обязательные взносы в структуры, обеспечивающие юридическую и техническую поддержку системы.
### Членство в ПК «ВОСХОД» — 4000 рублей
**Вступительный и минимальный паевой взнос** в Потребительский Кооператив «ВОСХОД» составляет 4000 рублей для организаций. ПК «ВОСХОД» является оператором платформы и обеспечивает:
- Техническую инфраструктуру блокчейна
- Управление утилити-токеном AXON
- Хостинг и техническую поддержку (временно бесплатно)
- Доступ к платформе и основному функционалу
### Членство в СПО «РУСЬ» — 53500 рублей
**Подготовка базового документооборота** через Союз Потребительских Обществ «РУСЬ» стоит 53500 рублей. СПО «РУСЬ» предоставляет:
- Базовый электронный документооборот для кооперативов
- Стандартизированные тексты целевых потребительских программ
- Юридическую поддержку по кооперативному законодательству
- Методическое сопровождение деятельности кооператива
### Итоговые первоначальные затраты
**При наличии действующего членства в СПО «РУСЬ»:** 4000 рублей (только ПК «ВОСХОД»)
**При отсутствии членства в СПО «РУСЬ»:** 57500 рублей (53500 + 4000)
!!! info "Обязательное условие"
Членство в СПО «РУСЬ» является обязательным условием для работы в основной сети платформы Кооперативной Экономики. Если ваш кооператив уже является членом Союза «РУСЬ», дополнительные взносы не требуются.
## Ежемесячная стоимость использования
Стоимость использования платформы Кооперативной Экономики состоит из базового пакета услуг и дополнительных расходов при превышении включенных лимитов.
### Базовый пакет: 1500 рублей в месяц
**Ежемесячная подписка в 1500 рублей включает:**
- **50 новых пайщиков** (стоимость 500 рублей)
- **100 пакетов документов** (стоимость 1000 рублей)
- Хостинг на серверах ПК «ВОСХОД» (временно бесплатно)
- Техническую поддержку и обслуживание
- Доступ к базовому функционалу платформы
Если ваш кооператив регистрирует менее 50 новых пайщиков и создает менее 100 пакетов документов в месяц, дополнительная плата не взимается.
### Дополнительные расходы при превышении лимитов
При превышении базовых лимитов действует следующая тарификация:
**Общая дополнительная стоимость = A + (D - 50) × 10 + (G - 100) × 10** (в рублях)
Где:
- **A** — стоимость подключенных приложений из магазина приложений
- **D** — количество новых пайщиков свыше 50 в месяц
- **G** — количество пакетов документов свыше 100 в месяц
### Компоненты дополнительной стоимости
**Приложения из магазина (A)**
Каждое приложение в магазине имеет установленную разработчиком стоимость членского взноса. При подключении приложения эта сумма добавляется к ежемесячной стоимости. Оплаты направляются транзитом через ПК «ВОСХОД» непосредственно разработчикам приложений.
**Дополнительные пайщики (×10 рублей)**
За каждого нового пайщика сверх 50 в месяц взимается 10 рублей. Эта стоимость покрывает создание аккаунта в блокчейне, генерацию криптографических ключей и настройку доступа к системе.
**Дополнительные пакеты документов (×10 рублей)**
За каждый пакет документов сверх 100 в месяц взимается 10 рублей. **Пакет документов** — это завершенная операция кооператива согласно целевой потребительской программе. Например, операция "поставка-приобретение имущества на маркетплейсе" включает:
- Заявление пайщика на заказ
- Заявление пайщика на поставку
- Два протокола решения совета
- Два акта приёма-передачи имущества
Их формирование сопровождается использованием вычислительных ресурсов блокчейна, и один такой пакет документов стоит 10 рублей.
### Токены AXON и оплата ресурсов
**Курс токена:** 1 AXON = 10 рублей
Токены AXON используются для оплаты вычислительных ресурсов блокчейна. В рамках базового пакета все необходимые токены предоставляются автоматически. При превышении лимитов дополнительные токены приобретаются по указанному курсу.
**Оплата за регистрацию пайщиков и пакеты документов** — направляется делегатам сети, которые предоставляют вычислительные мощности для работы платформы Кооперативной Экономики.
!!! info "Подробности платформы"
Детальное описание правил распределения платежей и работы с делегатами представлено в документации платформы на [coopenomics.world](https://coopenomics.world) и выходит за рамки документации MONO.
## Примеры расчета стоимости
### Небольшой кооператив (уже член СПО «РУСЬ»)
**Первоначальные затраты:** 4000 рублей (только ПК «ВОСХОД»)
**Ежемесячное использование:**
- Новые пайщики: 5 в месяц (в пределах лимита 50)
- Пакеты документов: 20 в месяц (в пределах лимита 100)
- Приложения: базовые (0 рублей)
**Ежемесячная стоимость:** 1500 рублей (только базовый пакет)
### Активный кооператив (не член СПО «РУСЬ»)
**Первоначальные затраты:** 57500 рублей (53500 в СПО «РУСЬ» + 4000 в ПК «ВОСХОД»)
**Ежемесячное использование:**
- Новые пайщики: 65 в месяц (65 - 50 = 15 сверх лимита)
- Пакеты документов: 180 в месяц (180 - 100 = 80 сверх лимита)
- Приложения: 1500 рублей
**Расчет дополнительной стоимости:**
- Базовый пакет: 1500 рублей
- Приложения: 1500 рублей
- Дополнительные пайщики: 15 × 10 = 150 рублей
- Дополнительные пакеты: 80 × 10 = 800 рублей
**Итого в месяц: 1500 + 1500 + 150 + 800 = 3950 рублей**
### Стартующий кооператив (уже член СПО «РУСЬ»)
**Первоначальные затраты:** 4000 рублей (только ПК «ВОСХОД»)
**Ежемесячное использование:**
- Новые пайщики: 50 в месяц (в пределах лимита 50)
- Пакеты документов: 100 в месяц (в пределах лимита 100)
- Приложения: базовые (0 рублей)
**Ежемесячная стоимость:** 1500 рублей (только базовый пакет)
## Прозрачность расчетов
Все операции в системе фиксируются в блокчейне, что обеспечивает полную прозрачность расчетов. Количество новых пайщиков и созданных пакетов документов автоматически подсчитывается системой и отображается в личном кабинете.
**Детальная отчетность доступна в режиме реального времени:**
- Количество зарегистрированных пайщиков за текущий месяц
- Число созданных пакетов документов по типам операций
- Использование базовых лимитов и превышения
- Стоимость подключенных приложений
Все расчеты основаны на фактическом использовании вычислительных ресурсов блокчейна и доступны для независимого аудита через открытые протоколы платформы.
---
**Следующие шаги:**
- Изучите процесс [установки и запуска](installation.md) системы
- Ознакомьтесь с процедурой [подключения к платформе](platform-connection.md)
- Попробуйте [демо-версию](demo.md) перед принятием решения
@@ -1,53 +0,0 @@
# Что такое MONO
Добро пожаловать в MONO — систему управления кооперативными отношениями (Cooperative Relationship Management), которая автоматизирует основной документооборот потребительских кооперативов и существенно упрощает управление организацией.
<!-- !!! info "Модуль бухгалтерского учёта"
Система MONO включает модуль бухгалтерского учёта, который обеспечит полную автоматизацию учетных процессов. В настоящее время модуль находится в разработке. -->
## Основные возможности MONO
MONO представляет собой комплексную платформу для управления потребительскими кооперативами с поддержкой всех основных бизнес-процессов. Система обеспечивает цифровой документооборот, автоматизированное принятие решений и прозрачную финансовую отчётность.
**Управление пайщиками:** Централизованный реестр участников с историей взаимодействий, автоматической обработкой заявлений на вступление и выход, ведением персональных папок документов и уведомлениями о важных событиях.
**Цифровой документооборот:** Создание, подписание и хранение всех документов кооператива в электронном виде с использованием простой электронной подписи, автоматическая генерация протоколов собраний и решений совета.
**Финансовая прозрачность:** Отслеживание всех финансовых операций в реальном времени, автоматическое распределение поступлений по программам кооператива, прозрачная отчётность для пайщиков и контролирующих органов.
**Собрания и голосования:** Организация собраний совета кооператива в цифровом формате, голосование по вопросам повестки с фиксацией результатов в блокчейне, автоматическое формирование протоколов.
## Техническая архитектура
MONO построена на современных технологиях с использованием блокчейна для обеспечения неизменности и прозрачности документооборота. Все критически важные операции — решения совета, финансовые транзакции, изменения в составе пайщиков — записываются в распределённый реестр, что исключает возможность фальсификации данных и упрощает взаимный обмен данными между кооперативами в единой сети.
**Блокчейн-инфраструктура:** Документы кооператива хранятся в анонимизированном виде в блокчейне, обеспечивая их неизменность и возможность независимой верификации. Персональные данные пайщиков защищены и обрабатываются в соответствии с требованиями 152-ФЗ.
**Открытый исходный код:** MONO является свободным программным обеспечением с открытым исходным кодом, что обеспечивает прозрачность работы системы и возможность независимого аудита безопасности.
**Безопасность данных:** Система использует криптографическую защиту всех операций с беспрецедентным уровнем надёжности. Каждый участник кооператива имеет уникальные криптографические ключи для подписания документов, которые не хранятся и не передаются в открытом виде.
## Подключение к платформе Кооперативной Экономики
MONO является частью более широкой экосистемы — платформы Кооперативной Экономики, которая объединяет кооперативы в единую сеть для обмена ресурсами и взаимодействия.
Подключение к основной сети платформы требует членства в ПК «ВОСХОД» — операторе платформы, который обеспечивает техническую инфраструктуру и управляет оборотом утилити-токена AXON для оплаты вычислительных ресурсов блокчейна.
Также необходимо членство в Союзе Потребительских Обществ «РУСЬ», который предоставляет базовый документооборот и юридическую поддержку по кооперативному законодательству.
## Преимущества для кооперативов
**Снижение административной нагрузки:** Автоматизация рутинных процессов освобождает руководство кооператива для стратегических задач, сокращает время на оформление документов и принятие решений.
**Повышение прозрачности:** Все операции кооператива доступны для просмотра пайщиками в реальном времени, что повышает доверие участников и соответствует принципам кооперативной демократии.
**Соответствие законодательству:** Система автоматически обеспечивает соблюдение требований законодательства о потребительской кооперации, ведёт необходимую отчётность и документооборот.
**Масштабируемость:** MONO подходит как для небольших местных кооперативов, так и для крупных межрегиональных объединений, автоматически адаптируясь к размеру и специфике организации.
---
**Следующие шаги:**
- Изучите процесс [подключения к платформе](platform-connection.md)
- Ознакомьтесь со [стоимостью использования](pricing.md)
- Попробуйте [демо-версию](demo.md) системы
@@ -1,89 +0,0 @@
# Рабочие столы
MONO построена на концепции **рабочих столов** — специализированных интерфейсов, каждый из которых предназначен для выполнения определённых задач в рамках управления кооперативом.
## Что такое рабочий стол
**Рабочий стол** — это композитное приложение, состоящее из одного или нескольких специализированных мини-приложений. Каждая кнопка в меню рабочего стола представляет собой отдельное мини-приложение с определённой функциональностью.
Например, стол совета объединяет мини-приложения для работы с повесткой, реестрами пайщиков, документами и собраниями. При этом каждое из этих мини-приложений имеет свой интерфейс и набор функций.
## Базовые рабочие столы
В MONO по умолчанию доступны три основных рабочих стола:
### Стол пайщика
Базовый рабочий стол, доступный всем зарегистрированным пайщикам кооператива. Включает мини-приложения для:
- Управления личным кошельком и балансом
- Работы с профилем и настройками
- Просмотра документов и заявлений
- Отслеживания платежей и взносов
- Участия в собраниях кооператива
- Просмотра контактной информации
### Стол совета
Специализированный рабочий стол для членов совета кооператива. Предоставляет мини-приложения для:
- Ведения повестки совета и голосований
- Управления реестром пайщиков
- Контроля документооборота
- Мониторинга платежей и финансовых операций
- Организации и проведения собраний
### Стол председателя
Административный рабочий стол с максимальными правами доступа. Позволяет через мини-приложения:
- Управлять расширениями и приложениями
- Настраивать состав совета кооператива
- Конфигурировать кооперативные участки и фонды
- Устанавливать размеры паевых взносов
- Управлять контактной информацией кооператива
## Система ролей и доступа
Доступ к рабочим столам определяется ролью пользователя в кооперативе:
- **Пайщик** — доступен стол пайщика и другие столы с уровнем доступа **Пайщик**
- **Член совета** — доступны столы пайщика и стол совета
- **Председатель** — доступны рабочие столы кооператива
Переключение между доступными рабочими столами осуществляется через меню в верхней части интерфейса.
## Приложения и расширение функциональности
Помимо базовых рабочих столов, функциональность MONO может расширяться через **приложения** — специальные модули, которые добавляют новые рабочие столы или мини-приложения.
### Принцип работы приложений
Приложение может создавать один или несколько дополнительных рабочих столов, обслуживающих определённую целевую потребительскую программу или бизнес-процесс. Например:
**Приложение маркетплейса** добавляет:
- **Стол заказов** — для поиска и заказа имущества
- **Стол поставок** — для модерации и управления предложениями на поставку
Каждый из этих столов предоставляет специализированный интерфейс для своих задач, но они объединены общей бизнес-логикой приложения маркетплейса.
### Магазин приложений и управление
**Председатель кооператива** в магазине расширений выбирает приложения для установки. Базовый стол пайщика присутствует всегда, а дополнительные рабочие столы от приложений могут быть:
- Включены для всех пайщиков
- Доступны только определённым группам согласно настройкам
- Активированы индивидуально по приглашениям
## Текущее состояние и развитие
**Сейчас** MONO поставляется с готовыми решениями — конструктора рабочих столов нет, мини-приложения внутри столов также предопределены. Однако архитектура системы позволяет гибко развивать эту функциональность.
**В будущем** планируется:
- Конструктор рабочих столов для настройки под нужды кооператива
- Расширенный магазин приложений для выбора и установки нужных модулей
- Возможность создания собственных приложений и их интеграции
Такая архитектура обеспечивает баланс между готовыми решениями для быстрого старта и гибкостью для развития уникальных потребностей каждого кооператива.
---
**Следующие шаги:**
- Изучите описание [столов председателя и совета](../../workspace-management/) для понимания их функций
- Ознакомьтесь с [установкой и запуском](installation.md) системы
- Приступайте к [настройке кооператива](../../cooperative-management/cooperative-settings/settings-management.md)
@@ -1 +0,0 @@
# Добавить администратора
@@ -1 +0,0 @@
# Удалить администратора
@@ -1 +0,0 @@
# Добавить администратора
@@ -1,158 +0,0 @@
# Настройка уведомлений
Система уведомлений обеспечивает своевременное информирование всех участников кооператива о важных событиях и необходимых действиях.
## Типы уведомлений
### Для пайщиков
- **Статус заявлений** - изменения в рассмотрении документов
- **Платежи** - подтверждения оплат и запросы на доплату
- **Собрания** - приглашения на общие собрания
- **Программы** - информация о новых целевых программах
### Для совета
- **Новые заявления** - поступление документов на рассмотрение
- **Голосования** - напоминания о необходимости проголосовать
- **Финансовые операции** - крупные транзакции и движения средств
- **Системные события** - изменения в настройках, ошибки
<figure markdown="span">
![Типы уведомлений]()<!-- Скриншот: Список типов уведомлений в настройках -->
<figcaption>Классификация уведомлений по категориям</figcaption>
</figure>
## Каналы доставки уведомлений
### Email уведомления
- **Настройка SMTP** - подключение почтового сервера кооператива
- **Шаблоны писем** - кастомизация дизайна и содержания
- **Списки рассылки** - автоматическое формирование получателей
Настройка email сервера:
```
SMTP сервер: smtp.ваш-кооператив.ru
Порт: 587 (TLS) или 465 (SSL)
Аутентификация: имя пользователя и пароль
```
### SMS уведомления
- **Интеграция с SMS-провайдером** - подключение сервиса массовых рассылок
- **Шаблоны сообщений** - краткие информативные тексты
- **Приоритетные уведомления** - критически важные сообщения
### Push-уведомления
- **Веб-уведомления** - для работы в браузере
- **Мобильные уведомления** - через PWA приложение
- **Настройка частоты** - группировка уведомлений
<figure markdown="span">
![Каналы уведомлений]()<!-- Скриншот: Настройка каналов доставки -->
<figcaption>Конфигурация каналов доставки уведомлений</figcaption>
</figure>
## Настройка автоматических уведомлений
### Для документооборота
- **При подаче заявления** - немедленное уведомление совета
- **Через 24 часа бездействия** - напоминание о необходимости рассмотрения
- **При принятии решения** - уведомление заявителя об итогах
- **При требовании подписи** - напоминание о необходимости подписать документ
### Для финансовых операций
- **При поступлении платежа** - подтверждение оплаты пайщику
- **При просрочке платежа** - напоминание о задолженности
- **При крупных операциях** - уведомление председателя и совета
- **Ежемесячные отчеты** - сводка по движению средств
### Для собраний
- **За 7 дней до собрания** - предварительное уведомление
- **За 24 часа до собрания** - финальное напоминание
- **В день собрания** - напоминание за 2 часа до начала
- **По итогам собрания** - протокол всем участникам
<video controls>
<source src="" type="video/mp4"><!-- Видео: Настройка автоматических уведомлений -->
Пошаговая настройка автоматических уведомлений
</video>
## Персональные настройки уведомлений
### Для каждого пайщика
Пайщики могут самостоятельно настраивать:
- Предпочитаемые каналы получения уведомлений
- Частоту получения сводок
- Отключение неприоритетных уведомлений
- Временные рамки доставки (не беспокоить ночью)
### Для членов совета
- **Критические уведомления** - всегда доставляются немедленно
- **Рабочие уведомления** - в рабочие часы
- **Сводки** - ежедневные или еженедельные
- **Дублирование** - важные уведомления через несколько каналов
<figure markdown="span">
![Персональные настройки]()<!-- Скриншот: Интерфейс персональных настроек -->
<figcaption>Интерфейс персональных настроек уведомлений</figcaption>
</figure>
## Шаблоны уведомлений
### Стандартные шаблоны
Система предоставляет готовые шаблоны для:
- Подтверждения регистрации
- Уведомлений о платежах
- Приглашений на собрания
- Отчетов о решениях совета
### Кастомизация шаблонов
- **Брендинг** - логотип и цвета кооператива
- **Персонализация** - обращение по имени
- **Юридическая информация** - реквизиты и подписи
- **Мультиязычность** - поддержка нескольких языков
## Аналитика уведомлений
### Статистика доставки
- **Показатели доставки** - процент успешно доставленных уведомлений
- **Время доставки** - среднее время от отправки до получения
- **Ошибки доставки** - анализ причин недоставки
- **Активность пользователей** - открытие и чтение уведомлений
### Оптимизация
- **A/B тестирование** - сравнение эффективности разных шаблонов
- **Анализ времени** - определение оптимального времени отправки
- **Частотный анализ** - предотвращение спама
- **Обратная связь** - учет пожеланий пользователей
<figure markdown="span">
![Аналитика уведомлений]()<!-- Скриншот: Дашборд аналитики -->
<figcaption>Дашборд аналитики системы уведомлений</figcaption>
</figure>
## Устранение неполадок
### Частые проблемы
- **Уведомления не доходят** - проверка настроек провайдера
- **Уведомления в спаме** - настройка SPF/DKIM записей
- **Задержка доставки** - проверка очередей обработки
- **Неккоректное отображение** - проблемы с шаблонами
### Диагностика
- **Журнал уведомлений** - детальная история отправки
- **Тестовая отправка** - проверка настроек перед внедрением
- **Мониторинг статуса** - отслеживание работы каналов
- **Логи ошибок** - анализ причин сбоев
## Соответствие требованиям
### Защита персональных данных
- **Согласие на получение** - явное согласие пользователей
- **Отказ от рассылки** - простая процедура отписки
- **Шифрование данных** - защита персональной информации
- **Аудит доступа** - контроль кто имеет доступ к контактам
### Нормативные требования
- **Закон о персональных данных** - соответствие 152-ФЗ
- **Антиспам законодательство** - соблюдение требований по рассылкам
- **Архивирование** - сохранение истории уведомлений
- **Отчетность** - предоставление данных по запросам
@@ -1,104 +0,0 @@
# Управление настройками системы
В этом разделе описывается, как руководители кооператива могут настраивать основные параметры системы для эффективной работы.
## Доступ к настройкам
Для входа в раздел настроек:
1. Войдите в систему под учетной записью председателя или члена совета
2. В главном меню выберите **"Настройки"**
3. Выберите нужный подраздел настроек
<figure markdown="span">
![Меню настроек]()<!-- Скриншот: Главное меню с выделенным разделом "Настройки" -->
<figcaption>Раздел настроек в главном меню</figcaption>
</figure>
## Основные настройки кооператива
### Общая информация
- **Название кооператива** - официальное наименование организации
- **Юридический адрес** - адрес регистрации кооператива
- **Контактная информация** - телефон, email, сайт
- **Банковские реквизиты** - для приема платежей
### Настройки документооборота
- **Сроки рассмотрения заявлений** - максимальное время на принятие решения советом
- **Автоматические уведомления** - настройка отправки уведомлений пайщикам
- **Шаблоны документов** - кастомизация стандартных шаблонов
<figure markdown="span">
![Настройки документооборота]()<!-- Скриншот: Форма настроек документооборота -->
<figcaption>Форма настройки параметров документооборота</figcaption>
</figure>
## Финансовые настройки
### Размеры взносов
- **Вступительный взнос** - сумма при регистрации нового пайщика
- **Минимальный паевой взнос** - обязательная сумма при вступлении
- **Членские взносы** - периодические взносы для участия в программах
### Платежные методы
Настройка доступных способов оплаты:
- Банковские карты
- Банковские переводы
- Электронные кошельки
- QR-коды для оплаты
<figure markdown="span">
![Настройки платежей]()<!-- Скриншот: Интерфейс настройки платежных методов -->
<figcaption>Конфигурация платежных методов</figcaption>
</figure>
## Настройки безопасности
### Права доступа
- **Членство в совете** - управление составом совета
- **Делегирование полномочий** - назначение ответственных лиц
- **Уровни доступа** - настройка прав для разных ролей
### Аудит операций
- **Логирование действий** - ведение журнала всех операций
- **Уведомления о критических действиях** - моментальные оповещения
- **Резервное копирование** - настройка автоматических бэкапов
## Интеграции и приложения
### Подключение сервисов
- **Платежные системы** - интеграция с банками и платежными провайдерами
- **Уведомления** - подключение SMS, email, push-уведомлений
- **Отчетность** - интеграция с системами учета
### Управление приложениями
Подробнее см. раздел [Конфигурация приложений](extension-configuration.md)
<video controls>
<source src="" type="video/mp4"><!-- Видео: Обзор основных настроек системы -->
Видео-обзор настройки основных параметров системы
</video>
## Сохранение изменений
!!! warning "Важно"
Все изменения настроек требуют подтверждения цифровой подписью председателя и автоматически логируются в системе аудита.
После внесения изменений:
1. Проверьте корректность введенных данных
2. Нажмите **"Сохранить изменения"**
3. Подтвердите операцию цифровой подписью
4. Дождитесь подтверждения сохранения
## Восстановление настроек
В случае некорректной конфигурации система позволяет:
- Откат к предыдущей версии настроек
- Восстановление из резервной копии
- Сброс к заводским настройкам (только для председателя)
## Поддержка
При возникновении вопросов по настройке системы обращайтесь:
- В службу технической поддержки
- К документации разработчиков
- На форум пользователей системы
@@ -1,197 +0,0 @@
# Реестр пайщиков
Реестр пайщиков является центральным местом для управления всеми участниками кооператива, их статусами и документами.
## Доступ к реестру
### Открытие реестра
1. В главном меню выберите раздел **"Пайщики"**
2. Откроется список всех зарегистрированных пайщиков
3. Используйте фильтры для поиска нужных участников
<figure markdown="span">
![Реестр пайщиков]()<!-- Скриншот: Основной интерфейс реестра пайщиков -->
<figcaption>Основной интерфейс реестра пайщиков</figcaption>
</figure>
### Права доступа
- **Председатель** - полный доступ ко всем данным и функциям
- **Члены совета** - просмотр и управление в рамках полномочий
- **Доверенные лица** - ограниченный доступ согласно делегированным правам
## Структура реестра
### Основная информация о пайщике
- **Идентификатор аккаунта** - уникальный номер в системе
- **ФИО** - полное имя пайщика
- **Контактные данные** - телефон, email, адрес
- **Дата регистрации** - когда пайщик вступил в кооператив
- **Статус** - текущее состояние членства
### Финансовая информация
- **Паевой счет** - текущий баланс паевых взносов
- **История платежей** - все поступления и списания
- **Задолженности** - неоплаченные взносы или услуги
- **Возвраты** - заявки на возврат паевых средств
<figure markdown="span">
![Карточка пайщика]()<!-- Скриншот: Детальная карточка пайщика -->
<figcaption>Детальная информация о пайщике</figcaption>
</figure>
## Статусы пайщиков
### Активные статусы
- **Пайщик** - полноправный участник кооператива
- **Кандидат** - подал заявление, ожидает решения совета
- **Совет** - член совета кооператива
- **Председатель** - председатель кооператива
### Неактивные статусы
- **Приостановлен** - временно исключен из активной деятельности
- **Исключен** - исключен из состава пайщиков
- **Вышел** - добровольно покинул кооператив
<video controls>
<source src="" type="video/mp4"><!-- Видео: Работа с реестром пайщиков -->
Обзор функций работы с реестром пайщиков
</video>
## Поиск и фильтрация
### Быстрый поиск
- **По имени** - введите часть ФИО для поиска
- **По email** - поиск по адресу электронной почты
- **По телефону** - поиск по номеру телефона
- **По идентификатору** - точный поиск по ID аккаунта
### Расширенные фильтры
- **По статусу** - отбор пайщиков определенного статуса
- **По дате регистрации** - пайщики за определенный период
- **По балансу** - фильтр по размеру паевых взносов
- **По активности** - последняя активность в системе
<figure markdown="span">
![Фильтры поиска]()<!-- Скриншот: Интерфейс фильтров -->
<figcaption>Инструменты поиска и фильтрации</figcaption>
</figure>
## Работа с папками пайщиков
### Открытие папки
1. Найдите нужного пайщика в реестре
2. Нажмите на зеленый **"+"** слева от записи
3. Откроется детальная информация о пайщике
### Содержимое папки
- **Личные данные** - полная анкета пайщика
- **Документы** - все документы, связанные с пайщиком
- **Платежи** - история финансовых операций
- **Активность** - журнал действий в системе
Подробнее о работе с папками см. [Папки пайщиков](папки-пайщиков.md)
## Массовые операции
### Групповые действия
- **Рассылка уведомлений** - отправка сообщений группе пайщиков
- **Экспорт данных** - выгрузка информации в Excel/CSV
- **Изменение статусов** - массовое обновление статусов
- **Формирование отчетов** - создание сводных документов
### Импорт пайщиков
- **Из файла Excel** - загрузка списка новых пайщиков
- **Из другой системы** - интеграция с внешними базами данных
- **Валидация данных** - автоматическая проверка корректности
- **Предварительный просмотр** - проверка перед окончательным импортом
<figure markdown="span">
![Массовые операции]()<!-- Скриншот: Интерфейс массовых операций -->
<figcaption>Инструменты для массовых операций</figcaption>
</figure>
## Аналитика и отчеты
### Статистика по пайщикам
- **Общее количество** - всего пайщиков в кооперативе
- **Новые регистрации** - за месяц, квартал, год
- **Распределение по статусам** - активные, неактивные, кандидаты
- **География** - распределение по регионам
### Финансовая аналитика
- **Общий паевой фонд** - сумма всех паевых взносов
- **Средний размер взноса** - статистика по размерам взносов
- **Динамика поступлений** - график поступления средств
- **Задолженности** - анализ просроченных платежей
### Экспорт отчетов
- **PDF отчеты** - готовые для печати документы
- **Excel таблицы** - для дальнейшей обработки
- **Официальные формы** - для предоставления в контролирующие органы
- **Аналитические дашборды** - интерактивные панели
<figure markdown="span">
![Аналитика пайщиков]()<!-- Скриншот: Дашборд аналитики -->
<figcaption>Аналитический дашборд по пайщикам</figcaption>
</figure>
## Управление правами доступа
### Делегирование полномочий
- **Ответственный за регион** - назначение региональных координаторов
- **Управляющий документооборотом** - права на работу с документами
- **Финансовый контролер** - доступ к финансовой информации
- **Временные права** - ограниченные по времени полномочия
### Аудит доступа
- **Журнал действий** - кто и когда обращался к данным пайщиков
- **Попытки доступа** - фиксация всех обращений к системе
- **Подозрительная активность** - автоматическое выявление аномалий
- **Отчеты безопасности** - регулярные сводки по безопасности
## Защита персональных данных
### Конфиденциальность
- **Шифрование данных** - защита информации в базе данных
- **Ограниченный доступ** - только уполномоченные лица
- **Сроки хранения** - автоматическое удаление устаревших данных
- **Согласие на обработку** - документированное согласие пайщиков
### Соответствие законодательству
- **152-ФЗ** - закон о персональных данных
- **Кооперативное законодательство** - требования к ведению реестров
- **Банковское законодательство** - требования к финансовой отчетности
- **Налоговое законодательство** - документооборот с ФНС
## Резервное копирование
### Автоматические копии
- **Ежедневные бэкапы** - автоматическое сохранение изменений
- **Недельные архивы** - полные копии базы данных
- **Месячные снимки** - исторические состояния системы
- **Годовые архивы** - долгосрочное хранение данных
### Восстановление данных
- **Быстрое восстановление** - восстановление за последние 24 часа
- **Выборочное восстановление** - восстановление отдельных записей
- **Полное восстановление** - возврат к состоянию на конкретную дату
- **Аварийное восстановление** - процедуры при критических сбоях
<figure markdown="span">
![Резервное копирование]()<!-- Скриншот: Настройки бэкапов -->
<figcaption>Настройки резервного копирования данных</figcaption>
</figure>
## Интеграции
### С внешними системами
- **1С Бухгалтерия** - синхронизация финансовой отчетности
- **CRM системы** - обмен контактной информацией
- **Банк-клиент** - автоматическая сверка платежей
- **ФНС** - электронная отчетность
### API для разработчиков
- **RESTful API** - программный доступ к данным
- **GraphQL** - гибкие запросы к базе данных
- **Webhook** - уведомления о изменениях
- **SDK** - библиотеки для разработки приложений
@@ -1,158 +0,0 @@
# Обработка заявлений
Система позволяет эффективно управлять всеми заявлениями пайщиков от подачи до исполнения решений совета.
## Рабочее место эксперта
### Панель заявлений
- **Очередь на рассмотрение** - новые заявления
- **В работе** - заявления находящиеся на экспертизе
- **Готовые к совету** - подготовленные к рассмотрению
- **Архив** - завершённые заявления
### Фильтры и поиск
- **По типам заявлений** - вступление, программы, возврат
- **По статусам** - текущий этап рассмотрения
- **По срокам** - дата подачи или дедлайн
- **По исполнителям** - ответственный эксперт
<figure markdown="span">
![Панель заявлений]()<!-- Скриншот: Рабочий стол эксперта -->
<figcaption>Интерфейс управления заявлениями</figcaption>
</figure>
## Экспертиза заявлений
### Первичная проверка
- **Комплектность документов** - наличие всех необходимых файлов
- **Корректность заполнения** - правильность указанных данных
- **Соответствие требованиям** - критериям программы или устава
- **Техническая проверка** - валидность подписей и форматов
### Финансовая экспертиза
- **Оценка платёжеспособности** - для займов и программ
- **Анализ финансовых документов** - справки о доходах
- **Расчёт рисков** - вероятность исполнения обязательств
- **Соответствие лимитам** - программных ограничений
### Правовая экспертиза
- **Соответствие уставу** - кооператива и программы
- **Проверка ограничений** - законодательных и внутренних
- **Анализ документов** - их юридическая корректность
- **Оценка рисков** - правовых последствий
<video controls>
<source src="" type="video/mp4"><!-- Видео: Экспертиза заявлений -->
Процесс экспертной оценки заявлений
</video>
## Подготовка к совету
### Формирование пакета документов
- **Заявление пайщика** - с полным комплектом документов
- **Экспертное заключение** - выводы и рекомендации
- **Финансовые расчёты** - влияние на бюджет кооператива
- **Проект решения** - рекомендуемое решение совета
### Систематизация материалов
- **Группировка по типам** - однотипные заявления вместе
- **Приоритизация** - срочные вопросы в начало
- **Подготовка презентации** - для доклада совету
- **Расчёт времени** - на рассмотрение каждого вопроса
<figure markdown="span">
![Подготовка к совету]()<!-- Скриншот: Пакет документов для совета -->
<figcaption>Подготовка материалов для заседания совета</figcaption>
</figure>
## Работа с проблемными заявлениями
### Неполные документы
**Действия эксперта:**
1. Составить список недостающих документов
2. Отправить запрос пайщику через систему
3. Установить срок предоставления
4. Приостановить рассмотрение до получения
### Несоответствие требованиям
**Варианты решения:**
- **Отказ** - с обоснованием причин
- **Доработка** - с указанием необходимых изменений
- **Альтернативное предложение** - другая программа
- **Консультация** - разъяснение возможностей
### Спорные случаи
**Процедура эскалации:**
1. Консультация с руководителем направления
2. Привлечение дополнительных экспертов
3. Вынесение на расширенное обсуждение
4. Передача на рассмотрение совета
<figure markdown="span">
![Проблемные заявления]()<!-- Скриншот: Обработка сложных случаев -->
<figcaption>Работа с проблемными заявлениями</figcaption>
</figure>
## Автоматизация процессов
### Автоматические проверки
- **Валидация данных** - корректность введённой информации
- **Проверка документов** - наличие подписей и печатей
- **Сверка с базами** - дублирование заявлений
- **Расчёт показателей** - финансовых коэффициентов
### Шаблоны решений
- **Стандартные одобрения** - для типовых случаев
- **Типовые отказы** - с распространёнными причинами
- **Запросы документов** - стандартные формулировки
- **Уведомления** - автоматические сообщения пайщикам
### Контроль сроков
- **Автоматические напоминания** - о приближении дедлайнов
- **Эскалация просрочек** - руководителю при нарушении сроков
- **Отчёты по KPI** - метрики эффективности обработки
- **Планирование нагрузки** - распределение заявлений
## Взаимодействие с пайщиками
### Обратная связь
- **Уведомления о статусе** - автоматические и ручные
- **Запросы документов** - через систему сообщений
- **Разъяснения** - по спорным вопросам
- **Консультации** - по телефону или в офисе
### Документооборот
- **Входящие документы** - от пайщиков
- **Исходящие уведомления** - о решениях и требованиях
- **Промежуточная переписка** - уточнения и консультации
- **Финальные документы** - решения совета
<figure markdown="span">
![Взаимодействие с пайщиками]()<!-- Скриншот: Система сообщений -->
<figcaption>Коммуникация с пайщиками в процессе рассмотрения</figcaption>
</figure>
## Отчётность и аналитика
### Операционные отчёты
- **Заявления по статусам** - текущее состояние очереди
- **Нагрузка экспертов** - распределение заявлений
- **Соблюдение сроков** - метрики своевременности
- **Качество экспертизы** - доля одобренных советом заключений
### Аналитические отчёты
- **Тренды подачи** - динамика по типам заявлений
- **Причины отказов** - статистика по основаниям
- **Эффективность процессов** - время обработки
- **Качество документов** - частота запросов доработки
### Управленческая отчётность
- **Еженедельные сводки** - для руководства
- **Месячные отчёты** - детальная аналитика
- **Квартальные обзоры** - тренды и рекомендации
- **Годовая отчётность** - для общего собрания
<figure markdown="span">
![Отчётность]()<!-- Скриншот: Дашборд аналитики -->
<figcaption>Аналитические панели по обработке заявлений</figcaption>
</figure>
@@ -1,94 +0,0 @@
# Повестка собрания
Повестка дня определяет структуру и содержание заседания совета кооператива.
## Формирование повестки
### Источники вопросов
- **Заявления пайщиков** - рассмотрение поданных заявлений
- **Финансовые вопросы** - утверждение бюджетов и отчётов
- **Организационные решения** - изменения в структуре
- **Плановые мероприятия** - регулярные процедуры
### Структура повестки
1. **Открытие собрания** - регистрация участников
2. **Утверждение повестки** - голосование по предложенным вопросам
3. **Основные вопросы** - рассмотрение заявлений и решений
4. **Разное** - дополнительные вопросы
5. **Закрытие** - подведение итогов
<figure markdown="span">
![Структура повестки]()<!-- Скриншот: Пример повестки собрания -->
<figcaption>Типовая структура повестки собрания</figcaption>
</figure>
## Подготовка вопросов
### Заявления пайщиков
- **Вступление в кооператив** - рассмотрение новых заявлений
- **Возврат средств** - решения о выплатах
- **Участие в программах** - одобрение заявок
- **Исключение пайщиков** - дисциплинарные вопросы
### Материалы к рассмотрению
- **Документы заявителя** - полный пакет документов
- **Экспертные заключения** - анализ и рекомендации
- **Финансовые расчёты** - влияние на бюджет кооператива
- **Правовые аспекты** - соответствие уставу и законодательству
<video controls>
<source src="" type="video/mp4"><!-- Видео: Подготовка повестки -->
Процесс формирования повестки собрания
</video>
## Техническое оформление
### В системе кооператива
1. **Создание собрания** - указание даты и времени
2. **Добавление вопросов** - формирование списка для обсуждения
3. **Прикрепление документов** - материалы для рассмотрения
4. **Уведомление участников** - автоматическая рассылка
### Документооборот
- **Проект повестки** - предварительная версия
- **Согласование** - с председателем и секретарём
- **Утверждение** - финальная версия для голосования
- **Рассылка** - всем членам совета
<figure markdown="span">
![Техническое оформление]()<!-- Скриншот: Создание повестки в системе -->
<figcaption>Интерфейс создания повестки собрания</figcaption>
</figure>
## Сроки и процедуры
### Временные рамки
- **За 7 дней** - направление повестки членам совета
- **За 3 дня** - окончательное согласование
- **В день собрания** - возможность дополнений
- **Во время собрания** - утверждение повестки голосованием
### Процедурные требования
- **Кворум** - не менее 50% членов совета
- **Голосование** - простое большинство для утверждения
- **Протоколирование** - фиксация всех решений
- **Уведомления** - информирование заинтересованных лиц
## Управление в процессе собрания
### Ведение повестки
- **Последовательное рассмотрение** - по порядку пунктов
- **Тайминг обсуждения** - контроль времени на каждый вопрос
- **Голосование по пунктам** - принятие решений
- **Протоколирование** - фиксация хода обсуждения
### Изменения повестки
- **Добавление срочных вопросов** - при необходимости
- **Перенос пунктов** - изменение порядка рассмотрения
- **Исключение вопросов** - при отсутствии материалов
- **Перенос на следующее собрание** - при нехватке времени
<figure markdown="span">
![Управление повесткой]()<!-- Скриншот: Интерфейс ведения собрания -->
<figcaption>Управление повесткой во время собрания</figcaption>
</figure>
@@ -1,195 +0,0 @@
# Объявление собрания совета
Собрания совета являются основным механизмом принятия решений в кооперативе. Система автоматизирует процесс от инициации до исполнения решений.
## Виды собраний
### По поводу созыва
- **Плановые собрания** - регулярные заседания по расписанию
- **Внеочередные собрания** - при необходимости срочного решения
- **Тематические собрания** - по конкретным вопросам деятельности
### По способу проведения
- **Очные собрания** - личное присутствие членов совета
- **Заочные собрания** - электронное голосование
- **Смешанные собрания** - комбинированный формат
<figure markdown="span">
![Типы собраний]()<!-- Скриншот: Классификация собраний в системе -->
<figcaption>Типы собраний в системе управления</figcaption>
</figure>
## Автоматическое объявление собраний
### Триггеры для собраний
Система автоматически объявляет собрания при:
- **Поступлении заявления** от пайщика (регистрация, возврат средств)
- **Превышении лимитов** финансовых операций
- **Истечении сроков** рассмотрения документов
- **Системных событиях** требующих решения совета
### Формирование повестки
1. **Анализ заявлений** - система сканирует новые документы
2. **Группировка вопросов** - объединение связанных тем
3. **Приоритизация** - сортировка по важности и срочности
4. **Генерация повестки** - автоматическое создание документа
<video controls>
<source src="" type="video/mp4"><!-- Видео: Автоматическое формирование повестки -->
Как система автоматически формирует повестку собрания
</video>
## Ручное объявление собрания
### Инициация председателем
1. Войдите в раздел **"Собрания"** → **"Создать собрание"**
2. Выберите тип собрания (плановое/внеочередное)
3. Укажите дату и время проведения
4. Добавьте вопросы в повестку
5. Определите участников
### Параметры собрания
- **Дата и время** - когда состоится собрание
- **Продолжительность** - планируемая длительность
- **Место проведения** - для очных собраний
- **Кворум** - минимальное количество участников
- **Срок голосования** - для заочных собраний
<figure markdown="span">
![Создание собрания]()<!-- Скриншот: Форма создания собрания -->
<figcaption>Интерфейс создания нового собрания</figcaption>
</figure>
## Формирование повестки
### Структура повестки
1. **Организационные вопросы**
- Открытие собрания
- Регистрация участников
- Утверждение повестки
2. **Основные вопросы**
- Заявления пайщиков
- Финансовые вопросы
- Организационные решения
3. **Заключительная часть**
- Разное
- Определение даты следующего собрания
- Закрытие собрания
### Добавление вопросов
- **Из заявлений** - автоматически добавляются нерассмотренные заявления
- **Инициатива совета** - вопросы, поднятые членами совета
- **Плановые вопросы** - регулярные отчеты и процедуры
- **Срочные вопросы** - требующие немедленного рассмотрения
<figure markdown="span">
![Повестка собрания]()<!-- Скриншот: Редактор повестки -->
<figcaption>Редактор повестки собрания</figcaption>
</figure>
## Уведомление участников
### Автоматические уведомления
- **При объявлении** - немедленно после создания собрания
- **За 7 дней** - предварительное напоминание
- **За 24 часа** - финальное напоминание
- **В день собрания** - напоминание за 2 часа до начала
### Каналы уведомлений
- **Email** - подробная информация с повесткой
- **SMS** - краткое уведомление с основными данными
- **Push-уведомления** - для пользователей мобильного приложения
- **Системные уведомления** - в личном кабинете
### Персонализация уведомлений
- **Роль участника** - разные шаблоны для председателя и членов совета
- **Предпочтения** - учет индивидуальных настроек
- **Часовой пояс** - корректировка времени для разных регионов
- **Язык интерфейса** - уведомления на предпочитаемом языке
<figure markdown="span">
![Уведомления о собрании]()<!-- Скриншот: Пример email уведомления -->
<figcaption>Пример email уведомления о собрании</figcaption>
</figure>
## Подготовка материалов
### Документы к собранию
- **Повестка** - официальный документ с вопросами
- **Заявления** - все документы для рассмотрения
- **Справочные материалы** - дополнительная информация
- **Проекты решений** - предварительные варианты решений
### Предварительное ознакомление
- **Заблаговременная рассылка** - за 3-7 дней до собрания
- **Электронный доступ** - возможность скачать материалы
- **Комментарии и вопросы** - возможность уточнений до собрания
- **Дополнения к повестке** - внесение изменений до дедлайна
<video controls>
<source src="" type="video/mp4"><!-- Видео: Подготовка материалов к собранию -->
Подготовка и рассылка материалов к собранию
</video>
## Техническая подготовка
### Для очных собраний
- **Бронирование помещения** - резервирование места проведения
- **Техническое оснащение** - проектор, звук, интернет
- **Регистрация участников** - система учета присутствующих
- **Протоколирование** - подготовка средств записи
### Для заочных собраний
- **Настройка голосования** - конфигурация электронной системы
- **Тестирование доступа** - проверка возможности участия всех членов
- **Резервные каналы** - альтернативные способы связи
- **Техническая поддержка** - помощь участникам при проблемах
## Правовые аспекты
### Соответствие уставу
- **Сроки уведомления** - соблюдение установленных в уставе сроков
- **Состав участников** - правомочность созыва собрания
- **Компетенция** - соответствие вопросов полномочиям совета
- **Процедуры** - следование установленному порядку
### Документооборот
- **Официальные уведомления** - юридически значимые документы
- **Подтверждения получения** - фиксация доставки уведомлений
- **Архивирование** - сохранение всей документации
- **Отчетность** - подготовка сведений для контролирующих органов
<figure markdown="span">
![Правовые требования]()<!-- Скриншот: Чек-лист правовых требований -->
<figcaption>Контроль соблюдения правовых требований</figcaption>
</figure>
## Отложение и отмена собраний
### Причины изменений
- **Форс-мажор** - непредвиденные обстоятельства
- **Недостаток кворума** - недостаточное количество участников
- **Технические проблемы** - сбои в системе или оборудовании
- **Процедурные нарушения** - выявленные ошибки в подготовке
### Процедура изменений
1. **Принятие решения** - только председатель или большинство совета
2. **Уведомление участников** - немедленная рассылка об изменениях
3. **Перенос голосований** - остановка всех активных процедур
4. **Назначение новой даты** - определение альтернативного времени
## Архивирование
### Сохранение документов
- **Объявления о собраниях** - все уведомления и повестки
- **Списки участников** - кто был уведомлен и кто участвовал
- **Материалы** - все документы, рассматриваемые на собрании
- **Техническая информация** - логи системы и метаданные
### Сроки хранения
- **Активные собрания** - до завершения всех процедур
- **Завершенные собрания** - согласно требованиям законодательства
- **Исторический архив** - долгосрочное хранение значимых решений
- **Техническое архивирование** - резервные копии всех данных
@@ -1,11 +0,0 @@
# Папки документов
Все протоколы решений и сопутствующие им документы складываются в папки реестра документов. Папка - это форма хранения документов в реестре. Каждая папка реестра документов содержит инициирующий документ, протокол решения и акты.
<figure markdown="span">
![Структура папки](/assets/docs_folder.png){ width="100%" }
<figcaption>Структура папки реестра документов</figcaption>
</figure>
Инициирующий собрание совета документ - это тот документ, на основании которого формируется повестка собрания совета и текст протокола решения. Этот документ всегда один на одну папку. Протокол решения собрания совета формируется в соответствии с иниицирующим документом и он также один на одну папку. Актов же в папке может быть несколько, или не быть вообще - их отсутствие или наличие зависит от содержания инициирующего документа.
@@ -1,12 +0,0 @@
# Просмотреть реестр
Для просмотра реестра документов необходимо открыть раздел меню **"Документы"**, этот раздел доступен только членам совета и доверенным ими лицам. Простые Пайщики, гости Кооператива, или другие Кооперативы не имеют доступа к реестру документов Кооператива.
![alt text](/assets/docs_docs_registry.png)
Каждая папка реестра может быть открыта, нажав на зеленый "плюсик" слева от неё. Открыв папку, вы увидите содержащиеся в них документы с соответсветствующими ими мета-данными и статусами проверки цифровой подписи.
![alt text](/assets/docs_statement.png)
Каждый документ можно скачать в формате PDF, нажав на одноименную кнопку.
@@ -1,38 +0,0 @@
## Шаблоны документов
Стандартизированные шаблоны документов хранятся в распределенной базе данных Платформы "Кооперативная Экономика". Каждый шаблон состоит из:
- Базового текста документов;
- Переводов базового текста на разные языки;
- Модели данных, которые подставляются в шаблон при его заполнении;
Ниже представлен пример шаблона Акта приёма-передачи имущества по целевой потребительской программе, где синим маркером отмечен данные, которые были подставлены в шаблон согласно его модели, текст же шаблона переведен на русский язык, однако, перевод может быть любым.
![alt text](/assets/template.png)
## Приватные данные документов
Приватные данные пайщиков кооперативов, которые используются для подстановки в шаблоны документов, хранятся на защищенных серверах SberCloud и не раскрываются никому, кроме членов Совета Кооператива и доверенными ими лицами, в рамках необходимости администрирования деятельности Платформы.
Приватными данными являются: ФИО, дата рождения, адрес регистриации, телефон и email физических лиц. Данные юридических лиц, такие как наименования организаций, ИНН / ОГРН и прочие также являются приватными на платформе, что позволяет кооперативам хранить тайну своих Пайщиков и предоставлять им личный выбор - раскрывать себя на платформе или нет.
## Публичные данные документов
Обезличенная информация, которая не содержит приватных данных Пайщиков, хранится и передаётся через распределенную базу данных, что позволяет в хронологическом порядке и с криптографической надежностью публично хранить реестр документов и их цифровых подписей.
Публичными данными являются: информация о балансах лицевых счетов, внесении и возврате имущества, актах действий, и другая обезличенная информация, необходимая Платформе для функционирования на основе смарт-контрактов целевых потребительских программ.
## Восстановление документов
Все обезличенные документы публичного реестра могут быть восстановлены в полноценные документы, удостоверенные их цифровыми подписями, при условии наличия приватных данных пользователей, которые использовались при формировании этих документов.
## Электронная подпись
Каждый документ на Платформе подписывается простой электронной подписью, он может быть скачан и передан контролирующим органам вместе с мета-данными, которые необходимы для его удостоверения:
- Цифровая подпись - формируется на основании приватного ключа, который выдается Пайщику при регистрации на Платформе;
- Публичный ключ - соответствует приватному ключу пользователя и содержится в распределенной базе данных, что позволяет в криптографически установить соответствие между подписью и идентификатором аккаунта, который её оставил;
- Контрольная сумма - криптографически-вычисленная строка латинских букв и цифр, которая получена методом хэширования SHA256 из PDF документа, который был сформирован на основании шаблона данных и приватной информации пользователя в момент совершения действия на Платформе.
Платформа автоматически проверяет цифровую подпись каждого документа при его загрузке и отмечает зелеными маркерами, если всё в порядке.
<figure markdown="span">
![Просмотр Повестки Кооператива](/assets/docs_checksum.png){ width="500px" }
<figcaption>Мета-данные документа</figcaption>
</figure>
@@ -1,105 +0,0 @@
# Обработка платежей
Руководители кооператива контролируют поступление и обработку всех платежей пайщиков через специальную панель управления.
## Мониторинг платежей
### Панель управления платежами
- **Список всех платежей** - с фильтрацией и поиском
- **Статусы обработки** - текущее состояние каждого платежа
- **Суммы и комиссии** - детализация финансовых операций
- **Методы оплаты** - способы поступления средств
### Типы платежей
- **Вступительные взносы** - от новых пайщиков
- **Паевые взносы** - дополнительные взносы участников
- **Программные взносы** - для участия в целевых программах
- **Возвраты** - исходящие платежи пайщикам
<figure markdown="span">
![Панель платежей]()<!-- Скриншот: Интерфейс управления платежами -->
<figcaption>Панель мониторинга платежей</figcaption>
</figure>
## Статусы платежей
### Входящие платежи
- **PENDING** - ожидает поступления от провайдера
- **PAID** - средства поступили, требует подтверждения
- **CONFIRMED** - платёж подтверждён и обработан
- **FAILED** - ошибка при обработке платежа
### Контроль статусов
- **Автоматическое обновление** - от платёжных провайдеров
- **Ручное подтверждение** - для проблемных случаев
- **Массовые операции** - обработка группы платежей
- **История изменений** - аудиторский след всех действий
<figure markdown="span">
![Статусы платежей]()<!-- Скриншот: Различные статусы обработки -->
<figcaption>Жизненный цикл статусов платежей</figcaption>
</figure>
## Ручная обработка
### Подтверждение платежей
Для платежей в статусе PAID:
1. **Проверьте поступление** - сверьте с банковской выпиской
2. **Убедитесь в корректности** - сумма и отправитель
3. **Нажмите "Отметить оплаченным"** - для подтверждения
4. **Система обработает** - автоматически выполнит действия
### Автоматические действия после подтверждения
- **Вступительный взнос** - создание пакета документов для совета
- **Паевой взнос** - зачисление на кошелёк пайщика
- **Программный взнос** - активация участия в программе
- **Уведомления** - отправка уведомлений пайщику
<video controls>
<source src="" type="video/mp4"><!-- Видео: Обработка платежей -->
Процесс ручного подтверждения платежей
</video>
## Проблемные платежи
### Типичные проблемы
- **Неверная сумма** - отличается от заказанной
- **Чужой плательщик** - средства поступили с другого счёта
- **Просроченный платёж** - поступил после истечения срока
- **Дублированный платёж** - повторная оплата
### Действия при проблемах
- **Возврат средств** - при невозможности принять платёж
- **Связь с пайщиком** - уточнение обстоятельств
- **Корректировка данных** - исправление информации
- **Эскалация** - передача сложных случаев экспертам
<figure markdown="span">
![Проблемные платежи]()<!-- Скриншот: Обработка проблемных случаев -->
<figcaption>Работа с проблемными платежами</figcaption>
</figure>
## Аналитика и отчёты
### Финансовая аналитика
- **Поступления по дням** - динамика платежей
- **Структура платежей** - по типам и программам
- **Конверсия** - от создания заказа до оплаты
- **Проблемные платежи** - статистика ошибок
### Экспорт данных
- **Excel отчёты** - для бухгалтерского учёта
- **CSV выгрузки** - для анализа в других системах
- **PDF справки** - для официальной отчётности
- **API интеграции** - автоматический обмен данными
### Периодические отчёты
- **Ежедневные сводки** - операции за день
- **Еженедельные отчёты** - тренды и аномалии
- **Месячные сводки** - для финансового планирования
- **Годовая отчётность** - для общего собрания
<figure markdown="span">
![Аналитика платежей]()<!-- Скриншот: Дашборд аналитики -->
<figcaption>Аналитические панели по платежам</figcaption>
</figure>
@@ -1 +0,0 @@
# Добавить пайщика
@@ -1 +0,0 @@
# Редактировать пайщика
@@ -1,15 +0,0 @@
# Папка пайщика
У каждого пайщика есть папка с идентификатором имени его аккаунта. Идентификатор имени аккаунта выдается при регистрации на Платформе. Идентификатор имени аккаунта позволяет установить соответствие между электронной подписью на любом документе и папкой пайщика в Кооперативе.
<figure markdown="span">
![Структура папки](/assets/participant_folder.png){ width="100%" }
<figcaption>Структура папки пайщика</figcaption>
</figure>
Каждая папка пайщика содержит в себе ссылки на папки с документами из реестра документов, которые были инициированы Пайщиком, или в которые Пайщик был вовлечен. Также, в папке Пайщика находятся приватные данные, публичная история действий на платформе, лицевые счета, и прочая информация, которая накапливается в папке и относится к Пайщику.
Публичная история действий включает в себя все транзакции и анонимизированные документы, опубликованные в распределенной базе данных Платформы. История действий закреплена за идентификатором аккаунта и не может быть никем изменена.
При регистрации Пайщика одновременно в нескольких кооперативах, его публичная история действий будет содержать информацию о действиях во всех кооперативах. Однако, приватные данные Пайщика всегда содержатся только в том кооперативе, членом которого он является, и эти данные передаются из кооператива в кооператив без его явного на то согласия.
@@ -1,21 +0,0 @@
# Просмотреть реестр
Для просмотра реестра папок Пайщиков необходимо открыть раздел меню **"Пайщики"**. Раздел доступен только членам совета кооператива или доверенн ими лицам. Простые Пайщики, гости Кооператива, или другие Кооперативы не имеют доступа к персонализированному реестру пайщиков Кооператива.
<figure markdown="span">
![Структура папки](/assets/docs_participant_folder.png){ width="100%" }
<figcaption>Структура папки пайщика</figcaption>
</figure>
Для открытия папки пайщика необходимо нажать на "плюсик" слева от его записи. При нажатии будет развернут интерфейс с папками документов и прочей информацией пайщика.
<figure markdown="span">
![Структура папки](/assets/docs_open_participant_folder.png){ width="100%" }
<figcaption>Открытая папка пайщика содержит папки с документами и прочую информацию о Пайщике</figcaption>
</figure>
@@ -1,50 +0,0 @@
# Регистрация пайщика
Будущий пайщик вводит свою электронную почту.
![Untitled](/assets/spravka/2.png)
Заполняет персональную информацию и соглашается с политикой обработки персональных данных.
![Untitled](/assets/spravka/3.png)
Получает идентификатор аккаунта и приватный ключ для цифровой подписи, надежно сохраняет их.
![Untitled](/assets/spravka/4.png)
Ознакамливается с заявлением на вступление, Уставом, положением о ЭЦП, ЦПП “Кошелёк”, и пользовательским соглашением.
![Untitled](/assets/spravka/5.png)
Оставляет собственноручную подпись пальцем по сенсорному экрану или рукой со вложенной компьютерной мышью.
![Untitled](/assets/spravka/6.png)
Оплачивает вступительный взнос в Вашем кооперативе на счёт Вашего кооператива со своей банковской карты.
<aside>
💡 При оплате вступительного взноса на [testnet.copenomics.world](http://testnet.copenomics.world) используйте **только** следующие тестовые данные карты:
номер карты - 5555 5555 5555 4444
дата - 12/12
CVC - 123
</aside>
![Untitled](/assets/spravka/7.png)
Подтвердить, что оплата была произведена именно со своей банковской карты. Это важно для некоторых спорных случаев.
![Untitled](/assets/spravka/8.png)
Дождаться решения совета о приёме в пайщики.
![Untitled](/assets/spravka/9.png)
После получения решения, войти в кошелёк.
![Untitled](/assets/spravka/10.png)
![Untitled](/assets/spravka/11.png)
@@ -1,3 +0,0 @@
# Просмотр Кооперативных Участков
# Добавить Кооператинвый Участок
@@ -1,30 +0,0 @@
## Просмотреть совет
Для просмотра членов действующего совета перейдите в раздел меню **"Настройки"** -> **"Совет"**. Вам откроется таблица с участниками действующего цифрового совета Вашего кооператива. Только члены совета могут принимать участие в обеспечении деятельности Кооператива согласно его Устава.
<figure markdown="span">
![Просмотр Совета Кооператива](/assets/docs_look_to_soviet.png){ width="100%" }
<figcaption>Просмотр членов Совета Кооператива</figcaption>
</figure>
## Добавить члена совета
Для добавления члена совета, необходимо нажать кнопку **"Добавить Участника"**:
Во всплывающем окне ввести идентификатор аккаунта, который может быть получен в разделе ![/Пайщики] и нажать кнопку **"Добавить"**. Через несколько секунд пайщик будет добавлен в совет.
<figure markdown="span" class="responsive-image">
![Добавить участника в Совет](/assets/docs_add_to_soviet.png)
<figcaption>Добавить участника в Совет</figcaption>
</figure>
## Удалить члена совета
Для удаления члена из совета, необходимо нажать кнопку **"Удалить"** напротив него в таблице. через несколько секунд пайщик будет удален из совета.
## Примечание
На текущий момент управление составом совета на платформе производит председатель кооператива. Для того, чтобы решения совета были легитимны, его состав должен соответствовать тому, который был принят на общем собрании кооператива.
@@ -1,19 +0,0 @@
## Просмотреть список вопросов
Для просмотра повестки необходимо перейти в раздел **"Повестка"**. После перехода, если у Кооператива есть открытые вопросы на голосовании, будет отображена таблица:
<figure markdown="span">
![Просмотр Повестки Кооператива](/assets/docs_agend_look.png){ width="100%" }
<figcaption>Просмотр Повестки Кооператива</figcaption>
</figure>
Таблица позволяет ознакомиться с вопросам повестки, проголосовать по ним и утвердить решения.
## Открыть прилагаемые документы
Каждый пункт повестки может быть развернут нажатием на круглую зеленую иконку **+**, которая находится слева от каждой записи. После нажатия, вопрос повестки развернёт документ, на основании которого было объявлено собрание совета. Каждый член совета может ознакомиться с документом и проверить корректность заполненных данных перед тем, как принять участие в голосовании по вопросу повестки. Подробнее о структуре документов и о их цифровой подписи см. в разделе "Структура Документов".
<figure markdown="span">
![Просмотр прилагаемых документов](/assets/docs_open_agenda_doc.png){ width="100%" }
<figcaption>Просмотр прилагаемых документов</figcaption>
</figure>
@@ -1,7 +0,0 @@
# Утвердить решение
После того, как совет принял положительное решение по вопросу повестки, Председателю необходимо утвердить Протокол собрания совета. Для этого, Председатель нажимает на кнопку **"Утвердить"** напротив принятого вопроса повестки, после чего, платформа автоматически генерирует протокол собрания совета, вносит в него все необходимые данные и подписывает его простой цифровой подписью Председателя.
<figure markdown="span">
![Утвердить решение](/assets/docs_approve.png){ width="150px" }
<figcaption>Утвердить решение</figcaption>
</figure>
@@ -1,11 +0,0 @@
# Исполнить решение
Исполнение большинства типовых решений совета, собрания по которым были инициированы автоматически, производятся также автоматически сразу после утверждения протокола собрания совета Председателем.
Например, после утверждения решения о приёме нового пайщика в кооператив, автоматически вносятся соответствующие записи в реестры и высылаются оповещения. Или, при приёме/возврате паевого взноса, также автоматически изменяются и лицевые счета пайщика.
В некоторых случаях, при участии в целевых потребительских программах, сразу после исполнения решения совета, Уполномоченные кооператива, Администраторы или Пайщики получают дополнительные возможности для совершения действий, которые до решения совета им были криптографически запрещены.
Например, согласно целевой потребительской программе "Соседи", пайщик получает возможность совершить поставку своего имущества в кооператив только после того, как другой пайщик внесет паевый взнос деньгами и оставит заявление на возврат указанным имуществом. Процесс приёма взносов и их возвратов может быть технически и криптографически продолжен только после того, как совет кооператива примет решение, а председатель утвердит и исполнит его. После исполнения решения, все пайщики получают оповещения, а платформа разрешает Уполномоченным и Пайщиками подписать соответствующие акты, когда последние явятся на свои кооперативные участки. Таким образом, исполнение решений совета кооператива - это необходимая и неотъемлимая часть процесса электронного документооборота на Платформе.
Все решения, для которых доступно автоматическое исполнение - исполняются автоматически при утверждении решения Председателем. Единственный тип решений, для которых недоступно автоматическое исполнение - это произвольные решения, повестка по которым была инициирована вручную членами совета или Председателем Совета Копоератива.
@@ -1,18 +0,0 @@
## Формат
Собрания совета проводятся в онлайн-формате, удаленно. Члены совета получают оповещения с типовой повесткой, которая формируется автоматически на основе действий пайщиков на Платформе. Когда Пайщик совершает действие, например, пишет заявление на вступление в кооператив, Платформа формирует повестку для собрания совета и оповещает членов совета о ней.
## Автоматическое объявление
Платформа автоматически объявляет собрания совета, где на каждом собрании решается только один вопрос и формируется только один протокол решения Совета. Автоматическое объявление собрания совета происходит в момент заполнения заявлений Пайщиком:
- заявления на вступление в кооператив;
- заявление на паевый взнос деньгами;
- заявление на имущественный взнос деньгами;
- заявление на возврат паевого взноса деньгами;
- заявление на возврат имущественного взноса;
- заявление на выход из кооператива;
Автоматическое формирование повестки происходит по любым вопросам, требующим решения совета.
## Ручное объявление
Ручное объявление собрания совета по произвольным вопросам временно недоступно.

Some files were not shown because too many files have changed in this diff Show More