hl-core 0.0.8 → 0.0.9-beta.10

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 (73) hide show
  1. package/api/index.ts +202 -161
  2. package/api/interceptors.ts +23 -17
  3. package/components/Button/Btn.vue +4 -4
  4. package/components/Button/ScrollButtons.vue +2 -2
  5. package/components/Complex/ContentBlock.vue +1 -1
  6. package/components/Complex/MessageBlock.vue +26 -0
  7. package/components/Complex/Page.vue +8 -2
  8. package/components/Complex/WhiteBlock.vue +7 -0
  9. package/components/Dialog/Dialog.vue +9 -39
  10. package/components/Dialog/FamilyDialog.vue +10 -7
  11. package/components/Form/FormBlock.vue +91 -45
  12. package/components/Form/FormSection.vue +5 -2
  13. package/components/Form/FormTextSection.vue +3 -3
  14. package/components/Form/FormToggle.vue +4 -5
  15. package/components/Form/ManagerAttachment.vue +210 -0
  16. package/components/Form/ProductConditionsBlock.vue +70 -16
  17. package/components/Input/Datepicker.vue +45 -0
  18. package/components/Input/EmptyFormField.vue +1 -1
  19. package/components/Input/FileInput.vue +2 -3
  20. package/components/Input/FormInput.vue +31 -7
  21. package/components/Input/PanelInput.vue +7 -2
  22. package/components/Input/RoundedEmptyField.vue +5 -0
  23. package/components/Input/RoundedInput.vue +2 -2
  24. package/components/Input/RoundedSelect.vue +150 -0
  25. package/components/Layout/Drawer.vue +5 -2
  26. package/components/Layout/Header.vue +41 -5
  27. package/components/Layout/Loader.vue +1 -1
  28. package/components/Layout/SettingsPanel.vue +47 -13
  29. package/components/List/ListEmpty.vue +1 -1
  30. package/components/Menu/MenuHover.vue +30 -0
  31. package/components/Menu/MenuNav.vue +30 -14
  32. package/components/Menu/MenuNavItem.vue +10 -7
  33. package/components/Pages/Anketa.vue +68 -47
  34. package/components/Pages/Auth.vue +139 -46
  35. package/components/Pages/ContragentForm.vue +505 -0
  36. package/components/Pages/Documents.vue +11 -11
  37. package/components/Pages/InvoiceInfo.vue +30 -0
  38. package/components/Pages/MemberForm.vue +574 -316
  39. package/components/Pages/ProductAgreement.vue +2 -2
  40. package/components/Pages/ProductConditions.vue +671 -78
  41. package/components/Panel/PanelHandler.vue +309 -0
  42. package/components/Panel/PanelSelectItem.vue +3 -3
  43. package/components/Transitions/SlideTransition.vue +5 -0
  44. package/components/Utilities/Chip.vue +27 -0
  45. package/components/Utilities/IconBorder.vue +17 -0
  46. package/components/Utilities/JsonViewer.vue +27 -0
  47. package/composables/axios.ts +2 -2
  48. package/composables/classes.ts +227 -107
  49. package/composables/constants.ts +31 -51
  50. package/composables/index.ts +106 -2
  51. package/composables/styles.ts +33 -11
  52. package/configs/i18n.ts +15 -0
  53. package/layouts/default.vue +11 -8
  54. package/layouts/full.vue +1 -1
  55. package/locales/ru.json +647 -0
  56. package/nuxt.config.ts +14 -2
  57. package/package.json +35 -12
  58. package/pages/500.vue +4 -4
  59. package/pages/Token.vue +52 -0
  60. package/plugins/helperFunctionsPlugins.ts +11 -6
  61. package/plugins/storePlugin.ts +0 -1
  62. package/plugins/vuetifyPlugin.ts +8 -1
  63. package/store/data.store.ts +2666 -0
  64. package/store/form.store.ts +1 -1
  65. package/store/member.store.ts +164 -52
  66. package/store/rules.ts +193 -0
  67. package/types/enum.ts +83 -0
  68. package/types/env.d.ts +10 -0
  69. package/types/index.ts +279 -8
  70. package/components/Button/BtnIcon.vue +0 -47
  71. package/store/data.store.js +0 -2482
  72. package/store/messages.ts +0 -429
  73. package/store/rules.js +0 -153
@@ -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="[$styles.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 ? `${$styles.blueBg} ${$styles.whiteText}` : '', $styles.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
- :value="member.gender.nameRu"
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
- :value="member.familyStatus.nameRu"
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
- :value="member.relationDegree.nameRu"
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
- :value="member.registrationCountry.nameRu"
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
- :value="member.registrationProvince.nameRu"
239
- :label="$t('form.Province')"
255
+ :value="member.registrationProvince?.nameRu"
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
- :value="member.registrationRegionType.nameRu"
249
- :label="$t('form.RegionType')"
265
+ :value="member.registrationRegionType?.nameRu"
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
- :value="member.registrationRegion.nameRu"
260
- :label="$t('form.Region')"
276
+ :value="member.registrationRegion?.nameRu"
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
- :value="member.registrationCity.nameRu"
270
- :label="$t('form.City')"
286
+ :value="member.registrationCity?.nameRu"
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
- :value="member.birthPlace.nameRu"
303
- :label="$t('form.Country')"
319
+ :value="member.birthPlace?.nameRu"
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
- :value="member.birthRegion.nameRu"
314
- :label="$t('form.Region')"
330
+ :value="member.birthRegion?.nameRu"
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
- :value="member.documentType.nameRu"
326
- :label="$t('form.documentType')"
342
+ :value="member.documentType?.nameRu"
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
- :value="member.documentIssuers.nameRu"
348
- :label="$t('form.documentIssuers')"
364
+ :value="member.documentIssuers?.nameRu"
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
- :value="member.signOfResidency.nameRu"
379
- :label="$t('form.signOfResidency')"
395
+ :value="member.signOfResidency?.nameRu"
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
- :value="member.countryOfTaxResidency.nameRu"
389
- :label="$t('form.countryOfTaxResidency')"
405
+ :value="member.countryOfTaxResidency?.nameRu"
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
- :value="member.addTaxResidency.nameRu"
401
- :label="$t('form.addTaxResidency')"
417
+ :value="member.addTaxResidency?.nameRu"
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
- :value="member.signOfIPDL.nameRu"
412
- :label="$t('form.signOfIPDL')"
429
+ :value="member.signOfIPDL?.nameRu"
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
- :value="member.countryOfCitizenship.nameRu"
422
- :label="$t('form.countryOfCitizenship')"
439
+ :value="member.countryOfCitizenship?.nameRu"
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
- :value="member.economySectorCode.nameRu"
432
- :label="$t('form.economySectorCode')"
449
+ :value="member.economySectorCode?.nameRu"
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
- <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>
484
+ <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
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
- <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>
500
+ <div :class="[$styles.flexColNav]">
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
- <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>
507
+ <div :class="[$styles.flexColNav]">
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="[$styles.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,38 @@ 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.beneficialOwnerFormKey:
614
+ case formStore.policyholdersRepresentativeFormKey:
615
+ return true;
616
+ default:
617
+ return true;
618
+ }
619
+ };
620
+ return dataStore.controls.hasGBDFL && perMemberCondition();
621
+ });
550
622
  const hasInsis = computed(() => dataStore.controls.hasInsis);
551
623
  const hasGKB = computed(() => {
552
- const byProductCondition = dataStore.isGons || dataStore.isBolashak;
553
624
  const perMemberCondition = () => {
554
625
  switch (whichForm.value) {
555
- case formStore.beneficiaryFormKey:
626
+ case formStore.beneficiaryFormKey: {
627
+ if (dataStore.isKazyna || dataStore.isLiferenta) {
628
+ return !member.value.iin;
629
+ }
556
630
  return member.value.id === 0;
631
+ }
557
632
  case formStore.policyholderFormKey:
558
633
  case formStore.insuredFormKey:
559
634
  case formStore.beneficialOwnerFormKey:
@@ -563,48 +638,94 @@ export default {
563
638
  return false;
564
639
  }
565
640
  };
566
- return dataStore.controls.hasGKB && !!dataStore.isTask() && byProductCondition && perMemberCondition();
641
+ return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
567
642
  });
568
643
 
644
+ const hasFamilyStatus = computed(() => {
645
+ if (whichForm.value === formStore.beneficiaryFormKey) {
646
+ if (dataStore.isBolashak) {
647
+ return false;
648
+ }
649
+ }
650
+ return true;
651
+ });
652
+ const hasInsurancePay = computed(() => {
653
+ if (whichForm.value === formStore.beneficiaryFormKey) {
654
+ if (dataStore.isBolashak || dataStore.isLiferenta) {
655
+ return true;
656
+ }
657
+ }
658
+ return false;
659
+ });
660
+ const hasSignOfIPDL = computed(() => {
661
+ if (dataStore.isGons) {
662
+ return false;
663
+ }
664
+ return true;
665
+ });
666
+ const hasSameAddressToggle = computed(() => whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin);
667
+
668
+ const birthDateRule = computed(() => {
669
+ const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
670
+ const byMemverAndProductRule = () => {
671
+ if (whichForm.value === formStore.policyholderFormKey) {
672
+ if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
673
+ return dataStore.rules.age18ByDate;
674
+ }
675
+ }
676
+ if (whichForm.value === formStore.insuredFormKey) {
677
+ if (dataStore.isBolashak || dataStore.isBaiterek) {
678
+ return dataStore.rules.age18ByDate;
679
+ }
680
+ }
681
+ return [];
682
+ };
683
+ return baseDateRule.concat(byMemverAndProductRule());
684
+ });
569
685
  const ageRule = computed(() => {
570
- const baseAgeRule = dataStore.rules.required.concat(dataStore.rules.numbers);
686
+ const baseAgeRule = dataStore.rules.numbers;
571
687
  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
- }
688
+ if (whichForm.value === formStore.policyholderFormKey) {
689
+ if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
690
+ return dataStore.rules.age18;
579
691
  }
580
- case formStore.beneficiaryFormKey: {
581
- if (dataStore.isGons || dataStore.isBolashak) {
582
- return dataStore.rules.beneficiaryAgeLimit;
583
- } else {
584
- return [];
585
- }
692
+ }
693
+ if (whichForm.value === formStore.beneficiaryFormKey) {
694
+ if (dataStore.isBolashak) {
695
+ return dataStore.rules.beneficiaryAgeLimit;
586
696
  }
587
- default:
588
- return [];
589
697
  }
698
+ if (whichForm.value === formStore.insuredFormKey) {
699
+ if (dataStore.isBaiterek || dataStore.isBolashak) {
700
+ return dataStore.rules.age18;
701
+ }
702
+ }
703
+ return [];
590
704
  };
591
705
  return baseAgeRule.concat(byMemberAndProductRule());
592
706
  });
593
707
 
594
708
  const phoneRule = computed(() => {
595
709
  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;
710
+ if (whichForm.value === formStore.beneficiaryFormKey) {
711
+ if (dataStore.isGons || dataStore.isBolashak) {
712
+ return [];
605
713
  }
606
- };
607
- return byMemberAndProductRule();
714
+ if ((dataStore.isKazyna || dataStore.isLiferenta) && Number(member.value.age) < 18) {
715
+ return [];
716
+ }
717
+ }
718
+ return basePhoneRule;
719
+ });
720
+
721
+ const residencyRule = computed(() => {
722
+ const baseResidencyRule = dataStore.rules.objectRequired;
723
+ if (whichForm.value === formStore.policyholderFormKey) {
724
+ if (dataStore.isBolashak || dataStore.isBaiterek) {
725
+ return baseResidencyRule.concat(dataStore.rules.noResident);
726
+ }
727
+ }
728
+ return baseResidencyRule;
608
729
  });
609
730
 
610
731
  const getOtpConditionByMember = () => {
@@ -628,10 +749,11 @@ export default {
628
749
  const searchMember = async () => {
629
750
  if (!isDisabled.value) {
630
751
  dataStore.panelAction = null;
631
- dataStore.panel.title = 'Поиск клиента';
752
+ dataStore.panel.title = 'Поиск контрагента';
632
753
  dataStore.panel.open = true;
633
754
  isSearchOpen.value = true;
634
755
  isDocumentOpen.value = false;
756
+ isOtpPanelOpen.value = false;
635
757
  isPanelOpen.value = false;
636
758
  } else {
637
759
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
@@ -642,13 +764,21 @@ export default {
642
764
  vForm.value.scrollTo({ top: direction === 'up' ? 0 : screen.height * 10, behavior: 'smooth' });
643
765
  };
644
766
 
645
- const openCustomPanel = (type: 'document' = 'document') => {
767
+ const openCustomPanel = (type: 'document' | 'otp' = 'document') => {
646
768
  dataStore.panelAction = null;
647
769
  if (type === 'document' && memberDocument.value) {
648
770
  dataStore.panel.title = memberDocument.value.fileTypeName!;
649
771
  isDocumentOpen.value = true;
650
772
  isSearchOpen.value = false;
651
773
  isPanelOpen.value = false;
774
+ isOtpPanelOpen.value = false;
775
+ }
776
+ if (type === 'otp') {
777
+ dataStore.panel.title = dataStore.t('form.otpCode');
778
+ isOtpPanelOpen.value = true;
779
+ isDocumentOpen.value = false;
780
+ isSearchOpen.value = false;
781
+ isPanelOpen.value = false;
652
782
  }
653
783
  dataStore.panel.open = true;
654
784
  };
@@ -657,6 +787,7 @@ export default {
657
787
  if (!isDisabled.value) {
658
788
  isSearchOpen.value = false;
659
789
  isDocumentOpen.value = false;
790
+ isOtpPanelOpen.value = false;
660
791
  // Feature
661
792
  // const notAllowedToChange = ['gender', 'documentType', 'documentIssuers'];
662
793
  // if (member.value.gotFromInsis === false && notAllowedToChange.includes(key)) {
@@ -675,7 +806,7 @@ export default {
675
806
  isPanelLoading.value = true;
676
807
  newList = await asyncFunction(filterKey, member.value);
677
808
  }
678
- panelList.value = newList;
809
+ panelList.value = filterList(newList, key);
679
810
  panelValue.value = member.value[currentPanel.value];
680
811
  isPanelLoading.value = false;
681
812
  } else {
@@ -683,6 +814,22 @@ export default {
683
814
  }
684
815
  };
685
816
 
817
+ const filterList = (list: Value[], key: string) => {
818
+ if (dataStore.isBolashak) {
819
+ if (key === 'relationDegree') {
820
+ if (whichForm.value === formStore.beneficiaryFormKey) {
821
+ const beneficiaryRelations = [12, 13, 14, 15, 20, 21, 22, 23];
822
+ return list.filter(i => beneficiaryRelations.includes(Number(i.ids)));
823
+ }
824
+ if (whichForm.value === formStore.insuredFormKey) {
825
+ const insuredRelations = [6, 7, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23];
826
+ return list.filter(i => insuredRelations.includes(Number(i.ids)));
827
+ }
828
+ }
829
+ }
830
+ return list;
831
+ };
832
+
686
833
  const pickPanelValue = (item: Value) => {
687
834
  if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
688
835
  dataStore.panel.open = false;
@@ -737,6 +884,7 @@ export default {
737
884
  };
738
885
 
739
886
  const getFamilyInfo = async () => {
887
+ if (!formStore.policyholderForm.iin || !formStore.policyholderForm.phoneNumber) return;
740
888
  if (formStore.birthInfos.length === 0) {
741
889
  isButtonLoading.value = true;
742
890
  await dataStore.getFamilyInfo(formStore.policyholderForm.iin, formStore.policyholderForm.phoneNumber);
@@ -778,59 +926,63 @@ export default {
778
926
  };
779
927
 
780
928
  const getContragentFromGBDFL = async () => {
781
- if (member.value.hasAgreement === false) {
929
+ if (member.value.hasAgreement !== true) {
782
930
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
783
931
  dataStore.panel.open = false;
784
932
  isSearchOpen.value = false;
785
933
  return;
786
934
  }
787
935
  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);
936
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'Номер телефона, ИИН' }), 5000);
789
937
  dataStore.panel.open = false;
790
938
  isSearchOpen.value = false;
791
939
  return;
792
940
  }
793
941
  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;
942
+ const response = await dataStore.getContragentFromGBDFL(member.value);
943
+ if (typeof response === 'boolean') {
944
+ if (response === true) {
945
+ member.value.gotFromInsis = true;
946
+ }
947
+ dataStore.panel.open = false;
948
+ isSearchOpen.value = false;
949
+ }
796
950
  isButtonLoading.value = false;
797
- dataStore.panel.open = false;
798
- isSearchOpen.value = false;
799
951
  };
800
952
 
801
953
  const getContragent = async () => {
802
- if (member.value.hasAgreement === false) {
954
+ if (member.value.hasAgreement !== true) {
803
955
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
804
956
  dataStore.panel.open = false;
805
957
  isSearchOpen.value = false;
806
958
  return;
807
959
  }
808
960
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
809
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'ИИН'), 5000);
961
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
810
962
  dataStore.panel.open = false;
811
963
  isSearchOpen.value = false;
812
964
  return;
813
965
  }
814
966
  isButtonLoading.value = true;
815
- await dataStore.getContragent(member.value, whichForm.value, whichIndex.value, false);
967
+ await dataStore.getContragent(member.value, false);
816
968
  isButtonLoading.value = false;
817
969
  dataStore.panel.open = false;
818
970
  isSearchOpen.value = false;
819
971
  };
820
972
 
821
973
  const validateESBD = async (docTypeNumber: number) => {
822
- const data = {
974
+ const data: ESBDValidationType = {
823
975
  personType: 1,
824
976
  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,
977
+ lastName: member.value.lastName ?? '',
978
+ firstName: member.value.firstName ?? '',
979
+ middleName: member.value.middleName ?? '',
980
+ birthDate: member.value.getDateByKey('birthDate') ?? '',
981
+ sex: Number(member.value.gender.id),
830
982
  docType: docTypeNumber,
831
- docNumber: member.value.documentNumber,
832
- docIssuedDate: member.value.getDateByKey('documentDate'),
833
- docIssuedBy: member.value.documentIssuers.nameRu,
983
+ docNumber: member.value.documentNumber ?? '',
984
+ docIssuedDate: member.value.getDateByKey('documentDate') ?? '',
985
+ docIssuedBy: member.value.documentIssuers.nameRu ?? '',
834
986
  activityKindId: 0,
835
987
  economicsSectorId: Number((member.value.economySectorCode.ids! as string).at(-1)),
836
988
  resident: member.value.signOfResidency.ids === '500011.2' || member.value.signOfResidency.ids === null ? 0 : 1,
@@ -840,18 +992,20 @@ export default {
840
992
  };
841
993
 
842
994
  const saveMember = async () => {
843
- const hasSaved = await dataStore.saveContragent(member.value, whichForm.value, whichIndex.value, true);
995
+ const hasSaved = await dataStore.saveContragent(member.value, whichForm.value, whichIndex.value ? Number(whichIndex.value) : null, true);
844
996
  if (hasSaved === false) {
845
997
  dataStore.isLoading = false;
846
998
  return false;
847
999
  }
848
1000
  const isInsured = formStore.isPolicyholderInsured;
1001
+ const remoteIsInsured = ref<boolean | null>(null);
849
1002
  if (whichForm.value == formStore.policyholderFormKey) {
850
1003
  if (route.params.taskId === '0') {
851
1004
  try {
852
1005
  const taskId = await dataStore.startApplication(member.value);
853
- if (taskId) {
1006
+ if (typeof taskId === 'string') {
854
1007
  await dataStore.getApplicationData(taskId, false, false, false, false);
1008
+ remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
855
1009
  await router.replace({
856
1010
  name: route.name!,
857
1011
  params: { taskId: taskId as string },
@@ -873,27 +1027,37 @@ export default {
873
1027
  await uploadFile(formStore.applicationData.processInstanceId);
874
1028
  }
875
1029
  }
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);
1030
+ const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value, whichIndex.value ? Number(whichIndex.value) : undefined);
1031
+ if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
1032
+ return false;
1033
+ }
1034
+ const wasInsuredAction = ref<boolean>(false);
1035
+ const isSaved = await dataStore.saveMember(member.value, memberStore.getMemberCode(whichForm.value)!, memberFromApplicaiton);
878
1036
  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;
1037
+ if (whichForm.value === formStore.policyholderFormKey) {
1038
+ if (isInsured === true || remoteIsInsured.value === true) {
1039
+ formStore.insuredForm[0] = formStore.policyholderForm;
1040
+ const isInsuredSaved = await dataStore.saveMember(
1041
+ member.value,
1042
+ memberStore.getMemberCode(formStore.insuredFormKey)!,
1043
+ memberStore.getMemberFromApplication(formStore.insuredFormKey, formStore.insuredFormIndex),
1044
+ );
1045
+ if (!isInsuredSaved) return false;
1046
+ wasInsuredAction.value = true;
1047
+ }
1048
+ }
1049
+ if (whichForm.value === formStore.insuredFormKey) {
1050
+ wasInsuredAction.value = true;
887
1051
  }
888
1052
  await router.replace({
889
1053
  name: route.name!,
890
1054
  query: { ...route.query, id: member.value.id },
891
1055
  });
892
- await dataStore.getApplicationData(route.params.taskId, false, false, false, false);
1056
+ await dataStore.getApplicationData(route.params.taskId as string, false, false, true, wasInsuredAction.value);
893
1057
  if (dataStore.controls.hasCalculator) {
894
1058
  if (formStore.additionalInsuranceTermsWithout && formStore.additionalInsuranceTermsWithout.length !== 0) {
895
- formStore.additionalInsuranceTerms.forEach((term: any) => {
896
- const defaultTerm = formStore.additionalInsuranceTermsWithout.find((i: any) => i.coverTypeId === term.coverTypeId);
1059
+ formStore.additionalInsuranceTerms.forEach(term => {
1060
+ const defaultTerm = formStore.additionalInsuranceTermsWithout.find(i => i.coverTypeId === term.coverTypeId);
897
1061
  if (defaultTerm) {
898
1062
  term.coverSumName = defaultTerm.coverSumName;
899
1063
  term.coverSumId = defaultTerm.coverSumId;
@@ -913,7 +1077,12 @@ export default {
913
1077
  return true;
914
1078
  }
915
1079
  }
916
- if (member.value.hasAgreement === false) {
1080
+ if (dataStore.isKazyna || dataStore.isLiferenta) {
1081
+ if (whichForm.value === formStore.beneficiaryFormKey && Number(member.value.age) < 18) {
1082
+ return true;
1083
+ }
1084
+ }
1085
+ if (member.value.hasAgreement !== true) {
917
1086
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
918
1087
  return false;
919
1088
  }
@@ -937,7 +1106,7 @@ export default {
937
1106
  const initialPoint = `${member.value.iin!.replaceAll('-', '')}.`;
938
1107
  const RESPONSE = ESBDMessage(ESBDResponse, initialPoint);
939
1108
  let errorMessage = RESPONSE !== false ? RESPONSE : 'Что-то произошло не так';
940
- if (ESBDResponse.errorCode === 0) {
1109
+ if (typeof ESBDResponse === 'object' && ESBDResponse.errorCode === 0) {
941
1110
  member.value.verifyType = 'ESBD';
942
1111
  member.value.verifyDate = ESBDResponse.verifiedDate;
943
1112
  const hasMemberSaved = await saveMember();
@@ -955,11 +1124,11 @@ export default {
955
1124
  if (errors) {
956
1125
  const errorText = errors.querySelector('.v-label.v-field-label');
957
1126
  if (errorText) {
958
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', errorText.innerHTML?.replace(/[-<>!//.]/g, '')));
1127
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: errorText.innerHTML?.replace(/[-<>!//.]/g, '') }));
959
1128
  } else {
960
1129
  const errorFieldText = errors.querySelector('.v-input__control');
961
1130
  if (errorFieldText) {
962
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', errorFieldText.innerHTML?.replace(/[-<>!//.]/g, '')));
1131
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: errorFieldText.innerHTML?.replace(/[-<>!//.]/g, '') }));
963
1132
  }
964
1133
  }
965
1134
  errors.scrollIntoView({
@@ -974,67 +1143,133 @@ export default {
974
1143
 
975
1144
  const checkOtp = async () => {
976
1145
  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);
1146
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: dataStore.t('form.otpCode') }), 3000);
978
1147
  return;
979
1148
  }
1149
+ otpSending.value = true;
980
1150
  const checked = await memberStore.checkOtp(member.value);
981
1151
  if (typeof checked !== 'undefined') {
982
1152
  member.value.hasAgreement = checked;
983
1153
  }
1154
+ otpSending.value = false;
1155
+ if (checked === true) {
1156
+ dataStore.panel.open = false;
1157
+ }
984
1158
  };
985
1159
 
986
1160
  const sendOtp = async (onInit = false) => {
1161
+ otpSending.value = true;
987
1162
  const response = await memberStore.sendOtp(member.value, formStore.applicationData.processInstanceId, onInit);
988
1163
  if (response) {
989
1164
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
1165
+ if (response.otpStatus === true) {
1166
+ dataStore.panel.open = false;
1167
+ }
990
1168
  }
1169
+ otpSending.value = false;
991
1170
  };
992
1171
 
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);
1172
+ const setDefaultValues = async () => {
1173
+ const setDefaults = dataStore.controls.setDefaults;
1174
+ if (setDefaults.sectorCode) {
1175
+ await setSectorCode();
1176
+ }
1177
+ if (setDefaults.percentage) {
1178
+ setPercentage();
996
1179
  }
1180
+ };
1181
+
1182
+ const setSectorCode = async () => {
1183
+ if (member.value.id === 0 && route.query.id === '0') {
1184
+ const sectorList = await dataStore.getSectorCodeList();
1185
+ const defaultValue = sectorList.find(item => item.ids === '500003.9') as Value;
1186
+ member.value.economySectorCode = defaultValue ? defaultValue : new Value();
1187
+ }
1188
+ };
1189
+
1190
+ const setPercentage = () => {
1191
+ if (whichForm.value === formStore.beneficiaryFormKey && member.value.id === 0 && route.query.id === '0' && member.value.percentageOfPayoutAmount === null) {
1192
+ if (dataStore.members.beneficiaryApp.isMultiple) {
1193
+ const availablePercentage =
1194
+ 100 -
1195
+ formStore.beneficiaryForm.reduce((sum: number, member: Member) => {
1196
+ return sum + Number(member.percentageOfPayoutAmount);
1197
+ }, 0);
1198
+ if (availablePercentage >= 0 && availablePercentage <= 100) member.value.percentageOfPayoutAmount = availablePercentage;
1199
+ } else {
1200
+ member.value.percentageOfPayoutAmount = 100;
1201
+ }
1202
+ }
1203
+ };
1204
+
1205
+ const selectMember = async (index: number, update?: boolean) => {
1206
+ dataStore.panel.open = false;
1207
+ isButtonLoading.value = true;
1208
+ isChangingMember.value = true;
1209
+ //@ts-ignore
1210
+ await router.replace({ query: { ...route.query, i: index, id: getMember(route.query.tab, index).id, upd: update } });
1211
+ isChangingMember.value = false;
1212
+ isButtonLoading.value = false;
1213
+ };
1214
+
1215
+ const deleteMember = async (index: number) => {
1216
+ await memberStore.deleteMember(route.params.taskId as string, whichForm.value, index);
1217
+ const currentIndex = Number(whichIndex.value);
1218
+ if (index <= currentIndex) {
1219
+ const newIndex = ref<number>(currentIndex - 1 > 0 ? currentIndex - 1 : 0);
1220
+ await selectMember(newIndex.value, index === currentIndex ? true : undefined);
1221
+ }
1222
+ };
1223
+
1224
+ const onInit = async () => {
1225
+ // if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
1226
+ // await dataStore.getSignedDocList(formStore.applicationData.processInstanceId);
1227
+ // }
997
1228
  if (getOtpConditionByMember()) {
998
1229
  await sendOtp(true);
999
1230
  } else {
1000
1231
  if (member.value.hasAgreement === null) member.value.hasAgreement = true;
1001
1232
  }
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];
1233
+ if (!member.value.id) {
1234
+ await router.replace({ query: { ...route.query, id: 0 } });
1235
+ } else {
1236
+ if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1237
+ // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1238
+ // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1014
1239
  }
1240
+ await setDefaultValues();
1015
1241
  };
1016
1242
 
1017
1243
  onMounted(async () => {
1018
1244
  await onInit();
1019
1245
  });
1020
1246
 
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
- });
1247
+ watch(
1248
+ () => sameAddress.value,
1249
+ () => {
1250
+ if (whichForm.value === formStore.beneficiaryFormKey) setAddressBeneficiary(Number(whichIndex.value), sameAddress.value);
1251
+ },
1252
+ );
1026
1253
 
1027
1254
  watch(
1028
1255
  () => member.value.percentageOfPayoutAmount,
1029
1256
  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);
1257
+ if (whichForm.value === formStore.beneficiaryFormKey && !isDisabled.value) {
1258
+ const percentage = typeof val === 'string' ? Number(val) : val;
1259
+ if (typeof percentage === 'number') {
1260
+ if (memberSetting.value.isMultiple) {
1261
+ if (percentage < 0) {
1262
+ member.value.percentageOfPayoutAmount = 0;
1263
+ dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1264
+ } else if (percentage > 100) {
1265
+ member.value.percentageOfPayoutAmount = 100;
1266
+ dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1267
+ }
1268
+ } else {
1269
+ if (member.value.percentageOfPayoutAmount !== 100) {
1270
+ member.value.percentageOfPayoutAmount = 100;
1271
+ }
1272
+ }
1038
1273
  }
1039
1274
  }
1040
1275
  },
@@ -1050,14 +1285,21 @@ export default {
1050
1285
  },
1051
1286
  );
1052
1287
 
1053
- watch(
1054
- () => member.value.otpCode,
1055
- async () => {
1056
- if (member.value.otpCode && member.value.otpCode.length === useMask().otp.length) {
1057
- await checkOtp();
1288
+ const onIinInput = () => {
1289
+ if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value.isMultiple === true) {
1290
+ const alreadyInStatement = formStore[whichForm.value as MultipleMember].findIndex((i: Member) => i.iin === member.value.iin);
1291
+ if (alreadyInStatement !== -1 && alreadyInStatement !== Number(whichIndex.value)) {
1292
+ dataStore.showToaster('error', dataStore.t('toaster.hasAlreadyMember'), 3000);
1293
+ member.value.iin = null;
1058
1294
  }
1059
- },
1060
- );
1295
+ }
1296
+ };
1297
+
1298
+ const onOtpCodeInput = async () => {
1299
+ if (member.value.otpCode && member.value.otpCode.length === useMask().otp.length) {
1300
+ await checkOtp();
1301
+ }
1302
+ };
1061
1303
 
1062
1304
  watch(
1063
1305
  () => dataStore.panel.open,
@@ -1066,6 +1308,7 @@ export default {
1066
1308
  isPanelOpen.value = false;
1067
1309
  isDocumentOpen.value = false;
1068
1310
  isSearchOpen.value = false;
1311
+ isOtpPanelOpen.value = false;
1069
1312
  dataStore.panelAction = null;
1070
1313
  }
1071
1314
  },
@@ -1087,10 +1330,12 @@ export default {
1087
1330
  isPanelOpen,
1088
1331
  isSearchOpen,
1089
1332
  isDocumentOpen,
1333
+ isOtpPanelOpen,
1090
1334
  isPanelLoading,
1091
1335
  isButtonLoading,
1092
1336
  isSubmittingForm,
1093
1337
  documentLoading,
1338
+ otpSending,
1094
1339
  panelValue,
1095
1340
  panelList,
1096
1341
  searchQuery,
@@ -1098,10 +1343,12 @@ export default {
1098
1343
  memberDocument,
1099
1344
  familyDialog,
1100
1345
  selectedFamilyMember,
1346
+ sameAddress,
1101
1347
 
1102
1348
  // Computed
1103
1349
  whichForm,
1104
1350
  whichIndex,
1351
+ memberSetting,
1105
1352
  otpCondition,
1106
1353
  hasOtp,
1107
1354
  isDisabled,
@@ -1112,9 +1359,16 @@ export default {
1112
1359
  hasGBDFL,
1113
1360
  hasInsis,
1114
1361
  hasGKB,
1362
+ hasFamilyStatus,
1363
+ hasInsurancePay,
1364
+ hasSignOfIPDL,
1365
+ hasSameAddressToggle,
1366
+
1115
1367
  // Rules
1116
1368
  ageRule,
1117
1369
  phoneRule,
1370
+ residencyRule,
1371
+ birthDateRule,
1118
1372
 
1119
1373
  // Functions
1120
1374
  searchMember,
@@ -1132,6 +1386,10 @@ export default {
1132
1386
  selectFamilyMember,
1133
1387
  closeFamilyDialog,
1134
1388
  scrollForm,
1389
+ onIinInput,
1390
+ onOtpCodeInput,
1391
+ deleteMember,
1392
+ selectMember,
1135
1393
  };
1136
1394
  },
1137
1395
  };