hl-core 0.0.8-beta.4 → 0.0.8-beta.40

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 (61) hide show
  1. package/api/index.ts +117 -44
  2. package/api/interceptors.ts +17 -13
  3. package/components/Button/Btn.vue +1 -1
  4. package/components/Button/ScrollButtons.vue +2 -2
  5. package/components/Complex/Page.vue +1 -1
  6. package/components/Dialog/Dialog.vue +9 -39
  7. package/components/Dialog/FamilyDialog.vue +7 -4
  8. package/components/Form/FormBlock.vue +77 -33
  9. package/components/Form/FormSection.vue +4 -1
  10. package/components/Form/FormToggle.vue +2 -3
  11. package/components/Form/ManagerAttachment.vue +197 -0
  12. package/components/Form/ProductConditionsBlock.vue +60 -10
  13. package/components/Input/Datepicker.vue +6 -2
  14. package/components/Input/FileInput.vue +2 -2
  15. package/components/Input/FormInput.vue +29 -7
  16. package/components/Input/PanelInput.vue +7 -2
  17. package/components/Input/RoundedInput.vue +2 -2
  18. package/components/Input/RoundedSelect.vue +137 -0
  19. package/components/Layout/Drawer.vue +3 -2
  20. package/components/Layout/Header.vue +40 -4
  21. package/components/Layout/Loader.vue +1 -1
  22. package/components/Layout/SettingsPanel.vue +51 -13
  23. package/components/Menu/MenuHover.vue +30 -0
  24. package/components/Menu/MenuNav.vue +29 -13
  25. package/components/Menu/MenuNavItem.vue +6 -3
  26. package/components/Pages/Anketa.vue +51 -33
  27. package/components/Pages/Auth.vue +139 -46
  28. package/components/Pages/Documents.vue +6 -6
  29. package/components/Pages/InvoiceInfo.vue +30 -0
  30. package/components/Pages/MemberForm.vue +533 -292
  31. package/components/Pages/ProductAgreement.vue +4 -2
  32. package/components/Pages/ProductConditions.vue +509 -99
  33. package/components/Panel/PanelHandler.vue +93 -20
  34. package/components/Panel/PanelSelectItem.vue +1 -1
  35. package/components/Utilities/Chip.vue +27 -0
  36. package/components/Utilities/JsonViewer.vue +27 -0
  37. package/composables/axios.ts +1 -1
  38. package/composables/classes.ts +217 -97
  39. package/composables/constants.ts +26 -52
  40. package/composables/index.ts +80 -2
  41. package/composables/styles.ts +8 -3
  42. package/configs/i18n.ts +17 -0
  43. package/layouts/default.vue +6 -6
  44. package/locales/kz.json +585 -0
  45. package/locales/ru.json +587 -0
  46. package/nuxt.config.ts +9 -1
  47. package/package.json +41 -11
  48. package/pages/500.vue +2 -2
  49. package/pages/Token.vue +51 -0
  50. package/plugins/helperFunctionsPlugins.ts +3 -0
  51. package/plugins/storePlugin.ts +0 -1
  52. package/plugins/vuetifyPlugin.ts +8 -1
  53. package/store/data.store.ts +2649 -0
  54. package/store/form.store.ts +1 -1
  55. package/store/member.store.ts +164 -52
  56. package/store/{rules.js → rules.ts} +63 -25
  57. package/types/enum.ts +83 -0
  58. package/types/env.d.ts +10 -0
  59. package/types/index.ts +211 -7
  60. package/store/data.store.js +0 -2508
  61. package/store/messages.ts +0 -434
@@ -1,343 +1,360 @@
1
1
  <template>
2
2
  <section class="flex flex-col gap-4 px-[10px]">
3
3
  <v-form v-if="member" ref="vForm" @submit="submitForm" class="max-h-[82svh] overflow-y-scroll">
4
- <base-form-section :title="$t('form.personalData')">
4
+ <div v-if="memberSetting && memberSetting.has === true && memberSetting.isMultiple === true" class="flex items-center mt-[14px] min-h-[54px]">
5
+ <div :class="[$libStyles.blueBgLight]" class="flex flex-wrap items-center gap-2 p-1 rounded-t-[8px] h-full">
6
+ <div
7
+ v-for="(each, index) of formStore[whichForm]"
8
+ :key="index"
9
+ class="pl-3 pr-1 py-1 rounded-[8px] cursor-pointer flex items-center"
10
+ :class="[Number(whichIndex) === index ? `${$libStyles.blueBg} ${$libStyles.whiteText}` : '', $libStyles.textSimple]"
11
+ @click.self="index !== Number(whichIndex) ? selectMember(index) : null"
12
+ >
13
+ {{ `${$dataStore.menu.selectedItem.title} ${index + 1}` }}
14
+ <v-btn
15
+ icon="mdi-close !text-[20px]"
16
+ size="x-small"
17
+ :disabled="!memberStore.canMemberDeleted(whichForm, index) && !memberStore.canMemberCleared(whichForm, index)"
18
+ variant="plain"
19
+ :color="Number(whichIndex) === index ? '#FFF' : '#A0B3D8'"
20
+ @click.prevent="memberStore.canMemberDeleted(whichForm, index) || memberStore.canMemberCleared(whichForm, index) ? deleteMember(index) : null"
21
+ />
22
+ </div>
23
+ </div>
24
+ <v-btn class="ml-2" icon="mdi-plus !text-[24px]" @click="memberStore.addMember(whichForm)" size="small" color="#A0B3D8" variant="tonal" />
25
+ </div>
26
+ <base-form-section
27
+ :title="$dataStore.t('form.personalData')"
28
+ :class="[memberSetting && memberSetting.has === true && memberSetting.isMultiple === true ? 'rounded-t-0 !mt-[-5px]' : 'mt-[14px]']"
29
+ >
30
+ <base-form-input
31
+ v-model="member.phoneNumber"
32
+ :label="$dataStore.t('form.phoneNumber')"
33
+ :maska="$maska.phone"
34
+ :readonly="!!isDisabled || !!isIinPhoneDisabled"
35
+ :clearable="!isDisabled"
36
+ :append-inner-icon="otpCondition ? 'mdi mdi-phone-message' : ''"
37
+ @append="openCustomPanel('otp')"
38
+ @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
39
+ :rules="phoneRule"
40
+ />
5
41
  <base-form-input
6
42
  v-model="member.iin"
7
- :label="$t('form.iin')"
43
+ :label="$dataStore.t('form.iin')"
8
44
  :maska="$maska.iin"
9
- :readonly="isDisabled || isIinPhoneDisabled"
45
+ :readonly="!!isDisabled || !!isIinPhoneDisabled"
10
46
  :clearable="!isDisabled"
11
47
  :append-inner-icon="showSaveButton ? 'mdi mdi-magnify' : ''"
12
48
  @append="searchMember"
49
+ @input="onIinInput"
13
50
  :rules="$rules.required.concat($rules.iinRight)"
14
- ></base-form-input>
15
- <base-form-input
16
- v-model="member.phoneNumber"
17
- :label="$t('form.phoneNumber')"
18
- :maska="$maska.phone"
19
- :readonly="isDisabled || isIinPhoneDisabled"
20
- :clearable="!isDisabled"
21
- :append-inner-icon="otpCondition ? 'mdi mdi-phone-message' : ''"
22
- @append="sendOtp(false)"
23
- @keyup.enter.prevent="otpCondition ? sendOtp(false) : null"
24
- :rules="phoneRule"
25
- ></base-form-input>
26
- <base-fade-transition>
27
- <base-form-input
28
- v-if="otpCondition && member.otpTokenId"
29
- v-model="member.otpCode"
30
- :label="$t('form.otpCode')"
31
- :maska="$maska.otp"
32
- :append-inner-icon="hasOtp ? 'mdi mdi-check' : ''"
33
- @keyup.enter.prevent="hasOtp ? checkOtp() : null"
34
- ></base-form-input>
35
- </base-fade-transition>
51
+ />
36
52
  <base-form-input
37
- v-model="member.lastName"
53
+ v-model.trim="member.lastName"
38
54
  :readonly="isDisabled || isFromGBD"
39
55
  :clearable="!isDisabled"
40
- :label="$t('form.lastName')"
56
+ :label="$dataStore.t('form.lastName')"
41
57
  :rules="$rules.required.concat($rules.cyrillic)"
42
- ></base-form-input>
58
+ />
43
59
  <base-form-input
44
- v-model="member.firstName"
60
+ v-model.trim="member.firstName"
45
61
  :readonly="isDisabled || isFromGBD"
46
62
  :clearable="!isDisabled"
47
- :label="$t('form.firstName')"
63
+ :label="$dataStore.t('form.firstName')"
48
64
  :rules="$rules.required.concat($rules.cyrillic)"
49
- ></base-form-input>
65
+ />
50
66
  <base-form-input
51
- v-model="member.middleName"
67
+ v-model.trim="member.middleName"
52
68
  :readonly="isDisabled || isFromGBD"
53
69
  :clearable="!isDisabled"
54
- :label="$t('form.middleName')"
55
- :rules="$rules.required.concat($rules.cyrillic)"
56
- ></base-form-input>
70
+ :label="$dataStore.t('form.middleName')"
71
+ :rules="$rules.cyrillicNonRequired"
72
+ />
57
73
  <base-form-input
58
74
  v-model="member.birthDate"
59
75
  :readonly="isDisabled || isFromGBD"
60
76
  :clearable="!isDisabled"
61
- :label="$t('form.birthDate')"
62
- :rules="$rules.required.concat($rules.birthDate)"
77
+ :label="$dataStore.t('form.birthDate')"
78
+ :rules="birthDateRule"
63
79
  :maska="$maska.date"
64
80
  append-inner-icon="mdi mdi-calendar-blank-outline"
65
- ></base-form-input>
66
- <base-form-input v-model="member.age" :label="$t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule"></base-form-input>
81
+ />
82
+ <base-form-input v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule" />
67
83
  <base-panel-input
68
84
  v-model="member.gender"
69
85
  :value="member.gender.nameRu"
70
86
  :readonly="isDisabled || isFromGBD"
71
87
  :clearable="!isDisabled"
72
- :label="$t('form.gender')"
88
+ :label="$dataStore.t('form.gender')"
73
89
  :rules="$rules.objectRequired"
74
90
  append-inner-icon="mdi mdi-chevron-right"
75
- @append="openPanel($t('form.gender'), $dataStore.gender, 'gender')"
76
- ></base-panel-input>
91
+ @append="openPanel($dataStore.t('form.gender'), $dataStore.gender, 'gender')"
92
+ />
77
93
  <base-panel-input
94
+ v-if="hasFamilyStatus"
78
95
  v-model="member.familyStatus"
79
96
  :value="member.familyStatus.nameRu"
80
97
  :readonly="isDisabled"
81
98
  :clearable="!isDisabled"
82
- :label="$t('form.familyStatus')"
99
+ :label="$dataStore.t('form.familyStatus')"
83
100
  :rules="$rules.objectRequired"
84
101
  append-inner-icon="mdi mdi-chevron-right"
85
- @append="openPanel($t('form.familyStatus'), [], 'familyStatus', $dataStore.getFamilyStatuses)"
86
- ></base-panel-input>
102
+ @append="openPanel($dataStore.t('form.familyStatus'), [], 'familyStatus', $dataStore.getFamilyStatuses)"
103
+ />
87
104
  <base-panel-input
88
105
  v-if="(whichForm === formStore.beneficiaryFormKey || whichForm === formStore.insuredFormKey) && member.iin !== formStore.policyholderForm.iin"
89
106
  v-model="member.relationDegree"
90
107
  :value="member.relationDegree.nameRu"
91
108
  :readonly="isDisabled"
92
109
  :clearable="!isDisabled"
93
- :label="$t('form.relations')"
110
+ :label="$dataStore.t('form.relations')"
94
111
  :rules="$rules.objectRequired"
95
112
  append-inner-icon="mdi mdi-chevron-right"
96
- @append="openPanel($t('form.relations'), [], 'relationDegree', $dataStore.getRelationTypes)"
97
- ></base-panel-input>
113
+ @append="openPanel($dataStore.t('form.relations'), [], 'relationDegree', $dataStore.getRelationTypes)"
114
+ />
98
115
  <base-form-input
99
116
  v-if="whichForm === formStore.beneficiaryFormKey"
100
117
  v-model="member.percentageOfPayoutAmount"
101
118
  :readonly="isDisabled"
102
119
  :clearable="!isDisabled"
103
- :label="$t('form.percentageOfPayoutAmount')"
120
+ :label="$dataStore.t('form.percentageOfPayoutAmount')"
104
121
  :rules="$rules.required.concat($rules.numbers)"
105
- ></base-form-input>
106
- <base-form-toggle v-if="$dataStore.isGons" :disabled="isDisabled" :has-border="false" v-model="member.isPdl" :title="$t('isMemberIPDL')"></base-form-toggle>
122
+ />
107
123
  </base-form-section>
108
- <base-form-section :title="$t('policyholdersRepresentative.PowerOfAttorney')" v-if="whichForm === formStore.policyholdersRepresentativeFormKey">
124
+ <base-form-section :title="$dataStore.t('policyholdersRepresentative.PowerOfAttorney')" v-if="whichForm === formStore.policyholdersRepresentativeFormKey">
109
125
  <base-form-input
110
- v-model="member.fullNameRod"
111
- :label="$t('policyholdersRepresentative.NameParentCase')"
126
+ v-model.trim="member.fullNameRod"
127
+ :label="$dataStore.t('policyholdersRepresentative.NameParentCase')"
112
128
  :readonly="isDisabled"
113
129
  :clearable="!isDisabled"
114
130
  :rules="$rules.required"
115
- ></base-form-input>
131
+ />
116
132
  <base-form-input
117
- v-model="member.confirmDocTypeKz"
118
- :label="$t('policyholdersRepresentative.basisDocKz')"
133
+ v-model.trim="member.confirmDocTypeKz"
134
+ :label="$dataStore.t('policyholdersRepresentative.basisDocKz')"
119
135
  :readonly="isDisabled"
120
136
  :clearable="!isDisabled"
121
137
  :rules="$rules.required"
122
- ></base-form-input>
138
+ />
123
139
  <base-form-input
124
- v-model="member.confirmDocType"
125
- :label="$t('policyholdersRepresentative.basisDocRu')"
140
+ v-model.trim="member.confirmDocType"
141
+ :label="$dataStore.t('policyholdersRepresentative.basisDocRu')"
126
142
  :readonly="isDisabled"
127
143
  :clearable="!isDisabled"
128
144
  :rules="$rules.required"
129
- ></base-form-input>
145
+ />
130
146
  <base-form-input
131
- v-model="member.confirmDocTypeRod"
132
- :label="$t('policyholdersRepresentative.basisDocRuParentCase')"
147
+ v-model.trim="member.confirmDocTypeRod"
148
+ :label="$dataStore.t('policyholdersRepresentative.basisDocRuParentCase')"
133
149
  :readonly="isDisabled"
134
150
  :clearable="!isDisabled"
135
151
  :rules="$rules.required"
136
- ></base-form-input>
152
+ />
137
153
  <base-form-input
138
- v-model="member.confirmDocNumber"
139
- :label="$t('policyholdersRepresentative.numberDoc')"
154
+ v-model.trim="member.confirmDocNumber"
155
+ :label="$dataStore.t('policyholdersRepresentative.numberDoc')"
140
156
  :readonly="isDisabled"
141
157
  :clearable="!isDisabled"
142
158
  :rules="$rules.required"
143
- ></base-form-input>
159
+ />
144
160
  <base-form-input
145
161
  v-model="member.confirmDocIssueDate"
146
- :label="$t('form.documentDate')"
162
+ :label="$dataStore.t('form.documentDate')"
147
163
  :readonly="isDisabled"
148
164
  :clearable="!isDisabled"
149
165
  :rules="$rules.date"
150
166
  :maska="$maska.date"
151
167
  append-inner-icon="mdi mdi-calendar-blank-outline"
152
- ></base-form-input>
168
+ />
153
169
  <base-form-input
154
170
  v-model="member.confirmDocExpireDate"
155
- :label="$t('form.documentExpire')"
171
+ :label="$dataStore.t('form.documentExpire')"
156
172
  :readonly="isDisabled"
157
173
  :clearable="!isDisabled"
158
174
  :rules="$rules.date"
159
175
  :maska="$maska.date"
160
176
  append-inner-icon="mdi mdi-calendar-blank-outline"
161
- ></base-form-input>
162
- <base-form-input v-model="member.migrationCard" :label="$t('policyholdersRepresentative.numberVisa')"></base-form-input>
177
+ />
178
+ <base-form-input v-model.trim="member.migrationCard" :label="$dataStore.t('policyholdersRepresentative.numberVisa')" />
163
179
  <base-form-input
164
180
  v-model="member.migrationCardIssueDate"
165
- :label="$t('form.documentDate')"
181
+ :label="$dataStore.t('form.documentDate')"
166
182
  :readonly="isDisabled"
167
183
  :clearable="!isDisabled"
168
184
  :rules="$rules.date"
169
185
  :maska="$maska.date"
170
186
  append-inner-icon="mdi mdi-calendar-blank-outline"
171
- ></base-form-input>
187
+ />
172
188
  <base-form-input
173
189
  v-model="member.migrationCardExpireDate"
174
- :label="$t('form.documentExpire')"
190
+ :label="$dataStore.t('form.documentExpire')"
175
191
  :readonly="isDisabled"
176
192
  :clearable="!isDisabled"
177
193
  :rules="$rules.date"
178
194
  :maska="$maska.date"
179
195
  append-inner-icon="mdi mdi-calendar-blank-outline"
180
- ></base-form-input>
196
+ />
181
197
  <base-form-toggle
182
198
  v-model="formStore.policyholdersRepresentativeForm.isNotary"
183
199
  :disabled="isDisabled"
184
200
  :has-border="false"
185
- :title="$t('policyholdersRepresentative.confirmAuthority')"
186
- ></base-form-toggle>
201
+ :title="$dataStore.t('policyholdersRepresentative.confirmAuthority')"
202
+ />
187
203
  <base-form-input
188
- v-model="member.notaryLongName"
189
- :label="$t('policyholdersRepresentative.name')"
204
+ v-model.trim="member.notaryLongName"
205
+ :label="$dataStore.t('policyholdersRepresentative.name')"
190
206
  :readonly="isDisabled"
191
207
  :clearable="!isDisabled"
192
208
  :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required : []"
193
- ></base-form-input>
209
+ />
194
210
  <base-form-input
195
- v-model="member.notaryLicenseNumber"
196
- :label="$t('policyholdersRepresentative.numberLicense')"
211
+ v-model.trim="member.notaryLicenseNumber"
212
+ :label="$dataStore.t('policyholdersRepresentative.numberLicense')"
197
213
  :readonly="isDisabled"
198
214
  :clearable="!isDisabled"
199
215
  :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required : []"
200
- ></base-form-input>
216
+ />
201
217
  <base-form-input
202
- v-model="member.notaryLicenseIssuer"
203
- :label="$t('policyholdersRepresentative.documentIssuers')"
218
+ v-model.trim="member.notaryLicenseIssuer"
219
+ :label="$dataStore.t('policyholdersRepresentative.documentIssuers')"
204
220
  :readonly="isDisabled"
205
221
  :clearable="!isDisabled"
206
222
  :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required : []"
207
- ></base-form-input>
223
+ />
208
224
  <base-form-input
209
225
  v-model="member.notaryLicenseDate"
210
- :label="$t('form.documentDate')"
226
+ :label="$dataStore.t('form.documentDate')"
211
227
  :readonly="isDisabled"
212
228
  :clearable="!isDisabled"
213
229
  :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required.concat($rules.date) : []"
214
230
  :maska="$maska.date"
215
231
  append-inner-icon="mdi mdi-calendar-blank-outline"
216
- ></base-form-input>
232
+ />
217
233
  </base-form-section>
218
- <base-form-section :title="$t('form.jobData')" v-if="$dataStore.hasJobSection(whichForm)">
219
- <base-form-input v-model="member.job" :label="$t('form.job')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
220
- <base-form-input v-model="member.jobPosition" :label="$t('form.jobPosition')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
221
- <base-form-input v-model="member.jobPlace" :label="$t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
234
+ <base-form-section :title="$dataStore.t('form.jobData')" v-if="$dataStore.hasJobSection(whichForm)">
235
+ <base-form-input v-model.trim="member.job" :label="$dataStore.t('form.job')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
236
+ <base-form-input v-model.trim="member.jobPosition" :label="$dataStore.t('form.jobPosition')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
237
+ <base-form-input v-model.trim="member.jobPlace" :label="$dataStore.t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
222
238
  </base-form-section>
223
- <base-form-section :title="$t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
239
+ <base-form-section :title="$dataStore.t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
240
+ <base-form-toggle v-if="hasSameAddressToggle" v-model="sameAddress" :disabled="isDisabled" :has-border="false" :title="$dataStore.t('form.sameAddress')" />
224
241
  <base-panel-input
225
242
  v-model="member.registrationCountry"
226
243
  :value="member.registrationCountry.nameRu"
227
244
  :readonly="isDisabled"
228
245
  :clearable="!isDisabled"
229
- :label="$t('form.Country')"
246
+ :label="$dataStore.t('form.Country')"
230
247
  :rules="$rules.objectRequired"
231
248
  append-inner-icon="mdi mdi-chevron-right"
232
- @append="openPanel($t('form.Country'), [], 'registrationCountry', $dataStore.getCountries)"
233
- ></base-panel-input>
249
+ @append="openPanel($dataStore.t('form.Country'), [], 'registrationCountry', $dataStore.getCountries)"
250
+ />
234
251
  <base-fade-transition>
235
252
  <div class="flex flex-col gap-[1px]" v-if="member.registrationCountry.nameRu === 'Казахстан' || member.registrationCountry.nameRu === null">
236
253
  <base-panel-input
237
254
  v-model="member.registrationProvince"
238
255
  :value="member.registrationProvince.nameRu"
239
- :label="$t('form.Province')"
256
+ :label="$dataStore.t('form.Province')"
240
257
  :readonly="isDisabled"
241
258
  :clearable="!isDisabled"
242
259
  :rules="$rules.objectRequired"
243
260
  append-inner-icon="mdi mdi-chevron-right"
244
- @append="openPanel($t('form.Province'), [], 'registrationProvince', $dataStore.getStates, 'registrationCountry')"
245
- ></base-panel-input>
261
+ @append="openPanel($dataStore.t('form.Province'), [], 'registrationProvince', $dataStore.getStates, 'registrationCountry')"
262
+ />
246
263
  <base-panel-input
247
264
  v-model="member.registrationRegionType"
248
265
  :value="member.registrationRegionType.nameRu"
249
- :label="$t('form.RegionType')"
266
+ :label="$dataStore.t('form.RegionType')"
250
267
  :readonly="isDisabled"
251
268
  :clearable="!isDisabled"
252
269
  :rules="$rules.objectRequired"
253
270
  append-inner-icon="mdi mdi-chevron-right"
254
- @append="openPanel($t('form.RegionType'), [], 'registrationRegionType', $dataStore.getLocalityTypes)"
255
- ></base-panel-input>
271
+ @append="openPanel($dataStore.t('form.RegionType'), [], 'registrationRegionType', $dataStore.getLocalityTypes)"
272
+ />
256
273
  <base-panel-input
257
274
  v-if="member.registrationRegionType.nameRu !== 'город'"
258
275
  v-model="member.registrationRegion"
259
276
  :value="member.registrationRegion.nameRu"
260
- :label="$t('form.Region')"
277
+ :label="$dataStore.t('form.Region')"
261
278
  :readonly="isDisabled"
262
279
  :clearable="!isDisabled"
263
280
  :rules="$rules.objectRequired"
264
281
  append-inner-icon="mdi mdi-chevron-right"
265
- @append="openPanel($t('form.Region'), [], 'registrationRegion', $dataStore.getRegions, 'registrationProvince')"
266
- ></base-panel-input>
282
+ @append="openPanel($dataStore.t('form.Region'), [], 'registrationRegion', $dataStore.getRegions, 'registrationProvince')"
283
+ />
267
284
  <base-panel-input
268
285
  v-model="member.registrationCity"
269
286
  :value="member.registrationCity.nameRu"
270
- :label="$t('form.City')"
287
+ :label="$dataStore.t('form.City')"
271
288
  :readonly="isDisabled"
272
289
  :clearable="!isDisabled"
273
290
  :rules="$rules.objectRequired"
274
291
  append-inner-icon="mdi mdi-chevron-right"
275
- @append="openPanel($t('form.City'), [], 'registrationCity', $dataStore.getCities, 'registrationProvince')"
276
- ></base-panel-input>
292
+ @append="openPanel($dataStore.t('form.City'), [], 'registrationCity', $dataStore.getCities, 'registrationProvince')"
293
+ />
277
294
  <!-- <base-form-input v-if="$dataStore.isGons" v-model="member.postIndex" :readonly="isDisabled"
278
- :clearable="!isDisabled" :label="$t('form.postIndex')" :maska="$maska.post"></base-form-input> -->
279
- <base-form-input v-model="member.registrationQuarter" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.Quarter')"></base-form-input>
280
- <base-form-input v-model="member.registrationMicroDistrict" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.MicroDistrict')"></base-form-input>
295
+ :clearable="!isDisabled" :label="$dataStore.t('form.postIndex')" :maska="$maska.post"/> -->
296
+ <base-form-input v-model.trim="member.registrationQuarter" :readonly="isDisabled" :clearable="!isDisabled" :label="$dataStore.t('form.Quarter')" />
297
+ <base-form-input v-model.trim="member.registrationMicroDistrict" :readonly="isDisabled" :clearable="!isDisabled" :label="$dataStore.t('form.MicroDistrict')" />
281
298
  <base-form-input
282
- v-model="member.registrationStreet"
299
+ v-model.trim="member.registrationStreet"
283
300
  :rules="$rules.required"
284
301
  :readonly="isDisabled"
285
302
  :clearable="!isDisabled"
286
- :label="$t('form.Street')"
287
- ></base-form-input>
303
+ :label="$dataStore.t('form.Street')"
304
+ />
288
305
  <base-form-input
289
- v-model="member.registrationNumberHouse"
306
+ v-model.trim="member.registrationNumberHouse"
290
307
  :rules="$rules.required"
291
308
  :readonly="isDisabled"
292
309
  :clearable="!isDisabled"
293
- :label="$t('form.NumberHouse')"
294
- ></base-form-input>
295
- <base-form-input v-model="member.registrationNumberApartment" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.NumberApartment')"></base-form-input>
310
+ :label="$dataStore.t('form.NumberHouse')"
311
+ />
312
+ <base-form-input v-model.trim="member.registrationNumberApartment" :readonly="isDisabled" :clearable="!isDisabled" :label="$dataStore.t('form.NumberApartment')" />
296
313
  </div>
297
314
  </base-fade-transition>
298
315
  </base-form-section>
299
- <base-form-section :title="$t('form.birthData')" v-if="$dataStore.hasBirthSection(whichForm)">
316
+ <base-form-section :title="$dataStore.t('form.birthData')" v-if="$dataStore.hasBirthSection(whichForm)">
300
317
  <base-panel-input
301
318
  v-model="member.birthPlace"
302
319
  :value="member.birthPlace.nameRu"
303
- :label="$t('form.Country')"
320
+ :label="$dataStore.t('form.Country')"
304
321
  :readonly="isDisabled"
305
322
  :clearable="!isDisabled"
306
323
  :rules="$rules.objectRequired"
307
324
  append-inner-icon="mdi mdi-chevron-right"
308
- @append="openPanel($t('form.Country'), [], 'birthPlace', $dataStore.getCountries)"
309
- ></base-panel-input>
325
+ @append="openPanel($dataStore.t('form.Country'), [], 'birthPlace', $dataStore.getCountries)"
326
+ />
310
327
  <!-- TODO -->
311
328
  <!-- <base-panel-input
312
329
  v-model="member.birthRegion"
313
330
  :value="member.birthRegion.nameRu"
314
- :label="$t('form.Region')"
331
+ :label="$dataStore.t('form.Region')"
315
332
  :readonly="isDisabled"
316
333
  :clearable="!isDisabled"
317
334
  :rules="$rules.objectRequired"
318
335
  append-inner-icon="mdi mdi-chevron-right"
319
- @append="openPanel($t('form.Region'), [], 'birthRegion', $dataStore.getRegions)"
320
- ></base-panel-input> -->
336
+ @append="openPanel($dataStore.t('form.Region'), [], 'birthRegion', $dataStore.getRegions)"
337
+ /> -->
321
338
  </base-form-section>
322
- <base-form-section :title="$t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
339
+ <base-form-section :title="$dataStore.t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
323
340
  <base-panel-input
324
341
  v-model="member.documentType"
325
342
  :value="member.documentType.nameRu"
326
- :label="$t('form.documentType')"
343
+ :label="$dataStore.t('form.documentType')"
327
344
  :readonly="isDisabled"
328
345
  :clearable="!isDisabled"
329
346
  :rules="$rules.objectRequired"
330
347
  append-inner-icon="mdi mdi-chevron-right"
331
- @append="openPanel($t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
332
- ></base-panel-input>
348
+ @append="openPanel($dataStore.t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
349
+ />
333
350
  <base-form-input
334
- v-model="member.documentNumber"
335
- :label="$t('form.documentNumber')"
351
+ v-model.trim="member.documentNumber"
352
+ :label="$dataStore.t('form.documentNumber')"
336
353
  :readonly="isDisabled"
337
354
  :clearable="!isDisabled"
338
355
  :rules="$rules.required"
339
- ></base-form-input>
340
- <!-- <base-file-input v-if="!memberDocument" :disabled="isDisabled" :clearable="!isDisabled" @input="attachFile($event)"></base-file-input>
356
+ />
357
+ <!-- <base-file-input v-if="!memberDocument" :disabled="isDisabled" :clearable="!isDisabled" @input="attachFile($event)" />
341
358
  <base-empty-form-field v-if="memberDocument" @click="!isDisabled && openCustomPanel('document')" class="justify-between">
342
359
  {{ `${memberDocument.fileTypeName} - ${memberDocument.fileName}` }}
343
360
  <i class="cursor-pointer mdi mdi-file-document mr-6 text-[#a0b3d8] text-xl"></i>
@@ -345,154 +362,184 @@
345
362
  <base-panel-input
346
363
  v-model="member.documentIssuers"
347
364
  :value="member.documentIssuers.nameRu"
348
- :label="$t('form.documentIssuers')"
365
+ :label="$dataStore.t('form.documentIssuers')"
349
366
  :readonly="isDisabled"
350
367
  :clearable="!isDisabled"
351
368
  :rules="$rules.objectRequired"
352
369
  append-inner-icon="mdi mdi-chevron-right"
353
- @append="openPanel($t('form.documentIssuers'), [], 'documentIssuers', $dataStore.getDocumentIssuers)"
354
- ></base-panel-input>
370
+ @append="openPanel($dataStore.t('form.documentIssuers'), [], 'documentIssuers', $dataStore.getDocumentIssuers)"
371
+ />
355
372
  <base-form-input
356
373
  v-model="member.documentDate"
357
- :label="$t('form.documentDate')"
374
+ :label="$dataStore.t('form.documentDate')"
358
375
  :readonly="isDisabled"
359
376
  :clearable="!isDisabled"
360
377
  :rules="$rules.required.concat($rules.date)"
361
378
  :maska="$maska.date"
362
379
  append-inner-icon="mdi mdi-calendar-blank-outline"
363
- ></base-form-input>
380
+ />
364
381
  <base-fade-transition>
365
382
  <base-form-input
366
383
  v-if="member.documentType.ids !== 'SBI' && member.documentType.ids !== 'VNZ'"
367
384
  v-model="member.documentExpire"
368
- :label="$t('form.documentExpire')"
385
+ :label="$dataStore.t('form.documentExpire')"
369
386
  :readonly="isDisabled"
370
387
  :clearable="!isDisabled"
371
388
  :rules="$rules.required.concat($rules.date)"
372
389
  :maska="$maska.date"
373
390
  append-inner-icon="mdi mdi-calendar-blank-outline"
374
- ></base-form-input>
391
+ />
375
392
  </base-fade-transition>
376
393
  <base-panel-input
377
394
  v-model="member.signOfResidency"
378
395
  :value="member.signOfResidency.nameRu"
379
- :label="$t('form.signOfResidency')"
396
+ :label="$dataStore.t('form.signOfResidency')"
380
397
  :readonly="isDisabled"
381
398
  :clearable="!isDisabled"
382
399
  :rules="residencyRule"
383
400
  append-inner-icon="mdi mdi-chevron-right"
384
- @append="openPanel($t('form.signOfResidency'), [], 'signOfResidency', $dataStore.getResidents)"
385
- ></base-panel-input>
401
+ @append="openPanel($dataStore.t('form.signOfResidency'), [], 'signOfResidency', $dataStore.getResidents)"
402
+ />
386
403
  <base-panel-input
387
404
  v-model="member.countryOfTaxResidency"
388
405
  :value="member.countryOfTaxResidency.nameRu"
389
- :label="$t('form.countryOfTaxResidency')"
406
+ :label="$dataStore.t('form.countryOfTaxResidency')"
390
407
  :readonly="isDisabled"
391
408
  :clearable="!isDisabled"
392
409
  :rules="$rules.objectRequired"
393
410
  append-inner-icon="mdi mdi-chevron-right"
394
- @append="openPanel($t('form.countryOfTaxResidency'), [], 'countryOfTaxResidency', $dataStore.getTaxCountries)"
395
- ></base-panel-input>
411
+ @append="openPanel($dataStore.t('form.countryOfTaxResidency'), [], 'countryOfTaxResidency', $dataStore.getTaxCountries)"
412
+ />
396
413
  <base-fade-transition>
397
414
  <base-panel-input
398
415
  v-if="member.countryOfTaxResidency.ids === '500014.3'"
399
416
  v-model="member.addTaxResidency"
400
417
  :value="member.addTaxResidency.nameRu"
401
- :label="$t('form.addTaxResidency')"
418
+ :label="$dataStore.t('form.addTaxResidency')"
402
419
  :readonly="isDisabled"
403
420
  :clearable="!isDisabled"
404
421
  :rules="$rules.objectRequired"
405
422
  append-inner-icon="mdi mdi-chevron-right"
406
- @append="openPanel($t('form.addTaxResidency'), [], 'addTaxResidency', $dataStore.getAdditionalTaxCountries)"
407
- ></base-panel-input>
423
+ @append="openPanel($dataStore.t('form.addTaxResidency'), [], 'addTaxResidency', $dataStore.getAdditionalTaxCountries)"
424
+ />
408
425
  </base-fade-transition>
409
426
  <base-panel-input
427
+ v-if="hasSignOfIPDL"
410
428
  v-model="member.signOfIPDL"
411
429
  :value="member.signOfIPDL.nameRu"
412
- :label="$t('form.signOfIPDL')"
430
+ :label="$dataStore.t('form.signOfIPDL')"
413
431
  :readonly="isDisabled"
414
432
  :clearable="!isDisabled"
415
433
  :rules="$rules.objectRequired"
416
434
  append-inner-icon="mdi mdi-chevron-right"
417
- @append="openPanel($t('form.signOfIPDL'), $dataStore.ipdl, 'signOfIPDL')"
418
- ></base-panel-input>
435
+ @append="openPanel($dataStore.t('form.signOfIPDL'), $dataStore.ipdl, 'signOfIPDL')"
436
+ />
419
437
  <base-panel-input
420
438
  v-model="member.countryOfCitizenship"
421
439
  :value="member.countryOfCitizenship.nameRu"
422
- :label="$t('form.countryOfCitizenship')"
440
+ :label="$dataStore.t('form.countryOfCitizenship')"
423
441
  :readonly="isDisabled"
424
442
  :clearable="!isDisabled"
425
443
  :rules="$rules.objectRequired"
426
444
  append-inner-icon="mdi mdi-chevron-right"
427
- @append="openPanel($t('form.countryOfCitizenship'), [], 'countryOfCitizenship', $dataStore.getCitizenshipCountries)"
428
- ></base-panel-input>
445
+ @append="openPanel($dataStore.t('form.countryOfCitizenship'), [], 'countryOfCitizenship', $dataStore.getCitizenshipCountries)"
446
+ />
429
447
  <base-panel-input
430
448
  v-model="member.economySectorCode"
431
449
  :value="member.economySectorCode.nameRu"
432
- :label="$t('form.economySectorCode')"
450
+ :label="$dataStore.t('form.economySectorCode')"
433
451
  :readonly="isDisabled"
434
452
  :clearable="!isDisabled"
435
453
  :rules="$rules.objectRequired"
436
454
  append-inner-icon="mdi mdi-chevron-right"
437
- @append="openPanel($t('form.economySectorCode'), [], 'economySectorCode', $dataStore.getSectorCodeList)"
438
- ></base-panel-input>
455
+ @append="openPanel($dataStore.t('form.economySectorCode'), [], 'economySectorCode', $dataStore.getSectorCodeList)"
456
+ />
457
+ <base-panel-input
458
+ v-if="hasInsurancePay"
459
+ v-model="member.insurancePay"
460
+ :value="member.insurancePay.nameRu"
461
+ :readonly="isDisabled"
462
+ :clearable="!isDisabled"
463
+ :rules="$rules.objectRequired"
464
+ :label="$dataStore.t('form.insurancePay')"
465
+ append-inner-icon="mdi mdi-chevron-right"
466
+ @append="openPanel($dataStore.t('form.insurancePay'), $dataStore.insurancePay, 'insurancePay', $dataStore.getInsurancePay)"
467
+ />
439
468
  </base-form-section>
440
- <base-form-section :title="$t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
469
+ <base-form-section :title="$dataStore.t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
441
470
  <base-form-input
442
471
  v-model="member.homePhone"
443
472
  :maska="$maska.phone"
444
473
  placeholder="+7 7"
445
- :label="$t('form.homePhone')"
474
+ :label="$dataStore.t('form.homePhone')"
446
475
  :readonly="isDisabled"
447
476
  :clearable="!isDisabled"
448
477
  :rules="whichForm === formStore.beneficiaryFormKey ? [] : $rules.phoneFormat"
449
- ></base-form-input>
450
- <base-form-input v-model.trim="member.email" :label="$t('form.email')" :rules="$rules.email"></base-form-input>
478
+ />
479
+ <base-form-input v-model.trim="member.email" :label="$dataStore.t('form.email')" :rules="$rules.email" />
451
480
  </base-form-section>
452
481
  </v-form>
453
- <base-btn v-if="showSaveButton" :loading="isButtonLoading || isSubmittingForm" :text="$t('buttons.save')" @click="submitForm"></base-btn>
482
+ <base-btn v-if="showSaveButton" :loading="isButtonLoading || isSubmittingForm" :text="$dataStore.t('buttons.save')" @click="submitForm" />
454
483
  <Teleport v-if="isPanelOpen" to="#panel-actions">
455
484
  <div :class="[$libStyles.scrollPage]" class="flex flex-col items-center">
456
- <base-rounded-input v-model="searchQuery" :label="$t('labels.search')" class="w-full p-2" :hide-details="true"></base-rounded-input>
485
+ <base-rounded-input v-model="searchQuery" :label="$dataStore.t('labels.search')" class="w-full p-2" :hide-details="true" />
457
486
  <div v-if="panelList && isPanelLoading === false" class="w-full flex flex-col gap-2 p-2">
458
- <base-panel-select-item :text="$t('form.notChosen')" :selected="panelValue.nameRu === null" @click="pickPanelValue(new Value())"></base-panel-select-item>
487
+ <base-panel-select-item :text="$dataStore.t('form.notChosen')" :selected="panelValue.nameRu === null" @click="pickPanelValue(new Value())" />
459
488
  <base-panel-select-item
460
489
  v-for="(item, index) of panelList.filter(i => i.nameRu && (i.nameRu as string).match(new RegExp(searchQuery, 'i')))"
461
490
  :key="index"
462
491
  :text="(item.nameRu as string)"
463
492
  :selected="item.nameRu === panelValue.nameRu"
464
493
  @click="pickPanelValue(item)"
465
- ></base-panel-select-item>
494
+ />
466
495
  </div>
467
- <base-loader v-if="isPanelLoading" class="absolute mt-10" :size="50"></base-loader>
496
+ <base-loader v-if="isPanelLoading" class="absolute mt-10" :size="50" />
468
497
  </div>
469
498
  </Teleport>
470
499
  <Teleport v-if="isSearchOpen" to="#panel-actions">
471
500
  <div :class="[$libStyles.flexColNav]">
472
- <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$t('buttons.fromGBDFL')" @click="getContragentFromGBDFL"></base-btn>
473
- <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$t('buttons.fromInsis')" @click="getContragent"></base-btn>
474
- <base-btn v-if="hasGKB" :loading="isButtonLoading" :text="$t('buttons.fromGKB')" @click="getFamilyInfo"></base-btn>
501
+ <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
502
+ <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
503
+ <base-btn v-if="hasGKB" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGKB')" @click="getFamilyInfo" />
475
504
  </div>
476
505
  </Teleport>
477
506
  <Teleport v-if="isDocumentOpen" to="#panel-actions">
478
507
  <div :class="[$libStyles.flexColNav]">
479
- <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getFile('view')"></base-btn>
480
- <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getFile('download')"></base-btn>
508
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getFile('view')" />
509
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getFile('download')" />
481
510
  </div>
482
511
  </Teleport>
483
- <base-dialog v-model="familyDialog" :title="$t('dialog.familyMember')" actions="familyDialog">
512
+ <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#panel-actions">
513
+ <div :class="[$libStyles.flexColNav]">
514
+ <base-fade-transition>
515
+ <base-rounded-input
516
+ v-if="otpCondition && member.otpTokenId"
517
+ v-model="member.otpCode"
518
+ :label="$dataStore.t('form.otpCode')"
519
+ :maska="$maska.otp"
520
+ :append-inner-icon="hasOtp ? 'mdi-cellphone-message text-[17px]' : ''"
521
+ hide-details
522
+ @keyup.enter.prevent="hasOtp ? checkOtp() : null"
523
+ @input="onOtpCodeInput"
524
+ />
525
+ </base-fade-transition>
526
+ <base-btn v-if="!member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.sendOtp')" @click="sendOtp(false)" />
527
+ <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.check')" @click="checkOtp()" />
528
+ </div>
529
+ </Teleport>
530
+ <base-dialog v-model="familyDialog" :title="$dataStore.t('dialog.familyMember')" actions="familyDialog">
484
531
  <template #actions>
485
- <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)"></base-family-dialog>
532
+ <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" />
486
533
  </template>
487
534
  </base-dialog>
488
535
  </section>
489
- <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')"></base-scroll-buttons>
536
+ <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')" />
490
537
  </template>
491
538
 
492
539
  <script lang="ts">
493
- import { LocationQueryValue } from 'vue-router';
494
- import { Value, DocumentItem } from '@/composables/classes';
540
+ import { Value, DocumentItem, Member } from '../../composables/classes';
495
541
  import { uuid } from 'vue-uuid';
542
+ import { StoreMembers } from '../../types/enum';
496
543
 
497
544
  export default {
498
545
  setup() {
@@ -502,31 +549,35 @@ export default {
502
549
  const dataStore = useDataStore();
503
550
  const formStore = useFormStore();
504
551
  const memberStore = useMemberStore();
505
- const getMember = (whichForm: LocationQueryValue | LocationQueryValue[], whichIndex?: LocationQueryValue | LocationQueryValue[]) =>
506
- memberStore.getMemberFromStore(whichForm as MemberKeys, Number((whichIndex ? whichIndex : '0') as string))!;
507
- const member = ref(getMember(route.query.tab, route.query.i));
552
+ const whichForm = computed(() => route.query.tab as keyof typeof StoreMembers);
553
+ const whichIndex = computed(() => route.query.i as string);
554
+ const getMember = (whichForm: keyof typeof StoreMembers, whichIndex?: string) => memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
555
+ const member = ref(getMember(whichForm.value, whichIndex.value));
508
556
  const selectedFamilyMember = ref<BirthInfoGKB>({});
509
557
  const isPanelOpen = ref<boolean>(false);
510
558
  const memberDocument = ref<DocumentItem>();
511
559
  const isButtonLoading = ref<boolean>(false);
512
560
  const isSubmittingForm = ref<boolean>(false);
513
561
  const documentLoading = ref<boolean>(false);
562
+ const otpSending = ref<boolean>(false);
514
563
  const isSearchOpen = ref<boolean>(false);
515
564
  const isDocumentOpen = ref<boolean>(false);
565
+ const isOtpPanelOpen = ref<boolean>(false);
516
566
  const isPanelLoading = ref<boolean>(false);
567
+ const isChangingMember = ref<boolean>(false);
517
568
  const familyDialog = ref<boolean>(false);
569
+ const sameAddress = ref<boolean>(false);
518
570
  const panelValue = ref<Value>(new Value());
519
571
  const panelList = ref<Value[]>([]);
520
572
  const currentPanel = ref<keyof typeof member.value>();
521
573
  const searchQuery = ref<string>('');
522
574
  const fileData = ref<{ file: any }>();
523
575
 
524
- const whichForm = computed(() => route.query.tab);
525
- const whichIndex = computed(() => route.query.i);
576
+ const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
526
577
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
527
- const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value as string));
578
+ const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value));
528
579
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
529
- const isIinPhoneDisabled = computed(() => formStore.applicationData && 'regNumber' in formStore.applicationData && whichForm.value === formStore.policyholderFormKey);
580
+ const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
530
581
  const isFromGBD = computed(() => !!member.value.gosPersonData);
531
582
  const showSaveButton = computed(() => {
532
583
  const generalCondition = !isDisabled.value && !!isTask.value && !!dataStore.isInitiator();
@@ -546,14 +597,39 @@ export default {
546
597
  return generalCondition && perMemberCondtion();
547
598
  });
548
599
 
549
- const hasGBDFL = computed(() => dataStore.controls.hasGBDFL && !hasGKB.value);
600
+ const hasGBDFL = computed(() => {
601
+ const perMemberCondition = () => {
602
+ switch (whichForm.value) {
603
+ case formStore.beneficiaryFormKey: {
604
+ if (dataStore.isKazyna || dataStore.isLiferenta) {
605
+ return !!member.value.iin;
606
+ }
607
+ if (dataStore.isBolashak || dataStore.isGons) {
608
+ return false;
609
+ }
610
+ return true;
611
+ }
612
+ case formStore.insuredFormKey:
613
+ case formStore.beneficiaryFormKey:
614
+ case formStore.beneficialOwnerFormKey:
615
+ case formStore.policyholdersRepresentativeFormKey:
616
+ return true;
617
+ default:
618
+ return true;
619
+ }
620
+ };
621
+ return dataStore.controls.hasGBDFL && perMemberCondition();
622
+ });
550
623
  const hasInsis = computed(() => dataStore.controls.hasInsis);
551
624
  const hasGKB = computed(() => {
552
- const byProductCondition = dataStore.isGons || dataStore.isBolashak;
553
625
  const perMemberCondition = () => {
554
626
  switch (whichForm.value) {
555
- case formStore.beneficiaryFormKey:
627
+ case formStore.beneficiaryFormKey: {
628
+ if (dataStore.isKazyna || dataStore.isLiferenta) {
629
+ return !member.value.iin;
630
+ }
556
631
  return member.value.id === 0;
632
+ }
557
633
  case formStore.policyholderFormKey:
558
634
  case formStore.insuredFormKey:
559
635
  case formStore.beneficialOwnerFormKey:
@@ -563,56 +639,91 @@ export default {
563
639
  return false;
564
640
  }
565
641
  };
566
- return dataStore.controls.hasGKB && !!dataStore.isTask() && byProductCondition && perMemberCondition();
642
+ return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
567
643
  });
568
644
 
645
+ const hasFamilyStatus = computed(() => {
646
+ if (whichForm.value === formStore.beneficiaryFormKey) {
647
+ if (dataStore.isBolashak) {
648
+ return false;
649
+ }
650
+ }
651
+ return true;
652
+ });
653
+ const hasInsurancePay = computed(() => {
654
+ if (whichForm.value === formStore.beneficiaryFormKey) {
655
+ if (dataStore.isBolashak || dataStore.isLiferenta) {
656
+ return true;
657
+ }
658
+ }
659
+ return false;
660
+ });
661
+ const hasSignOfIPDL = computed(() => {
662
+ if (dataStore.isGons) {
663
+ return false;
664
+ }
665
+ return true;
666
+ });
667
+ const hasSameAddressToggle = computed(() => whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin);
668
+
669
+ const birthDateRule = computed(() => {
670
+ const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
671
+ const byMemverAndProductRule = () => {
672
+ if (whichForm.value === formStore.policyholderFormKey) {
673
+ if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
674
+ return dataStore.rules.age18ByDate;
675
+ }
676
+ }
677
+ if (whichForm.value === formStore.insuredFormKey) {
678
+ if (dataStore.isBolashak || dataStore.isBaiterek) {
679
+ return dataStore.rules.age18ByDate;
680
+ }
681
+ }
682
+ return [];
683
+ };
684
+ return baseDateRule.concat(byMemverAndProductRule());
685
+ });
569
686
  const ageRule = computed(() => {
570
- const baseAgeRule = dataStore.rules.required.concat(dataStore.rules.numbers);
687
+ const baseAgeRule = dataStore.rules.numbers;
571
688
  const byMemberAndProductRule = () => {
572
- switch (whichForm.value) {
573
- case formStore.policyholderFormKey: {
574
- if (dataStore.isGons || dataStore.isBolashak) {
575
- return dataStore.rules.policyholderAgeLimit;
576
- }
689
+ if (whichForm.value === formStore.policyholderFormKey) {
690
+ if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
691
+ return dataStore.rules.age18;
577
692
  }
578
- case formStore.beneficiaryFormKey: {
579
- if (dataStore.isBolashak) {
580
- return dataStore.rules.beneficiaryAgeLimit;
581
- }
693
+ }
694
+ if (whichForm.value === formStore.beneficiaryFormKey) {
695
+ if (dataStore.isBolashak) {
696
+ return dataStore.rules.beneficiaryAgeLimit;
582
697
  }
583
- default:
584
- return [];
585
698
  }
699
+ if (whichForm.value === formStore.insuredFormKey) {
700
+ if (dataStore.isBaiterek || dataStore.isBolashak) {
701
+ return dataStore.rules.age18;
702
+ }
703
+ }
704
+ return [];
586
705
  };
587
706
  return baseAgeRule.concat(byMemberAndProductRule());
588
707
  });
589
708
 
590
709
  const phoneRule = computed(() => {
591
710
  const basePhoneRule = dataStore.rules.required.concat(dataStore.rules.phoneFormat);
592
- const byMemberAndProductRule = () => {
593
- switch (whichForm.value) {
594
- case formStore.beneficiaryFormKey: {
595
- if (dataStore.isGons || dataStore.isBolashak) {
596
- return [];
597
- }
598
- }
599
- default:
600
- return basePhoneRule;
711
+ if (whichForm.value === formStore.beneficiaryFormKey) {
712
+ if (dataStore.isGons || dataStore.isBolashak) {
713
+ return [];
601
714
  }
602
- };
603
- return byMemberAndProductRule();
715
+ }
716
+ return basePhoneRule;
604
717
  });
605
718
 
606
719
  const residencyRule = computed(() => {
607
- switch (whichForm.value) {
608
- case formStore.policyholderFormKey: {
609
- if (dataStore.isBolashak || dataStore.isBaiterek) {
610
- return dataStore.rules.objectRequired.concat(dataStore.rules.noResident);
611
- }
720
+ const baseResidencyRule = dataStore.rules.objectRequired;
721
+ if (whichForm.value === formStore.policyholderFormKey) {
722
+ if (dataStore.isBolashak || dataStore.isBaiterek) {
723
+ return baseResidencyRule.concat(dataStore.rules.noResident);
612
724
  }
613
- default:
614
- return dataStore.rules.objectRequired;
615
725
  }
726
+ return baseResidencyRule;
616
727
  });
617
728
 
618
729
  const getOtpConditionByMember = () => {
@@ -636,10 +747,11 @@ export default {
636
747
  const searchMember = async () => {
637
748
  if (!isDisabled.value) {
638
749
  dataStore.panelAction = null;
639
- dataStore.panel.title = 'Поиск клиента';
750
+ dataStore.panel.title = 'Поиск контрагента';
640
751
  dataStore.panel.open = true;
641
752
  isSearchOpen.value = true;
642
753
  isDocumentOpen.value = false;
754
+ isOtpPanelOpen.value = false;
643
755
  isPanelOpen.value = false;
644
756
  } else {
645
757
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
@@ -650,13 +762,21 @@ export default {
650
762
  vForm.value.scrollTo({ top: direction === 'up' ? 0 : screen.height * 10, behavior: 'smooth' });
651
763
  };
652
764
 
653
- const openCustomPanel = (type: 'document' = 'document') => {
765
+ const openCustomPanel = (type: 'document' | 'otp' = 'document') => {
654
766
  dataStore.panelAction = null;
655
767
  if (type === 'document' && memberDocument.value) {
656
768
  dataStore.panel.title = memberDocument.value.fileTypeName!;
657
769
  isDocumentOpen.value = true;
658
770
  isSearchOpen.value = false;
659
771
  isPanelOpen.value = false;
772
+ isOtpPanelOpen.value = false;
773
+ }
774
+ if (type === 'otp') {
775
+ dataStore.panel.title = dataStore.t('form.otpCode');
776
+ isOtpPanelOpen.value = true;
777
+ isDocumentOpen.value = false;
778
+ isSearchOpen.value = false;
779
+ isPanelOpen.value = false;
660
780
  }
661
781
  dataStore.panel.open = true;
662
782
  };
@@ -665,6 +785,7 @@ export default {
665
785
  if (!isDisabled.value) {
666
786
  isSearchOpen.value = false;
667
787
  isDocumentOpen.value = false;
788
+ isOtpPanelOpen.value = false;
668
789
  // Feature
669
790
  // const notAllowedToChange = ['gender', 'documentType', 'documentIssuers'];
670
791
  // if (member.value.gotFromInsis === false && notAllowedToChange.includes(key)) {
@@ -683,7 +804,7 @@ export default {
683
804
  isPanelLoading.value = true;
684
805
  newList = await asyncFunction(filterKey, member.value);
685
806
  }
686
- panelList.value = newList;
807
+ panelList.value = filterList(newList, key);
687
808
  panelValue.value = member.value[currentPanel.value];
688
809
  isPanelLoading.value = false;
689
810
  } else {
@@ -691,6 +812,22 @@ export default {
691
812
  }
692
813
  };
693
814
 
815
+ const filterList = (list: Value[], key: string) => {
816
+ if (dataStore.isBolashak) {
817
+ if (key === 'relationDegree') {
818
+ if (whichForm.value === formStore.beneficiaryFormKey) {
819
+ const beneficiaryRelations = [12, 13, 14, 15, 20, 21, 22, 23];
820
+ return list.filter(i => beneficiaryRelations.includes(Number(i.ids)));
821
+ }
822
+ if (whichForm.value === formStore.insuredFormKey) {
823
+ const insuredRelations = [6, 7, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23];
824
+ return list.filter(i => insuredRelations.includes(Number(i.ids)));
825
+ }
826
+ }
827
+ }
828
+ return list;
829
+ };
830
+
694
831
  const pickPanelValue = (item: Value) => {
695
832
  if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
696
833
  dataStore.panel.open = false;
@@ -745,6 +882,7 @@ export default {
745
882
  };
746
883
 
747
884
  const getFamilyInfo = async () => {
885
+ if (!formStore.policyholderForm.iin || !formStore.policyholderForm.phoneNumber) return;
748
886
  if (formStore.birthInfos.length === 0) {
749
887
  isButtonLoading.value = true;
750
888
  await dataStore.getFamilyInfo(formStore.policyholderForm.iin, formStore.policyholderForm.phoneNumber);
@@ -786,59 +924,63 @@ export default {
786
924
  };
787
925
 
788
926
  const getContragentFromGBDFL = async () => {
789
- if (member.value.hasAgreement === false) {
927
+ if (member.value.hasAgreement !== true) {
790
928
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
791
929
  dataStore.panel.open = false;
792
930
  isSearchOpen.value = false;
793
931
  return;
794
932
  }
795
933
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length || !member.value.phoneNumber || member.value.phoneNumber.length !== useMask().phone.length) {
796
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'Номер телефона, ИИН'), 5000);
934
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'Номер телефона, ИИН' }), 5000);
797
935
  dataStore.panel.open = false;
798
936
  isSearchOpen.value = false;
799
937
  return;
800
938
  }
801
939
  isButtonLoading.value = true;
802
- await dataStore.getContragentFromGBDFL(member.value.iin, member.value.phoneNumber, whichForm.value, whichIndex.value ? Number(whichIndex.value) : null);
803
- member.value.gotFromInsis = true;
940
+ const response = await dataStore.getContragentFromGBDFL(member.value);
941
+ if (typeof response === 'boolean') {
942
+ if (response === true) {
943
+ member.value.gotFromInsis = true;
944
+ }
945
+ dataStore.panel.open = false;
946
+ isSearchOpen.value = false;
947
+ }
804
948
  isButtonLoading.value = false;
805
- dataStore.panel.open = false;
806
- isSearchOpen.value = false;
807
949
  };
808
950
 
809
951
  const getContragent = async () => {
810
- if (member.value.hasAgreement === false) {
952
+ if (member.value.hasAgreement !== true) {
811
953
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
812
954
  dataStore.panel.open = false;
813
955
  isSearchOpen.value = false;
814
956
  return;
815
957
  }
816
958
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
817
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'ИИН'), 5000);
959
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
818
960
  dataStore.panel.open = false;
819
961
  isSearchOpen.value = false;
820
962
  return;
821
963
  }
822
964
  isButtonLoading.value = true;
823
- await dataStore.getContragent(member.value, whichForm.value, whichIndex.value, false);
965
+ await dataStore.getContragent(member.value, false);
824
966
  isButtonLoading.value = false;
825
967
  dataStore.panel.open = false;
826
968
  isSearchOpen.value = false;
827
969
  };
828
970
 
829
971
  const validateESBD = async (docTypeNumber: number) => {
830
- const data = {
972
+ const data: ESBDValidationType = {
831
973
  personType: 1,
832
974
  iin: member.value.iin!.replaceAll('-', ''),
833
- lastName: member.value.lastName,
834
- firstName: member.value.firstName,
835
- middleName: member.value.middleName,
836
- birthDate: member.value.getDateByKey('birthDate'),
837
- sex: member.value.gender.id,
975
+ lastName: member.value.lastName ?? '',
976
+ firstName: member.value.firstName ?? '',
977
+ middleName: member.value.middleName ?? '',
978
+ birthDate: member.value.getDateByKey('birthDate') ?? '',
979
+ sex: Number(member.value.gender.id),
838
980
  docType: docTypeNumber,
839
- docNumber: member.value.documentNumber,
840
- docIssuedDate: member.value.getDateByKey('documentDate'),
841
- docIssuedBy: member.value.documentIssuers.nameRu,
981
+ docNumber: member.value.documentNumber ?? '',
982
+ docIssuedDate: member.value.getDateByKey('documentDate') ?? '',
983
+ docIssuedBy: member.value.documentIssuers.nameRu ?? '',
842
984
  activityKindId: 0,
843
985
  economicsSectorId: Number((member.value.economySectorCode.ids! as string).at(-1)),
844
986
  resident: member.value.signOfResidency.ids === '500011.2' || member.value.signOfResidency.ids === null ? 0 : 1,
@@ -848,18 +990,20 @@ export default {
848
990
  };
849
991
 
850
992
  const saveMember = async () => {
851
- const hasSaved = await dataStore.saveContragent(member.value, whichForm.value, whichIndex.value, true);
993
+ const hasSaved = await dataStore.saveContragent(member.value, whichForm.value, whichIndex.value ? Number(whichIndex.value) : null, true);
852
994
  if (hasSaved === false) {
853
995
  dataStore.isLoading = false;
854
996
  return false;
855
997
  }
856
998
  const isInsured = formStore.isPolicyholderInsured;
999
+ const remoteIsInsured = ref<boolean | null>(null);
857
1000
  if (whichForm.value == formStore.policyholderFormKey) {
858
1001
  if (route.params.taskId === '0') {
859
1002
  try {
860
1003
  const taskId = await dataStore.startApplication(member.value);
861
- if (taskId) {
1004
+ if (typeof taskId === 'string') {
862
1005
  await dataStore.getApplicationData(taskId, false, false, false, false);
1006
+ remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
863
1007
  await router.replace({
864
1008
  name: route.name!,
865
1009
  params: { taskId: taskId as string },
@@ -881,23 +1025,33 @@ export default {
881
1025
  await uploadFile(formStore.applicationData.processInstanceId);
882
1026
  }
883
1027
  }
884
- const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value as MemberKeys, whichIndex.value ? Number(whichIndex.value) : undefined);
885
- const isSaved = await dataStore.saveMember(member.value, memberStore.getMemberCode(whichForm.value as MemberKeys), memberFromApplicaiton);
1028
+ const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value, whichIndex.value ? Number(whichIndex.value) : undefined);
1029
+ if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
1030
+ return false;
1031
+ }
1032
+ const wasInsuredAction = ref<boolean>(false);
1033
+ const isSaved = await dataStore.saveMember(member.value, memberStore.getMemberCode(whichForm.value)!, memberFromApplicaiton);
886
1034
  if (!isSaved) return false;
887
- if (whichForm.value === formStore.policyholderFormKey && isInsured === true) {
888
- formStore.insuredForm[0] = formStore.policyholderForm;
889
- const isInsuredSaved = await dataStore.saveMember(
890
- member.value,
891
- memberStore.getMemberCode(formStore.insuredFormKey as MemberKeys),
892
- memberStore.getMemberFromApplication(formStore.insuredFormKey as MemberKeys, formStore.insuredFormIndex),
893
- );
894
- if (!isInsuredSaved) return false;
1035
+ if (whichForm.value === formStore.policyholderFormKey) {
1036
+ if (isInsured === true || remoteIsInsured.value === true) {
1037
+ formStore.insuredForm[0] = formStore.policyholderForm;
1038
+ const isInsuredSaved = await dataStore.saveMember(
1039
+ member.value,
1040
+ memberStore.getMemberCode(formStore.insuredFormKey)!,
1041
+ memberStore.getMemberFromApplication(formStore.insuredFormKey, formStore.insuredFormIndex),
1042
+ );
1043
+ if (!isInsuredSaved) return false;
1044
+ wasInsuredAction.value = true;
1045
+ }
1046
+ }
1047
+ if (whichForm.value === formStore.insuredFormKey) {
1048
+ wasInsuredAction.value = true;
895
1049
  }
896
1050
  await router.replace({
897
1051
  name: route.name!,
898
1052
  query: { ...route.query, id: member.value.id },
899
1053
  });
900
- await dataStore.getApplicationData(route.params.taskId, false, false, false, false);
1054
+ await dataStore.getApplicationData(route.params.taskId as string, false, false, true, wasInsuredAction.value);
901
1055
  if (dataStore.controls.hasCalculator) {
902
1056
  if (formStore.additionalInsuranceTermsWithout && formStore.additionalInsuranceTermsWithout.length !== 0) {
903
1057
  formStore.additionalInsuranceTerms.forEach((term: any) => {
@@ -921,7 +1075,7 @@ export default {
921
1075
  return true;
922
1076
  }
923
1077
  }
924
- if (member.value.hasAgreement === false) {
1078
+ if (member.value.hasAgreement !== true) {
925
1079
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
926
1080
  return false;
927
1081
  }
@@ -963,11 +1117,11 @@ export default {
963
1117
  if (errors) {
964
1118
  const errorText = errors.querySelector('.v-label.v-field-label');
965
1119
  if (errorText) {
966
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', errorText.innerHTML?.replace(/[-<>!//.]/g, '')));
1120
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: errorText.innerHTML?.replace(/[-<>!//.]/g, '') }));
967
1121
  } else {
968
1122
  const errorFieldText = errors.querySelector('.v-input__control');
969
1123
  if (errorFieldText) {
970
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', errorFieldText.innerHTML?.replace(/[-<>!//.]/g, '')));
1124
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: errorFieldText.innerHTML?.replace(/[-<>!//.]/g, '') }));
971
1125
  }
972
1126
  }
973
1127
  errors.scrollIntoView({
@@ -982,67 +1136,133 @@ export default {
982
1136
 
983
1137
  const checkOtp = async () => {
984
1138
  if (!member.value.otpCode || member.value.iin?.length !== useMask().iin.length || member.value.phoneNumber?.length !== useMask().phone.length) {
985
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', dataStore.t('form.otpCode')), 3000);
1139
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: dataStore.t('form.otpCode') }), 3000);
986
1140
  return;
987
1141
  }
1142
+ otpSending.value = true;
988
1143
  const checked = await memberStore.checkOtp(member.value);
989
1144
  if (typeof checked !== 'undefined') {
990
1145
  member.value.hasAgreement = checked;
991
1146
  }
1147
+ otpSending.value = false;
1148
+ if (checked === true) {
1149
+ dataStore.panel.open = false;
1150
+ }
992
1151
  };
993
1152
 
994
1153
  const sendOtp = async (onInit = false) => {
1154
+ otpSending.value = true;
995
1155
  const response = await memberStore.sendOtp(member.value, formStore.applicationData.processInstanceId, onInit);
996
1156
  if (response) {
997
1157
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
1158
+ if (response.otpStatus === true) {
1159
+ dataStore.panel.open = false;
1160
+ }
998
1161
  }
1162
+ otpSending.value = false;
999
1163
  };
1000
1164
 
1001
- const onInit = async () => {
1002
- if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
1003
- await dataStore.getSignedDocList(formStore.applicationData.processInstanceId);
1165
+ const setDefaultValues = async () => {
1166
+ const setDefaults = dataStore.controls.setDefaults;
1167
+ if (setDefaults.sectorCode) {
1168
+ await setSectorCode();
1169
+ }
1170
+ if (setDefaults.percentage) {
1171
+ setPercentage();
1004
1172
  }
1173
+ };
1174
+
1175
+ const setSectorCode = async () => {
1176
+ if (member.value.id === 0 && route.query.id === '0') {
1177
+ const sectorList = await dataStore.getSectorCodeList();
1178
+ const defaultValue = sectorList.find(item => item.ids === '500003.9') as Value;
1179
+ member.value.economySectorCode = defaultValue ? defaultValue : new Value();
1180
+ }
1181
+ };
1182
+
1183
+ const setPercentage = () => {
1184
+ if (whichForm.value === formStore.beneficiaryFormKey && member.value.id === 0 && route.query.id === '0' && member.value.percentageOfPayoutAmount === null) {
1185
+ if (dataStore.members.beneficiaryApp.isMultiple) {
1186
+ const availablePercentage =
1187
+ 100 -
1188
+ formStore.beneficiaryForm.reduce((sum: number, member: Member) => {
1189
+ return sum + Number(member.percentageOfPayoutAmount);
1190
+ }, 0);
1191
+ if (availablePercentage >= 0 && availablePercentage <= 100) member.value.percentageOfPayoutAmount = availablePercentage;
1192
+ } else {
1193
+ member.value.percentageOfPayoutAmount = 100;
1194
+ }
1195
+ }
1196
+ };
1197
+
1198
+ const selectMember = async (index: number, update?: boolean) => {
1199
+ dataStore.panel.open = false;
1200
+ isButtonLoading.value = true;
1201
+ isChangingMember.value = true;
1202
+ //@ts-ignore
1203
+ await router.replace({ query: { ...route.query, i: index, id: getMember(route.query.tab, index).id, upd: update } });
1204
+ isChangingMember.value = false;
1205
+ isButtonLoading.value = false;
1206
+ };
1207
+
1208
+ const deleteMember = async (index: number) => {
1209
+ await memberStore.deleteMember(route.params.taskId as string, whichForm.value, index);
1210
+ const currentIndex = Number(whichIndex.value);
1211
+ if (index <= currentIndex) {
1212
+ const newIndex = ref<number>(currentIndex - 1 > 0 ? currentIndex - 1 : 0);
1213
+ await selectMember(newIndex.value, index === currentIndex ? true : undefined);
1214
+ }
1215
+ };
1216
+
1217
+ const onInit = async () => {
1218
+ // if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
1219
+ // await dataStore.getSignedDocList(formStore.applicationData.processInstanceId);
1220
+ // }
1005
1221
  if (getOtpConditionByMember()) {
1006
1222
  await sendOtp(true);
1007
1223
  } else {
1008
1224
  if (member.value.hasAgreement === null) member.value.hasAgreement = true;
1009
1225
  }
1010
- if (route.query.id !== '0' && !member.value.id) {
1011
- await dataStore.getContragentById(route.query.id, whichForm.value, true);
1012
- }
1013
- if (member.value.id && route.query.id === '0') {
1014
- await router.replace({
1015
- name: route.name!,
1016
- query: { ...route.query, id: member.value.id },
1017
- });
1018
- }
1019
- if (member.value.id) {
1020
- const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1021
- if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1226
+ if (!member.value.id) {
1227
+ await router.replace({ query: { ...route.query, id: 0 } });
1228
+ } else {
1229
+ if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1230
+ // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1231
+ // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1022
1232
  }
1233
+ await setDefaultValues();
1023
1234
  };
1024
1235
 
1025
1236
  onMounted(async () => {
1026
1237
  await onInit();
1027
1238
  });
1028
1239
 
1029
- onBeforeRouteUpdate(to => {
1030
- if ('tab' in to.query && to.query.tab !== 'productConditions') {
1031
- member.value = getMember(to.query.tab, to.query.i);
1032
- }
1033
- });
1240
+ watch(
1241
+ () => sameAddress.value,
1242
+ () => {
1243
+ if (whichForm.value === formStore.beneficiaryFormKey) setAddressBeneficiary(Number(whichIndex.value), sameAddress.value);
1244
+ },
1245
+ );
1034
1246
 
1035
1247
  watch(
1036
1248
  () => member.value.percentageOfPayoutAmount,
1037
1249
  val => {
1038
- const percentage = typeof val === 'string' ? Number(val) : val;
1039
- if (percentage) {
1040
- if (percentage < 0) {
1041
- member.value.percentageOfPayoutAmount = 0;
1042
- dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1043
- } else if (percentage > 100) {
1044
- member.value.percentageOfPayoutAmount = 100;
1045
- dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1250
+ if (whichForm.value === formStore.beneficiaryFormKey && !isDisabled.value) {
1251
+ const percentage = typeof val === 'string' ? Number(val) : val;
1252
+ if (typeof percentage === 'number') {
1253
+ if (memberSetting.value.isMultiple) {
1254
+ if (percentage < 0) {
1255
+ member.value.percentageOfPayoutAmount = 0;
1256
+ dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1257
+ } else if (percentage > 100) {
1258
+ member.value.percentageOfPayoutAmount = 100;
1259
+ dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1260
+ }
1261
+ } else {
1262
+ if (member.value.percentageOfPayoutAmount !== 100) {
1263
+ member.value.percentageOfPayoutAmount = 100;
1264
+ }
1265
+ }
1046
1266
  }
1047
1267
  }
1048
1268
  },
@@ -1058,14 +1278,21 @@ export default {
1058
1278
  },
1059
1279
  );
1060
1280
 
1061
- watch(
1062
- () => member.value.otpCode,
1063
- async () => {
1064
- if (member.value.otpCode && member.value.otpCode.length === useMask().otp.length) {
1065
- await checkOtp();
1281
+ const onIinInput = () => {
1282
+ if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value.isMultiple === true) {
1283
+ const alreadyInStatement = formStore[whichForm.value as MultipleMember].findIndex((i: Member) => i.iin === member.value.iin);
1284
+ if (alreadyInStatement !== -1 && alreadyInStatement !== Number(whichIndex.value)) {
1285
+ dataStore.showToaster('error', dataStore.t('toaster.hasAlreadyMember'), 3000);
1286
+ member.value.iin = null;
1066
1287
  }
1067
- },
1068
- );
1288
+ }
1289
+ };
1290
+
1291
+ const onOtpCodeInput = async () => {
1292
+ if (member.value.otpCode && member.value.otpCode.length === useMask().otp.length) {
1293
+ await checkOtp();
1294
+ }
1295
+ };
1069
1296
 
1070
1297
  watch(
1071
1298
  () => dataStore.panel.open,
@@ -1074,6 +1301,7 @@ export default {
1074
1301
  isPanelOpen.value = false;
1075
1302
  isDocumentOpen.value = false;
1076
1303
  isSearchOpen.value = false;
1304
+ isOtpPanelOpen.value = false;
1077
1305
  dataStore.panelAction = null;
1078
1306
  }
1079
1307
  },
@@ -1095,10 +1323,12 @@ export default {
1095
1323
  isPanelOpen,
1096
1324
  isSearchOpen,
1097
1325
  isDocumentOpen,
1326
+ isOtpPanelOpen,
1098
1327
  isPanelLoading,
1099
1328
  isButtonLoading,
1100
1329
  isSubmittingForm,
1101
1330
  documentLoading,
1331
+ otpSending,
1102
1332
  panelValue,
1103
1333
  panelList,
1104
1334
  searchQuery,
@@ -1106,10 +1336,12 @@ export default {
1106
1336
  memberDocument,
1107
1337
  familyDialog,
1108
1338
  selectedFamilyMember,
1339
+ sameAddress,
1109
1340
 
1110
1341
  // Computed
1111
1342
  whichForm,
1112
1343
  whichIndex,
1344
+ memberSetting,
1113
1345
  otpCondition,
1114
1346
  hasOtp,
1115
1347
  isDisabled,
@@ -1120,11 +1352,16 @@ export default {
1120
1352
  hasGBDFL,
1121
1353
  hasInsis,
1122
1354
  hasGKB,
1355
+ hasFamilyStatus,
1356
+ hasInsurancePay,
1357
+ hasSignOfIPDL,
1358
+ hasSameAddressToggle,
1123
1359
 
1124
1360
  // Rules
1125
1361
  ageRule,
1126
1362
  phoneRule,
1127
1363
  residencyRule,
1364
+ birthDateRule,
1128
1365
 
1129
1366
  // Functions
1130
1367
  searchMember,
@@ -1142,6 +1379,10 @@ export default {
1142
1379
  selectFamilyMember,
1143
1380
  closeFamilyDialog,
1144
1381
  scrollForm,
1382
+ onIinInput,
1383
+ onOtpCodeInput,
1384
+ deleteMember,
1385
+ selectMember,
1145
1386
  };
1146
1387
  },
1147
1388
  };