hl-core 0.0.9-beta.8 → 0.0.10-beta.1

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 (72) hide show
  1. package/api/base.api.ts +1109 -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 +23 -0
  8. package/components/Dialog/Dialog.vue +70 -16
  9. package/components/Dialog/FamilyDialog.vue +1 -1
  10. package/components/Form/DynamicForm.vue +100 -0
  11. package/components/Form/FormBlock.vue +12 -3
  12. package/components/Form/FormData.vue +110 -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 +177 -89
  17. package/components/Form/ProductConditionsBlock.vue +59 -6
  18. package/components/Input/Datepicker.vue +43 -7
  19. package/components/Input/DynamicInput.vue +23 -0
  20. package/components/Input/FileInput.vue +25 -5
  21. package/components/Input/FormInput.vue +7 -4
  22. package/components/Input/Monthpicker.vue +34 -0
  23. package/components/Input/PanelInput.vue +5 -1
  24. package/components/Input/RoundedSelect.vue +7 -2
  25. package/components/Input/SwitchInput.vue +64 -0
  26. package/components/Input/TextInput.vue +160 -0
  27. package/components/Layout/Drawer.vue +17 -4
  28. package/components/Layout/Header.vue +23 -2
  29. package/components/Layout/Loader.vue +2 -1
  30. package/components/Layout/SettingsPanel.vue +24 -11
  31. package/components/Menu/InfoMenu.vue +35 -0
  32. package/components/Menu/MenuNav.vue +25 -3
  33. package/components/Pages/Anketa.vue +254 -65
  34. package/components/Pages/Auth.vue +56 -9
  35. package/components/Pages/ContragentForm.vue +9 -9
  36. package/components/Pages/Documents.vue +266 -30
  37. package/components/Pages/InvoiceInfo.vue +1 -1
  38. package/components/Pages/MemberForm.vue +774 -102
  39. package/components/Pages/ProductAgreement.vue +1 -8
  40. package/components/Pages/ProductConditions.vue +1132 -180
  41. package/components/Panel/PanelHandler.vue +632 -50
  42. package/components/Panel/PanelSelectItem.vue +17 -2
  43. package/components/Panel/RightPanelCloser.vue +7 -0
  44. package/components/Transitions/Animation.vue +28 -0
  45. package/components/Utilities/JsonViewer.vue +3 -2
  46. package/components/Utilities/Qr.vue +44 -0
  47. package/composables/axios.ts +1 -0
  48. package/composables/classes.ts +501 -14
  49. package/composables/constants.ts +126 -6
  50. package/composables/fields.ts +328 -0
  51. package/composables/index.ts +355 -20
  52. package/composables/styles.ts +23 -6
  53. package/configs/pwa.ts +63 -0
  54. package/layouts/clear.vue +21 -0
  55. package/layouts/default.vue +62 -3
  56. package/layouts/full.vue +21 -0
  57. package/locales/ru.json +559 -16
  58. package/nuxt.config.ts +11 -15
  59. package/package.json +36 -39
  60. package/pages/Token.vue +0 -13
  61. package/plugins/head.ts +26 -0
  62. package/plugins/vuetifyPlugin.ts +1 -5
  63. package/store/data.store.ts +1610 -321
  64. package/store/extractStore.ts +17 -0
  65. package/store/form.store.ts +13 -1
  66. package/store/member.store.ts +1 -1
  67. package/store/rules.ts +97 -3
  68. package/store/toast.ts +1 -1
  69. package/types/enum.ts +81 -0
  70. package/types/env.d.ts +2 -0
  71. package/types/form.ts +94 -0
  72. package/types/index.ts +419 -24
@@ -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,7 @@
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';
543
794
 
544
795
  export default {
545
796
  setup() {
@@ -553,7 +804,7 @@ export default {
553
804
  const whichIndex = computed(() => route.query.i as string);
554
805
  const getMember = (whichForm: keyof typeof StoreMembers, whichIndex?: string) => memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
555
806
  const member = ref(getMember(whichForm.value, whichIndex.value));
556
- const selectedFamilyMember = ref<BirthInfoGKB>({});
807
+ const selectedFamilyMember = ref<Api.GKB.BirthInfo>({});
557
808
  const isPanelOpen = ref<boolean>(false);
558
809
  const memberDocument = ref<DocumentItem>();
559
810
  const isButtonLoading = ref<boolean>(false);
@@ -563,15 +814,25 @@ export default {
563
814
  const isSearchOpen = ref<boolean>(false);
564
815
  const isDocumentOpen = ref<boolean>(false);
565
816
  const isOtpPanelOpen = ref<boolean>(false);
817
+ const isPositionPanelOpen = ref<boolean>(false);
566
818
  const isPanelLoading = ref<boolean>(false);
567
819
  const isChangingMember = ref<boolean>(false);
568
820
  const familyDialog = ref<boolean>(false);
821
+ const deletionDialog = ref<boolean>(false);
822
+ const documentChooseDialog = ref<boolean>(false);
823
+ const selectedIndex = ref<number>(0);
569
824
  const sameAddress = ref<boolean>(false);
570
825
  const panelValue = ref<Value>(new Value());
571
826
  const panelList = ref<Value[]>([]);
827
+ const positionsList = ref<Dicts.WorkPosition[] | null>(null);
572
828
  const currentPanel = ref<keyof typeof member.value>();
573
829
  const searchQuery = ref<string>('');
574
830
  const fileData = ref<{ file: any }>();
831
+ const imageDataList = ref<string[]>([]);
832
+ const isRelative = ref<boolean>(false);
833
+
834
+ const currentPanelDeep = ref<string>();
835
+ const currentPanelSubDeep = ref<string>();
575
836
 
576
837
  const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
577
838
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
@@ -579,13 +840,26 @@ export default {
579
840
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
580
841
  const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
581
842
  const isFromGBD = computed(() => !!member.value.gosPersonData);
843
+ const gbdDocuments = computed(() => {
844
+ if (hasGBDFLDocSelection && !!member.value.gosPersonData && !!member.value.gosPersonData.documents) {
845
+ const documents = Array.isArray(member.value.gosPersonData.documents.document)
846
+ ? member.value.gosPersonData.documents.document
847
+ : [member.value.gosPersonData.documents.document];
848
+ return documents.filter(i => new Date(i.endDate) > new Date(Date.now()) && i.status.code === '00');
849
+ }
850
+ return null;
851
+ });
582
852
  const showSaveButton = computed(() => {
583
853
  const generalCondition = !isDisabled.value && !!isTask.value && !!dataStore.isInitiator();
584
- const perMemberCondtion = () => {
854
+ const perMemberCondition = () => {
585
855
  switch (whichForm.value) {
586
856
  case formStore.policyholderFormKey:
587
857
  return true;
588
858
  case formStore.insuredFormKey:
859
+ if (dataStore.isPension) {
860
+ return true;
861
+ }
862
+ return route.params.taskId !== '0';
589
863
  case formStore.beneficiaryFormKey:
590
864
  case formStore.beneficialOwnerFormKey:
591
865
  case formStore.policyholdersRepresentativeFormKey:
@@ -594,7 +868,7 @@ export default {
594
868
  return false;
595
869
  }
596
870
  };
597
- return generalCondition && perMemberCondtion();
871
+ return generalCondition && perMemberCondition();
598
872
  });
599
873
 
600
874
  const hasGBDFL = computed(() => {
@@ -607,9 +881,17 @@ export default {
607
881
  if (dataStore.isBolashak || dataStore.isGons) {
608
882
  return false;
609
883
  }
884
+ if (member.value.age !== null && Number(member.value.age) < 18) {
885
+ return false;
886
+ }
887
+ return true;
888
+ }
889
+ case formStore.insuredFormKey: {
890
+ if (dataStore.isLifetrip && member.value.isInsuredUnderage) {
891
+ return false;
892
+ }
610
893
  return true;
611
894
  }
612
- case formStore.insuredFormKey:
613
895
  case formStore.beneficialOwnerFormKey:
614
896
  case formStore.policyholdersRepresentativeFormKey:
615
897
  return true;
@@ -617,8 +899,9 @@ export default {
617
899
  return true;
618
900
  }
619
901
  };
620
- return dataStore.controls.hasGBDFL && perMemberCondition();
902
+ return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
621
903
  });
904
+ const hasGBDFLDocSelection = dataStore.isLifetrip && whichForm.value === formStore.policyholderFormKey;
622
905
  const hasInsis = computed(() => dataStore.controls.hasInsis);
623
906
  const hasGKB = computed(() => {
624
907
  const perMemberCondition = () => {
@@ -638,10 +921,31 @@ export default {
638
921
  return false;
639
922
  }
640
923
  };
641
- return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
924
+ return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
925
+ });
926
+ const hasDocumentReader = computed(() => {
927
+ return !!member.value.hasAgreement && !!isTask.value && (dataStore.isAULETTI || dataStore.isAulettiParent);
928
+ });
929
+ const hasMemberSearch = computed(() => showSaveButton.value && (hasGBDFL.value || hasGKB.value || hasInsis.value || hasDocumentReader.value));
930
+ const hasMiddleName = computed(() => {
931
+ if (dataStore.isLifetrip) {
932
+ return false;
933
+ }
934
+ return true;
935
+ });
936
+ const hasRelationDegree = computed(() => {
937
+ if (dataStore.isLifetrip || dataStore.isPension) {
938
+ return false;
939
+ }
940
+ if ((whichForm.value === formStore.beneficiaryFormKey || whichForm.value === formStore.insuredFormKey) && member.value.iin !== formStore.policyholderForm.iin) {
941
+ return true;
942
+ }
943
+ return false;
642
944
  });
643
-
644
945
  const hasFamilyStatus = computed(() => {
946
+ if (dataStore.isLifetrip || dataStore.isPension) {
947
+ return false;
948
+ }
645
949
  if (whichForm.value === formStore.beneficiaryFormKey) {
646
950
  if (dataStore.isBolashak) {
647
951
  return false;
@@ -658,16 +962,21 @@ export default {
658
962
  return false;
659
963
  });
660
964
  const hasSignOfIPDL = computed(() => {
661
- if (dataStore.isGons) {
965
+ if (dataStore.isGons || dataStore.isLifetrip) {
662
966
  return false;
663
967
  }
664
968
  return true;
665
969
  });
666
- const hasSameAddressToggle = computed(() => whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin);
970
+ const hasSameAddressToggle = computed(
971
+ () =>
972
+ (whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin) ||
973
+ (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage),
974
+ );
975
+ const hasWorkPositionDict = !useEnv().isProduction && dataStore.isBaiterek && dataStore.isEfoParent;
667
976
 
668
977
  const birthDateRule = computed(() => {
669
978
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
670
- const byMemverAndProductRule = () => {
979
+ const byMemberAndProductRule = () => {
671
980
  if (whichForm.value === formStore.policyholderFormKey) {
672
981
  if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
673
982
  return dataStore.rules.age18ByDate;
@@ -677,10 +986,13 @@ export default {
677
986
  if (dataStore.isBolashak || dataStore.isBaiterek) {
678
987
  return dataStore.rules.age18ByDate;
679
988
  }
989
+ if (dataStore.isLifetrip) {
990
+ return dataStore.rules.ageExceeds80ByDate;
991
+ }
680
992
  }
681
993
  return [];
682
994
  };
683
- return baseDateRule.concat(byMemverAndProductRule());
995
+ return baseDateRule.concat(byMemberAndProductRule());
684
996
  });
685
997
  const ageRule = computed(() => {
686
998
  const baseAgeRule = dataStore.rules.numbers;
@@ -711,10 +1023,13 @@ export default {
711
1023
  if (dataStore.isGons || dataStore.isBolashak) {
712
1024
  return [];
713
1025
  }
714
- if ((dataStore.isKazyna || dataStore.isLiferenta) && Number(member.value.age) < 18) {
1026
+ if (member.value.age !== null && Number(member.value.age) < 18) {
715
1027
  return [];
716
1028
  }
717
1029
  }
1030
+ if (member.value.isInsuredUnderage) {
1031
+ return [];
1032
+ }
718
1033
  return basePhoneRule;
719
1034
  });
720
1035
 
@@ -725,6 +1040,9 @@ export default {
725
1040
  return baseResidencyRule.concat(dataStore.rules.noResident);
726
1041
  }
727
1042
  }
1043
+ if (dataStore.isLifetrip) {
1044
+ return baseResidencyRule.concat(dataStore.rules.noResidentOffline);
1045
+ }
728
1046
  return baseResidencyRule;
729
1047
  });
730
1048
 
@@ -732,8 +1050,10 @@ export default {
732
1050
  switch (whichForm.value) {
733
1051
  case formStore.policyholderFormKey:
734
1052
  return route.params.taskId === '0';
735
- case formStore.policyholdersRepresentativeFormKey:
736
1053
  case formStore.insuredFormKey:
1054
+ if (dataStore.isPension) return route.params.taskId === '0';
1055
+ return route.query.id === '0';
1056
+ case formStore.policyholdersRepresentativeFormKey:
737
1057
  case formStore.beneficiaryFormKey:
738
1058
  case formStore.beneficialOwnerFormKey:
739
1059
  return route.query.id === '0';
@@ -742,6 +1062,8 @@ export default {
742
1062
  const otpCondition = computed(() => {
743
1063
  // Add conditions by product
744
1064
  if (member.value.hasAgreement) return false;
1065
+ if (whichForm.value === formStore.beneficiaryFormKey && member.value.age !== null && Number(member.value.age) < 18) return false;
1066
+ if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) return false;
745
1067
  if (!member.value.phoneNumber || (member.value.phoneNumber && member.value.phoneNumber.length !== useMask().phone.length)) return false;
746
1068
  return getOtpConditionByMember();
747
1069
  });
@@ -749,45 +1071,72 @@ export default {
749
1071
  const searchMember = async () => {
750
1072
  if (!isDisabled.value) {
751
1073
  dataStore.panelAction = null;
752
- dataStore.panel.title = 'Поиск контрагента';
753
- dataStore.panel.open = true;
1074
+ dataStore.rightPanel.title = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента';
1075
+ dataStore.rightPanel.open = true;
754
1076
  isSearchOpen.value = true;
755
1077
  isDocumentOpen.value = false;
756
1078
  isOtpPanelOpen.value = false;
757
1079
  isPanelOpen.value = false;
1080
+ isPositionPanelOpen.value = false;
758
1081
  } else {
759
1082
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
760
1083
  }
761
1084
  };
762
1085
 
1086
+ const searchPositions = async () => {
1087
+ if (!isDisabled.value) {
1088
+ isPanelLoading.value = true;
1089
+ positionsList.value = await dataStore.getWorkPosition(searchQuery.value);
1090
+ isPanelLoading.value = false;
1091
+ } else {
1092
+ dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
1093
+ }
1094
+ };
1095
+
1096
+ const pickPosition = (position: { workPositionName: string | null; workPositionCode: string | null | 'other' }) => {
1097
+ member.value.jobPosition = position.workPositionName;
1098
+ member.value.positionCode = position.workPositionCode;
1099
+ dataStore.rightPanel.open = false;
1100
+ };
1101
+
763
1102
  const scrollForm = (direction: 'up' | 'down') => {
764
1103
  vForm.value.scrollTo({ top: direction === 'up' ? 0 : screen.height * 10, behavior: 'smooth' });
765
1104
  };
766
1105
 
767
- const openCustomPanel = (type: 'document' | 'otp' = 'document') => {
1106
+ const openCustomPanel = (type: 'document' | 'otp' | 'workPosition' = 'document') => {
768
1107
  dataStore.panelAction = null;
769
1108
  if (type === 'document' && memberDocument.value) {
770
- dataStore.panel.title = memberDocument.value.fileTypeName!;
1109
+ dataStore.rightPanel.title = memberDocument.value.fileTypeName!;
771
1110
  isDocumentOpen.value = true;
772
1111
  isSearchOpen.value = false;
773
1112
  isPanelOpen.value = false;
774
1113
  isOtpPanelOpen.value = false;
1114
+ isPositionPanelOpen.value = false;
775
1115
  }
776
1116
  if (type === 'otp') {
777
- dataStore.panel.title = dataStore.t('form.otpCode');
1117
+ dataStore.rightPanel.title = dataStore.t('form.otpCode');
778
1118
  isOtpPanelOpen.value = true;
779
1119
  isDocumentOpen.value = false;
780
1120
  isSearchOpen.value = false;
781
1121
  isPanelOpen.value = false;
1122
+ isPositionPanelOpen.value = false;
1123
+ }
1124
+ if (type === 'workPosition') {
1125
+ isPositionPanelOpen.value = true;
1126
+ isOtpPanelOpen.value = false;
1127
+ isDocumentOpen.value = false;
1128
+ isSearchOpen.value = false;
1129
+ isPanelOpen.value = false;
782
1130
  }
783
- dataStore.panel.open = true;
1131
+ dataStore.rightPanel.open = true;
784
1132
  };
785
1133
 
786
- const openPanel = async (title: string, list: Value[], key: string, asyncFunction?: Function, filterKey?: string) => {
1134
+ const openPanel = async (title: string, list: Value[], key: string, asyncFunction?: Function, filterKey?: string, deepKey?: string, subDeepKey?: string) => {
787
1135
  if (!isDisabled.value) {
788
1136
  isSearchOpen.value = false;
789
1137
  isDocumentOpen.value = false;
790
1138
  isOtpPanelOpen.value = false;
1139
+ isPositionPanelOpen.value = false;
791
1140
  // Feature
792
1141
  // const notAllowedToChange = ['gender', 'documentType', 'documentIssuers'];
793
1142
  // if (member.value.gotFromInsis === false && notAllowedToChange.includes(key)) {
@@ -798,16 +1147,41 @@ export default {
798
1147
  currentPanel.value = key as keyof typeof member.value;
799
1148
  isPanelOpen.value = true;
800
1149
  dataStore.panelAction = null;
801
- dataStore.panel.open = true;
802
- dataStore.panel.title = title;
1150
+ dataStore.rightPanel.open = true;
1151
+ dataStore.rightPanel.title = title;
803
1152
 
804
1153
  let newList = list;
805
1154
  if (asyncFunction) {
806
1155
  isPanelLoading.value = true;
807
- newList = await asyncFunction(filterKey, member.value);
1156
+ const filterKeys: any = {};
1157
+ if (!!subDeepKey) {
1158
+ filterKeys.key = key;
1159
+ filterKeys.deepKey = deepKey;
1160
+ filterKeys.subDeepKey = filterKey;
1161
+ } else {
1162
+ if (!!deepKey) {
1163
+ filterKeys.key = key;
1164
+ filterKeys.deepKey = filterKey;
1165
+ } else {
1166
+ filterKeys.key = filterKey;
1167
+ }
1168
+ }
1169
+ newList = await asyncFunction(filterKey, member.value, filterKeys);
808
1170
  }
809
1171
  panelList.value = filterList(newList, key);
810
- panelValue.value = member.value[currentPanel.value];
1172
+ panelValue.value = !!deepKey
1173
+ ? !!subDeepKey
1174
+ ? //@ts-ignore
1175
+ member.value[currentPanel.value][deepKey as any][subDeepKey as any]
1176
+ : //@ts-ignore
1177
+ member.value[currentPanel.value][deepKey as any]
1178
+ : member.value[currentPanel.value];
1179
+ if (!!deepKey) {
1180
+ currentPanelDeep.value = deepKey;
1181
+ if (!!subDeepKey) {
1182
+ currentPanelSubDeep.value = subDeepKey;
1183
+ }
1184
+ }
811
1185
  isPanelLoading.value = false;
812
1186
  } else {
813
1187
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
@@ -831,11 +1205,24 @@ export default {
831
1205
  };
832
1206
 
833
1207
  const pickPanelValue = (item: Value) => {
1208
+ if (!currentPanel.value) return;
834
1209
  if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
835
- dataStore.panel.open = false;
1210
+ dataStore.rightPanel.open = false;
836
1211
  isPanelOpen.value = false;
837
- // @ts-ignore
838
- member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
1212
+ if (!!currentPanelDeep.value) {
1213
+ if (!!currentPanelSubDeep.value) {
1214
+ //@ts-ignore
1215
+ member.value[currentPanel.value][currentPanelDeep.value][currentPanelSubDeep.value] = item.nameRu === null ? new Value() : item;
1216
+ } else {
1217
+ //@ts-ignore
1218
+ member.value[currentPanel.value][currentPanelDeep.value] = item.nameRu === null ? new Value() : item;
1219
+ }
1220
+ } else {
1221
+ // @ts-ignore
1222
+ member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
1223
+ }
1224
+ currentPanelDeep.value = '';
1225
+ currentPanelSubDeep.value = '';
839
1226
  } else {
840
1227
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
841
1228
  }
@@ -864,13 +1251,102 @@ export default {
864
1251
  }
865
1252
  };
866
1253
 
867
- const attachFile = (event: InputEvent) => {
1254
+ const attachFile = (event: InputEvent, code?: string) => {
1255
+ if (event.target) {
1256
+ fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
1257
+ } else {
1258
+ if (event.dataTransfer) {
1259
+ fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
1260
+ }
1261
+ }
1262
+ };
1263
+
1264
+ const attachDocumentReader = async (event: InputEvent) => {
868
1265
  if (event.target) {
869
- fileData.value = { file: (event.target as HTMLInputElement).files };
1266
+ const target = event.target as HTMLInputElement;
1267
+ if (target.files && !!target.files.length) {
1268
+ imageDataList.value = [];
1269
+ await Promise.allSettled(
1270
+ Object.values(target.files).map(async f => {
1271
+ const { execute: getBase64 } = useBase64(f);
1272
+ imageDataList.value.push(await getBase64());
1273
+ }),
1274
+ );
1275
+ }
870
1276
  } else {
871
1277
  if (event.dataTransfer) {
872
- fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1278
+ const dataTransfer = event.dataTransfer as DataTransfer;
1279
+ if (!!dataTransfer.files && !!dataTransfer.files.length) {
1280
+ imageDataList.value = [];
1281
+ await Promise.allSettled(
1282
+ Object.values(dataTransfer.files).map(async f => {
1283
+ const { execute: getBase64 } = useBase64(f);
1284
+ imageDataList.value.push(await getBase64());
1285
+ }),
1286
+ );
1287
+ }
1288
+ }
1289
+ }
1290
+ };
1291
+
1292
+ const getDocumentReader = async () => {
1293
+ if (imageDataList.value && !!imageDataList.value.length) {
1294
+ isButtonLoading.value = true;
1295
+ const parsedDocument = await callDocumentReader(imageDataList.value);
1296
+ if (typeof parsedDocument === 'object') {
1297
+ if (
1298
+ member.value.iin &&
1299
+ parsedDocument.iin &&
1300
+ reformatIin(parsedDocument.iin) &&
1301
+ member.value.iin.length === useMask().iin.length &&
1302
+ reformatIin(parsedDocument.iin).length === useMask().iin.length &&
1303
+ member.value.iin !== reformatIin(parsedDocument.iin)
1304
+ ) {
1305
+ dataStore.showToaster('error', 'Не совпадают ИИН');
1306
+ isButtonLoading.value = false;
1307
+ return;
1308
+ }
1309
+ formatDateProperty(parsedDocument, 'front');
1310
+ member.value.parsedDocument = parsedDocument;
1311
+ if (parsedDocument.age) member.value.age = parsedDocument.age;
1312
+ if (parsedDocument.iin) member.value.iin = reformatIin(parsedDocument.iin);
1313
+ if (parsedDocument.gender) {
1314
+ if (parsedDocument.gender === 'M' || parsedDocument.gender === 'F') {
1315
+ const gender = dataStore.gender.find((i: Value) => i.id === (parsedDocument.gender === 'M' ? 1 : 2));
1316
+ if (gender) member.value.gender = gender;
1317
+ }
1318
+ }
1319
+ if (parsedDocument.birthDate) member.value.birthDate = parsedDocument.birthDate;
1320
+ if (parsedDocument.documentIssueDate) member.value.documentDate = parsedDocument.documentIssueDate;
1321
+ if (parsedDocument.documentExpireDate) member.value.documentExpire = parsedDocument.documentExpireDate;
1322
+ if (parsedDocument.documentNumber) member.value.documentNumber = parsedDocument.documentNumber;
1323
+ if (parsedDocument.lastName) member.value.lastName = parsedDocument.lastName;
1324
+ if (parsedDocument.firstName) member.value.firstName = parsedDocument.firstName;
1325
+ if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1326
+ if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1327
+ if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1328
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Enums.Insis.DocTypes['1UDL']);
1329
+ if (documentType) member.value.documentType = documentType;
1330
+ }
1331
+ if (!!parsedDocument.documentIssuer) {
1332
+ if (
1333
+ /МИНИСТЕРСТВО ВНУТРЕННИХ ДЕЛ( РК| РҚ)?/gi.test(parsedDocument.documentIssuer) ||
1334
+ /(КР |ҚР )?ІШКІ ІСТЕР МИНИСТРЛІГІ/gi.test(parsedDocument.documentIssuer) ||
1335
+ /ҚАЗАҚСТАН/gi.test(parsedDocument.documentIssuer) ||
1336
+ /КАЗАХСТАН/gi.test(parsedDocument.documentIssuer)
1337
+ ) {
1338
+ const documentIssuer = dataStore.documentIssuers.find(i => (i.nameRu as string).match(new RegExp('МВД РК', 'i')));
1339
+ if (documentIssuer) member.value.documentIssuers = documentIssuer;
1340
+ } else {
1341
+ const documentIssuer = dataStore.documentIssuers.find(i => (i.nameRu as string).match(new RegExp(`${parsedDocument.documentIssuer}`, 'i')));
1342
+ if (documentIssuer) member.value.documentIssuers = documentIssuer;
1343
+ }
1344
+ }
1345
+ dataStore.rightPanel.open = false;
1346
+ dataStore.showToaster('success', dataStore.t('toaster.successOperation'));
1347
+ imageDataList.value = [];
873
1348
  }
1349
+ isButtonLoading.value = false;
874
1350
  }
875
1351
  };
876
1352
 
@@ -904,11 +1380,11 @@ export default {
904
1380
  familyDialog.value = false;
905
1381
  selectedFamilyMember.value = {};
906
1382
  isButtonLoading.value = false;
907
- dataStore.panel.open = false;
1383
+ dataStore.rightPanel.open = false;
908
1384
  isSearchOpen.value = false;
909
1385
  };
910
1386
 
911
- const selectFamilyMember = (familyMember: BirthInfoGKB) => {
1387
+ const selectFamilyMember = (familyMember: Api.GKB.BirthInfo) => {
912
1388
  if (selectedFamilyMember.value && selectedFamilyMember.value.childIIN === familyMember.childIIN) {
913
1389
  selectedFamilyMember.value = {};
914
1390
  } else {
@@ -921,20 +1397,20 @@ export default {
921
1397
  }
922
1398
  familyDialog.value = false;
923
1399
  isButtonLoading.value = false;
924
- dataStore.panel.open = false;
1400
+ dataStore.rightPanel.open = false;
925
1401
  isSearchOpen.value = false;
926
1402
  };
927
1403
 
928
1404
  const getContragentFromGBDFL = async () => {
929
1405
  if (member.value.hasAgreement !== true) {
930
1406
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
931
- dataStore.panel.open = false;
1407
+ dataStore.rightPanel.open = false;
932
1408
  isSearchOpen.value = false;
933
1409
  return;
934
1410
  }
935
1411
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length || !member.value.phoneNumber || member.value.phoneNumber.length !== useMask().phone.length) {
936
1412
  dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'Номер телефона, ИИН' }), 5000);
937
- dataStore.panel.open = false;
1413
+ dataStore.rightPanel.open = false;
938
1414
  isSearchOpen.value = false;
939
1415
  return;
940
1416
  }
@@ -943,34 +1419,55 @@ export default {
943
1419
  if (typeof response === 'boolean') {
944
1420
  if (response === true) {
945
1421
  member.value.gotFromInsis = true;
1422
+ if (hasGBDFLDocSelection) documentChooseDialog.value = true;
946
1423
  }
947
- dataStore.panel.open = false;
1424
+ dataStore.rightPanel.open = false;
948
1425
  isSearchOpen.value = false;
949
1426
  }
950
1427
  isButtonLoading.value = false;
951
1428
  };
952
1429
 
1430
+ const selectGbdDocument = (document: Api.GBD.Document) => {
1431
+ if (document) {
1432
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Object.keys(Enums.GBD.DocTypes)[Object.values(Enums.GBD.DocTypes).indexOf(document.type.code)]);
1433
+ if (documentType) member.value.documentType = documentType;
1434
+ const documentNumber = document.number;
1435
+ if (documentNumber) member.value.documentNumber = documentNumber;
1436
+ const documentDate = document.beginDate;
1437
+ if (documentDate) member.value.documentDate = reformatDate(documentDate);
1438
+ const documentExpire = document.endDate;
1439
+ if (documentExpire) member.value.documentExpire = reformatDate(documentExpire);
1440
+ const documentIssuer = dataStore.documentIssuers.find(i => (i.nameRu as string).match(new RegExp('МВД РК', 'i')));
1441
+ if (documentIssuer) member.value.documentIssuers = documentIssuer;
1442
+ }
1443
+ documentChooseDialog.value = false;
1444
+ isButtonLoading.value = false;
1445
+ dataStore.rightPanel.open = false;
1446
+ isSearchOpen.value = false;
1447
+ };
1448
+
953
1449
  const getContragent = async () => {
954
1450
  if (member.value.hasAgreement !== true) {
955
1451
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
956
- dataStore.panel.open = false;
1452
+ dataStore.rightPanel.open = false;
957
1453
  isSearchOpen.value = false;
958
1454
  return;
959
1455
  }
960
1456
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
961
1457
  dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
962
- dataStore.panel.open = false;
1458
+ dataStore.rightPanel.open = false;
963
1459
  isSearchOpen.value = false;
964
1460
  return;
965
1461
  }
966
1462
  isButtonLoading.value = true;
967
1463
  await dataStore.getContragent(member.value, false);
968
1464
  isButtonLoading.value = false;
969
- dataStore.panel.open = false;
1465
+ dataStore.rightPanel.open = false;
970
1466
  isSearchOpen.value = false;
971
1467
  };
972
1468
 
973
1469
  const validateESBD = async (docTypeNumber: number) => {
1470
+ // TODO
974
1471
  const data: ESBDValidationType = {
975
1472
  personType: 1,
976
1473
  iin: member.value.iin!.replaceAll('-', ''),
@@ -984,9 +1481,9 @@ export default {
984
1481
  docIssuedDate: member.value.getDateByKey('documentDate') ?? '',
985
1482
  docIssuedBy: member.value.documentIssuers.nameRu ?? '',
986
1483
  activityKindId: 0,
987
- economicsSectorId: Number((member.value.economySectorCode.ids! as string).at(-1)),
1484
+ economicsSectorId: Number(String(member.value.economySectorCode.ids).at(-1)),
988
1485
  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)),
1486
+ countryId: member.value.countryOfTaxResidency.ids !== '500014.3' ? Number(String(member.value.countryOfTaxResidency.ids).at(-1)) : 2,
990
1487
  };
991
1488
  return await dataStore.getValidateClientESBD(data);
992
1489
  };
@@ -999,10 +1496,10 @@ export default {
999
1496
  }
1000
1497
  const isInsured = formStore.isPolicyholderInsured;
1001
1498
  const remoteIsInsured = ref<boolean | null>(null);
1002
- if (whichForm.value == formStore.policyholderFormKey) {
1499
+ if (whichForm.value == formStore.policyholderFormKey || (dataStore.isPension && whichForm.value == formStore.insuredFormKey)) {
1003
1500
  if (route.params.taskId === '0') {
1004
1501
  try {
1005
- const taskId = await dataStore.startApplication(member.value);
1502
+ const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 4 : 19) : undefined);
1006
1503
  if (typeof taskId === 'string') {
1007
1504
  await dataStore.getApplicationData(taskId, false, false, false, false);
1008
1505
  remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
@@ -1036,18 +1533,44 @@ export default {
1036
1533
  if (!isSaved) return false;
1037
1534
  if (whichForm.value === formStore.policyholderFormKey) {
1038
1535
  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;
1536
+ const insuredFormIndex = remoteIsInsured.value === true ? 0 : isInsured === true ? formStore.insuredForm.findIndex(i => i.iin === formStore.policyholderForm.iin) : -1;
1537
+ if (insuredFormIndex !== -1) {
1538
+ formStore.insuredForm[insuredFormIndex] = formStore.policyholderForm;
1539
+ const isInsuredSaved = await dataStore.saveMember(
1540
+ member.value,
1541
+ memberStore.getMemberCode(formStore.insuredFormKey)!,
1542
+ memberStore.getMemberFromApplication(formStore.insuredFormKey, insuredFormIndex),
1543
+ );
1544
+ if (!isInsuredSaved) return false;
1545
+ wasInsuredAction.value = true;
1546
+ }
1047
1547
  }
1048
1548
  }
1049
1549
  if (whichForm.value === formStore.insuredFormKey) {
1050
1550
  wasInsuredAction.value = true;
1551
+ if (dataStore.isPension) {
1552
+ formStore.applicationData.pensionApp = {
1553
+ ...formStore.applicationData.pensionApp,
1554
+ account: member.value.bankInfo.iik,
1555
+ bankBik: member.value.bankInfo.bik,
1556
+ bankBin: member.value.bankInfo.bankName.ids,
1557
+ bankId: member.value.bankInfo.bankName.id,
1558
+ bankName: member.value.bankInfo.bankName.nameRu,
1559
+ guaranteedPeriod: 0,
1560
+ amount: 0,
1561
+ compulsoryContractAmount: 0,
1562
+ voluntaryContractAmount: 0,
1563
+ ownFundsRaisAmount: 0,
1564
+ compulsoryProfContractAmount: 0,
1565
+ };
1566
+ const data = {
1567
+ ...formStore.applicationData.pensionApp,
1568
+ transferContractCompany: formStore.applicationData.pensionApp.transferContractCompany?.nameRu ?? null,
1569
+ };
1570
+ const isApplicationSaved = await dataStore.setApplication(data);
1571
+ if (isApplicationSaved === false) return;
1572
+ dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1573
+ }
1051
1574
  }
1052
1575
  await router.replace({
1053
1576
  name: route.name!,
@@ -1056,8 +1579,8 @@ export default {
1056
1579
  await dataStore.getApplicationData(route.params.taskId as string, false, false, true, wasInsuredAction.value);
1057
1580
  if (dataStore.controls.hasCalculator) {
1058
1581
  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);
1582
+ formStore.additionalInsuranceTerms.forEach(term => {
1583
+ const defaultTerm = formStore.additionalInsuranceTermsWithout.find(i => i.coverTypeId === term.coverTypeId);
1061
1584
  if (defaultTerm) {
1062
1585
  term.coverSumName = defaultTerm.coverSumName;
1063
1586
  term.coverSumId = defaultTerm.coverSumId;
@@ -1071,14 +1594,16 @@ export default {
1071
1594
  };
1072
1595
 
1073
1596
  const validateAgreement = () => {
1074
- if (dataStore.isGons || dataStore.isBolashak) {
1075
- if (whichForm.value === formStore.beneficiaryFormKey) {
1076
- // TODO уточнить
1597
+ if (dataStore.isPension && whichForm.value === formStore.policyholdersRepresentativeFormKey) {
1598
+ return true;
1599
+ }
1600
+ if (whichForm.value === formStore.beneficiaryFormKey) {
1601
+ if (member.value.age !== null && Number(member.value.age) < 18) {
1077
1602
  return true;
1078
1603
  }
1079
1604
  }
1080
- if (dataStore.isKazyna || dataStore.isLiferenta) {
1081
- if (whichForm.value === formStore.beneficiaryFormKey && Number(member.value.age) < 18) {
1605
+ if (whichForm.value === formStore.insuredFormKey) {
1606
+ if (dataStore.isLifetrip && member.value.isInsuredUnderage) {
1082
1607
  return true;
1083
1608
  }
1084
1609
  }
@@ -1096,10 +1621,20 @@ export default {
1096
1621
  if (v.valid) {
1097
1622
  isSubmittingForm.value = true;
1098
1623
  const docType = member.value.documentType.ids;
1099
- if (member.value.gotFromInsis === true && (docType === '1UDL' || docType === 'SBI')) {
1624
+ if (
1625
+ member.value.gotFromInsis === true &&
1626
+ (docType === Enums.Insis.DocTypes['1UDL'] || docType === Enums.Insis.DocTypes.SBI || docType === Enums.Insis.DocTypes.PS || docType === Enums.Insis.DocTypes.VNZ)
1627
+ ) {
1100
1628
  dataStore.isLoading = true;
1101
- const ESBDResponse = await validateESBD(docType === '1UDL' ? 1 : 3);
1629
+ const docTypeCodes = {
1630
+ '1UDL': 1,
1631
+ PS: 2,
1632
+ SBI: 3,
1633
+ VNZ: 4,
1634
+ };
1635
+ const ESBDResponse = await validateESBD(docTypeCodes[docType]);
1102
1636
  if (!ESBDResponse) {
1637
+ isSubmittingForm.value = false;
1103
1638
  dataStore.isLoading = false;
1104
1639
  return;
1105
1640
  }
@@ -1109,6 +1644,22 @@ export default {
1109
1644
  if (typeof ESBDResponse === 'object' && ESBDResponse.errorCode === 0) {
1110
1645
  member.value.verifyType = 'ESBD';
1111
1646
  member.value.verifyDate = ESBDResponse.verifiedDate;
1647
+
1648
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
1649
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1650
+ if (isValidIik === false) {
1651
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1652
+ member.value.bankInfo.iik = '';
1653
+ isSubmittingForm.value = false;
1654
+ return;
1655
+ }
1656
+ if (formStore.applicationData.pensionApp) {
1657
+ formStore.applicationData.pensionApp.account = member.value.bankInfo.iik;
1658
+ formStore.applicationData.pensionApp.bankBik = member.value.bankInfo.bik;
1659
+ formStore.applicationData.pensionApp.bankBin = member.value.bankInfo.bin;
1660
+ formStore.applicationData.pensionApp.bankId = member.value.bankInfo.bankName.id;
1661
+ }
1662
+ }
1112
1663
  const hasMemberSaved = await saveMember();
1113
1664
  } else {
1114
1665
  dataStore.isLoading = false;
@@ -1153,7 +1704,7 @@ export default {
1153
1704
  }
1154
1705
  otpSending.value = false;
1155
1706
  if (checked === true) {
1156
- dataStore.panel.open = false;
1707
+ dataStore.rightPanel.open = false;
1157
1708
  }
1158
1709
  };
1159
1710
 
@@ -1163,7 +1714,7 @@ export default {
1163
1714
  if (response) {
1164
1715
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
1165
1716
  if (response.otpStatus === true) {
1166
- dataStore.panel.open = false;
1717
+ dataStore.rightPanel.open = false;
1167
1718
  }
1168
1719
  }
1169
1720
  otpSending.value = false;
@@ -1177,6 +1728,15 @@ export default {
1177
1728
  if (setDefaults.percentage) {
1178
1729
  setPercentage();
1179
1730
  }
1731
+ if (setDefaults.signOfResidency) {
1732
+ setSignOfResidency();
1733
+ }
1734
+ if (setDefaults.countryOfTaxResidency) {
1735
+ setCountryOfTaxResidency();
1736
+ }
1737
+ if (setDefaults.countryOfCitizenship) {
1738
+ setCountryOfCitizenship();
1739
+ }
1180
1740
  };
1181
1741
 
1182
1742
  const setSectorCode = async () => {
@@ -1186,7 +1746,27 @@ export default {
1186
1746
  member.value.economySectorCode = defaultValue ? defaultValue : new Value();
1187
1747
  }
1188
1748
  };
1189
-
1749
+ const setSignOfResidency = async () => {
1750
+ if (member.value.id === 0 && route.query.id === '0') {
1751
+ const residents = await dataStore.getResidents();
1752
+ const defaultValue = residents.find(item => String(item.nameRu).match(new RegExp('Резидент', 'i'))) as Value;
1753
+ member.value.signOfResidency = defaultValue ? defaultValue : new Value();
1754
+ }
1755
+ };
1756
+ const setCountryOfTaxResidency = async () => {
1757
+ if (member.value.id === 0 && route.query.id === '0') {
1758
+ const taxCountries = await dataStore.getTaxCountries();
1759
+ const defaultValue = taxCountries.find(item => String(item.nameRu).match(new RegExp('Казахстан', 'i'))) as Value;
1760
+ member.value.countryOfTaxResidency = defaultValue ? defaultValue : new Value();
1761
+ }
1762
+ };
1763
+ const setCountryOfCitizenship = async () => {
1764
+ if (member.value.id === 0 && route.query.id === '0') {
1765
+ const citizenshipCountries = await dataStore.getCitizenshipCountries();
1766
+ const defaultValue = citizenshipCountries.find(item => String(item.nameRu).match(new RegExp('Казахстан', 'i'))) as Value;
1767
+ member.value.countryOfCitizenship = defaultValue ? defaultValue : new Value();
1768
+ }
1769
+ };
1190
1770
  const setPercentage = () => {
1191
1771
  if (whichForm.value === formStore.beneficiaryFormKey && member.value.id === 0 && route.query.id === '0' && member.value.percentageOfPayoutAmount === null) {
1192
1772
  if (dataStore.members.beneficiaryApp.isMultiple) {
@@ -1203,7 +1783,7 @@ export default {
1203
1783
  };
1204
1784
 
1205
1785
  const selectMember = async (index: number, update?: boolean) => {
1206
- dataStore.panel.open = false;
1786
+ dataStore.rightPanel.open = false;
1207
1787
  isButtonLoading.value = true;
1208
1788
  isChangingMember.value = true;
1209
1789
  //@ts-ignore
@@ -1212,13 +1792,19 @@ export default {
1212
1792
  isButtonLoading.value = false;
1213
1793
  };
1214
1794
 
1215
- const deleteMember = async (index: number) => {
1216
- await memberStore.deleteMember(route.params.taskId as string, whichForm.value, index);
1795
+ const openDeletionDialog = (index: number) => {
1796
+ deletionDialog.value = true;
1797
+ selectedIndex.value = index;
1798
+ };
1799
+
1800
+ const deleteMember = async () => {
1801
+ await memberStore.deleteMember(route.params.taskId as string, whichForm.value, selectedIndex.value);
1217
1802
  const currentIndex = Number(whichIndex.value);
1218
- if (index <= currentIndex) {
1803
+ if (selectedIndex.value <= currentIndex) {
1219
1804
  const newIndex = ref<number>(currentIndex - 1 > 0 ? currentIndex - 1 : 0);
1220
- await selectMember(newIndex.value, index === currentIndex ? true : undefined);
1805
+ await selectMember(newIndex.value, selectedIndex.value === currentIndex ? true : undefined);
1221
1806
  }
1807
+ deletionDialog.value = false;
1222
1808
  };
1223
1809
 
1224
1810
  const onInit = async () => {
@@ -1234,12 +1820,30 @@ export default {
1234
1820
  await router.replace({ query: { ...route.query, id: 0 } });
1235
1821
  } else {
1236
1822
  if (route.query.id !== String(member.value.id)) await router.replace({ query: { ...route.query, id: member.value.id } });
1823
+ if (dataStore.isLifetrip) {
1824
+ const documentByPriority = (() => {
1825
+ if (whichForm.value !== formStore.policyholderFormKey || formStore.isPolicyholderInsured === true) {
1826
+ return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes.PS);
1827
+ }
1828
+ return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes['1UDL']);
1829
+ })();
1830
+ const userDocument = documentByPriority ? documentByPriority : member.value.documentsList[0];
1831
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === userDocument.type);
1832
+ const documentIssuer = dataStore.documentIssuers.find((i: Value) => i.nameRu === userDocument.issuerNameRu);
1833
+ member.value.documentType = documentType ? documentType : new Value();
1834
+ member.value.documentNumber = userDocument.number;
1835
+ member.value.documentIssuers = documentIssuer ? documentIssuer : new Value();
1836
+ member.value.documentDate = reformatDate(userDocument.issueDate);
1837
+ member.value.documentExpire = reformatDate(userDocument.expireDate);
1838
+ }
1839
+
1237
1840
  // const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
1238
1841
  // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1239
1842
  }
1240
1843
  await setDefaultValues();
1844
+ if (Number(formStore.applicationData.processCode) === 4) dataStore.members.insuredApp.isMultiple = true;
1845
+ if (hasWorkPositionDict && member.value.positionCode === null) member.value.jobPosition = null;
1241
1846
  };
1242
-
1243
1847
  onMounted(async () => {
1244
1848
  await onInit();
1245
1849
  });
@@ -1248,6 +1852,7 @@ export default {
1248
1852
  () => sameAddress.value,
1249
1853
  () => {
1250
1854
  if (whichForm.value === formStore.beneficiaryFormKey) setAddressBeneficiary(Number(whichIndex.value), sameAddress.value);
1855
+ if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) setAddressInsured(Number(whichIndex.value), sameAddress.value);
1251
1856
  },
1252
1857
  );
1253
1858
 
@@ -1302,14 +1907,17 @@ export default {
1302
1907
  };
1303
1908
 
1304
1909
  watch(
1305
- () => dataStore.panel.open,
1910
+ () => dataStore.rightPanel.open,
1306
1911
  () => {
1307
- if (dataStore.panel.open === false) {
1912
+ if (dataStore.rightPanel.open === false) {
1308
1913
  isPanelOpen.value = false;
1309
1914
  isDocumentOpen.value = false;
1310
1915
  isSearchOpen.value = false;
1311
1916
  isOtpPanelOpen.value = false;
1917
+ isPositionPanelOpen.value = false;
1312
1918
  dataStore.panelAction = null;
1919
+ currentPanelDeep.value = '';
1920
+ currentPanelSubDeep.value = '';
1313
1921
  }
1314
1922
  },
1315
1923
  { immediate: true },
@@ -1320,6 +1928,51 @@ export default {
1320
1928
  searchQuery.value = '';
1321
1929
  }
1322
1930
  });
1931
+ if (dataStore.isLifetrip) {
1932
+ watch(
1933
+ () => member.value.age,
1934
+ val => {
1935
+ if (val && Number(val) >= 18) {
1936
+ if (member.value.hasAgreement !== true) {
1937
+ member.value.hasAgreement = false;
1938
+ }
1939
+ } else {
1940
+ member.value.hasAgreement = true;
1941
+ }
1942
+ member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1943
+ },
1944
+ { immediate: true },
1945
+ );
1946
+ watch(
1947
+ () => member.value.isInsuredUnderage,
1948
+ val => {
1949
+ if (val === true && Number(member.value.age) >= 18) {
1950
+ member.value.isInsuredUnderage = false;
1951
+ return dataStore.showToaster('error', dataStore.t('toaster.underageShouldBeLess18'), 3000);
1952
+ }
1953
+ },
1954
+ );
1955
+ }
1956
+ if (dataStore.isPension) {
1957
+ watch(
1958
+ () => member.value.bankInfo.bankName,
1959
+ val => {
1960
+ if (val) {
1961
+ member.value.bankInfo.bik = val.code as string;
1962
+ member.value.bankInfo.bin = reformatIin(val.ids as string);
1963
+ }
1964
+ },
1965
+ );
1966
+ watch(
1967
+ () => member.value.isDisability,
1968
+ val => {
1969
+ if (!val) member.value.disabilityGroup = new Value();
1970
+ },
1971
+ {
1972
+ immediate: true,
1973
+ },
1974
+ );
1975
+ }
1323
1976
 
1324
1977
  return {
1325
1978
  // State
@@ -1331,6 +1984,7 @@ export default {
1331
1984
  isSearchOpen,
1332
1985
  isDocumentOpen,
1333
1986
  isOtpPanelOpen,
1987
+ isPositionPanelOpen,
1334
1988
  isPanelLoading,
1335
1989
  isButtonLoading,
1336
1990
  isSubmittingForm,
@@ -1338,13 +1992,18 @@ export default {
1338
1992
  otpSending,
1339
1993
  panelValue,
1340
1994
  panelList,
1995
+ positionsList,
1341
1996
  searchQuery,
1342
1997
  Value,
1343
1998
  memberDocument,
1344
1999
  familyDialog,
2000
+ deletionDialog,
2001
+ documentChooseDialog,
2002
+ selectedIndex,
1345
2003
  selectedFamilyMember,
1346
2004
  sameAddress,
1347
-
2005
+ isRelative,
2006
+ imageDataList,
1348
2007
  // Computed
1349
2008
  whichForm,
1350
2009
  whichIndex,
@@ -1359,10 +2018,17 @@ export default {
1359
2018
  hasGBDFL,
1360
2019
  hasInsis,
1361
2020
  hasGKB,
2021
+ hasDocumentReader,
2022
+ hasMiddleName,
2023
+ hasRelationDegree,
1362
2024
  hasFamilyStatus,
1363
2025
  hasInsurancePay,
1364
2026
  hasSignOfIPDL,
1365
2027
  hasSameAddressToggle,
2028
+ hasMemberSearch,
2029
+ hasWorkPositionDict,
2030
+ gbdDocuments,
2031
+ hasGBDFLDocSelection,
1366
2032
 
1367
2033
  // Rules
1368
2034
  ageRule,
@@ -1382,14 +2048,20 @@ export default {
1382
2048
  getContragentFromGBDFL,
1383
2049
  getContragent,
1384
2050
  attachFile,
2051
+ attachDocumentReader,
2052
+ getDocumentReader,
1385
2053
  getFile,
1386
2054
  selectFamilyMember,
1387
2055
  closeFamilyDialog,
2056
+ openDeletionDialog,
1388
2057
  scrollForm,
1389
2058
  onIinInput,
1390
2059
  onOtpCodeInput,
1391
2060
  deleteMember,
1392
2061
  selectMember,
2062
+ searchPositions,
2063
+ selectGbdDocument,
2064
+ pickPosition,
1393
2065
  };
1394
2066
  },
1395
2067
  };