hl-core 0.0.10-beta.4 → 0.0.10-beta.41

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 (53) hide show
  1. package/README.md +0 -2
  2. package/api/base.api.ts +338 -191
  3. package/api/interceptors.ts +3 -5
  4. package/components/Complex/TextBlock.vue +2 -0
  5. package/components/Dialog/Dialog.vue +7 -1
  6. package/components/Dialog/FamilyDialog.vue +2 -0
  7. package/components/Form/DigitalDocument.vue +52 -0
  8. package/components/Form/DynamicForm.vue +1 -0
  9. package/components/Form/FormData.vue +1 -0
  10. package/components/Form/ManagerAttachment.vue +48 -10
  11. package/components/Form/ProductConditionsBlock.vue +12 -6
  12. package/components/Input/Datepicker.vue +5 -0
  13. package/components/Input/DynamicInput.vue +2 -0
  14. package/components/Input/FormInput.vue +7 -0
  15. package/components/Input/OtpInput.vue +25 -0
  16. package/components/Input/PanelInput.vue +1 -0
  17. package/components/Input/RoundedInput.vue +4 -0
  18. package/components/Input/RoundedSelect.vue +4 -0
  19. package/components/Input/SwitchInput.vue +2 -0
  20. package/components/Input/TextAreaField.vue +71 -0
  21. package/components/Input/TextInput.vue +2 -0
  22. package/components/Layout/Drawer.vue +2 -0
  23. package/components/Menu/MenuNav.vue +1 -1
  24. package/components/Pages/Anketa.vue +168 -169
  25. package/components/Pages/Auth.vue +2 -0
  26. package/components/Pages/ContragentForm.vue +2 -1
  27. package/components/Pages/Documents.vue +432 -59
  28. package/components/Pages/MemberForm.vue +334 -160
  29. package/components/Pages/ProductConditions.vue +838 -226
  30. package/components/Panel/PanelHandler.vue +280 -121
  31. package/components/Transitions/Animation.vue +2 -0
  32. package/components/Utilities/Chip.vue +3 -1
  33. package/components/Utilities/JsonViewer.vue +1 -2
  34. package/composables/classes.ts +143 -49
  35. package/composables/constants.ts +44 -0
  36. package/composables/fields.ts +6 -4
  37. package/composables/index.ts +298 -7
  38. package/composables/styles.ts +8 -24
  39. package/configs/pwa.ts +1 -7
  40. package/layouts/clear.vue +1 -1
  41. package/layouts/default.vue +1 -1
  42. package/layouts/full.vue +1 -1
  43. package/locales/ru.json +80 -19
  44. package/nuxt.config.ts +10 -13
  45. package/package.json +12 -12
  46. package/plugins/head.ts +2 -1
  47. package/store/data.store.ts +802 -531
  48. package/store/member.store.ts +18 -6
  49. package/store/rules.ts +22 -2
  50. package/types/enum.ts +33 -2
  51. package/types/env.d.ts +2 -2
  52. package/types/form.ts +71 -74
  53. package/types/index.ts +924 -873
@@ -68,51 +68,56 @@
68
68
  v-model="member.phoneNumber"
69
69
  :label="$dataStore.t('form.phoneNumber')"
70
70
  :maska="$maska.phone"
71
- :readonly="!!isDisabled || !!isIinPhoneDisabled"
72
- :clearable="!isDisabled"
71
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!isDataFromGov"
72
+ :clearable="!isDisabled && !isIinPhoneDisabled && !isDataFromGov"
73
73
  :append-inner-icon="otpCondition ? `${$dataStore.isPension ? 'mdi-message-text' : 'mdi mdi-phone-message'}` : ''"
74
74
  @append="openCustomPanel('otp')"
75
75
  @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
76
76
  :rules="phoneRule"
77
77
  />
78
- <base-form-input
79
- v-model="member.iin"
80
- :label="$dataStore.t('form.iin')"
81
- :maska="$maska.iin"
82
- :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin"
83
- :clearable="!isDisabled"
84
- :append-inner-icon="hasMemberSearch ? (hasDocumentReader ? 'mdi mdi-credit-card-scan-outline' : 'mdi mdi-magnify') : ''"
85
- @append="searchMember"
86
- @input="onIinInput"
87
- :rules="$rules.required.concat($rules.iinRight)"
88
- />
78
+ <base-animation>
79
+ <base-form-input
80
+ v-if="!isNonResident"
81
+ v-model="member.iin"
82
+ :label="$dataStore.t('form.iin')"
83
+ :maska="$maska.iin"
84
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin || !!isDataFromGov"
85
+ :clearable="!isDisabled && !isIinPhoneDisabled && !member.parsedDocument?.iin && !isDataFromGov"
86
+ :append-inner-icon="hasMemberSearch || !isNonResident ? (hasDocumentReader ? 'mdi mdi-credit-card-scan-outline' : 'mdi mdi-magnify') : ''"
87
+ @append="searchMember"
88
+ @input="onIinInput"
89
+ :rules="isNonResident ? [] : $rules.required.concat($rules.iinRight)"
90
+ />
91
+ </base-animation>
89
92
  <base-form-input
90
93
  v-model.trim="member.lastName"
91
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.lastName"
92
- :clearable="!isDisabled"
94
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.lastName"
95
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.lastName"
93
96
  :label="$dataStore.t('form.lastName')"
94
97
  :rules="$rules.required.concat($rules.cyrillic)"
95
98
  />
96
99
  <base-form-input
97
100
  v-model.trim="member.firstName"
98
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.firstName"
99
- :clearable="!isDisabled"
101
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.firstName"
102
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.firstName"
100
103
  :label="$dataStore.t('form.firstName')"
101
104
  :rules="$rules.required.concat($rules.cyrillic)"
105
+ :append-inner-icon="isNonResident ? 'mdi mdi-magnify' : ''"
106
+ @append="searchMember"
102
107
  />
103
108
  <base-form-input
104
109
  v-if="hasMiddleName"
105
110
  v-model.trim="member.middleName"
106
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.middleName"
107
- :clearable="!isDisabled"
111
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.middleName"
112
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.middleName"
108
113
  :label="$dataStore.t('form.middleName')"
109
114
  :rules="$rules.cyrillicNonRequired"
110
115
  />
111
116
  <base-form-input
112
117
  v-if="$dataStore.isLifetrip"
113
118
  v-model.trim="member.lastNameLat"
114
- :readonly="isDisabled || isFromGBD"
115
- :clearable="!isDisabled"
119
+ :readonly="isDisabled || isDataFromGov"
120
+ :clearable="!isDisabled && !isDataFromGov"
116
121
  :label="$dataStore.t('form.lastNameLat')"
117
122
  :rules="$rules.required.concat($rules.latin)"
118
123
  :hint="$dataStore.t('labels.checkWithDoc')"
@@ -120,16 +125,16 @@
120
125
  <base-form-input
121
126
  v-if="$dataStore.isLifetrip"
122
127
  v-model.trim="member.firstNameLat"
123
- :readonly="isDisabled || isFromGBD"
124
- :clearable="!isDisabled"
128
+ :readonly="isDisabled || isDataFromGov"
129
+ :clearable="!isDisabled && !isDataFromGov"
125
130
  :label="$dataStore.t('form.firstNameLat')"
126
131
  :rules="$rules.required.concat($rules.latin)"
127
132
  :hint="$dataStore.t('labels.checkWithDoc')"
128
133
  />
129
134
  <base-form-input
130
135
  v-model="member.birthDate"
131
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.birthDate"
132
- :clearable="!isDisabled"
136
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.birthDate"
137
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.birthDate"
133
138
  :label="$dataStore.t('form.birthDate')"
134
139
  :rules="birthDateRule"
135
140
  :maska="$maska.date"
@@ -161,8 +166,8 @@
161
166
  <base-panel-input
162
167
  v-model="member.gender"
163
168
  :value="member.gender?.nameRu"
164
- :readonly="isDisabled || isFromGBD"
165
- :clearable="!isDisabled && !isFromGBD"
169
+ :readonly="isDisabled || isDataFromGov"
170
+ :clearable="!isDisabled && !isDataFromGov"
166
171
  :label="$dataStore.t('form.gender')"
167
172
  :rules="$rules.objectRequired"
168
173
  append-inner-icon="mdi mdi-chevron-right"
@@ -199,8 +204,11 @@
199
204
  :rules="$rules.required.concat($rules.numbers)"
200
205
  />
201
206
  </base-form-section>
202
- <base-form-section v-if="$dataStore.isPension && whichForm === formStore.insuredFormKey" :title="$dataStore.t('pension.disabilityInfo')">
203
- <base-form-toggle v-model="member.isDisability" :title="$dataStore.t('pension.ifHasDisability')" :disabled="isDisabled" :has-border="false" />
207
+ <base-form-section
208
+ v-if="$dataStore.isPension && (whichForm === formStore.insuredFormKey || $route.query.tab === 'slaveInsuredForm')"
209
+ :title="$dataStore.t('pension.disabilityInfo')"
210
+ >
211
+ <base-form-toggle v-model="member.isDisability" :title="$dataStore.t('pension.ifHasDisabilityAlways')" :disabled="isDisabled" :has-border="false" />
204
212
  <base-animation>
205
213
  <base-panel-input
206
214
  v-if="member.isDisability"
@@ -347,7 +355,7 @@
347
355
  />
348
356
  <base-form-input v-model.trim="member.jobPlace" :label="$dataStore.t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
349
357
  </base-form-section>
350
- <base-form-section :title="$dataStore.t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
358
+ <base-form-section :title="$dataStore.t('form.placeRegistration')">
351
359
  <base-form-toggle v-if="hasSameAddressToggle" v-model="sameAddress" :disabled="isDisabled" :has-border="false" :title="$dataStore.t('form.sameAddress')" />
352
360
  <base-panel-input
353
361
  v-model="member.registrationCountry"
@@ -415,7 +423,7 @@
415
423
  />
416
424
  <base-form-input
417
425
  v-model.trim="member.registrationNumberHouse"
418
- :rules="$rules.required"
426
+ :rules="[...$rules.required, $rules.lengthLimit(member.registrationNumberHouse, 10)]"
419
427
  :readonly="isDisabled"
420
428
  :clearable="!isDisabled"
421
429
  :label="$dataStore.t('form.NumberHouse')"
@@ -447,7 +455,7 @@
447
455
  @append="openPanel($dataStore.t('form.Region'), [], 'birthRegion', $dataStore.getRegions)"
448
456
  /> -->
449
457
  </base-form-section>
450
- <base-form-section :title="$dataStore.t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
458
+ <base-form-section :title="$dataStore.t('form.documentData')">
451
459
  <base-panel-input
452
460
  v-if="gbdDocuments && gbdDocuments.length"
453
461
  value="Список документов из ГБДФЛ"
@@ -461,8 +469,8 @@
461
469
  v-model="member.documentType"
462
470
  :value="member.documentType?.nameRu"
463
471
  :label="$dataStore.t('form.documentType')"
464
- :readonly="isDisabled"
465
- :clearable="!isDisabled"
472
+ :readonly="isDisabled || isDataFromGov"
473
+ :clearable="!isDisabled && !isDataFromGov"
466
474
  :rules="$rules.objectRequired"
467
475
  append-inner-icon="mdi mdi-chevron-right"
468
476
  @append="openPanel($dataStore.t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
@@ -470,8 +478,8 @@
470
478
  <base-form-input
471
479
  v-model.trim="member.documentNumber"
472
480
  :label="$dataStore.t('form.documentNumber')"
473
- :readonly="isDisabled || !!member.parsedDocument?.documentNumber"
474
- :clearable="!isDisabled"
481
+ :readonly="isDisabled || !!member.parsedDocument?.documentNumber || isDataFromGov"
482
+ :clearable="!isDisabled && !member.parsedDocument?.documentNumber && !isDataFromGov"
475
483
  :rules="$rules.required"
476
484
  />
477
485
  <!-- <base-file-input v-if="!memberDocument" :disabled="isDisabled" :clearable="!isDisabled" @input="attachFile($event)" />
@@ -483,17 +491,42 @@
483
491
  v-model="member.documentIssuers"
484
492
  :value="member.documentIssuers?.nameRu"
485
493
  :label="$dataStore.t('form.documentIssuers')"
486
- :readonly="isDisabled || !!member.parsedDocument?.documentIssuer"
487
- :clearable="!isDisabled"
494
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssuer || isDataFromGov"
495
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssuer && !isDataFromGov"
488
496
  :rules="$rules.objectRequired"
489
497
  append-inner-icon="mdi mdi-chevron-right"
490
498
  @append="openPanel($dataStore.t('form.documentIssuers'), [], 'documentIssuers', $dataStore.getDocumentIssuers)"
491
499
  />
500
+ <base-animation>
501
+ <div v-if="hasIssuerOther" class="flex flex-col gap-[1px]">
502
+ <base-form-input
503
+ v-model="member.documentIssuers.issuerOtherName"
504
+ :label="$dataStore.t('form.issuerOtherName')"
505
+ :readonly="isDisabled"
506
+ :clearable="!isDisabled"
507
+ :rules="$rules.required.concat($rules.onlySymbols)"
508
+ />
509
+ <base-form-input
510
+ v-model="member.documentIssuers.issuerOtherNameOrig"
511
+ :label="$dataStore.t('form.issuerOtherNameOrig')"
512
+ :readonly="isDisabled"
513
+ :clearable="!isDisabled"
514
+ :rules="$rules.required"
515
+ />
516
+ <base-form-input
517
+ v-model="member.documentIssuers.issuerOtherNameRu"
518
+ :label="$dataStore.t('form.issuerOtherNameRu')"
519
+ :readonly="isDisabled"
520
+ :clearable="!isDisabled"
521
+ :rules="$rules.required.concat($rules.cyrillic)"
522
+ />
523
+ </div>
524
+ </base-animation>
492
525
  <base-form-input
493
526
  v-model="member.documentDate"
494
527
  :label="$dataStore.t('form.documentDate')"
495
- :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate"
496
- :clearable="!isDisabled"
528
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate || isDataFromGov"
529
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssueDate && !isDataFromGov"
497
530
  :rules="$rules.required.concat($rules.date)"
498
531
  :maska="$maska.date"
499
532
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -503,8 +536,8 @@
503
536
  v-if="member.documentType.ids !== 'SBI'"
504
537
  v-model="member.documentExpire"
505
538
  :label="$dataStore.t('form.documentExpire')"
506
- :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate"
507
- :clearable="!isDisabled"
539
+ :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate || isDataFromGov"
540
+ :clearable="!isDisabled && !member.parsedDocument?.documentExpireDate && !isDataFromGov"
508
541
  :rules="$rules.required.concat($rules.date)"
509
542
  :maska="$maska.date"
510
543
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -601,47 +634,19 @@
601
634
  v-model="member.bankInfo.bankName"
602
635
  :value="member.bankInfo.bankName.nameRu"
603
636
  :label="$dataStore.t('clients.form.nameBank')"
604
- :readonly="isDisabled"
605
- :clearable="!isDisabled"
637
+ :readonly="true"
638
+ :clearable="false"
606
639
  :rules="$rules.objectRequired"
607
- append-inner-icon="mdi mdi-chevron-right"
608
- @append="openPanel($dataStore.t('clients.form.nameBank'), [], 'bankInfo', $dataStore.getBanks, '', 'bankName')"
609
640
  />
610
641
  <base-form-input
611
642
  v-model.trim="member.bankInfo.bin"
612
- :label="$dataStore.t('form.bin')"
613
643
  :maska="$maska.iin"
614
- :readonly="isDisabled"
615
- :clearable="!isDisabled"
644
+ :label="$dataStore.t('form.bin')"
645
+ :readonly="true"
646
+ :clearable="false"
616
647
  :rules="$rules.required.concat($rules.iinRight)"
617
648
  />
618
- <base-form-input v-model="member.bankInfo.bik" :label="$dataStore.t('clients.form.bik')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
619
- </base-form-section>
620
- <base-form-section v-if="$dataStore.hasAdditionalDocumentsSection(whichForm)" :title="$dataStore.t('form.phDocuments')">
621
- <base-file-input
622
- :label="$dataStore.t('form.identyDocument')"
623
- :disabled="isDisabled"
624
- :clearable="!isDisabled"
625
- icon="mdi-paperclip"
626
- @input="attachFile($event, '1')"
627
- :rules="$rules.required"
628
- />
629
- <base-file-input
630
- :label="$dataStore.t('form.bankStatement')"
631
- :disabled="isDisabled"
632
- :clearable="!isDisabled"
633
- icon="mdi-paperclip"
634
- @input="attachFile($event, '10')"
635
- :rules="$rules.required"
636
- />
637
- <base-file-input
638
- :label="$dataStore.t('pension.ENPFnote')"
639
- :disabled="isDisabled"
640
- :clearable="!isDisabled"
641
- icon="mdi-paperclip"
642
- @input="attachFile($event, '8')"
643
- :rules="$rules.required"
644
- />
649
+ <base-form-input v-model="member.bankInfo.bik" :label="$dataStore.t('clients.form.bik')" :readonly="true" :clearable="false" :rules="$rules.required" />
645
650
  </base-form-section>
646
651
  <base-form-section :title="$dataStore.t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
647
652
  <base-form-input
@@ -678,6 +683,7 @@
678
683
  <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
679
684
  <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
680
685
  <base-btn v-if="hasGKB" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGKB')" @click="getFamilyInfo" />
686
+ <base-btn v-if="isNonResident" :loading="isButtonLoading" :text="$dataStore.t('buttons.searchByFio')" @click="getContragent" />
681
687
  <base-form-section v-if="hasDocumentReader" class="!mt-0">
682
688
  <base-file-input
683
689
  :disabled="isDisabled"
@@ -702,18 +708,16 @@
702
708
  </Teleport>
703
709
  <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#right-panel-actions">
704
710
  <div :class="[$styles.flexColNav]">
705
- <base-fade-transition>
706
- <base-rounded-input
707
- v-if="otpCondition && member.otpTokenId"
708
- v-model="member.otpCode"
709
- :label="$dataStore.t('form.otpCode')"
710
- :maska="$maska.otp"
711
- :append-inner-icon="hasOtp ? 'mdi-cellphone-message text-[17px]' : ''"
712
- hide-details
713
- @keyup.enter.prevent="hasOtp ? checkOtp() : null"
714
- @input="onOtpCodeInput"
715
- />
716
- </base-fade-transition>
711
+ <base-animation>
712
+ <div v-if="otpCondition && member.otpTokenId" class="flex flex-col">
713
+ <base-form-section class="mt-0 py-2">
714
+ <base-otp-input v-model="member.otpCode" :length="4" @keyup.enter.prevent="hasOtp && checkOtp()" @input="onOtpCodeInput" />
715
+ </base-form-section>
716
+ <span class="text-center cursor-pointer mt-2" :class="[$styles.mutedText]" @click="sendOtp(false)"
717
+ >Не получили код? <span class="underline underline-offset-2">Отправить код заново</span></span
718
+ >
719
+ </div>
720
+ </base-animation>
717
721
  <base-btn v-if="!member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.sendOtp')" @click="sendOtp(false)" />
718
722
  <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.check')" @click="checkOtp()" />
719
723
  </div>
@@ -721,12 +725,12 @@
721
725
  <Teleport v-if="isPositionPanelOpen" to="#right-panel-actions">
722
726
  <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
723
727
  <base-rounded-input
724
- v-model="searchQuery"
725
- :label="$dataStore.t('labels.search')"
728
+ v-model.trim="searchQuery"
729
+ label="Выполните поиск должностей"
726
730
  class="w-full p-2"
727
731
  :hide-details="searchQuery.length >= 4"
728
- :rules="[searchQuery.length < 4 ? $dataStore.t('rules.searchQueryLen', { len: '4' }) : true]"
729
- :append-inner-icon="searchQuery.length < 4 ? '' : 'mdi mdi-magnify'"
732
+ :rules="[searchQuery.length < 4 ? $dataStore.t('rules.searchQueryLen', { len: 4 }) : true]"
733
+ append-inner-icon="mdi mdi-magnify"
730
734
  @append="searchPositions"
731
735
  />
732
736
  <base-animation>
@@ -783,6 +787,27 @@
783
787
  <base-list-empty class="w-full" v-else @click="documentChooseDialog = false" />
784
788
  </template>
785
789
  </base-dialog>
790
+ <base-dialog
791
+ v-model="fioChooseDialog"
792
+ :title="$dataStore.t('pension.contragentSelect')"
793
+ :icon="{ mdi: 'format-list-bulleted-type', color: '#A0B3D8' }"
794
+ actions="fioChooseDialog"
795
+ :persistent="false"
796
+ >
797
+ <template #actions>
798
+ <v-list lines="two" v-if="contragents && contragents.length" class="w-full !py-0">
799
+ <v-list-item v-for="person of contragents" :key="person.id" @click="getContragentClick(person)">
800
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">
801
+ {{ person.longName }}
802
+ </v-list-item-title>
803
+ <v-list-item-subtitle :class="[$styles.textSimple]">
804
+ {{ reformatDate(person.birthDate) }} - {{ person.genderName }} - Рег: {{ reformatDate(person.registrationDate) }}
805
+ </v-list-item-subtitle>
806
+ </v-list-item>
807
+ </v-list>
808
+ <base-list-empty class="w-full" v-else @click="fioChooseDialog = false" />
809
+ </template>
810
+ </base-dialog>
786
811
  </section>
787
812
  <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')" />
788
813
  </template>
@@ -790,7 +815,8 @@
790
815
  <script lang="ts">
791
816
  import { Value, DocumentItem, Member } from '../../composables/classes';
792
817
  import { uuid } from 'vue-uuid';
793
- import { StoreMembers, Enums } from '../../types/enum';
818
+ import { StoreMembers, CoreEnums } from '../../types/enum';
819
+ import type { Api, ContragentType, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
794
820
 
795
821
  export default {
796
822
  setup() {
@@ -802,7 +828,8 @@ export default {
802
828
  const memberStore = useMemberStore();
803
829
  const whichForm = computed(() => route.query.tab as keyof typeof StoreMembers);
804
830
  const whichIndex = computed(() => route.query.i as string);
805
- const getMember = (whichForm: keyof typeof StoreMembers, whichIndex?: string) => memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
831
+ const getMember = (whichForm: keyof typeof StoreMembers | 'slaveInsuredForm', whichIndex?: string) =>
832
+ memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
806
833
  const member = ref(getMember(whichForm.value, whichIndex.value));
807
834
  const selectedFamilyMember = ref<Api.GKB.BirthInfo>({});
808
835
  const isPanelOpen = ref<boolean>(false);
@@ -817,9 +844,12 @@ export default {
817
844
  const isPositionPanelOpen = ref<boolean>(false);
818
845
  const isPanelLoading = ref<boolean>(false);
819
846
  const isChangingMember = ref<boolean>(false);
847
+ const isNonResident = computed(() => dataStore.isPension && member.value.signOfResidency.ids === '500011.2');
848
+ const isDataFromGov = computed(() => member.value.verifyType === 'GBDFL' || member.value.verifyType === 'ESBD' || !!member.value.gosPersonData);
820
849
  const familyDialog = ref<boolean>(false);
821
850
  const deletionDialog = ref<boolean>(false);
822
851
  const documentChooseDialog = ref<boolean>(false);
852
+ const fioChooseDialog = ref<boolean>(false);
823
853
  const selectedIndex = ref<number>(0);
824
854
  const sameAddress = ref<boolean>(false);
825
855
  const panelValue = ref<Value>(new Value());
@@ -830,6 +860,8 @@ export default {
830
860
  const fileData = ref<{ file: any }>();
831
861
  const imageDataList = ref<string[]>([]);
832
862
  const isRelative = ref<boolean>(false);
863
+ const additionalDocuments = ref<any[]>([]);
864
+ const contragents = ref<ContragentType[]>([]);
833
865
 
834
866
  const currentPanelDeep = ref<string>();
835
867
  const currentPanelSubDeep = ref<string>();
@@ -839,7 +871,6 @@ export default {
839
871
  const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value));
840
872
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
841
873
  const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
842
- const isFromGBD = computed(() => !!member.value.gosPersonData);
843
874
  const gbdDocuments = computed(() => {
844
875
  if (hasGBDFLDocSelection && !!member.value.gosPersonData && !!member.value.gosPersonData.documents) {
845
876
  const documents = Array.isArray(member.value.gosPersonData.documents.document)
@@ -865,6 +896,7 @@ export default {
865
896
  case formStore.policyholdersRepresentativeFormKey:
866
897
  return route.params.taskId !== '0';
867
898
  default:
899
+ if (route.query.tab === 'slaveInsuredForm') return true;
868
900
  return false;
869
901
  }
870
902
  };
@@ -901,7 +933,7 @@ export default {
901
933
  };
902
934
  return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
903
935
  });
904
- const hasGBDFLDocSelection = dataStore.isLifetrip && whichForm.value === formStore.policyholderFormKey;
936
+ const hasGBDFLDocSelection = dataStore.isLifetrip;
905
937
  const hasInsis = computed(() => dataStore.controls.hasInsis);
906
938
  const hasGKB = computed(() => {
907
939
  const perMemberCondition = () => {
@@ -972,7 +1004,8 @@ export default {
972
1004
  (whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin) ||
973
1005
  (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage),
974
1006
  );
975
- const hasWorkPositionDict = !useEnv().isProduction && dataStore.isBaiterek && dataStore.isEfoParent;
1007
+ const hasWorkPositionDict = dataStore.isBaiterek;
1008
+ const hasIssuerOther = computed(() => (useEnv().isProduction ? dataStore.isPension : true) && member.value.documentIssuers && member.value.documentIssuers.nameRu === 'Другое');
976
1009
 
977
1010
  const birthDateRule = computed(() => {
978
1011
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
@@ -1047,16 +1080,18 @@ export default {
1047
1080
  });
1048
1081
 
1049
1082
  const getOtpConditionByMember = () => {
1050
- switch (whichForm.value) {
1083
+ const which = whichForm.value as keyof typeof StoreMembers | 'slaveInsuredForm';
1084
+ switch (which) {
1051
1085
  case formStore.policyholderFormKey:
1052
1086
  return route.params.taskId === '0';
1053
1087
  case formStore.insuredFormKey:
1054
- if (dataStore.isPension) return route.params.taskId === '0';
1055
- return route.query.id === '0';
1088
+ case 'slaveInsuredForm':
1056
1089
  case formStore.policyholdersRepresentativeFormKey:
1057
1090
  case formStore.beneficiaryFormKey:
1058
1091
  case formStore.beneficialOwnerFormKey:
1059
1092
  return route.query.id === '0';
1093
+ default:
1094
+ return dataStore.isPension && route.query.id === '0' && formStore.applicationData.processCode === 24;
1060
1095
  }
1061
1096
  };
1062
1097
  const otpCondition = computed(() => {
@@ -1065,6 +1100,7 @@ export default {
1065
1100
  if (whichForm.value === formStore.beneficiaryFormKey && member.value.age !== null && Number(member.value.age) < 18) return false;
1066
1101
  if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) return false;
1067
1102
  if (!member.value.phoneNumber || (member.value.phoneNumber && member.value.phoneNumber.length !== useMask().phone.length)) return false;
1103
+ if (route.query.tab === 'slaveInsuredForm' && route.query.id === '0') return true;
1068
1104
  return getOtpConditionByMember();
1069
1105
  });
1070
1106
 
@@ -1084,6 +1120,10 @@ export default {
1084
1120
  };
1085
1121
 
1086
1122
  const searchPositions = async () => {
1123
+ if (searchQuery.value.length < 4) {
1124
+ dataStore.showToaster('error', dataStore.t('rules.searchQueryLen', { len: 4 }));
1125
+ return;
1126
+ }
1087
1127
  if (!isDisabled.value) {
1088
1128
  isPanelLoading.value = true;
1089
1129
  positionsList.value = await dataStore.getWorkPosition(searchQuery.value);
@@ -1122,6 +1162,7 @@ export default {
1122
1162
  isPositionPanelOpen.value = false;
1123
1163
  }
1124
1164
  if (type === 'workPosition') {
1165
+ dataStore.rightPanel.title = dataStore.t('form.jobPosition');
1125
1166
  isPositionPanelOpen.value = true;
1126
1167
  isOtpPanelOpen.value = false;
1127
1168
  isDocumentOpen.value = false;
@@ -1251,12 +1292,35 @@ export default {
1251
1292
  }
1252
1293
  };
1253
1294
 
1254
- const attachFile = (event: InputEvent, code?: string) => {
1295
+ const uploadAdditionalFiles = async (processInstanceId: string | number) => {
1296
+ const formData = new FormData();
1297
+ const information: any = [];
1298
+ const uuidV4 = uuid.v4();
1299
+ if (additionalDocuments.value) {
1300
+ Object.values(additionalDocuments.value).map((value: any) => {
1301
+ formData.append('file', value);
1302
+ const ext = value.name.substring(value.name.lastIndexOf('.'));
1303
+ const selectedDocument = dataStore.dicFileTypeList.find((i: Value) => i.code === value.code);
1304
+ information.push({
1305
+ identifier: `${uuidV4}${ext}`,
1306
+ iin: member.value.iin ? member.value.iin.replaceAll('-', '') : null,
1307
+ processInstanceId: processInstanceId,
1308
+ fileTypeCode: selectedDocument ? selectedDocument.code : null,
1309
+ fileTypeId: selectedDocument ? selectedDocument.id : null,
1310
+ fileName: value.name,
1311
+ });
1312
+ });
1313
+ formData.append('fileData', JSON.stringify(information));
1314
+ await dataStore.uploadFiles(formData, false);
1315
+ }
1316
+ };
1317
+
1318
+ const attachFile = (event: InputEvent) => {
1255
1319
  if (event.target) {
1256
- fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
1320
+ fileData.value = { file: (event.target as HTMLInputElement).files };
1257
1321
  } else {
1258
1322
  if (event.dataTransfer) {
1259
- fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
1323
+ fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1260
1324
  }
1261
1325
  }
1262
1326
  };
@@ -1325,7 +1389,7 @@ export default {
1325
1389
  if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1326
1390
  if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1327
1391
  if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1328
- const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Enums.Insis.DocTypes['1UDL']);
1392
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === CoreEnums.Insis.DocTypes['1UDL']);
1329
1393
  if (documentType) member.value.documentType = documentType;
1330
1394
  }
1331
1395
  if (!!parsedDocument.documentIssuer) {
@@ -1429,7 +1493,9 @@ export default {
1429
1493
 
1430
1494
  const selectGbdDocument = (document: Api.GBD.Document) => {
1431
1495
  if (document) {
1432
- const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Object.keys(Enums.GBD.DocTypes)[Object.values(Enums.GBD.DocTypes).indexOf(document.type.code)]);
1496
+ const documentType = dataStore.documentTypes.find(
1497
+ (i: Value) => i.ids === Object.keys(CoreEnums.GBD.DocTypes)[Object.values(CoreEnums.GBD.DocTypes).indexOf(document.type.code)],
1498
+ );
1433
1499
  if (documentType) member.value.documentType = documentType;
1434
1500
  const documentNumber = document.number;
1435
1501
  if (documentNumber) member.value.documentNumber = documentNumber;
@@ -1446,21 +1512,46 @@ export default {
1446
1512
  isSearchOpen.value = false;
1447
1513
  };
1448
1514
 
1515
+ const getContragentClick = async (contragent: ContragentType) => {
1516
+ isButtonLoading.value = true;
1517
+ await dataStore.serializeContragentData(member.value, contragent);
1518
+ fioChooseDialog.value = false;
1519
+ isButtonLoading.value = false;
1520
+ dataStore.rightPanel.open = false;
1521
+ isSearchOpen.value = false;
1522
+ };
1523
+
1449
1524
  const getContragent = async () => {
1450
- if (member.value.hasAgreement !== true) {
1451
- dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
1452
- dataStore.rightPanel.open = false;
1453
- isSearchOpen.value = false;
1454
- return;
1455
- }
1456
- if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
1457
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
1458
- dataStore.rightPanel.open = false;
1459
- isSearchOpen.value = false;
1460
- return;
1525
+ if (isNonResident.value) {
1526
+ if (!member.value.lastName || !member.value.firstName) {
1527
+ dataStore.showToaster('error', 'Заполните поля Имя и Фамилия', 3000);
1528
+ dataStore.rightPanel.open = false;
1529
+ isSearchOpen.value = false;
1530
+ return;
1531
+ }
1532
+ } else {
1533
+ if (member.value.hasAgreement !== true) {
1534
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
1535
+ dataStore.rightPanel.open = false;
1536
+ isSearchOpen.value = false;
1537
+ return;
1538
+ }
1539
+ if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
1540
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
1541
+ dataStore.rightPanel.open = false;
1542
+ isSearchOpen.value = false;
1543
+ return;
1544
+ }
1461
1545
  }
1462
1546
  isButtonLoading.value = true;
1463
- await dataStore.getContragent(member.value, false);
1547
+ if (isNonResident.value) {
1548
+ const response = await dataStore.getContragent(member.value, false);
1549
+ if (response) contragents.value = response.items;
1550
+ else dataStore.showToaster('error', 'Не найдено совпадений', 3000);
1551
+ fioChooseDialog.value = true;
1552
+ } else {
1553
+ await dataStore.getContragent(member.value, false);
1554
+ }
1464
1555
  isButtonLoading.value = false;
1465
1556
  dataStore.rightPanel.open = false;
1466
1557
  isSearchOpen.value = false;
@@ -1496,10 +1587,11 @@ export default {
1496
1587
  }
1497
1588
  const isInsured = formStore.isPolicyholderInsured;
1498
1589
  const remoteIsInsured = ref<boolean | null>(null);
1590
+ const isNewApplication = route.params.taskId === '0';
1499
1591
  if (whichForm.value == formStore.policyholderFormKey || (dataStore.isPension && whichForm.value == formStore.insuredFormKey)) {
1500
1592
  if (route.params.taskId === '0') {
1501
1593
  try {
1502
- const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 4 : 19) : undefined);
1594
+ const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 25 : 19) : undefined);
1503
1595
  if (typeof taskId === 'string') {
1504
1596
  await dataStore.getApplicationData(taskId, false, false, false, false);
1505
1597
  remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
@@ -1523,6 +1615,13 @@ export default {
1523
1615
  if (fileData.value && fileData.value.file) {
1524
1616
  await uploadFile(formStore.applicationData.processInstanceId);
1525
1617
  }
1618
+ if (additionalDocuments.value && additionalDocuments.value.length) {
1619
+ if (
1620
+ (!formStore.applicationData.isEnpfSum && formStore.applicationData?.pensionApp.transferContracts && formStore.applicationData?.pensionApp.transferContracts.length) ||
1621
+ (formStore.applicationData?.pensionApp.compulsoryProfMonthCount && formStore.applicationData?.pensionApp.compulsoryProfMonthCount >= 60)
1622
+ )
1623
+ await uploadAdditionalFiles(formStore.applicationData.processInstanceId);
1624
+ }
1526
1625
  }
1527
1626
  const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value, whichIndex.value ? Number(whichIndex.value) : undefined);
1528
1627
  if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
@@ -1546,30 +1645,43 @@ export default {
1546
1645
  }
1547
1646
  }
1548
1647
  }
1549
- if (whichForm.value === formStore.insuredFormKey) {
1648
+ if (
1649
+ whichForm.value === formStore.insuredFormKey ||
1650
+ (memberFromApplicaiton &&
1651
+ memberFromApplicaiton.processInstanceId &&
1652
+ formStore.applicationData.slave &&
1653
+ memberFromApplicaiton.processInstanceId === formStore.applicationData.slave.processInstanceId)
1654
+ ) {
1550
1655
  wasInsuredAction.value = true;
1551
1656
  if (dataStore.isPension) {
1552
- formStore.applicationData.pensionApp = {
1657
+ let data = {
1553
1658
  ...formStore.applicationData.pensionApp,
1554
- account: member.value.bankInfo.iik,
1555
- bankBik: member.value.bankInfo.bik,
1556
- bankBin: member.value.bankInfo.bankName.ids,
1557
- bankId: member.value.bankInfo.bankName.id,
1558
- bankName: member.value.bankInfo.bankName.nameRu,
1559
- guaranteedPeriod: 0,
1560
- amount: 0,
1561
- compulsoryContractAmount: 0,
1562
- voluntaryContractAmount: 0,
1563
- ownFundsRaisAmount: 0,
1564
- compulsoryProfContractAmount: 0,
1659
+ slave: formStore.applicationData.slave?.pensionApp ?? undefined,
1565
1660
  };
1566
- const data = {
1567
- ...formStore.applicationData.pensionApp,
1568
- transferContractCompany: formStore.applicationData.pensionApp.transferContractCompany?.nameRu ?? null,
1661
+ const bankinfo = {
1662
+ account: member.value.bankInfo.iik ?? '',
1663
+ bankBik: member.value.bankInfo.bik ?? '',
1664
+ bankBin: member.value.bankInfo.bin ? String(member.value.bankInfo.bin).replaceAll('-', '') : '',
1665
+ bankId: Number(member.value.bankInfo.bankName.id) ?? 0,
1666
+ bankName: member.value.bankInfo.bankName.nameRu ?? '',
1569
1667
  };
1668
+ if (route.query.tab === 'slaveInsuredForm') {
1669
+ data.slave = { ...data.slave, ...bankinfo };
1670
+ } else {
1671
+ data = { ...data, ...bankinfo };
1672
+ }
1673
+ const pensionKeysWithSpace = ['compulsoryContractAmount', 'compulsoryProfContractAmount', 'voluntaryContractAmount', 'ownFundsRaisAmount'];
1674
+ pensionKeysWithSpace.forEach(key => {
1675
+ if (/\s/g.test(data[key]) === true) data[key] = formatSpacedNumber(data[key]);
1676
+ });
1677
+ if (data.slave)
1678
+ pensionKeysWithSpace.forEach(key => {
1679
+ if (/\s/g.test(data.slave[key]) === true) data.slave[key] = formatSpacedNumber(data.slave[key]);
1680
+ });
1570
1681
  const isApplicationSaved = await dataStore.setApplication(data);
1682
+ if (!isNewApplication) dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1571
1683
  if (isApplicationSaved === false) return;
1572
- dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1684
+ await dataStore.saveMember(member.value, 'Client', memberFromApplicaiton);
1573
1685
  }
1574
1686
  }
1575
1687
  await router.replace({
@@ -1608,6 +1720,7 @@ export default {
1608
1720
  }
1609
1721
  }
1610
1722
  if (member.value.hasAgreement !== true) {
1723
+ if (isNonResident.value) return true;
1611
1724
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
1612
1725
  return false;
1613
1726
  }
@@ -1622,8 +1735,12 @@ export default {
1622
1735
  isSubmittingForm.value = true;
1623
1736
  const docType = member.value.documentType.ids;
1624
1737
  if (
1738
+ !isNonResident.value &&
1625
1739
  member.value.gotFromInsis === true &&
1626
- (docType === Enums.Insis.DocTypes['1UDL'] || docType === Enums.Insis.DocTypes.SBI || docType === Enums.Insis.DocTypes.PS || docType === Enums.Insis.DocTypes.VNZ)
1740
+ (docType === CoreEnums.Insis.DocTypes['1UDL'] ||
1741
+ docType === CoreEnums.Insis.DocTypes.SBI ||
1742
+ docType === CoreEnums.Insis.DocTypes.PS ||
1743
+ docType === CoreEnums.Insis.DocTypes.VNZ)
1627
1744
  ) {
1628
1745
  dataStore.isLoading = true;
1629
1746
  const docTypeCodes = {
@@ -1653,11 +1770,11 @@ export default {
1653
1770
  isSubmittingForm.value = false;
1654
1771
  return;
1655
1772
  }
1656
- if (formStore.applicationData.pensionApp) {
1657
- formStore.applicationData.pensionApp.account = member.value.bankInfo.iik;
1658
- formStore.applicationData.pensionApp.bankBik = member.value.bankInfo.bik;
1659
- formStore.applicationData.pensionApp.bankBin = member.value.bankInfo.bin;
1660
- formStore.applicationData.pensionApp.bankId = member.value.bankInfo.bankName.id;
1773
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
1774
+ formStore.pensionApp.account = member.value.bankInfo.iik;
1775
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
1776
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
1777
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1661
1778
  }
1662
1779
  }
1663
1780
  const hasMemberSaved = await saveMember();
@@ -1665,6 +1782,23 @@ export default {
1665
1782
  dataStore.isLoading = false;
1666
1783
  dataStore.showToaster('error', errorMessage, 5000);
1667
1784
  }
1785
+ } else if (isNonResident.value) {
1786
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
1787
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1788
+ if (isValidIik === false) {
1789
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1790
+ member.value.bankInfo.iik = '';
1791
+ isSubmittingForm.value = false;
1792
+ return;
1793
+ }
1794
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
1795
+ formStore.pensionApp.account = member.value.bankInfo.iik;
1796
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
1797
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
1798
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1799
+ }
1800
+ }
1801
+ const hasMemberSaved = await saveMember();
1668
1802
  } else {
1669
1803
  member.value.gotFromInsis = true;
1670
1804
  const hasMemberSaved = await saveMember();
@@ -1818,14 +1952,21 @@ export default {
1818
1952
  }
1819
1953
  if (!member.value.id) {
1820
1954
  await router.replace({ query: { ...route.query, id: 0 } });
1955
+ if (dataStore.isPension) {
1956
+ switch (whichForm.value) {
1957
+ case formStore.insuredFormKey:
1958
+ setSignOfResidency();
1959
+ break;
1960
+ }
1961
+ }
1821
1962
  } else {
1822
1963
  if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1823
1964
  if (dataStore.isLifetrip) {
1824
1965
  const documentByPriority = (() => {
1825
1966
  if (whichForm.value !== formStore.policyholderFormKey || formStore.isPolicyholderInsured === true) {
1826
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes.PS);
1967
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes.PS);
1827
1968
  }
1828
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes['1UDL']);
1969
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes['1UDL']);
1829
1970
  })();
1830
1971
  const userDocument = documentByPriority ? documentByPriority : member.value.documentsList[0];
1831
1972
  const documentType = dataStore.documentTypes.find((i: Value) => i.ids === userDocument.type);
@@ -1836,12 +1977,10 @@ export default {
1836
1977
  member.value.documentDate = reformatDate(userDocument.issueDate);
1837
1978
  member.value.documentExpire = reformatDate(userDocument.expireDate);
1838
1979
  }
1839
-
1840
1980
  // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1841
1981
  // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1842
1982
  }
1843
1983
  await setDefaultValues();
1844
- if (Number(formStore.applicationData.processCode) === 4) dataStore.members.insuredApp.isMultiple = true;
1845
1984
  if (hasWorkPositionDict && member.value.positionCode === null) member.value.jobPosition = null;
1846
1985
  };
1847
1986
  onMounted(async () => {
@@ -1890,8 +2029,17 @@ export default {
1890
2029
  },
1891
2030
  );
1892
2031
 
2032
+ watch(
2033
+ () => member.value.registrationProvince,
2034
+ (val, oldVal) => {
2035
+ if (val.nameRu !== null && val.nameRu !== oldVal.nameRu && val.ids !== member.value.registrationCity.code) {
2036
+ member.value.registrationCity = new Value();
2037
+ }
2038
+ },
2039
+ );
2040
+
1893
2041
  const onIinInput = () => {
1894
- if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value.isMultiple === true) {
2042
+ if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value?.isMultiple === true) {
1895
2043
  const alreadyInStatement = formStore[whichForm.value as MultipleMember].findIndex((i: Member) => i.iin === member.value.iin);
1896
2044
  if (alreadyInStatement !== -1 && alreadyInStatement !== Number(whichIndex.value)) {
1897
2045
  dataStore.showToaster('error', dataStore.t('toaster.hasAlreadyMember'), 3000);
@@ -1932,13 +2080,14 @@ export default {
1932
2080
  watch(
1933
2081
  () => member.value.age,
1934
2082
  val => {
1935
- if (val && Number(val) >= 18) {
1936
- if (member.value.hasAgreement !== true) {
2083
+ if (val) {
2084
+ if (Number(val) >= 18 && member.value.hasAgreement !== true) {
1937
2085
  member.value.hasAgreement = false;
2086
+ } else {
2087
+ member.value.hasAgreement = true;
1938
2088
  }
1939
- } else {
1940
- member.value.hasAgreement = true;
1941
2089
  }
2090
+
1942
2091
  member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1943
2092
  },
1944
2093
  { immediate: true },
@@ -1954,15 +2103,35 @@ export default {
1954
2103
  );
1955
2104
  }
1956
2105
  if (dataStore.isPension) {
1957
- watch(
1958
- () => member.value.bankInfo.bankName,
1959
- val => {
1960
- if (val) {
1961
- member.value.bankInfo.bik = val.code as string;
1962
- member.value.bankInfo.bin = reformatIin(val.ids as string);
1963
- }
1964
- },
1965
- );
2106
+ if (member.value.bankInfo) {
2107
+ watch(
2108
+ () => member.value.bankInfo.iik,
2109
+ async val => {
2110
+ if (val && val.length === 20) {
2111
+ if (
2112
+ route.query.tab === 'slaveInsuredForm'
2113
+ ? formStore.insuredForm.some(i => i.bankInfo.iik === val)
2114
+ : formStore.applicationData.processCode === 25 && val === formStore.slaveInsuredForm.bankInfo.iik
2115
+ ) {
2116
+ dataStore.showToaster('error', `ИИК: "${val}" уже имеется в заявке`);
2117
+ member.value.bankInfo = new BankInfoClass();
2118
+ return;
2119
+ }
2120
+ isButtonLoading.value = true;
2121
+ const bank = await dataStore.getBankByAccountNumber(val);
2122
+ if (bank) {
2123
+ member.value.bankInfo.bik = String(bank.code);
2124
+ member.value.bankInfo.bin = member.value.bankInfo.bankName.ids = reformatIin(String(bank.ids));
2125
+ member.value.bankInfo.bankName.nameRu = String(bank.nameRu);
2126
+ member.value.bankInfo.bankName.id = Number(bank.id);
2127
+ } else member.value.bankInfo = new BankInfoClass();
2128
+ isButtonLoading.value = false;
2129
+ } else if (!val) {
2130
+ member.value.bankInfo = new BankInfoClass();
2131
+ }
2132
+ },
2133
+ );
2134
+ }
1966
2135
  watch(
1967
2136
  () => member.value.isDisability,
1968
2137
  val => {
@@ -1999,11 +2168,13 @@ export default {
1999
2168
  familyDialog,
2000
2169
  deletionDialog,
2001
2170
  documentChooseDialog,
2171
+ fioChooseDialog,
2002
2172
  selectedIndex,
2003
2173
  selectedFamilyMember,
2004
2174
  sameAddress,
2005
2175
  isRelative,
2006
2176
  imageDataList,
2177
+ contragents,
2007
2178
  // Computed
2008
2179
  whichForm,
2009
2180
  whichIndex,
@@ -2013,7 +2184,6 @@ export default {
2013
2184
  isDisabled,
2014
2185
  isTask,
2015
2186
  isIinPhoneDisabled,
2016
- isFromGBD,
2017
2187
  showSaveButton,
2018
2188
  hasGBDFL,
2019
2189
  hasInsis,
@@ -2025,10 +2195,13 @@ export default {
2025
2195
  hasInsurancePay,
2026
2196
  hasSignOfIPDL,
2027
2197
  hasSameAddressToggle,
2198
+ hasIssuerOther,
2028
2199
  hasMemberSearch,
2029
2200
  hasWorkPositionDict,
2030
2201
  gbdDocuments,
2031
2202
  hasGBDFLDocSelection,
2203
+ isNonResident,
2204
+ isDataFromGov,
2032
2205
 
2033
2206
  // Rules
2034
2207
  ageRule,
@@ -2062,6 +2235,7 @@ export default {
2062
2235
  searchPositions,
2063
2236
  selectGbdDocument,
2064
2237
  pickPosition,
2238
+ getContragentClick,
2065
2239
  };
2066
2240
  },
2067
2241
  };