hl-core 0.0.10-beta.5 → 0.0.10-beta.50

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 (41) hide show
  1. package/README.md +0 -2
  2. package/api/base.api.ts +327 -137
  3. package/api/interceptors.ts +3 -5
  4. package/components/Dialog/Dialog.vue +5 -1
  5. package/components/Form/DigitalDocument.vue +52 -0
  6. package/components/Form/FormSource.vue +30 -0
  7. package/components/Form/ManagerAttachment.vue +60 -11
  8. package/components/Form/ProductConditionsBlock.vue +12 -6
  9. package/components/Input/Datepicker.vue +5 -0
  10. package/components/Input/FileInput.vue +1 -1
  11. package/components/Input/FormInput.vue +5 -0
  12. package/components/Input/OtpInput.vue +25 -0
  13. package/components/Input/RoundedInput.vue +2 -0
  14. package/components/Input/RoundedSelect.vue +2 -0
  15. package/components/Input/TextAreaField.vue +71 -0
  16. package/components/Menu/MenuNav.vue +1 -1
  17. package/components/Pages/Anketa.vue +207 -176
  18. package/components/Pages/ContragentForm.vue +1 -1
  19. package/components/Pages/Documents.vue +436 -64
  20. package/components/Pages/MemberForm.vue +343 -170
  21. package/components/Pages/ProductConditions.vue +895 -241
  22. package/components/Panel/PanelHandler.vue +282 -124
  23. package/components/Utilities/Chip.vue +1 -1
  24. package/components/Utilities/JsonViewer.vue +1 -2
  25. package/composables/classes.ts +121 -20
  26. package/composables/constants.ts +45 -1
  27. package/composables/index.ts +333 -8
  28. package/composables/styles.ts +8 -24
  29. package/configs/pwa.ts +1 -7
  30. package/layouts/clear.vue +1 -1
  31. package/layouts/default.vue +1 -1
  32. package/layouts/full.vue +1 -1
  33. package/locales/ru.json +82 -19
  34. package/nuxt.config.ts +10 -12
  35. package/package.json +12 -12
  36. package/plugins/head.ts +7 -1
  37. package/store/data.store.ts +867 -525
  38. package/store/member.store.ts +17 -6
  39. package/store/rules.ts +23 -3
  40. package/types/enum.ts +40 -2
  41. package/types/index.ts +110 -56
@@ -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"
@@ -331,10 +339,10 @@
331
339
  v-if="hasWorkPositionDict"
332
340
  v-model.trim="member.jobPosition"
333
341
  :label="$dataStore.t('form.jobPosition')"
334
- :readonly="isDisabled || member.positionCode !== 'other'"
335
342
  :clearable="!isDisabled"
336
343
  :rules="$rules.required"
337
344
  append-inner-icon="mdi-chevron-right"
345
+ readonly
338
346
  @click="openCustomPanel('workPosition')"
339
347
  />
340
348
  <base-form-input
@@ -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"
@@ -696,24 +702,22 @@
696
702
  </Teleport>
697
703
  <Teleport v-if="isDocumentOpen" to="#right-panel-actions">
698
704
  <div :class="[$styles.flexColNav]">
699
- <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getFile('view')" />
700
- <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getFile('download')" />
705
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getDoc('view')" />
706
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getDoc('download')" />
701
707
  </div>
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>
@@ -745,7 +749,7 @@
745
749
  />
746
750
  </div>
747
751
  <div v-if="searchQuery && positionsList !== null && !positionsList.length && isPanelLoading === false" class="w-full flex flex-col items-center gap-2 px-2">
748
- <base-btn :text="$dataStore.t('buttons.add')" @click="pickPosition({ workPositionName: searchQuery, workPositionCode: 'other' })" />
752
+ <!-- <base-btn :text="$dataStore.t('buttons.add')" @click="pickPosition({ workPositionName: searchQuery, workPositionCode: 'other' })" /> -->
749
753
  <span :class="[$styles.mutedText]">{{ $dataStore.t('toaster.notFound') }}</span>
750
754
  </div>
751
755
  </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,8 +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';
794
- import type { Api, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
818
+ import { StoreMembers, CoreEnums } from '../../types/enum';
819
+ import type { Api, ContragentType, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
795
820
 
796
821
  export default {
797
822
  setup() {
@@ -803,7 +828,8 @@ export default {
803
828
  const memberStore = useMemberStore();
804
829
  const whichForm = computed(() => route.query.tab as keyof typeof StoreMembers);
805
830
  const whichIndex = computed(() => route.query.i as string);
806
- 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))!;
807
833
  const member = ref(getMember(whichForm.value, whichIndex.value));
808
834
  const selectedFamilyMember = ref<Api.GKB.BirthInfo>({});
809
835
  const isPanelOpen = ref<boolean>(false);
@@ -818,9 +844,12 @@ export default {
818
844
  const isPositionPanelOpen = ref<boolean>(false);
819
845
  const isPanelLoading = ref<boolean>(false);
820
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);
821
849
  const familyDialog = ref<boolean>(false);
822
850
  const deletionDialog = ref<boolean>(false);
823
851
  const documentChooseDialog = ref<boolean>(false);
852
+ const fioChooseDialog = ref<boolean>(false);
824
853
  const selectedIndex = ref<number>(0);
825
854
  const sameAddress = ref<boolean>(false);
826
855
  const panelValue = ref<Value>(new Value());
@@ -831,6 +860,8 @@ export default {
831
860
  const fileData = ref<{ file: any }>();
832
861
  const imageDataList = ref<string[]>([]);
833
862
  const isRelative = ref<boolean>(false);
863
+ const additionalDocuments = ref<any[]>([]);
864
+ const contragents = ref<ContragentType[]>([]);
834
865
 
835
866
  const currentPanelDeep = ref<string>();
836
867
  const currentPanelSubDeep = ref<string>();
@@ -840,7 +871,6 @@ export default {
840
871
  const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value));
841
872
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
842
873
  const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
843
- const isFromGBD = computed(() => !!member.value.gosPersonData);
844
874
  const gbdDocuments = computed(() => {
845
875
  if (hasGBDFLDocSelection && !!member.value.gosPersonData && !!member.value.gosPersonData.documents) {
846
876
  const documents = Array.isArray(member.value.gosPersonData.documents.document)
@@ -866,6 +896,7 @@ export default {
866
896
  case formStore.policyholdersRepresentativeFormKey:
867
897
  return route.params.taskId !== '0';
868
898
  default:
899
+ if (route.query.tab === 'slaveInsuredForm') return true;
869
900
  return false;
870
901
  }
871
902
  };
@@ -902,7 +933,7 @@ export default {
902
933
  };
903
934
  return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
904
935
  });
905
- const hasGBDFLDocSelection = dataStore.isLifetrip && whichForm.value === formStore.policyholderFormKey;
936
+ const hasGBDFLDocSelection = dataStore.isLifetrip;
906
937
  const hasInsis = computed(() => dataStore.controls.hasInsis);
907
938
  const hasGKB = computed(() => {
908
939
  const perMemberCondition = () => {
@@ -973,7 +1004,8 @@ export default {
973
1004
  (whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin) ||
974
1005
  (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage),
975
1006
  );
976
- 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 === 'Другое');
977
1009
 
978
1010
  const birthDateRule = computed(() => {
979
1011
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
@@ -1048,16 +1080,18 @@ export default {
1048
1080
  });
1049
1081
 
1050
1082
  const getOtpConditionByMember = () => {
1051
- switch (whichForm.value) {
1083
+ const which = whichForm.value as keyof typeof StoreMembers | 'slaveInsuredForm';
1084
+ switch (which) {
1052
1085
  case formStore.policyholderFormKey:
1053
1086
  return route.params.taskId === '0';
1054
1087
  case formStore.insuredFormKey:
1055
- if (dataStore.isPension) return route.params.taskId === '0';
1056
- return route.query.id === '0';
1088
+ case 'slaveInsuredForm':
1057
1089
  case formStore.policyholdersRepresentativeFormKey:
1058
1090
  case formStore.beneficiaryFormKey:
1059
1091
  case formStore.beneficialOwnerFormKey:
1060
1092
  return route.query.id === '0';
1093
+ default:
1094
+ return dataStore.isPension && route.query.id === '0' && formStore.applicationData.processCode === 24;
1061
1095
  }
1062
1096
  };
1063
1097
  const otpCondition = computed(() => {
@@ -1066,6 +1100,7 @@ export default {
1066
1100
  if (whichForm.value === formStore.beneficiaryFormKey && member.value.age !== null && Number(member.value.age) < 18) return false;
1067
1101
  if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) return false;
1068
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;
1069
1104
  return getOtpConditionByMember();
1070
1105
  });
1071
1106
 
@@ -1085,6 +1120,10 @@ export default {
1085
1120
  };
1086
1121
 
1087
1122
  const searchPositions = async () => {
1123
+ if (searchQuery.value.length < 4) {
1124
+ dataStore.showToaster('error', dataStore.t('rules.searchQueryLen', { len: 4 }));
1125
+ return;
1126
+ }
1088
1127
  if (!isDisabled.value) {
1089
1128
  isPanelLoading.value = true;
1090
1129
  positionsList.value = await dataStore.getWorkPosition(searchQuery.value);
@@ -1123,6 +1162,7 @@ export default {
1123
1162
  isPositionPanelOpen.value = false;
1124
1163
  }
1125
1164
  if (type === 'workPosition') {
1165
+ dataStore.rightPanel.title = dataStore.t('form.jobPosition');
1126
1166
  isPositionPanelOpen.value = true;
1127
1167
  isOtpPanelOpen.value = false;
1128
1168
  isDocumentOpen.value = false;
@@ -1252,12 +1292,35 @@ export default {
1252
1292
  }
1253
1293
  };
1254
1294
 
1255
- 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) => {
1256
1319
  if (event.target) {
1257
- fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
1320
+ fileData.value = { file: (event.target as HTMLInputElement).files };
1258
1321
  } else {
1259
1322
  if (event.dataTransfer) {
1260
- fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
1323
+ fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1261
1324
  }
1262
1325
  }
1263
1326
  };
@@ -1326,7 +1389,7 @@ export default {
1326
1389
  if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1327
1390
  if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1328
1391
  if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1329
- 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']);
1330
1393
  if (documentType) member.value.documentType = documentType;
1331
1394
  }
1332
1395
  if (!!parsedDocument.documentIssuer) {
@@ -1351,11 +1414,11 @@ export default {
1351
1414
  }
1352
1415
  };
1353
1416
 
1354
- const getFile = async (type: FileActions) => {
1417
+ const getDoc = async (type: FileActions) => {
1355
1418
  if (memberDocument.value) {
1356
1419
  documentLoading.value = true;
1357
1420
  const fileExtension = memberDocument.value.fileName!.match(/\.([0-9a-z]+)(?:[\?#]|$)/i)![1];
1358
- await dataStore.getFile(memberDocument.value, type, fileExtension);
1421
+ await dataStore.getDoc(memberDocument.value, type, fileExtension);
1359
1422
  documentLoading.value = false;
1360
1423
  }
1361
1424
  };
@@ -1430,7 +1493,9 @@ export default {
1430
1493
 
1431
1494
  const selectGbdDocument = (document: Api.GBD.Document) => {
1432
1495
  if (document) {
1433
- 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
+ );
1434
1499
  if (documentType) member.value.documentType = documentType;
1435
1500
  const documentNumber = document.number;
1436
1501
  if (documentNumber) member.value.documentNumber = documentNumber;
@@ -1447,21 +1512,46 @@ export default {
1447
1512
  isSearchOpen.value = false;
1448
1513
  };
1449
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
+
1450
1524
  const getContragent = async () => {
1451
- if (member.value.hasAgreement !== true) {
1452
- dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
1453
- dataStore.rightPanel.open = false;
1454
- isSearchOpen.value = false;
1455
- return;
1456
- }
1457
- if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
1458
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
1459
- dataStore.rightPanel.open = false;
1460
- isSearchOpen.value = false;
1461
- 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
+ }
1462
1545
  }
1463
1546
  isButtonLoading.value = true;
1464
- 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
+ }
1465
1555
  isButtonLoading.value = false;
1466
1556
  dataStore.rightPanel.open = false;
1467
1557
  isSearchOpen.value = false;
@@ -1497,10 +1587,11 @@ export default {
1497
1587
  }
1498
1588
  const isInsured = formStore.isPolicyholderInsured;
1499
1589
  const remoteIsInsured = ref<boolean | null>(null);
1590
+ const isNewApplication = route.params.taskId === '0';
1500
1591
  if (whichForm.value == formStore.policyholderFormKey || (dataStore.isPension && whichForm.value == formStore.insuredFormKey)) {
1501
1592
  if (route.params.taskId === '0') {
1502
1593
  try {
1503
- 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);
1504
1595
  if (typeof taskId === 'string') {
1505
1596
  await dataStore.getApplicationData(taskId, false, false, false, false);
1506
1597
  remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
@@ -1524,6 +1615,13 @@ export default {
1524
1615
  if (fileData.value && fileData.value.file) {
1525
1616
  await uploadFile(formStore.applicationData.processInstanceId);
1526
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
+ }
1527
1625
  }
1528
1626
  const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value, whichIndex.value ? Number(whichIndex.value) : undefined);
1529
1627
  if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
@@ -1547,30 +1645,43 @@ export default {
1547
1645
  }
1548
1646
  }
1549
1647
  }
1550
- 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
+ ) {
1551
1655
  wasInsuredAction.value = true;
1552
1656
  if (dataStore.isPension) {
1553
- formStore.applicationData.pensionApp = {
1657
+ let data = {
1554
1658
  ...formStore.applicationData.pensionApp,
1555
- account: member.value.bankInfo.iik,
1556
- bankBik: member.value.bankInfo.bik,
1557
- bankBin: member.value.bankInfo.bankName.ids,
1558
- bankId: member.value.bankInfo.bankName.id,
1559
- bankName: member.value.bankInfo.bankName.nameRu,
1560
- guaranteedPeriod: 0,
1561
- amount: 0,
1562
- compulsoryContractAmount: 0,
1563
- voluntaryContractAmount: 0,
1564
- ownFundsRaisAmount: 0,
1565
- compulsoryProfContractAmount: 0,
1659
+ slave: formStore.applicationData.slave?.pensionApp ?? undefined,
1566
1660
  };
1567
- const data = {
1568
- ...formStore.applicationData.pensionApp,
1569
- 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 ?? '',
1570
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
+ });
1571
1681
  const isApplicationSaved = await dataStore.setApplication(data);
1682
+ if (!isNewApplication) dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1572
1683
  if (isApplicationSaved === false) return;
1573
- dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1684
+ await dataStore.saveMember(member.value, 'Client', memberFromApplicaiton);
1574
1685
  }
1575
1686
  }
1576
1687
  await router.replace({
@@ -1609,6 +1720,7 @@ export default {
1609
1720
  }
1610
1721
  }
1611
1722
  if (member.value.hasAgreement !== true) {
1723
+ if (isNonResident.value) return true;
1612
1724
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
1613
1725
  return false;
1614
1726
  }
@@ -1623,13 +1735,17 @@ export default {
1623
1735
  isSubmittingForm.value = true;
1624
1736
  const docType = member.value.documentType.ids;
1625
1737
  if (
1738
+ !isNonResident.value &&
1626
1739
  member.value.gotFromInsis === true &&
1627
- (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)
1628
1744
  ) {
1629
1745
  dataStore.isLoading = true;
1630
1746
  const docTypeCodes = {
1631
1747
  '1UDL': 1,
1632
- PS: 2,
1748
+ PS: 11,
1633
1749
  SBI: 3,
1634
1750
  VNZ: 4,
1635
1751
  };
@@ -1654,11 +1770,11 @@ export default {
1654
1770
  isSubmittingForm.value = false;
1655
1771
  return;
1656
1772
  }
1657
- if (formStore.applicationData.pensionApp) {
1658
- formStore.applicationData.pensionApp.account = member.value.bankInfo.iik;
1659
- formStore.applicationData.pensionApp.bankBik = member.value.bankInfo.bik;
1660
- formStore.applicationData.pensionApp.bankBin = member.value.bankInfo.bin;
1661
- 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);
1662
1778
  }
1663
1779
  }
1664
1780
  const hasMemberSaved = await saveMember();
@@ -1666,6 +1782,23 @@ export default {
1666
1782
  dataStore.isLoading = false;
1667
1783
  dataStore.showToaster('error', errorMessage, 5000);
1668
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();
1669
1802
  } else {
1670
1803
  member.value.gotFromInsis = true;
1671
1804
  const hasMemberSaved = await saveMember();
@@ -1819,14 +1952,21 @@ export default {
1819
1952
  }
1820
1953
  if (!member.value.id) {
1821
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
+ }
1822
1962
  } else {
1823
1963
  if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1824
1964
  if (dataStore.isLifetrip) {
1825
1965
  const documentByPriority = (() => {
1826
1966
  if (whichForm.value !== formStore.policyholderFormKey || formStore.isPolicyholderInsured === true) {
1827
- 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);
1828
1968
  }
1829
- 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']);
1830
1970
  })();
1831
1971
  const userDocument = documentByPriority ? documentByPriority : member.value.documentsList[0];
1832
1972
  const documentType = dataStore.documentTypes.find((i: Value) => i.ids === userDocument.type);
@@ -1837,12 +1977,10 @@ export default {
1837
1977
  member.value.documentDate = reformatDate(userDocument.issueDate);
1838
1978
  member.value.documentExpire = reformatDate(userDocument.expireDate);
1839
1979
  }
1840
-
1841
- // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1980
+ // const filteredDocuments: DocumentItem[] = dataStore.getDocsByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1842
1981
  // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1843
1982
  }
1844
1983
  await setDefaultValues();
1845
- if (Number(formStore.applicationData.processCode) === 4) dataStore.members.insuredApp.isMultiple = true;
1846
1984
  if (hasWorkPositionDict && member.value.positionCode === null) member.value.jobPosition = null;
1847
1985
  };
1848
1986
  onMounted(async () => {
@@ -1891,8 +2029,17 @@ export default {
1891
2029
  },
1892
2030
  );
1893
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
+
1894
2041
  const onIinInput = () => {
1895
- 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) {
1896
2043
  const alreadyInStatement = formStore[whichForm.value as MultipleMember].findIndex((i: Member) => i.iin === member.value.iin);
1897
2044
  if (alreadyInStatement !== -1 && alreadyInStatement !== Number(whichIndex.value)) {
1898
2045
  dataStore.showToaster('error', dataStore.t('toaster.hasAlreadyMember'), 3000);
@@ -1933,13 +2080,14 @@ export default {
1933
2080
  watch(
1934
2081
  () => member.value.age,
1935
2082
  val => {
1936
- if (val && Number(val) >= 18) {
1937
- if (member.value.hasAgreement !== true) {
2083
+ if (val) {
2084
+ if (Number(val) >= 18 && member.value.hasAgreement !== true) {
1938
2085
  member.value.hasAgreement = false;
2086
+ } else {
2087
+ member.value.hasAgreement = true;
1939
2088
  }
1940
- } else {
1941
- member.value.hasAgreement = true;
1942
2089
  }
2090
+
1943
2091
  member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1944
2092
  },
1945
2093
  { immediate: true },
@@ -1955,15 +2103,35 @@ export default {
1955
2103
  );
1956
2104
  }
1957
2105
  if (dataStore.isPension) {
1958
- watch(
1959
- () => member.value.bankInfo.bankName,
1960
- val => {
1961
- if (val) {
1962
- member.value.bankInfo.bik = val.code as string;
1963
- member.value.bankInfo.bin = reformatIin(val.ids as string);
1964
- }
1965
- },
1966
- );
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
+ }
1967
2135
  watch(
1968
2136
  () => member.value.isDisability,
1969
2137
  val => {
@@ -2000,11 +2168,13 @@ export default {
2000
2168
  familyDialog,
2001
2169
  deletionDialog,
2002
2170
  documentChooseDialog,
2171
+ fioChooseDialog,
2003
2172
  selectedIndex,
2004
2173
  selectedFamilyMember,
2005
2174
  sameAddress,
2006
2175
  isRelative,
2007
2176
  imageDataList,
2177
+ contragents,
2008
2178
  // Computed
2009
2179
  whichForm,
2010
2180
  whichIndex,
@@ -2014,7 +2184,6 @@ export default {
2014
2184
  isDisabled,
2015
2185
  isTask,
2016
2186
  isIinPhoneDisabled,
2017
- isFromGBD,
2018
2187
  showSaveButton,
2019
2188
  hasGBDFL,
2020
2189
  hasInsis,
@@ -2026,10 +2195,13 @@ export default {
2026
2195
  hasInsurancePay,
2027
2196
  hasSignOfIPDL,
2028
2197
  hasSameAddressToggle,
2198
+ hasIssuerOther,
2029
2199
  hasMemberSearch,
2030
2200
  hasWorkPositionDict,
2031
2201
  gbdDocuments,
2032
2202
  hasGBDFLDocSelection,
2203
+ isNonResident,
2204
+ isDataFromGov,
2033
2205
 
2034
2206
  // Rules
2035
2207
  ageRule,
@@ -2051,7 +2223,7 @@ export default {
2051
2223
  attachFile,
2052
2224
  attachDocumentReader,
2053
2225
  getDocumentReader,
2054
- getFile,
2226
+ getDoc,
2055
2227
  selectFamilyMember,
2056
2228
  closeFamilyDialog,
2057
2229
  openDeletionDialog,
@@ -2063,6 +2235,7 @@ export default {
2063
2235
  searchPositions,
2064
2236
  selectGbdDocument,
2065
2237
  pickPosition,
2238
+ getContragentClick,
2066
2239
  };
2067
2240
  },
2068
2241
  };