hl-core 0.0.10-beta.7 → 0.0.10-beta.70

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 (49) hide show
  1. package/README.md +0 -2
  2. package/api/base.api.ts +425 -134
  3. package/api/interceptors.ts +162 -62
  4. package/components/Dialog/Dialog.vue +5 -1
  5. package/components/Dialog/DigitalDocumentsDialog.vue +129 -0
  6. package/components/Dialog/FamilyDialog.vue +15 -4
  7. package/components/Form/DigitalDocument.vue +52 -0
  8. package/components/Form/FormSource.vue +30 -0
  9. package/components/Form/ManagerAttachment.vue +85 -11
  10. package/components/Form/ProductConditionsBlock.vue +12 -6
  11. package/components/Input/Datepicker.vue +5 -0
  12. package/components/Input/FileInput.vue +1 -1
  13. package/components/Input/FormInput.vue +7 -0
  14. package/components/Input/OtpInput.vue +25 -0
  15. package/components/Input/RoundedInput.vue +2 -0
  16. package/components/Input/RoundedSelect.vue +2 -0
  17. package/components/Input/TextAreaField.vue +71 -0
  18. package/components/Input/TextHint.vue +13 -0
  19. package/components/Layout/SettingsPanel.vue +2 -1
  20. package/components/Menu/MenuNav.vue +2 -1
  21. package/components/Pages/Anketa.vue +207 -176
  22. package/components/Pages/Auth.vue +10 -3
  23. package/components/Pages/ContragentForm.vue +24 -18
  24. package/components/Pages/Documents.vue +488 -66
  25. package/components/Pages/MemberForm.vue +1009 -268
  26. package/components/Pages/ProductConditions.vue +1424 -273
  27. package/components/Panel/PanelHandler.vue +329 -126
  28. package/components/Utilities/Chip.vue +1 -1
  29. package/components/Utilities/JsonViewer.vue +1 -2
  30. package/composables/classes.ts +136 -20
  31. package/composables/constants.ts +168 -1
  32. package/composables/index.ts +467 -9
  33. package/composables/styles.ts +8 -24
  34. package/configs/i18n.ts +2 -0
  35. package/configs/pwa.ts +1 -7
  36. package/layouts/clear.vue +1 -1
  37. package/layouts/default.vue +2 -2
  38. package/layouts/full.vue +1 -1
  39. package/locales/kz.json +1239 -0
  40. package/locales/ru.json +133 -21
  41. package/nuxt.config.ts +8 -6
  42. package/package.json +14 -13
  43. package/plugins/head.ts +7 -1
  44. package/plugins/helperFunctionsPlugins.ts +1 -0
  45. package/store/data.store.ts +1080 -552
  46. package/store/member.store.ts +19 -8
  47. package/store/rules.ts +75 -8
  48. package/types/enum.ts +52 -2
  49. package/types/index.ts +143 -6
@@ -35,7 +35,7 @@
35
35
  v-model="formStore.applicationData.insuredApp.iin"
36
36
  :maska="$maska.iin"
37
37
  :readonly="isDisabled"
38
- :clearable="false"
38
+ :clearable="!isDisabled"
39
39
  :label="$dataStore.t('pension.insuredIIN')"
40
40
  append-inner-icon="mdi mdi-chevron-right"
41
41
  @append="searchMember"
@@ -44,6 +44,7 @@
44
44
  </base-fade-transition>
45
45
  </base-form-section>
46
46
  <base-form-section
47
+ v-if="$dataStore.hasPersonalDataSection(whichForm)"
47
48
  :title="$dataStore.t('form.personalData')"
48
49
  :class="[memberSetting && memberSetting.has === true && memberSetting.isMultiple === true ? 'rounded-t-0 !mt-[-5px]' : 'mt-[14px]']"
49
50
  >
@@ -58,61 +59,88 @@
58
59
  append-inner-icon="mdi mdi-chevron-right"
59
60
  @append="openPanel($dataStore.t('form.signOfResidency'), [], 'signOfResidency', $dataStore.getResidents)"
60
61
  />
62
+ <base-panel-input
63
+ v-if="hasGKB"
64
+ v-model="member.relationDegree"
65
+ :value="member.relationDegree?.nameRu"
66
+ :readonly="isDisabled"
67
+ :clearable="!isDisabled"
68
+ :label="$dataStore.t('form.relations')"
69
+ :rules="$rules.objectRequired"
70
+ append-inner-icon="mdi mdi-chevron-right"
71
+ @append="openPanel($dataStore.t('form.relations'), filteredRelationsData, 'relationDegree')"
72
+ />
61
73
  <base-form-toggle
62
74
  v-if="$dataStore.isLifetrip && whichForm === 'insuredForm'"
63
75
  v-model="member.isInsuredUnderage"
64
76
  :title="$dataStore.t('isInsuredUnderage')"
65
77
  :has-border="false"
66
78
  />
79
+ <base-panel-input
80
+ v-if="whichForm === formStore.beneficiaryFormKey && ($dataStore.isGons || $dataStore.isBolashak)"
81
+ v-model="member.chooseChild"
82
+ :value="member.chooseChild"
83
+ :label="$dataStore.t('form.chooseChild')"
84
+ :readonly="isDisabled"
85
+ :clearable="!isDisabled"
86
+ append-inner-icon="mdi mdi-chevron-right"
87
+ @append="getFamilyInfo"
88
+ />
67
89
  <base-form-input
90
+ :key="String(member.signOfResidency.nameRu)"
68
91
  v-model="member.phoneNumber"
69
92
  :label="$dataStore.t('form.phoneNumber')"
70
- :maska="$maska.phone"
93
+ :maska="$dataStore.isPension && member.signOfResidency.nameRu === 'Нерезидент' ? $maska.phoneNonResident : $maska.phone"
71
94
  :readonly="!!isDisabled || !!isIinPhoneDisabled"
72
- :clearable="!isDisabled"
95
+ :clearable="!isDisabled && !isIinPhoneDisabled"
73
96
  :append-inner-icon="otpCondition ? `${$dataStore.isPension ? 'mdi-message-text' : 'mdi mdi-phone-message'}` : ''"
74
97
  @append="openCustomPanel('otp')"
75
98
  @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
76
99
  :rules="phoneRule"
77
100
  />
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
- />
101
+ <base-animation>
102
+ <base-form-input
103
+ v-if="!isNonResident"
104
+ v-model="member.iin"
105
+ :label="$dataStore.t('form.iin')"
106
+ :maska="$maska.iin"
107
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin"
108
+ :clearable="!isDisabled && !isIinPhoneDisabled && !member.parsedDocument?.iin"
109
+ :append-inner-icon="hasMemberSearch || !isNonResident ? 'mdi mdi-magnify' : ''"
110
+ @append="searchMember"
111
+ @input="onIinInput"
112
+ :rules="isNonResident ? [] : $rules.required.concat($rules.iinRight)"
113
+ />
114
+ </base-animation>
89
115
  <base-form-input
90
116
  v-model.trim="member.lastName"
91
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.lastName"
92
- :clearable="!isDisabled"
117
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.lastName"
118
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.lastName"
93
119
  :label="$dataStore.t('form.lastName')"
94
120
  :rules="$rules.required.concat($rules.cyrillic)"
95
121
  />
96
122
  <base-form-input
97
123
  v-model.trim="member.firstName"
98
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.firstName"
99
- :clearable="!isDisabled"
124
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.firstName"
125
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.firstName"
100
126
  :label="$dataStore.t('form.firstName')"
101
127
  :rules="$rules.required.concat($rules.cyrillic)"
128
+ :append-inner-icon="isNonResident ? 'mdi mdi-magnify' : ''"
129
+ @append="searchMember"
102
130
  />
103
131
  <base-form-input
104
132
  v-if="hasMiddleName"
105
133
  v-model.trim="member.middleName"
106
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.middleName"
107
- :clearable="!isDisabled"
134
+ :readonly="isDisabled || !!member.parsedDocument?.middleName || (isDataFromGov && !middleNameIsEditable)"
135
+ :clearable="(!isDisabled && !member.parsedDocument?.middleName && !isDataFromGov) || !!middleNameIsEditable"
108
136
  :label="$dataStore.t('form.middleName')"
109
137
  :rules="$rules.cyrillicNonRequired"
110
138
  />
111
139
  <base-form-input
112
140
  v-if="$dataStore.isLifetrip"
113
141
  v-model.trim="member.lastNameLat"
114
- :readonly="isDisabled || isFromGBD"
115
- :clearable="!isDisabled"
142
+ :readonly="isDisabled || isDataFromGov"
143
+ :clearable="!isDisabled && !isDataFromGov"
116
144
  :label="$dataStore.t('form.lastNameLat')"
117
145
  :rules="$rules.required.concat($rules.latin)"
118
146
  :hint="$dataStore.t('labels.checkWithDoc')"
@@ -120,16 +148,16 @@
120
148
  <base-form-input
121
149
  v-if="$dataStore.isLifetrip"
122
150
  v-model.trim="member.firstNameLat"
123
- :readonly="isDisabled || isFromGBD"
124
- :clearable="!isDisabled"
151
+ :readonly="isDisabled || isDataFromGov"
152
+ :clearable="!isDisabled && !isDataFromGov"
125
153
  :label="$dataStore.t('form.firstNameLat')"
126
154
  :rules="$rules.required.concat($rules.latin)"
127
155
  :hint="$dataStore.t('labels.checkWithDoc')"
128
156
  />
129
157
  <base-form-input
130
158
  v-model="member.birthDate"
131
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.birthDate"
132
- :clearable="!isDisabled"
159
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.birthDate"
160
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.birthDate"
133
161
  :label="$dataStore.t('form.birthDate')"
134
162
  :rules="birthDateRule"
135
163
  :maska="$maska.date"
@@ -157,12 +185,12 @@
157
185
  @append="openPanel($dataStore.t('form.Country'), [], 'birthPlace', $dataStore.getCountries)"
158
186
  />
159
187
  </div>
160
- <base-form-input v-if="!$dataStore.isPension" v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule" />
188
+ <base-form-input v-if="!$dataStore.isPension" v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="false" :rules="ageRule" />
161
189
  <base-panel-input
162
190
  v-model="member.gender"
163
191
  :value="member.gender?.nameRu"
164
- :readonly="isDisabled || isFromGBD"
165
- :clearable="!isDisabled && !isFromGBD"
192
+ :readonly="isDisabled || isDataFromGov"
193
+ :clearable="!isDisabled && !isDataFromGov"
166
194
  :label="$dataStore.t('form.gender')"
167
195
  :rules="$rules.objectRequired"
168
196
  append-inner-icon="mdi mdi-chevron-right"
@@ -183,12 +211,12 @@
183
211
  v-if="hasRelationDegree"
184
212
  v-model="member.relationDegree"
185
213
  :value="member.relationDegree?.nameRu"
186
- :readonly="isDisabled"
187
- :clearable="!isDisabled"
214
+ :readonly="isDisabled || !isChooseChild"
215
+ :clearable="!isDisabled && !!isChooseChild"
188
216
  :label="$dataStore.t('form.relations')"
189
217
  :rules="$rules.objectRequired"
190
218
  append-inner-icon="mdi mdi-chevron-right"
191
- @append="openPanel($dataStore.t('form.relations'), [], 'relationDegree', $dataStore.getRelationTypes)"
219
+ @append="openPanel($dataStore.t('form.relations'), filteredRelationsData, 'relationDegree')"
192
220
  />
193
221
  <base-form-input
194
222
  v-if="whichForm === formStore.beneficiaryFormKey"
@@ -199,8 +227,11 @@
199
227
  :rules="$rules.required.concat($rules.numbers)"
200
228
  />
201
229
  </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" />
230
+ <base-form-section
231
+ v-if="$dataStore.isPension && (whichForm === formStore.insuredFormKey || $route.query.tab === 'slaveInsuredForm')"
232
+ :title="$dataStore.t('pension.disabilityInfo')"
233
+ >
234
+ <base-form-toggle v-model="member.isDisability" :title="$dataStore.t('pension.ifHasDisabilityAlways')" :disabled="isDisabled" :has-border="false" />
204
235
  <base-animation>
205
236
  <base-panel-input
206
237
  v-if="member.isDisability"
@@ -256,8 +287,9 @@
256
287
  :label="$dataStore.t('form.documentDate')"
257
288
  :readonly="isDisabled"
258
289
  :clearable="!isDisabled"
259
- :rules="$rules.date"
290
+ :rules="$rules.date.concat($rules.checkPastOrToday)"
260
291
  :maska="$maska.date"
292
+ :max-date="getToday()"
261
293
  append-inner-icon="mdi mdi-calendar-blank-outline"
262
294
  />
263
295
  <base-form-input
@@ -265,8 +297,9 @@
265
297
  :label="$dataStore.t('form.documentExpire')"
266
298
  :readonly="isDisabled"
267
299
  :clearable="!isDisabled"
268
- :rules="$rules.date"
300
+ :rules="$rules.date.concat($rules.checkTodayOrFuture)"
269
301
  :maska="$maska.date"
302
+ :min-date="getToday()"
270
303
  append-inner-icon="mdi mdi-calendar-blank-outline"
271
304
  />
272
305
  <base-form-input v-model.trim="member.migrationCard" :label="$dataStore.t('policyholdersRepresentative.numberVisa')" />
@@ -331,10 +364,10 @@
331
364
  v-if="hasWorkPositionDict"
332
365
  v-model.trim="member.jobPosition"
333
366
  :label="$dataStore.t('form.jobPosition')"
334
- :readonly="isDisabled || member.positionCode !== 'other'"
335
367
  :clearable="!isDisabled"
336
368
  :rules="$rules.required"
337
369
  append-inner-icon="mdi-chevron-right"
370
+ readonly
338
371
  @click="openCustomPanel('workPosition')"
339
372
  />
340
373
  <base-form-input
@@ -347,7 +380,7 @@
347
380
  />
348
381
  <base-form-input v-model.trim="member.jobPlace" :label="$dataStore.t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
349
382
  </base-form-section>
350
- <base-form-section :title="$dataStore.t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
383
+ <base-form-section v-if="$dataStore.hasPlaceRegistrationSection(whichForm)" :title="$dataStore.t('form.placeRegistration')">
351
384
  <base-form-toggle v-if="hasSameAddressToggle" v-model="sameAddress" :disabled="isDisabled" :has-border="false" :title="$dataStore.t('form.sameAddress')" />
352
385
  <base-panel-input
353
386
  v-model="member.registrationCountry"
@@ -365,9 +398,9 @@
365
398
  v-model="member.registrationProvince"
366
399
  :value="member.registrationProvince?.nameRu"
367
400
  :label="$dataStore.t('form.Province')"
368
- :readonly="isDisabled"
369
- :clearable="!isDisabled"
370
- :rules="$rules.objectRequired"
401
+ :readonly="isDisabled || isRegionDisabled"
402
+ :clearable="!isDisabled && !isRegionDisabled"
403
+ :rules="isRegionDisabled ? [] : $rules.objectRequired"
371
404
  append-inner-icon="mdi mdi-chevron-right"
372
405
  @append="openPanel($dataStore.t('form.Province'), [], 'registrationProvince', $dataStore.getStates, 'registrationCountry')"
373
406
  />
@@ -415,7 +448,7 @@
415
448
  />
416
449
  <base-form-input
417
450
  v-model.trim="member.registrationNumberHouse"
418
- :rules="$rules.required"
451
+ :rules="[...$rules.required, $rules.lengthLimit(member.registrationNumberHouse, 10)]"
419
452
  :readonly="isDisabled"
420
453
  :clearable="!isDisabled"
421
454
  :label="$dataStore.t('form.NumberHouse')"
@@ -447,7 +480,7 @@
447
480
  @append="openPanel($dataStore.t('form.Region'), [], 'birthRegion', $dataStore.getRegions)"
448
481
  /> -->
449
482
  </base-form-section>
450
- <base-form-section :title="$dataStore.t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
483
+ <base-form-section v-if="$dataStore.hasDocumentDataSection(whichForm)" :title="$dataStore.t('form.documentData')">
451
484
  <base-panel-input
452
485
  v-if="gbdDocuments && gbdDocuments.length"
453
486
  value="Список документов из ГБДФЛ"
@@ -461,8 +494,8 @@
461
494
  v-model="member.documentType"
462
495
  :value="member.documentType?.nameRu"
463
496
  :label="$dataStore.t('form.documentType')"
464
- :readonly="isDisabled"
465
- :clearable="!isDisabled"
497
+ :readonly="isDisabled || isDataFromGov"
498
+ :clearable="!isDisabled && !isDataFromGov"
466
499
  :rules="$rules.objectRequired"
467
500
  append-inner-icon="mdi mdi-chevron-right"
468
501
  @append="openPanel($dataStore.t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
@@ -470,8 +503,8 @@
470
503
  <base-form-input
471
504
  v-model.trim="member.documentNumber"
472
505
  :label="$dataStore.t('form.documentNumber')"
473
- :readonly="isDisabled || !!member.parsedDocument?.documentNumber"
474
- :clearable="!isDisabled"
506
+ :readonly="isDisabled || !!member.parsedDocument?.documentNumber || isDataFromGov"
507
+ :clearable="!isDisabled && !member.parsedDocument?.documentNumber && !isDataFromGov"
475
508
  :rules="$rules.required"
476
509
  />
477
510
  <!-- <base-file-input v-if="!memberDocument" :disabled="isDisabled" :clearable="!isDisabled" @input="attachFile($event)" />
@@ -483,17 +516,42 @@
483
516
  v-model="member.documentIssuers"
484
517
  :value="member.documentIssuers?.nameRu"
485
518
  :label="$dataStore.t('form.documentIssuers')"
486
- :readonly="isDisabled || !!member.parsedDocument?.documentIssuer"
487
- :clearable="!isDisabled"
519
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssuer || (isDataFromGov && !documentIssuerIsEditable)"
520
+ :clearable="(!isDisabled && !member.parsedDocument?.documentIssuer && !isDataFromGov) || !!documentIssuerIsEditable"
488
521
  :rules="$rules.objectRequired"
489
522
  append-inner-icon="mdi mdi-chevron-right"
490
523
  @append="openPanel($dataStore.t('form.documentIssuers'), [], 'documentIssuers', $dataStore.getDocumentIssuers)"
491
524
  />
525
+ <base-animation>
526
+ <div v-if="hasIssuerOther" class="flex flex-col gap-[1px]">
527
+ <base-form-input
528
+ v-model="member.documentIssuers.issuerOtherName"
529
+ :label="$dataStore.t('form.issuerOtherName')"
530
+ :readonly="isDisabled"
531
+ :clearable="!isDisabled"
532
+ :rules="$rules.required.concat($rules.onlySymbols)"
533
+ />
534
+ <base-form-input
535
+ v-model="member.documentIssuers.issuerOtherNameOrig"
536
+ :label="$dataStore.t('form.issuerOtherNameOrig')"
537
+ :readonly="isDisabled"
538
+ :clearable="!isDisabled"
539
+ :rules="$rules.required"
540
+ />
541
+ <base-form-input
542
+ v-model="member.documentIssuers.issuerOtherNameRu"
543
+ :label="$dataStore.t('form.issuerOtherNameRu')"
544
+ :readonly="isDisabled"
545
+ :clearable="!isDisabled"
546
+ :rules="$rules.required.concat($rules.cyrillic)"
547
+ />
548
+ </div>
549
+ </base-animation>
492
550
  <base-form-input
493
551
  v-model="member.documentDate"
494
552
  :label="$dataStore.t('form.documentDate')"
495
- :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate"
496
- :clearable="!isDisabled"
553
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate || isDataFromGov"
554
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssueDate && !isDataFromGov"
497
555
  :rules="$rules.required.concat($rules.date)"
498
556
  :maska="$maska.date"
499
557
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -503,8 +561,8 @@
503
561
  v-if="member.documentType.ids !== 'SBI'"
504
562
  v-model="member.documentExpire"
505
563
  :label="$dataStore.t('form.documentExpire')"
506
- :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate"
507
- :clearable="!isDisabled"
564
+ :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate || isDataFromGov"
565
+ :clearable="!isDisabled && !member.parsedDocument?.documentExpireDate && !isDataFromGov"
508
566
  :rules="$rules.required.concat($rules.date)"
509
567
  :maska="$maska.date"
510
568
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -601,47 +659,19 @@
601
659
  v-model="member.bankInfo.bankName"
602
660
  :value="member.bankInfo.bankName.nameRu"
603
661
  :label="$dataStore.t('clients.form.nameBank')"
604
- :readonly="isDisabled"
605
- :clearable="!isDisabled"
662
+ :readonly="true"
663
+ :clearable="false"
606
664
  :rules="$rules.objectRequired"
607
- append-inner-icon="mdi mdi-chevron-right"
608
- @append="openPanel($dataStore.t('clients.form.nameBank'), [], 'bankInfo', $dataStore.getBanks, '', 'bankName')"
609
665
  />
610
666
  <base-form-input
611
667
  v-model.trim="member.bankInfo.bin"
612
- :label="$dataStore.t('form.bin')"
613
668
  :maska="$maska.iin"
614
- :readonly="isDisabled"
615
- :clearable="!isDisabled"
669
+ :label="$dataStore.t('form.bin')"
670
+ :readonly="true"
671
+ :clearable="false"
616
672
  :rules="$rules.required.concat($rules.iinRight)"
617
673
  />
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
- />
674
+ <base-form-input v-model="member.bankInfo.bik" :label="$dataStore.t('clients.form.bik')" :readonly="true" :clearable="false" :rules="$rules.required" />
645
675
  </base-form-section>
646
676
  <base-form-section :title="$dataStore.t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
647
677
  <base-form-input
@@ -655,6 +685,24 @@
655
685
  />
656
686
  <base-form-input v-model.trim="member.email" :label="$dataStore.t('form.email')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.email" />
657
687
  </base-form-section>
688
+ <base-form-section
689
+ v-if="$dataStore.isMycar && whichForm === formStore.beneficiaryFormKey"
690
+ :title="$dataStore.t('form.personalData')"
691
+ >
692
+ <base-form-input
693
+ v-model="member.iin"
694
+ :label="$dataStore.t('form.bin')"
695
+ :maska="$maska.iin"
696
+ :readonly="true"
697
+ :clearable="false"
698
+ />
699
+ <base-form-input
700
+ v-model.trim="member.lastName"
701
+ :readonly="true"
702
+ :clearable="false"
703
+ :label="$dataStore.t('aml.legalName')"
704
+ />
705
+ </base-form-section>
658
706
  </v-form>
659
707
  <base-btn v-if="showSaveButton" :loading="isButtonLoading || isSubmittingForm" :text="$dataStore.t('buttons.save')" @click="submitForm" />
660
708
  <Teleport v-if="isPanelOpen" to="#right-panel-actions">
@@ -675,45 +723,38 @@
675
723
  </Teleport>
676
724
  <Teleport v-if="isSearchOpen" to="#right-panel-actions">
677
725
  <div :class="[$styles.flexColNav]">
678
- <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
679
- <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
680
- <base-btn v-if="hasGKB" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGKB')" @click="getFamilyInfo" />
681
- <base-form-section v-if="hasDocumentReader" class="!mt-0">
682
- <base-file-input
683
- :disabled="isDisabled"
684
- :clearable="!isDisabled"
685
- accept="image/*,.pdf"
686
- append="mdi-credit-card-scan-outline"
687
- :multiple="true"
688
- @onClear="imageDataList = []"
689
- @input="attachDocumentReader($event)"
690
- />
691
- </base-form-section>
692
- <base-animation>
693
- <base-btn v-if="hasDocumentReader && imageDataList && !!imageDataList.length" :loading="isButtonLoading" text="Получить данные" @click="getDocumentReader" />
694
- </base-animation>
726
+ <b class="d-block text-[14px] text-center">Получение персональных данных</b>
727
+ <b class="text-[12px]">Выберите тип:</b>
728
+ <div class="flex flex-col gap-[30px]">
729
+ <base-btn v-if="hasGBDFL" :loading="isButtonLoading" class="before-divider" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
730
+ <base-btn v-if="hasInsis" :loading="isButtonLoading" class="before-divider" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
731
+ <div v-if="hasDigitalDocument" class="before-divider">
732
+ <small class="mb-1 d-block leading-tight">Внимание, выберите этот вариант если не приходит смс от 1414</small>
733
+ <base-btn :loading="isButtonLoading" :text="$dataStore.t('buttons.fromDD')" @click="startGettingDigitalDocument" />
734
+ </div>
735
+ <base-btn v-if="hasGKB" :loading="isButtonLoading" class="before-divider" :text="$dataStore.t('buttons.childData')" @click="getFamilyInfo" />
736
+ <base-btn v-if="isNonResident" :loading="isButtonLoading" class="before-divider" :text="$dataStore.t('buttons.searchByFio')" @click="getContragent" />
737
+ </div>
695
738
  </div>
696
739
  </Teleport>
697
740
  <Teleport v-if="isDocumentOpen" to="#right-panel-actions">
698
741
  <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')" />
742
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getDoc('view')" />
743
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getDoc('download')" />
701
744
  </div>
702
745
  </Teleport>
703
746
  <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#right-panel-actions">
704
747
  <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>
748
+ <base-animation>
749
+ <div v-if="otpCondition && member.otpTokenId" class="flex flex-col">
750
+ <base-form-section class="mt-0 py-2">
751
+ <base-otp-input v-model="member.otpCode" :length="4" @keyup.enter.prevent="hasOtp && checkOtp()" @input="onOtpCodeInput" />
752
+ </base-form-section>
753
+ <span class="text-center cursor-pointer mt-2" :class="[$styles.mutedText]" @click="sendOtp(false)"
754
+ >Не получили код? <span class="underline underline-offset-2">Отправить код заново</span></span
755
+ >
756
+ </div>
757
+ </base-animation>
717
758
  <base-btn v-if="!member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.sendOtp')" @click="sendOtp(false)" />
718
759
  <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.check')" @click="checkOtp()" />
719
760
  </div>
@@ -721,12 +762,12 @@
721
762
  <Teleport v-if="isPositionPanelOpen" to="#right-panel-actions">
722
763
  <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
723
764
  <base-rounded-input
724
- v-model="searchQuery"
725
- :label="$dataStore.t('labels.search')"
765
+ v-model.trim="searchQuery"
766
+ label="Выполните поиск должностей"
726
767
  class="w-full p-2"
727
768
  :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'"
769
+ :rules="[searchQuery.length < 4 ? $dataStore.t('rules.searchQueryLen', { len: 4 }) : true]"
770
+ append-inner-icon="mdi mdi-magnify"
730
771
  @append="searchPositions"
731
772
  />
732
773
  <base-animation>
@@ -745,7 +786,7 @@
745
786
  />
746
787
  </div>
747
788
  <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' })" />
789
+ <!-- <base-btn :text="$dataStore.t('buttons.add')" @click="pickPosition({ workPositionName: searchQuery, workPositionCode: 'other' })" /> -->
749
790
  <span :class="[$styles.mutedText]">{{ $dataStore.t('toaster.notFound') }}</span>
750
791
  </div>
751
792
  </base-animation>
@@ -763,9 +804,68 @@
763
804
  @yes="deleteMember"
764
805
  @no="deletionDialog = false"
765
806
  />
766
- <base-dialog v-model="familyDialog" :subtitle="$dataStore.t('dialog.familyMember')" :icon="{ mdi: 'hand-pointing-up' }" actions="familyDialog">
807
+ <base-dialog
808
+ v-model="familyDialog"
809
+ :subtitle="isOwnChild ? $dataStore.t('dialog.familyMember') : $dataStore.t('dialog.enterParentIin')"
810
+ :icon="{ mdi: 'hand-pointing-up' }"
811
+ actions="familyDialog"
812
+ >
767
813
  <template #actions>
768
- <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" />
814
+ <div class="flex flex-col gap-[36px] w-full">
815
+ <base-rounded-input
816
+ v-if="!isOwnChild"
817
+ v-model="parentIin"
818
+ :label="$dataStore.t('labels.parentIin')"
819
+ class="p-2 w-full h-[60px]"
820
+ :hide-details="true"
821
+ :maska="$maska.iin"
822
+ :readonly="childrenLoaded"
823
+ :clearable="false"
824
+ />
825
+ <v-list lines="two" v-if="formStore.children && formStore.children.length" class="w-full !py-0">
826
+ <v-list-item
827
+ v-for="familyMember of formStore.children"
828
+ :key="familyMember.id"
829
+ @click="selectedFamilyMember = familyMember"
830
+ :append-icon="
831
+ familyMember && selectedFamilyMember && typeof selectedFamilyMember === 'object' && selectedFamilyMember.id === familyMember.id
832
+ ? `mdi-radiobox-marked ${$styles.greenText}`
833
+ : 'mdi-radiobox-blank text-[#636363]'
834
+ "
835
+ >
836
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">
837
+ {{ `${familyMember.lastName} ${familyMember.firstName} ${familyMember.middleName ? familyMember.middleName : ''}` }}
838
+ </v-list-item-title>
839
+ <v-list-item-subtitle :class="[$styles.textSimple]">
840
+ <span>{{ `${$dataStore.t('form.birthDate')}:` }}</span>
841
+ {{ `${reformatDate(familyMember.birthDate!)}` }}
842
+ </v-list-item-subtitle>
843
+ </v-list-item>
844
+ </v-list>
845
+ <base-list-empty v-if="isEmpty" />
846
+ <div class="flex gap-4">
847
+ <base-btn class="px-6" size="sm" :text="$dataStore.t('confirm.cancel')" :btn="$styles.whiteBorderBtn" :classes="$styles.blueText" @click="closeFamilyDialog" />
848
+ <base-btn
849
+ v-if="isOwnChild || (!isOwnChild && childrenLoaded)"
850
+ class="px-6"
851
+ size="sm"
852
+ text="Подтвердить"
853
+ :btn="$styles.blueBtn"
854
+ :loading="$dataStore.isButtonsLoading"
855
+ @click="selectFamilyMember"
856
+ />
857
+ <base-btn
858
+ v-if="!isOwnChild && !childrenLoaded"
859
+ class="px-6"
860
+ size="sm"
861
+ text="Отправить запрос"
862
+ :btn="$styles.blueBtn"
863
+ :loading="$dataStore.isButtonsLoading"
864
+ :disabled="$maska.iin.length !== parentIin.length"
865
+ @click="getChildren"
866
+ />
867
+ </div>
868
+ </div>
769
869
  </template>
770
870
  </base-dialog>
771
871
  <base-dialog v-model="documentChooseDialog" :subtitle="$dataStore.t('labels.chooseDoc')" :icon="{ mdi: 'file-document-outline' }" actions="documentChooseDialog">
@@ -783,18 +883,70 @@
783
883
  <base-list-empty class="w-full" v-else @click="documentChooseDialog = false" />
784
884
  </template>
785
885
  </base-dialog>
886
+ <base-dialog
887
+ v-model="fioChooseDialog"
888
+ :title="$dataStore.t('pension.contragentSelect')"
889
+ :icon="{ mdi: 'format-list-bulleted-type', color: '#A0B3D8' }"
890
+ actions="fioChooseDialog"
891
+ :persistent="false"
892
+ >
893
+ <template #actions>
894
+ <v-list lines="two" v-if="contragents && contragents.length" class="w-full !py-0">
895
+ <v-list-item v-for="person of contragents" :key="person.id" @click="getContragentClick(person)">
896
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">
897
+ {{ person.longName }}
898
+ </v-list-item-title>
899
+ <v-list-item-subtitle :class="[$styles.textSimple]">
900
+ {{ reformatDate(person.birthDate) }} - {{ person.genderName }} - Рег: {{ reformatDate(person.registrationDate) }}
901
+ </v-list-item-subtitle>
902
+ </v-list-item>
903
+ </v-list>
904
+ <base-list-empty class="w-full" v-else @click="fioChooseDialog = false" />
905
+ </template>
906
+ </base-dialog>
907
+ <base-dialog
908
+ v-model="$dataStore.quitDialog"
909
+ :title="$dataStore.t('dialog.exit')"
910
+ :subtitle="$dataStore.t('dialog.dataWillNotSave')"
911
+ :confirm="$dataStore.t('confirm.yes')"
912
+ :icon="{ mdi: 'delete-outline', color: '#FD2D39' }"
913
+ @yes="discardAndContinue"
914
+ @no="stayHere"
915
+ />
916
+ <base-dialog
917
+ v-model="digitalDocumentDialog"
918
+ title="Получить цифровой документ"
919
+ subtitle="Выберите тип документа и введите код"
920
+ :icon="{ mdi: 'file-document', color: '#A0B3D8' }"
921
+ actions="digitalDocumentDialog"
922
+ :persistent="false"
923
+ >
924
+ <template #actions>
925
+ <base-digital-documents-dialog
926
+ :document-items="documentItems"
927
+ :loading="documentLoading"
928
+ :otp-send-disabled="$dataStore.isLifetrip && digitalDocumentOwnerType === 'child'"
929
+ @getCode="getCode"
930
+ @getDigitalDocument="getDigitalDocument"
931
+ @updateDigitalDocuments="updateDigitalDocuments"
932
+ />
933
+ </template>
934
+ </base-dialog>
786
935
  </section>
787
936
  <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')" />
788
937
  </template>
789
938
 
790
939
  <script lang="ts">
940
+ import { onBeforeRouteLeave } from 'vue-router';
791
941
  import { Value, DocumentItem, Member } from '../../composables/classes';
792
942
  import { uuid } from 'vue-uuid';
793
- import { StoreMembers, Enums } from '../../types/enum';
794
- import type { Api, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
943
+ import { StoreMembers, CoreEnums } from '../../types/enum';
944
+ import type { DigitalDocNames, DigitalDocTypes } from '../../types';
945
+ import type { Api, ContragentType, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
795
946
 
796
947
  export default {
797
- setup() {
948
+ emits: ['updateTab'],
949
+ setup(_: any, { emit }: any) {
798
950
  const vForm = ref<any>();
799
951
  const route = useRoute();
800
952
  const router = useRouter();
@@ -803,9 +955,10 @@ export default {
803
955
  const memberStore = useMemberStore();
804
956
  const whichForm = computed(() => route.query.tab as keyof typeof StoreMembers);
805
957
  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))!;
958
+ const getMember = (whichForm: keyof typeof StoreMembers | 'slaveInsuredForm', whichIndex?: string) =>
959
+ memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
807
960
  const member = ref(getMember(whichForm.value, whichIndex.value));
808
- const selectedFamilyMember = ref<Api.GKB.BirthInfo>({});
961
+ const selectedFamilyMember = ref<Api.Child>({});
809
962
  const isPanelOpen = ref<boolean>(false);
810
963
  const memberDocument = ref<DocumentItem>();
811
964
  const isButtonLoading = ref<boolean>(false);
@@ -818,9 +971,41 @@ export default {
818
971
  const isPositionPanelOpen = ref<boolean>(false);
819
972
  const isPanelLoading = ref<boolean>(false);
820
973
  const isChangingMember = ref<boolean>(false);
974
+ const isNonResident = computed(() => dataStore.isPension && member.value.signOfResidency.ids === '500011.2');
975
+ const initialMember = ref<Member>(new Member());
976
+ const pendingRoute = ref<any>(null);
977
+ const subMemberRoute = ref<any>(null);
978
+ const isReady = ref(false);
979
+ if (member.value.id === 0) {
980
+ setTimeout(() => {
981
+ isReady.value = true;
982
+ }, 1000);
983
+ } else {
984
+ initialMember.value = JSON.parse(JSON.stringify(member.value));
985
+ nextTick(() => {
986
+ isReady.value = true;
987
+ });
988
+ }
989
+ // временное отключение сервиса, соответственно ручной ввод тоже
990
+ // member.value.verifyType === 'GBDFL' || member.value.verifyType === 'ESBD' || !!member.value.gosPersonData
991
+ const isDataFromGov = computed(() => {
992
+ if (dataStore.isAulettiParent) {
993
+ return false;
994
+ }
995
+ if (dataStore.isPension && member.value.signOfResidency.nameRu === 'Нерезидент') {
996
+ return false;
997
+ }
998
+ return true;
999
+ });
1000
+ const documentIssuerIsEditable = computed(() => {
1001
+ return documentIssuerNotFoundName.value;
1002
+ });
1003
+ const documentIssuerNotFoundName = ref<string>('');
1004
+ const middleNameIsEditable = ref<boolean>(false);
821
1005
  const familyDialog = ref<boolean>(false);
822
1006
  const deletionDialog = ref<boolean>(false);
823
1007
  const documentChooseDialog = ref<boolean>(false);
1008
+ const fioChooseDialog = ref<boolean>(false);
824
1009
  const selectedIndex = ref<number>(0);
825
1010
  const sameAddress = ref<boolean>(false);
826
1011
  const panelValue = ref<Value>(new Value());
@@ -831,16 +1016,42 @@ export default {
831
1016
  const fileData = ref<{ file: any }>();
832
1017
  const imageDataList = ref<string[]>([]);
833
1018
  const isRelative = ref<boolean>(false);
834
-
1019
+ const additionalDocuments = ref<any[]>([]);
1020
+ const contragents = ref<ContragentType[]>([]);
1021
+ const filteredRelationsData = ref<Value[]>(dataStore.relations);
835
1022
  const currentPanelDeep = ref<string>();
836
1023
  const currentPanelSubDeep = ref<string>();
837
-
1024
+ const selectedChild = ref<Api.Child | null>(null);
1025
+ const documentItems = computed(() => {
1026
+ if (dataStore.isLifetrip) {
1027
+ return [{ title: 'Паспорт', value: 'Passport' }];
1028
+ }
1029
+ return digitalDocumentOwnerType.value === 'adult'
1030
+ ? [
1031
+ { title: 'Удостоверение личности', value: 'IdentityCard' },
1032
+ { title: 'Паспорт', value: 'Passport' },
1033
+ { title: 'Вид на жительство иностранного гражданина', value: 'Vnzh' },
1034
+ ]
1035
+ : [{ title: 'Свидетельство о рождении', value: 'BirthCertificate' }];
1036
+ });
1037
+ const digitalDocumentDialog = ref<boolean>(false);
1038
+ const parentIin = ref<string>('');
1039
+ const childrenLoaded = ref(false);
1040
+ const digitalDocumentOwnerType = ref('');
838
1041
  const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
839
1042
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
840
1043
  const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value));
1044
+ const isChooseChild = computed(() => {
1045
+ if (dataStore.isGons) return member.value.chooseChild === dataStore.t('form.addBeneficiary');
1046
+ return true;
1047
+ });
1048
+ const isRegionDisabled = computed(() => ['Алматы', 'Астана', 'Шымкент'].includes(member.value.registrationCity?.nameRu as string));
1049
+ const getToday = (): Date => {
1050
+ return new Date(new Date().setHours(0, 0, 0, 0));
1051
+ };
1052
+
841
1053
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
842
1054
  const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
843
- const isFromGBD = computed(() => !!member.value.gosPersonData);
844
1055
  const gbdDocuments = computed(() => {
845
1056
  if (hasGBDFLDocSelection && !!member.value.gosPersonData && !!member.value.gosPersonData.documents) {
846
1057
  const documents = Array.isArray(member.value.gosPersonData.documents.document)
@@ -866,6 +1077,7 @@ export default {
866
1077
  case formStore.policyholdersRepresentativeFormKey:
867
1078
  return route.params.taskId !== '0';
868
1079
  default:
1080
+ if (route.query.tab === 'slaveInsuredForm') return true;
869
1081
  return false;
870
1082
  }
871
1083
  };
@@ -900,9 +1112,9 @@ export default {
900
1112
  return true;
901
1113
  }
902
1114
  };
903
- return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
1115
+ return dataStore.controls.hasGBDFL && perMemberCondition();
904
1116
  });
905
- const hasGBDFLDocSelection = dataStore.isLifetrip && whichForm.value === formStore.policyholderFormKey;
1117
+ const hasGBDFLDocSelection = dataStore.isLifetrip;
906
1118
  const hasInsis = computed(() => dataStore.controls.hasInsis);
907
1119
  const hasGKB = computed(() => {
908
1120
  const perMemberCondition = () => {
@@ -913,8 +1125,12 @@ export default {
913
1125
  }
914
1126
  return member.value.id === 0;
915
1127
  }
1128
+ case formStore.insuredFormKey: {
1129
+ if (dataStore.isLifetrip && member.value.isInsuredUnderage) {
1130
+ return true;
1131
+ }
1132
+ }
916
1133
  case formStore.policyholderFormKey:
917
- case formStore.insuredFormKey:
918
1134
  case formStore.beneficialOwnerFormKey:
919
1135
  case formStore.policyholdersRepresentativeFormKey:
920
1136
  return false;
@@ -922,12 +1138,17 @@ export default {
922
1138
  return false;
923
1139
  }
924
1140
  };
925
- return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
1141
+ return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
926
1142
  });
927
- const hasDocumentReader = computed(() => {
928
- return !!member.value.hasAgreement && !!isTask.value && (dataStore.isAULETTI || dataStore.isAulettiParent);
1143
+ const hasDigitalDocument = computed(() => {
1144
+ if (whichForm.value === formStore.beneficiaryFormKey && (dataStore.isBolashak || dataStore.isGons)) {
1145
+ return false;
1146
+ } else if (whichForm.value === formStore.insuredFormKey && dataStore.isLifetrip && member.value.isInsuredUnderage) {
1147
+ return false;
1148
+ }
1149
+ return true;
929
1150
  });
930
- const hasMemberSearch = computed(() => showSaveButton.value && (hasGBDFL.value || hasGKB.value || hasInsis.value || hasDocumentReader.value));
1151
+ const hasMemberSearch = computed(() => showSaveButton.value && (hasGBDFL.value || hasGKB.value || hasInsis.value));
931
1152
  const hasMiddleName = computed(() => {
932
1153
  if (dataStore.isLifetrip) {
933
1154
  return false;
@@ -938,7 +1159,11 @@ export default {
938
1159
  if (dataStore.isLifetrip || dataStore.isPension) {
939
1160
  return false;
940
1161
  }
941
- if ((whichForm.value === formStore.beneficiaryFormKey || whichForm.value === formStore.insuredFormKey) && member.value.iin !== formStore.policyholderForm.iin) {
1162
+ if (
1163
+ (whichForm.value === formStore.beneficiaryFormKey || whichForm.value === formStore.insuredFormKey) &&
1164
+ member.value.iin !== formStore.policyholderForm.iin &&
1165
+ !hasGKB.value
1166
+ ) {
942
1167
  return true;
943
1168
  }
944
1169
  return false;
@@ -973,18 +1198,24 @@ export default {
973
1198
  (whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin) ||
974
1199
  (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage),
975
1200
  );
976
- const hasWorkPositionDict = !useEnv().isProduction && dataStore.isBaiterek && dataStore.isEfoParent;
977
-
1201
+ const hasWorkPositionDict = dataStore.isBaiterek;
1202
+ const hasIssuerOther = computed(() => (useEnv().isProduction ? dataStore.isPension : true) && member.value.documentIssuers && member.value.documentIssuers.nameRu === 'Другое');
1203
+ const isCurrentFormMatch = computed(() => {
1204
+ if (dataStore.isPension) {
1205
+ return whichForm.value === formStore.insuredFormKey;
1206
+ }
1207
+ return whichForm.value === formStore.policyholderFormKey;
1208
+ });
978
1209
  const birthDateRule = computed(() => {
979
1210
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
980
1211
  const byMemberAndProductRule = () => {
981
1212
  if (whichForm.value === formStore.policyholderFormKey) {
982
- if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
1213
+ if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek || dataStore.isMycar) {
983
1214
  return dataStore.rules.age18ByDate;
984
1215
  }
985
1216
  }
986
1217
  if (whichForm.value === formStore.insuredFormKey) {
987
- if (dataStore.isBolashak || dataStore.isBaiterek) {
1218
+ if (dataStore.isBolashak || dataStore.isBaiterek || dataStore.isMycar) {
988
1219
  return dataStore.rules.age18ByDate;
989
1220
  }
990
1221
  if (dataStore.isLifetrip) {
@@ -999,17 +1230,17 @@ export default {
999
1230
  const baseAgeRule = dataStore.rules.numbers;
1000
1231
  const byMemberAndProductRule = () => {
1001
1232
  if (whichForm.value === formStore.policyholderFormKey) {
1002
- if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
1233
+ if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek || dataStore.isMycar) {
1003
1234
  return dataStore.rules.age18;
1004
1235
  }
1005
1236
  }
1006
1237
  if (whichForm.value === formStore.beneficiaryFormKey) {
1007
- if (dataStore.isBolashak) {
1238
+ if (dataStore.isGons || dataStore.isBolashak) {
1008
1239
  return dataStore.rules.beneficiaryAgeLimit;
1009
1240
  }
1010
1241
  }
1011
1242
  if (whichForm.value === formStore.insuredFormKey) {
1012
- if (dataStore.isBaiterek || dataStore.isBolashak) {
1243
+ if (dataStore.isBaiterek || dataStore.isMycar || dataStore.isBolashak) {
1013
1244
  return dataStore.rules.age18;
1014
1245
  }
1015
1246
  }
@@ -1031,13 +1262,16 @@ export default {
1031
1262
  if (member.value.isInsuredUnderage) {
1032
1263
  return [];
1033
1264
  }
1265
+ if (dataStore.isPension && member.value.signOfResidency.nameRu === 'Нерезидент') {
1266
+ return dataStore.rules.phoneNonResidentFormat;
1267
+ }
1034
1268
  return basePhoneRule;
1035
1269
  });
1036
1270
 
1037
1271
  const residencyRule = computed(() => {
1038
1272
  const baseResidencyRule = dataStore.rules.objectRequired;
1039
1273
  if (whichForm.value === formStore.policyholderFormKey) {
1040
- if (dataStore.isBolashak || dataStore.isBaiterek) {
1274
+ if (dataStore.isBolashak || dataStore.isBaiterek || dataStore.isMycar) {
1041
1275
  return baseResidencyRule.concat(dataStore.rules.noResident);
1042
1276
  }
1043
1277
  }
@@ -1048,16 +1282,18 @@ export default {
1048
1282
  });
1049
1283
 
1050
1284
  const getOtpConditionByMember = () => {
1051
- switch (whichForm.value) {
1285
+ const which = whichForm.value as keyof typeof StoreMembers | 'slaveInsuredForm';
1286
+ switch (which) {
1052
1287
  case formStore.policyholderFormKey:
1053
1288
  return route.params.taskId === '0';
1054
1289
  case formStore.insuredFormKey:
1055
- if (dataStore.isPension) return route.params.taskId === '0';
1056
- return route.query.id === '0';
1290
+ case 'slaveInsuredForm':
1057
1291
  case formStore.policyholdersRepresentativeFormKey:
1058
1292
  case formStore.beneficiaryFormKey:
1059
1293
  case formStore.beneficialOwnerFormKey:
1060
1294
  return route.query.id === '0';
1295
+ default:
1296
+ return dataStore.isPension && route.query.id === '0' && formStore.applicationData.processCode === 24;
1061
1297
  }
1062
1298
  };
1063
1299
  const otpCondition = computed(() => {
@@ -1066,13 +1302,22 @@ export default {
1066
1302
  if (whichForm.value === formStore.beneficiaryFormKey && member.value.age !== null && Number(member.value.age) < 18) return false;
1067
1303
  if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) return false;
1068
1304
  if (!member.value.phoneNumber || (member.value.phoneNumber && member.value.phoneNumber.length !== useMask().phone.length)) return false;
1305
+ if (route.query.tab === 'slaveInsuredForm' && route.query.id === '0') return true;
1069
1306
  return getOtpConditionByMember();
1070
1307
  });
1308
+ const isOwnChild = computed(() => {
1309
+ //в справочнике relations 9-ребенок, 12-сын, 13-дочь
1310
+ const childIds = [9, 12, 13];
1311
+ return !!childIds.includes(Number(member.value.relationDegree.ids));
1312
+ });
1313
+ const isEmpty = computed(() => {
1314
+ return isOwnChild.value ? formStore.children?.length === 0 : childrenLoaded.value && formStore.children?.length === 0;
1315
+ });
1071
1316
 
1072
- const searchMember = async () => {
1317
+ const searchMember = async (title: string = 'Поиск контрагента') => {
1073
1318
  if (!isDisabled.value) {
1074
1319
  dataStore.panelAction = null;
1075
- dataStore.rightPanel.title = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента';
1320
+ dataStore.rightPanel.title = title;
1076
1321
  dataStore.rightPanel.open = true;
1077
1322
  isSearchOpen.value = true;
1078
1323
  isDocumentOpen.value = false;
@@ -1085,6 +1330,10 @@ export default {
1085
1330
  };
1086
1331
 
1087
1332
  const searchPositions = async () => {
1333
+ if (searchQuery.value.length < 4) {
1334
+ dataStore.showToaster('error', dataStore.t('rules.searchQueryLen', { len: 4 }));
1335
+ return;
1336
+ }
1088
1337
  if (!isDisabled.value) {
1089
1338
  isPanelLoading.value = true;
1090
1339
  positionsList.value = await dataStore.getWorkPosition(searchQuery.value);
@@ -1123,6 +1372,7 @@ export default {
1123
1372
  isPositionPanelOpen.value = false;
1124
1373
  }
1125
1374
  if (type === 'workPosition') {
1375
+ dataStore.rightPanel.title = dataStore.t('form.jobPosition');
1126
1376
  isPositionPanelOpen.value = true;
1127
1377
  isOtpPanelOpen.value = false;
1128
1378
  isDocumentOpen.value = false;
@@ -1193,7 +1443,7 @@ export default {
1193
1443
  if (dataStore.isBolashak) {
1194
1444
  if (key === 'relationDegree') {
1195
1445
  if (whichForm.value === formStore.beneficiaryFormKey) {
1196
- const beneficiaryRelations = [12, 13, 14, 15, 20, 21, 22, 23];
1446
+ const beneficiaryRelations = [9, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25];
1197
1447
  return list.filter(i => beneficiaryRelations.includes(Number(i.ids)));
1198
1448
  }
1199
1449
  if (whichForm.value === formStore.insuredFormKey) {
@@ -1202,6 +1452,14 @@ export default {
1202
1452
  }
1203
1453
  }
1204
1454
  }
1455
+ if (dataStore.isGons && key === 'relationDegree' && whichForm.value === formStore.beneficiaryFormKey) {
1456
+ const beneficiaryRelations = [9, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25];
1457
+ return list.filter(i => beneficiaryRelations.includes(Number(i.ids)));
1458
+ }
1459
+ if (dataStore.isBaiterek && key === 'relationDegree') {
1460
+ const relations = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25, 26, 27];
1461
+ return list.filter(i => relations.includes(Number(i.ids)));
1462
+ }
1205
1463
  return list;
1206
1464
  };
1207
1465
 
@@ -1221,6 +1479,10 @@ export default {
1221
1479
  } else {
1222
1480
  // @ts-ignore
1223
1481
  member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
1482
+ if (currentPanel.value === 'documentIssuers' && documentIssuerIsEditable.value) {
1483
+ const id = Number(item.ids);
1484
+ dataStore.saveDocumentIssuer(documentIssuerNotFoundName.value, id);
1485
+ }
1224
1486
  }
1225
1487
  currentPanelDeep.value = '';
1226
1488
  currentPanelSubDeep.value = '';
@@ -1252,12 +1514,35 @@ export default {
1252
1514
  }
1253
1515
  };
1254
1516
 
1255
- const attachFile = (event: InputEvent, code?: string) => {
1517
+ const uploadAdditionalFiles = async (processInstanceId: string | number) => {
1518
+ const formData = new FormData();
1519
+ const information: any = [];
1520
+ const uuidV4 = uuid.v4();
1521
+ if (additionalDocuments.value) {
1522
+ Object.values(additionalDocuments.value).map((value: any) => {
1523
+ formData.append('file', value);
1524
+ const ext = value.name.substring(value.name.lastIndexOf('.'));
1525
+ const selectedDocument = dataStore.dicFileTypeList.find((i: Value) => i.code === value.code);
1526
+ information.push({
1527
+ identifier: `${uuidV4}${ext}`,
1528
+ iin: member.value.iin ? member.value.iin.replaceAll('-', '') : null,
1529
+ processInstanceId: processInstanceId,
1530
+ fileTypeCode: selectedDocument ? selectedDocument.code : null,
1531
+ fileTypeId: selectedDocument ? selectedDocument.id : null,
1532
+ fileName: value.name,
1533
+ });
1534
+ });
1535
+ formData.append('fileData', JSON.stringify(information));
1536
+ await dataStore.uploadFiles(formData, false);
1537
+ }
1538
+ };
1539
+
1540
+ const attachFile = (event: InputEvent) => {
1256
1541
  if (event.target) {
1257
- fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
1542
+ fileData.value = { file: (event.target as HTMLInputElement).files };
1258
1543
  } else {
1259
1544
  if (event.dataTransfer) {
1260
- fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
1545
+ fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1261
1546
  }
1262
1547
  }
1263
1548
  };
@@ -1326,7 +1611,7 @@ export default {
1326
1611
  if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1327
1612
  if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1328
1613
  if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1329
- const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Enums.Insis.DocTypes['1UDL']);
1614
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === CoreEnums.Insis.DocTypes['1UDL']);
1330
1615
  if (documentType) member.value.documentType = documentType;
1331
1616
  }
1332
1617
  if (!!parsedDocument.documentIssuer) {
@@ -1351,55 +1636,78 @@ export default {
1351
1636
  }
1352
1637
  };
1353
1638
 
1354
- const getFile = async (type: FileActions) => {
1639
+ const getDoc = async (type: FileActions) => {
1355
1640
  if (memberDocument.value) {
1356
1641
  documentLoading.value = true;
1357
1642
  const fileExtension = memberDocument.value.fileName!.match(/\.([0-9a-z]+)(?:[\?#]|$)/i)![1];
1358
- await dataStore.getFile(memberDocument.value, type, fileExtension);
1643
+ await dataStore.getDoc(memberDocument.value, type, fileExtension);
1359
1644
  documentLoading.value = false;
1360
1645
  }
1361
1646
  };
1362
1647
 
1363
1648
  const getFamilyInfo = async () => {
1364
- if (!formStore.policyholderForm.iin || !formStore.policyholderForm.phoneNumber) return;
1365
- if (formStore.birthInfos.length === 0) {
1366
- isButtonLoading.value = true;
1367
- await dataStore.getFamilyInfo(formStore.policyholderForm.iin, formStore.policyholderForm.phoneNumber);
1368
- if (formStore.birthInfos.length !== 0) {
1369
- familyDialog.value = true;
1649
+ if (isButtonLoading.value) return;
1650
+ if (!member.value.relationDegree?.nameRu) {
1651
+ dataStore.showToaster('error', dataStore.t('toaster.needSelectRelationDegree'));
1652
+ return;
1653
+ }
1654
+
1655
+ if (isOwnChild.value) {
1656
+ if (!formStore.policyholderForm.iin) return;
1657
+ if (formStore.children.length === 0) {
1658
+ isButtonLoading.value = true;
1659
+ await dataStore.getChildren(formStore.policyholderForm.iin);
1660
+ childrenLoaded.value = true;
1370
1661
  }
1371
- } else {
1372
- familyDialog.value = true;
1373
1662
  }
1663
+ parentIin.value = '';
1664
+ familyDialog.value = true;
1374
1665
  isButtonLoading.value = false;
1375
1666
  };
1376
1667
 
1668
+ const getChildren = async () => {
1669
+ dataStore.isButtonsLoading = true;
1670
+ try {
1671
+ const iinChecked = await dataStore.checkIIN(parentIin.value.replace(/-/g, ''));
1672
+ if (!iinChecked) {
1673
+ dataStore.showToaster('error', `Некорректный ИИН`);
1674
+ return;
1675
+ }
1676
+ await dataStore.getChildren(parentIin.value);
1677
+ childrenLoaded.value = true;
1678
+ } finally {
1679
+ dataStore.isButtonsLoading = false;
1680
+ }
1681
+ };
1682
+
1377
1683
  const closeFamilyDialog = (resetMember = false) => {
1378
1684
  if (resetMember === true) {
1379
1685
  member.value.resetMember();
1380
1686
  }
1687
+ formStore.children = [];
1688
+ childrenLoaded.value = false;
1381
1689
  familyDialog.value = false;
1382
- selectedFamilyMember.value = {};
1383
1690
  isButtonLoading.value = false;
1384
1691
  dataStore.rightPanel.open = false;
1385
1692
  isSearchOpen.value = false;
1693
+ if (dataStore.isGons && resetMember) {
1694
+ member.value.chooseChild = '';
1695
+ }
1386
1696
  };
1387
1697
 
1388
- const selectFamilyMember = (familyMember: Api.GKB.BirthInfo) => {
1389
- if (selectedFamilyMember.value && selectedFamilyMember.value.childIIN === familyMember.childIIN) {
1390
- selectedFamilyMember.value = {};
1391
- } else {
1392
- selectedFamilyMember.value = familyMember;
1393
- member.value.iin = reformatIin(selectedFamilyMember.value.childIIN!);
1394
- member.value.firstName = selectedFamilyMember.value.childName!;
1395
- member.value.lastName = selectedFamilyMember.value.childSurName!;
1396
- member.value.middleName = selectedFamilyMember.value.childPatronymic ?? '';
1397
- member.value.birthDate = reformatDate(selectedFamilyMember.value.childBirthDate!);
1698
+ const selectFamilyMember = () => {
1699
+ if (Object.keys(selectedFamilyMember.value).length === 0) {
1700
+ dataStore.showToaster('error', 'Нужно выбрать ребенка');
1701
+ return;
1398
1702
  }
1703
+ member.value.chooseChildId = selectedFamilyMember.value.id!;
1704
+ selectedChild.value = selectedFamilyMember.value;
1705
+
1399
1706
  familyDialog.value = false;
1400
1707
  isButtonLoading.value = false;
1401
1708
  dataStore.rightPanel.open = false;
1402
1709
  isSearchOpen.value = false;
1710
+ openDigitalDocumentModal('child');
1403
1711
  };
1404
1712
 
1405
1713
  const getContragentFromGBDFL = async () => {
@@ -1430,7 +1738,9 @@ export default {
1430
1738
 
1431
1739
  const selectGbdDocument = (document: Api.GBD.Document) => {
1432
1740
  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)]);
1741
+ const documentType = dataStore.documentTypes.find(
1742
+ (i: Value) => i.ids === Object.keys(CoreEnums.GBD.DocTypes)[Object.values(CoreEnums.GBD.DocTypes).indexOf(document.type.code)],
1743
+ );
1434
1744
  if (documentType) member.value.documentType = documentType;
1435
1745
  const documentNumber = document.number;
1436
1746
  if (documentNumber) member.value.documentNumber = documentNumber;
@@ -1447,28 +1757,56 @@ export default {
1447
1757
  isSearchOpen.value = false;
1448
1758
  };
1449
1759
 
1760
+ const getContragentClick = async (contragent: ContragentType) => {
1761
+ isButtonLoading.value = true;
1762
+ await dataStore.serializeContragentData(member.value, contragent);
1763
+ fioChooseDialog.value = false;
1764
+ isButtonLoading.value = false;
1765
+ dataStore.rightPanel.open = false;
1766
+ isSearchOpen.value = false;
1767
+ };
1768
+
1450
1769
  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;
1770
+ if (isNonResident.value) {
1771
+ if (!member.value.lastName || !member.value.firstName) {
1772
+ dataStore.showToaster('error', 'Заполните поля Имя и Фамилия', 3000);
1773
+ dataStore.rightPanel.open = false;
1774
+ isSearchOpen.value = false;
1775
+ return;
1776
+ }
1777
+ } else {
1778
+ if (member.value.hasAgreement !== true) {
1779
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
1780
+ dataStore.rightPanel.open = false;
1781
+ isSearchOpen.value = false;
1782
+ return;
1783
+ }
1784
+ if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
1785
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
1786
+ dataStore.rightPanel.open = false;
1787
+ isSearchOpen.value = false;
1788
+ return;
1789
+ }
1462
1790
  }
1463
1791
  isButtonLoading.value = true;
1464
- await dataStore.getContragent(member.value, false);
1792
+ if (isNonResident.value) {
1793
+ const response = await dataStore.getContragent(member.value, false);
1794
+ if (response) contragents.value = response.items;
1795
+ else dataStore.showToaster('error', 'Не найдено совпадений', 3000);
1796
+ fioChooseDialog.value = true;
1797
+ } else {
1798
+ await dataStore.getContragent(member.value, false);
1799
+ }
1465
1800
  isButtonLoading.value = false;
1466
1801
  dataStore.rightPanel.open = false;
1467
1802
  isSearchOpen.value = false;
1468
1803
  };
1469
1804
 
1470
1805
  const validateESBD = async (docTypeNumber: number) => {
1471
- // TODO
1806
+ if (!dataStore.checkWithESBD) {
1807
+ return true;
1808
+ }
1809
+
1472
1810
  const data: ESBDValidationType = {
1473
1811
  personType: 1,
1474
1812
  iin: member.value.iin!.replaceAll('-', ''),
@@ -1486,7 +1824,21 @@ export default {
1486
1824
  resident: member.value.signOfResidency.ids === '500011.2' || member.value.signOfResidency.ids === null ? 0 : 1,
1487
1825
  countryId: member.value.countryOfTaxResidency.ids !== '500014.3' ? Number(String(member.value.countryOfTaxResidency.ids).at(-1)) : 2,
1488
1826
  };
1489
- return await dataStore.getValidateClientESBD(data);
1827
+ const ESBDResponse = await dataStore.getValidateClientESBD(data);
1828
+ if (!ESBDResponse) {
1829
+ dataStore.isLoading = false;
1830
+ isSubmittingForm.value = false;
1831
+ return false;
1832
+ }
1833
+ const initialPoint = `${member.value.iin!.replaceAll('-', '')}.`;
1834
+ const RESPONSE = ESBDMessage(ESBDResponse, initialPoint);
1835
+ let errorMessage = RESPONSE !== false ? RESPONSE : 'Что-то произошло не так';
1836
+ if (typeof ESBDResponse !== 'object' || ESBDResponse.errorCode !== 0) {
1837
+ dataStore.isLoading = false;
1838
+ dataStore.showToaster('error', errorMessage, 5000);
1839
+ return false;
1840
+ }
1841
+ return true;
1490
1842
  };
1491
1843
 
1492
1844
  const saveMember = async () => {
@@ -1497,10 +1849,11 @@ export default {
1497
1849
  }
1498
1850
  const isInsured = formStore.isPolicyholderInsured;
1499
1851
  const remoteIsInsured = ref<boolean | null>(null);
1852
+ const isNewApplication = route.params.taskId === '0';
1500
1853
  if (whichForm.value == formStore.policyholderFormKey || (dataStore.isPension && whichForm.value == formStore.insuredFormKey)) {
1501
1854
  if (route.params.taskId === '0') {
1502
1855
  try {
1503
- const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 4 : 19) : undefined);
1856
+ const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 25 : 19) : undefined);
1504
1857
  if (typeof taskId === 'string') {
1505
1858
  await dataStore.getApplicationData(taskId, false, false, false, false);
1506
1859
  remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
@@ -1524,6 +1877,13 @@ export default {
1524
1877
  if (fileData.value && fileData.value.file) {
1525
1878
  await uploadFile(formStore.applicationData.processInstanceId);
1526
1879
  }
1880
+ if (additionalDocuments.value && additionalDocuments.value.length) {
1881
+ if (
1882
+ (!formStore.applicationData.isEnpfSum && formStore.applicationData?.pensionApp.transferContracts && formStore.applicationData?.pensionApp.transferContracts.length) ||
1883
+ (formStore.applicationData?.pensionApp.compulsoryProfMonthCount && formStore.applicationData?.pensionApp.compulsoryProfMonthCount >= 60)
1884
+ )
1885
+ await uploadAdditionalFiles(formStore.applicationData.processInstanceId);
1886
+ }
1527
1887
  }
1528
1888
  const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value, whichIndex.value ? Number(whichIndex.value) : undefined);
1529
1889
  if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
@@ -1547,30 +1907,43 @@ export default {
1547
1907
  }
1548
1908
  }
1549
1909
  }
1550
- if (whichForm.value === formStore.insuredFormKey) {
1910
+ if (
1911
+ whichForm.value === formStore.insuredFormKey ||
1912
+ (memberFromApplicaiton &&
1913
+ memberFromApplicaiton.processInstanceId &&
1914
+ formStore.applicationData.slave &&
1915
+ memberFromApplicaiton.processInstanceId === formStore.applicationData.slave.processInstanceId)
1916
+ ) {
1551
1917
  wasInsuredAction.value = true;
1552
1918
  if (dataStore.isPension) {
1553
- formStore.applicationData.pensionApp = {
1919
+ let data = {
1554
1920
  ...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,
1921
+ slave: formStore.applicationData.slave?.pensionApp ?? undefined,
1566
1922
  };
1567
- const data = {
1568
- ...formStore.applicationData.pensionApp,
1569
- transferContractCompany: formStore.applicationData.pensionApp.transferContractCompany?.nameRu ?? null,
1923
+ const bankinfo = {
1924
+ account: member.value.bankInfo.iik ?? '',
1925
+ bankBik: member.value.bankInfo.bik ?? '',
1926
+ bankBin: member.value.bankInfo.bin ? String(member.value.bankInfo.bin).replaceAll('-', '') : '',
1927
+ bankId: Number(member.value.bankInfo.bankName.id) ?? 0,
1928
+ bankName: member.value.bankInfo.bankName.nameRu ?? '',
1570
1929
  };
1930
+ if (route.query.tab === 'slaveInsuredForm') {
1931
+ data.slave = { ...data.slave, ...bankinfo };
1932
+ } else {
1933
+ data = { ...data, ...bankinfo };
1934
+ }
1935
+ const pensionKeysWithSpace = ['compulsoryContractAmount', 'compulsoryProfContractAmount', 'voluntaryContractAmount', 'ownFundsRaisAmount'];
1936
+ pensionKeysWithSpace.forEach(key => {
1937
+ if (/\s/g.test(data[key]) === true) data[key] = formatSpacedNumber(data[key]);
1938
+ });
1939
+ if (data.slave)
1940
+ pensionKeysWithSpace.forEach(key => {
1941
+ if (/\s/g.test(data.slave[key]) === true) data.slave[key] = formatSpacedNumber(data.slave[key]);
1942
+ });
1571
1943
  const isApplicationSaved = await dataStore.setApplication(data);
1944
+ if (!isNewApplication) dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1572
1945
  if (isApplicationSaved === false) return;
1573
- dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1946
+ await dataStore.saveMember(member.value, 'Client', memberFromApplicaiton);
1574
1947
  }
1575
1948
  }
1576
1949
  await router.replace({
@@ -1609,6 +1982,7 @@ export default {
1609
1982
  }
1610
1983
  }
1611
1984
  if (member.value.hasAgreement !== true) {
1985
+ if (isNonResident.value) return true;
1612
1986
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
1613
1987
  return false;
1614
1988
  }
@@ -1623,53 +1997,62 @@ export default {
1623
1997
  isSubmittingForm.value = true;
1624
1998
  const docType = member.value.documentType.ids;
1625
1999
  if (
2000
+ !isNonResident.value &&
1626
2001
  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)
2002
+ (docType === CoreEnums.Insis.DocTypes['1UDL'] ||
2003
+ docType === CoreEnums.Insis.DocTypes.SBI ||
2004
+ docType === CoreEnums.Insis.DocTypes.PS ||
2005
+ docType === CoreEnums.Insis.DocTypes.VNZ)
1628
2006
  ) {
1629
2007
  dataStore.isLoading = true;
1630
2008
  const docTypeCodes = {
1631
2009
  '1UDL': 1,
1632
- PS: 2,
2010
+ PS: 11,
1633
2011
  SBI: 3,
1634
2012
  VNZ: 4,
1635
2013
  };
1636
- const ESBDResponse = await validateESBD(docTypeCodes[docType]);
1637
- if (!ESBDResponse) {
1638
- isSubmittingForm.value = false;
1639
- dataStore.isLoading = false;
1640
- return;
2014
+
2015
+ const isESBDValid = await validateESBD(docTypeCodes[docType]);
2016
+ if (isESBDValid === false) return;
2017
+
2018
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
2019
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
2020
+ if (isValidIik === false) {
2021
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
2022
+ member.value.bankInfo.iik = '';
2023
+ isSubmittingForm.value = false;
2024
+ return;
2025
+ }
2026
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
2027
+ formStore.pensionApp.account = member.value.bankInfo.iik;
2028
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
2029
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
2030
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
2031
+ }
1641
2032
  }
1642
- const initialPoint = `${member.value.iin!.replaceAll('-', '')}.`;
1643
- const RESPONSE = ESBDMessage(ESBDResponse, initialPoint);
1644
- let errorMessage = RESPONSE !== false ? RESPONSE : 'Что-то произошло не так';
1645
- if (typeof ESBDResponse === 'object' && ESBDResponse.errorCode === 0) {
1646
- member.value.verifyType = 'ESBD';
1647
- member.value.verifyDate = ESBDResponse.verifiedDate;
1648
-
1649
- if (member.value.bankInfo.iik.length === useMask().iik.length) {
1650
- const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1651
- if (isValidIik === false) {
1652
- dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1653
- member.value.bankInfo.iik = '';
1654
- isSubmittingForm.value = false;
1655
- return;
1656
- }
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;
1662
- }
2033
+ const hasMemberSaved = await saveMember();
2034
+ } else if (isNonResident.value) {
2035
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
2036
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
2037
+ if (isValidIik === false) {
2038
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
2039
+ member.value.bankInfo.iik = '';
2040
+ isSubmittingForm.value = false;
2041
+ return;
2042
+ }
2043
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
2044
+ formStore.pensionApp.account = member.value.bankInfo.iik;
2045
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
2046
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
2047
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1663
2048
  }
1664
- const hasMemberSaved = await saveMember();
1665
- } else {
1666
- dataStore.isLoading = false;
1667
- dataStore.showToaster('error', errorMessage, 5000);
1668
2049
  }
2050
+ const hasMemberSaved = await saveMember();
1669
2051
  } else {
1670
2052
  member.value.gotFromInsis = true;
1671
2053
  const hasMemberSaved = await saveMember();
1672
2054
  }
2055
+ dataStore.isDirty = false;
1673
2056
  isSubmittingForm.value = false;
1674
2057
  } else {
1675
2058
  const errors = document.querySelector('.v-input--error');
@@ -1711,6 +2094,15 @@ export default {
1711
2094
 
1712
2095
  const sendOtp = async (onInit = false) => {
1713
2096
  otpSending.value = true;
2097
+ if (isCurrentFormMatch.value && member.value.iin && member.value.iin.length === useMask().iin.length) {
2098
+ const iin = member.value.iin.replace(/-/g, '');
2099
+ const type = String(route.query.type) === 'joint' ? 25 : 19;
2100
+ const response = await dataStore.checkExistProcess(iin, dataStore.isPension ? type : constants.products[dataStore.product as keyof typeof constants.products]);
2101
+ if (response) {
2102
+ otpSending.value = false;
2103
+ return;
2104
+ }
2105
+ }
1714
2106
  const response = await memberStore.sendOtp(member.value, formStore.applicationData.processInstanceId, onInit);
1715
2107
  if (response) {
1716
2108
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
@@ -1784,6 +2176,12 @@ export default {
1784
2176
  };
1785
2177
 
1786
2178
  const selectMember = async (index: number, update?: boolean) => {
2179
+ if (dataStore.isDirty === true) {
2180
+ dataStore.quitDialog = true;
2181
+ //@ts-ignore
2182
+ subMemberRoute.value = { query: { ...route.query, i: index, id: getMember(route.query.tab, index).id, upd: update } };
2183
+ return;
2184
+ }
1787
2185
  dataStore.rightPanel.open = false;
1788
2186
  isButtonLoading.value = true;
1789
2187
  isChangingMember.value = true;
@@ -1808,6 +2206,178 @@ export default {
1808
2206
  deletionDialog.value = false;
1809
2207
  };
1810
2208
 
2209
+ const startGettingDigitalDocument = () => {
2210
+ if (member.value.hasAgreement !== true) {
2211
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
2212
+ dataStore.rightPanel.open = false;
2213
+ isSearchOpen.value = false;
2214
+ return;
2215
+ }
2216
+ if (!member.value.iin || member.value.iin.length !== useMask().iin.length || !member.value.phoneNumber || member.value.phoneNumber.length !== useMask().phone.length) {
2217
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'Номер телефона, ИИН' }), 5000);
2218
+ dataStore.rightPanel.open = false;
2219
+ isSearchOpen.value = false;
2220
+ return;
2221
+ }
2222
+
2223
+ openDigitalDocumentModal('adult');
2224
+ };
2225
+
2226
+ const openDigitalDocumentModal = (type: 'child' | 'adult') => {
2227
+ digitalDocumentOwnerType.value = type;
2228
+ digitalDocumentDialog.value = true;
2229
+ };
2230
+
2231
+ const getCode = (documentType: string) => {
2232
+ if (!digitalDocumentOwnerType.value) return;
2233
+ if (digitalDocumentOwnerType.value === 'child') {
2234
+ getCodeForChild(documentType);
2235
+ } else {
2236
+ getCodeForAdult(documentType);
2237
+ }
2238
+ };
2239
+
2240
+ const getCodeForChild = async (documentType: string) => {
2241
+ const iin = isOwnChild.value ? formStore.policyholderForm.iin : parentIin.value;
2242
+ if (!iin) return;
2243
+
2244
+ documentLoading.value = true;
2245
+ try {
2246
+ const response = await dataStore.getOnlineChildAccess(iin!, documentType, member.value.chooseChildId!);
2247
+ if (response) {
2248
+ dataStore.showToaster('success', dataStore.t('toaster.successOtp'), 3000);
2249
+ }
2250
+ } finally {
2251
+ documentLoading.value = false;
2252
+ }
2253
+ };
2254
+
2255
+ const getCodeForAdult = async (documentType: string) => {
2256
+ documentLoading.value = true;
2257
+ try {
2258
+ const response = await dataStore.getOnlineAccess(member.value.iin!, documentType);
2259
+ if (response) {
2260
+ dataStore.showToaster('success', dataStore.t('toaster.successOtp'), 3000);
2261
+ }
2262
+ } finally {
2263
+ documentLoading.value = false;
2264
+ }
2265
+ };
2266
+
2267
+ const getDigitalDocument = async (otpCode: string) => {
2268
+ if (!digitalDocumentOwnerType.value) return;
2269
+ let iin = '';
2270
+ if (digitalDocumentOwnerType.value === 'child') {
2271
+ iin = isOwnChild.value ? formStore.policyholderForm.iin! : parentIin.value!;
2272
+ } else {
2273
+ iin = member.value.iin!;
2274
+ }
2275
+ if (!iin) return;
2276
+
2277
+ documentLoading.value = true;
2278
+ try {
2279
+ const response = await dataStore.getDigitalDocuments(iin!, otpCode);
2280
+
2281
+ if (response?.parsingResponseContent) {
2282
+ const responseData = JSON.parse(response.parsingResponseContent);
2283
+
2284
+ if (
2285
+ digitalDocumentOwnerType.value !== 'child' &&
2286
+ member.value.iin &&
2287
+ responseData.iin &&
2288
+ reformatIin(responseData.iin) &&
2289
+ member.value.iin.length === useMask().iin.length &&
2290
+ reformatIin(responseData.iin).length === useMask().iin.length &&
2291
+ member.value.iin !== reformatIin(responseData.iin)
2292
+ ) {
2293
+ dataStore.showToaster('error', 'Не совпадают ИИН');
2294
+ documentLoading.value = false;
2295
+ return;
2296
+ }
2297
+
2298
+ if (digitalDocumentOwnerType.value === 'child' && selectedChild.value && responseData) {
2299
+ const { firstName, lastName, birthDate } = selectedChild.value;
2300
+
2301
+ const birthDateMatch =
2302
+ birthDate && responseData.birthDate ? new Date(birthDate).toISOString().split('T')[0] === new Date(responseData.birthDate).toISOString().split('T')[0] : true;
2303
+
2304
+ if (firstName !== responseData.firstName || lastName !== responseData.lastName || !birthDateMatch) {
2305
+ dataStore.showToaster('error', `Выбранный ребёнок (${lastName} ${firstName}) и полученные данные (${responseData.lastName} ${responseData.firstName}) не совпадают.`);
2306
+ return;
2307
+ }
2308
+ }
2309
+
2310
+ if (dataStore.isLifetrip) {
2311
+ if (response.digitalDocuments.documentType.code !== 'Passport') {
2312
+ dataStore.showToaster('error', 'Допустимый тип документа — только Паспорт.');
2313
+ return;
2314
+ }
2315
+ }
2316
+
2317
+ await dataStore.getContragent(member.value, false, false);
2318
+
2319
+ if (responseData.firstName && responseData.lastName) {
2320
+ member.value.chooseChild = `${responseData.lastName} ${responseData.firstName} ${responseData.middleName ? responseData.middleName : ''}`;
2321
+ }
2322
+ if (responseData.iin) member.value.iin = reformatIin(responseData.iin);
2323
+ if (responseData.firstName) member.value.firstName = responseData.firstName;
2324
+ if (responseData.lastName) member.value.lastName = responseData.lastName;
2325
+ if (responseData.firstNameLatin && dataStore.isLifetrip) member.value.firstNameLat = responseData.firstNameLatin;
2326
+ if (responseData.lastNameLatin && dataStore.isLifetrip) member.value.lastNameLat = responseData.lastNameLatin;
2327
+ if (responseData.middleName) member.value.middleName = responseData.middleName;
2328
+ if (responseData.birthDate) member.value.birthDate = reformatDate(responseData.birthDate);
2329
+ if (responseData.sex) {
2330
+ const sex = responseData.sex.toUpperCase();
2331
+ const genderId = sex === 'M' ? 1 : 2;
2332
+ const gender = dataStore.gender.find(item => item.id === genderId);
2333
+ if (gender) member.value.gender = gender;
2334
+ }
2335
+ if (responseData.documentNumber) member.value.documentNumber = responseData.documentNumber;
2336
+ if (responseData.issueDate) member.value.documentDate = reformatDate(responseData.issueDate);
2337
+ if (responseData.expireDate) member.value.documentExpire = reformatDate(responseData.expireDate);
2338
+
2339
+ const documentIssuer = dataStore.documentIssuers.find(i => i.ids === responseData.givedById);
2340
+ if (documentIssuer) {
2341
+ member.value.documentIssuers = documentIssuer;
2342
+ } else {
2343
+ documentIssuerNotFoundName.value = responseData.givedBy;
2344
+ }
2345
+ }
2346
+
2347
+ if (response?.digitalDocuments?.responseCode === 'SUCCESS') {
2348
+ let fileTypeCode = '';
2349
+ switch (response.digitalDocuments.documentType.code) {
2350
+ case 'IdentityCard':
2351
+ fileTypeCode = '1UDL';
2352
+ break;
2353
+ case 'Passport':
2354
+ fileTypeCode = 'PS';
2355
+ middleNameIsEditable.value = true;
2356
+ break;
2357
+ case 'BirthCertificate':
2358
+ fileTypeCode = 'SBI';
2359
+ break;
2360
+ case 'Vnzh':
2361
+ fileTypeCode = 'VNZ';
2362
+ break;
2363
+ default:
2364
+ fileTypeCode = '';
2365
+ break;
2366
+ }
2367
+ member.value.documentType = dataStore.documentTypes.find(item => item.ids === fileTypeCode) || new Value();
2368
+ }
2369
+ } finally {
2370
+ digitalDocumentDialog.value = false;
2371
+ dataStore.rightPanel.open = false;
2372
+ isSearchOpen.value = false;
2373
+ documentLoading.value = false;
2374
+ }
2375
+ };
2376
+
2377
+ const updateDigitalDocuments = () => {
2378
+ dataStore.updateDigitalDocumentsProfile(member.value.iin!);
2379
+ };
2380
+
1811
2381
  const onInit = async () => {
1812
2382
  // if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
1813
2383
  // await dataStore.getSignedDocList(formStore.applicationData.processInstanceId);
@@ -1819,14 +2389,21 @@ export default {
1819
2389
  }
1820
2390
  if (!member.value.id) {
1821
2391
  await router.replace({ query: { ...route.query, id: 0 } });
2392
+ if (dataStore.isPension) {
2393
+ switch (whichForm.value) {
2394
+ case formStore.insuredFormKey:
2395
+ setSignOfResidency();
2396
+ break;
2397
+ }
2398
+ }
1822
2399
  } else {
1823
2400
  if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1824
2401
  if (dataStore.isLifetrip) {
1825
2402
  const documentByPriority = (() => {
1826
2403
  if (whichForm.value !== formStore.policyholderFormKey || formStore.isPolicyholderInsured === true) {
1827
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes.PS);
2404
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes.PS);
1828
2405
  }
1829
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes['1UDL']);
2406
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes['1UDL']);
1830
2407
  })();
1831
2408
  const userDocument = documentByPriority ? documentByPriority : member.value.documentsList[0];
1832
2409
  const documentType = dataStore.documentTypes.find((i: Value) => i.ids === userDocument.type);
@@ -1837,12 +2414,10 @@ export default {
1837
2414
  member.value.documentDate = reformatDate(userDocument.issueDate);
1838
2415
  member.value.documentExpire = reformatDate(userDocument.expireDate);
1839
2416
  }
1840
-
1841
- // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
2417
+ // const filteredDocuments: DocumentItem[] = dataStore.getDocsByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1842
2418
  // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1843
2419
  }
1844
2420
  await setDefaultValues();
1845
- if (Number(formStore.applicationData.processCode) === 4) dataStore.members.insuredApp.isMultiple = true;
1846
2421
  if (hasWorkPositionDict && member.value.positionCode === null) member.value.jobPosition = null;
1847
2422
  };
1848
2423
  onMounted(async () => {
@@ -1891,8 +2466,42 @@ export default {
1891
2466
  },
1892
2467
  );
1893
2468
 
2469
+ if (dataStore.isGons) {
2470
+ watch(
2471
+ () => member.value.chooseChild,
2472
+ val => {
2473
+ if (val === dataStore.t('form.addBeneficiary')) {
2474
+ const idsToFind = ['14', '15', '21', '20', '24', '25', '27'];
2475
+ const filteredData = dataStore.relations.filter(item => idsToFind.includes(item.ids as string));
2476
+ filteredRelationsData.value = filteredData;
2477
+ } else {
2478
+ filteredRelationsData.value = dataStore.relations;
2479
+ }
2480
+ },
2481
+ { immediate: true },
2482
+ );
2483
+ }
2484
+
2485
+ watch(
2486
+ () => member.value.registrationProvince,
2487
+ (val, oldVal) => {
2488
+ if (val.nameRu !== null && val.nameRu !== oldVal.nameRu && val.ids !== member.value.registrationCity.code) {
2489
+ member.value.registrationCity = new Value();
2490
+ }
2491
+ },
2492
+ );
2493
+
2494
+ watch(
2495
+ () => isRegionDisabled.value,
2496
+ val => {
2497
+ if (val) {
2498
+ member.value.registrationProvince = new Value();
2499
+ }
2500
+ },
2501
+ );
2502
+
1894
2503
  const onIinInput = () => {
1895
- if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value.isMultiple === true) {
2504
+ if (!!member.value.iin && member.value.iin.length === useMask().iin.length && memberSetting.value?.isMultiple === true) {
1896
2505
  const alreadyInStatement = formStore[whichForm.value as MultipleMember].findIndex((i: Member) => i.iin === member.value.iin);
1897
2506
  if (alreadyInStatement !== -1 && alreadyInStatement !== Number(whichIndex.value)) {
1898
2507
  dataStore.showToaster('error', dataStore.t('toaster.hasAlreadyMember'), 3000);
@@ -1929,17 +2538,31 @@ export default {
1929
2538
  searchQuery.value = '';
1930
2539
  }
1931
2540
  });
1932
- if (dataStore.isLifetrip) {
2541
+
2542
+ watch(familyDialog, val => {
2543
+ if (!val) {
2544
+ closeFamilyDialog();
2545
+ }
2546
+ });
2547
+
2548
+ watch(digitalDocumentDialog, val => {
2549
+ if (!val) {
2550
+ digitalDocumentOwnerType.value = '';
2551
+ }
2552
+ });
2553
+
2554
+ if (dataStore.isLifetrip && whichForm.value === 'insuredForm') {
1933
2555
  watch(
1934
2556
  () => member.value.age,
1935
2557
  val => {
1936
- if (val && Number(val) >= 18) {
1937
- if (member.value.hasAgreement !== true) {
2558
+ if (val) {
2559
+ if (Number(val) >= 18 && member.value.hasAgreement !== true) {
1938
2560
  member.value.hasAgreement = false;
2561
+ } else {
2562
+ member.value.hasAgreement = true;
1939
2563
  }
1940
- } else {
1941
- member.value.hasAgreement = true;
1942
2564
  }
2565
+
1943
2566
  member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1944
2567
  },
1945
2568
  { immediate: true },
@@ -1955,15 +2578,35 @@ export default {
1955
2578
  );
1956
2579
  }
1957
2580
  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
- );
2581
+ if (member.value.bankInfo) {
2582
+ watch(
2583
+ () => member.value.bankInfo.iik,
2584
+ async val => {
2585
+ if (val && val.length === 20) {
2586
+ if (
2587
+ route.query.tab === 'slaveInsuredForm'
2588
+ ? formStore.insuredForm.some(i => i.bankInfo.iik === val)
2589
+ : formStore.applicationData.processCode === 25 && val === formStore.slaveInsuredForm.bankInfo.iik
2590
+ ) {
2591
+ dataStore.showToaster('error', `ИИК: "${val}" уже имеется в заявке`);
2592
+ member.value.bankInfo = new BankInfoClass();
2593
+ return;
2594
+ }
2595
+ isButtonLoading.value = true;
2596
+ const bank = await dataStore.getBankByAccountNumber(val);
2597
+ if (bank) {
2598
+ member.value.bankInfo.bik = String(bank.code);
2599
+ member.value.bankInfo.bin = member.value.bankInfo.bankName.ids = reformatIin(String(bank.ids));
2600
+ member.value.bankInfo.bankName.nameRu = String(bank.nameRu);
2601
+ member.value.bankInfo.bankName.id = Number(bank.id);
2602
+ } else member.value.bankInfo = new BankInfoClass();
2603
+ isButtonLoading.value = false;
2604
+ } else if (!val) {
2605
+ member.value.bankInfo = new BankInfoClass();
2606
+ }
2607
+ },
2608
+ );
2609
+ }
1967
2610
  watch(
1968
2611
  () => member.value.isDisability,
1969
2612
  val => {
@@ -1974,6 +2617,63 @@ export default {
1974
2617
  },
1975
2618
  );
1976
2619
  }
2620
+ watch(
2621
+ member.value,
2622
+ () => {
2623
+ if (!isReady.value) return;
2624
+ dataStore.isDirty = true;
2625
+ },
2626
+ { deep: true },
2627
+ );
2628
+ watch(
2629
+ () => member.value.documentType,
2630
+ val => {
2631
+ if (val && val.ids !== 'PS') {
2632
+ middleNameIsEditable.value = false;
2633
+ }
2634
+ },
2635
+ );
2636
+ onBeforeRouteLeave((to, from, next) => {
2637
+ if (dataStore.isDirty) {
2638
+ dataStore.quitDialog = true;
2639
+ pendingRoute.value = to;
2640
+ next(false);
2641
+ } else {
2642
+ next();
2643
+ }
2644
+ });
2645
+ const discardAndContinue = async () => {
2646
+ dataStore.quitDialog = false;
2647
+ dataStore.isDirty = false;
2648
+
2649
+ if (member.value.id === 0) {
2650
+ Object.assign(member.value, JSON.parse(JSON.stringify(initialMember.value)));
2651
+ isReady.value = false;
2652
+ }
2653
+ if (member.value.id !== 0) {
2654
+ Object.assign(member.value, JSON.parse(JSON.stringify(initialMember.value)));
2655
+ initialMember.value = new Member();
2656
+ isReady.value = false;
2657
+ }
2658
+ if (pendingRoute.value) {
2659
+ await router.replace(pendingRoute.value);
2660
+ pendingRoute.value = null;
2661
+ }
2662
+ if (dataStore.pendingTab) {
2663
+ dataStore.menu.selectedItem = dataStore.pendingTab;
2664
+ emit('updateTab', dataStore.pendingTab);
2665
+ dataStore.pendingTab = null;
2666
+ }
2667
+ if (subMemberRoute.value) {
2668
+ await router.replace(subMemberRoute.value);
2669
+ subMemberRoute.value = null;
2670
+ }
2671
+ };
2672
+ const stayHere = () => {
2673
+ dataStore.quitDialog = false;
2674
+ pendingRoute.value = null;
2675
+ dataStore.pendingTab = null;
2676
+ };
1977
2677
 
1978
2678
  return {
1979
2679
  // State
@@ -2000,11 +2700,20 @@ export default {
2000
2700
  familyDialog,
2001
2701
  deletionDialog,
2002
2702
  documentChooseDialog,
2703
+ fioChooseDialog,
2003
2704
  selectedIndex,
2004
2705
  selectedFamilyMember,
2005
2706
  sameAddress,
2006
2707
  isRelative,
2007
2708
  imageDataList,
2709
+ contragents,
2710
+ filteredRelationsData,
2711
+ digitalDocumentDialog,
2712
+ parentIin,
2713
+ childrenLoaded,
2714
+ middleNameIsEditable,
2715
+ digitalDocumentOwnerType,
2716
+
2008
2717
  // Computed
2009
2718
  whichForm,
2010
2719
  whichIndex,
@@ -2013,23 +2722,31 @@ export default {
2013
2722
  hasOtp,
2014
2723
  isDisabled,
2015
2724
  isTask,
2725
+ isRegionDisabled,
2016
2726
  isIinPhoneDisabled,
2017
- isFromGBD,
2018
2727
  showSaveButton,
2019
2728
  hasGBDFL,
2020
2729
  hasInsis,
2021
2730
  hasGKB,
2022
- hasDocumentReader,
2023
2731
  hasMiddleName,
2024
2732
  hasRelationDegree,
2025
2733
  hasFamilyStatus,
2026
2734
  hasInsurancePay,
2027
2735
  hasSignOfIPDL,
2028
2736
  hasSameAddressToggle,
2737
+ hasIssuerOther,
2029
2738
  hasMemberSearch,
2030
2739
  hasWorkPositionDict,
2031
2740
  gbdDocuments,
2032
2741
  hasGBDFLDocSelection,
2742
+ isNonResident,
2743
+ isDataFromGov,
2744
+ isChooseChild,
2745
+ documentIssuerIsEditable,
2746
+ hasDigitalDocument,
2747
+ isOwnChild,
2748
+ isEmpty,
2749
+ documentItems,
2033
2750
 
2034
2751
  // Rules
2035
2752
  ageRule,
@@ -2038,6 +2755,7 @@ export default {
2038
2755
  birthDateRule,
2039
2756
 
2040
2757
  // Functions
2758
+ getToday,
2041
2759
  searchMember,
2042
2760
  openPanel,
2043
2761
  openCustomPanel,
@@ -2051,7 +2769,7 @@ export default {
2051
2769
  attachFile,
2052
2770
  attachDocumentReader,
2053
2771
  getDocumentReader,
2054
- getFile,
2772
+ getDoc,
2055
2773
  selectFamilyMember,
2056
2774
  closeFamilyDialog,
2057
2775
  openDeletionDialog,
@@ -2063,7 +2781,30 @@ export default {
2063
2781
  searchPositions,
2064
2782
  selectGbdDocument,
2065
2783
  pickPosition,
2784
+ stayHere,
2785
+ discardAndContinue,
2786
+ getContragentClick,
2787
+ getCode,
2788
+ getDigitalDocument,
2789
+ startGettingDigitalDocument,
2790
+ updateDigitalDocuments,
2791
+ getChildren,
2066
2792
  };
2067
2793
  },
2068
2794
  };
2069
2795
  </script>
2796
+
2797
+ <style scoped>
2798
+ .before-divider {
2799
+ position: relative;
2800
+ }
2801
+ .before-divider + .before-divider:before {
2802
+ content: '';
2803
+ position: absolute;
2804
+ top: -15px;
2805
+ left: 0;
2806
+ width: 100%;
2807
+ height: 1px;
2808
+ background-color: #e5e7eb;
2809
+ }
2810
+ </style>