@coopenomics/desktop 2025.11.14-alpha-3 → 2025.11.16-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.
Files changed (22) hide show
  1. package/package.json +6 -6
  2. package/src/app/styles/style.css +5 -0
  3. package/src/entities/ConnectionAgreement/api/index.ts +1 -1
  4. package/src/entities/Installer/model/store.ts +1 -0
  5. package/src/features/Installer/ui/SetInitForm/SetInitForm.vue +1 -0
  6. package/src/features/Installer/ui/SetVariablesForm/SetVariablesForm.vue +60 -25
  7. package/src/features/NotificationPermissionDialog/model/index.ts +12 -17
  8. package/src/features/NotificationPermissionDialog/ui/NotificationPermissionDialog.vue +0 -1
  9. package/src/features/Union/CooperativeDataForm/ui/CooperativeDataForm.vue +188 -17
  10. package/src/pages/Registrator/SignUp/ReadStatement.vue +13 -1
  11. package/src/pages/Union/ConnectionAgreement/ConnectionAgreementPage.vue +12 -2
  12. package/src/pages/Union/InstallCooperative/ui/InstallCooperativePage.vue +180 -22
  13. package/src/shared/ui/UserDataForm/CreateOrganizationDataForm/CreateOrganizationDataForm.vue +2 -0
  14. package/src/widgets/ConnectionAgreementStepper/Steps/AgreementStep.vue +24 -3
  15. package/src/widgets/ConnectionAgreementStepper/Steps/FormStep.vue +44 -9
  16. package/src/widgets/ConnectionAgreementStepper/Steps/IntroStep.vue +15 -0
  17. package/src/widgets/ConnectionAgreementStepper/Steps/UnionMembershipStep.vue +309 -0
  18. package/src/widgets/ConnectionAgreementStepper/Steps/index.ts +1 -0
  19. package/src/widgets/ConnectionAgreementStepper/Tariffs/TariffCard.vue +0 -2
  20. package/src/widgets/ConnectionAgreementStepper/ui/ConnectionAgreementStepper.vue +10 -1
  21. package/src/widgets/Desktop/CmdkMenu/CmdkMenu.vue +1 -5
  22. package/src-pwa/register-service-worker.ts +3 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coopenomics/desktop",
3
- "version": "2025.11.14-alpha-3",
3
+ "version": "2025.11.16-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-3",
29
- "@coopenomics/notifications": "2025.11.14-alpha-3",
30
- "@coopenomics/sdk": "2025.11.14-alpha-3",
28
+ "@coopenomics/controller": "2025.11.16-alpha-1",
29
+ "@coopenomics/notifications": "2025.11.16-alpha-1",
30
+ "@coopenomics/sdk": "2025.11.16-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-3",
62
+ "cooptypes": "2025.11.16-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": "4c903ba0bb63af2f6faa56eb550547e9f404eeed"
126
+ "gitHead": "8ed8af1b9ce9fbbfc01c9221cdd46230e6f56662"
127
127
  }
@@ -236,3 +236,8 @@ a:visited {
236
236
  /* .body--light{
237
237
  background-color:rgb(251, 250, 250);
238
238
  } */
239
+
240
+
241
+ .q-stepper--vertical .q-stepper__step-inner {
242
+ padding: 0 0px 31px 35px !important;
243
+ }
@@ -16,7 +16,7 @@ export async function getCurrentInstance(): Promise<CurrentInstance | null> {
16
16
 
17
17
  return instance;
18
18
  } catch (error) {
19
- console.error('Ошибка при получении текущего инстанса:', error);
19
+ console.warn('Инстанс не получен. Продолжаем работу без него:', error);
20
20
  return null;
21
21
  }
22
22
  }
@@ -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,44 +3,79 @@ 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
- q-badge.q-mr-sm.q-mb-md ОПФ
9
- | - организационно-правовая форма
8
+ q-badge.q-mr-sm.q-mb-md ОПФ+
9
+ | - основа наименования (ОПФ + цель деятельности)
10
+ .text-caption.text-grey Например: "Потребительский Кооператив Социального Комплекса" или просто "Потребительский Кооператив"
11
+
10
12
  q-input(
11
13
  autofocus
12
14
  v-model="installStore.vars.name"
13
- label="Наименование организации (без ОПФ)"
15
+ label="Собственное название организации"
14
16
  placeholder="Ромашка"
15
17
  standout="bg-teal text-white"
18
+ :rules="[val => notEmpty(val)]"
16
19
  )
20
+ .text-caption.text-grey Название без кавычек, которое будет добавляться к основе
17
21
 
18
22
  q-input.q-mt-md(
19
23
  v-model="installStore.vars.full_abbr"
20
- label="Полная ОПФ в именительном падеже"
21
- placeholder="Потребительский Кооператив"
24
+ label="Основа наименования в именительном падеже"
25
+ placeholder="Потребительский Кооператив Социального Комплекса"
22
26
  standout="bg-teal text-white"
27
+ :rules="[val => notEmpty(val)]"
23
28
  )
29
+ .text-caption.text-grey Вся часть до названия. Если уточнения нет - просто ОПФ
24
30
 
25
31
  q-input.q-mt-md(
26
32
  v-model="installStore.vars.full_abbr_genitive"
27
- label="Полная ОПФ в родительном падеже"
28
- placeholder="Потребительского Кооператива"
33
+ label="Основа наименования в родительном падеже"
34
+ placeholder="Потребительского Кооператива Социального Комплекса"
29
35
  standout="bg-teal text-white"
36
+ :rules="[val => notEmpty(val)]"
30
37
  )
31
38
 
32
39
  q-input.q-mt-md(
33
40
  v-model="installStore.vars.full_abbr_dative"
34
- label="Полная ОПФ в дательном падеже"
35
- placeholder="Потребительскому Кооперативу"
41
+ label="Основа наименования в дательном падеже"
42
+ placeholder="Потребительскому Кооперативу Социального Комплекса"
36
43
  standout="bg-teal text-white"
44
+ :rules="[val => notEmpty(val)]"
37
45
  )
38
46
 
39
47
  q-input.q-mt-md(
40
48
  v-model="installStore.vars.short_abbr"
41
- label="Краткая аббривиатура ОПФ"
49
+ label="Краткая аббревиатура ОПФ"
42
50
  placeholder="ПК"
43
51
  standout="bg-teal text-white"
52
+ :rules="[val => notEmpty(val)]"
53
+ )
54
+
55
+ q-card(flat).q-mb-md
56
+ q-card-section
57
+ div.text-h6 Устав
58
+ p Укажите ссылку на устав вашего кооператива, ознакомиться с которым будет предложено пайщикам при регистрации.
59
+ q-input.q-mt-md(
60
+ v-model="installStore.vars.statute_link"
61
+ label="Ссылка на устав кооператива"
62
+ placeholder="https://example.com/statute.pdf"
63
+ type="url"
64
+ standout="bg-teal text-white"
65
+ :rules="[val => notEmpty(val)]"
66
+ )
67
+
68
+ q-card(flat).q-mb-md
69
+ q-card-section
70
+ div.text-h6 Паспортные данные
71
+ p Укажите, должны ли заявления на вступление в кооператив и система в целом запрашивать паспортные данные пайщиков при регистрации.
72
+
73
+ q-toggle.q-mt-md(
74
+ v-model="installStore.vars.passport_request"
75
+ label="Запрашивать паспортные данные"
76
+ :true-value="'yes'"
77
+ :false-value="'no'"
78
+ color="teal"
44
79
  )
45
80
 
46
81
  q-card(flat).q-mb-md
@@ -65,6 +100,7 @@ div
65
100
  label="Email по вопросам конфиденциальности"
66
101
  type="email"
67
102
  standout="bg-teal text-white"
103
+ :rules="[val => notEmpty(val)]"
68
104
  )
69
105
 
70
106
  //- q-input.q-mt-md(
@@ -75,20 +111,7 @@ div
75
111
 
76
112
  q-card(flat).q-mb-md
77
113
  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 Протоколы решений по базовым документам
114
+ div.text-h6 Базовые протоколы решений
92
115
  p Для начала работы с системой совету кооператива необходимо принять решение о приёме ЦПП "Цифровой Кошелёк", положение о простой электронной подписи, политику конфиденциальности, пользовательское соглашение, а также формы заявлений на вступление физлиц, юрлиц и ИП. Данная информация также будет использоваться для генерации электронных документов с пайщиками.
93
116
  | Примите решение совета и укажите номера и даты протоколов по каждому документу. У всех документов может быть общий номер протокола и дата принятия решения.
94
117
  | Сгенерировать и скачать образцы документов можно по ссылке: <a href="https://generate-documents.coopenomics.world/connection-package" target="_blank">https://generate-documents.coopenomics.world</a>
@@ -99,12 +122,14 @@ div
99
122
  label="Номер протокола"
100
123
  :placeholder="getCurrentProtocolNumber"
101
124
  standout="bg-teal text-white"
125
+ :rules="[val => notEmpty(val)]"
102
126
  )
103
127
  q-input.q-mt-sm(
104
128
  v-model="installStore.vars.wallet_agreement.protocol_day_month_year"
105
129
  label="Дата протокола"
106
130
  :placeholder="getCurrentProtocolDate"
107
131
  standout="bg-teal text-white"
132
+ :rules="[val => notEmpty(val)]"
108
133
  )
109
134
 
110
135
  div.q-mt-md
@@ -114,12 +139,14 @@ div
114
139
  label="Номер протокола"
115
140
  :placeholder="getCurrentProtocolNumber"
116
141
  standout="bg-teal text-white"
142
+ :rules="[val => notEmpty(val)]"
117
143
  )
118
144
  q-input.q-mt-sm(
119
145
  v-model="installStore.vars.signature_agreement.protocol_day_month_year"
120
146
  label="Дата протокола"
121
147
  :placeholder="getCurrentProtocolDate"
122
148
  standout="bg-teal text-white"
149
+ :rules="[val => notEmpty(val)]"
123
150
  )
124
151
 
125
152
  div.q-mt-md
@@ -129,12 +156,14 @@ div
129
156
  label="Номер протокола"
130
157
  :placeholder="getCurrentProtocolNumber"
131
158
  standout="bg-teal text-white"
159
+ :rules="[val => notEmpty(val)]"
132
160
  )
133
161
  q-input.q-mt-sm(
134
162
  v-model="installStore.vars.privacy_agreement.protocol_day_month_year"
135
163
  label="Дата протокола"
136
164
  :placeholder="getCurrentProtocolDate"
137
165
  standout="bg-teal text-white"
166
+ :rules="[val => notEmpty(val)]"
138
167
  )
139
168
 
140
169
  div.q-mt-md
@@ -144,12 +173,14 @@ div
144
173
  label="Номер протокола"
145
174
  :placeholder="getCurrentProtocolNumber"
146
175
  standout="bg-teal text-white"
176
+ :rules="[val => notEmpty(val)]"
147
177
  )
148
178
  q-input.q-mt-sm(
149
179
  v-model="installStore.vars.user_agreement.protocol_day_month_year"
150
180
  label="Дата протокола"
151
181
  :placeholder="getCurrentProtocolDate"
152
182
  standout="bg-teal text-white"
183
+ :rules="[val => notEmpty(val)]"
153
184
  )
154
185
 
155
186
  div.q-mt-md
@@ -159,12 +190,14 @@ div
159
190
  label="Номер протокола"
160
191
  :placeholder="getCurrentProtocolNumber"
161
192
  standout="bg-teal text-white"
193
+ :rules="[val => notEmpty(val)]"
162
194
  )
163
195
  q-input.q-mt-sm(
164
196
  v-model="installStore.vars.participant_application.protocol_day_month_year"
165
197
  label="Дата протокола"
166
198
  :placeholder="getCurrentProtocolDate"
167
199
  standout="bg-teal text-white"
200
+ :rules="[val => notEmpty(val)]"
168
201
  )
169
202
 
170
203
  div.flex.justify-between.q-mt-md
@@ -179,6 +212,7 @@ import { useInstallCooperativeStore } from 'src/entities/Installer/model';
179
212
  import { useSystemStore } from 'src/entities/System/model';
180
213
  import { FailAlert, SuccessAlert } from 'src/shared/api';
181
214
  import { useInstallCooperative } from '../../model';
215
+ import { notEmpty } from 'src/shared/lib/utils';
182
216
  import { ref, onMounted, computed } from 'vue';
183
217
 
184
218
  const installStore = useInstallCooperativeStore()
@@ -221,6 +255,7 @@ onMounted(() => {
221
255
  confidential_email: '',
222
256
  contact_email: '',
223
257
  passport_request: 'no',
258
+ statute_link: '',
224
259
  wallet_agreement: {
225
260
  protocol_number: '',
226
261
  protocol_day_month_year: '',
@@ -78,31 +78,26 @@ export function useNotificationPermissionDialog() {
78
78
 
79
79
  // Обработка согласия пользователя
80
80
  const handleAllow = async () => {
81
+ // Немедленно закрываем диалог и сохраняем выбор пользователя
82
+ saveChoice('granted');
83
+ hideDialog();
84
+
85
+ // Выполняем подписку в фоне
81
86
  try {
82
- store.isPermissionDialogProcessing = true;
83
- console.log('handleAllow');
84
- // Подписываемся на уведомления (это включает запрос разрешения)
87
+ console.log('handleAllow - начинаем фоновую подписку');
85
88
  const success = await subscribe();
86
89
  console.log('success', success);
87
- if (success) {
88
- console.log('saveChoice granted');
89
- saveChoice('granted');
90
- console.log('hideDialog');
91
- hideDialog();
92
- } else {
93
- console.log('saveChoice denied');
94
- // Если подписка не удалась, но пользователь согласился,
95
- // все равно сохраняем выбор чтобы не показывать диалог снова
90
+ if (!success) {
91
+ console.log('saveChoice denied - подписка не удалась');
92
+ // Если подписка не удалась, меняем выбор на denied
93
+ // чтобы диалог мог появиться снова при необходимости
96
94
  saveChoice('denied');
97
- hideDialog();
98
95
  }
99
96
  } catch (error) {
100
97
  console.error('Ошибка при разрешении уведомлений:', error);
101
- console.log('saveChoice denied');
98
+ console.log('saveChoice denied - ошибка подписки');
99
+ // При ошибке тоже меняем на denied
102
100
  saveChoice('denied');
103
- hideDialog();
104
- } finally {
105
- store.isPermissionDialogProcessing = false;
106
101
  }
107
102
  };
108
103
 
@@ -1,7 +1,6 @@
1
1
  <template lang="pug">
2
2
  q-dialog(
3
3
  v-model='isDialogVisible',
4
- persistent,
5
4
  no-esc-dismiss,
6
5
  no-backdrop-dismiss,
7
6
  transition-show='fade',
@@ -1,23 +1,87 @@
1
1
  <template lang="pug">
2
2
  div
3
- Form(:handler-submit="saveData" :showCancel="false" :button-cancel-txt="'Отменить'" :button-submit-txt="'Продолжить'" @cancel="clear").q-gutter-md
4
- q-input(standout="bg-teal text-white" hint="domovoy.com или coop.domovoy.com" label="Домен или поддомен для запуска" v-model="formData.announce" :rules="[val => notEmpty(val), val => isDomain(val)]")
3
+ Form(:handler-submit="saveData" :showCancel="true" :button-cancel-txt="'Назад'" :button-submit-txt="'Продолжить'" @cancel="handleBack").q-gutter-md
5
4
 
6
- q-input(standout="bg-teal text-white" placeholder="100" label="Вступительный взнос для физлиц и ИП" v-model="formData.initial" type="number" :min="0" :rules="[val => notEmpty(val)]")
7
- template(#append)
8
- span.text-overline RUB
5
+ //- Домен кооператива
6
+ .form-section.q-mb-lg
7
+ .section-header.q-mb-md
8
+ .section-title
9
+ q-icon(name="domain" size="20px" color="primary").q-mr-sm
10
+ span.text-subtitle1.text-weight-medium Домен кооператива
11
+ .section-description.text-body2.q-mt-sm
12
+ | Укажите домен или поддомен, на котором будет работать ваш кооператив
9
13
 
10
- q-input(standout="bg-teal text-white" label="Минимальный паевый взнос для физлиц и ИП" placeholder="300" v-model="formData.minimum" type="number" :min="0" :rules="[val => notEmpty(val)]")
11
- template(#append)
12
- span.text-overline RUB
14
+ q-input.form-input(
15
+ standout="bg-teal text-white"
16
+ hint="domovoy.com или coop.domovoy.com"
17
+ label="Домен или поддомен для запуска"
18
+ v-model="formData.announce"
19
+ :rules="[val => notEmpty(val), val => isDomain(val)]"
20
+ )
13
21
 
14
- q-input(standout="bg-teal text-white" placeholder="1000" label="Вступительный взнос для организаций" v-model="formData.org_initial" type="number" :min="0" :rules="[val => notEmpty(val)]")
15
- template(#append)
16
- span.text-overline RUB
22
+ //- Финансовые параметры
23
+ .form-section.q-mb-lg
24
+ .section-header.q-mb-md
25
+ .section-title
26
+ q-icon(name="account_balance_wallet" size="20px" color="secondary").q-mr-sm
27
+ span.text-subtitle1.text-weight-medium Финансовые параметры
28
+ .section-description.text-body2.q-mt-sm
29
+ | Введите вступительные и минимальные паевые взносы пайщиков. Эти параметры будут должны быть указаны в уставных документах кооператива.
17
30
 
18
- q-input(standout="bg-teal text-white" placeholder="3000" label="Минимальный паевый взнос для организаций" v-model="formData.org_minimum" type="number" :min="0" :rules="[val => notEmpty(val)]")
19
- template(#append)
20
- span.text-overline RUB
31
+ .financial-grid
32
+ .grid-section.q-mb-md
33
+ .subsection-title.text-body1.text-weight-medium.q-mb-sm Для физических лиц и ИП
34
+ .input-row.q-mb-sm
35
+ q-input.form-input(
36
+ standout="bg-teal text-white"
37
+ placeholder="100"
38
+ label="Вступительный взнос"
39
+ v-model="formData.initial"
40
+ type="number"
41
+ :min="0"
42
+ :rules="[val => notEmpty(val)]"
43
+ )
44
+ template(#append)
45
+ span.text-overline RUB
46
+ .input-row
47
+ q-input.form-input(
48
+ standout="bg-teal text-white"
49
+ label="Минимальный паевый взнос"
50
+ placeholder="300"
51
+ v-model="formData.minimum"
52
+ type="number"
53
+ :min="0"
54
+ :rules="[val => notEmpty(val)]"
55
+ )
56
+ template(#append)
57
+ span.text-overline RUB
58
+
59
+ .grid-section
60
+ .subsection-title.text-body1.text-weight-medium.q-mb-sm Для организаций
61
+ .input-row.q-mb-sm
62
+ q-input.form-input(
63
+ standout="bg-teal text-white"
64
+ placeholder="1000"
65
+ label="Вступительный взнос"
66
+ v-model="formData.org_initial"
67
+ type="number"
68
+ :min="0"
69
+ :rules="[val => notEmpty(val)]"
70
+ )
71
+ template(#append)
72
+ span.text-overline RUB
73
+ .input-row
74
+ q-input.form-input(
75
+ standout="bg-teal text-white"
76
+ placeholder="3000"
77
+ label="Минимальный паевый взнос"
78
+ v-model="formData.org_minimum"
79
+ type="number"
80
+ :min="0"
81
+ :rules="[val => notEmpty(val)]"
82
+ )
83
+ template(#append)
84
+ span.text-overline RUB
21
85
  </template>
22
86
  <script lang="ts" setup>
23
87
  import { ref, watch } from 'vue'
@@ -27,7 +91,7 @@ import { useConnectionAgreementStore } from 'src/entities/ConnectionAgreement';
27
91
  import type { ICooperativeFormData } from 'src/entities/ConnectionAgreement/model/types';
28
92
 
29
93
 
30
- const emit = defineEmits(['continue'])
94
+ const emit = defineEmits(['continue', 'back'])
31
95
 
32
96
  const connectionAgreement = useConnectionAgreementStore()
33
97
 
@@ -56,8 +120,8 @@ const syncFormData = () => {
56
120
  connectionAgreement.setFormData(formData.value)
57
121
  }
58
122
 
59
- const clear = () => {
60
- emit('continue')
123
+ const handleBack = () => {
124
+ emit('back')
61
125
  }
62
126
 
63
127
  const saveData = async () => {
@@ -67,3 +131,110 @@ const saveData = async () => {
67
131
  emit('continue', formData.value)
68
132
  }
69
133
  </script>
134
+
135
+ <style scoped>
136
+ .form-section {
137
+ padding: 1.5rem;
138
+ border-radius: 16px;
139
+ border: 1px solid rgba(0, 0, 0, 0.05);
140
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
141
+ }
142
+
143
+ .section-header {
144
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
145
+ padding-bottom: 1rem;
146
+ display: block;
147
+ }
148
+
149
+ .section-title {
150
+ display: flex;
151
+ align-items: center;
152
+ margin-bottom: 0.25rem;
153
+ }
154
+
155
+ .section-description {
156
+ line-height: 1.5;
157
+ }
158
+
159
+ .financial-grid {
160
+ display: grid;
161
+ grid-template-columns: 1fr 1fr;
162
+ gap: 2rem;
163
+ }
164
+
165
+ .grid-section {
166
+ padding: 1rem;
167
+ border-radius: 12px;
168
+ border: 1px solid rgba(0, 0, 0, 0.03);
169
+ }
170
+
171
+ .subsection-title {
172
+ color: var(--q-primary);
173
+ border-bottom: 2px solid var(--q-primary);
174
+ padding-bottom: 0.5rem;
175
+ margin-bottom: 1rem;
176
+ }
177
+
178
+ .input-row {
179
+ margin-bottom: 1rem;
180
+ }
181
+
182
+ .input-row:last-child {
183
+ margin-bottom: 0;
184
+ }
185
+
186
+ .form-input {
187
+ margin-bottom: 0;
188
+ }
189
+
190
+ /* Разделитель между секциями */
191
+ .form-section + .form-section {
192
+ margin-top: 2rem;
193
+ }
194
+
195
+ /* Адаптивность */
196
+ @media (max-width: 768px) {
197
+ .financial-grid {
198
+ grid-template-columns: 1fr;
199
+ gap: 1.5rem;
200
+ }
201
+
202
+ .form-section {
203
+ padding: 1.25rem;
204
+ }
205
+ }
206
+
207
+ @media (max-width: 480px) {
208
+ .form-section {
209
+ padding: 1rem;
210
+ }
211
+
212
+ .section-title {
213
+ flex-direction: column;
214
+ gap: 0.5rem;
215
+ text-align: center;
216
+ }
217
+
218
+ .section-header {
219
+ text-align: center;
220
+ display: block !important;
221
+ }
222
+
223
+ .section-description {
224
+ display: block !important;
225
+ width: 100% !important;
226
+ }
227
+
228
+ .financial-grid {
229
+ gap: 1rem;
230
+ }
231
+
232
+ .grid-section {
233
+ padding: 0.75rem;
234
+ }
235
+
236
+ .subsection-title {
237
+ font-size: 1rem;
238
+ }
239
+ }
240
+ </style>
@@ -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>
@@ -1,5 +1,5 @@
1
1
  <template lang="pug">
2
- div.row.q-pa-md
2
+ div.row
3
3
  div.col-md-12.col-xs-12
4
4
  // Лоадер пока идет загрузка данных
5
5
  WindowLoader(v-if="isLoading", text="Загрузка данных подключения...")
@@ -104,10 +104,19 @@ const init = async () => {
104
104
  isLoading.value = false;
105
105
  return;
106
106
  }
107
-
107
+ console.log('SYSTEM.info.is_unioned', system.info.is_unioned, connectionAgreement.isInitialized);
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) {