@coopenomics/desktop 2025.11.14-alpha-2 → 2025.11.15-alpha-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coopenomics/desktop",
3
- "version": "2025.11.14-alpha-2",
3
+ "version": "2025.11.15-alpha-1",
4
4
  "description": "A Desktop Project",
5
5
  "productName": "Desktop App",
6
6
  "author": "Alex Ant <dacom.dark.sun@gmail.com>",
@@ -25,9 +25,9 @@
25
25
  "start": "node -r ./alias-resolver.js dist/ssr/index.js"
26
26
  },
27
27
  "dependencies": {
28
- "@coopenomics/controller": "2025.11.14-alpha-2",
29
- "@coopenomics/notifications": "2025.11.14-alpha-2",
30
- "@coopenomics/sdk": "2025.11.14-alpha-2",
28
+ "@coopenomics/controller": "2025.11.15-alpha-1",
29
+ "@coopenomics/notifications": "2025.11.15-alpha-1",
30
+ "@coopenomics/sdk": "2025.11.15-alpha-1",
31
31
  "@dicebear/collection": "^9.0.1",
32
32
  "@dicebear/core": "^9.0.1",
33
33
  "@editorjs/code": "^2.9.3",
@@ -59,7 +59,7 @@
59
59
  "@wharfkit/wallet-plugin-privatekey": "^1.1.0",
60
60
  "axios": "^1.2.1",
61
61
  "compression": "^1.7.4",
62
- "cooptypes": "2025.11.14-alpha-2",
62
+ "cooptypes": "2025.11.15-alpha-1",
63
63
  "dompurify": "^3.1.7",
64
64
  "dotenv": "^16.4.5",
65
65
  "email-regex": "^5.0.0",
@@ -123,5 +123,5 @@
123
123
  "npm": ">= 6.13.4",
124
124
  "yarn": ">= 1.21.1"
125
125
  },
126
- "gitHead": "9e1dd02d708a4b7905f0cb4543e61a193c0948c8"
126
+ "gitHead": "3671c05573f13ccdfc23fc90c43dd5e7a7b8fd1d"
127
127
  }
@@ -27,6 +27,7 @@ interface IVars {
27
27
  confidential_email: string;
28
28
  contact_email: string;
29
29
  passport_request: 'yes' | 'no';
30
+ statute_link: string;
30
31
  wallet_agreement: IAgreementVar;
31
32
  privacy_agreement: IAgreementVar;
32
33
  signature_agreement: IAgreementVar;
@@ -10,6 +10,7 @@ div
10
10
  CreateOrganizationDataForm(
11
11
  :data="installationStatus.organization_data || installStore.organization_data"
12
12
  readonly
13
+ hideMatchButton
13
14
  )
14
15
 
15
16
  div.flex.justify-between.q-mt-md
@@ -3,7 +3,7 @@ div
3
3
  div(v-if="installStore.vars")
4
4
  q-card(flat).q-mb-md
5
5
  q-card-section
6
- //- div.text-h6 Основная информация
6
+ div.text-h6 Наименование
7
7
  div
8
8
  q-badge.q-mr-sm.q-mb-md ОПФ
9
9
  | - организационно-правовая форма
@@ -43,6 +43,31 @@ div
43
43
  standout="bg-teal text-white"
44
44
  )
45
45
 
46
+ q-card(flat).q-mb-md
47
+ q-card-section
48
+ div.text-h6 Устав
49
+ p Укажите ссылку на устав вашего кооператива, ознакомиться с которым будет предложено пайщикам при регистрации.
50
+ q-input.q-mt-md(
51
+ v-model="installStore.vars.statute_link"
52
+ label="Ссылка на устав кооператива"
53
+ placeholder="https://example.com/statute.pdf"
54
+ type="url"
55
+ standout="bg-teal text-white"
56
+ )
57
+
58
+ q-card(flat).q-mb-md
59
+ q-card-section
60
+ div.text-h6 Паспортные данные
61
+ p Укажите, должны ли заявления на вступление в кооператив и система в целом запрашивать паспортные данные пайщиков при регистрации.
62
+
63
+ q-toggle.q-mt-md(
64
+ v-model="installStore.vars.passport_request"
65
+ label="Запрашивать паспортные данные"
66
+ :true-value="'yes'"
67
+ :false-value="'no'"
68
+ color="teal"
69
+ )
70
+
46
71
  q-card(flat).q-mb-md
47
72
  q-card-section
48
73
  div.text-h6 Контактная информация
@@ -75,20 +100,7 @@ div
75
100
 
76
101
  q-card(flat).q-mb-md
77
102
  q-card-section
78
- div.text-h6 Паспортные данные
79
- p Укажите, должны ли заявления на вступление в кооператив и система в целом запрашивать паспортные данные пайщиков при регистрации.
80
-
81
- q-toggle.q-mt-md(
82
- v-model="installStore.vars.passport_request"
83
- label="Запрашивать паспортные данные"
84
- :true-value="'yes'"
85
- :false-value="'no'"
86
- color="teal"
87
- )
88
-
89
- q-card(flat).q-mb-md
90
- q-card-section
91
- div.text-h6 Протоколы решений по базовым документам
103
+ div.text-h6 Базовые протоколы решений
92
104
  p Для начала работы с системой совету кооператива необходимо принять решение о приёме ЦПП "Цифровой Кошелёк", положение о простой электронной подписи, политику конфиденциальности, пользовательское соглашение, а также формы заявлений на вступление физлиц, юрлиц и ИП. Данная информация также будет использоваться для генерации электронных документов с пайщиками.
93
105
  | Примите решение совета и укажите номера и даты протоколов по каждому документу. У всех документов может быть общий номер протокола и дата принятия решения.
94
106
  | Сгенерировать и скачать образцы документов можно по ссылке: <a href="https://generate-documents.coopenomics.world/connection-package" target="_blank">https://generate-documents.coopenomics.world</a>
@@ -221,6 +233,7 @@ onMounted(() => {
221
233
  confidential_email: '',
222
234
  contact_email: '',
223
235
  passport_request: 'no',
236
+ statute_link: '',
224
237
  wallet_agreement: {
225
238
  protocol_number: '',
226
239
  protocol_day_month_year: '',
@@ -31,7 +31,8 @@ div
31
31
  q-checkbox(v-model='store.state.agreements.ustav' full-width)
32
32
  | Я прочитал и принимаю
33
33
 
34
- a(@click.stop='(event) => event.stopPropagation()' href='/documents/ustav.pdf' target='_blank').q-ml-xs Устав кооператива
34
+ a(v-if='hasStatuteLink' @click.stop='(event) => event.stopPropagation()' :href='statuteLink' target='_blank').q-ml-xs Устав кооператива
35
+ p(v-else).q-ml-xs Устав кооператива
35
36
 
36
37
  div(v-if="!isLoading").q-mt-lg
37
38
  q-btn.col-md-6.col-xs-12(flat @click='back')
@@ -53,6 +54,9 @@ const agreementer = useAgreementStore()
53
54
  import { useRegistratorStore } from 'src/entities/Registrator'
54
55
  const store = useRegistratorStore()
55
56
 
57
+ import { useSystemStore } from 'src/entities/System/model'
58
+ const systemStore = useSystemStore()
59
+
56
60
  const { generateStatementWithoutSignature } = useCreateUser()
57
61
 
58
62
  const agreeWithAll = computed(() => {
@@ -108,5 +112,13 @@ const userAgreement = computed(() => {
108
112
  return agreementer.cooperativeAgreements.find(el => el.type == 'user')
109
113
  })
110
114
 
115
+ const statuteLink = computed(() => {
116
+ return systemStore.info.vars?.statute_link || ''
117
+ })
118
+
119
+ const hasStatuteLink = computed(() => {
120
+ return statuteLink.value && statuteLink.value.trim() !== ''
121
+ })
122
+
111
123
 
112
124
  </script>
@@ -108,6 +108,15 @@ const init = async () => {
108
108
  // Инициализируем persistent store если он еще не инициализирован
109
109
  if (!connectionAgreement.isInitialized) {
110
110
  connectionAgreement.setInitialized(true);
111
+
112
+ // Устанавливаем начальный шаг в зависимости от членства в союзе
113
+ if (!system.info.is_unioned) {
114
+ // Если кооператив не является членом союза, начинаем с нулевого шага
115
+ connectionAgreement.setCurrentStep(0);
116
+ } else {
117
+ // Если кооператив уже член союза, начинаем с первого шага
118
+ connectionAgreement.setCurrentStep(1);
119
+ }
111
120
  }
112
121
 
113
122
  // Запускаем автообновление инстанса каждые 30 секунд (включает начальную загрузку)
@@ -140,6 +149,7 @@ watch(
140
149
  });
141
150
 
142
151
  // Логика автоматических переходов (только для шагов 4, 5, 6)
152
+ // Шаги 0, 1, 2, 3 не имеют автоматических переходов
143
153
  if (currentStep === 4) {
144
154
  // Шаг 4: Проверка домена
145
155
  if (instance.is_valid && instance.is_delegated) {
@@ -1,37 +1,58 @@
1
1
  <template lang="pug">
2
- div.row.justify-center
3
- div.col-md-12.col-sm-6.col-xs-12
4
- div
5
- q-card(flat).q-pa-md.q-mb-lg
2
+ div.row.justify-center.q-pa-md
3
+ div.col-md-8.col-sm-10.col-xs-12
4
+ .installation-container
5
+ q-card(flat).installation-card
6
6
  div(v-if="!installStore.is_finish")
7
+ .installation-header
8
+ .text-h5.installation-title Установка Цифрового Кооператива
9
+ .subtitle.text-body2.text-grey-7.q-mt-sm
10
+ | Настройка вашего кооператива шаг за шагом
7
11
 
8
12
  //- Индикатор шагов
9
- q-stepper.q-mb-md(v-model="installStore.current_step" vertical flat dense)
13
+ q-stepper.q-mt-lg(v-model="installStore.current_step" vertical flat)
10
14
  q-step(:name="'key'" title="Ключ доступа" icon="key" :done="isStepDone('key')")
11
- span Для начала установки введите ключ аккаунта Кооператива, который был выдан Вам при регистрации:
12
- RequestKeyForm.q-mt-md
15
+ .step-content.q-pa-md
16
+ .step-description.text-body2.q-mb-md
17
+ | Для начала установки введите ключ аккаунта Кооператива, который был выдан Вам при регистрации:
18
+ RequestKeyForm
13
19
 
14
20
  q-step(:name="'init'" title="Инициализация системы" icon="business" :done="isStepDone('init')")
15
- SetInitForm.q-mt-md
21
+ .step-content.q-pa-md
22
+ SetInitForm
16
23
 
17
24
  q-step(:name="'soviet'" title="Члены совета" icon="people" :done="isStepDone('soviet')")
18
- span Введите данные председателя и членов совета. Всем им будут созданы аккаунты пайщиков и отправлены приглашения на электронную почту:
19
- SetSovietForm.q-mt-md
25
+ .step-content.q-pa-md
26
+ .step-description.text-body2.q-mb-md
27
+ | Введите данные председателя и членов совета. Всем им будут созданы аккаунты пайщиков и отправлены приглашения на электронную почту:
28
+ SetSovietForm
20
29
 
21
30
  q-step(:name="'vars'" title="Переменные документов" icon="settings" :done="isStepDone('vars')")
22
- span Установите переменные для документов кооператива, которые будут использоваться при генерации документов:
23
- SetVariablesForm.q-mt-md
31
+ .step-content.q-pa-md
32
+ .step-description.text-body2.q-mb-md
33
+ | Установите переменные для документов кооператива, которые будут использоваться при генерации документов:
34
+ SetVariablesForm
35
+
24
36
  div(v-else)
25
- p.text-h6.full-width.text-center Установка завершена
26
- p.q-mb-md Всем членам совета отправлены приглашения на электронные почты со ссылками для генерации цифровых подписей. Перейдите по своей ссылке из письма, получите ключ председателя, и используйте его для входа в свою систему.
27
-
28
- div.flex.justify-center.q-mt-lg
29
- q-btn(
30
- @click="goToSignin"
31
- color="primary"
32
- label="Войти"
33
- icon="login"
34
- )
37
+ .completion-section.q-pa-xl
38
+ .completion-header
39
+ q-icon(name="check_circle" color="positive" size="64px")
40
+ .completion-title.text-h5.text-positive.q-mt-md Установка завершена
41
+ .completion-subtitle.text-body2.text-grey-7.q-mt-sm
42
+ | Ваш Цифровой Кооператив готов к работе
43
+
44
+ .completion-details.q-mt-xl
45
+ .detail-text.text-body2.q-mb-lg
46
+ | Всем членам совета отправлены приглашения на электронные почты со ссылками для генерации цифровых подписей. Перейдите по своей ссылке из письма, получите ключ председателя, и используйте его для входа в свою систему.
47
+
48
+ q-btn(
49
+ @click="goToSignin"
50
+ color="primary"
51
+ label="Войти в систему"
52
+ size="lg"
53
+ unelevated
54
+ no-caps
55
+ ).q-mt-md
35
56
  //- p.text-grey Ключ установки, который ранее вводился здесь, теперь используется только для входа в кабинет оператора, пайщиком которого вы стали при подключении к системе. В вашей же системе у вас новый ключ, который вы выпускаете себе сами.
36
57
  </template>
37
58
 
@@ -61,3 +82,140 @@ const goToSignin = () => {
61
82
  });
62
83
  };
63
84
  </script>
85
+
86
+ <style scoped>
87
+ .installation-container {
88
+ max-width: 900px;
89
+ margin: 0 auto;
90
+ position: relative;
91
+ }
92
+
93
+ .installation-card {
94
+ border-radius: 20px;
95
+ border: 1px solid rgba(0, 0, 0, 0.05);
96
+ box-shadow:
97
+ 0 8px 32px rgba(0, 0, 0, 0.08),
98
+ 0 2px 8px rgba(0, 0, 0, 0.04);
99
+ position: relative;
100
+ overflow: hidden;
101
+ }
102
+
103
+ .installation-card::before {
104
+ content: '';
105
+ position: absolute;
106
+ top: 0;
107
+ left: 0;
108
+ right: 0;
109
+ height: 4px;
110
+ background: linear-gradient(90deg, var(--q-primary) 0%, var(--q-secondary) 50%, var(--q-accent) 100%);
111
+ background-size: 200% 100%;
112
+ animation: shimmer 4s cubic-bezier(0.25, 0.46, 0.45, 0.94) infinite;
113
+ }
114
+
115
+ @keyframes shimmer {
116
+ 0% { background-position: 100% 0; }
117
+ 100% { background-position: -100% 0; }
118
+ }
119
+
120
+ /* Заголовок с градиентом */
121
+ .installation-header {
122
+ text-align: center;
123
+ margin-bottom: 2rem;
124
+ padding-top: 2rem;
125
+ }
126
+
127
+ .installation-title {
128
+ font-weight: 700;
129
+ letter-spacing: -0.5px;
130
+ background: linear-gradient(135deg, var(--q-primary) 0%, rgba(25, 118, 210, 0.8) 100%);
131
+ -webkit-background-clip: text;
132
+ -webkit-text-fill-color: transparent;
133
+ background-clip: text;
134
+ text-shadow: 0 2px 4px rgba(25, 118, 210, 0.3);
135
+ }
136
+
137
+ /* Содержимое шагов */
138
+ .step-content {
139
+ background: rgba(25, 118, 210, 0.02);
140
+ border-radius: 12px;
141
+ border: 1px solid rgba(25, 118, 210, 0.05);
142
+ margin-top: 1rem;
143
+ }
144
+
145
+ .step-description {
146
+ color: #666;
147
+ line-height: 1.5;
148
+ }
149
+
150
+ /* Секция завершения */
151
+ .completion-section {
152
+ text-align: center;
153
+ position: relative;
154
+ }
155
+
156
+ .completion-header {
157
+ position: relative;
158
+ margin-bottom: 1rem;
159
+ }
160
+
161
+ .completion-title {
162
+ font-weight: 700;
163
+ letter-spacing: -0.5px;
164
+ background: linear-gradient(135deg, var(--q-positive) 0%, #4CAF50 100%);
165
+ -webkit-background-clip: text;
166
+ -webkit-text-fill-color: transparent;
167
+ background-clip: text;
168
+ text-shadow: 0 2px 4px rgba(76, 175, 80, 0.3);
169
+ }
170
+
171
+ .completion-details {
172
+ margin-top: 2rem;
173
+ }
174
+
175
+ .detail-text {
176
+ color: #666;
177
+ line-height: 1.6;
178
+ }
179
+
180
+ /* Адаптивность */
181
+ @media (max-width: 768px) {
182
+ .installation-container {
183
+ padding: 1rem;
184
+ }
185
+
186
+ .installation-card {
187
+ border-radius: 16px;
188
+ }
189
+
190
+ .installation-header {
191
+ padding-top: 1.5rem;
192
+ margin-bottom: 1.5rem;
193
+ }
194
+
195
+ .step-content {
196
+ padding: 1rem;
197
+ }
198
+
199
+ .completion-section {
200
+ padding: 2rem 1rem;
201
+ }
202
+ }
203
+
204
+ @media (max-width: 480px) {
205
+ .installation-container {
206
+ padding: 0.5rem;
207
+ }
208
+
209
+ .installation-card {
210
+ border-radius: 12px;
211
+ }
212
+
213
+ .step-content {
214
+ padding: 0.75rem;
215
+ }
216
+
217
+ .completion-section {
218
+ padding: 1.5rem 0.75rem;
219
+ }
220
+ }
221
+ </style>
@@ -128,6 +128,7 @@
128
128
  )
129
129
  template(v-slot:append)
130
130
  q-btn(
131
+ v-if="!hideMatchButton"
131
132
  dense,
132
133
  size='sm',
133
134
  color='teal',
@@ -244,6 +245,7 @@ export type ICreateOrganizationData = Omit<Zeus.ModelTypes['CreateOrganizationDa
244
245
  const props = defineProps<{
245
246
  data?: ICreateOrganizationData;
246
247
  readonly?: boolean;
248
+ hideMatchButton?: boolean;
247
249
  }>();
248
250
 
249
251
  const emit = defineEmits<{
@@ -0,0 +1,64 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import type { IStepProps } from '../model/types'
4
+
5
+ import { useConnectionAgreementStore } from 'src/entities/ConnectionAgreement'
6
+ import { useSystemStore } from 'src/entities/System/model';
7
+
8
+ const props = withDefaults(defineProps<IStepProps>(), {})
9
+
10
+ const system = useSystemStore()
11
+ const connectionAgreement = useConnectionAgreementStore()
12
+
13
+ const isActive = computed(() => props.isActive)
14
+ const isDone = computed(() => props.isDone)
15
+
16
+ const unionLink = computed(() => system.info.union_link)
17
+
18
+ const handleContinue = () => {
19
+ if (connectionAgreement.currentStep === 0) {
20
+ connectionAgreement.setCurrentStep(1)
21
+ }
22
+ }
23
+
24
+ const openUnionLink = () => {
25
+ if (unionLink.value) {
26
+ window.open(unionLink.value, '_blank')
27
+ }
28
+ }
29
+ </script>
30
+
31
+ <template lang="pug">
32
+ q-step(
33
+ :name="0"
34
+ title="Членство в союзе"
35
+ icon="group"
36
+ :done="isDone"
37
+ )
38
+ .q-pa-md
39
+ .text-h6.q-mb-md Для подключения к Кооперативной Экономике кооператив должен быть членом союза
40
+
41
+ .q-mb-md
42
+ | Для вступления в союз перейдите по ссылке:
43
+ br
44
+ q-btn(
45
+ v-if="unionLink"
46
+ flat
47
+ color="primary"
48
+ :label="unionLink"
49
+ @click="openUnionLink"
50
+ no-caps
51
+ class="q-mt-sm"
52
+ )
53
+ span(v-else).text-grey-6 Ссылка недоступна
54
+
55
+ .q-mb-lg После вступления в союз, пожалуйста, продолжайте процесс подключения.
56
+
57
+ q-stepper-navigation.q-gutter-sm
58
+ q-btn(
59
+ v-if="isActive"
60
+ color="primary"
61
+ label="Продолжить"
62
+ @click="handleContinue"
63
+ )
64
+ </template>
@@ -1,3 +1,4 @@
1
+ export { default as UnionMembershipStep } from './UnionMembershipStep.vue'
1
2
  export { default as IntroStep } from './IntroStep.vue'
2
3
  export { default as AgreementStep } from './AgreementStep.vue'
3
4
  export { default as FormStep } from './FormStep.vue'
@@ -8,6 +8,13 @@ div
8
8
  animated
9
9
  done-color="teal"
10
10
  )
11
+ UnionMembershipStep(
12
+ v-if="system.info.is_unioned"
13
+ :current-step="currentStep"
14
+ :is-active="currentStep === 0"
15
+ :is-done="currentStep > 0"
16
+ )
17
+
11
18
  IntroStep(
12
19
  :current-step="currentStep"
13
20
  :is-active="currentStep === 1"
@@ -52,10 +59,12 @@ div
52
59
 
53
60
  <script setup lang="ts">
54
61
  import { computed, watch } from 'vue'
55
- import { IntroStep, AgreementStep, FormStep, DomainValidationStep, ApprovalWaitingStep, InstallationStep } from '../Steps/index'
62
+ import { UnionMembershipStep, IntroStep, AgreementStep, FormStep, DomainValidationStep, ApprovalWaitingStep, InstallationStep } from '../Steps/index'
56
63
  import { useConnectionAgreementStore } from 'src/entities/ConnectionAgreement'
64
+ import { useSystemStore } from 'src/entities/System/model'
57
65
 
58
66
  const connectionAgreement = useConnectionAgreementStore()
67
+ const system = useSystemStore()
59
68
 
60
69
  // Данные из стора
61
70
  const currentStep = computed(() => connectionAgreement.currentStep)