hl-core 0.0.8 → 0.0.9-beta.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 (62) hide show
  1. package/api/index.ts +142 -101
  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 +90 -42
  9. package/components/Form/FormSection.vue +4 -1
  10. package/components/Form/FormToggle.vue +1 -2
  11. package/components/Form/ManagerAttachment.vue +197 -0
  12. package/components/Form/ProductConditionsBlock.vue +68 -14
  13. package/components/Input/Datepicker.vue +45 -0
  14. package/components/Input/FileInput.vue +2 -2
  15. package/components/Input/FormInput.vue +31 -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 +4 -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 +59 -33
  27. package/components/Pages/Auth.vue +139 -46
  28. package/components/Pages/Documents.vue +7 -7
  29. package/components/Pages/InvoiceInfo.vue +30 -0
  30. package/components/Pages/MemberForm.vue +544 -293
  31. package/components/Pages/ProductAgreement.vue +4 -2
  32. package/components/Pages/ProductConditions.vue +673 -75
  33. package/components/Panel/PanelHandler.vue +304 -0
  34. package/components/Panel/PanelSelectItem.vue +1 -1
  35. package/components/Transitions/SlideTransition.vue +5 -0
  36. package/components/Utilities/Chip.vue +27 -0
  37. package/components/Utilities/JsonViewer.vue +27 -0
  38. package/composables/axios.ts +1 -1
  39. package/composables/classes.ts +223 -101
  40. package/composables/constants.ts +26 -51
  41. package/composables/index.ts +80 -2
  42. package/composables/styles.ts +15 -3
  43. package/configs/i18n.ts +17 -0
  44. package/layouts/default.vue +6 -6
  45. package/locales/kz.json +585 -0
  46. package/locales/ru.json +587 -0
  47. package/nuxt.config.ts +13 -1
  48. package/package.json +43 -11
  49. package/pages/500.vue +2 -2
  50. package/pages/Token.vue +51 -0
  51. package/plugins/helperFunctionsPlugins.ts +6 -0
  52. package/plugins/storePlugin.ts +0 -1
  53. package/plugins/vuetifyPlugin.ts +8 -1
  54. package/store/data.store.ts +2649 -0
  55. package/store/form.store.ts +1 -1
  56. package/store/member.store.ts +164 -52
  57. package/store/{rules.js → rules.ts} +65 -34
  58. package/types/enum.ts +83 -0
  59. package/types/env.d.ts +10 -0
  60. package/types/index.ts +262 -5
  61. package/store/data.store.js +0 -2482
  62. package/store/messages.ts +0 -429
@@ -1,498 +1,545 @@
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>
51
+ />
15
52
  <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>
36
- <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="isDisabled || isFromGBD" :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="$dataStore.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>
344
- </base-empty-form-field>
361
+ </base-empty-form-field> -->
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
- :rules="$rules.objectRequired"
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
- :text="item.nameRu as string"
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,48 +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();
643
+ });
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;
567
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);
568
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
- } else {
577
- return [];
578
- }
689
+ if (whichForm.value === formStore.policyholderFormKey) {
690
+ if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
691
+ return dataStore.rules.age18;
579
692
  }
580
- case formStore.beneficiaryFormKey: {
581
- if (dataStore.isGons || dataStore.isBolashak) {
582
- return dataStore.rules.beneficiaryAgeLimit;
583
- } else {
584
- return [];
585
- }
693
+ }
694
+ if (whichForm.value === formStore.beneficiaryFormKey) {
695
+ if (dataStore.isBolashak) {
696
+ return dataStore.rules.beneficiaryAgeLimit;
586
697
  }
587
- default:
588
- return [];
589
698
  }
699
+ if (whichForm.value === formStore.insuredFormKey) {
700
+ if (dataStore.isBaiterek || dataStore.isBolashak) {
701
+ return dataStore.rules.age18;
702
+ }
703
+ }
704
+ return [];
590
705
  };
591
706
  return baseAgeRule.concat(byMemberAndProductRule());
592
707
  });
593
708
 
594
709
  const phoneRule = computed(() => {
595
710
  const basePhoneRule = dataStore.rules.required.concat(dataStore.rules.phoneFormat);
596
- const byMemberAndProductRule = () => {
597
- switch (whichForm.value) {
598
- case formStore.beneficiaryFormKey: {
599
- if (dataStore.isGons || dataStore.isBolashak) {
600
- return [];
601
- }
602
- }
603
- default:
604
- return basePhoneRule;
711
+ if (whichForm.value === formStore.beneficiaryFormKey) {
712
+ if (dataStore.isGons || dataStore.isBolashak) {
713
+ return [];
605
714
  }
606
- };
607
- return byMemberAndProductRule();
715
+ }
716
+ return basePhoneRule;
717
+ });
718
+
719
+ const residencyRule = computed(() => {
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);
724
+ }
725
+ }
726
+ return baseResidencyRule;
608
727
  });
609
728
 
610
729
  const getOtpConditionByMember = () => {
@@ -628,10 +747,11 @@ export default {
628
747
  const searchMember = async () => {
629
748
  if (!isDisabled.value) {
630
749
  dataStore.panelAction = null;
631
- dataStore.panel.title = 'Поиск клиента';
750
+ dataStore.panel.title = 'Поиск контрагента';
632
751
  dataStore.panel.open = true;
633
752
  isSearchOpen.value = true;
634
753
  isDocumentOpen.value = false;
754
+ isOtpPanelOpen.value = false;
635
755
  isPanelOpen.value = false;
636
756
  } else {
637
757
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
@@ -642,13 +762,21 @@ export default {
642
762
  vForm.value.scrollTo({ top: direction === 'up' ? 0 : screen.height * 10, behavior: 'smooth' });
643
763
  };
644
764
 
645
- const openCustomPanel = (type: 'document' = 'document') => {
765
+ const openCustomPanel = (type: 'document' | 'otp' = 'document') => {
646
766
  dataStore.panelAction = null;
647
767
  if (type === 'document' && memberDocument.value) {
648
768
  dataStore.panel.title = memberDocument.value.fileTypeName!;
649
769
  isDocumentOpen.value = true;
650
770
  isSearchOpen.value = false;
651
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;
652
780
  }
653
781
  dataStore.panel.open = true;
654
782
  };
@@ -657,6 +785,7 @@ export default {
657
785
  if (!isDisabled.value) {
658
786
  isSearchOpen.value = false;
659
787
  isDocumentOpen.value = false;
788
+ isOtpPanelOpen.value = false;
660
789
  // Feature
661
790
  // const notAllowedToChange = ['gender', 'documentType', 'documentIssuers'];
662
791
  // if (member.value.gotFromInsis === false && notAllowedToChange.includes(key)) {
@@ -675,7 +804,7 @@ export default {
675
804
  isPanelLoading.value = true;
676
805
  newList = await asyncFunction(filterKey, member.value);
677
806
  }
678
- panelList.value = newList;
807
+ panelList.value = filterList(newList, key);
679
808
  panelValue.value = member.value[currentPanel.value];
680
809
  isPanelLoading.value = false;
681
810
  } else {
@@ -683,6 +812,22 @@ export default {
683
812
  }
684
813
  };
685
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
+
686
831
  const pickPanelValue = (item: Value) => {
687
832
  if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
688
833
  dataStore.panel.open = false;
@@ -737,6 +882,7 @@ export default {
737
882
  };
738
883
 
739
884
  const getFamilyInfo = async () => {
885
+ if (!formStore.policyholderForm.iin || !formStore.policyholderForm.phoneNumber) return;
740
886
  if (formStore.birthInfos.length === 0) {
741
887
  isButtonLoading.value = true;
742
888
  await dataStore.getFamilyInfo(formStore.policyholderForm.iin, formStore.policyholderForm.phoneNumber);
@@ -778,59 +924,63 @@ export default {
778
924
  };
779
925
 
780
926
  const getContragentFromGBDFL = async () => {
781
- if (member.value.hasAgreement === false) {
927
+ if (member.value.hasAgreement !== true) {
782
928
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
783
929
  dataStore.panel.open = false;
784
930
  isSearchOpen.value = false;
785
931
  return;
786
932
  }
787
933
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length || !member.value.phoneNumber || member.value.phoneNumber.length !== useMask().phone.length) {
788
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'Номер телефона, ИИН'), 5000);
934
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'Номер телефона, ИИН' }), 5000);
789
935
  dataStore.panel.open = false;
790
936
  isSearchOpen.value = false;
791
937
  return;
792
938
  }
793
939
  isButtonLoading.value = true;
794
- await dataStore.getContragentFromGBDFL(member.value.iin, member.value.phoneNumber, whichForm.value, whichIndex.value ? Number(whichIndex.value) : null);
795
- 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
+ }
796
948
  isButtonLoading.value = false;
797
- dataStore.panel.open = false;
798
- isSearchOpen.value = false;
799
949
  };
800
950
 
801
951
  const getContragent = async () => {
802
- if (member.value.hasAgreement === false) {
952
+ if (member.value.hasAgreement !== true) {
803
953
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
804
954
  dataStore.panel.open = false;
805
955
  isSearchOpen.value = false;
806
956
  return;
807
957
  }
808
958
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
809
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'ИИН'), 5000);
959
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
810
960
  dataStore.panel.open = false;
811
961
  isSearchOpen.value = false;
812
962
  return;
813
963
  }
814
964
  isButtonLoading.value = true;
815
- await dataStore.getContragent(member.value, whichForm.value, whichIndex.value, false);
965
+ await dataStore.getContragent(member.value, false);
816
966
  isButtonLoading.value = false;
817
967
  dataStore.panel.open = false;
818
968
  isSearchOpen.value = false;
819
969
  };
820
970
 
821
971
  const validateESBD = async (docTypeNumber: number) => {
822
- const data = {
972
+ const data: ESBDValidationType = {
823
973
  personType: 1,
824
974
  iin: member.value.iin!.replaceAll('-', ''),
825
- lastName: member.value.lastName,
826
- firstName: member.value.firstName,
827
- middleName: member.value.middleName,
828
- birthDate: member.value.getDateByKey('birthDate'),
829
- 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),
830
980
  docType: docTypeNumber,
831
- docNumber: member.value.documentNumber,
832
- docIssuedDate: member.value.getDateByKey('documentDate'),
833
- docIssuedBy: member.value.documentIssuers.nameRu,
981
+ docNumber: member.value.documentNumber ?? '',
982
+ docIssuedDate: member.value.getDateByKey('documentDate') ?? '',
983
+ docIssuedBy: member.value.documentIssuers.nameRu ?? '',
834
984
  activityKindId: 0,
835
985
  economicsSectorId: Number((member.value.economySectorCode.ids! as string).at(-1)),
836
986
  resident: member.value.signOfResidency.ids === '500011.2' || member.value.signOfResidency.ids === null ? 0 : 1,
@@ -840,18 +990,20 @@ export default {
840
990
  };
841
991
 
842
992
  const saveMember = async () => {
843
- 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);
844
994
  if (hasSaved === false) {
845
995
  dataStore.isLoading = false;
846
996
  return false;
847
997
  }
848
998
  const isInsured = formStore.isPolicyholderInsured;
999
+ const remoteIsInsured = ref<boolean | null>(null);
849
1000
  if (whichForm.value == formStore.policyholderFormKey) {
850
1001
  if (route.params.taskId === '0') {
851
1002
  try {
852
1003
  const taskId = await dataStore.startApplication(member.value);
853
- if (taskId) {
1004
+ if (typeof taskId === 'string') {
854
1005
  await dataStore.getApplicationData(taskId, false, false, false, false);
1006
+ remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
855
1007
  await router.replace({
856
1008
  name: route.name!,
857
1009
  params: { taskId: taskId as string },
@@ -873,23 +1025,33 @@ export default {
873
1025
  await uploadFile(formStore.applicationData.processInstanceId);
874
1026
  }
875
1027
  }
876
- const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value as MemberKeys, whichIndex.value ? Number(whichIndex.value) : undefined);
877
- 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);
878
1034
  if (!isSaved) return false;
879
- if (whichForm.value === formStore.policyholderFormKey && isInsured === true) {
880
- formStore.insuredForm[0] = formStore.policyholderForm;
881
- const isInsuredSaved = await dataStore.saveMember(
882
- member.value,
883
- memberStore.getMemberCode(formStore.insuredFormKey as MemberKeys),
884
- memberStore.getMemberFromApplication(formStore.insuredFormKey as MemberKeys, formStore.insuredFormIndex),
885
- );
886
- 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;
887
1049
  }
888
1050
  await router.replace({
889
1051
  name: route.name!,
890
1052
  query: { ...route.query, id: member.value.id },
891
1053
  });
892
- await dataStore.getApplicationData(route.params.taskId, false, false, false, false);
1054
+ await dataStore.getApplicationData(route.params.taskId as string, false, false, true, wasInsuredAction.value);
893
1055
  if (dataStore.controls.hasCalculator) {
894
1056
  if (formStore.additionalInsuranceTermsWithout && formStore.additionalInsuranceTermsWithout.length !== 0) {
895
1057
  formStore.additionalInsuranceTerms.forEach((term: any) => {
@@ -913,7 +1075,7 @@ export default {
913
1075
  return true;
914
1076
  }
915
1077
  }
916
- if (member.value.hasAgreement === false) {
1078
+ if (member.value.hasAgreement !== true) {
917
1079
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
918
1080
  return false;
919
1081
  }
@@ -937,7 +1099,7 @@ export default {
937
1099
  const initialPoint = `${member.value.iin!.replaceAll('-', '')}.`;
938
1100
  const RESPONSE = ESBDMessage(ESBDResponse, initialPoint);
939
1101
  let errorMessage = RESPONSE !== false ? RESPONSE : 'Что-то произошло не так';
940
- if (ESBDResponse.errorCode === 0) {
1102
+ if (typeof ESBDResponse === 'object' && ESBDResponse.errorCode === 0) {
941
1103
  member.value.verifyType = 'ESBD';
942
1104
  member.value.verifyDate = ESBDResponse.verifiedDate;
943
1105
  const hasMemberSaved = await saveMember();
@@ -955,11 +1117,11 @@ export default {
955
1117
  if (errors) {
956
1118
  const errorText = errors.querySelector('.v-label.v-field-label');
957
1119
  if (errorText) {
958
- 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, '') }));
959
1121
  } else {
960
1122
  const errorFieldText = errors.querySelector('.v-input__control');
961
1123
  if (errorFieldText) {
962
- 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, '') }));
963
1125
  }
964
1126
  }
965
1127
  errors.scrollIntoView({
@@ -974,67 +1136,133 @@ export default {
974
1136
 
975
1137
  const checkOtp = async () => {
976
1138
  if (!member.value.otpCode || member.value.iin?.length !== useMask().iin.length || member.value.phoneNumber?.length !== useMask().phone.length) {
977
- 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);
978
1140
  return;
979
1141
  }
1142
+ otpSending.value = true;
980
1143
  const checked = await memberStore.checkOtp(member.value);
981
1144
  if (typeof checked !== 'undefined') {
982
1145
  member.value.hasAgreement = checked;
983
1146
  }
1147
+ otpSending.value = false;
1148
+ if (checked === true) {
1149
+ dataStore.panel.open = false;
1150
+ }
984
1151
  };
985
1152
 
986
1153
  const sendOtp = async (onInit = false) => {
1154
+ otpSending.value = true;
987
1155
  const response = await memberStore.sendOtp(member.value, formStore.applicationData.processInstanceId, onInit);
988
1156
  if (response) {
989
1157
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
1158
+ if (response.otpStatus === true) {
1159
+ dataStore.panel.open = false;
1160
+ }
990
1161
  }
1162
+ otpSending.value = false;
991
1163
  };
992
1164
 
993
- const onInit = async () => {
994
- if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
995
- 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();
996
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
+ // }
997
1221
  if (getOtpConditionByMember()) {
998
1222
  await sendOtp(true);
999
1223
  } else {
1000
1224
  if (member.value.hasAgreement === null) member.value.hasAgreement = true;
1001
1225
  }
1002
- if (route.query.id !== '0' && !member.value.id) {
1003
- await dataStore.getContragentById(route.query.id, whichForm.value, true);
1004
- }
1005
- if (member.value.id && route.query.id === '0') {
1006
- await router.replace({
1007
- name: route.name!,
1008
- query: { ...route.query, id: member.value.id },
1009
- });
1010
- }
1011
- if (member.value.id) {
1012
- const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1013
- 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];
1014
1232
  }
1233
+ await setDefaultValues();
1015
1234
  };
1016
1235
 
1017
1236
  onMounted(async () => {
1018
1237
  await onInit();
1019
1238
  });
1020
1239
 
1021
- onBeforeRouteUpdate(to => {
1022
- if ('tab' in to.query && to.query.tab !== 'productConditions') {
1023
- member.value = getMember(to.query.tab, to.query.i);
1024
- }
1025
- });
1240
+ watch(
1241
+ () => sameAddress.value,
1242
+ () => {
1243
+ if (whichForm.value === formStore.beneficiaryFormKey) setAddressBeneficiary(Number(whichIndex.value), sameAddress.value);
1244
+ },
1245
+ );
1026
1246
 
1027
1247
  watch(
1028
1248
  () => member.value.percentageOfPayoutAmount,
1029
1249
  val => {
1030
- const percentage = typeof val === 'string' ? Number(val) : val;
1031
- if (percentage) {
1032
- if (percentage < 0) {
1033
- member.value.percentageOfPayoutAmount = 0;
1034
- dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1035
- } else if (percentage > 100) {
1036
- member.value.percentageOfPayoutAmount = 100;
1037
- 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
+ }
1038
1266
  }
1039
1267
  }
1040
1268
  },
@@ -1050,14 +1278,21 @@ export default {
1050
1278
  },
1051
1279
  );
1052
1280
 
1053
- watch(
1054
- () => member.value.otpCode,
1055
- async () => {
1056
- if (member.value.otpCode && member.value.otpCode.length === useMask().otp.length) {
1057
- 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;
1058
1287
  }
1059
- },
1060
- );
1288
+ }
1289
+ };
1290
+
1291
+ const onOtpCodeInput = async () => {
1292
+ if (member.value.otpCode && member.value.otpCode.length === useMask().otp.length) {
1293
+ await checkOtp();
1294
+ }
1295
+ };
1061
1296
 
1062
1297
  watch(
1063
1298
  () => dataStore.panel.open,
@@ -1066,6 +1301,7 @@ export default {
1066
1301
  isPanelOpen.value = false;
1067
1302
  isDocumentOpen.value = false;
1068
1303
  isSearchOpen.value = false;
1304
+ isOtpPanelOpen.value = false;
1069
1305
  dataStore.panelAction = null;
1070
1306
  }
1071
1307
  },
@@ -1087,10 +1323,12 @@ export default {
1087
1323
  isPanelOpen,
1088
1324
  isSearchOpen,
1089
1325
  isDocumentOpen,
1326
+ isOtpPanelOpen,
1090
1327
  isPanelLoading,
1091
1328
  isButtonLoading,
1092
1329
  isSubmittingForm,
1093
1330
  documentLoading,
1331
+ otpSending,
1094
1332
  panelValue,
1095
1333
  panelList,
1096
1334
  searchQuery,
@@ -1098,10 +1336,12 @@ export default {
1098
1336
  memberDocument,
1099
1337
  familyDialog,
1100
1338
  selectedFamilyMember,
1339
+ sameAddress,
1101
1340
 
1102
1341
  // Computed
1103
1342
  whichForm,
1104
1343
  whichIndex,
1344
+ memberSetting,
1105
1345
  otpCondition,
1106
1346
  hasOtp,
1107
1347
  isDisabled,
@@ -1112,9 +1352,16 @@ export default {
1112
1352
  hasGBDFL,
1113
1353
  hasInsis,
1114
1354
  hasGKB,
1355
+ hasFamilyStatus,
1356
+ hasInsurancePay,
1357
+ hasSignOfIPDL,
1358
+ hasSameAddressToggle,
1359
+
1115
1360
  // Rules
1116
1361
  ageRule,
1117
1362
  phoneRule,
1363
+ residencyRule,
1364
+ birthDateRule,
1118
1365
 
1119
1366
  // Functions
1120
1367
  searchMember,
@@ -1132,6 +1379,10 @@ export default {
1132
1379
  selectFamilyMember,
1133
1380
  closeFamilyDialog,
1134
1381
  scrollForm,
1382
+ onIinInput,
1383
+ onOtpCodeInput,
1384
+ deleteMember,
1385
+ selectMember,
1135
1386
  };
1136
1387
  },
1137
1388
  };