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

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 (42) hide show
  1. package/README.md +0 -2
  2. package/api/base.api.ts +345 -137
  3. package/api/interceptors.ts +3 -5
  4. package/components/Dialog/Dialog.vue +5 -1
  5. package/components/Dialog/FamilyDialog.vue +15 -4
  6. package/components/Form/DigitalDocument.vue +52 -0
  7. package/components/Form/FormSource.vue +30 -0
  8. package/components/Form/ManagerAttachment.vue +60 -11
  9. package/components/Form/ProductConditionsBlock.vue +12 -6
  10. package/components/Input/Datepicker.vue +5 -0
  11. package/components/Input/FileInput.vue +1 -1
  12. package/components/Input/FormInput.vue +5 -0
  13. package/components/Input/OtpInput.vue +25 -0
  14. package/components/Input/RoundedInput.vue +2 -0
  15. package/components/Input/RoundedSelect.vue +2 -0
  16. package/components/Input/TextAreaField.vue +71 -0
  17. package/components/Menu/MenuNav.vue +1 -1
  18. package/components/Pages/Anketa.vue +207 -176
  19. package/components/Pages/ContragentForm.vue +1 -1
  20. package/components/Pages/Documents.vue +452 -64
  21. package/components/Pages/MemberForm.vue +416 -180
  22. package/components/Pages/ProductConditions.vue +1021 -243
  23. package/components/Panel/PanelHandler.vue +297 -124
  24. package/components/Utilities/Chip.vue +1 -1
  25. package/components/Utilities/JsonViewer.vue +1 -2
  26. package/composables/classes.ts +124 -20
  27. package/composables/constants.ts +46 -1
  28. package/composables/index.ts +336 -8
  29. package/composables/styles.ts +8 -24
  30. package/configs/pwa.ts +1 -7
  31. package/layouts/clear.vue +1 -1
  32. package/layouts/default.vue +1 -1
  33. package/layouts/full.vue +1 -1
  34. package/locales/ru.json +90 -19
  35. package/nuxt.config.ts +10 -12
  36. package/package.json +12 -12
  37. package/plugins/head.ts +7 -1
  38. package/store/data.store.ts +966 -575
  39. package/store/member.store.ts +17 -6
  40. package/store/rules.ts +23 -3
  41. package/types/enum.ts +42 -2
  42. package/types/index.ts +111 -56
@@ -64,55 +64,70 @@
64
64
  :title="$dataStore.t('isInsuredUnderage')"
65
65
  :has-border="false"
66
66
  />
67
+ <base-panel-input
68
+ v-if="whichForm === formStore.beneficiaryFormKey && $dataStore.isGons"
69
+ v-model="member.chooseChild"
70
+ :value="member.chooseChild"
71
+ :label="$dataStore.t('form.chooseChild')"
72
+ :readonly="isDisabled"
73
+ :clearable="!isDisabled"
74
+ append-inner-icon="mdi mdi-chevron-right"
75
+ @append="searchMember($dataStore.t('form.chooseChild'))"
76
+ />
67
77
  <base-form-input
68
78
  v-model="member.phoneNumber"
69
79
  :label="$dataStore.t('form.phoneNumber')"
70
80
  :maska="$maska.phone"
71
- :readonly="!!isDisabled || !!isIinPhoneDisabled"
72
- :clearable="!isDisabled"
81
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!isDataFromGov"
82
+ :clearable="!isDisabled && !isIinPhoneDisabled && !isDataFromGov"
73
83
  :append-inner-icon="otpCondition ? `${$dataStore.isPension ? 'mdi-message-text' : 'mdi mdi-phone-message'}` : ''"
74
84
  @append="openCustomPanel('otp')"
75
85
  @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
76
86
  :rules="phoneRule"
77
87
  />
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
- />
88
+ <base-animation>
89
+ <base-form-input
90
+ v-if="!isNonResident"
91
+ v-model="member.iin"
92
+ :label="$dataStore.t('form.iin')"
93
+ :maska="$maska.iin"
94
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin || !!isDataFromGov"
95
+ :clearable="!isDisabled && !isIinPhoneDisabled && !member.parsedDocument?.iin && !isDataFromGov"
96
+ :append-inner-icon="hasMemberSearch || !isNonResident ? (hasDocumentReader ? 'mdi mdi-credit-card-scan-outline' : 'mdi mdi-magnify') : ''"
97
+ @append="searchMember"
98
+ @input="onIinInput"
99
+ :rules="isNonResident ? [] : $rules.required.concat($rules.iinRight)"
100
+ />
101
+ </base-animation>
89
102
  <base-form-input
90
103
  v-model.trim="member.lastName"
91
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.lastName"
92
- :clearable="!isDisabled"
104
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.lastName"
105
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.lastName"
93
106
  :label="$dataStore.t('form.lastName')"
94
107
  :rules="$rules.required.concat($rules.cyrillic)"
95
108
  />
96
109
  <base-form-input
97
110
  v-model.trim="member.firstName"
98
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.firstName"
99
- :clearable="!isDisabled"
111
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.firstName"
112
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.firstName"
100
113
  :label="$dataStore.t('form.firstName')"
101
114
  :rules="$rules.required.concat($rules.cyrillic)"
115
+ :append-inner-icon="isNonResident ? 'mdi mdi-magnify' : ''"
116
+ @append="searchMember"
102
117
  />
103
118
  <base-form-input
104
119
  v-if="hasMiddleName"
105
120
  v-model.trim="member.middleName"
106
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.middleName"
107
- :clearable="!isDisabled"
121
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.middleName"
122
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.middleName"
108
123
  :label="$dataStore.t('form.middleName')"
109
124
  :rules="$rules.cyrillicNonRequired"
110
125
  />
111
126
  <base-form-input
112
127
  v-if="$dataStore.isLifetrip"
113
128
  v-model.trim="member.lastNameLat"
114
- :readonly="isDisabled || isFromGBD"
115
- :clearable="!isDisabled"
129
+ :readonly="isDisabled || isDataFromGov"
130
+ :clearable="!isDisabled && !isDataFromGov"
116
131
  :label="$dataStore.t('form.lastNameLat')"
117
132
  :rules="$rules.required.concat($rules.latin)"
118
133
  :hint="$dataStore.t('labels.checkWithDoc')"
@@ -120,16 +135,16 @@
120
135
  <base-form-input
121
136
  v-if="$dataStore.isLifetrip"
122
137
  v-model.trim="member.firstNameLat"
123
- :readonly="isDisabled || isFromGBD"
124
- :clearable="!isDisabled"
138
+ :readonly="isDisabled || isDataFromGov"
139
+ :clearable="!isDisabled && !isDataFromGov"
125
140
  :label="$dataStore.t('form.firstNameLat')"
126
141
  :rules="$rules.required.concat($rules.latin)"
127
142
  :hint="$dataStore.t('labels.checkWithDoc')"
128
143
  />
129
144
  <base-form-input
130
145
  v-model="member.birthDate"
131
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.birthDate"
132
- :clearable="!isDisabled"
146
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.birthDate"
147
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.birthDate"
133
148
  :label="$dataStore.t('form.birthDate')"
134
149
  :rules="birthDateRule"
135
150
  :maska="$maska.date"
@@ -161,8 +176,8 @@
161
176
  <base-panel-input
162
177
  v-model="member.gender"
163
178
  :value="member.gender?.nameRu"
164
- :readonly="isDisabled || isFromGBD"
165
- :clearable="!isDisabled && !isFromGBD"
179
+ :readonly="isDisabled || isDataFromGov || !isChooseChild"
180
+ :clearable="(!isDisabled && !isDataFromGov) || !!isChooseChild"
166
181
  :label="$dataStore.t('form.gender')"
167
182
  :rules="$rules.objectRequired"
168
183
  append-inner-icon="mdi mdi-chevron-right"
@@ -183,12 +198,12 @@
183
198
  v-if="hasRelationDegree"
184
199
  v-model="member.relationDegree"
185
200
  :value="member.relationDegree?.nameRu"
186
- :readonly="isDisabled"
187
- :clearable="!isDisabled"
201
+ :readonly="isDisabled || !isChooseChild"
202
+ :clearable="!isDisabled || !!isChooseChild"
188
203
  :label="$dataStore.t('form.relations')"
189
204
  :rules="$rules.objectRequired"
190
205
  append-inner-icon="mdi mdi-chevron-right"
191
- @append="openPanel($dataStore.t('form.relations'), [], 'relationDegree', $dataStore.getRelationTypes)"
206
+ @append="openPanel($dataStore.t('form.relations'), filteredRelationsData, 'relationDegree')"
192
207
  />
193
208
  <base-form-input
194
209
  v-if="whichForm === formStore.beneficiaryFormKey"
@@ -199,8 +214,11 @@
199
214
  :rules="$rules.required.concat($rules.numbers)"
200
215
  />
201
216
  </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" />
217
+ <base-form-section
218
+ v-if="$dataStore.isPension && (whichForm === formStore.insuredFormKey || $route.query.tab === 'slaveInsuredForm')"
219
+ :title="$dataStore.t('pension.disabilityInfo')"
220
+ >
221
+ <base-form-toggle v-model="member.isDisability" :title="$dataStore.t('pension.ifHasDisabilityAlways')" :disabled="isDisabled" :has-border="false" />
204
222
  <base-animation>
205
223
  <base-panel-input
206
224
  v-if="member.isDisability"
@@ -331,10 +349,10 @@
331
349
  v-if="hasWorkPositionDict"
332
350
  v-model.trim="member.jobPosition"
333
351
  :label="$dataStore.t('form.jobPosition')"
334
- :readonly="isDisabled || member.positionCode !== 'other'"
335
352
  :clearable="!isDisabled"
336
353
  :rules="$rules.required"
337
354
  append-inner-icon="mdi-chevron-right"
355
+ readonly
338
356
  @click="openCustomPanel('workPosition')"
339
357
  />
340
358
  <base-form-input
@@ -347,7 +365,7 @@
347
365
  />
348
366
  <base-form-input v-model.trim="member.jobPlace" :label="$dataStore.t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
349
367
  </base-form-section>
350
- <base-form-section :title="$dataStore.t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
368
+ <base-form-section :title="$dataStore.t('form.placeRegistration')">
351
369
  <base-form-toggle v-if="hasSameAddressToggle" v-model="sameAddress" :disabled="isDisabled" :has-border="false" :title="$dataStore.t('form.sameAddress')" />
352
370
  <base-panel-input
353
371
  v-model="member.registrationCountry"
@@ -415,7 +433,7 @@
415
433
  />
416
434
  <base-form-input
417
435
  v-model.trim="member.registrationNumberHouse"
418
- :rules="$rules.required"
436
+ :rules="[...$rules.required, $rules.lengthLimit(member.registrationNumberHouse, 10)]"
419
437
  :readonly="isDisabled"
420
438
  :clearable="!isDisabled"
421
439
  :label="$dataStore.t('form.NumberHouse')"
@@ -447,7 +465,7 @@
447
465
  @append="openPanel($dataStore.t('form.Region'), [], 'birthRegion', $dataStore.getRegions)"
448
466
  /> -->
449
467
  </base-form-section>
450
- <base-form-section :title="$dataStore.t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
468
+ <base-form-section :title="$dataStore.t('form.documentData')">
451
469
  <base-panel-input
452
470
  v-if="gbdDocuments && gbdDocuments.length"
453
471
  value="Список документов из ГБДФЛ"
@@ -461,8 +479,8 @@
461
479
  v-model="member.documentType"
462
480
  :value="member.documentType?.nameRu"
463
481
  :label="$dataStore.t('form.documentType')"
464
- :readonly="isDisabled"
465
- :clearable="!isDisabled"
482
+ :readonly="isDisabled || isDataFromGov"
483
+ :clearable="!isDisabled && !isDataFromGov"
466
484
  :rules="$rules.objectRequired"
467
485
  append-inner-icon="mdi mdi-chevron-right"
468
486
  @append="openPanel($dataStore.t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
@@ -470,8 +488,8 @@
470
488
  <base-form-input
471
489
  v-model.trim="member.documentNumber"
472
490
  :label="$dataStore.t('form.documentNumber')"
473
- :readonly="isDisabled || !!member.parsedDocument?.documentNumber"
474
- :clearable="!isDisabled"
491
+ :readonly="isDisabled || !!member.parsedDocument?.documentNumber || isDataFromGov"
492
+ :clearable="!isDisabled && !member.parsedDocument?.documentNumber && !isDataFromGov"
475
493
  :rules="$rules.required"
476
494
  />
477
495
  <!-- <base-file-input v-if="!memberDocument" :disabled="isDisabled" :clearable="!isDisabled" @input="attachFile($event)" />
@@ -483,17 +501,42 @@
483
501
  v-model="member.documentIssuers"
484
502
  :value="member.documentIssuers?.nameRu"
485
503
  :label="$dataStore.t('form.documentIssuers')"
486
- :readonly="isDisabled || !!member.parsedDocument?.documentIssuer"
487
- :clearable="!isDisabled"
504
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssuer || isDataFromGov"
505
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssuer && !isDataFromGov"
488
506
  :rules="$rules.objectRequired"
489
507
  append-inner-icon="mdi mdi-chevron-right"
490
508
  @append="openPanel($dataStore.t('form.documentIssuers'), [], 'documentIssuers', $dataStore.getDocumentIssuers)"
491
509
  />
510
+ <base-animation>
511
+ <div v-if="hasIssuerOther" class="flex flex-col gap-[1px]">
512
+ <base-form-input
513
+ v-model="member.documentIssuers.issuerOtherName"
514
+ :label="$dataStore.t('form.issuerOtherName')"
515
+ :readonly="isDisabled"
516
+ :clearable="!isDisabled"
517
+ :rules="$rules.required.concat($rules.onlySymbols)"
518
+ />
519
+ <base-form-input
520
+ v-model="member.documentIssuers.issuerOtherNameOrig"
521
+ :label="$dataStore.t('form.issuerOtherNameOrig')"
522
+ :readonly="isDisabled"
523
+ :clearable="!isDisabled"
524
+ :rules="$rules.required"
525
+ />
526
+ <base-form-input
527
+ v-model="member.documentIssuers.issuerOtherNameRu"
528
+ :label="$dataStore.t('form.issuerOtherNameRu')"
529
+ :readonly="isDisabled"
530
+ :clearable="!isDisabled"
531
+ :rules="$rules.required.concat($rules.cyrillic)"
532
+ />
533
+ </div>
534
+ </base-animation>
492
535
  <base-form-input
493
536
  v-model="member.documentDate"
494
537
  :label="$dataStore.t('form.documentDate')"
495
- :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate"
496
- :clearable="!isDisabled"
538
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate || isDataFromGov"
539
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssueDate && !isDataFromGov"
497
540
  :rules="$rules.required.concat($rules.date)"
498
541
  :maska="$maska.date"
499
542
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -503,8 +546,8 @@
503
546
  v-if="member.documentType.ids !== 'SBI'"
504
547
  v-model="member.documentExpire"
505
548
  :label="$dataStore.t('form.documentExpire')"
506
- :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate"
507
- :clearable="!isDisabled"
549
+ :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate || isDataFromGov"
550
+ :clearable="!isDisabled && !member.parsedDocument?.documentExpireDate && !isDataFromGov"
508
551
  :rules="$rules.required.concat($rules.date)"
509
552
  :maska="$maska.date"
510
553
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -601,47 +644,19 @@
601
644
  v-model="member.bankInfo.bankName"
602
645
  :value="member.bankInfo.bankName.nameRu"
603
646
  :label="$dataStore.t('clients.form.nameBank')"
604
- :readonly="isDisabled"
605
- :clearable="!isDisabled"
647
+ :readonly="true"
648
+ :clearable="false"
606
649
  :rules="$rules.objectRequired"
607
- append-inner-icon="mdi mdi-chevron-right"
608
- @append="openPanel($dataStore.t('clients.form.nameBank'), [], 'bankInfo', $dataStore.getBanks, '', 'bankName')"
609
650
  />
610
651
  <base-form-input
611
652
  v-model.trim="member.bankInfo.bin"
612
- :label="$dataStore.t('form.bin')"
613
653
  :maska="$maska.iin"
614
- :readonly="isDisabled"
615
- :clearable="!isDisabled"
654
+ :label="$dataStore.t('form.bin')"
655
+ :readonly="true"
656
+ :clearable="false"
616
657
  :rules="$rules.required.concat($rules.iinRight)"
617
658
  />
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
- />
659
+ <base-form-input v-model="member.bankInfo.bik" :label="$dataStore.t('clients.form.bik')" :readonly="true" :clearable="false" :rules="$rules.required" />
645
660
  </base-form-section>
646
661
  <base-form-section :title="$dataStore.t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
647
662
  <base-form-input
@@ -678,6 +693,7 @@
678
693
  <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
679
694
  <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
680
695
  <base-btn v-if="hasGKB" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGKB')" @click="getFamilyInfo" />
696
+ <base-btn v-if="isNonResident" :loading="isButtonLoading" :text="$dataStore.t('buttons.searchByFio')" @click="getContragent" />
681
697
  <base-form-section v-if="hasDocumentReader" class="!mt-0">
682
698
  <base-file-input
683
699
  :disabled="isDisabled"
@@ -696,24 +712,22 @@
696
712
  </Teleport>
697
713
  <Teleport v-if="isDocumentOpen" to="#right-panel-actions">
698
714
  <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')" />
715
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getDoc('view')" />
716
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getDoc('download')" />
701
717
  </div>
702
718
  </Teleport>
703
719
  <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#right-panel-actions">
704
720
  <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>
721
+ <base-animation>
722
+ <div v-if="otpCondition && member.otpTokenId" class="flex flex-col">
723
+ <base-form-section class="mt-0 py-2">
724
+ <base-otp-input v-model="member.otpCode" :length="4" @keyup.enter.prevent="hasOtp && checkOtp()" @input="onOtpCodeInput" />
725
+ </base-form-section>
726
+ <span class="text-center cursor-pointer mt-2" :class="[$styles.mutedText]" @click="sendOtp(false)"
727
+ >Не получили код? <span class="underline underline-offset-2">Отправить код заново</span></span
728
+ >
729
+ </div>
730
+ </base-animation>
717
731
  <base-btn v-if="!member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.sendOtp')" @click="sendOtp(false)" />
718
732
  <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.check')" @click="checkOtp()" />
719
733
  </div>
@@ -721,12 +735,12 @@
721
735
  <Teleport v-if="isPositionPanelOpen" to="#right-panel-actions">
722
736
  <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
723
737
  <base-rounded-input
724
- v-model="searchQuery"
725
- :label="$dataStore.t('labels.search')"
738
+ v-model.trim="searchQuery"
739
+ label="Выполните поиск должностей"
726
740
  class="w-full p-2"
727
741
  :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'"
742
+ :rules="[searchQuery.length < 4 ? $dataStore.t('rules.searchQueryLen', { len: 4 }) : true]"
743
+ append-inner-icon="mdi mdi-magnify"
730
744
  @append="searchPositions"
731
745
  />
732
746
  <base-animation>
@@ -745,7 +759,7 @@
745
759
  />
746
760
  </div>
747
761
  <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' })" />
762
+ <!-- <base-btn :text="$dataStore.t('buttons.add')" @click="pickPosition({ workPositionName: searchQuery, workPositionCode: 'other' })" /> -->
749
763
  <span :class="[$styles.mutedText]">{{ $dataStore.t('toaster.notFound') }}</span>
750
764
  </div>
751
765
  </base-animation>
@@ -765,7 +779,7 @@
765
779
  />
766
780
  <base-dialog v-model="familyDialog" :subtitle="$dataStore.t('dialog.familyMember')" :icon="{ mdi: 'hand-pointing-up' }" actions="familyDialog">
767
781
  <template #actions>
768
- <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" />
782
+ <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" @addChild="addChild" />
769
783
  </template>
770
784
  </base-dialog>
771
785
  <base-dialog v-model="documentChooseDialog" :subtitle="$dataStore.t('labels.chooseDoc')" :icon="{ mdi: 'file-document-outline' }" actions="documentChooseDialog">
@@ -783,6 +797,27 @@
783
797
  <base-list-empty class="w-full" v-else @click="documentChooseDialog = false" />
784
798
  </template>
785
799
  </base-dialog>
800
+ <base-dialog
801
+ v-model="fioChooseDialog"
802
+ :title="$dataStore.t('pension.contragentSelect')"
803
+ :icon="{ mdi: 'format-list-bulleted-type', color: '#A0B3D8' }"
804
+ actions="fioChooseDialog"
805
+ :persistent="false"
806
+ >
807
+ <template #actions>
808
+ <v-list lines="two" v-if="contragents && contragents.length" class="w-full !py-0">
809
+ <v-list-item v-for="person of contragents" :key="person.id" @click="getContragentClick(person)">
810
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">
811
+ {{ person.longName }}
812
+ </v-list-item-title>
813
+ <v-list-item-subtitle :class="[$styles.textSimple]">
814
+ {{ reformatDate(person.birthDate) }} - {{ person.genderName }} - Рег: {{ reformatDate(person.registrationDate) }}
815
+ </v-list-item-subtitle>
816
+ </v-list-item>
817
+ </v-list>
818
+ <base-list-empty class="w-full" v-else @click="fioChooseDialog = false" />
819
+ </template>
820
+ </base-dialog>
786
821
  </section>
787
822
  <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')" />
788
823
  </template>
@@ -790,8 +825,8 @@
790
825
  <script lang="ts">
791
826
  import { Value, DocumentItem, Member } from '../../composables/classes';
792
827
  import { uuid } from 'vue-uuid';
793
- import { StoreMembers, Enums } from '../../types/enum';
794
- import type { Api, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
828
+ import { StoreMembers, CoreEnums } from '../../types/enum';
829
+ import type { Api, ContragentType, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
795
830
 
796
831
  export default {
797
832
  setup() {
@@ -803,9 +838,10 @@ export default {
803
838
  const memberStore = useMemberStore();
804
839
  const whichForm = computed(() => route.query.tab as keyof typeof StoreMembers);
805
840
  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))!;
841
+ const getMember = (whichForm: keyof typeof StoreMembers | 'slaveInsuredForm', whichIndex?: string) =>
842
+ memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
807
843
  const member = ref(getMember(whichForm.value, whichIndex.value));
808
- const selectedFamilyMember = ref<Api.GKB.BirthInfo>({});
844
+ const selectedFamilyMember = ref<Api.GKB.BirthInfo | string>({});
809
845
  const isPanelOpen = ref<boolean>(false);
810
846
  const memberDocument = ref<DocumentItem>();
811
847
  const isButtonLoading = ref<boolean>(false);
@@ -818,9 +854,12 @@ export default {
818
854
  const isPositionPanelOpen = ref<boolean>(false);
819
855
  const isPanelLoading = ref<boolean>(false);
820
856
  const isChangingMember = ref<boolean>(false);
857
+ const isNonResident = computed(() => dataStore.isPension && member.value.signOfResidency.ids === '500011.2');
858
+ const isDataFromGov = computed(() => member.value.verifyType === 'GBDFL' || member.value.verifyType === 'ESBD' || !!member.value.gosPersonData);
821
859
  const familyDialog = ref<boolean>(false);
822
860
  const deletionDialog = ref<boolean>(false);
823
861
  const documentChooseDialog = ref<boolean>(false);
862
+ const fioChooseDialog = ref<boolean>(false);
824
863
  const selectedIndex = ref<number>(0);
825
864
  const sameAddress = ref<boolean>(false);
826
865
  const panelValue = ref<Value>(new Value());
@@ -831,16 +870,21 @@ export default {
831
870
  const fileData = ref<{ file: any }>();
832
871
  const imageDataList = ref<string[]>([]);
833
872
  const isRelative = ref<boolean>(false);
834
-
873
+ const additionalDocuments = ref<any[]>([]);
874
+ const contragents = ref<ContragentType[]>([]);
875
+ const filteredRelationsData = ref<Value[]>(dataStore.relations);
835
876
  const currentPanelDeep = ref<string>();
836
877
  const currentPanelSubDeep = ref<string>();
837
-
838
878
  const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
839
879
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
840
880
  const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value));
881
+ const isChooseChild = computed(() => {
882
+ if (dataStore.isGons) return member.value.chooseChild === dataStore.t('form.addBeneficiary');
883
+ return true;
884
+ });
885
+
841
886
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
842
887
  const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
843
- const isFromGBD = computed(() => !!member.value.gosPersonData);
844
888
  const gbdDocuments = computed(() => {
845
889
  if (hasGBDFLDocSelection && !!member.value.gosPersonData && !!member.value.gosPersonData.documents) {
846
890
  const documents = Array.isArray(member.value.gosPersonData.documents.document)
@@ -866,6 +910,7 @@ export default {
866
910
  case formStore.policyholdersRepresentativeFormKey:
867
911
  return route.params.taskId !== '0';
868
912
  default:
913
+ if (route.query.tab === 'slaveInsuredForm') return true;
869
914
  return false;
870
915
  }
871
916
  };
@@ -902,7 +947,7 @@ export default {
902
947
  };
903
948
  return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
904
949
  });
905
- const hasGBDFLDocSelection = dataStore.isLifetrip && whichForm.value === formStore.policyholderFormKey;
950
+ const hasGBDFLDocSelection = dataStore.isLifetrip;
906
951
  const hasInsis = computed(() => dataStore.controls.hasInsis);
907
952
  const hasGKB = computed(() => {
908
953
  const perMemberCondition = () => {
@@ -973,7 +1018,8 @@ export default {
973
1018
  (whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin) ||
974
1019
  (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage),
975
1020
  );
976
- const hasWorkPositionDict = !useEnv().isProduction && dataStore.isBaiterek && dataStore.isEfoParent;
1021
+ const hasWorkPositionDict = dataStore.isBaiterek;
1022
+ const hasIssuerOther = computed(() => (useEnv().isProduction ? dataStore.isPension : true) && member.value.documentIssuers && member.value.documentIssuers.nameRu === 'Другое');
977
1023
 
978
1024
  const birthDateRule = computed(() => {
979
1025
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
@@ -1048,16 +1094,18 @@ export default {
1048
1094
  });
1049
1095
 
1050
1096
  const getOtpConditionByMember = () => {
1051
- switch (whichForm.value) {
1097
+ const which = whichForm.value as keyof typeof StoreMembers | 'slaveInsuredForm';
1098
+ switch (which) {
1052
1099
  case formStore.policyholderFormKey:
1053
1100
  return route.params.taskId === '0';
1054
1101
  case formStore.insuredFormKey:
1055
- if (dataStore.isPension) return route.params.taskId === '0';
1056
- return route.query.id === '0';
1102
+ case 'slaveInsuredForm':
1057
1103
  case formStore.policyholdersRepresentativeFormKey:
1058
1104
  case formStore.beneficiaryFormKey:
1059
1105
  case formStore.beneficialOwnerFormKey:
1060
1106
  return route.query.id === '0';
1107
+ default:
1108
+ return dataStore.isPension && route.query.id === '0' && formStore.applicationData.processCode === 24;
1061
1109
  }
1062
1110
  };
1063
1111
  const otpCondition = computed(() => {
@@ -1066,13 +1114,14 @@ export default {
1066
1114
  if (whichForm.value === formStore.beneficiaryFormKey && member.value.age !== null && Number(member.value.age) < 18) return false;
1067
1115
  if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) return false;
1068
1116
  if (!member.value.phoneNumber || (member.value.phoneNumber && member.value.phoneNumber.length !== useMask().phone.length)) return false;
1117
+ if (route.query.tab === 'slaveInsuredForm' && route.query.id === '0') return true;
1069
1118
  return getOtpConditionByMember();
1070
1119
  });
1071
1120
 
1072
- const searchMember = async () => {
1121
+ const searchMember = async (title: string = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента') => {
1073
1122
  if (!isDisabled.value) {
1074
1123
  dataStore.panelAction = null;
1075
- dataStore.rightPanel.title = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента';
1124
+ dataStore.rightPanel.title = title;
1076
1125
  dataStore.rightPanel.open = true;
1077
1126
  isSearchOpen.value = true;
1078
1127
  isDocumentOpen.value = false;
@@ -1085,6 +1134,10 @@ export default {
1085
1134
  };
1086
1135
 
1087
1136
  const searchPositions = async () => {
1137
+ if (searchQuery.value.length < 4) {
1138
+ dataStore.showToaster('error', dataStore.t('rules.searchQueryLen', { len: 4 }));
1139
+ return;
1140
+ }
1088
1141
  if (!isDisabled.value) {
1089
1142
  isPanelLoading.value = true;
1090
1143
  positionsList.value = await dataStore.getWorkPosition(searchQuery.value);
@@ -1123,6 +1176,7 @@ export default {
1123
1176
  isPositionPanelOpen.value = false;
1124
1177
  }
1125
1178
  if (type === 'workPosition') {
1179
+ dataStore.rightPanel.title = dataStore.t('form.jobPosition');
1126
1180
  isPositionPanelOpen.value = true;
1127
1181
  isOtpPanelOpen.value = false;
1128
1182
  isDocumentOpen.value = false;
@@ -1252,12 +1306,35 @@ export default {
1252
1306
  }
1253
1307
  };
1254
1308
 
1255
- const attachFile = (event: InputEvent, code?: string) => {
1309
+ const uploadAdditionalFiles = async (processInstanceId: string | number) => {
1310
+ const formData = new FormData();
1311
+ const information: any = [];
1312
+ const uuidV4 = uuid.v4();
1313
+ if (additionalDocuments.value) {
1314
+ Object.values(additionalDocuments.value).map((value: any) => {
1315
+ formData.append('file', value);
1316
+ const ext = value.name.substring(value.name.lastIndexOf('.'));
1317
+ const selectedDocument = dataStore.dicFileTypeList.find((i: Value) => i.code === value.code);
1318
+ information.push({
1319
+ identifier: `${uuidV4}${ext}`,
1320
+ iin: member.value.iin ? member.value.iin.replaceAll('-', '') : null,
1321
+ processInstanceId: processInstanceId,
1322
+ fileTypeCode: selectedDocument ? selectedDocument.code : null,
1323
+ fileTypeId: selectedDocument ? selectedDocument.id : null,
1324
+ fileName: value.name,
1325
+ });
1326
+ });
1327
+ formData.append('fileData', JSON.stringify(information));
1328
+ await dataStore.uploadFiles(formData, false);
1329
+ }
1330
+ };
1331
+
1332
+ const attachFile = (event: InputEvent) => {
1256
1333
  if (event.target) {
1257
- fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
1334
+ fileData.value = { file: (event.target as HTMLInputElement).files };
1258
1335
  } else {
1259
1336
  if (event.dataTransfer) {
1260
- fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
1337
+ fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1261
1338
  }
1262
1339
  }
1263
1340
  };
@@ -1326,7 +1403,7 @@ export default {
1326
1403
  if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1327
1404
  if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1328
1405
  if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1329
- const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Enums.Insis.DocTypes['1UDL']);
1406
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === CoreEnums.Insis.DocTypes['1UDL']);
1330
1407
  if (documentType) member.value.documentType = documentType;
1331
1408
  }
1332
1409
  if (!!parsedDocument.documentIssuer) {
@@ -1351,11 +1428,11 @@ export default {
1351
1428
  }
1352
1429
  };
1353
1430
 
1354
- const getFile = async (type: FileActions) => {
1431
+ const getDoc = async (type: FileActions) => {
1355
1432
  if (memberDocument.value) {
1356
1433
  documentLoading.value = true;
1357
1434
  const fileExtension = memberDocument.value.fileName!.match(/\.([0-9a-z]+)(?:[\?#]|$)/i)![1];
1358
- await dataStore.getFile(memberDocument.value, type, fileExtension);
1435
+ await dataStore.getDoc(memberDocument.value, type, fileExtension);
1359
1436
  documentLoading.value = false;
1360
1437
  }
1361
1438
  };
@@ -1368,6 +1445,9 @@ export default {
1368
1445
  if (formStore.birthInfos.length !== 0) {
1369
1446
  familyDialog.value = true;
1370
1447
  }
1448
+ if (formStore.birthInfos.length === 0 && dataStore.isGons) {
1449
+ familyDialog.value = true;
1450
+ }
1371
1451
  } else {
1372
1452
  familyDialog.value = true;
1373
1453
  }
@@ -1383,10 +1463,23 @@ export default {
1383
1463
  isButtonLoading.value = false;
1384
1464
  dataStore.rightPanel.open = false;
1385
1465
  isSearchOpen.value = false;
1466
+ if (dataStore.isGons) {
1467
+ member.value.chooseChild = '';
1468
+ }
1469
+ };
1470
+
1471
+ const addChild = () => {
1472
+ member.value.resetMember();
1473
+ familyDialog.value = false;
1474
+ selectedFamilyMember.value = dataStore.t('form.addBeneficiary');
1475
+ isButtonLoading.value = false;
1476
+ dataStore.rightPanel.open = false;
1477
+ isSearchOpen.value = false;
1478
+ member.value.chooseChild = dataStore.t('form.addBeneficiary');
1386
1479
  };
1387
1480
 
1388
1481
  const selectFamilyMember = (familyMember: Api.GKB.BirthInfo) => {
1389
- if (selectedFamilyMember.value && selectedFamilyMember.value.childIIN === familyMember.childIIN) {
1482
+ if (selectedFamilyMember.value && typeof selectedFamilyMember.value === 'object' && selectedFamilyMember.value.childIIN === familyMember.childIIN) {
1390
1483
  selectedFamilyMember.value = {};
1391
1484
  } else {
1392
1485
  selectedFamilyMember.value = familyMember;
@@ -1395,6 +1488,19 @@ export default {
1395
1488
  member.value.lastName = selectedFamilyMember.value.childSurName!;
1396
1489
  member.value.middleName = selectedFamilyMember.value.childPatronymic ?? '';
1397
1490
  member.value.birthDate = reformatDate(selectedFamilyMember.value.childBirthDate!);
1491
+ member.value.gender = dataStore.gender.find(i => {
1492
+ if (typeof selectedFamilyMember.value === 'object') {
1493
+ return i.id === selectedFamilyMember.value.childGender;
1494
+ }
1495
+ })!;
1496
+ member.value.relationDegree = dataStore.relations.find(i => {
1497
+ if (typeof selectedFamilyMember.value === 'object') {
1498
+ return selectedFamilyMember.value.childGender === 1 ? i.nameRu === 'Сын' : i.nameRu === 'Дочь';
1499
+ }
1500
+ })!;
1501
+ if (dataStore.isGons) {
1502
+ member.value.chooseChild = `${selectedFamilyMember.value.childSurName} ${selectedFamilyMember.value.childName} ${selectedFamilyMember.value.childPatronymic ? selectedFamilyMember.value.childPatronymic : ''}`;
1503
+ }
1398
1504
  }
1399
1505
  familyDialog.value = false;
1400
1506
  isButtonLoading.value = false;
@@ -1430,7 +1536,9 @@ export default {
1430
1536
 
1431
1537
  const selectGbdDocument = (document: Api.GBD.Document) => {
1432
1538
  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)]);
1539
+ const documentType = dataStore.documentTypes.find(
1540
+ (i: Value) => i.ids === Object.keys(CoreEnums.GBD.DocTypes)[Object.values(CoreEnums.GBD.DocTypes).indexOf(document.type.code)],
1541
+ );
1434
1542
  if (documentType) member.value.documentType = documentType;
1435
1543
  const documentNumber = document.number;
1436
1544
  if (documentNumber) member.value.documentNumber = documentNumber;
@@ -1447,21 +1555,46 @@ export default {
1447
1555
  isSearchOpen.value = false;
1448
1556
  };
1449
1557
 
1558
+ const getContragentClick = async (contragent: ContragentType) => {
1559
+ isButtonLoading.value = true;
1560
+ await dataStore.serializeContragentData(member.value, contragent);
1561
+ fioChooseDialog.value = false;
1562
+ isButtonLoading.value = false;
1563
+ dataStore.rightPanel.open = false;
1564
+ isSearchOpen.value = false;
1565
+ };
1566
+
1450
1567
  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;
1568
+ if (isNonResident.value) {
1569
+ if (!member.value.lastName || !member.value.firstName) {
1570
+ dataStore.showToaster('error', 'Заполните поля Имя и Фамилия', 3000);
1571
+ dataStore.rightPanel.open = false;
1572
+ isSearchOpen.value = false;
1573
+ return;
1574
+ }
1575
+ } else {
1576
+ if (member.value.hasAgreement !== true) {
1577
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
1578
+ dataStore.rightPanel.open = false;
1579
+ isSearchOpen.value = false;
1580
+ return;
1581
+ }
1582
+ if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
1583
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
1584
+ dataStore.rightPanel.open = false;
1585
+ isSearchOpen.value = false;
1586
+ return;
1587
+ }
1462
1588
  }
1463
1589
  isButtonLoading.value = true;
1464
- await dataStore.getContragent(member.value, false);
1590
+ if (isNonResident.value) {
1591
+ const response = await dataStore.getContragent(member.value, false);
1592
+ if (response) contragents.value = response.items;
1593
+ else dataStore.showToaster('error', 'Не найдено совпадений', 3000);
1594
+ fioChooseDialog.value = true;
1595
+ } else {
1596
+ await dataStore.getContragent(member.value, false);
1597
+ }
1465
1598
  isButtonLoading.value = false;
1466
1599
  dataStore.rightPanel.open = false;
1467
1600
  isSearchOpen.value = false;
@@ -1497,10 +1630,11 @@ export default {
1497
1630
  }
1498
1631
  const isInsured = formStore.isPolicyholderInsured;
1499
1632
  const remoteIsInsured = ref<boolean | null>(null);
1633
+ const isNewApplication = route.params.taskId === '0';
1500
1634
  if (whichForm.value == formStore.policyholderFormKey || (dataStore.isPension && whichForm.value == formStore.insuredFormKey)) {
1501
1635
  if (route.params.taskId === '0') {
1502
1636
  try {
1503
- const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 4 : 19) : undefined);
1637
+ const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 25 : 19) : undefined);
1504
1638
  if (typeof taskId === 'string') {
1505
1639
  await dataStore.getApplicationData(taskId, false, false, false, false);
1506
1640
  remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
@@ -1524,6 +1658,13 @@ export default {
1524
1658
  if (fileData.value && fileData.value.file) {
1525
1659
  await uploadFile(formStore.applicationData.processInstanceId);
1526
1660
  }
1661
+ if (additionalDocuments.value && additionalDocuments.value.length) {
1662
+ if (
1663
+ (!formStore.applicationData.isEnpfSum && formStore.applicationData?.pensionApp.transferContracts && formStore.applicationData?.pensionApp.transferContracts.length) ||
1664
+ (formStore.applicationData?.pensionApp.compulsoryProfMonthCount && formStore.applicationData?.pensionApp.compulsoryProfMonthCount >= 60)
1665
+ )
1666
+ await uploadAdditionalFiles(formStore.applicationData.processInstanceId);
1667
+ }
1527
1668
  }
1528
1669
  const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value, whichIndex.value ? Number(whichIndex.value) : undefined);
1529
1670
  if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
@@ -1547,30 +1688,43 @@ export default {
1547
1688
  }
1548
1689
  }
1549
1690
  }
1550
- if (whichForm.value === formStore.insuredFormKey) {
1691
+ if (
1692
+ whichForm.value === formStore.insuredFormKey ||
1693
+ (memberFromApplicaiton &&
1694
+ memberFromApplicaiton.processInstanceId &&
1695
+ formStore.applicationData.slave &&
1696
+ memberFromApplicaiton.processInstanceId === formStore.applicationData.slave.processInstanceId)
1697
+ ) {
1551
1698
  wasInsuredAction.value = true;
1552
1699
  if (dataStore.isPension) {
1553
- formStore.applicationData.pensionApp = {
1700
+ let data = {
1554
1701
  ...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,
1702
+ slave: formStore.applicationData.slave?.pensionApp ?? undefined,
1566
1703
  };
1567
- const data = {
1568
- ...formStore.applicationData.pensionApp,
1569
- transferContractCompany: formStore.applicationData.pensionApp.transferContractCompany?.nameRu ?? null,
1704
+ const bankinfo = {
1705
+ account: member.value.bankInfo.iik ?? '',
1706
+ bankBik: member.value.bankInfo.bik ?? '',
1707
+ bankBin: member.value.bankInfo.bin ? String(member.value.bankInfo.bin).replaceAll('-', '') : '',
1708
+ bankId: Number(member.value.bankInfo.bankName.id) ?? 0,
1709
+ bankName: member.value.bankInfo.bankName.nameRu ?? '',
1570
1710
  };
1711
+ if (route.query.tab === 'slaveInsuredForm') {
1712
+ data.slave = { ...data.slave, ...bankinfo };
1713
+ } else {
1714
+ data = { ...data, ...bankinfo };
1715
+ }
1716
+ const pensionKeysWithSpace = ['compulsoryContractAmount', 'compulsoryProfContractAmount', 'voluntaryContractAmount', 'ownFundsRaisAmount'];
1717
+ pensionKeysWithSpace.forEach(key => {
1718
+ if (/\s/g.test(data[key]) === true) data[key] = formatSpacedNumber(data[key]);
1719
+ });
1720
+ if (data.slave)
1721
+ pensionKeysWithSpace.forEach(key => {
1722
+ if (/\s/g.test(data.slave[key]) === true) data.slave[key] = formatSpacedNumber(data.slave[key]);
1723
+ });
1571
1724
  const isApplicationSaved = await dataStore.setApplication(data);
1725
+ if (!isNewApplication) dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1572
1726
  if (isApplicationSaved === false) return;
1573
- dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1727
+ await dataStore.saveMember(member.value, 'Client', memberFromApplicaiton);
1574
1728
  }
1575
1729
  }
1576
1730
  await router.replace({
@@ -1609,6 +1763,7 @@ export default {
1609
1763
  }
1610
1764
  }
1611
1765
  if (member.value.hasAgreement !== true) {
1766
+ if (isNonResident.value) return true;
1612
1767
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
1613
1768
  return false;
1614
1769
  }
@@ -1623,13 +1778,17 @@ export default {
1623
1778
  isSubmittingForm.value = true;
1624
1779
  const docType = member.value.documentType.ids;
1625
1780
  if (
1781
+ !isNonResident.value &&
1626
1782
  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)
1783
+ (docType === CoreEnums.Insis.DocTypes['1UDL'] ||
1784
+ docType === CoreEnums.Insis.DocTypes.SBI ||
1785
+ docType === CoreEnums.Insis.DocTypes.PS ||
1786
+ docType === CoreEnums.Insis.DocTypes.VNZ)
1628
1787
  ) {
1629
1788
  dataStore.isLoading = true;
1630
1789
  const docTypeCodes = {
1631
1790
  '1UDL': 1,
1632
- PS: 2,
1791
+ PS: 11,
1633
1792
  SBI: 3,
1634
1793
  VNZ: 4,
1635
1794
  };
@@ -1654,11 +1813,11 @@ export default {
1654
1813
  isSubmittingForm.value = false;
1655
1814
  return;
1656
1815
  }
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;
1816
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
1817
+ formStore.pensionApp.account = member.value.bankInfo.iik;
1818
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
1819
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
1820
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1662
1821
  }
1663
1822
  }
1664
1823
  const hasMemberSaved = await saveMember();
@@ -1666,6 +1825,23 @@ export default {
1666
1825
  dataStore.isLoading = false;
1667
1826
  dataStore.showToaster('error', errorMessage, 5000);
1668
1827
  }
1828
+ } else if (isNonResident.value) {
1829
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
1830
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1831
+ if (isValidIik === false) {
1832
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1833
+ member.value.bankInfo.iik = '';
1834
+ isSubmittingForm.value = false;
1835
+ return;
1836
+ }
1837
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
1838
+ formStore.pensionApp.account = member.value.bankInfo.iik;
1839
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
1840
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
1841
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1842
+ }
1843
+ }
1844
+ const hasMemberSaved = await saveMember();
1669
1845
  } else {
1670
1846
  member.value.gotFromInsis = true;
1671
1847
  const hasMemberSaved = await saveMember();
@@ -1819,14 +1995,21 @@ export default {
1819
1995
  }
1820
1996
  if (!member.value.id) {
1821
1997
  await router.replace({ query: { ...route.query, id: 0 } });
1998
+ if (dataStore.isPension) {
1999
+ switch (whichForm.value) {
2000
+ case formStore.insuredFormKey:
2001
+ setSignOfResidency();
2002
+ break;
2003
+ }
2004
+ }
1822
2005
  } else {
1823
2006
  if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1824
2007
  if (dataStore.isLifetrip) {
1825
2008
  const documentByPriority = (() => {
1826
2009
  if (whichForm.value !== formStore.policyholderFormKey || formStore.isPolicyholderInsured === true) {
1827
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes.PS);
2010
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes.PS);
1828
2011
  }
1829
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes['1UDL']);
2012
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes['1UDL']);
1830
2013
  })();
1831
2014
  const userDocument = documentByPriority ? documentByPriority : member.value.documentsList[0];
1832
2015
  const documentType = dataStore.documentTypes.find((i: Value) => i.ids === userDocument.type);
@@ -1837,12 +2020,10 @@ export default {
1837
2020
  member.value.documentDate = reformatDate(userDocument.issueDate);
1838
2021
  member.value.documentExpire = reformatDate(userDocument.expireDate);
1839
2022
  }
1840
-
1841
- // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
2023
+ // const filteredDocuments: DocumentItem[] = dataStore.getDocsByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1842
2024
  // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1843
2025
  }
1844
2026
  await setDefaultValues();
1845
- if (Number(formStore.applicationData.processCode) === 4) dataStore.members.insuredApp.isMultiple = true;
1846
2027
  if (hasWorkPositionDict && member.value.positionCode === null) member.value.jobPosition = null;
1847
2028
  };
1848
2029
  onMounted(async () => {
@@ -1891,8 +2072,33 @@ export default {
1891
2072
  },
1892
2073
  );
1893
2074
 
2075
+ if (dataStore.isGons) {
2076
+ watch(
2077
+ () => member.value.chooseChild,
2078
+ val => {
2079
+ if (val === dataStore.t('form.addBeneficiary')) {
2080
+ const idsToFind = ['14', '15', '21', '20', '24', '25', '27'];
2081
+ const filteredData = dataStore.relations.filter(item => idsToFind.includes(item.ids as string));
2082
+ filteredRelationsData.value = filteredData;
2083
+ } else {
2084
+ filteredRelationsData.value = dataStore.relations;
2085
+ }
2086
+ },
2087
+ { immediate: true },
2088
+ );
2089
+ }
2090
+
2091
+ watch(
2092
+ () => member.value.registrationProvince,
2093
+ (val, oldVal) => {
2094
+ if (val.nameRu !== null && val.nameRu !== oldVal.nameRu && val.ids !== member.value.registrationCity.code) {
2095
+ member.value.registrationCity = new Value();
2096
+ }
2097
+ },
2098
+ );
2099
+
1894
2100
  const onIinInput = () => {
1895
- if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value.isMultiple === true) {
2101
+ if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value?.isMultiple === true) {
1896
2102
  const alreadyInStatement = formStore[whichForm.value as MultipleMember].findIndex((i: Member) => i.iin === member.value.iin);
1897
2103
  if (alreadyInStatement !== -1 && alreadyInStatement !== Number(whichIndex.value)) {
1898
2104
  dataStore.showToaster('error', dataStore.t('toaster.hasAlreadyMember'), 3000);
@@ -1933,13 +2139,14 @@ export default {
1933
2139
  watch(
1934
2140
  () => member.value.age,
1935
2141
  val => {
1936
- if (val && Number(val) >= 18) {
1937
- if (member.value.hasAgreement !== true) {
2142
+ if (val) {
2143
+ if (Number(val) >= 18 && member.value.hasAgreement !== true) {
1938
2144
  member.value.hasAgreement = false;
2145
+ } else {
2146
+ member.value.hasAgreement = true;
1939
2147
  }
1940
- } else {
1941
- member.value.hasAgreement = true;
1942
2148
  }
2149
+
1943
2150
  member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1944
2151
  },
1945
2152
  { immediate: true },
@@ -1955,15 +2162,35 @@ export default {
1955
2162
  );
1956
2163
  }
1957
2164
  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
- );
2165
+ if (member.value.bankInfo) {
2166
+ watch(
2167
+ () => member.value.bankInfo.iik,
2168
+ async val => {
2169
+ if (val && val.length === 20) {
2170
+ if (
2171
+ route.query.tab === 'slaveInsuredForm'
2172
+ ? formStore.insuredForm.some(i => i.bankInfo.iik === val)
2173
+ : formStore.applicationData.processCode === 25 && val === formStore.slaveInsuredForm.bankInfo.iik
2174
+ ) {
2175
+ dataStore.showToaster('error', `ИИК: "${val}" уже имеется в заявке`);
2176
+ member.value.bankInfo = new BankInfoClass();
2177
+ return;
2178
+ }
2179
+ isButtonLoading.value = true;
2180
+ const bank = await dataStore.getBankByAccountNumber(val);
2181
+ if (bank) {
2182
+ member.value.bankInfo.bik = String(bank.code);
2183
+ member.value.bankInfo.bin = member.value.bankInfo.bankName.ids = reformatIin(String(bank.ids));
2184
+ member.value.bankInfo.bankName.nameRu = String(bank.nameRu);
2185
+ member.value.bankInfo.bankName.id = Number(bank.id);
2186
+ } else member.value.bankInfo = new BankInfoClass();
2187
+ isButtonLoading.value = false;
2188
+ } else if (!val) {
2189
+ member.value.bankInfo = new BankInfoClass();
2190
+ }
2191
+ },
2192
+ );
2193
+ }
1967
2194
  watch(
1968
2195
  () => member.value.isDisability,
1969
2196
  val => {
@@ -2000,11 +2227,15 @@ export default {
2000
2227
  familyDialog,
2001
2228
  deletionDialog,
2002
2229
  documentChooseDialog,
2230
+ fioChooseDialog,
2003
2231
  selectedIndex,
2004
2232
  selectedFamilyMember,
2005
2233
  sameAddress,
2006
2234
  isRelative,
2007
2235
  imageDataList,
2236
+ contragents,
2237
+ filteredRelationsData,
2238
+
2008
2239
  // Computed
2009
2240
  whichForm,
2010
2241
  whichIndex,
@@ -2014,7 +2245,6 @@ export default {
2014
2245
  isDisabled,
2015
2246
  isTask,
2016
2247
  isIinPhoneDisabled,
2017
- isFromGBD,
2018
2248
  showSaveButton,
2019
2249
  hasGBDFL,
2020
2250
  hasInsis,
@@ -2026,10 +2256,14 @@ export default {
2026
2256
  hasInsurancePay,
2027
2257
  hasSignOfIPDL,
2028
2258
  hasSameAddressToggle,
2259
+ hasIssuerOther,
2029
2260
  hasMemberSearch,
2030
2261
  hasWorkPositionDict,
2031
2262
  gbdDocuments,
2032
2263
  hasGBDFLDocSelection,
2264
+ isNonResident,
2265
+ isDataFromGov,
2266
+ isChooseChild,
2033
2267
 
2034
2268
  // Rules
2035
2269
  ageRule,
@@ -2038,6 +2272,7 @@ export default {
2038
2272
  birthDateRule,
2039
2273
 
2040
2274
  // Functions
2275
+ addChild,
2041
2276
  searchMember,
2042
2277
  openPanel,
2043
2278
  openCustomPanel,
@@ -2051,7 +2286,7 @@ export default {
2051
2286
  attachFile,
2052
2287
  attachDocumentReader,
2053
2288
  getDocumentReader,
2054
- getFile,
2289
+ getDoc,
2055
2290
  selectFamilyMember,
2056
2291
  closeFamilyDialog,
2057
2292
  openDeletionDialog,
@@ -2063,6 +2298,7 @@ export default {
2063
2298
  searchPositions,
2064
2299
  selectGbdDocument,
2065
2300
  pickPosition,
2301
+ getContragentClick,
2066
2302
  };
2067
2303
  },
2068
2304
  };