hl-core 0.0.9-beta.9 → 0.0.10-beta.10

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 (75) hide show
  1. package/api/base.api.ts +1110 -0
  2. package/api/index.ts +2 -620
  3. package/api/interceptors.ts +38 -1
  4. package/components/Button/Btn.vue +1 -6
  5. package/components/Complex/MessageBlock.vue +1 -1
  6. package/components/Complex/Page.vue +1 -1
  7. package/components/Complex/TextBlock.vue +25 -0
  8. package/components/Dialog/Dialog.vue +72 -16
  9. package/components/Dialog/FamilyDialog.vue +3 -1
  10. package/components/Form/DynamicForm.vue +101 -0
  11. package/components/Form/FormBlock.vue +12 -3
  12. package/components/Form/FormData.vue +111 -0
  13. package/components/Form/FormSection.vue +3 -3
  14. package/components/Form/FormTextSection.vue +11 -3
  15. package/components/Form/FormToggle.vue +25 -5
  16. package/components/Form/ManagerAttachment.vue +178 -89
  17. package/components/Form/ProductConditionsBlock.vue +59 -6
  18. package/components/Input/Datepicker.vue +43 -7
  19. package/components/Input/DynamicInput.vue +25 -0
  20. package/components/Input/FileInput.vue +25 -5
  21. package/components/Input/FormInput.vue +9 -4
  22. package/components/Input/Monthpicker.vue +34 -0
  23. package/components/Input/PanelInput.vue +6 -1
  24. package/components/Input/RoundedInput.vue +2 -0
  25. package/components/Input/RoundedSelect.vue +9 -2
  26. package/components/Input/SwitchInput.vue +66 -0
  27. package/components/Input/TextInput.vue +162 -0
  28. package/components/Layout/Drawer.vue +18 -4
  29. package/components/Layout/Header.vue +23 -2
  30. package/components/Layout/Loader.vue +2 -1
  31. package/components/Layout/SettingsPanel.vue +24 -11
  32. package/components/Menu/InfoMenu.vue +35 -0
  33. package/components/Menu/MenuNav.vue +25 -3
  34. package/components/Pages/Anketa.vue +255 -65
  35. package/components/Pages/Auth.vue +58 -9
  36. package/components/Pages/ContragentForm.vue +10 -9
  37. package/components/Pages/Documents.vue +267 -30
  38. package/components/Pages/InvoiceInfo.vue +1 -1
  39. package/components/Pages/MemberForm.vue +775 -102
  40. package/components/Pages/ProductAgreement.vue +1 -8
  41. package/components/Pages/ProductConditions.vue +1133 -180
  42. package/components/Panel/PanelHandler.vue +627 -49
  43. package/components/Panel/PanelSelectItem.vue +17 -2
  44. package/components/Panel/RightPanelCloser.vue +7 -0
  45. package/components/Transitions/Animation.vue +30 -0
  46. package/components/Utilities/Chip.vue +2 -0
  47. package/components/Utilities/JsonViewer.vue +2 -2
  48. package/components/Utilities/Qr.vue +44 -0
  49. package/composables/axios.ts +1 -0
  50. package/composables/classes.ts +550 -44
  51. package/composables/constants.ts +126 -6
  52. package/composables/fields.ts +330 -0
  53. package/composables/index.ts +356 -20
  54. package/composables/styles.ts +23 -6
  55. package/configs/pwa.ts +63 -0
  56. package/layouts/clear.vue +21 -0
  57. package/layouts/default.vue +62 -3
  58. package/layouts/full.vue +21 -0
  59. package/locales/ru.json +558 -16
  60. package/nuxt.config.ts +6 -15
  61. package/package.json +38 -39
  62. package/pages/Token.vue +0 -13
  63. package/plugins/head.ts +26 -0
  64. package/plugins/vuetifyPlugin.ts +1 -5
  65. package/store/data.store.ts +1647 -348
  66. package/store/extractStore.ts +17 -0
  67. package/store/form.store.ts +13 -1
  68. package/store/member.store.ts +2 -1
  69. package/store/rules.ts +97 -3
  70. package/store/toast.ts +1 -1
  71. package/tsconfig.json +3 -0
  72. package/types/enum.ts +82 -0
  73. package/types/env.d.ts +2 -0
  74. package/types/form.ts +90 -0
  75. package/types/index.ts +847 -506
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <section class="flex flex-col gap-4 px-[10px]">
3
- <v-form v-if="member" ref="vForm" @submit="submitForm" class="max-h-[82svh] overflow-y-scroll">
3
+ <v-form v-if="member" ref="vForm" @submit="submitForm" class="max-h-[80svh] overflow-y-scroll">
4
4
  <div v-if="memberSetting && memberSetting.has === true && memberSetting.isMultiple === true" class="flex items-center mt-[14px] min-h-[54px]">
5
5
  <div :class="[$styles.blueBgLight]" class="flex flex-wrap items-center gap-2 p-1 rounded-t-[8px] h-full">
6
6
  <div
@@ -17,23 +17,60 @@
17
17
  :disabled="!memberStore.canMemberDeleted(whichForm, index) && !memberStore.canMemberCleared(whichForm, index)"
18
18
  variant="plain"
19
19
  :color="Number(whichIndex) === index ? '#FFF' : '#A0B3D8'"
20
- @click.prevent="memberStore.canMemberDeleted(whichForm, index) || memberStore.canMemberCleared(whichForm, index) ? deleteMember(index) : null"
20
+ @click.prevent="memberStore.canMemberDeleted(whichForm, index) || memberStore.canMemberCleared(whichForm, index) ? openDeletionDialog(index) : null"
21
21
  />
22
22
  </div>
23
23
  </div>
24
24
  <v-btn class="ml-2" icon="mdi-plus !text-[24px]" @click="memberStore.addMember(whichForm)" size="small" color="#A0B3D8" variant="tonal" />
25
25
  </div>
26
+ <base-form-section
27
+ v-if="$dataStore.hasFamilyTiesSection(whichForm)"
28
+ :title="$dataStore.t('pension.familyTies')"
29
+ :class="[memberSetting && memberSetting.has === true && memberSetting.isMultiple === true ? 'rounded-t-0 !mt-[-5px]' : 'mt-[14px]']"
30
+ >
31
+ <base-form-toggle v-model="isRelative" :disabled="isDisabled" :title="$dataStore.t('pension.ifHasRelationBeneficiary')" :has-border="false" :show-value="false" />
32
+ <base-fade-transition>
33
+ <div class="flex flex-col gap-[1px]" v-if="isRelative">
34
+ <base-panel-input
35
+ v-model="formStore.applicationData.insuredApp.iin"
36
+ :maska="$maska.iin"
37
+ :readonly="isDisabled"
38
+ :clearable="false"
39
+ :label="$dataStore.t('pension.insuredIIN')"
40
+ append-inner-icon="mdi mdi-chevron-right"
41
+ @append="searchMember"
42
+ />
43
+ </div>
44
+ </base-fade-transition>
45
+ </base-form-section>
26
46
  <base-form-section
27
47
  :title="$dataStore.t('form.personalData')"
28
48
  :class="[memberSetting && memberSetting.has === true && memberSetting.isMultiple === true ? 'rounded-t-0 !mt-[-5px]' : 'mt-[14px]']"
29
49
  >
50
+ <base-panel-input
51
+ v-if="$dataStore.isLifetrip || $dataStore.isPension"
52
+ v-model="member.signOfResidency"
53
+ :value="member.signOfResidency?.nameRu"
54
+ :label="$dataStore.t('form.signOfResidency')"
55
+ :readonly="isDisabled"
56
+ :clearable="!isDisabled"
57
+ :rules="residencyRule"
58
+ append-inner-icon="mdi mdi-chevron-right"
59
+ @append="openPanel($dataStore.t('form.signOfResidency'), [], 'signOfResidency', $dataStore.getResidents)"
60
+ />
61
+ <base-form-toggle
62
+ v-if="$dataStore.isLifetrip && whichForm === 'insuredForm'"
63
+ v-model="member.isInsuredUnderage"
64
+ :title="$dataStore.t('isInsuredUnderage')"
65
+ :has-border="false"
66
+ />
30
67
  <base-form-input
31
68
  v-model="member.phoneNumber"
32
69
  :label="$dataStore.t('form.phoneNumber')"
33
70
  :maska="$maska.phone"
34
71
  :readonly="!!isDisabled || !!isIinPhoneDisabled"
35
72
  :clearable="!isDisabled"
36
- :append-inner-icon="otpCondition ? 'mdi mdi-phone-message' : ''"
73
+ :append-inner-icon="otpCondition ? `${$dataStore.isPension ? 'mdi-message-text' : 'mdi mdi-phone-message'}` : ''"
37
74
  @append="openCustomPanel('otp')"
38
75
  @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
39
76
  :rules="phoneRule"
@@ -42,49 +79,90 @@
42
79
  v-model="member.iin"
43
80
  :label="$dataStore.t('form.iin')"
44
81
  :maska="$maska.iin"
45
- :readonly="!!isDisabled || !!isIinPhoneDisabled"
82
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin"
46
83
  :clearable="!isDisabled"
47
- :append-inner-icon="showSaveButton ? 'mdi mdi-magnify' : ''"
84
+ :append-inner-icon="hasMemberSearch ? (hasDocumentReader ? 'mdi mdi-credit-card-scan-outline' : 'mdi mdi-magnify') : ''"
48
85
  @append="searchMember"
49
86
  @input="onIinInput"
50
87
  :rules="$rules.required.concat($rules.iinRight)"
51
88
  />
52
89
  <base-form-input
53
90
  v-model.trim="member.lastName"
54
- :readonly="isDisabled || isFromGBD"
91
+ :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.lastName"
55
92
  :clearable="!isDisabled"
56
93
  :label="$dataStore.t('form.lastName')"
57
94
  :rules="$rules.required.concat($rules.cyrillic)"
58
95
  />
59
96
  <base-form-input
60
97
  v-model.trim="member.firstName"
61
- :readonly="isDisabled || isFromGBD"
98
+ :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.firstName"
62
99
  :clearable="!isDisabled"
63
100
  :label="$dataStore.t('form.firstName')"
64
101
  :rules="$rules.required.concat($rules.cyrillic)"
65
102
  />
66
103
  <base-form-input
104
+ v-if="hasMiddleName"
67
105
  v-model.trim="member.middleName"
68
- :readonly="isDisabled || isFromGBD"
106
+ :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.middleName"
69
107
  :clearable="!isDisabled"
70
108
  :label="$dataStore.t('form.middleName')"
71
109
  :rules="$rules.cyrillicNonRequired"
72
110
  />
73
111
  <base-form-input
74
- v-model="member.birthDate"
112
+ v-if="$dataStore.isLifetrip"
113
+ v-model.trim="member.lastNameLat"
114
+ :readonly="isDisabled || isFromGBD"
115
+ :clearable="!isDisabled"
116
+ :label="$dataStore.t('form.lastNameLat')"
117
+ :rules="$rules.required.concat($rules.latin)"
118
+ :hint="$dataStore.t('labels.checkWithDoc')"
119
+ />
120
+ <base-form-input
121
+ v-if="$dataStore.isLifetrip"
122
+ v-model.trim="member.firstNameLat"
75
123
  :readonly="isDisabled || isFromGBD"
76
124
  :clearable="!isDisabled"
125
+ :label="$dataStore.t('form.firstNameLat')"
126
+ :rules="$rules.required.concat($rules.latin)"
127
+ :hint="$dataStore.t('labels.checkWithDoc')"
128
+ />
129
+ <base-form-input
130
+ v-model="member.birthDate"
131
+ :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.birthDate"
132
+ :clearable="!isDisabled"
77
133
  :label="$dataStore.t('form.birthDate')"
78
134
  :rules="birthDateRule"
79
135
  :maska="$maska.date"
80
136
  append-inner-icon="mdi mdi-calendar-blank-outline"
81
137
  />
82
- <base-form-input v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule" />
138
+ <div v-if="$dataStore.isPension">
139
+ <base-panel-input
140
+ v-model="member.countryOfCitizenship"
141
+ :value="member.countryOfCitizenship?.nameRu"
142
+ :label="$dataStore.t('form.countryOfCitizenship')"
143
+ :readonly="isDisabled"
144
+ :clearable="!isDisabled"
145
+ :rules="$rules.objectRequired"
146
+ append-inner-icon="mdi mdi-chevron-right"
147
+ @append="openPanel($dataStore.t('form.countryOfCitizenship'), [], 'countryOfCitizenship', $dataStore.getCitizenshipCountries)"
148
+ />
149
+ <base-panel-input
150
+ v-model="member.birthPlace"
151
+ :value="member.birthPlace?.nameRu"
152
+ :label="$dataStore.t('form.birthData')"
153
+ :readonly="isDisabled"
154
+ :clearable="!isDisabled"
155
+ :rules="$rules.objectRequired"
156
+ append-inner-icon="mdi mdi-chevron-right"
157
+ @append="openPanel($dataStore.t('form.Country'), [], 'birthPlace', $dataStore.getCountries)"
158
+ />
159
+ </div>
160
+ <base-form-input v-if="!$dataStore.isPension" v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule" />
83
161
  <base-panel-input
84
162
  v-model="member.gender"
85
163
  :value="member.gender?.nameRu"
86
164
  :readonly="isDisabled || isFromGBD"
87
- :clearable="!isDisabled"
165
+ :clearable="!isDisabled && !isFromGBD"
88
166
  :label="$dataStore.t('form.gender')"
89
167
  :rules="$rules.objectRequired"
90
168
  append-inner-icon="mdi mdi-chevron-right"
@@ -102,7 +180,7 @@
102
180
  @append="openPanel($dataStore.t('form.familyStatus'), [], 'familyStatus', $dataStore.getFamilyStatuses)"
103
181
  />
104
182
  <base-panel-input
105
- v-if="(whichForm === formStore.beneficiaryFormKey || whichForm === formStore.insuredFormKey) && member.iin !== formStore.policyholderForm.iin"
183
+ v-if="hasRelationDegree"
106
184
  v-model="member.relationDegree"
107
185
  :value="member.relationDegree?.nameRu"
108
186
  :readonly="isDisabled"
@@ -121,6 +199,22 @@
121
199
  :rules="$rules.required.concat($rules.numbers)"
122
200
  />
123
201
  </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" />
204
+ <base-animation>
205
+ <base-panel-input
206
+ v-if="member.isDisability"
207
+ v-model="member.disabilityGroup"
208
+ :value="member.disabilityGroup?.nameRu"
209
+ :readonly="isDisabled"
210
+ :clearable="!isDisabled"
211
+ :label="$dataStore.t('pension.disabilityGroup')"
212
+ :rules="$rules.objectRequired"
213
+ append-inner-icon="mdi mdi-chevron-right"
214
+ @append="openPanel($dataStore.t('pension.disabilityGroup'), $dataStore.disabilityGroups, 'disabilityGroup', $dataStore.getDisabilityGroups)"
215
+ />
216
+ </base-animation>
217
+ </base-form-section>
124
218
  <base-form-section :title="$dataStore.t('policyholdersRepresentative.PowerOfAttorney')" v-if="whichForm === formStore.policyholdersRepresentativeFormKey">
125
219
  <base-form-input
126
220
  v-model.trim="member.fullNameRod"
@@ -231,9 +325,26 @@
231
325
  append-inner-icon="mdi mdi-calendar-blank-outline"
232
326
  />
233
327
  </base-form-section>
234
- <base-form-section :title="$dataStore.t('form.jobData')" v-if="$dataStore.hasJobSection(whichForm)">
328
+ <base-form-section v-if="$dataStore.hasJobSection(whichForm)" :title="$dataStore.t('form.jobData')">
235
329
  <base-form-input v-model.trim="member.job" :label="$dataStore.t('form.job')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
236
- <base-form-input v-model.trim="member.jobPosition" :label="$dataStore.t('form.jobPosition')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
330
+ <base-form-input
331
+ v-if="hasWorkPositionDict"
332
+ v-model.trim="member.jobPosition"
333
+ :label="$dataStore.t('form.jobPosition')"
334
+ :readonly="isDisabled || member.positionCode !== 'other'"
335
+ :clearable="!isDisabled"
336
+ :rules="$rules.required"
337
+ append-inner-icon="mdi-chevron-right"
338
+ @click="openCustomPanel('workPosition')"
339
+ />
340
+ <base-form-input
341
+ v-else
342
+ v-model.trim="member.jobPosition"
343
+ :label="$dataStore.t('form.jobPosition')"
344
+ :readonly="isDisabled"
345
+ :clearable="!isDisabled"
346
+ :rules="$rules.required"
347
+ />
237
348
  <base-form-input v-model.trim="member.jobPlace" :label="$dataStore.t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
238
349
  </base-form-section>
239
350
  <base-form-section :title="$dataStore.t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
@@ -284,7 +395,7 @@
284
395
  <base-panel-input
285
396
  v-model="member.registrationCity"
286
397
  :value="member.registrationCity?.nameRu"
287
- :label="$dataStore.t('form.City')"
398
+ :label="member.registrationRegionType.nameRu === 'поселок' ? $dataStore.t('form.village') : $dataStore.t('form.City')"
288
399
  :readonly="isDisabled"
289
400
  :clearable="!isDisabled"
290
401
  :rules="$rules.objectRequired"
@@ -297,7 +408,7 @@
297
408
  <base-form-input v-model.trim="member.registrationMicroDistrict" :readonly="isDisabled" :clearable="!isDisabled" :label="$dataStore.t('form.MicroDistrict')" />
298
409
  <base-form-input
299
410
  v-model.trim="member.registrationStreet"
300
- :rules="$rules.required"
411
+ :rules="member.isInsuredUnderage || $dataStore.isAULETTI || $dataStore.isAulettiParent ? [] : $rules.required"
301
412
  :readonly="isDisabled"
302
413
  :clearable="!isDisabled"
303
414
  :label="$dataStore.t('form.Street')"
@@ -337,6 +448,15 @@
337
448
  /> -->
338
449
  </base-form-section>
339
450
  <base-form-section :title="$dataStore.t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
451
+ <base-panel-input
452
+ v-if="gbdDocuments && gbdDocuments.length"
453
+ value="Список документов из ГБДФЛ"
454
+ :active="true"
455
+ :readonly="isDisabled"
456
+ :clearable="!isDisabled"
457
+ append-inner-icon="mdi mdi-file-document-outline"
458
+ @append="documentChooseDialog = true"
459
+ />
340
460
  <base-panel-input
341
461
  v-model="member.documentType"
342
462
  :value="member.documentType?.nameRu"
@@ -350,7 +470,7 @@
350
470
  <base-form-input
351
471
  v-model.trim="member.documentNumber"
352
472
  :label="$dataStore.t('form.documentNumber')"
353
- :readonly="isDisabled"
473
+ :readonly="isDisabled || !!member.parsedDocument?.documentNumber"
354
474
  :clearable="!isDisabled"
355
475
  :rules="$rules.required"
356
476
  />
@@ -363,7 +483,7 @@
363
483
  v-model="member.documentIssuers"
364
484
  :value="member.documentIssuers?.nameRu"
365
485
  :label="$dataStore.t('form.documentIssuers')"
366
- :readonly="isDisabled"
486
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssuer"
367
487
  :clearable="!isDisabled"
368
488
  :rules="$rules.objectRequired"
369
489
  append-inner-icon="mdi mdi-chevron-right"
@@ -372,7 +492,7 @@
372
492
  <base-form-input
373
493
  v-model="member.documentDate"
374
494
  :label="$dataStore.t('form.documentDate')"
375
- :readonly="isDisabled"
495
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate"
376
496
  :clearable="!isDisabled"
377
497
  :rules="$rules.required.concat($rules.date)"
378
498
  :maska="$maska.date"
@@ -380,10 +500,10 @@
380
500
  />
381
501
  <base-fade-transition>
382
502
  <base-form-input
383
- v-if="member.documentType.ids !== 'SBI' && member.documentType.ids !== 'VNZ'"
503
+ v-if="member.documentType.ids !== 'SBI'"
384
504
  v-model="member.documentExpire"
385
505
  :label="$dataStore.t('form.documentExpire')"
386
- :readonly="isDisabled"
506
+ :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate"
387
507
  :clearable="!isDisabled"
388
508
  :rules="$rules.required.concat($rules.date)"
389
509
  :maska="$maska.date"
@@ -391,6 +511,7 @@
391
511
  />
392
512
  </base-fade-transition>
393
513
  <base-panel-input
514
+ v-if="!$dataStore.isLifetrip && !$dataStore.isPension"
394
515
  v-model="member.signOfResidency"
395
516
  :value="member.signOfResidency?.nameRu"
396
517
  :label="$dataStore.t('form.signOfResidency')"
@@ -427,7 +548,7 @@
427
548
  v-if="hasSignOfIPDL"
428
549
  v-model="member.signOfIPDL"
429
550
  :value="member.signOfIPDL?.nameRu"
430
- :label="$dataStore.t('form.signOfIPDL')"
551
+ :label="$dataStore.isPension ? $dataStore.t('form.signOfPDL') : $dataStore.t('form.signOfIPDL')"
431
552
  :readonly="isDisabled"
432
553
  :clearable="!isDisabled"
433
554
  :rules="$rules.objectRequired"
@@ -435,6 +556,7 @@
435
556
  @append="openPanel($dataStore.t('form.signOfIPDL'), $dataStore.ipdl, 'signOfIPDL')"
436
557
  />
437
558
  <base-panel-input
559
+ v-if="!$dataStore.isPension"
438
560
  v-model="member.countryOfCitizenship"
439
561
  :value="member.countryOfCitizenship?.nameRu"
440
562
  :label="$dataStore.t('form.countryOfCitizenship')"
@@ -466,6 +588,61 @@
466
588
  @append="openPanel($dataStore.t('form.insurancePay'), $dataStore.insurancePay, 'insurancePay', $dataStore.getInsurancePay)"
467
589
  />
468
590
  </base-form-section>
591
+ <base-form-section v-if="$dataStore.hasBankSection(whichForm)" :title="$dataStore.t('bankDetailsForm.title')">
592
+ <base-form-input
593
+ v-model="member.bankInfo.iik"
594
+ :label="$dataStore.t('clients.form.iik')"
595
+ :maska="$maska.iik"
596
+ :readonly="isDisabled"
597
+ :clearable="!isDisabled"
598
+ :rules="$rules.required.concat($rules.iik)"
599
+ />
600
+ <base-panel-input
601
+ v-model="member.bankInfo.bankName"
602
+ :value="member.bankInfo.bankName.nameRu"
603
+ :label="$dataStore.t('clients.form.nameBank')"
604
+ :readonly="isDisabled"
605
+ :clearable="!isDisabled"
606
+ :rules="$rules.objectRequired"
607
+ append-inner-icon="mdi mdi-chevron-right"
608
+ @append="openPanel($dataStore.t('clients.form.nameBank'), [], 'bankInfo', $dataStore.getBanks, '', 'bankName')"
609
+ />
610
+ <base-form-input
611
+ v-model.trim="member.bankInfo.bin"
612
+ :label="$dataStore.t('form.bin')"
613
+ :maska="$maska.iin"
614
+ :readonly="isDisabled"
615
+ :clearable="!isDisabled"
616
+ :rules="$rules.required.concat($rules.iinRight)"
617
+ />
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
+ />
645
+ </base-form-section>
469
646
  <base-form-section :title="$dataStore.t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
470
647
  <base-form-input
471
648
  v-model="member.homePhone"
@@ -476,11 +653,11 @@
476
653
  :clearable="!isDisabled"
477
654
  :rules="whichForm === formStore.beneficiaryFormKey ? [] : $rules.phoneFormat"
478
655
  />
479
- <base-form-input v-model.trim="member.email" :label="$dataStore.t('form.email')" :rules="$rules.email" />
656
+ <base-form-input v-model.trim="member.email" :label="$dataStore.t('form.email')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.email" />
480
657
  </base-form-section>
481
658
  </v-form>
482
659
  <base-btn v-if="showSaveButton" :loading="isButtonLoading || isSubmittingForm" :text="$dataStore.t('buttons.save')" @click="submitForm" />
483
- <Teleport v-if="isPanelOpen" to="#panel-actions">
660
+ <Teleport v-if="isPanelOpen" to="#right-panel-actions">
484
661
  <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
485
662
  <base-rounded-input v-model="searchQuery" :label="$dataStore.t('labels.search')" class="w-full p-2" :hide-details="true" />
486
663
  <div v-if="panelList && isPanelLoading === false" class="w-full flex flex-col gap-2 p-2">
@@ -488,7 +665,7 @@
488
665
  <base-panel-select-item
489
666
  v-for="(item, index) of panelList.filter(i => i.nameRu && (i.nameRu as string).match(new RegExp(searchQuery, 'i')))"
490
667
  :key="index"
491
- :text="(item.nameRu as string)"
668
+ :text="String(item.nameRu)"
492
669
  :selected="item.nameRu === panelValue.nameRu"
493
670
  @click="pickPanelValue(item)"
494
671
  />
@@ -496,20 +673,34 @@
496
673
  <base-loader v-if="isPanelLoading" class="absolute mt-10" :size="50" />
497
674
  </div>
498
675
  </Teleport>
499
- <Teleport v-if="isSearchOpen" to="#panel-actions">
676
+ <Teleport v-if="isSearchOpen" to="#right-panel-actions">
500
677
  <div :class="[$styles.flexColNav]">
501
678
  <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
502
679
  <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
503
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>
504
695
  </div>
505
696
  </Teleport>
506
- <Teleport v-if="isDocumentOpen" to="#panel-actions">
697
+ <Teleport v-if="isDocumentOpen" to="#right-panel-actions">
507
698
  <div :class="[$styles.flexColNav]">
508
699
  <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getFile('view')" />
509
700
  <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getFile('download')" />
510
701
  </div>
511
702
  </Teleport>
512
- <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#panel-actions">
703
+ <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#right-panel-actions">
513
704
  <div :class="[$styles.flexColNav]">
514
705
  <base-fade-transition>
515
706
  <base-rounded-input
@@ -527,11 +718,71 @@
527
718
  <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.check')" @click="checkOtp()" />
528
719
  </div>
529
720
  </Teleport>
530
- <base-dialog v-model="familyDialog" :title="$dataStore.t('dialog.familyMember')" actions="familyDialog">
721
+ <Teleport v-if="isPositionPanelOpen" to="#right-panel-actions">
722
+ <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
723
+ <base-rounded-input
724
+ v-model="searchQuery"
725
+ :label="$dataStore.t('labels.search')"
726
+ class="w-full p-2"
727
+ :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'"
730
+ @append="searchPositions"
731
+ />
732
+ <base-animation>
733
+ <div v-if="positionsList && positionsList.length && isPanelLoading === false" class="w-full flex flex-col gap-2 p-2">
734
+ <base-panel-select-item
735
+ :text="$dataStore.t('form.notChosen')"
736
+ :selected="member.positionCode === null"
737
+ @click="pickPosition({ workPositionName: null, workPositionCode: null })"
738
+ />
739
+ <base-panel-select-item
740
+ v-for="(item, index) of positionsList"
741
+ :key="index"
742
+ :text="String(item.workPositionName)"
743
+ :selected="item.workPositionCode === member.positionCode"
744
+ @click="pickPosition({ workPositionName: item.workPositionName, workPositionCode: item.workPositionCode })"
745
+ />
746
+ </div>
747
+ <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' })" />
749
+ <span :class="[$styles.mutedText]">{{ $dataStore.t('toaster.notFound') }}</span>
750
+ </div>
751
+ </base-animation>
752
+ <base-animation>
753
+ <base-loader v-if="isPanelLoading" class="absolute mt-10" :size="50" />
754
+ </base-animation>
755
+ </div>
756
+ </Teleport>
757
+ <base-dialog
758
+ v-model="deletionDialog"
759
+ :title="$dataStore.t('dialog.confirmDelete')"
760
+ :subtitle="$dataStore.t('dialog.delete')"
761
+ :confirm="$dataStore.t('confirm.delete')"
762
+ :icon="{ mdi: 'delete-outline', color: '#FD2D39' }"
763
+ @yes="deleteMember"
764
+ @no="deletionDialog = false"
765
+ />
766
+ <base-dialog v-model="familyDialog" :subtitle="$dataStore.t('dialog.familyMember')" :icon="{ mdi: 'hand-pointing-up' }" actions="familyDialog">
531
767
  <template #actions>
532
768
  <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" />
533
769
  </template>
534
770
  </base-dialog>
771
+ <base-dialog v-model="documentChooseDialog" :subtitle="$dataStore.t('labels.chooseDoc')" :icon="{ mdi: 'file-document-outline' }" actions="documentChooseDialog">
772
+ <template #actions>
773
+ <v-list lines="two" v-if="gbdDocuments && gbdDocuments.length" class="w-full !py-0">
774
+ <v-list-item v-for="document of gbdDocuments" :key="document.number" @click="selectGbdDocument(document)">
775
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">
776
+ {{ `${document.type.nameRu} - ${document.number} ` }}
777
+ </v-list-item-title>
778
+ <v-list-item-subtitle :class="[$styles.textSimple]">
779
+ <span>{{ `${document.issueOrganization.nameRu}` }} </span>{{ `${document.beginDate} - ${document.endDate} ` }}
780
+ </v-list-item-subtitle>
781
+ </v-list-item>
782
+ </v-list>
783
+ <base-list-empty class="w-full" v-else @click="documentChooseDialog = false" />
784
+ </template>
785
+ </base-dialog>
535
786
  </section>
536
787
  <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')" />
537
788
  </template>
@@ -539,7 +790,8 @@
539
790
  <script lang="ts">
540
791
  import { Value, DocumentItem, Member } from '../../composables/classes';
541
792
  import { uuid } from 'vue-uuid';
542
- import { StoreMembers } from '../../types/enum';
793
+ import { StoreMembers, Enums } from '../../types/enum';
794
+ import type { Api, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
543
795
 
544
796
  export default {
545
797
  setup() {
@@ -553,7 +805,7 @@ export default {
553
805
  const whichIndex = computed(() => route.query.i as string);
554
806
  const getMember = (whichForm: keyof typeof StoreMembers, whichIndex?: string) => memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
555
807
  const member = ref(getMember(whichForm.value, whichIndex.value));
556
- const selectedFamilyMember = ref<BirthInfoGKB>({});
808
+ const selectedFamilyMember = ref<Api.GKB.BirthInfo>({});
557
809
  const isPanelOpen = ref<boolean>(false);
558
810
  const memberDocument = ref<DocumentItem>();
559
811
  const isButtonLoading = ref<boolean>(false);
@@ -563,15 +815,25 @@ export default {
563
815
  const isSearchOpen = ref<boolean>(false);
564
816
  const isDocumentOpen = ref<boolean>(false);
565
817
  const isOtpPanelOpen = ref<boolean>(false);
818
+ const isPositionPanelOpen = ref<boolean>(false);
566
819
  const isPanelLoading = ref<boolean>(false);
567
820
  const isChangingMember = ref<boolean>(false);
568
821
  const familyDialog = ref<boolean>(false);
822
+ const deletionDialog = ref<boolean>(false);
823
+ const documentChooseDialog = ref<boolean>(false);
824
+ const selectedIndex = ref<number>(0);
569
825
  const sameAddress = ref<boolean>(false);
570
826
  const panelValue = ref<Value>(new Value());
571
827
  const panelList = ref<Value[]>([]);
828
+ const positionsList = ref<Dicts.WorkPosition[] | null>(null);
572
829
  const currentPanel = ref<keyof typeof member.value>();
573
830
  const searchQuery = ref<string>('');
574
831
  const fileData = ref<{ file: any }>();
832
+ const imageDataList = ref<string[]>([]);
833
+ const isRelative = ref<boolean>(false);
834
+
835
+ const currentPanelDeep = ref<string>();
836
+ const currentPanelSubDeep = ref<string>();
575
837
 
576
838
  const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
577
839
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
@@ -579,13 +841,26 @@ export default {
579
841
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
580
842
  const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
581
843
  const isFromGBD = computed(() => !!member.value.gosPersonData);
844
+ const gbdDocuments = computed(() => {
845
+ if (hasGBDFLDocSelection && !!member.value.gosPersonData && !!member.value.gosPersonData.documents) {
846
+ const documents = Array.isArray(member.value.gosPersonData.documents.document)
847
+ ? member.value.gosPersonData.documents.document
848
+ : [member.value.gosPersonData.documents.document];
849
+ return documents.filter(i => new Date(i.endDate) > new Date(Date.now()) && i.status.code === '00');
850
+ }
851
+ return null;
852
+ });
582
853
  const showSaveButton = computed(() => {
583
854
  const generalCondition = !isDisabled.value && !!isTask.value && !!dataStore.isInitiator();
584
- const perMemberCondtion = () => {
855
+ const perMemberCondition = () => {
585
856
  switch (whichForm.value) {
586
857
  case formStore.policyholderFormKey:
587
858
  return true;
588
859
  case formStore.insuredFormKey:
860
+ if (dataStore.isPension) {
861
+ return true;
862
+ }
863
+ return route.params.taskId !== '0';
589
864
  case formStore.beneficiaryFormKey:
590
865
  case formStore.beneficialOwnerFormKey:
591
866
  case formStore.policyholdersRepresentativeFormKey:
@@ -594,7 +869,7 @@ export default {
594
869
  return false;
595
870
  }
596
871
  };
597
- return generalCondition && perMemberCondtion();
872
+ return generalCondition && perMemberCondition();
598
873
  });
599
874
 
600
875
  const hasGBDFL = computed(() => {
@@ -607,9 +882,17 @@ export default {
607
882
  if (dataStore.isBolashak || dataStore.isGons) {
608
883
  return false;
609
884
  }
885
+ if (member.value.age !== null && Number(member.value.age) < 18) {
886
+ return false;
887
+ }
888
+ return true;
889
+ }
890
+ case formStore.insuredFormKey: {
891
+ if (dataStore.isLifetrip && member.value.isInsuredUnderage) {
892
+ return false;
893
+ }
610
894
  return true;
611
895
  }
612
- case formStore.insuredFormKey:
613
896
  case formStore.beneficialOwnerFormKey:
614
897
  case formStore.policyholdersRepresentativeFormKey:
615
898
  return true;
@@ -617,8 +900,9 @@ export default {
617
900
  return true;
618
901
  }
619
902
  };
620
- return dataStore.controls.hasGBDFL && perMemberCondition();
903
+ return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
621
904
  });
905
+ const hasGBDFLDocSelection = dataStore.isLifetrip && whichForm.value === formStore.policyholderFormKey;
622
906
  const hasInsis = computed(() => dataStore.controls.hasInsis);
623
907
  const hasGKB = computed(() => {
624
908
  const perMemberCondition = () => {
@@ -638,10 +922,31 @@ export default {
638
922
  return false;
639
923
  }
640
924
  };
641
- return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
925
+ return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
926
+ });
927
+ const hasDocumentReader = computed(() => {
928
+ return !!member.value.hasAgreement && !!isTask.value && (dataStore.isAULETTI || dataStore.isAulettiParent);
929
+ });
930
+ const hasMemberSearch = computed(() => showSaveButton.value && (hasGBDFL.value || hasGKB.value || hasInsis.value || hasDocumentReader.value));
931
+ const hasMiddleName = computed(() => {
932
+ if (dataStore.isLifetrip) {
933
+ return false;
934
+ }
935
+ return true;
936
+ });
937
+ const hasRelationDegree = computed(() => {
938
+ if (dataStore.isLifetrip || dataStore.isPension) {
939
+ return false;
940
+ }
941
+ if ((whichForm.value === formStore.beneficiaryFormKey || whichForm.value === formStore.insuredFormKey) && member.value.iin !== formStore.policyholderForm.iin) {
942
+ return true;
943
+ }
944
+ return false;
642
945
  });
643
-
644
946
  const hasFamilyStatus = computed(() => {
947
+ if (dataStore.isLifetrip || dataStore.isPension) {
948
+ return false;
949
+ }
645
950
  if (whichForm.value === formStore.beneficiaryFormKey) {
646
951
  if (dataStore.isBolashak) {
647
952
  return false;
@@ -658,16 +963,21 @@ export default {
658
963
  return false;
659
964
  });
660
965
  const hasSignOfIPDL = computed(() => {
661
- if (dataStore.isGons) {
966
+ if (dataStore.isGons || dataStore.isLifetrip) {
662
967
  return false;
663
968
  }
664
969
  return true;
665
970
  });
666
- const hasSameAddressToggle = computed(() => whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin);
971
+ const hasSameAddressToggle = computed(
972
+ () =>
973
+ (whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin) ||
974
+ (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage),
975
+ );
976
+ const hasWorkPositionDict = !useEnv().isProduction && dataStore.isBaiterek && dataStore.isEfoParent;
667
977
 
668
978
  const birthDateRule = computed(() => {
669
979
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
670
- const byMemverAndProductRule = () => {
980
+ const byMemberAndProductRule = () => {
671
981
  if (whichForm.value === formStore.policyholderFormKey) {
672
982
  if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
673
983
  return dataStore.rules.age18ByDate;
@@ -677,10 +987,13 @@ export default {
677
987
  if (dataStore.isBolashak || dataStore.isBaiterek) {
678
988
  return dataStore.rules.age18ByDate;
679
989
  }
990
+ if (dataStore.isLifetrip) {
991
+ return dataStore.rules.ageExceeds80ByDate;
992
+ }
680
993
  }
681
994
  return [];
682
995
  };
683
- return baseDateRule.concat(byMemverAndProductRule());
996
+ return baseDateRule.concat(byMemberAndProductRule());
684
997
  });
685
998
  const ageRule = computed(() => {
686
999
  const baseAgeRule = dataStore.rules.numbers;
@@ -711,10 +1024,13 @@ export default {
711
1024
  if (dataStore.isGons || dataStore.isBolashak) {
712
1025
  return [];
713
1026
  }
714
- if ((dataStore.isKazyna || dataStore.isLiferenta) && Number(member.value.age) < 18) {
1027
+ if (member.value.age !== null && Number(member.value.age) < 18) {
715
1028
  return [];
716
1029
  }
717
1030
  }
1031
+ if (member.value.isInsuredUnderage) {
1032
+ return [];
1033
+ }
718
1034
  return basePhoneRule;
719
1035
  });
720
1036
 
@@ -725,6 +1041,9 @@ export default {
725
1041
  return baseResidencyRule.concat(dataStore.rules.noResident);
726
1042
  }
727
1043
  }
1044
+ if (dataStore.isLifetrip) {
1045
+ return baseResidencyRule.concat(dataStore.rules.noResidentOffline);
1046
+ }
728
1047
  return baseResidencyRule;
729
1048
  });
730
1049
 
@@ -732,8 +1051,10 @@ export default {
732
1051
  switch (whichForm.value) {
733
1052
  case formStore.policyholderFormKey:
734
1053
  return route.params.taskId === '0';
735
- case formStore.policyholdersRepresentativeFormKey:
736
1054
  case formStore.insuredFormKey:
1055
+ if (dataStore.isPension) return route.params.taskId === '0';
1056
+ return route.query.id === '0';
1057
+ case formStore.policyholdersRepresentativeFormKey:
737
1058
  case formStore.beneficiaryFormKey:
738
1059
  case formStore.beneficialOwnerFormKey:
739
1060
  return route.query.id === '0';
@@ -742,6 +1063,8 @@ export default {
742
1063
  const otpCondition = computed(() => {
743
1064
  // Add conditions by product
744
1065
  if (member.value.hasAgreement) return false;
1066
+ if (whichForm.value === formStore.beneficiaryFormKey && member.value.age !== null && Number(member.value.age) < 18) return false;
1067
+ if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) return false;
745
1068
  if (!member.value.phoneNumber || (member.value.phoneNumber && member.value.phoneNumber.length !== useMask().phone.length)) return false;
746
1069
  return getOtpConditionByMember();
747
1070
  });
@@ -749,45 +1072,72 @@ export default {
749
1072
  const searchMember = async () => {
750
1073
  if (!isDisabled.value) {
751
1074
  dataStore.panelAction = null;
752
- dataStore.panel.title = 'Поиск контрагента';
753
- dataStore.panel.open = true;
1075
+ dataStore.rightPanel.title = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента';
1076
+ dataStore.rightPanel.open = true;
754
1077
  isSearchOpen.value = true;
755
1078
  isDocumentOpen.value = false;
756
1079
  isOtpPanelOpen.value = false;
757
1080
  isPanelOpen.value = false;
1081
+ isPositionPanelOpen.value = false;
758
1082
  } else {
759
1083
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
760
1084
  }
761
1085
  };
762
1086
 
1087
+ const searchPositions = async () => {
1088
+ if (!isDisabled.value) {
1089
+ isPanelLoading.value = true;
1090
+ positionsList.value = await dataStore.getWorkPosition(searchQuery.value);
1091
+ isPanelLoading.value = false;
1092
+ } else {
1093
+ dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
1094
+ }
1095
+ };
1096
+
1097
+ const pickPosition = (position: { workPositionName: string | null; workPositionCode: string | null | 'other' }) => {
1098
+ member.value.jobPosition = position.workPositionName;
1099
+ member.value.positionCode = position.workPositionCode;
1100
+ dataStore.rightPanel.open = false;
1101
+ };
1102
+
763
1103
  const scrollForm = (direction: 'up' | 'down') => {
764
1104
  vForm.value.scrollTo({ top: direction === 'up' ? 0 : screen.height * 10, behavior: 'smooth' });
765
1105
  };
766
1106
 
767
- const openCustomPanel = (type: 'document' | 'otp' = 'document') => {
1107
+ const openCustomPanel = (type: 'document' | 'otp' | 'workPosition' = 'document') => {
768
1108
  dataStore.panelAction = null;
769
1109
  if (type === 'document' && memberDocument.value) {
770
- dataStore.panel.title = memberDocument.value.fileTypeName!;
1110
+ dataStore.rightPanel.title = memberDocument.value.fileTypeName!;
771
1111
  isDocumentOpen.value = true;
772
1112
  isSearchOpen.value = false;
773
1113
  isPanelOpen.value = false;
774
1114
  isOtpPanelOpen.value = false;
1115
+ isPositionPanelOpen.value = false;
775
1116
  }
776
1117
  if (type === 'otp') {
777
- dataStore.panel.title = dataStore.t('form.otpCode');
1118
+ dataStore.rightPanel.title = dataStore.t('form.otpCode');
778
1119
  isOtpPanelOpen.value = true;
779
1120
  isDocumentOpen.value = false;
780
1121
  isSearchOpen.value = false;
781
1122
  isPanelOpen.value = false;
1123
+ isPositionPanelOpen.value = false;
1124
+ }
1125
+ if (type === 'workPosition') {
1126
+ isPositionPanelOpen.value = true;
1127
+ isOtpPanelOpen.value = false;
1128
+ isDocumentOpen.value = false;
1129
+ isSearchOpen.value = false;
1130
+ isPanelOpen.value = false;
782
1131
  }
783
- dataStore.panel.open = true;
1132
+ dataStore.rightPanel.open = true;
784
1133
  };
785
1134
 
786
- const openPanel = async (title: string, list: Value[], key: string, asyncFunction?: Function, filterKey?: string) => {
1135
+ const openPanel = async (title: string, list: Value[], key: string, asyncFunction?: Function, filterKey?: string, deepKey?: string, subDeepKey?: string) => {
787
1136
  if (!isDisabled.value) {
788
1137
  isSearchOpen.value = false;
789
1138
  isDocumentOpen.value = false;
790
1139
  isOtpPanelOpen.value = false;
1140
+ isPositionPanelOpen.value = false;
791
1141
  // Feature
792
1142
  // const notAllowedToChange = ['gender', 'documentType', 'documentIssuers'];
793
1143
  // if (member.value.gotFromInsis === false && notAllowedToChange.includes(key)) {
@@ -798,16 +1148,41 @@ export default {
798
1148
  currentPanel.value = key as keyof typeof member.value;
799
1149
  isPanelOpen.value = true;
800
1150
  dataStore.panelAction = null;
801
- dataStore.panel.open = true;
802
- dataStore.panel.title = title;
1151
+ dataStore.rightPanel.open = true;
1152
+ dataStore.rightPanel.title = title;
803
1153
 
804
1154
  let newList = list;
805
1155
  if (asyncFunction) {
806
1156
  isPanelLoading.value = true;
807
- newList = await asyncFunction(filterKey, member.value);
1157
+ const filterKeys: any = {};
1158
+ if (!!subDeepKey) {
1159
+ filterKeys.key = key;
1160
+ filterKeys.deepKey = deepKey;
1161
+ filterKeys.subDeepKey = filterKey;
1162
+ } else {
1163
+ if (!!deepKey) {
1164
+ filterKeys.key = key;
1165
+ filterKeys.deepKey = filterKey;
1166
+ } else {
1167
+ filterKeys.key = filterKey;
1168
+ }
1169
+ }
1170
+ newList = await asyncFunction(filterKey, member.value, filterKeys);
808
1171
  }
809
1172
  panelList.value = filterList(newList, key);
810
- panelValue.value = member.value[currentPanel.value];
1173
+ panelValue.value = !!deepKey
1174
+ ? !!subDeepKey
1175
+ ? //@ts-ignore
1176
+ member.value[currentPanel.value][deepKey as any][subDeepKey as any]
1177
+ : //@ts-ignore
1178
+ member.value[currentPanel.value][deepKey as any]
1179
+ : member.value[currentPanel.value];
1180
+ if (!!deepKey) {
1181
+ currentPanelDeep.value = deepKey;
1182
+ if (!!subDeepKey) {
1183
+ currentPanelSubDeep.value = subDeepKey;
1184
+ }
1185
+ }
811
1186
  isPanelLoading.value = false;
812
1187
  } else {
813
1188
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
@@ -831,11 +1206,24 @@ export default {
831
1206
  };
832
1207
 
833
1208
  const pickPanelValue = (item: Value) => {
1209
+ if (!currentPanel.value) return;
834
1210
  if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
835
- dataStore.panel.open = false;
1211
+ dataStore.rightPanel.open = false;
836
1212
  isPanelOpen.value = false;
837
- // @ts-ignore
838
- member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
1213
+ if (!!currentPanelDeep.value) {
1214
+ if (!!currentPanelSubDeep.value) {
1215
+ //@ts-ignore
1216
+ member.value[currentPanel.value][currentPanelDeep.value][currentPanelSubDeep.value] = item.nameRu === null ? new Value() : item;
1217
+ } else {
1218
+ //@ts-ignore
1219
+ member.value[currentPanel.value][currentPanelDeep.value] = item.nameRu === null ? new Value() : item;
1220
+ }
1221
+ } else {
1222
+ // @ts-ignore
1223
+ member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
1224
+ }
1225
+ currentPanelDeep.value = '';
1226
+ currentPanelSubDeep.value = '';
839
1227
  } else {
840
1228
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
841
1229
  }
@@ -864,13 +1252,102 @@ export default {
864
1252
  }
865
1253
  };
866
1254
 
867
- const attachFile = (event: InputEvent) => {
1255
+ const attachFile = (event: InputEvent, code?: string) => {
1256
+ if (event.target) {
1257
+ fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
1258
+ } else {
1259
+ if (event.dataTransfer) {
1260
+ fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
1261
+ }
1262
+ }
1263
+ };
1264
+
1265
+ const attachDocumentReader = async (event: InputEvent) => {
868
1266
  if (event.target) {
869
- fileData.value = { file: (event.target as HTMLInputElement).files };
1267
+ const target = event.target as HTMLInputElement;
1268
+ if (target.files && !!target.files.length) {
1269
+ imageDataList.value = [];
1270
+ await Promise.allSettled(
1271
+ Object.values(target.files).map(async f => {
1272
+ const { execute: getBase64 } = useBase64(f);
1273
+ imageDataList.value.push(await getBase64());
1274
+ }),
1275
+ );
1276
+ }
870
1277
  } else {
871
1278
  if (event.dataTransfer) {
872
- fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1279
+ const dataTransfer = event.dataTransfer as DataTransfer;
1280
+ if (!!dataTransfer.files && !!dataTransfer.files.length) {
1281
+ imageDataList.value = [];
1282
+ await Promise.allSettled(
1283
+ Object.values(dataTransfer.files).map(async f => {
1284
+ const { execute: getBase64 } = useBase64(f);
1285
+ imageDataList.value.push(await getBase64());
1286
+ }),
1287
+ );
1288
+ }
1289
+ }
1290
+ }
1291
+ };
1292
+
1293
+ const getDocumentReader = async () => {
1294
+ if (imageDataList.value && !!imageDataList.value.length) {
1295
+ isButtonLoading.value = true;
1296
+ const parsedDocument = await callDocumentReader(imageDataList.value);
1297
+ if (typeof parsedDocument === 'object') {
1298
+ if (
1299
+ member.value.iin &&
1300
+ parsedDocument.iin &&
1301
+ reformatIin(parsedDocument.iin) &&
1302
+ member.value.iin.length === useMask().iin.length &&
1303
+ reformatIin(parsedDocument.iin).length === useMask().iin.length &&
1304
+ member.value.iin !== reformatIin(parsedDocument.iin)
1305
+ ) {
1306
+ dataStore.showToaster('error', 'Не совпадают ИИН');
1307
+ isButtonLoading.value = false;
1308
+ return;
1309
+ }
1310
+ formatDateProperty(parsedDocument, 'front');
1311
+ member.value.parsedDocument = parsedDocument;
1312
+ if (parsedDocument.age) member.value.age = parsedDocument.age;
1313
+ if (parsedDocument.iin) member.value.iin = reformatIin(parsedDocument.iin);
1314
+ if (parsedDocument.gender) {
1315
+ if (parsedDocument.gender === 'M' || parsedDocument.gender === 'F') {
1316
+ const gender = dataStore.gender.find((i: Value) => i.id === (parsedDocument.gender === 'M' ? 1 : 2));
1317
+ if (gender) member.value.gender = gender;
1318
+ }
1319
+ }
1320
+ if (parsedDocument.birthDate) member.value.birthDate = parsedDocument.birthDate;
1321
+ if (parsedDocument.documentIssueDate) member.value.documentDate = parsedDocument.documentIssueDate;
1322
+ if (parsedDocument.documentExpireDate) member.value.documentExpire = parsedDocument.documentExpireDate;
1323
+ if (parsedDocument.documentNumber) member.value.documentNumber = parsedDocument.documentNumber;
1324
+ if (parsedDocument.lastName) member.value.lastName = parsedDocument.lastName;
1325
+ if (parsedDocument.firstName) member.value.firstName = parsedDocument.firstName;
1326
+ if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1327
+ if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1328
+ if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1329
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Enums.Insis.DocTypes['1UDL']);
1330
+ if (documentType) member.value.documentType = documentType;
1331
+ }
1332
+ if (!!parsedDocument.documentIssuer) {
1333
+ if (
1334
+ /МИНИСТЕРСТВО ВНУТРЕННИХ ДЕЛ( РК| РҚ)?/gi.test(parsedDocument.documentIssuer) ||
1335
+ /(КР |ҚР )?ІШКІ ІСТЕР МИНИСТРЛІГІ/gi.test(parsedDocument.documentIssuer) ||
1336
+ /ҚАЗАҚСТАН/gi.test(parsedDocument.documentIssuer) ||
1337
+ /КАЗАХСТАН/gi.test(parsedDocument.documentIssuer)
1338
+ ) {
1339
+ const documentIssuer = dataStore.documentIssuers.find(i => (i.nameRu as string).match(new RegExp('МВД РК', 'i')));
1340
+ if (documentIssuer) member.value.documentIssuers = documentIssuer;
1341
+ } else {
1342
+ const documentIssuer = dataStore.documentIssuers.find(i => (i.nameRu as string).match(new RegExp(`${parsedDocument.documentIssuer}`, 'i')));
1343
+ if (documentIssuer) member.value.documentIssuers = documentIssuer;
1344
+ }
1345
+ }
1346
+ dataStore.rightPanel.open = false;
1347
+ dataStore.showToaster('success', dataStore.t('toaster.successOperation'));
1348
+ imageDataList.value = [];
873
1349
  }
1350
+ isButtonLoading.value = false;
874
1351
  }
875
1352
  };
876
1353
 
@@ -904,11 +1381,11 @@ export default {
904
1381
  familyDialog.value = false;
905
1382
  selectedFamilyMember.value = {};
906
1383
  isButtonLoading.value = false;
907
- dataStore.panel.open = false;
1384
+ dataStore.rightPanel.open = false;
908
1385
  isSearchOpen.value = false;
909
1386
  };
910
1387
 
911
- const selectFamilyMember = (familyMember: BirthInfoGKB) => {
1388
+ const selectFamilyMember = (familyMember: Api.GKB.BirthInfo) => {
912
1389
  if (selectedFamilyMember.value && selectedFamilyMember.value.childIIN === familyMember.childIIN) {
913
1390
  selectedFamilyMember.value = {};
914
1391
  } else {
@@ -921,20 +1398,20 @@ export default {
921
1398
  }
922
1399
  familyDialog.value = false;
923
1400
  isButtonLoading.value = false;
924
- dataStore.panel.open = false;
1401
+ dataStore.rightPanel.open = false;
925
1402
  isSearchOpen.value = false;
926
1403
  };
927
1404
 
928
1405
  const getContragentFromGBDFL = async () => {
929
1406
  if (member.value.hasAgreement !== true) {
930
1407
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
931
- dataStore.panel.open = false;
1408
+ dataStore.rightPanel.open = false;
932
1409
  isSearchOpen.value = false;
933
1410
  return;
934
1411
  }
935
1412
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length || !member.value.phoneNumber || member.value.phoneNumber.length !== useMask().phone.length) {
936
1413
  dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'Номер телефона, ИИН' }), 5000);
937
- dataStore.panel.open = false;
1414
+ dataStore.rightPanel.open = false;
938
1415
  isSearchOpen.value = false;
939
1416
  return;
940
1417
  }
@@ -943,34 +1420,55 @@ export default {
943
1420
  if (typeof response === 'boolean') {
944
1421
  if (response === true) {
945
1422
  member.value.gotFromInsis = true;
1423
+ if (hasGBDFLDocSelection) documentChooseDialog.value = true;
946
1424
  }
947
- dataStore.panel.open = false;
1425
+ dataStore.rightPanel.open = false;
948
1426
  isSearchOpen.value = false;
949
1427
  }
950
1428
  isButtonLoading.value = false;
951
1429
  };
952
1430
 
1431
+ const selectGbdDocument = (document: Api.GBD.Document) => {
1432
+ 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)]);
1434
+ if (documentType) member.value.documentType = documentType;
1435
+ const documentNumber = document.number;
1436
+ if (documentNumber) member.value.documentNumber = documentNumber;
1437
+ const documentDate = document.beginDate;
1438
+ if (documentDate) member.value.documentDate = reformatDate(documentDate);
1439
+ const documentExpire = document.endDate;
1440
+ if (documentExpire) member.value.documentExpire = reformatDate(documentExpire);
1441
+ const documentIssuer = dataStore.documentIssuers.find(i => (i.nameRu as string).match(new RegExp('МВД РК', 'i')));
1442
+ if (documentIssuer) member.value.documentIssuers = documentIssuer;
1443
+ }
1444
+ documentChooseDialog.value = false;
1445
+ isButtonLoading.value = false;
1446
+ dataStore.rightPanel.open = false;
1447
+ isSearchOpen.value = false;
1448
+ };
1449
+
953
1450
  const getContragent = async () => {
954
1451
  if (member.value.hasAgreement !== true) {
955
1452
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
956
- dataStore.panel.open = false;
1453
+ dataStore.rightPanel.open = false;
957
1454
  isSearchOpen.value = false;
958
1455
  return;
959
1456
  }
960
1457
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
961
1458
  dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
962
- dataStore.panel.open = false;
1459
+ dataStore.rightPanel.open = false;
963
1460
  isSearchOpen.value = false;
964
1461
  return;
965
1462
  }
966
1463
  isButtonLoading.value = true;
967
1464
  await dataStore.getContragent(member.value, false);
968
1465
  isButtonLoading.value = false;
969
- dataStore.panel.open = false;
1466
+ dataStore.rightPanel.open = false;
970
1467
  isSearchOpen.value = false;
971
1468
  };
972
1469
 
973
1470
  const validateESBD = async (docTypeNumber: number) => {
1471
+ // TODO
974
1472
  const data: ESBDValidationType = {
975
1473
  personType: 1,
976
1474
  iin: member.value.iin!.replaceAll('-', ''),
@@ -984,9 +1482,9 @@ export default {
984
1482
  docIssuedDate: member.value.getDateByKey('documentDate') ?? '',
985
1483
  docIssuedBy: member.value.documentIssuers.nameRu ?? '',
986
1484
  activityKindId: 0,
987
- economicsSectorId: Number((member.value.economySectorCode.ids! as string).at(-1)),
1485
+ economicsSectorId: Number(String(member.value.economySectorCode.ids).at(-1)),
988
1486
  resident: member.value.signOfResidency.ids === '500011.2' || member.value.signOfResidency.ids === null ? 0 : 1,
989
- countryId: Number((member.value.countryOfTaxResidency.ids! as string).at(-1)),
1487
+ countryId: member.value.countryOfTaxResidency.ids !== '500014.3' ? Number(String(member.value.countryOfTaxResidency.ids).at(-1)) : 2,
990
1488
  };
991
1489
  return await dataStore.getValidateClientESBD(data);
992
1490
  };
@@ -999,10 +1497,10 @@ export default {
999
1497
  }
1000
1498
  const isInsured = formStore.isPolicyholderInsured;
1001
1499
  const remoteIsInsured = ref<boolean | null>(null);
1002
- if (whichForm.value == formStore.policyholderFormKey) {
1500
+ if (whichForm.value == formStore.policyholderFormKey || (dataStore.isPension && whichForm.value == formStore.insuredFormKey)) {
1003
1501
  if (route.params.taskId === '0') {
1004
1502
  try {
1005
- const taskId = await dataStore.startApplication(member.value);
1503
+ const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 4 : 19) : undefined);
1006
1504
  if (typeof taskId === 'string') {
1007
1505
  await dataStore.getApplicationData(taskId, false, false, false, false);
1008
1506
  remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
@@ -1036,18 +1534,44 @@ export default {
1036
1534
  if (!isSaved) return false;
1037
1535
  if (whichForm.value === formStore.policyholderFormKey) {
1038
1536
  if (isInsured === true || remoteIsInsured.value === true) {
1039
- formStore.insuredForm[0] = formStore.policyholderForm;
1040
- const isInsuredSaved = await dataStore.saveMember(
1041
- member.value,
1042
- memberStore.getMemberCode(formStore.insuredFormKey)!,
1043
- memberStore.getMemberFromApplication(formStore.insuredFormKey, formStore.insuredFormIndex),
1044
- );
1045
- if (!isInsuredSaved) return false;
1046
- wasInsuredAction.value = true;
1537
+ const insuredFormIndex = remoteIsInsured.value === true ? 0 : isInsured === true ? formStore.insuredForm.findIndex(i => i.iin === formStore.policyholderForm.iin) : -1;
1538
+ if (insuredFormIndex !== -1) {
1539
+ formStore.insuredForm[insuredFormIndex] = formStore.policyholderForm;
1540
+ const isInsuredSaved = await dataStore.saveMember(
1541
+ member.value,
1542
+ memberStore.getMemberCode(formStore.insuredFormKey)!,
1543
+ memberStore.getMemberFromApplication(formStore.insuredFormKey, insuredFormIndex),
1544
+ );
1545
+ if (!isInsuredSaved) return false;
1546
+ wasInsuredAction.value = true;
1547
+ }
1047
1548
  }
1048
1549
  }
1049
1550
  if (whichForm.value === formStore.insuredFormKey) {
1050
1551
  wasInsuredAction.value = true;
1552
+ if (dataStore.isPension) {
1553
+ formStore.applicationData.pensionApp = {
1554
+ ...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,
1566
+ };
1567
+ const data = {
1568
+ ...formStore.applicationData.pensionApp,
1569
+ transferContractCompany: formStore.applicationData.pensionApp.transferContractCompany?.nameRu ?? null,
1570
+ };
1571
+ const isApplicationSaved = await dataStore.setApplication(data);
1572
+ if (isApplicationSaved === false) return;
1573
+ dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1574
+ }
1051
1575
  }
1052
1576
  await router.replace({
1053
1577
  name: route.name!,
@@ -1056,8 +1580,8 @@ export default {
1056
1580
  await dataStore.getApplicationData(route.params.taskId as string, false, false, true, wasInsuredAction.value);
1057
1581
  if (dataStore.controls.hasCalculator) {
1058
1582
  if (formStore.additionalInsuranceTermsWithout && formStore.additionalInsuranceTermsWithout.length !== 0) {
1059
- formStore.additionalInsuranceTerms.forEach((term: any) => {
1060
- const defaultTerm = formStore.additionalInsuranceTermsWithout.find((i: any) => i.coverTypeId === term.coverTypeId);
1583
+ formStore.additionalInsuranceTerms.forEach(term => {
1584
+ const defaultTerm = formStore.additionalInsuranceTermsWithout.find(i => i.coverTypeId === term.coverTypeId);
1061
1585
  if (defaultTerm) {
1062
1586
  term.coverSumName = defaultTerm.coverSumName;
1063
1587
  term.coverSumId = defaultTerm.coverSumId;
@@ -1071,14 +1595,16 @@ export default {
1071
1595
  };
1072
1596
 
1073
1597
  const validateAgreement = () => {
1074
- if (dataStore.isGons || dataStore.isBolashak) {
1075
- if (whichForm.value === formStore.beneficiaryFormKey) {
1076
- // TODO уточнить
1598
+ if (dataStore.isPension && whichForm.value === formStore.policyholdersRepresentativeFormKey) {
1599
+ return true;
1600
+ }
1601
+ if (whichForm.value === formStore.beneficiaryFormKey) {
1602
+ if (member.value.age !== null && Number(member.value.age) < 18) {
1077
1603
  return true;
1078
1604
  }
1079
1605
  }
1080
- if (dataStore.isKazyna || dataStore.isLiferenta) {
1081
- if (whichForm.value === formStore.beneficiaryFormKey && Number(member.value.age) < 18) {
1606
+ if (whichForm.value === formStore.insuredFormKey) {
1607
+ if (dataStore.isLifetrip && member.value.isInsuredUnderage) {
1082
1608
  return true;
1083
1609
  }
1084
1610
  }
@@ -1096,10 +1622,20 @@ export default {
1096
1622
  if (v.valid) {
1097
1623
  isSubmittingForm.value = true;
1098
1624
  const docType = member.value.documentType.ids;
1099
- if (member.value.gotFromInsis === true && (docType === '1UDL' || docType === 'SBI')) {
1625
+ if (
1626
+ 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)
1628
+ ) {
1100
1629
  dataStore.isLoading = true;
1101
- const ESBDResponse = await validateESBD(docType === '1UDL' ? 1 : 3);
1630
+ const docTypeCodes = {
1631
+ '1UDL': 1,
1632
+ PS: 2,
1633
+ SBI: 3,
1634
+ VNZ: 4,
1635
+ };
1636
+ const ESBDResponse = await validateESBD(docTypeCodes[docType]);
1102
1637
  if (!ESBDResponse) {
1638
+ isSubmittingForm.value = false;
1103
1639
  dataStore.isLoading = false;
1104
1640
  return;
1105
1641
  }
@@ -1109,6 +1645,22 @@ export default {
1109
1645
  if (typeof ESBDResponse === 'object' && ESBDResponse.errorCode === 0) {
1110
1646
  member.value.verifyType = 'ESBD';
1111
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
+ }
1663
+ }
1112
1664
  const hasMemberSaved = await saveMember();
1113
1665
  } else {
1114
1666
  dataStore.isLoading = false;
@@ -1153,7 +1705,7 @@ export default {
1153
1705
  }
1154
1706
  otpSending.value = false;
1155
1707
  if (checked === true) {
1156
- dataStore.panel.open = false;
1708
+ dataStore.rightPanel.open = false;
1157
1709
  }
1158
1710
  };
1159
1711
 
@@ -1163,7 +1715,7 @@ export default {
1163
1715
  if (response) {
1164
1716
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
1165
1717
  if (response.otpStatus === true) {
1166
- dataStore.panel.open = false;
1718
+ dataStore.rightPanel.open = false;
1167
1719
  }
1168
1720
  }
1169
1721
  otpSending.value = false;
@@ -1177,6 +1729,15 @@ export default {
1177
1729
  if (setDefaults.percentage) {
1178
1730
  setPercentage();
1179
1731
  }
1732
+ if (setDefaults.signOfResidency) {
1733
+ setSignOfResidency();
1734
+ }
1735
+ if (setDefaults.countryOfTaxResidency) {
1736
+ setCountryOfTaxResidency();
1737
+ }
1738
+ if (setDefaults.countryOfCitizenship) {
1739
+ setCountryOfCitizenship();
1740
+ }
1180
1741
  };
1181
1742
 
1182
1743
  const setSectorCode = async () => {
@@ -1186,7 +1747,27 @@ export default {
1186
1747
  member.value.economySectorCode = defaultValue ? defaultValue : new Value();
1187
1748
  }
1188
1749
  };
1189
-
1750
+ const setSignOfResidency = async () => {
1751
+ if (member.value.id === 0 && route.query.id === '0') {
1752
+ const residents = await dataStore.getResidents();
1753
+ const defaultValue = residents.find(item => String(item.nameRu).match(new RegExp('Резидент', 'i'))) as Value;
1754
+ member.value.signOfResidency = defaultValue ? defaultValue : new Value();
1755
+ }
1756
+ };
1757
+ const setCountryOfTaxResidency = async () => {
1758
+ if (member.value.id === 0 && route.query.id === '0') {
1759
+ const taxCountries = await dataStore.getTaxCountries();
1760
+ const defaultValue = taxCountries.find(item => String(item.nameRu).match(new RegExp('Казахстан', 'i'))) as Value;
1761
+ member.value.countryOfTaxResidency = defaultValue ? defaultValue : new Value();
1762
+ }
1763
+ };
1764
+ const setCountryOfCitizenship = async () => {
1765
+ if (member.value.id === 0 && route.query.id === '0') {
1766
+ const citizenshipCountries = await dataStore.getCitizenshipCountries();
1767
+ const defaultValue = citizenshipCountries.find(item => String(item.nameRu).match(new RegExp('Казахстан', 'i'))) as Value;
1768
+ member.value.countryOfCitizenship = defaultValue ? defaultValue : new Value();
1769
+ }
1770
+ };
1190
1771
  const setPercentage = () => {
1191
1772
  if (whichForm.value === formStore.beneficiaryFormKey && member.value.id === 0 && route.query.id === '0' && member.value.percentageOfPayoutAmount === null) {
1192
1773
  if (dataStore.members.beneficiaryApp.isMultiple) {
@@ -1203,7 +1784,7 @@ export default {
1203
1784
  };
1204
1785
 
1205
1786
  const selectMember = async (index: number, update?: boolean) => {
1206
- dataStore.panel.open = false;
1787
+ dataStore.rightPanel.open = false;
1207
1788
  isButtonLoading.value = true;
1208
1789
  isChangingMember.value = true;
1209
1790
  //@ts-ignore
@@ -1212,13 +1793,19 @@ export default {
1212
1793
  isButtonLoading.value = false;
1213
1794
  };
1214
1795
 
1215
- const deleteMember = async (index: number) => {
1216
- await memberStore.deleteMember(route.params.taskId as string, whichForm.value, index);
1796
+ const openDeletionDialog = (index: number) => {
1797
+ deletionDialog.value = true;
1798
+ selectedIndex.value = index;
1799
+ };
1800
+
1801
+ const deleteMember = async () => {
1802
+ await memberStore.deleteMember(route.params.taskId as string, whichForm.value, selectedIndex.value);
1217
1803
  const currentIndex = Number(whichIndex.value);
1218
- if (index <= currentIndex) {
1804
+ if (selectedIndex.value <= currentIndex) {
1219
1805
  const newIndex = ref<number>(currentIndex - 1 > 0 ? currentIndex - 1 : 0);
1220
- await selectMember(newIndex.value, index === currentIndex ? true : undefined);
1806
+ await selectMember(newIndex.value, selectedIndex.value === currentIndex ? true : undefined);
1221
1807
  }
1808
+ deletionDialog.value = false;
1222
1809
  };
1223
1810
 
1224
1811
  const onInit = async () => {
@@ -1234,12 +1821,30 @@ export default {
1234
1821
  await router.replace({ query: { ...route.query, id: 0 } });
1235
1822
  } else {
1236
1823
  if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1824
+ if (dataStore.isLifetrip) {
1825
+ const documentByPriority = (() => {
1826
+ if (whichForm.value !== formStore.policyholderFormKey || formStore.isPolicyholderInsured === true) {
1827
+ return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes.PS);
1828
+ }
1829
+ return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes['1UDL']);
1830
+ })();
1831
+ const userDocument = documentByPriority ? documentByPriority : member.value.documentsList[0];
1832
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === userDocument.type);
1833
+ const documentIssuer = dataStore.documentIssuers.find((i: Value) => i.nameRu === userDocument.issuerNameRu);
1834
+ member.value.documentType = documentType ? documentType : new Value();
1835
+ member.value.documentNumber = userDocument.number;
1836
+ member.value.documentIssuers = documentIssuer ? documentIssuer : new Value();
1837
+ member.value.documentDate = reformatDate(userDocument.issueDate);
1838
+ member.value.documentExpire = reformatDate(userDocument.expireDate);
1839
+ }
1840
+
1237
1841
  // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1238
1842
  // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1239
1843
  }
1240
1844
  await setDefaultValues();
1845
+ if (Number(formStore.applicationData.processCode) === 4) dataStore.members.insuredApp.isMultiple = true;
1846
+ if (hasWorkPositionDict && member.value.positionCode === null) member.value.jobPosition = null;
1241
1847
  };
1242
-
1243
1848
  onMounted(async () => {
1244
1849
  await onInit();
1245
1850
  });
@@ -1248,6 +1853,7 @@ export default {
1248
1853
  () => sameAddress.value,
1249
1854
  () => {
1250
1855
  if (whichForm.value === formStore.beneficiaryFormKey) setAddressBeneficiary(Number(whichIndex.value), sameAddress.value);
1856
+ if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) setAddressInsured(Number(whichIndex.value), sameAddress.value);
1251
1857
  },
1252
1858
  );
1253
1859
 
@@ -1302,14 +1908,17 @@ export default {
1302
1908
  };
1303
1909
 
1304
1910
  watch(
1305
- () => dataStore.panel.open,
1911
+ () => dataStore.rightPanel.open,
1306
1912
  () => {
1307
- if (dataStore.panel.open === false) {
1913
+ if (dataStore.rightPanel.open === false) {
1308
1914
  isPanelOpen.value = false;
1309
1915
  isDocumentOpen.value = false;
1310
1916
  isSearchOpen.value = false;
1311
1917
  isOtpPanelOpen.value = false;
1918
+ isPositionPanelOpen.value = false;
1312
1919
  dataStore.panelAction = null;
1920
+ currentPanelDeep.value = '';
1921
+ currentPanelSubDeep.value = '';
1313
1922
  }
1314
1923
  },
1315
1924
  { immediate: true },
@@ -1320,6 +1929,51 @@ export default {
1320
1929
  searchQuery.value = '';
1321
1930
  }
1322
1931
  });
1932
+ if (dataStore.isLifetrip) {
1933
+ watch(
1934
+ () => member.value.age,
1935
+ val => {
1936
+ if (val && Number(val) >= 18) {
1937
+ if (member.value.hasAgreement !== true) {
1938
+ member.value.hasAgreement = false;
1939
+ }
1940
+ } else {
1941
+ member.value.hasAgreement = true;
1942
+ }
1943
+ member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1944
+ },
1945
+ { immediate: true },
1946
+ );
1947
+ watch(
1948
+ () => member.value.isInsuredUnderage,
1949
+ val => {
1950
+ if (val === true && Number(member.value.age) >= 18) {
1951
+ member.value.isInsuredUnderage = false;
1952
+ return dataStore.showToaster('error', dataStore.t('toaster.underageShouldBeLess18'), 3000);
1953
+ }
1954
+ },
1955
+ );
1956
+ }
1957
+ 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
+ );
1967
+ watch(
1968
+ () => member.value.isDisability,
1969
+ val => {
1970
+ if (!val) member.value.disabilityGroup = new Value();
1971
+ },
1972
+ {
1973
+ immediate: true,
1974
+ },
1975
+ );
1976
+ }
1323
1977
 
1324
1978
  return {
1325
1979
  // State
@@ -1331,6 +1985,7 @@ export default {
1331
1985
  isSearchOpen,
1332
1986
  isDocumentOpen,
1333
1987
  isOtpPanelOpen,
1988
+ isPositionPanelOpen,
1334
1989
  isPanelLoading,
1335
1990
  isButtonLoading,
1336
1991
  isSubmittingForm,
@@ -1338,13 +1993,18 @@ export default {
1338
1993
  otpSending,
1339
1994
  panelValue,
1340
1995
  panelList,
1996
+ positionsList,
1341
1997
  searchQuery,
1342
1998
  Value,
1343
1999
  memberDocument,
1344
2000
  familyDialog,
2001
+ deletionDialog,
2002
+ documentChooseDialog,
2003
+ selectedIndex,
1345
2004
  selectedFamilyMember,
1346
2005
  sameAddress,
1347
-
2006
+ isRelative,
2007
+ imageDataList,
1348
2008
  // Computed
1349
2009
  whichForm,
1350
2010
  whichIndex,
@@ -1359,10 +2019,17 @@ export default {
1359
2019
  hasGBDFL,
1360
2020
  hasInsis,
1361
2021
  hasGKB,
2022
+ hasDocumentReader,
2023
+ hasMiddleName,
2024
+ hasRelationDegree,
1362
2025
  hasFamilyStatus,
1363
2026
  hasInsurancePay,
1364
2027
  hasSignOfIPDL,
1365
2028
  hasSameAddressToggle,
2029
+ hasMemberSearch,
2030
+ hasWorkPositionDict,
2031
+ gbdDocuments,
2032
+ hasGBDFLDocSelection,
1366
2033
 
1367
2034
  // Rules
1368
2035
  ageRule,
@@ -1382,14 +2049,20 @@ export default {
1382
2049
  getContragentFromGBDFL,
1383
2050
  getContragent,
1384
2051
  attachFile,
2052
+ attachDocumentReader,
2053
+ getDocumentReader,
1385
2054
  getFile,
1386
2055
  selectFamilyMember,
1387
2056
  closeFamilyDialog,
2057
+ openDeletionDialog,
1388
2058
  scrollForm,
1389
2059
  onIinInput,
1390
2060
  onOtpCodeInput,
1391
2061
  deleteMember,
1392
2062
  selectMember,
2063
+ searchPositions,
2064
+ selectGbdDocument,
2065
+ pickPosition,
1393
2066
  };
1394
2067
  },
1395
2068
  };