hl-core 0.0.10-beta.6 → 0.0.10-beta.60

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 (45) hide show
  1. package/README.md +0 -2
  2. package/api/base.api.ts +357 -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 +7 -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 +2 -1
  18. package/components/Pages/Anketa.vue +207 -176
  19. package/components/Pages/ContragentForm.vue +1 -1
  20. package/components/Pages/Documents.vue +486 -64
  21. package/components/Pages/MemberForm.vue +424 -182
  22. package/components/Pages/ProductConditions.vue +1180 -257
  23. package/components/Panel/PanelHandler.vue +319 -125
  24. package/components/Utilities/Chip.vue +1 -1
  25. package/components/Utilities/JsonViewer.vue +1 -2
  26. package/composables/classes.ts +125 -21
  27. package/composables/constants.ts +166 -1
  28. package/composables/index.ts +343 -9
  29. package/composables/styles.ts +8 -24
  30. package/configs/i18n.ts +2 -0
  31. package/configs/pwa.ts +1 -7
  32. package/layouts/clear.vue +1 -1
  33. package/layouts/default.vue +1 -1
  34. package/layouts/full.vue +1 -1
  35. package/locales/kz.json +1236 -0
  36. package/locales/ru.json +108 -20
  37. package/nuxt.config.ts +8 -6
  38. package/package.json +12 -12
  39. package/plugins/head.ts +7 -1
  40. package/plugins/helperFunctionsPlugins.ts +1 -0
  41. package/store/data.store.ts +948 -527
  42. package/store/member.store.ts +17 -6
  43. package/store/rules.ts +54 -3
  44. package/types/enum.ts +45 -2
  45. package/types/index.ts +115 -5
@@ -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"
@@ -256,8 +274,9 @@
256
274
  :label="$dataStore.t('form.documentDate')"
257
275
  :readonly="isDisabled"
258
276
  :clearable="!isDisabled"
259
- :rules="$rules.date"
277
+ :rules="$rules.date.concat($rules.checkPastOrToday)"
260
278
  :maska="$maska.date"
279
+ :max-date="getToday()"
261
280
  append-inner-icon="mdi mdi-calendar-blank-outline"
262
281
  />
263
282
  <base-form-input
@@ -265,8 +284,9 @@
265
284
  :label="$dataStore.t('form.documentExpire')"
266
285
  :readonly="isDisabled"
267
286
  :clearable="!isDisabled"
268
- :rules="$rules.date"
287
+ :rules="$rules.date.concat($rules.checkTodayOrFuture)"
269
288
  :maska="$maska.date"
289
+ :min-date="getToday()"
270
290
  append-inner-icon="mdi mdi-calendar-blank-outline"
271
291
  />
272
292
  <base-form-input v-model.trim="member.migrationCard" :label="$dataStore.t('policyholdersRepresentative.numberVisa')" />
@@ -331,10 +351,10 @@
331
351
  v-if="hasWorkPositionDict"
332
352
  v-model.trim="member.jobPosition"
333
353
  :label="$dataStore.t('form.jobPosition')"
334
- :readonly="isDisabled || member.positionCode !== 'other'"
335
354
  :clearable="!isDisabled"
336
355
  :rules="$rules.required"
337
356
  append-inner-icon="mdi-chevron-right"
357
+ readonly
338
358
  @click="openCustomPanel('workPosition')"
339
359
  />
340
360
  <base-form-input
@@ -347,7 +367,7 @@
347
367
  />
348
368
  <base-form-input v-model.trim="member.jobPlace" :label="$dataStore.t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
349
369
  </base-form-section>
350
- <base-form-section :title="$dataStore.t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
370
+ <base-form-section :title="$dataStore.t('form.placeRegistration')">
351
371
  <base-form-toggle v-if="hasSameAddressToggle" v-model="sameAddress" :disabled="isDisabled" :has-border="false" :title="$dataStore.t('form.sameAddress')" />
352
372
  <base-panel-input
353
373
  v-model="member.registrationCountry"
@@ -415,7 +435,7 @@
415
435
  />
416
436
  <base-form-input
417
437
  v-model.trim="member.registrationNumberHouse"
418
- :rules="$rules.required"
438
+ :rules="[...$rules.required, $rules.lengthLimit(member.registrationNumberHouse, 10)]"
419
439
  :readonly="isDisabled"
420
440
  :clearable="!isDisabled"
421
441
  :label="$dataStore.t('form.NumberHouse')"
@@ -447,7 +467,7 @@
447
467
  @append="openPanel($dataStore.t('form.Region'), [], 'birthRegion', $dataStore.getRegions)"
448
468
  /> -->
449
469
  </base-form-section>
450
- <base-form-section :title="$dataStore.t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
470
+ <base-form-section :title="$dataStore.t('form.documentData')">
451
471
  <base-panel-input
452
472
  v-if="gbdDocuments && gbdDocuments.length"
453
473
  value="Список документов из ГБДФЛ"
@@ -461,8 +481,8 @@
461
481
  v-model="member.documentType"
462
482
  :value="member.documentType?.nameRu"
463
483
  :label="$dataStore.t('form.documentType')"
464
- :readonly="isDisabled"
465
- :clearable="!isDisabled"
484
+ :readonly="isDisabled || isDataFromGov"
485
+ :clearable="!isDisabled && !isDataFromGov"
466
486
  :rules="$rules.objectRequired"
467
487
  append-inner-icon="mdi mdi-chevron-right"
468
488
  @append="openPanel($dataStore.t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
@@ -470,8 +490,8 @@
470
490
  <base-form-input
471
491
  v-model.trim="member.documentNumber"
472
492
  :label="$dataStore.t('form.documentNumber')"
473
- :readonly="isDisabled || !!member.parsedDocument?.documentNumber"
474
- :clearable="!isDisabled"
493
+ :readonly="isDisabled || !!member.parsedDocument?.documentNumber || isDataFromGov"
494
+ :clearable="!isDisabled && !member.parsedDocument?.documentNumber && !isDataFromGov"
475
495
  :rules="$rules.required"
476
496
  />
477
497
  <!-- <base-file-input v-if="!memberDocument" :disabled="isDisabled" :clearable="!isDisabled" @input="attachFile($event)" />
@@ -483,17 +503,42 @@
483
503
  v-model="member.documentIssuers"
484
504
  :value="member.documentIssuers?.nameRu"
485
505
  :label="$dataStore.t('form.documentIssuers')"
486
- :readonly="isDisabled || !!member.parsedDocument?.documentIssuer"
487
- :clearable="!isDisabled"
506
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssuer || isDataFromGov"
507
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssuer && !isDataFromGov"
488
508
  :rules="$rules.objectRequired"
489
509
  append-inner-icon="mdi mdi-chevron-right"
490
510
  @append="openPanel($dataStore.t('form.documentIssuers'), [], 'documentIssuers', $dataStore.getDocumentIssuers)"
491
511
  />
512
+ <base-animation>
513
+ <div v-if="hasIssuerOther" class="flex flex-col gap-[1px]">
514
+ <base-form-input
515
+ v-model="member.documentIssuers.issuerOtherName"
516
+ :label="$dataStore.t('form.issuerOtherName')"
517
+ :readonly="isDisabled"
518
+ :clearable="!isDisabled"
519
+ :rules="$rules.required.concat($rules.onlySymbols)"
520
+ />
521
+ <base-form-input
522
+ v-model="member.documentIssuers.issuerOtherNameOrig"
523
+ :label="$dataStore.t('form.issuerOtherNameOrig')"
524
+ :readonly="isDisabled"
525
+ :clearable="!isDisabled"
526
+ :rules="$rules.required"
527
+ />
528
+ <base-form-input
529
+ v-model="member.documentIssuers.issuerOtherNameRu"
530
+ :label="$dataStore.t('form.issuerOtherNameRu')"
531
+ :readonly="isDisabled"
532
+ :clearable="!isDisabled"
533
+ :rules="$rules.required.concat($rules.cyrillic)"
534
+ />
535
+ </div>
536
+ </base-animation>
492
537
  <base-form-input
493
538
  v-model="member.documentDate"
494
539
  :label="$dataStore.t('form.documentDate')"
495
- :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate"
496
- :clearable="!isDisabled"
540
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate || isDataFromGov"
541
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssueDate && !isDataFromGov"
497
542
  :rules="$rules.required.concat($rules.date)"
498
543
  :maska="$maska.date"
499
544
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -503,8 +548,8 @@
503
548
  v-if="member.documentType.ids !== 'SBI'"
504
549
  v-model="member.documentExpire"
505
550
  :label="$dataStore.t('form.documentExpire')"
506
- :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate"
507
- :clearable="!isDisabled"
551
+ :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate || isDataFromGov"
552
+ :clearable="!isDisabled && !member.parsedDocument?.documentExpireDate && !isDataFromGov"
508
553
  :rules="$rules.required.concat($rules.date)"
509
554
  :maska="$maska.date"
510
555
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -601,47 +646,19 @@
601
646
  v-model="member.bankInfo.bankName"
602
647
  :value="member.bankInfo.bankName.nameRu"
603
648
  :label="$dataStore.t('clients.form.nameBank')"
604
- :readonly="isDisabled"
605
- :clearable="!isDisabled"
649
+ :readonly="true"
650
+ :clearable="false"
606
651
  :rules="$rules.objectRequired"
607
- append-inner-icon="mdi mdi-chevron-right"
608
- @append="openPanel($dataStore.t('clients.form.nameBank'), [], 'bankInfo', $dataStore.getBanks, '', 'bankName')"
609
652
  />
610
653
  <base-form-input
611
654
  v-model.trim="member.bankInfo.bin"
612
- :label="$dataStore.t('form.bin')"
613
655
  :maska="$maska.iin"
614
- :readonly="isDisabled"
615
- :clearable="!isDisabled"
656
+ :label="$dataStore.t('form.bin')"
657
+ :readonly="true"
658
+ :clearable="false"
616
659
  :rules="$rules.required.concat($rules.iinRight)"
617
660
  />
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
- />
661
+ <base-form-input v-model="member.bankInfo.bik" :label="$dataStore.t('clients.form.bik')" :readonly="true" :clearable="false" :rules="$rules.required" />
645
662
  </base-form-section>
646
663
  <base-form-section :title="$dataStore.t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
647
664
  <base-form-input
@@ -678,6 +695,7 @@
678
695
  <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
679
696
  <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
680
697
  <base-btn v-if="hasGKB" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGKB')" @click="getFamilyInfo" />
698
+ <base-btn v-if="isNonResident" :loading="isButtonLoading" :text="$dataStore.t('buttons.searchByFio')" @click="getContragent" />
681
699
  <base-form-section v-if="hasDocumentReader" class="!mt-0">
682
700
  <base-file-input
683
701
  :disabled="isDisabled"
@@ -696,24 +714,22 @@
696
714
  </Teleport>
697
715
  <Teleport v-if="isDocumentOpen" to="#right-panel-actions">
698
716
  <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')" />
717
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getDoc('view')" />
718
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getDoc('download')" />
701
719
  </div>
702
720
  </Teleport>
703
721
  <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#right-panel-actions">
704
722
  <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>
723
+ <base-animation>
724
+ <div v-if="otpCondition && member.otpTokenId" class="flex flex-col">
725
+ <base-form-section class="mt-0 py-2">
726
+ <base-otp-input v-model="member.otpCode" :length="4" @keyup.enter.prevent="hasOtp && checkOtp()" @input="onOtpCodeInput" />
727
+ </base-form-section>
728
+ <span class="text-center cursor-pointer mt-2" :class="[$styles.mutedText]" @click="sendOtp(false)"
729
+ >Не получили код? <span class="underline underline-offset-2">Отправить код заново</span></span
730
+ >
731
+ </div>
732
+ </base-animation>
717
733
  <base-btn v-if="!member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.sendOtp')" @click="sendOtp(false)" />
718
734
  <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.check')" @click="checkOtp()" />
719
735
  </div>
@@ -721,12 +737,12 @@
721
737
  <Teleport v-if="isPositionPanelOpen" to="#right-panel-actions">
722
738
  <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
723
739
  <base-rounded-input
724
- v-model="searchQuery"
725
- :label="$dataStore.t('labels.search')"
740
+ v-model.trim="searchQuery"
741
+ label="Выполните поиск должностей"
726
742
  class="w-full p-2"
727
743
  :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'"
744
+ :rules="[searchQuery.length < 4 ? $dataStore.t('rules.searchQueryLen', { len: 4 }) : true]"
745
+ append-inner-icon="mdi mdi-magnify"
730
746
  @append="searchPositions"
731
747
  />
732
748
  <base-animation>
@@ -745,7 +761,7 @@
745
761
  />
746
762
  </div>
747
763
  <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' })" />
764
+ <!-- <base-btn :text="$dataStore.t('buttons.add')" @click="pickPosition({ workPositionName: searchQuery, workPositionCode: 'other' })" /> -->
749
765
  <span :class="[$styles.mutedText]">{{ $dataStore.t('toaster.notFound') }}</span>
750
766
  </div>
751
767
  </base-animation>
@@ -765,7 +781,7 @@
765
781
  />
766
782
  <base-dialog v-model="familyDialog" :subtitle="$dataStore.t('dialog.familyMember')" :icon="{ mdi: 'hand-pointing-up' }" actions="familyDialog">
767
783
  <template #actions>
768
- <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" />
784
+ <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" @addChild="addChild" />
769
785
  </template>
770
786
  </base-dialog>
771
787
  <base-dialog v-model="documentChooseDialog" :subtitle="$dataStore.t('labels.chooseDoc')" :icon="{ mdi: 'file-document-outline' }" actions="documentChooseDialog">
@@ -783,6 +799,27 @@
783
799
  <base-list-empty class="w-full" v-else @click="documentChooseDialog = false" />
784
800
  </template>
785
801
  </base-dialog>
802
+ <base-dialog
803
+ v-model="fioChooseDialog"
804
+ :title="$dataStore.t('pension.contragentSelect')"
805
+ :icon="{ mdi: 'format-list-bulleted-type', color: '#A0B3D8' }"
806
+ actions="fioChooseDialog"
807
+ :persistent="false"
808
+ >
809
+ <template #actions>
810
+ <v-list lines="two" v-if="contragents && contragents.length" class="w-full !py-0">
811
+ <v-list-item v-for="person of contragents" :key="person.id" @click="getContragentClick(person)">
812
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">
813
+ {{ person.longName }}
814
+ </v-list-item-title>
815
+ <v-list-item-subtitle :class="[$styles.textSimple]">
816
+ {{ reformatDate(person.birthDate) }} - {{ person.genderName }} - Рег: {{ reformatDate(person.registrationDate) }}
817
+ </v-list-item-subtitle>
818
+ </v-list-item>
819
+ </v-list>
820
+ <base-list-empty class="w-full" v-else @click="fioChooseDialog = false" />
821
+ </template>
822
+ </base-dialog>
786
823
  </section>
787
824
  <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')" />
788
825
  </template>
@@ -790,8 +827,8 @@
790
827
  <script lang="ts">
791
828
  import { Value, DocumentItem, Member } from '../../composables/classes';
792
829
  import { uuid } from 'vue-uuid';
793
- import { StoreMembers, Enums } from '../../types/enum';
794
- import type { Api, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
830
+ import { StoreMembers, CoreEnums } from '../../types/enum';
831
+ import type { Api, ContragentType, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
795
832
 
796
833
  export default {
797
834
  setup() {
@@ -803,9 +840,10 @@ export default {
803
840
  const memberStore = useMemberStore();
804
841
  const whichForm = computed(() => route.query.tab as keyof typeof StoreMembers);
805
842
  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))!;
843
+ const getMember = (whichForm: keyof typeof StoreMembers | 'slaveInsuredForm', whichIndex?: string) =>
844
+ memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
807
845
  const member = ref(getMember(whichForm.value, whichIndex.value));
808
- const selectedFamilyMember = ref<Api.GKB.BirthInfo>({});
846
+ const selectedFamilyMember = ref<Api.GKB.BirthInfo | string>({});
809
847
  const isPanelOpen = ref<boolean>(false);
810
848
  const memberDocument = ref<DocumentItem>();
811
849
  const isButtonLoading = ref<boolean>(false);
@@ -818,9 +856,12 @@ export default {
818
856
  const isPositionPanelOpen = ref<boolean>(false);
819
857
  const isPanelLoading = ref<boolean>(false);
820
858
  const isChangingMember = ref<boolean>(false);
859
+ const isNonResident = computed(() => dataStore.isPension && member.value.signOfResidency.ids === '500011.2');
860
+ const isDataFromGov = computed(() => member.value.verifyType === 'GBDFL' || member.value.verifyType === 'ESBD' || !!member.value.gosPersonData);
821
861
  const familyDialog = ref<boolean>(false);
822
862
  const deletionDialog = ref<boolean>(false);
823
863
  const documentChooseDialog = ref<boolean>(false);
864
+ const fioChooseDialog = ref<boolean>(false);
824
865
  const selectedIndex = ref<number>(0);
825
866
  const sameAddress = ref<boolean>(false);
826
867
  const panelValue = ref<Value>(new Value());
@@ -831,16 +872,24 @@ export default {
831
872
  const fileData = ref<{ file: any }>();
832
873
  const imageDataList = ref<string[]>([]);
833
874
  const isRelative = ref<boolean>(false);
834
-
875
+ const additionalDocuments = ref<any[]>([]);
876
+ const contragents = ref<ContragentType[]>([]);
877
+ const filteredRelationsData = ref<Value[]>(dataStore.relations);
835
878
  const currentPanelDeep = ref<string>();
836
879
  const currentPanelSubDeep = ref<string>();
837
-
838
880
  const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
839
881
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
840
882
  const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value));
883
+ const isChooseChild = computed(() => {
884
+ if (dataStore.isGons) return member.value.chooseChild === dataStore.t('form.addBeneficiary');
885
+ return true;
886
+ });
887
+ const getToday = (): Date => {
888
+ return new Date(new Date().setHours(0, 0, 0, 0));
889
+ };
890
+
841
891
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
842
892
  const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
843
- const isFromGBD = computed(() => !!member.value.gosPersonData);
844
893
  const gbdDocuments = computed(() => {
845
894
  if (hasGBDFLDocSelection && !!member.value.gosPersonData && !!member.value.gosPersonData.documents) {
846
895
  const documents = Array.isArray(member.value.gosPersonData.documents.document)
@@ -866,6 +915,7 @@ export default {
866
915
  case formStore.policyholdersRepresentativeFormKey:
867
916
  return route.params.taskId !== '0';
868
917
  default:
918
+ if (route.query.tab === 'slaveInsuredForm') return true;
869
919
  return false;
870
920
  }
871
921
  };
@@ -902,7 +952,7 @@ export default {
902
952
  };
903
953
  return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
904
954
  });
905
- const hasGBDFLDocSelection = dataStore.isLifetrip && whichForm.value === formStore.policyholderFormKey;
955
+ const hasGBDFLDocSelection = dataStore.isLifetrip;
906
956
  const hasInsis = computed(() => dataStore.controls.hasInsis);
907
957
  const hasGKB = computed(() => {
908
958
  const perMemberCondition = () => {
@@ -973,7 +1023,8 @@ export default {
973
1023
  (whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin) ||
974
1024
  (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage),
975
1025
  );
976
- const hasWorkPositionDict = !useEnv().isProduction && dataStore.isBaiterek && dataStore.isEfoParent;
1026
+ const hasWorkPositionDict = dataStore.isBaiterek;
1027
+ const hasIssuerOther = computed(() => (useEnv().isProduction ? dataStore.isPension : true) && member.value.documentIssuers && member.value.documentIssuers.nameRu === 'Другое');
977
1028
 
978
1029
  const birthDateRule = computed(() => {
979
1030
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
@@ -1048,16 +1099,18 @@ export default {
1048
1099
  });
1049
1100
 
1050
1101
  const getOtpConditionByMember = () => {
1051
- switch (whichForm.value) {
1102
+ const which = whichForm.value as keyof typeof StoreMembers | 'slaveInsuredForm';
1103
+ switch (which) {
1052
1104
  case formStore.policyholderFormKey:
1053
1105
  return route.params.taskId === '0';
1054
1106
  case formStore.insuredFormKey:
1055
- if (dataStore.isPension) return route.params.taskId === '0';
1056
- return route.query.id === '0';
1107
+ case 'slaveInsuredForm':
1057
1108
  case formStore.policyholdersRepresentativeFormKey:
1058
1109
  case formStore.beneficiaryFormKey:
1059
1110
  case formStore.beneficialOwnerFormKey:
1060
1111
  return route.query.id === '0';
1112
+ default:
1113
+ return dataStore.isPension && route.query.id === '0' && formStore.applicationData.processCode === 24;
1061
1114
  }
1062
1115
  };
1063
1116
  const otpCondition = computed(() => {
@@ -1066,13 +1119,14 @@ export default {
1066
1119
  if (whichForm.value === formStore.beneficiaryFormKey && member.value.age !== null && Number(member.value.age) < 18) return false;
1067
1120
  if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) return false;
1068
1121
  if (!member.value.phoneNumber || (member.value.phoneNumber && member.value.phoneNumber.length !== useMask().phone.length)) return false;
1122
+ if (route.query.tab === 'slaveInsuredForm' && route.query.id === '0') return true;
1069
1123
  return getOtpConditionByMember();
1070
1124
  });
1071
1125
 
1072
- const searchMember = async () => {
1126
+ const searchMember = async (title: string = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента') => {
1073
1127
  if (!isDisabled.value) {
1074
1128
  dataStore.panelAction = null;
1075
- dataStore.rightPanel.title = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента';
1129
+ dataStore.rightPanel.title = title;
1076
1130
  dataStore.rightPanel.open = true;
1077
1131
  isSearchOpen.value = true;
1078
1132
  isDocumentOpen.value = false;
@@ -1085,6 +1139,10 @@ export default {
1085
1139
  };
1086
1140
 
1087
1141
  const searchPositions = async () => {
1142
+ if (searchQuery.value.length < 4) {
1143
+ dataStore.showToaster('error', dataStore.t('rules.searchQueryLen', { len: 4 }));
1144
+ return;
1145
+ }
1088
1146
  if (!isDisabled.value) {
1089
1147
  isPanelLoading.value = true;
1090
1148
  positionsList.value = await dataStore.getWorkPosition(searchQuery.value);
@@ -1123,6 +1181,7 @@ export default {
1123
1181
  isPositionPanelOpen.value = false;
1124
1182
  }
1125
1183
  if (type === 'workPosition') {
1184
+ dataStore.rightPanel.title = dataStore.t('form.jobPosition');
1126
1185
  isPositionPanelOpen.value = true;
1127
1186
  isOtpPanelOpen.value = false;
1128
1187
  isDocumentOpen.value = false;
@@ -1252,12 +1311,35 @@ export default {
1252
1311
  }
1253
1312
  };
1254
1313
 
1255
- const attachFile = (event: InputEvent, code?: string) => {
1314
+ const uploadAdditionalFiles = async (processInstanceId: string | number) => {
1315
+ const formData = new FormData();
1316
+ const information: any = [];
1317
+ const uuidV4 = uuid.v4();
1318
+ if (additionalDocuments.value) {
1319
+ Object.values(additionalDocuments.value).map((value: any) => {
1320
+ formData.append('file', value);
1321
+ const ext = value.name.substring(value.name.lastIndexOf('.'));
1322
+ const selectedDocument = dataStore.dicFileTypeList.find((i: Value) => i.code === value.code);
1323
+ information.push({
1324
+ identifier: `${uuidV4}${ext}`,
1325
+ iin: member.value.iin ? member.value.iin.replaceAll('-', '') : null,
1326
+ processInstanceId: processInstanceId,
1327
+ fileTypeCode: selectedDocument ? selectedDocument.code : null,
1328
+ fileTypeId: selectedDocument ? selectedDocument.id : null,
1329
+ fileName: value.name,
1330
+ });
1331
+ });
1332
+ formData.append('fileData', JSON.stringify(information));
1333
+ await dataStore.uploadFiles(formData, false);
1334
+ }
1335
+ };
1336
+
1337
+ const attachFile = (event: InputEvent) => {
1256
1338
  if (event.target) {
1257
- fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
1339
+ fileData.value = { file: (event.target as HTMLInputElement).files };
1258
1340
  } else {
1259
1341
  if (event.dataTransfer) {
1260
- fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
1342
+ fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1261
1343
  }
1262
1344
  }
1263
1345
  };
@@ -1326,7 +1408,7 @@ export default {
1326
1408
  if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1327
1409
  if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1328
1410
  if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1329
- const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Enums.Insis.DocTypes['1UDL']);
1411
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === CoreEnums.Insis.DocTypes['1UDL']);
1330
1412
  if (documentType) member.value.documentType = documentType;
1331
1413
  }
1332
1414
  if (!!parsedDocument.documentIssuer) {
@@ -1351,11 +1433,11 @@ export default {
1351
1433
  }
1352
1434
  };
1353
1435
 
1354
- const getFile = async (type: FileActions) => {
1436
+ const getDoc = async (type: FileActions) => {
1355
1437
  if (memberDocument.value) {
1356
1438
  documentLoading.value = true;
1357
1439
  const fileExtension = memberDocument.value.fileName!.match(/\.([0-9a-z]+)(?:[\?#]|$)/i)![1];
1358
- await dataStore.getFile(memberDocument.value, type, fileExtension);
1440
+ await dataStore.getDoc(memberDocument.value, type, fileExtension);
1359
1441
  documentLoading.value = false;
1360
1442
  }
1361
1443
  };
@@ -1368,6 +1450,9 @@ export default {
1368
1450
  if (formStore.birthInfos.length !== 0) {
1369
1451
  familyDialog.value = true;
1370
1452
  }
1453
+ if (formStore.birthInfos.length === 0 && dataStore.isGons) {
1454
+ familyDialog.value = true;
1455
+ }
1371
1456
  } else {
1372
1457
  familyDialog.value = true;
1373
1458
  }
@@ -1383,10 +1468,23 @@ export default {
1383
1468
  isButtonLoading.value = false;
1384
1469
  dataStore.rightPanel.open = false;
1385
1470
  isSearchOpen.value = false;
1471
+ if (dataStore.isGons) {
1472
+ member.value.chooseChild = '';
1473
+ }
1474
+ };
1475
+
1476
+ const addChild = () => {
1477
+ member.value.resetMember();
1478
+ familyDialog.value = false;
1479
+ selectedFamilyMember.value = dataStore.t('form.addBeneficiary');
1480
+ isButtonLoading.value = false;
1481
+ dataStore.rightPanel.open = false;
1482
+ isSearchOpen.value = false;
1483
+ member.value.chooseChild = dataStore.t('form.addBeneficiary');
1386
1484
  };
1387
1485
 
1388
1486
  const selectFamilyMember = (familyMember: Api.GKB.BirthInfo) => {
1389
- if (selectedFamilyMember.value && selectedFamilyMember.value.childIIN === familyMember.childIIN) {
1487
+ if (selectedFamilyMember.value && typeof selectedFamilyMember.value === 'object' && selectedFamilyMember.value.childIIN === familyMember.childIIN) {
1390
1488
  selectedFamilyMember.value = {};
1391
1489
  } else {
1392
1490
  selectedFamilyMember.value = familyMember;
@@ -1395,6 +1493,19 @@ export default {
1395
1493
  member.value.lastName = selectedFamilyMember.value.childSurName!;
1396
1494
  member.value.middleName = selectedFamilyMember.value.childPatronymic ?? '';
1397
1495
  member.value.birthDate = reformatDate(selectedFamilyMember.value.childBirthDate!);
1496
+ member.value.gender = dataStore.gender.find(i => {
1497
+ if (typeof selectedFamilyMember.value === 'object') {
1498
+ return i.id === selectedFamilyMember.value.childGender;
1499
+ }
1500
+ })!;
1501
+ member.value.relationDegree = dataStore.relations.find(i => {
1502
+ if (typeof selectedFamilyMember.value === 'object') {
1503
+ return selectedFamilyMember.value.childGender === 1 ? i.nameRu === 'Сын' : i.nameRu === 'Дочь';
1504
+ }
1505
+ })!;
1506
+ if (dataStore.isGons) {
1507
+ member.value.chooseChild = `${selectedFamilyMember.value.childSurName} ${selectedFamilyMember.value.childName} ${selectedFamilyMember.value.childPatronymic ? selectedFamilyMember.value.childPatronymic : ''}`;
1508
+ }
1398
1509
  }
1399
1510
  familyDialog.value = false;
1400
1511
  isButtonLoading.value = false;
@@ -1430,7 +1541,9 @@ export default {
1430
1541
 
1431
1542
  const selectGbdDocument = (document: Api.GBD.Document) => {
1432
1543
  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)]);
1544
+ const documentType = dataStore.documentTypes.find(
1545
+ (i: Value) => i.ids === Object.keys(CoreEnums.GBD.DocTypes)[Object.values(CoreEnums.GBD.DocTypes).indexOf(document.type.code)],
1546
+ );
1434
1547
  if (documentType) member.value.documentType = documentType;
1435
1548
  const documentNumber = document.number;
1436
1549
  if (documentNumber) member.value.documentNumber = documentNumber;
@@ -1447,21 +1560,46 @@ export default {
1447
1560
  isSearchOpen.value = false;
1448
1561
  };
1449
1562
 
1563
+ const getContragentClick = async (contragent: ContragentType) => {
1564
+ isButtonLoading.value = true;
1565
+ await dataStore.serializeContragentData(member.value, contragent);
1566
+ fioChooseDialog.value = false;
1567
+ isButtonLoading.value = false;
1568
+ dataStore.rightPanel.open = false;
1569
+ isSearchOpen.value = false;
1570
+ };
1571
+
1450
1572
  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;
1573
+ if (isNonResident.value) {
1574
+ if (!member.value.lastName || !member.value.firstName) {
1575
+ dataStore.showToaster('error', 'Заполните поля Имя и Фамилия', 3000);
1576
+ dataStore.rightPanel.open = false;
1577
+ isSearchOpen.value = false;
1578
+ return;
1579
+ }
1580
+ } else {
1581
+ if (member.value.hasAgreement !== true) {
1582
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
1583
+ dataStore.rightPanel.open = false;
1584
+ isSearchOpen.value = false;
1585
+ return;
1586
+ }
1587
+ if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
1588
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
1589
+ dataStore.rightPanel.open = false;
1590
+ isSearchOpen.value = false;
1591
+ return;
1592
+ }
1462
1593
  }
1463
1594
  isButtonLoading.value = true;
1464
- await dataStore.getContragent(member.value, false);
1595
+ if (isNonResident.value) {
1596
+ const response = await dataStore.getContragent(member.value, false);
1597
+ if (response) contragents.value = response.items;
1598
+ else dataStore.showToaster('error', 'Не найдено совпадений', 3000);
1599
+ fioChooseDialog.value = true;
1600
+ } else {
1601
+ await dataStore.getContragent(member.value, false);
1602
+ }
1465
1603
  isButtonLoading.value = false;
1466
1604
  dataStore.rightPanel.open = false;
1467
1605
  isSearchOpen.value = false;
@@ -1497,10 +1635,11 @@ export default {
1497
1635
  }
1498
1636
  const isInsured = formStore.isPolicyholderInsured;
1499
1637
  const remoteIsInsured = ref<boolean | null>(null);
1638
+ const isNewApplication = route.params.taskId === '0';
1500
1639
  if (whichForm.value == formStore.policyholderFormKey || (dataStore.isPension && whichForm.value == formStore.insuredFormKey)) {
1501
1640
  if (route.params.taskId === '0') {
1502
1641
  try {
1503
- const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 4 : 19) : undefined);
1642
+ const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 25 : 19) : undefined);
1504
1643
  if (typeof taskId === 'string') {
1505
1644
  await dataStore.getApplicationData(taskId, false, false, false, false);
1506
1645
  remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
@@ -1524,6 +1663,13 @@ export default {
1524
1663
  if (fileData.value && fileData.value.file) {
1525
1664
  await uploadFile(formStore.applicationData.processInstanceId);
1526
1665
  }
1666
+ if (additionalDocuments.value && additionalDocuments.value.length) {
1667
+ if (
1668
+ (!formStore.applicationData.isEnpfSum && formStore.applicationData?.pensionApp.transferContracts && formStore.applicationData?.pensionApp.transferContracts.length) ||
1669
+ (formStore.applicationData?.pensionApp.compulsoryProfMonthCount && formStore.applicationData?.pensionApp.compulsoryProfMonthCount >= 60)
1670
+ )
1671
+ await uploadAdditionalFiles(formStore.applicationData.processInstanceId);
1672
+ }
1527
1673
  }
1528
1674
  const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value, whichIndex.value ? Number(whichIndex.value) : undefined);
1529
1675
  if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
@@ -1547,30 +1693,43 @@ export default {
1547
1693
  }
1548
1694
  }
1549
1695
  }
1550
- if (whichForm.value === formStore.insuredFormKey) {
1696
+ if (
1697
+ whichForm.value === formStore.insuredFormKey ||
1698
+ (memberFromApplicaiton &&
1699
+ memberFromApplicaiton.processInstanceId &&
1700
+ formStore.applicationData.slave &&
1701
+ memberFromApplicaiton.processInstanceId === formStore.applicationData.slave.processInstanceId)
1702
+ ) {
1551
1703
  wasInsuredAction.value = true;
1552
1704
  if (dataStore.isPension) {
1553
- formStore.applicationData.pensionApp = {
1705
+ let data = {
1554
1706
  ...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,
1707
+ slave: formStore.applicationData.slave?.pensionApp ?? undefined,
1566
1708
  };
1567
- const data = {
1568
- ...formStore.applicationData.pensionApp,
1569
- transferContractCompany: formStore.applicationData.pensionApp.transferContractCompany?.nameRu ?? null,
1709
+ const bankinfo = {
1710
+ account: member.value.bankInfo.iik ?? '',
1711
+ bankBik: member.value.bankInfo.bik ?? '',
1712
+ bankBin: member.value.bankInfo.bin ? String(member.value.bankInfo.bin).replaceAll('-', '') : '',
1713
+ bankId: Number(member.value.bankInfo.bankName.id) ?? 0,
1714
+ bankName: member.value.bankInfo.bankName.nameRu ?? '',
1570
1715
  };
1716
+ if (route.query.tab === 'slaveInsuredForm') {
1717
+ data.slave = { ...data.slave, ...bankinfo };
1718
+ } else {
1719
+ data = { ...data, ...bankinfo };
1720
+ }
1721
+ const pensionKeysWithSpace = ['compulsoryContractAmount', 'compulsoryProfContractAmount', 'voluntaryContractAmount', 'ownFundsRaisAmount'];
1722
+ pensionKeysWithSpace.forEach(key => {
1723
+ if (/\s/g.test(data[key]) === true) data[key] = formatSpacedNumber(data[key]);
1724
+ });
1725
+ if (data.slave)
1726
+ pensionKeysWithSpace.forEach(key => {
1727
+ if (/\s/g.test(data.slave[key]) === true) data.slave[key] = formatSpacedNumber(data.slave[key]);
1728
+ });
1571
1729
  const isApplicationSaved = await dataStore.setApplication(data);
1730
+ if (!isNewApplication) dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1572
1731
  if (isApplicationSaved === false) return;
1573
- dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1732
+ await dataStore.saveMember(member.value, 'Client', memberFromApplicaiton);
1574
1733
  }
1575
1734
  }
1576
1735
  await router.replace({
@@ -1609,6 +1768,7 @@ export default {
1609
1768
  }
1610
1769
  }
1611
1770
  if (member.value.hasAgreement !== true) {
1771
+ if (isNonResident.value) return true;
1612
1772
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
1613
1773
  return false;
1614
1774
  }
@@ -1623,13 +1783,17 @@ export default {
1623
1783
  isSubmittingForm.value = true;
1624
1784
  const docType = member.value.documentType.ids;
1625
1785
  if (
1786
+ !isNonResident.value &&
1626
1787
  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)
1788
+ (docType === CoreEnums.Insis.DocTypes['1UDL'] ||
1789
+ docType === CoreEnums.Insis.DocTypes.SBI ||
1790
+ docType === CoreEnums.Insis.DocTypes.PS ||
1791
+ docType === CoreEnums.Insis.DocTypes.VNZ)
1628
1792
  ) {
1629
1793
  dataStore.isLoading = true;
1630
1794
  const docTypeCodes = {
1631
1795
  '1UDL': 1,
1632
- PS: 2,
1796
+ PS: 11,
1633
1797
  SBI: 3,
1634
1798
  VNZ: 4,
1635
1799
  };
@@ -1654,11 +1818,11 @@ export default {
1654
1818
  isSubmittingForm.value = false;
1655
1819
  return;
1656
1820
  }
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;
1821
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
1822
+ formStore.pensionApp.account = member.value.bankInfo.iik;
1823
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
1824
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
1825
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1662
1826
  }
1663
1827
  }
1664
1828
  const hasMemberSaved = await saveMember();
@@ -1666,6 +1830,23 @@ export default {
1666
1830
  dataStore.isLoading = false;
1667
1831
  dataStore.showToaster('error', errorMessage, 5000);
1668
1832
  }
1833
+ } else if (isNonResident.value) {
1834
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
1835
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1836
+ if (isValidIik === false) {
1837
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1838
+ member.value.bankInfo.iik = '';
1839
+ isSubmittingForm.value = false;
1840
+ return;
1841
+ }
1842
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
1843
+ formStore.pensionApp.account = member.value.bankInfo.iik;
1844
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
1845
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
1846
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1847
+ }
1848
+ }
1849
+ const hasMemberSaved = await saveMember();
1669
1850
  } else {
1670
1851
  member.value.gotFromInsis = true;
1671
1852
  const hasMemberSaved = await saveMember();
@@ -1819,14 +2000,21 @@ export default {
1819
2000
  }
1820
2001
  if (!member.value.id) {
1821
2002
  await router.replace({ query: { ...route.query, id: 0 } });
2003
+ if (dataStore.isPension) {
2004
+ switch (whichForm.value) {
2005
+ case formStore.insuredFormKey:
2006
+ setSignOfResidency();
2007
+ break;
2008
+ }
2009
+ }
1822
2010
  } else {
1823
2011
  if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1824
2012
  if (dataStore.isLifetrip) {
1825
2013
  const documentByPriority = (() => {
1826
2014
  if (whichForm.value !== formStore.policyholderFormKey || formStore.isPolicyholderInsured === true) {
1827
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes.PS);
2015
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes.PS);
1828
2016
  }
1829
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes['1UDL']);
2017
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes['1UDL']);
1830
2018
  })();
1831
2019
  const userDocument = documentByPriority ? documentByPriority : member.value.documentsList[0];
1832
2020
  const documentType = dataStore.documentTypes.find((i: Value) => i.ids === userDocument.type);
@@ -1837,12 +2025,10 @@ export default {
1837
2025
  member.value.documentDate = reformatDate(userDocument.issueDate);
1838
2026
  member.value.documentExpire = reformatDate(userDocument.expireDate);
1839
2027
  }
1840
-
1841
- // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
2028
+ // const filteredDocuments: DocumentItem[] = dataStore.getDocsByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1842
2029
  // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1843
2030
  }
1844
2031
  await setDefaultValues();
1845
- if (Number(formStore.applicationData.processCode) === 4) dataStore.members.insuredApp.isMultiple = true;
1846
2032
  if (hasWorkPositionDict && member.value.positionCode === null) member.value.jobPosition = null;
1847
2033
  };
1848
2034
  onMounted(async () => {
@@ -1891,8 +2077,33 @@ export default {
1891
2077
  },
1892
2078
  );
1893
2079
 
2080
+ if (dataStore.isGons) {
2081
+ watch(
2082
+ () => member.value.chooseChild,
2083
+ val => {
2084
+ if (val === dataStore.t('form.addBeneficiary')) {
2085
+ const idsToFind = ['14', '15', '21', '20', '24', '25', '27'];
2086
+ const filteredData = dataStore.relations.filter(item => idsToFind.includes(item.ids as string));
2087
+ filteredRelationsData.value = filteredData;
2088
+ } else {
2089
+ filteredRelationsData.value = dataStore.relations;
2090
+ }
2091
+ },
2092
+ { immediate: true },
2093
+ );
2094
+ }
2095
+
2096
+ watch(
2097
+ () => member.value.registrationProvince,
2098
+ (val, oldVal) => {
2099
+ if (val.nameRu !== null && val.nameRu !== oldVal.nameRu && val.ids !== member.value.registrationCity.code) {
2100
+ member.value.registrationCity = new Value();
2101
+ }
2102
+ },
2103
+ );
2104
+
1894
2105
  const onIinInput = () => {
1895
- if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value.isMultiple === true) {
2106
+ if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value?.isMultiple === true) {
1896
2107
  const alreadyInStatement = formStore[whichForm.value as MultipleMember].findIndex((i: Member) => i.iin === member.value.iin);
1897
2108
  if (alreadyInStatement !== -1 && alreadyInStatement !== Number(whichIndex.value)) {
1898
2109
  dataStore.showToaster('error', dataStore.t('toaster.hasAlreadyMember'), 3000);
@@ -1933,13 +2144,14 @@ export default {
1933
2144
  watch(
1934
2145
  () => member.value.age,
1935
2146
  val => {
1936
- if (val && Number(val) >= 18) {
1937
- if (member.value.hasAgreement !== true) {
2147
+ if (val) {
2148
+ if (Number(val) >= 18 && member.value.hasAgreement !== true) {
1938
2149
  member.value.hasAgreement = false;
2150
+ } else {
2151
+ member.value.hasAgreement = true;
1939
2152
  }
1940
- } else {
1941
- member.value.hasAgreement = true;
1942
2153
  }
2154
+
1943
2155
  member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1944
2156
  },
1945
2157
  { immediate: true },
@@ -1955,15 +2167,35 @@ export default {
1955
2167
  );
1956
2168
  }
1957
2169
  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
- );
2170
+ if (member.value.bankInfo) {
2171
+ watch(
2172
+ () => member.value.bankInfo.iik,
2173
+ async val => {
2174
+ if (val && val.length === 20) {
2175
+ if (
2176
+ route.query.tab === 'slaveInsuredForm'
2177
+ ? formStore.insuredForm.some(i => i.bankInfo.iik === val)
2178
+ : formStore.applicationData.processCode === 25 && val === formStore.slaveInsuredForm.bankInfo.iik
2179
+ ) {
2180
+ dataStore.showToaster('error', `ИИК: "${val}" уже имеется в заявке`);
2181
+ member.value.bankInfo = new BankInfoClass();
2182
+ return;
2183
+ }
2184
+ isButtonLoading.value = true;
2185
+ const bank = await dataStore.getBankByAccountNumber(val);
2186
+ if (bank) {
2187
+ member.value.bankInfo.bik = String(bank.code);
2188
+ member.value.bankInfo.bin = member.value.bankInfo.bankName.ids = reformatIin(String(bank.ids));
2189
+ member.value.bankInfo.bankName.nameRu = String(bank.nameRu);
2190
+ member.value.bankInfo.bankName.id = Number(bank.id);
2191
+ } else member.value.bankInfo = new BankInfoClass();
2192
+ isButtonLoading.value = false;
2193
+ } else if (!val) {
2194
+ member.value.bankInfo = new BankInfoClass();
2195
+ }
2196
+ },
2197
+ );
2198
+ }
1967
2199
  watch(
1968
2200
  () => member.value.isDisability,
1969
2201
  val => {
@@ -2000,11 +2232,15 @@ export default {
2000
2232
  familyDialog,
2001
2233
  deletionDialog,
2002
2234
  documentChooseDialog,
2235
+ fioChooseDialog,
2003
2236
  selectedIndex,
2004
2237
  selectedFamilyMember,
2005
2238
  sameAddress,
2006
2239
  isRelative,
2007
2240
  imageDataList,
2241
+ contragents,
2242
+ filteredRelationsData,
2243
+
2008
2244
  // Computed
2009
2245
  whichForm,
2010
2246
  whichIndex,
@@ -2014,7 +2250,6 @@ export default {
2014
2250
  isDisabled,
2015
2251
  isTask,
2016
2252
  isIinPhoneDisabled,
2017
- isFromGBD,
2018
2253
  showSaveButton,
2019
2254
  hasGBDFL,
2020
2255
  hasInsis,
@@ -2026,10 +2261,14 @@ export default {
2026
2261
  hasInsurancePay,
2027
2262
  hasSignOfIPDL,
2028
2263
  hasSameAddressToggle,
2264
+ hasIssuerOther,
2029
2265
  hasMemberSearch,
2030
2266
  hasWorkPositionDict,
2031
2267
  gbdDocuments,
2032
2268
  hasGBDFLDocSelection,
2269
+ isNonResident,
2270
+ isDataFromGov,
2271
+ isChooseChild,
2033
2272
 
2034
2273
  // Rules
2035
2274
  ageRule,
@@ -2038,6 +2277,8 @@ export default {
2038
2277
  birthDateRule,
2039
2278
 
2040
2279
  // Functions
2280
+ getToday,
2281
+ addChild,
2041
2282
  searchMember,
2042
2283
  openPanel,
2043
2284
  openCustomPanel,
@@ -2051,7 +2292,7 @@ export default {
2051
2292
  attachFile,
2052
2293
  attachDocumentReader,
2053
2294
  getDocumentReader,
2054
- getFile,
2295
+ getDoc,
2055
2296
  selectFamilyMember,
2056
2297
  closeFamilyDialog,
2057
2298
  openDeletionDialog,
@@ -2063,6 +2304,7 @@ export default {
2063
2304
  searchPositions,
2064
2305
  selectGbdDocument,
2065
2306
  pickPosition,
2307
+ getContragentClick,
2066
2308
  };
2067
2309
  },
2068
2310
  };