hl-core 0.0.8-beta.3 → 0.0.8-beta.30

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 (46) hide show
  1. package/api/index.ts +81 -18
  2. package/api/interceptors.ts +17 -13
  3. package/components/Dialog/Dialog.vue +7 -37
  4. package/components/Form/FormBlock.vue +65 -28
  5. package/components/Form/FormSection.vue +4 -1
  6. package/components/Form/ManagerAttachment.vue +197 -0
  7. package/components/Form/ProductConditionsBlock.vue +64 -12
  8. package/components/Input/Datepicker.vue +5 -1
  9. package/components/Input/FormInput.vue +28 -7
  10. package/components/Input/PanelInput.vue +5 -0
  11. package/components/Input/RoundedSelect.vue +137 -0
  12. package/components/Layout/Drawer.vue +1 -0
  13. package/components/Layout/Header.vue +40 -4
  14. package/components/Layout/SettingsPanel.vue +39 -9
  15. package/components/Menu/MenuHover.vue +30 -0
  16. package/components/Menu/MenuNav.vue +28 -11
  17. package/components/Menu/MenuNavItem.vue +5 -2
  18. package/components/Pages/Anketa.vue +38 -21
  19. package/components/Pages/Auth.vue +149 -30
  20. package/components/Pages/InvoiceInfo.vue +30 -0
  21. package/components/Pages/MemberForm.vue +381 -144
  22. package/components/Pages/ProductConditions.vue +496 -17
  23. package/components/Panel/PanelHandler.vue +75 -2
  24. package/components/Utilities/Chip.vue +27 -0
  25. package/components/Utilities/JsonViewer.vue +27 -0
  26. package/composables/classes.ts +165 -25
  27. package/composables/constants.ts +13 -1
  28. package/composables/index.ts +58 -2
  29. package/composables/styles.ts +9 -3
  30. package/configs/i18n.ts +19 -0
  31. package/layouts/default.vue +2 -2
  32. package/locales/en.json +583 -0
  33. package/locales/kz.json +583 -0
  34. package/locales/ru.json +585 -0
  35. package/nuxt.config.ts +8 -0
  36. package/package.json +15 -9
  37. package/pages/500.vue +1 -1
  38. package/pages/Token.vue +51 -0
  39. package/plugins/helperFunctionsPlugins.ts +3 -0
  40. package/plugins/storePlugin.ts +0 -1
  41. package/plugins/vuetifyPlugin.ts +8 -1
  42. package/store/data.store.js +705 -624
  43. package/store/member.store.ts +147 -22
  44. package/store/rules.js +41 -3
  45. package/types/index.ts +39 -0
  46. package/store/messages.ts +0 -434
@@ -1,65 +1,80 @@
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.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 as MemberKeys]"
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 as MemberKeys), index) && !memberStore.canMemberCleared((whichForm as MemberKeys), index)"
18
+ variant="plain"
19
+ :color="Number(whichIndex) === index ? '#FFF' : '#A0B3D8'"
20
+ @click.prevent="
21
+ memberStore.canMemberDeleted(whichForm as MemberKeys, index) || memberStore.canMemberCleared(whichForm as MemberKeys, index) ? deleteMember(index) : null
22
+ "
23
+ ></v-btn>
24
+ </div>
25
+ </div>
26
+ <v-btn class="ml-2" icon="mdi-plus !text-[24px]" @click="memberStore.addMember(whichForm as MemberKeys)" size="small" color="#A0B3D8" variant="tonal"></v-btn>
27
+ </div>
28
+ <base-form-section :title="$t('form.personalData')" :class="[memberSetting.has === true && memberSetting.isMultiple === true ? 'rounded-t-0 !mt-[-5px]' : 'mt-[14px]']">
29
+ <base-form-input
30
+ v-model="member.phoneNumber"
31
+ :label="$t('form.phoneNumber')"
32
+ :maska="$maska.phone"
33
+ :readonly="!!isDisabled || !!isIinPhoneDisabled"
34
+ :clearable="!isDisabled"
35
+ :append-inner-icon="otpCondition ? 'mdi mdi-phone-message' : ''"
36
+ @append="openCustomPanel('otp')"
37
+ @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
38
+ :rules="phoneRule"
39
+ ></base-form-input>
5
40
  <base-form-input
6
41
  v-model="member.iin"
7
42
  :label="$t('form.iin')"
8
43
  :maska="$maska.iin"
9
- :readonly="isDisabled || isIinPhoneDisabled"
44
+ :readonly="!!isDisabled || !!isIinPhoneDisabled"
10
45
  :clearable="!isDisabled"
11
46
  :append-inner-icon="showSaveButton ? 'mdi mdi-magnify' : ''"
12
47
  @append="searchMember"
48
+ @input="onIinInput"
13
49
  :rules="$rules.required.concat($rules.iinRight)"
14
50
  ></base-form-input>
15
51
  <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"
52
+ v-model.trim="member.lastName"
38
53
  :readonly="isDisabled || isFromGBD"
39
54
  :clearable="!isDisabled"
40
55
  :label="$t('form.lastName')"
41
56
  :rules="$rules.required.concat($rules.cyrillic)"
42
57
  ></base-form-input>
43
58
  <base-form-input
44
- v-model="member.firstName"
59
+ v-model.trim="member.firstName"
45
60
  :readonly="isDisabled || isFromGBD"
46
61
  :clearable="!isDisabled"
47
62
  :label="$t('form.firstName')"
48
63
  :rules="$rules.required.concat($rules.cyrillic)"
49
64
  ></base-form-input>
50
65
  <base-form-input
51
- v-model="member.middleName"
66
+ v-model.trim="member.middleName"
52
67
  :readonly="isDisabled || isFromGBD"
53
68
  :clearable="!isDisabled"
54
69
  :label="$t('form.middleName')"
55
- :rules="$rules.required.concat($rules.cyrillic)"
70
+ :rules="$rules.cyrillicNonRequired"
56
71
  ></base-form-input>
57
72
  <base-form-input
58
73
  v-model="member.birthDate"
59
74
  :readonly="isDisabled || isFromGBD"
60
75
  :clearable="!isDisabled"
61
76
  :label="$t('form.birthDate')"
62
- :rules="$rules.required.concat($rules.birthDate)"
77
+ :rules="birthDateRule"
63
78
  :maska="$maska.date"
64
79
  append-inner-icon="mdi mdi-calendar-blank-outline"
65
80
  ></base-form-input>
@@ -75,6 +90,7 @@
75
90
  @append="openPanel($t('form.gender'), $dataStore.gender, 'gender')"
76
91
  ></base-panel-input>
77
92
  <base-panel-input
93
+ v-if="hasFamilyStatus"
78
94
  v-model="member.familyStatus"
79
95
  :value="member.familyStatus.nameRu"
80
96
  :readonly="isDisabled"
@@ -98,8 +114,8 @@
98
114
  <base-form-input
99
115
  v-if="whichForm === formStore.beneficiaryFormKey"
100
116
  v-model="member.percentageOfPayoutAmount"
101
- :readonly="isDisabled"
102
- :clearable="!isDisabled"
117
+ :readonly="memberSetting.isMultiple === false ? true : isDisabled"
118
+ :clearable="memberSetting.isMultiple === false ? false : !isDisabled"
103
119
  :label="$t('form.percentageOfPayoutAmount')"
104
120
  :rules="$rules.required.concat($rules.numbers)"
105
121
  ></base-form-input>
@@ -107,35 +123,35 @@
107
123
  </base-form-section>
108
124
  <base-form-section :title="$t('policyholdersRepresentative.PowerOfAttorney')" v-if="whichForm === formStore.policyholdersRepresentativeFormKey">
109
125
  <base-form-input
110
- v-model="member.fullNameRod"
126
+ v-model.trim="member.fullNameRod"
111
127
  :label="$t('policyholdersRepresentative.NameParentCase')"
112
128
  :readonly="isDisabled"
113
129
  :clearable="!isDisabled"
114
130
  :rules="$rules.required"
115
131
  ></base-form-input>
116
132
  <base-form-input
117
- v-model="member.confirmDocTypeKz"
133
+ v-model.trim="member.confirmDocTypeKz"
118
134
  :label="$t('policyholdersRepresentative.basisDocKz')"
119
135
  :readonly="isDisabled"
120
136
  :clearable="!isDisabled"
121
137
  :rules="$rules.required"
122
138
  ></base-form-input>
123
139
  <base-form-input
124
- v-model="member.confirmDocType"
140
+ v-model.trim="member.confirmDocType"
125
141
  :label="$t('policyholdersRepresentative.basisDocRu')"
126
142
  :readonly="isDisabled"
127
143
  :clearable="!isDisabled"
128
144
  :rules="$rules.required"
129
145
  ></base-form-input>
130
146
  <base-form-input
131
- v-model="member.confirmDocTypeRod"
147
+ v-model.trim="member.confirmDocTypeRod"
132
148
  :label="$t('policyholdersRepresentative.basisDocRuParentCase')"
133
149
  :readonly="isDisabled"
134
150
  :clearable="!isDisabled"
135
151
  :rules="$rules.required"
136
152
  ></base-form-input>
137
153
  <base-form-input
138
- v-model="member.confirmDocNumber"
154
+ v-model.trim="member.confirmDocNumber"
139
155
  :label="$t('policyholdersRepresentative.numberDoc')"
140
156
  :readonly="isDisabled"
141
157
  :clearable="!isDisabled"
@@ -159,7 +175,7 @@
159
175
  :maska="$maska.date"
160
176
  append-inner-icon="mdi mdi-calendar-blank-outline"
161
177
  ></base-form-input>
162
- <base-form-input v-model="member.migrationCard" :label="$t('policyholdersRepresentative.numberVisa')"></base-form-input>
178
+ <base-form-input v-model.trim="member.migrationCard" :label="$t('policyholdersRepresentative.numberVisa')"></base-form-input>
163
179
  <base-form-input
164
180
  v-model="member.migrationCardIssueDate"
165
181
  :label="$t('form.documentDate')"
@@ -185,21 +201,21 @@
185
201
  :title="$t('policyholdersRepresentative.confirmAuthority')"
186
202
  ></base-form-toggle>
187
203
  <base-form-input
188
- v-model="member.notaryLongName"
204
+ v-model.trim="member.notaryLongName"
189
205
  :label="$t('policyholdersRepresentative.name')"
190
206
  :readonly="isDisabled"
191
207
  :clearable="!isDisabled"
192
208
  :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required : []"
193
209
  ></base-form-input>
194
210
  <base-form-input
195
- v-model="member.notaryLicenseNumber"
211
+ v-model.trim="member.notaryLicenseNumber"
196
212
  :label="$t('policyholdersRepresentative.numberLicense')"
197
213
  :readonly="isDisabled"
198
214
  :clearable="!isDisabled"
199
215
  :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required : []"
200
216
  ></base-form-input>
201
217
  <base-form-input
202
- v-model="member.notaryLicenseIssuer"
218
+ v-model.trim="member.notaryLicenseIssuer"
203
219
  :label="$t('policyholdersRepresentative.documentIssuers')"
204
220
  :readonly="isDisabled"
205
221
  :clearable="!isDisabled"
@@ -216,11 +232,18 @@
216
232
  ></base-form-input>
217
233
  </base-form-section>
218
234
  <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>
235
+ <base-form-input v-model.trim="member.job" :label="$t('form.job')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
236
+ <base-form-input v-model.trim="member.jobPosition" :label="$t('form.jobPosition')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
237
+ <base-form-input v-model.trim="member.jobPlace" :label="$t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
222
238
  </base-form-section>
223
239
  <base-form-section :title="$t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
240
+ <base-form-toggle
241
+ v-if="whichForm === formStore.beneficiaryFormKey"
242
+ v-model="sameAddress"
243
+ :disabled="isDisabled"
244
+ :has-border="false"
245
+ :title="$t('form.sameAddress')"
246
+ ></base-form-toggle>
224
247
  <base-panel-input
225
248
  v-model="member.registrationCountry"
226
249
  :value="member.registrationCountry.nameRu"
@@ -276,23 +299,23 @@
276
299
  ></base-panel-input>
277
300
  <!-- <base-form-input v-if="$dataStore.isGons" v-model="member.postIndex" :readonly="isDisabled"
278
301
  :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>
302
+ <base-form-input v-model.trim="member.registrationQuarter" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.Quarter')"></base-form-input>
303
+ <base-form-input v-model.trim="member.registrationMicroDistrict" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.MicroDistrict')"></base-form-input>
281
304
  <base-form-input
282
- v-model="member.registrationStreet"
305
+ v-model.trim="member.registrationStreet"
283
306
  :rules="$rules.required"
284
307
  :readonly="isDisabled"
285
308
  :clearable="!isDisabled"
286
309
  :label="$t('form.Street')"
287
310
  ></base-form-input>
288
311
  <base-form-input
289
- v-model="member.registrationNumberHouse"
312
+ v-model.trim="member.registrationNumberHouse"
290
313
  :rules="$rules.required"
291
314
  :readonly="isDisabled"
292
315
  :clearable="!isDisabled"
293
316
  :label="$t('form.NumberHouse')"
294
317
  ></base-form-input>
295
- <base-form-input v-model="member.registrationNumberApartment" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.NumberApartment')"></base-form-input>
318
+ <base-form-input v-model.trim="member.registrationNumberApartment" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.NumberApartment')"></base-form-input>
296
319
  </div>
297
320
  </base-fade-transition>
298
321
  </base-form-section>
@@ -331,7 +354,7 @@
331
354
  @append="openPanel($t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
332
355
  ></base-panel-input>
333
356
  <base-form-input
334
- v-model="member.documentNumber"
357
+ v-model.trim="member.documentNumber"
335
358
  :label="$t('form.documentNumber')"
336
359
  :readonly="isDisabled"
337
360
  :clearable="!isDisabled"
@@ -436,6 +459,17 @@
436
459
  append-inner-icon="mdi mdi-chevron-right"
437
460
  @append="openPanel($t('form.economySectorCode'), [], 'economySectorCode', $dataStore.getSectorCodeList)"
438
461
  ></base-panel-input>
462
+ <base-panel-input
463
+ v-if="hasInsurancePay"
464
+ v-model="member.insurancePay"
465
+ :value="member.insurancePay.nameRu"
466
+ :readonly="isDisabled"
467
+ :clearable="!isDisabled"
468
+ :rules="$rules.objectRequired"
469
+ :label="$t('form.insurancePay')"
470
+ append-inner-icon="mdi mdi-chevron-right"
471
+ @append="openPanel($t('form.insurancePay'), $dataStore.insurancePay, 'insurancePay', $dataStore.getInsurancePay)"
472
+ ></base-panel-input>
439
473
  </base-form-section>
440
474
  <base-form-section :title="$t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
441
475
  <base-form-input
@@ -480,6 +514,24 @@
480
514
  <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getFile('download')"></base-btn>
481
515
  </div>
482
516
  </Teleport>
517
+ <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#panel-actions">
518
+ <div :class="[$libStyles.flexColNav]">
519
+ <base-fade-transition>
520
+ <base-rounded-input
521
+ v-if="otpCondition && member.otpTokenId"
522
+ v-model="member.otpCode"
523
+ :label="$t('form.otpCode')"
524
+ :maska="$maska.otp"
525
+ :append-inner-icon="hasOtp ? 'mdi-cellphone-message text-[17px]' : ''"
526
+ hide-details
527
+ @keyup.enter.prevent="hasOtp ? checkOtp() : null"
528
+ @input="onOtpCodeInput"
529
+ ></base-rounded-input>
530
+ </base-fade-transition>
531
+ <base-btn v-if="!member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$t('buttons.sendOtp')" @click="sendOtp(false)"></base-btn>
532
+ <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$t('buttons.check')" @click="checkOtp()"></base-btn>
533
+ </div>
534
+ </Teleport>
483
535
  <base-dialog v-model="familyDialog" :title="$t('dialog.familyMember')" actions="familyDialog">
484
536
  <template #actions>
485
537
  <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)"></base-family-dialog>
@@ -491,7 +543,7 @@
491
543
 
492
544
  <script lang="ts">
493
545
  import { LocationQueryValue } from 'vue-router';
494
- import { Value, DocumentItem } from '@/composables/classes';
546
+ import { Value, DocumentItem, Member } from '@/composables/classes';
495
547
  import { uuid } from 'vue-uuid';
496
548
 
497
549
  export default {
@@ -511,10 +563,14 @@ export default {
511
563
  const isButtonLoading = ref<boolean>(false);
512
564
  const isSubmittingForm = ref<boolean>(false);
513
565
  const documentLoading = ref<boolean>(false);
566
+ const otpSending = ref<boolean>(false);
514
567
  const isSearchOpen = ref<boolean>(false);
515
568
  const isDocumentOpen = ref<boolean>(false);
569
+ const isOtpPanelOpen = ref<boolean>(false);
516
570
  const isPanelLoading = ref<boolean>(false);
571
+ const isChangingMember = ref<boolean>(false);
517
572
  const familyDialog = ref<boolean>(false);
573
+ const sameAddress = ref<boolean>(false);
518
574
  const panelValue = ref<Value>(new Value());
519
575
  const panelList = ref<Value[]>([]);
520
576
  const currentPanel = ref<keyof typeof member.value>();
@@ -523,10 +579,11 @@ export default {
523
579
 
524
580
  const whichForm = computed(() => route.query.tab);
525
581
  const whichIndex = computed(() => route.query.i);
582
+ const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value as MemberKeys) as keyof typeof dataStore.members]);
526
583
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
527
584
  const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value as string));
528
585
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
529
- const isIinPhoneDisabled = computed(() => formStore.applicationData && 'regNumber' in formStore.applicationData && whichForm.value === formStore.policyholderFormKey);
586
+ const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
530
587
  const isFromGBD = computed(() => !!member.value.gosPersonData);
531
588
  const showSaveButton = computed(() => {
532
589
  const generalCondition = !isDisabled.value && !!isTask.value && !!dataStore.isInitiator();
@@ -546,14 +603,39 @@ export default {
546
603
  return generalCondition && perMemberCondtion();
547
604
  });
548
605
 
549
- const hasGBDFL = computed(() => dataStore.controls.hasGBDFL && !hasGKB.value);
606
+ const hasGBDFL = computed(() => {
607
+ const perMemberCondition = () => {
608
+ switch (whichForm.value) {
609
+ case formStore.beneficiaryFormKey: {
610
+ if (dataStore.isKazyna || dataStore.isLiferenta) {
611
+ return !!member.value.iin;
612
+ }
613
+ if (dataStore.isBolashak || dataStore.isGons) {
614
+ return false;
615
+ }
616
+ return true;
617
+ }
618
+ case formStore.insuredFormKey:
619
+ case formStore.beneficiaryFormKey:
620
+ case formStore.beneficialOwnerFormKey:
621
+ case formStore.policyholdersRepresentativeFormKey:
622
+ return true;
623
+ default:
624
+ return true;
625
+ }
626
+ };
627
+ return dataStore.controls.hasGBDFL && perMemberCondition();
628
+ });
550
629
  const hasInsis = computed(() => dataStore.controls.hasInsis);
551
630
  const hasGKB = computed(() => {
552
- const byProductCondition = dataStore.isGons || dataStore.isBolashak;
553
631
  const perMemberCondition = () => {
554
632
  switch (whichForm.value) {
555
- case formStore.beneficiaryFormKey:
633
+ case formStore.beneficiaryFormKey: {
634
+ if (dataStore.isKazyna || dataStore.isLiferenta) {
635
+ return !member.value.iin;
636
+ }
556
637
  return member.value.id === 0;
638
+ }
557
639
  case formStore.policyholderFormKey:
558
640
  case formStore.insuredFormKey:
559
641
  case formStore.beneficialOwnerFormKey:
@@ -563,56 +645,84 @@ export default {
563
645
  return false;
564
646
  }
565
647
  };
566
- return dataStore.controls.hasGKB && !!dataStore.isTask() && byProductCondition && perMemberCondition();
648
+ return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
649
+ });
650
+
651
+ const hasFamilyStatus = computed(() => {
652
+ if (whichForm.value === formStore.beneficiaryFormKey) {
653
+ if (dataStore.isBolashak) {
654
+ return false;
655
+ }
656
+ }
657
+ return true;
658
+ });
659
+ const hasInsurancePay = computed(() => {
660
+ if (whichForm.value === formStore.beneficiaryFormKey) {
661
+ if (dataStore.isBolashak || dataStore.isLiferenta) {
662
+ return true;
663
+ }
664
+ }
665
+ return false;
567
666
  });
568
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
- }
688
+ if (whichForm.value === formStore.policyholderFormKey) {
689
+ if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
690
+ return dataStore.rules.age18;
577
691
  }
578
- case formStore.beneficiaryFormKey: {
579
- if (dataStore.isBolashak) {
580
- return dataStore.rules.beneficiaryAgeLimit;
581
- }
692
+ }
693
+ if (whichForm.value === formStore.beneficiaryFormKey) {
694
+ if (dataStore.isBolashak) {
695
+ return dataStore.rules.beneficiaryAgeLimit;
696
+ }
697
+ }
698
+ if (whichForm.value === formStore.insuredFormKey) {
699
+ if (dataStore.isBaiterek || dataStore.isBolashak) {
700
+ return dataStore.rules.age18;
582
701
  }
583
- default:
584
- return [];
585
702
  }
703
+ return [];
586
704
  };
587
705
  return baseAgeRule.concat(byMemberAndProductRule());
588
706
  });
589
707
 
590
708
  const phoneRule = computed(() => {
591
709
  const basePhoneRule = dataStore.rules.required.concat(dataStore.rules.phoneFormat);
592
- const byMemberAndProductRule = () => {
593
- switch (whichForm.value) {
594
- case formStore.beneficiaryFormKey: {
595
- if (dataStore.isGons || dataStore.isBolashak) {
596
- return [];
597
- }
598
- }
599
- default:
600
- return basePhoneRule;
710
+ if (whichForm.value === formStore.beneficiaryFormKey) {
711
+ if (dataStore.isGons || dataStore.isBolashak) {
712
+ return [];
601
713
  }
602
- };
603
- return byMemberAndProductRule();
714
+ }
715
+ return basePhoneRule;
604
716
  });
605
717
 
606
718
  const residencyRule = computed(() => {
607
- switch (whichForm.value) {
608
- case formStore.policyholderFormKey: {
609
- if (dataStore.isBolashak || dataStore.isBaiterek) {
610
- return dataStore.rules.objectRequired.concat(dataStore.rules.noResident);
611
- }
719
+ const baseResidencyRule = dataStore.rules.objectRequired;
720
+ if (whichForm.value === formStore.policyholderFormKey) {
721
+ if (dataStore.isBolashak || dataStore.isBaiterek) {
722
+ return baseResidencyRule.concat(dataStore.rules.noResident);
612
723
  }
613
- default:
614
- return dataStore.rules.objectRequired;
615
724
  }
725
+ return baseResidencyRule;
616
726
  });
617
727
 
618
728
  const getOtpConditionByMember = () => {
@@ -636,10 +746,11 @@ export default {
636
746
  const searchMember = async () => {
637
747
  if (!isDisabled.value) {
638
748
  dataStore.panelAction = null;
639
- dataStore.panel.title = 'Поиск клиента';
749
+ dataStore.panel.title = 'Поиск контрагента';
640
750
  dataStore.panel.open = true;
641
751
  isSearchOpen.value = true;
642
752
  isDocumentOpen.value = false;
753
+ isOtpPanelOpen.value = false;
643
754
  isPanelOpen.value = false;
644
755
  } else {
645
756
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
@@ -650,13 +761,21 @@ export default {
650
761
  vForm.value.scrollTo({ top: direction === 'up' ? 0 : screen.height * 10, behavior: 'smooth' });
651
762
  };
652
763
 
653
- const openCustomPanel = (type: 'document' = 'document') => {
764
+ const openCustomPanel = (type: 'document' | 'otp' = 'document') => {
654
765
  dataStore.panelAction = null;
655
766
  if (type === 'document' && memberDocument.value) {
656
767
  dataStore.panel.title = memberDocument.value.fileTypeName!;
657
768
  isDocumentOpen.value = true;
658
769
  isSearchOpen.value = false;
659
770
  isPanelOpen.value = false;
771
+ isOtpPanelOpen.value = false;
772
+ }
773
+ if (type === 'otp') {
774
+ dataStore.panel.title = dataStore.t('form.otpCode');
775
+ isOtpPanelOpen.value = true;
776
+ isDocumentOpen.value = false;
777
+ isSearchOpen.value = false;
778
+ isPanelOpen.value = false;
660
779
  }
661
780
  dataStore.panel.open = true;
662
781
  };
@@ -665,6 +784,7 @@ export default {
665
784
  if (!isDisabled.value) {
666
785
  isSearchOpen.value = false;
667
786
  isDocumentOpen.value = false;
787
+ isOtpPanelOpen.value = false;
668
788
  // Feature
669
789
  // const notAllowedToChange = ['gender', 'documentType', 'documentIssuers'];
670
790
  // if (member.value.gotFromInsis === false && notAllowedToChange.includes(key)) {
@@ -683,7 +803,7 @@ export default {
683
803
  isPanelLoading.value = true;
684
804
  newList = await asyncFunction(filterKey, member.value);
685
805
  }
686
- panelList.value = newList;
806
+ panelList.value = filterList(newList, key);
687
807
  panelValue.value = member.value[currentPanel.value];
688
808
  isPanelLoading.value = false;
689
809
  } else {
@@ -691,6 +811,22 @@ export default {
691
811
  }
692
812
  };
693
813
 
814
+ const filterList = (list: Value[], key: string) => {
815
+ if (dataStore.isBolashak) {
816
+ if (key === 'relationDegree') {
817
+ if (whichForm.value === formStore.beneficiaryFormKey) {
818
+ const beneficiaryRelations = [12, 13, 14, 15, 20, 21, 22, 23];
819
+ return list.filter(i => beneficiaryRelations.includes(Number(i.ids)));
820
+ }
821
+ if (whichForm.value === formStore.insuredFormKey) {
822
+ const insuredRelations = [6, 7, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23];
823
+ return list.filter(i => insuredRelations.includes(Number(i.ids)));
824
+ }
825
+ }
826
+ }
827
+ return list;
828
+ };
829
+
694
830
  const pickPanelValue = (item: Value) => {
695
831
  if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
696
832
  dataStore.panel.open = false;
@@ -786,41 +922,45 @@ export default {
786
922
  };
787
923
 
788
924
  const getContragentFromGBDFL = async () => {
789
- if (member.value.hasAgreement === false) {
925
+ if (member.value.hasAgreement !== true) {
790
926
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
791
927
  dataStore.panel.open = false;
792
928
  isSearchOpen.value = false;
793
929
  return;
794
930
  }
795
931
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length || !member.value.phoneNumber || member.value.phoneNumber.length !== useMask().phone.length) {
796
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'Номер телефона, ИИН'), 5000);
932
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'Номер телефона, ИИН' }), 5000);
797
933
  dataStore.panel.open = false;
798
934
  isSearchOpen.value = false;
799
935
  return;
800
936
  }
801
937
  isButtonLoading.value = true;
802
- await dataStore.getContragentFromGBDFL(member.value.iin, member.value.phoneNumber, whichForm.value, whichIndex.value ? Number(whichIndex.value) : null);
803
- member.value.gotFromInsis = true;
938
+ const response = await dataStore.getContragentFromGBDFL(member.value);
939
+ if (typeof response === 'boolean') {
940
+ if (response === true) {
941
+ member.value.gotFromInsis = true;
942
+ }
943
+ dataStore.panel.open = false;
944
+ isSearchOpen.value = false;
945
+ }
804
946
  isButtonLoading.value = false;
805
- dataStore.panel.open = false;
806
- isSearchOpen.value = false;
807
947
  };
808
948
 
809
949
  const getContragent = async () => {
810
- if (member.value.hasAgreement === false) {
950
+ if (member.value.hasAgreement !== true) {
811
951
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
812
952
  dataStore.panel.open = false;
813
953
  isSearchOpen.value = false;
814
954
  return;
815
955
  }
816
956
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
817
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'ИИН'), 5000);
957
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
818
958
  dataStore.panel.open = false;
819
959
  isSearchOpen.value = false;
820
960
  return;
821
961
  }
822
962
  isButtonLoading.value = true;
823
- await dataStore.getContragent(member.value, whichForm.value, whichIndex.value, false);
963
+ await dataStore.getContragent(member.value, false);
824
964
  isButtonLoading.value = false;
825
965
  dataStore.panel.open = false;
826
966
  isSearchOpen.value = false;
@@ -854,12 +994,14 @@ export default {
854
994
  return false;
855
995
  }
856
996
  const isInsured = formStore.isPolicyholderInsured;
997
+ const remoteIsInsured = ref<boolean | null>(null);
857
998
  if (whichForm.value == formStore.policyholderFormKey) {
858
999
  if (route.params.taskId === '0') {
859
1000
  try {
860
1001
  const taskId = await dataStore.startApplication(member.value);
861
1002
  if (taskId) {
862
1003
  await dataStore.getApplicationData(taskId, false, false, false, false);
1004
+ remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
863
1005
  await router.replace({
864
1006
  name: route.name!,
865
1007
  params: { taskId: taskId as string },
@@ -882,22 +1024,32 @@ export default {
882
1024
  }
883
1025
  }
884
1026
  const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value as MemberKeys, whichIndex.value ? Number(whichIndex.value) : undefined);
1027
+ if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
1028
+ return false;
1029
+ }
1030
+ const wasInsuredAction = ref<boolean>(false);
885
1031
  const isSaved = await dataStore.saveMember(member.value, memberStore.getMemberCode(whichForm.value as MemberKeys), memberFromApplicaiton);
886
1032
  if (!isSaved) return false;
887
- if (whichForm.value === formStore.policyholderFormKey && isInsured === true) {
888
- formStore.insuredForm[0] = formStore.policyholderForm;
889
- const isInsuredSaved = await dataStore.saveMember(
890
- member.value,
891
- memberStore.getMemberCode(formStore.insuredFormKey as MemberKeys),
892
- memberStore.getMemberFromApplication(formStore.insuredFormKey as MemberKeys, formStore.insuredFormIndex),
893
- );
894
- if (!isInsuredSaved) return false;
1033
+ if (whichForm.value === formStore.policyholderFormKey) {
1034
+ if (isInsured === true || remoteIsInsured.value === true) {
1035
+ formStore.insuredForm[0] = formStore.policyholderForm;
1036
+ const isInsuredSaved = await dataStore.saveMember(
1037
+ member.value,
1038
+ memberStore.getMemberCode(formStore.insuredFormKey as MemberKeys),
1039
+ memberStore.getMemberFromApplication(formStore.insuredFormKey as MemberKeys, formStore.insuredFormIndex),
1040
+ );
1041
+ if (!isInsuredSaved) return false;
1042
+ wasInsuredAction.value = true;
1043
+ }
1044
+ }
1045
+ if (whichForm.value === formStore.insuredFormKey) {
1046
+ wasInsuredAction.value = true;
895
1047
  }
896
1048
  await router.replace({
897
1049
  name: route.name!,
898
1050
  query: { ...route.query, id: member.value.id },
899
1051
  });
900
- await dataStore.getApplicationData(route.params.taskId, false, false, false, false);
1052
+ await dataStore.getApplicationData(route.params.taskId, false, false, true, wasInsuredAction.value);
901
1053
  if (dataStore.controls.hasCalculator) {
902
1054
  if (formStore.additionalInsuranceTermsWithout && formStore.additionalInsuranceTermsWithout.length !== 0) {
903
1055
  formStore.additionalInsuranceTerms.forEach((term: any) => {
@@ -921,7 +1073,7 @@ export default {
921
1073
  return true;
922
1074
  }
923
1075
  }
924
- if (member.value.hasAgreement === false) {
1076
+ if (member.value.hasAgreement !== true) {
925
1077
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
926
1078
  return false;
927
1079
  }
@@ -963,11 +1115,11 @@ export default {
963
1115
  if (errors) {
964
1116
  const errorText = errors.querySelector('.v-label.v-field-label');
965
1117
  if (errorText) {
966
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', errorText.innerHTML?.replace(/[-<>!//.]/g, '')));
1118
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: errorText.innerHTML?.replace(/[-<>!//.]/g, '') }));
967
1119
  } else {
968
1120
  const errorFieldText = errors.querySelector('.v-input__control');
969
1121
  if (errorFieldText) {
970
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', errorFieldText.innerHTML?.replace(/[-<>!//.]/g, '')));
1122
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: errorFieldText.innerHTML?.replace(/[-<>!//.]/g, '') }));
971
1123
  }
972
1124
  }
973
1125
  errors.scrollIntoView({
@@ -982,67 +1134,133 @@ export default {
982
1134
 
983
1135
  const checkOtp = async () => {
984
1136
  if (!member.value.otpCode || member.value.iin?.length !== useMask().iin.length || member.value.phoneNumber?.length !== useMask().phone.length) {
985
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', dataStore.t('form.otpCode')), 3000);
1137
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: dataStore.t('form.otpCode') }), 3000);
986
1138
  return;
987
1139
  }
1140
+ otpSending.value = true;
988
1141
  const checked = await memberStore.checkOtp(member.value);
989
1142
  if (typeof checked !== 'undefined') {
990
1143
  member.value.hasAgreement = checked;
991
1144
  }
1145
+ otpSending.value = false;
1146
+ if (checked === true) {
1147
+ dataStore.panel.open = false;
1148
+ }
992
1149
  };
993
1150
 
994
1151
  const sendOtp = async (onInit = false) => {
1152
+ otpSending.value = true;
995
1153
  const response = await memberStore.sendOtp(member.value, formStore.applicationData.processInstanceId, onInit);
996
1154
  if (response) {
997
1155
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
1156
+ if (response.otpStatus === true) {
1157
+ dataStore.panel.open = false;
1158
+ }
998
1159
  }
1160
+ otpSending.value = false;
999
1161
  };
1000
1162
 
1001
- const onInit = async () => {
1002
- if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
1003
- await dataStore.getSignedDocList(formStore.applicationData.processInstanceId);
1163
+ const setDefaultValues = async () => {
1164
+ const setDefaults = dataStore.controls.setDefaults;
1165
+ if (setDefaults.sectorCode) {
1166
+ await setSectorCode();
1167
+ }
1168
+ if (setDefaults.percentage) {
1169
+ setPercentage();
1170
+ }
1171
+ };
1172
+
1173
+ const setSectorCode = async () => {
1174
+ if (member.value.id === 0 && route.query.id === '0') {
1175
+ const sectorList = await dataStore.getSectorCodeList();
1176
+ const defaultValue = sectorList.find(item => item.ids === '500003.9') as Value;
1177
+ member.value.economySectorCode = defaultValue ? defaultValue : new Value();
1178
+ }
1179
+ };
1180
+
1181
+ const setPercentage = () => {
1182
+ if (whichForm.value === formStore.beneficiaryFormKey && member.value.id === 0 && route.query.id === '0' && member.value.percentageOfPayoutAmount === null) {
1183
+ if (dataStore.members.beneficiaryApp.isMultiple) {
1184
+ const availablePercentage =
1185
+ 100 -
1186
+ formStore.beneficiaryForm.reduce((sum, member) => {
1187
+ return sum + Number(member.percentageOfPayoutAmount);
1188
+ }, 0);
1189
+ if (availablePercentage >= 0 && availablePercentage <= 100) member.value.percentageOfPayoutAmount = availablePercentage;
1190
+ } else {
1191
+ member.value.percentageOfPayoutAmount = 100;
1192
+ }
1004
1193
  }
1194
+ };
1195
+
1196
+ const selectMember = async (index: number, update?: boolean) => {
1197
+ dataStore.panel.open = false;
1198
+ isButtonLoading.value = true;
1199
+ isChangingMember.value = true;
1200
+ //@ts-ignore
1201
+ await router.replace({ query: { ...route.query, i: index, id: getMember(route.query.tab, index).id, upd: update } });
1202
+ isChangingMember.value = false;
1203
+ isButtonLoading.value = false;
1204
+ };
1205
+
1206
+ const deleteMember = async (index: number) => {
1207
+ await memberStore.deleteMember(route.params.taskId as string, whichForm.value as MemberKeys, index);
1208
+ const currentIndex = Number(whichIndex.value);
1209
+ if (index <= currentIndex) {
1210
+ const newIndex = ref<number>(currentIndex - 1 > 0 ? currentIndex - 1 : 0);
1211
+ await selectMember(newIndex.value, index === currentIndex ? true : undefined);
1212
+ }
1213
+ };
1214
+
1215
+ const onInit = async () => {
1216
+ // if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
1217
+ // await dataStore.getSignedDocList(formStore.applicationData.processInstanceId);
1218
+ // }
1005
1219
  if (getOtpConditionByMember()) {
1006
1220
  await sendOtp(true);
1007
1221
  } else {
1008
1222
  if (member.value.hasAgreement === null) member.value.hasAgreement = true;
1009
1223
  }
1010
- if (route.query.id !== '0' && !member.value.id) {
1011
- await dataStore.getContragentById(route.query.id, whichForm.value, true);
1012
- }
1013
- if (member.value.id && route.query.id === '0') {
1014
- await router.replace({
1015
- name: route.name!,
1016
- query: { ...route.query, id: member.value.id },
1017
- });
1018
- }
1019
- if (member.value.id) {
1020
- const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1021
- if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1224
+ if (!member.value.id) {
1225
+ await router.replace({ query: { ...route.query, id: 0 } });
1226
+ } else {
1227
+ if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1228
+ // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1229
+ // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1022
1230
  }
1231
+ await setDefaultValues();
1023
1232
  };
1024
1233
 
1025
1234
  onMounted(async () => {
1026
1235
  await onInit();
1027
1236
  });
1028
1237
 
1029
- onBeforeRouteUpdate(to => {
1030
- if ('tab' in to.query && to.query.tab !== 'productConditions') {
1031
- member.value = getMember(to.query.tab, to.query.i);
1032
- }
1033
- });
1238
+ watch(
1239
+ () => sameAddress.value,
1240
+ () => {
1241
+ if (whichForm.value === formStore.beneficiaryFormKey) setAddressBeneficiary(Number(whichIndex.value), sameAddress.value);
1242
+ },
1243
+ );
1034
1244
 
1035
1245
  watch(
1036
1246
  () => member.value.percentageOfPayoutAmount,
1037
1247
  val => {
1038
- const percentage = typeof val === 'string' ? Number(val) : val;
1039
- if (percentage) {
1040
- if (percentage < 0) {
1041
- member.value.percentageOfPayoutAmount = 0;
1042
- dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1043
- } else if (percentage > 100) {
1044
- member.value.percentageOfPayoutAmount = 100;
1045
- dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1248
+ if (whichForm.value === formStore.beneficiaryFormKey && !isDisabled.value) {
1249
+ const percentage = typeof val === 'string' ? Number(val) : val;
1250
+ if (typeof percentage === 'number') {
1251
+ if (memberSetting.value.isMultiple) {
1252
+ if (percentage < 0) {
1253
+ member.value.percentageOfPayoutAmount = 0;
1254
+ dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1255
+ } else if (percentage > 100) {
1256
+ member.value.percentageOfPayoutAmount = 100;
1257
+ dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
1258
+ }
1259
+ } else {
1260
+ if (member.value.percentageOfPayoutAmount !== 100) {
1261
+ member.value.percentageOfPayoutAmount = 100;
1262
+ }
1263
+ }
1046
1264
  }
1047
1265
  }
1048
1266
  },
@@ -1058,14 +1276,21 @@ export default {
1058
1276
  },
1059
1277
  );
1060
1278
 
1061
- watch(
1062
- () => member.value.otpCode,
1063
- async () => {
1064
- if (member.value.otpCode && member.value.otpCode.length === useMask().otp.length) {
1065
- await checkOtp();
1279
+ const onIinInput = () => {
1280
+ if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value.isMultiple === true) {
1281
+ const alreadyInStatement = formStore[whichForm.value as MemberKeys].findIndex((i: Member) => i.iin === member.value.iin);
1282
+ if (alreadyInStatement !== -1 && alreadyInStatement !== Number(whichIndex.value)) {
1283
+ dataStore.showToaster('error', dataStore.t('toaster.hasAlreadyMember'), 3000);
1284
+ member.value.iin = null;
1066
1285
  }
1067
- },
1068
- );
1286
+ }
1287
+ };
1288
+
1289
+ const onOtpCodeInput = async () => {
1290
+ if (member.value.otpCode && member.value.otpCode.length === useMask().otp.length) {
1291
+ await checkOtp();
1292
+ }
1293
+ };
1069
1294
 
1070
1295
  watch(
1071
1296
  () => dataStore.panel.open,
@@ -1074,6 +1299,7 @@ export default {
1074
1299
  isPanelOpen.value = false;
1075
1300
  isDocumentOpen.value = false;
1076
1301
  isSearchOpen.value = false;
1302
+ isOtpPanelOpen.value = false;
1077
1303
  dataStore.panelAction = null;
1078
1304
  }
1079
1305
  },
@@ -1095,10 +1321,12 @@ export default {
1095
1321
  isPanelOpen,
1096
1322
  isSearchOpen,
1097
1323
  isDocumentOpen,
1324
+ isOtpPanelOpen,
1098
1325
  isPanelLoading,
1099
1326
  isButtonLoading,
1100
1327
  isSubmittingForm,
1101
1328
  documentLoading,
1329
+ otpSending,
1102
1330
  panelValue,
1103
1331
  panelList,
1104
1332
  searchQuery,
@@ -1106,10 +1334,12 @@ export default {
1106
1334
  memberDocument,
1107
1335
  familyDialog,
1108
1336
  selectedFamilyMember,
1337
+ sameAddress,
1109
1338
 
1110
1339
  // Computed
1111
1340
  whichForm,
1112
1341
  whichIndex,
1342
+ memberSetting,
1113
1343
  otpCondition,
1114
1344
  hasOtp,
1115
1345
  isDisabled,
@@ -1120,11 +1350,14 @@ export default {
1120
1350
  hasGBDFL,
1121
1351
  hasInsis,
1122
1352
  hasGKB,
1353
+ hasFamilyStatus,
1354
+ hasInsurancePay,
1123
1355
 
1124
1356
  // Rules
1125
1357
  ageRule,
1126
1358
  phoneRule,
1127
1359
  residencyRule,
1360
+ birthDateRule,
1128
1361
 
1129
1362
  // Functions
1130
1363
  searchMember,
@@ -1142,6 +1375,10 @@ export default {
1142
1375
  selectFamilyMember,
1143
1376
  closeFamilyDialog,
1144
1377
  scrollForm,
1378
+ onIinInput,
1379
+ onOtpCodeInput,
1380
+ deleteMember,
1381
+ selectMember,
1145
1382
  };
1146
1383
  },
1147
1384
  };