hl-core 0.0.9-beta.5 → 0.0.9-beta.50

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 (63) hide show
  1. package/api/base.api.ts +935 -0
  2. package/api/index.ts +2 -620
  3. package/api/interceptors.ts +53 -14
  4. package/components/Button/Btn.vue +2 -2
  5. package/components/Complex/MessageBlock.vue +2 -2
  6. package/components/Complex/Page.vue +1 -1
  7. package/components/Dialog/Dialog.vue +60 -15
  8. package/components/Form/DynamicForm.vue +100 -0
  9. package/components/Form/FormBlock.vue +12 -3
  10. package/components/Form/FormData.vue +110 -0
  11. package/components/Form/FormSection.vue +3 -3
  12. package/components/Form/FormToggle.vue +25 -5
  13. package/components/Form/ManagerAttachment.vue +150 -86
  14. package/components/Form/ProductConditionsBlock.vue +59 -6
  15. package/components/Input/Datepicker.vue +39 -8
  16. package/components/Input/DynamicInput.vue +23 -0
  17. package/components/Input/FileInput.vue +25 -5
  18. package/components/Input/FormInput.vue +2 -4
  19. package/components/Input/Monthpicker.vue +34 -0
  20. package/components/Input/PanelInput.vue +5 -1
  21. package/components/Input/RoundedEmptyField.vue +5 -0
  22. package/components/Input/RoundedSelect.vue +13 -0
  23. package/components/Input/SwitchInput.vue +64 -0
  24. package/components/Input/TextInput.vue +160 -0
  25. package/components/Layout/Drawer.vue +17 -4
  26. package/components/Layout/Header.vue +23 -2
  27. package/components/Layout/Loader.vue +1 -1
  28. package/components/Layout/SettingsPanel.vue +13 -7
  29. package/components/Menu/InfoMenu.vue +35 -0
  30. package/components/Menu/MenuNav.vue +17 -2
  31. package/components/Pages/Anketa.vue +140 -52
  32. package/components/Pages/Auth.vue +42 -7
  33. package/components/Pages/ContragentForm.vue +124 -50
  34. package/components/Pages/Documents.vue +72 -7
  35. package/components/Pages/InvoiceInfo.vue +1 -1
  36. package/components/Pages/MemberForm.vue +369 -100
  37. package/components/Pages/ProductAgreement.vue +1 -8
  38. package/components/Pages/ProductConditions.vue +888 -181
  39. package/components/Panel/PanelHandler.vue +414 -45
  40. package/components/Panel/PanelSelectItem.vue +17 -2
  41. package/components/Panel/RightPanelCloser.vue +7 -0
  42. package/components/Transitions/Animation.vue +28 -0
  43. package/components/Utilities/Qr.vue +44 -0
  44. package/composables/axios.ts +1 -0
  45. package/composables/classes.ts +433 -8
  46. package/composables/constants.ts +102 -2
  47. package/composables/fields.ts +328 -0
  48. package/composables/index.ts +257 -12
  49. package/composables/styles.ts +29 -16
  50. package/layouts/default.vue +48 -3
  51. package/locales/ru.json +480 -14
  52. package/package.json +27 -24
  53. package/pages/Token.vue +1 -12
  54. package/plugins/vuetifyPlugin.ts +2 -0
  55. package/store/data.store.ts +1190 -248
  56. package/store/extractStore.ts +17 -0
  57. package/store/form.store.ts +13 -1
  58. package/store/member.store.ts +1 -1
  59. package/store/rules.ts +66 -5
  60. package/types/enum.ts +43 -0
  61. package/types/env.d.ts +1 -0
  62. package/types/form.ts +94 -0
  63. package/types/index.ts +254 -21
@@ -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,7 +17,7 @@
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>
@@ -27,6 +27,23 @@
27
27
  :title="$dataStore.t('form.personalData')"
28
28
  :class="[memberSetting && memberSetting.has === true && memberSetting.isMultiple === true ? 'rounded-t-0 !mt-[-5px]' : 'mt-[14px]']"
29
29
  >
30
+ <base-panel-input
31
+ v-if="$dataStore.isLifetrip"
32
+ v-model="member.signOfResidency"
33
+ :value="member.signOfResidency?.nameRu"
34
+ :label="$dataStore.t('form.signOfResidency')"
35
+ :readonly="isDisabled"
36
+ :clearable="!isDisabled"
37
+ :rules="residencyRule"
38
+ append-inner-icon="mdi mdi-chevron-right"
39
+ @append="openPanel($dataStore.t('form.signOfResidency'), [], 'signOfResidency', $dataStore.getResidents)"
40
+ />
41
+ <base-form-toggle
42
+ v-if="$dataStore.isLifetrip && whichForm === 'insuredForm'"
43
+ v-model="member.isInsuredUnderage"
44
+ :title="$dataStore.t('isInsuredUnderage')"
45
+ :has-border="false"
46
+ />
30
47
  <base-form-input
31
48
  v-model="member.phoneNumber"
32
49
  :label="$dataStore.t('form.phoneNumber')"
@@ -42,38 +59,57 @@
42
59
  v-model="member.iin"
43
60
  :label="$dataStore.t('form.iin')"
44
61
  :maska="$maska.iin"
45
- :readonly="!!isDisabled || !!isIinPhoneDisabled"
62
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin"
46
63
  :clearable="!isDisabled"
47
- :append-inner-icon="showSaveButton ? 'mdi mdi-magnify' : ''"
64
+ :append-inner-icon="hasMemberSearch ? (hasDocumentReader ? 'mdi mdi-credit-card-scan-outline' : 'mdi mdi-magnify') : ''"
48
65
  @append="searchMember"
49
66
  @input="onIinInput"
50
67
  :rules="$rules.required.concat($rules.iinRight)"
51
68
  />
52
69
  <base-form-input
53
70
  v-model.trim="member.lastName"
54
- :readonly="isDisabled || isFromGBD"
71
+ :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.lastName"
55
72
  :clearable="!isDisabled"
56
73
  :label="$dataStore.t('form.lastName')"
57
74
  :rules="$rules.required.concat($rules.cyrillic)"
58
75
  />
59
76
  <base-form-input
60
77
  v-model.trim="member.firstName"
61
- :readonly="isDisabled || isFromGBD"
78
+ :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.firstName"
62
79
  :clearable="!isDisabled"
63
80
  :label="$dataStore.t('form.firstName')"
64
81
  :rules="$rules.required.concat($rules.cyrillic)"
65
82
  />
66
83
  <base-form-input
84
+ v-if="hasMiddleName"
67
85
  v-model.trim="member.middleName"
68
- :readonly="isDisabled || isFromGBD"
86
+ :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.middleName"
69
87
  :clearable="!isDisabled"
70
88
  :label="$dataStore.t('form.middleName')"
71
89
  :rules="$rules.cyrillicNonRequired"
72
90
  />
73
91
  <base-form-input
74
- v-model="member.birthDate"
92
+ v-if="$dataStore.isLifetrip"
93
+ v-model.trim="member.lastNameLat"
94
+ :readonly="isDisabled || isFromGBD"
95
+ :clearable="!isDisabled"
96
+ :label="$dataStore.t('form.lastNameLat')"
97
+ :rules="$rules.required.concat($rules.latin)"
98
+ :hint="$dataStore.t('labels.checkWithDoc')"
99
+ />
100
+ <base-form-input
101
+ v-if="$dataStore.isLifetrip"
102
+ v-model.trim="member.firstNameLat"
75
103
  :readonly="isDisabled || isFromGBD"
76
104
  :clearable="!isDisabled"
105
+ :label="$dataStore.t('form.firstNameLat')"
106
+ :rules="$rules.required.concat($rules.latin)"
107
+ :hint="$dataStore.t('labels.checkWithDoc')"
108
+ />
109
+ <base-form-input
110
+ v-model="member.birthDate"
111
+ :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.birthDate"
112
+ :clearable="!isDisabled"
77
113
  :label="$dataStore.t('form.birthDate')"
78
114
  :rules="birthDateRule"
79
115
  :maska="$maska.date"
@@ -82,9 +118,9 @@
82
118
  <base-form-input v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule" />
83
119
  <base-panel-input
84
120
  v-model="member.gender"
85
- :value="member.gender.nameRu"
121
+ :value="member.gender?.nameRu"
86
122
  :readonly="isDisabled || isFromGBD"
87
- :clearable="!isDisabled"
123
+ :clearable="!isDisabled && !isFromGBD"
88
124
  :label="$dataStore.t('form.gender')"
89
125
  :rules="$rules.objectRequired"
90
126
  append-inner-icon="mdi mdi-chevron-right"
@@ -93,7 +129,7 @@
93
129
  <base-panel-input
94
130
  v-if="hasFamilyStatus"
95
131
  v-model="member.familyStatus"
96
- :value="member.familyStatus.nameRu"
132
+ :value="member.familyStatus?.nameRu"
97
133
  :readonly="isDisabled"
98
134
  :clearable="!isDisabled"
99
135
  :label="$dataStore.t('form.familyStatus')"
@@ -102,9 +138,9 @@
102
138
  @append="openPanel($dataStore.t('form.familyStatus'), [], 'familyStatus', $dataStore.getFamilyStatuses)"
103
139
  />
104
140
  <base-panel-input
105
- v-if="(whichForm === formStore.beneficiaryFormKey || whichForm === formStore.insuredFormKey) && member.iin !== formStore.policyholderForm.iin"
141
+ v-if="hasRelationDegree"
106
142
  v-model="member.relationDegree"
107
- :value="member.relationDegree.nameRu"
143
+ :value="member.relationDegree?.nameRu"
108
144
  :readonly="isDisabled"
109
145
  :clearable="!isDisabled"
110
146
  :label="$dataStore.t('form.relations')"
@@ -231,7 +267,7 @@
231
267
  append-inner-icon="mdi mdi-calendar-blank-outline"
232
268
  />
233
269
  </base-form-section>
234
- <base-form-section :title="$dataStore.t('form.jobData')" v-if="$dataStore.hasJobSection(whichForm)">
270
+ <base-form-section v-if="$dataStore.hasJobSection(whichForm)" :title="$dataStore.t('form.jobData')">
235
271
  <base-form-input v-model.trim="member.job" :label="$dataStore.t('form.job')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
236
272
  <base-form-input v-model.trim="member.jobPosition" :label="$dataStore.t('form.jobPosition')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
237
273
  <base-form-input v-model.trim="member.jobPlace" :label="$dataStore.t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
@@ -240,11 +276,11 @@
240
276
  <base-form-toggle v-if="hasSameAddressToggle" v-model="sameAddress" :disabled="isDisabled" :has-border="false" :title="$dataStore.t('form.sameAddress')" />
241
277
  <base-panel-input
242
278
  v-model="member.registrationCountry"
243
- :value="member.registrationCountry.nameRu"
279
+ :value="member.registrationCountry?.nameRu"
244
280
  :readonly="isDisabled"
245
281
  :clearable="!isDisabled"
246
282
  :label="$dataStore.t('form.Country')"
247
- :rules="$rules.objectRequired"
283
+ :rules="member.isInsuredUnderage ? [] : $rules.objectRequired"
248
284
  append-inner-icon="mdi mdi-chevron-right"
249
285
  @append="openPanel($dataStore.t('form.Country'), [], 'registrationCountry', $dataStore.getCountries)"
250
286
  />
@@ -252,42 +288,42 @@
252
288
  <div class="flex flex-col gap-[1px]" v-if="member.registrationCountry.nameRu === 'Казахстан' || member.registrationCountry.nameRu === null">
253
289
  <base-panel-input
254
290
  v-model="member.registrationProvince"
255
- :value="member.registrationProvince.nameRu"
291
+ :value="member.registrationProvince?.nameRu"
256
292
  :label="$dataStore.t('form.Province')"
257
293
  :readonly="isDisabled"
258
294
  :clearable="!isDisabled"
259
- :rules="$rules.objectRequired"
295
+ :rules="member.isInsuredUnderage ? [] : $rules.objectRequired"
260
296
  append-inner-icon="mdi mdi-chevron-right"
261
297
  @append="openPanel($dataStore.t('form.Province'), [], 'registrationProvince', $dataStore.getStates, 'registrationCountry')"
262
298
  />
263
299
  <base-panel-input
264
300
  v-model="member.registrationRegionType"
265
- :value="member.registrationRegionType.nameRu"
301
+ :value="member.registrationRegionType?.nameRu"
266
302
  :label="$dataStore.t('form.RegionType')"
267
303
  :readonly="isDisabled"
268
304
  :clearable="!isDisabled"
269
- :rules="$rules.objectRequired"
305
+ :rules="member.isInsuredUnderage ? [] : $rules.objectRequired"
270
306
  append-inner-icon="mdi mdi-chevron-right"
271
307
  @append="openPanel($dataStore.t('form.RegionType'), [], 'registrationRegionType', $dataStore.getLocalityTypes)"
272
308
  />
273
309
  <base-panel-input
274
310
  v-if="member.registrationRegionType.nameRu !== 'город'"
275
311
  v-model="member.registrationRegion"
276
- :value="member.registrationRegion.nameRu"
312
+ :value="member.registrationRegion?.nameRu"
277
313
  :label="$dataStore.t('form.Region')"
278
314
  :readonly="isDisabled"
279
315
  :clearable="!isDisabled"
280
- :rules="$rules.objectRequired"
316
+ :rules="member.isInsuredUnderage ? [] : $rules.objectRequired"
281
317
  append-inner-icon="mdi mdi-chevron-right"
282
318
  @append="openPanel($dataStore.t('form.Region'), [], 'registrationRegion', $dataStore.getRegions, 'registrationProvince')"
283
319
  />
284
320
  <base-panel-input
285
321
  v-model="member.registrationCity"
286
- :value="member.registrationCity.nameRu"
322
+ :value="member.registrationCity?.nameRu"
287
323
  :label="$dataStore.t('form.City')"
288
324
  :readonly="isDisabled"
289
325
  :clearable="!isDisabled"
290
- :rules="$rules.objectRequired"
326
+ :rules="member.isInsuredUnderage ? [] : $rules.objectRequired"
291
327
  append-inner-icon="mdi mdi-chevron-right"
292
328
  @append="openPanel($dataStore.t('form.City'), [], 'registrationCity', $dataStore.getCities, 'registrationProvince')"
293
329
  />
@@ -297,14 +333,14 @@
297
333
  <base-form-input v-model.trim="member.registrationMicroDistrict" :readonly="isDisabled" :clearable="!isDisabled" :label="$dataStore.t('form.MicroDistrict')" />
298
334
  <base-form-input
299
335
  v-model.trim="member.registrationStreet"
300
- :rules="$rules.required"
336
+ :rules="member.isInsuredUnderage ? [] : $rules.required"
301
337
  :readonly="isDisabled"
302
338
  :clearable="!isDisabled"
303
339
  :label="$dataStore.t('form.Street')"
304
340
  />
305
341
  <base-form-input
306
342
  v-model.trim="member.registrationNumberHouse"
307
- :rules="$rules.required"
343
+ :rules="member.isInsuredUnderage ? [] : $rules.required"
308
344
  :readonly="isDisabled"
309
345
  :clearable="!isDisabled"
310
346
  :label="$dataStore.t('form.NumberHouse')"
@@ -316,7 +352,7 @@
316
352
  <base-form-section :title="$dataStore.t('form.birthData')" v-if="$dataStore.hasBirthSection(whichForm)">
317
353
  <base-panel-input
318
354
  v-model="member.birthPlace"
319
- :value="member.birthPlace.nameRu"
355
+ :value="member.birthPlace?.nameRu"
320
356
  :label="$dataStore.t('form.Country')"
321
357
  :readonly="isDisabled"
322
358
  :clearable="!isDisabled"
@@ -327,7 +363,7 @@
327
363
  <!-- TODO -->
328
364
  <!-- <base-panel-input
329
365
  v-model="member.birthRegion"
330
- :value="member.birthRegion.nameRu"
366
+ :value="member.birthRegion?.nameRu"
331
367
  :label="$dataStore.t('form.Region')"
332
368
  :readonly="isDisabled"
333
369
  :clearable="!isDisabled"
@@ -339,7 +375,7 @@
339
375
  <base-form-section :title="$dataStore.t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
340
376
  <base-panel-input
341
377
  v-model="member.documentType"
342
- :value="member.documentType.nameRu"
378
+ :value="member.documentType?.nameRu"
343
379
  :label="$dataStore.t('form.documentType')"
344
380
  :readonly="isDisabled"
345
381
  :clearable="!isDisabled"
@@ -350,7 +386,7 @@
350
386
  <base-form-input
351
387
  v-model.trim="member.documentNumber"
352
388
  :label="$dataStore.t('form.documentNumber')"
353
- :readonly="isDisabled"
389
+ :readonly="isDisabled || !!member.parsedDocument?.documentNumber"
354
390
  :clearable="!isDisabled"
355
391
  :rules="$rules.required"
356
392
  />
@@ -361,9 +397,9 @@
361
397
  </base-empty-form-field> -->
362
398
  <base-panel-input
363
399
  v-model="member.documentIssuers"
364
- :value="member.documentIssuers.nameRu"
400
+ :value="member.documentIssuers?.nameRu"
365
401
  :label="$dataStore.t('form.documentIssuers')"
366
- :readonly="isDisabled"
402
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssuer"
367
403
  :clearable="!isDisabled"
368
404
  :rules="$rules.objectRequired"
369
405
  append-inner-icon="mdi mdi-chevron-right"
@@ -372,7 +408,7 @@
372
408
  <base-form-input
373
409
  v-model="member.documentDate"
374
410
  :label="$dataStore.t('form.documentDate')"
375
- :readonly="isDisabled"
411
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate"
376
412
  :clearable="!isDisabled"
377
413
  :rules="$rules.required.concat($rules.date)"
378
414
  :maska="$maska.date"
@@ -383,7 +419,7 @@
383
419
  v-if="member.documentType.ids !== 'SBI' && member.documentType.ids !== 'VNZ'"
384
420
  v-model="member.documentExpire"
385
421
  :label="$dataStore.t('form.documentExpire')"
386
- :readonly="isDisabled"
422
+ :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate"
387
423
  :clearable="!isDisabled"
388
424
  :rules="$rules.required.concat($rules.date)"
389
425
  :maska="$maska.date"
@@ -391,8 +427,9 @@
391
427
  />
392
428
  </base-fade-transition>
393
429
  <base-panel-input
430
+ v-if="!$dataStore.isLifetrip"
394
431
  v-model="member.signOfResidency"
395
- :value="member.signOfResidency.nameRu"
432
+ :value="member.signOfResidency?.nameRu"
396
433
  :label="$dataStore.t('form.signOfResidency')"
397
434
  :readonly="isDisabled"
398
435
  :clearable="!isDisabled"
@@ -402,7 +439,7 @@
402
439
  />
403
440
  <base-panel-input
404
441
  v-model="member.countryOfTaxResidency"
405
- :value="member.countryOfTaxResidency.nameRu"
442
+ :value="member.countryOfTaxResidency?.nameRu"
406
443
  :label="$dataStore.t('form.countryOfTaxResidency')"
407
444
  :readonly="isDisabled"
408
445
  :clearable="!isDisabled"
@@ -414,7 +451,7 @@
414
451
  <base-panel-input
415
452
  v-if="member.countryOfTaxResidency.ids === '500014.3'"
416
453
  v-model="member.addTaxResidency"
417
- :value="member.addTaxResidency.nameRu"
454
+ :value="member.addTaxResidency?.nameRu"
418
455
  :label="$dataStore.t('form.addTaxResidency')"
419
456
  :readonly="isDisabled"
420
457
  :clearable="!isDisabled"
@@ -426,7 +463,7 @@
426
463
  <base-panel-input
427
464
  v-if="hasSignOfIPDL"
428
465
  v-model="member.signOfIPDL"
429
- :value="member.signOfIPDL.nameRu"
466
+ :value="member.signOfIPDL?.nameRu"
430
467
  :label="$dataStore.t('form.signOfIPDL')"
431
468
  :readonly="isDisabled"
432
469
  :clearable="!isDisabled"
@@ -436,7 +473,7 @@
436
473
  />
437
474
  <base-panel-input
438
475
  v-model="member.countryOfCitizenship"
439
- :value="member.countryOfCitizenship.nameRu"
476
+ :value="member.countryOfCitizenship?.nameRu"
440
477
  :label="$dataStore.t('form.countryOfCitizenship')"
441
478
  :readonly="isDisabled"
442
479
  :clearable="!isDisabled"
@@ -446,7 +483,7 @@
446
483
  />
447
484
  <base-panel-input
448
485
  v-model="member.economySectorCode"
449
- :value="member.economySectorCode.nameRu"
486
+ :value="member.economySectorCode?.nameRu"
450
487
  :label="$dataStore.t('form.economySectorCode')"
451
488
  :readonly="isDisabled"
452
489
  :clearable="!isDisabled"
@@ -457,7 +494,7 @@
457
494
  <base-panel-input
458
495
  v-if="hasInsurancePay"
459
496
  v-model="member.insurancePay"
460
- :value="member.insurancePay.nameRu"
497
+ :value="member.insurancePay?.nameRu"
461
498
  :readonly="isDisabled"
462
499
  :clearable="!isDisabled"
463
500
  :rules="$rules.objectRequired"
@@ -474,13 +511,13 @@
474
511
  :label="$dataStore.t('form.homePhone')"
475
512
  :readonly="isDisabled"
476
513
  :clearable="!isDisabled"
477
- :rules="whichForm === formStore.beneficiaryFormKey ? [] : $rules.phoneFormat"
514
+ :rules="whichForm === formStore.beneficiaryFormKey || member.isInsuredUnderage ? [] : $rules.phoneFormat"
478
515
  />
479
- <base-form-input v-model.trim="member.email" :label="$dataStore.t('form.email')" :rules="$rules.email" />
516
+ <base-form-input v-model.trim="member.email" :label="$dataStore.t('form.email')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.email" />
480
517
  </base-form-section>
481
518
  </v-form>
482
519
  <base-btn v-if="showSaveButton" :loading="isButtonLoading || isSubmittingForm" :text="$dataStore.t('buttons.save')" @click="submitForm" />
483
- <Teleport v-if="isPanelOpen" to="#panel-actions">
520
+ <Teleport v-if="isPanelOpen" to="#right-panel-actions">
484
521
  <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
485
522
  <base-rounded-input v-model="searchQuery" :label="$dataStore.t('labels.search')" class="w-full p-2" :hide-details="true" />
486
523
  <div v-if="panelList && isPanelLoading === false" class="w-full flex flex-col gap-2 p-2">
@@ -496,20 +533,34 @@
496
533
  <base-loader v-if="isPanelLoading" class="absolute mt-10" :size="50" />
497
534
  </div>
498
535
  </Teleport>
499
- <Teleport v-if="isSearchOpen" to="#panel-actions">
536
+ <Teleport v-if="isSearchOpen" to="#right-panel-actions">
500
537
  <div :class="[$styles.flexColNav]">
501
538
  <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
502
539
  <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
503
540
  <base-btn v-if="hasGKB" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGKB')" @click="getFamilyInfo" />
541
+ <base-form-section v-if="hasDocumentReader" class="!mt-0">
542
+ <base-file-input
543
+ :disabled="isDisabled"
544
+ :clearable="!isDisabled"
545
+ accept="image/*,.pdf"
546
+ append="mdi-credit-card-scan-outline"
547
+ :multiple="true"
548
+ @onClear="imageDataList = []"
549
+ @input="attachDocumentReader($event)"
550
+ />
551
+ </base-form-section>
552
+ <base-animation>
553
+ <base-btn v-if="hasDocumentReader && imageDataList && !!imageDataList.length" :loading="isButtonLoading" text="Получить данные" @click="getDocumentReader" />
554
+ </base-animation>
504
555
  </div>
505
556
  </Teleport>
506
- <Teleport v-if="isDocumentOpen" to="#panel-actions">
557
+ <Teleport v-if="isDocumentOpen" to="#right-panel-actions">
507
558
  <div :class="[$styles.flexColNav]">
508
559
  <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getFile('view')" />
509
560
  <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getFile('download')" />
510
561
  </div>
511
562
  </Teleport>
512
- <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#panel-actions">
563
+ <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#right-panel-actions">
513
564
  <div :class="[$styles.flexColNav]">
514
565
  <base-fade-transition>
515
566
  <base-rounded-input
@@ -527,7 +578,16 @@
527
578
  <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.check')" @click="checkOtp()" />
528
579
  </div>
529
580
  </Teleport>
530
- <base-dialog v-model="familyDialog" :title="$dataStore.t('dialog.familyMember')" actions="familyDialog">
581
+ <base-dialog
582
+ v-model="deletionDialog"
583
+ :title="$dataStore.t('dialog.confirmDelete')"
584
+ :subtitle="$dataStore.t('dialog.delete')"
585
+ :confirm="$dataStore.t('confirm.delete')"
586
+ :icon="{ mdi: 'delete-outline', color: '#FD2D39' }"
587
+ @yes="deleteMember"
588
+ @no="deletionDialog = false"
589
+ />
590
+ <base-dialog v-model="familyDialog" :subtitle="$dataStore.t('dialog.familyMember')" :icon="{ mdi: 'hand-pointing-up' }" actions="familyDialog">
531
591
  <template #actions>
532
592
  <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" />
533
593
  </template>
@@ -566,12 +626,15 @@ export default {
566
626
  const isPanelLoading = ref<boolean>(false);
567
627
  const isChangingMember = ref<boolean>(false);
568
628
  const familyDialog = ref<boolean>(false);
629
+ const deletionDialog = ref<boolean>(false);
630
+ const selectedIndex = ref<number>(0);
569
631
  const sameAddress = ref<boolean>(false);
570
632
  const panelValue = ref<Value>(new Value());
571
633
  const panelList = ref<Value[]>([]);
572
634
  const currentPanel = ref<keyof typeof member.value>();
573
635
  const searchQuery = ref<string>('');
574
636
  const fileData = ref<{ file: any }>();
637
+ const imageDataList = ref<string[]>([]);
575
638
 
576
639
  const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
577
640
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
@@ -581,7 +644,7 @@ export default {
581
644
  const isFromGBD = computed(() => !!member.value.gosPersonData);
582
645
  const showSaveButton = computed(() => {
583
646
  const generalCondition = !isDisabled.value && !!isTask.value && !!dataStore.isInitiator();
584
- const perMemberCondtion = () => {
647
+ const perMemberCondition = () => {
585
648
  switch (whichForm.value) {
586
649
  case formStore.policyholderFormKey:
587
650
  return true;
@@ -594,7 +657,7 @@ export default {
594
657
  return false;
595
658
  }
596
659
  };
597
- return generalCondition && perMemberCondtion();
660
+ return generalCondition && perMemberCondition();
598
661
  });
599
662
 
600
663
  const hasGBDFL = computed(() => {
@@ -607,9 +670,17 @@ export default {
607
670
  if (dataStore.isBolashak || dataStore.isGons) {
608
671
  return false;
609
672
  }
673
+ if (member.value.age !== null && Number(member.value.age) < 18) {
674
+ return false;
675
+ }
676
+ return true;
677
+ }
678
+ case formStore.insuredFormKey: {
679
+ if (dataStore.isLifetrip && member.value.isInsuredUnderage) {
680
+ return false;
681
+ }
610
682
  return true;
611
683
  }
612
- case formStore.insuredFormKey:
613
684
  case formStore.beneficialOwnerFormKey:
614
685
  case formStore.policyholdersRepresentativeFormKey:
615
686
  return true;
@@ -617,7 +688,7 @@ export default {
617
688
  return true;
618
689
  }
619
690
  };
620
- return dataStore.controls.hasGBDFL && perMemberCondition();
691
+ return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
621
692
  });
622
693
  const hasInsis = computed(() => dataStore.controls.hasInsis);
623
694
  const hasGKB = computed(() => {
@@ -640,8 +711,29 @@ export default {
640
711
  };
641
712
  return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
642
713
  });
643
-
714
+ const hasDocumentReader = computed(() => {
715
+ return !!member.value.hasAgreement && !!isTask.value && (dataStore.isAULETTI || dataStore.isAulettiParent);
716
+ });
717
+ const hasMemberSearch = computed(() => showSaveButton.value && (hasGBDFL.value || hasGKB.value || hasInsis.value || hasDocumentReader.value));
718
+ const hasMiddleName = computed(() => {
719
+ if (dataStore.isLifetrip) {
720
+ return false;
721
+ }
722
+ return true;
723
+ });
724
+ const hasRelationDegree = computed(() => {
725
+ if (dataStore.isLifetrip) {
726
+ return false;
727
+ }
728
+ if ((whichForm.value === formStore.beneficiaryFormKey || whichForm.value === formStore.insuredFormKey) && member.value.iin !== formStore.policyholderForm.iin) {
729
+ return true;
730
+ }
731
+ return false;
732
+ });
644
733
  const hasFamilyStatus = computed(() => {
734
+ if (dataStore.isLifetrip) {
735
+ return false;
736
+ }
645
737
  if (whichForm.value === formStore.beneficiaryFormKey) {
646
738
  if (dataStore.isBolashak) {
647
739
  return false;
@@ -658,7 +750,7 @@ export default {
658
750
  return false;
659
751
  });
660
752
  const hasSignOfIPDL = computed(() => {
661
- if (dataStore.isGons) {
753
+ if (dataStore.isGons || dataStore.isLifetrip) {
662
754
  return false;
663
755
  }
664
756
  return true;
@@ -667,7 +759,7 @@ export default {
667
759
 
668
760
  const birthDateRule = computed(() => {
669
761
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
670
- const byMemverAndProductRule = () => {
762
+ const byMemberAndProductRule = () => {
671
763
  if (whichForm.value === formStore.policyholderFormKey) {
672
764
  if (dataStore.isGons || dataStore.isBolashak || dataStore.isBaiterek) {
673
765
  return dataStore.rules.age18ByDate;
@@ -677,10 +769,13 @@ export default {
677
769
  if (dataStore.isBolashak || dataStore.isBaiterek) {
678
770
  return dataStore.rules.age18ByDate;
679
771
  }
772
+ if (dataStore.isLifetrip) {
773
+ return dataStore.rules.ageExceeds80ByDate;
774
+ }
680
775
  }
681
776
  return [];
682
777
  };
683
- return baseDateRule.concat(byMemverAndProductRule());
778
+ return baseDateRule.concat(byMemberAndProductRule());
684
779
  });
685
780
  const ageRule = computed(() => {
686
781
  const baseAgeRule = dataStore.rules.numbers;
@@ -711,10 +806,13 @@ export default {
711
806
  if (dataStore.isGons || dataStore.isBolashak) {
712
807
  return [];
713
808
  }
714
- if ((dataStore.isKazyna || dataStore.isLiferenta) && Number(member.value.age) < 18) {
809
+ if (member.value.age !== null && Number(member.value.age) < 18) {
715
810
  return [];
716
811
  }
717
812
  }
813
+ if (member.value.isInsuredUnderage) {
814
+ return [];
815
+ }
718
816
  return basePhoneRule;
719
817
  });
720
818
 
@@ -725,6 +823,9 @@ export default {
725
823
  return baseResidencyRule.concat(dataStore.rules.noResident);
726
824
  }
727
825
  }
826
+ if (dataStore.isLifetrip) {
827
+ return baseResidencyRule.concat(dataStore.rules.noResidentOffline);
828
+ }
728
829
  return baseResidencyRule;
729
830
  });
730
831
 
@@ -742,6 +843,8 @@ export default {
742
843
  const otpCondition = computed(() => {
743
844
  // Add conditions by product
744
845
  if (member.value.hasAgreement) return false;
846
+ if (whichForm.value === formStore.beneficiaryFormKey && member.value.age !== null && Number(member.value.age) < 18) return false;
847
+ if (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage) return false;
745
848
  if (!member.value.phoneNumber || (member.value.phoneNumber && member.value.phoneNumber.length !== useMask().phone.length)) return false;
746
849
  return getOtpConditionByMember();
747
850
  });
@@ -749,8 +852,8 @@ export default {
749
852
  const searchMember = async () => {
750
853
  if (!isDisabled.value) {
751
854
  dataStore.panelAction = null;
752
- dataStore.panel.title = 'Поиск контрагента';
753
- dataStore.panel.open = true;
855
+ dataStore.rightPanel.title = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента';
856
+ dataStore.rightPanel.open = true;
754
857
  isSearchOpen.value = true;
755
858
  isDocumentOpen.value = false;
756
859
  isOtpPanelOpen.value = false;
@@ -767,20 +870,20 @@ export default {
767
870
  const openCustomPanel = (type: 'document' | 'otp' = 'document') => {
768
871
  dataStore.panelAction = null;
769
872
  if (type === 'document' && memberDocument.value) {
770
- dataStore.panel.title = memberDocument.value.fileTypeName!;
873
+ dataStore.rightPanel.title = memberDocument.value.fileTypeName!;
771
874
  isDocumentOpen.value = true;
772
875
  isSearchOpen.value = false;
773
876
  isPanelOpen.value = false;
774
877
  isOtpPanelOpen.value = false;
775
878
  }
776
879
  if (type === 'otp') {
777
- dataStore.panel.title = dataStore.t('form.otpCode');
880
+ dataStore.rightPanel.title = dataStore.t('form.otpCode');
778
881
  isOtpPanelOpen.value = true;
779
882
  isDocumentOpen.value = false;
780
883
  isSearchOpen.value = false;
781
884
  isPanelOpen.value = false;
782
885
  }
783
- dataStore.panel.open = true;
886
+ dataStore.rightPanel.open = true;
784
887
  };
785
888
 
786
889
  const openPanel = async (title: string, list: Value[], key: string, asyncFunction?: Function, filterKey?: string) => {
@@ -798,8 +901,8 @@ export default {
798
901
  currentPanel.value = key as keyof typeof member.value;
799
902
  isPanelOpen.value = true;
800
903
  dataStore.panelAction = null;
801
- dataStore.panel.open = true;
802
- dataStore.panel.title = title;
904
+ dataStore.rightPanel.open = true;
905
+ dataStore.rightPanel.title = title;
803
906
 
804
907
  let newList = list;
805
908
  if (asyncFunction) {
@@ -832,7 +935,7 @@ export default {
832
935
 
833
936
  const pickPanelValue = (item: Value) => {
834
937
  if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
835
- dataStore.panel.open = false;
938
+ dataStore.rightPanel.open = false;
836
939
  isPanelOpen.value = false;
837
940
  // @ts-ignore
838
941
  member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
@@ -874,6 +977,95 @@ export default {
874
977
  }
875
978
  };
876
979
 
980
+ const attachDocumentReader = async (event: InputEvent) => {
981
+ if (event.target) {
982
+ const target = event.target as HTMLInputElement;
983
+ if (target.files && !!target.files.length) {
984
+ imageDataList.value = [];
985
+ await Promise.allSettled(
986
+ Object.values(target.files).map(async f => {
987
+ const { execute: getBase64 } = useBase64(f);
988
+ imageDataList.value.push(await getBase64());
989
+ }),
990
+ );
991
+ }
992
+ } else {
993
+ if (event.dataTransfer) {
994
+ const dataTransfer = event.dataTransfer as DataTransfer;
995
+ if (!!dataTransfer.files && !!dataTransfer.files.length) {
996
+ imageDataList.value = [];
997
+ await Promise.allSettled(
998
+ Object.values(dataTransfer.files).map(async f => {
999
+ const { execute: getBase64 } = useBase64(f);
1000
+ imageDataList.value.push(await getBase64());
1001
+ }),
1002
+ );
1003
+ }
1004
+ }
1005
+ }
1006
+ };
1007
+
1008
+ const getDocumentReader = async () => {
1009
+ if (imageDataList.value && !!imageDataList.value.length) {
1010
+ isButtonLoading.value = true;
1011
+ const parsedDocument = await callDocumentReader(imageDataList.value);
1012
+ if (typeof parsedDocument === 'object') {
1013
+ if (
1014
+ member.value.iin &&
1015
+ parsedDocument.iin &&
1016
+ reformatIin(parsedDocument.iin) &&
1017
+ member.value.iin.length === useMask().iin.length &&
1018
+ reformatIin(parsedDocument.iin).length === useMask().iin.length &&
1019
+ member.value.iin !== reformatIin(parsedDocument.iin)
1020
+ ) {
1021
+ dataStore.showToaster('error', 'Не совпадают ИИН');
1022
+ isButtonLoading.value = false;
1023
+ return;
1024
+ }
1025
+ formatDateProperty(parsedDocument, 'front');
1026
+ member.value.parsedDocument = parsedDocument;
1027
+ if (parsedDocument.age) member.value.age = parsedDocument.age;
1028
+ if (parsedDocument.iin) member.value.iin = reformatIin(parsedDocument.iin);
1029
+ if (parsedDocument.gender) {
1030
+ if (parsedDocument.gender === 'M' || parsedDocument.gender === 'F') {
1031
+ const gender = dataStore.gender.find((i: Value) => i.id === (parsedDocument.gender === 'M' ? 1 : 2));
1032
+ if (gender) member.value.gender = gender;
1033
+ }
1034
+ }
1035
+ if (parsedDocument.birthDate) member.value.birthDate = parsedDocument.birthDate;
1036
+ if (parsedDocument.documentIssueDate) member.value.documentDate = parsedDocument.documentIssueDate;
1037
+ if (parsedDocument.documentExpireDate) member.value.documentExpire = parsedDocument.documentExpireDate;
1038
+ if (parsedDocument.documentNumber) member.value.documentNumber = parsedDocument.documentNumber;
1039
+ if (parsedDocument.lastName) member.value.lastName = parsedDocument.lastName;
1040
+ if (parsedDocument.firstName) member.value.firstName = parsedDocument.firstName;
1041
+ if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1042
+ if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1043
+ if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1044
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === '1UDL');
1045
+ if (documentType) member.value.documentType = documentType;
1046
+ }
1047
+ if (!!parsedDocument.documentIssuer) {
1048
+ if (
1049
+ parsedDocument.documentIssuer === 'МИНИСТЕРСТВО ВНУТРЕННИХ ДЕЛ РК' ||
1050
+ parsedDocument.documentIssuer === 'ҚР ІШКІ ІСТЕР МИНИСТРЛІГІ' ||
1051
+ /ҚАЗАҚСТАН/gi.test(parsedDocument.documentIssuer) ||
1052
+ /КАЗАХСТАН/gi.test(parsedDocument.documentIssuer)
1053
+ ) {
1054
+ const documentIssuer = dataStore.documentIssuers.find(i => (i.nameRu as string).match(new RegExp('МВД РК', 'i')));
1055
+ if (documentIssuer) member.value.documentIssuers = documentIssuer;
1056
+ } else {
1057
+ const documentIssuer = dataStore.documentIssuers.find(i => (i.nameRu as string).match(new RegExp(`${parsedDocument.documentIssuer}`, 'i')));
1058
+ if (documentIssuer) member.value.documentIssuers = documentIssuer;
1059
+ }
1060
+ }
1061
+ dataStore.rightPanel.open = false;
1062
+ dataStore.showToaster('success', dataStore.t('toaster.successOperation'));
1063
+ imageDataList.value = [];
1064
+ }
1065
+ isButtonLoading.value = false;
1066
+ }
1067
+ };
1068
+
877
1069
  const getFile = async (type: FileActions) => {
878
1070
  if (memberDocument.value) {
879
1071
  documentLoading.value = true;
@@ -904,7 +1096,7 @@ export default {
904
1096
  familyDialog.value = false;
905
1097
  selectedFamilyMember.value = {};
906
1098
  isButtonLoading.value = false;
907
- dataStore.panel.open = false;
1099
+ dataStore.rightPanel.open = false;
908
1100
  isSearchOpen.value = false;
909
1101
  };
910
1102
 
@@ -921,20 +1113,20 @@ export default {
921
1113
  }
922
1114
  familyDialog.value = false;
923
1115
  isButtonLoading.value = false;
924
- dataStore.panel.open = false;
1116
+ dataStore.rightPanel.open = false;
925
1117
  isSearchOpen.value = false;
926
1118
  };
927
1119
 
928
1120
  const getContragentFromGBDFL = async () => {
929
1121
  if (member.value.hasAgreement !== true) {
930
1122
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
931
- dataStore.panel.open = false;
1123
+ dataStore.rightPanel.open = false;
932
1124
  isSearchOpen.value = false;
933
1125
  return;
934
1126
  }
935
1127
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length || !member.value.phoneNumber || member.value.phoneNumber.length !== useMask().phone.length) {
936
1128
  dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'Номер телефона, ИИН' }), 5000);
937
- dataStore.panel.open = false;
1129
+ dataStore.rightPanel.open = false;
938
1130
  isSearchOpen.value = false;
939
1131
  return;
940
1132
  }
@@ -944,7 +1136,7 @@ export default {
944
1136
  if (response === true) {
945
1137
  member.value.gotFromInsis = true;
946
1138
  }
947
- dataStore.panel.open = false;
1139
+ dataStore.rightPanel.open = false;
948
1140
  isSearchOpen.value = false;
949
1141
  }
950
1142
  isButtonLoading.value = false;
@@ -953,20 +1145,20 @@ export default {
953
1145
  const getContragent = async () => {
954
1146
  if (member.value.hasAgreement !== true) {
955
1147
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
956
- dataStore.panel.open = false;
1148
+ dataStore.rightPanel.open = false;
957
1149
  isSearchOpen.value = false;
958
1150
  return;
959
1151
  }
960
1152
  if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
961
1153
  dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
962
- dataStore.panel.open = false;
1154
+ dataStore.rightPanel.open = false;
963
1155
  isSearchOpen.value = false;
964
1156
  return;
965
1157
  }
966
1158
  isButtonLoading.value = true;
967
1159
  await dataStore.getContragent(member.value, false);
968
1160
  isButtonLoading.value = false;
969
- dataStore.panel.open = false;
1161
+ dataStore.rightPanel.open = false;
970
1162
  isSearchOpen.value = false;
971
1163
  };
972
1164
 
@@ -1036,14 +1228,17 @@ export default {
1036
1228
  if (!isSaved) return false;
1037
1229
  if (whichForm.value === formStore.policyholderFormKey) {
1038
1230
  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;
1231
+ const insuredFormIndex = remoteIsInsured.value === true ? 0 : isInsured === true ? formStore.insuredForm.findIndex(i => i.iin === formStore.policyholderForm.iin) : -1;
1232
+ if (insuredFormIndex !== -1) {
1233
+ formStore.insuredForm[insuredFormIndex] = formStore.policyholderForm;
1234
+ const isInsuredSaved = await dataStore.saveMember(
1235
+ member.value,
1236
+ memberStore.getMemberCode(formStore.insuredFormKey)!,
1237
+ memberStore.getMemberFromApplication(formStore.insuredFormKey, insuredFormIndex),
1238
+ );
1239
+ if (!isInsuredSaved) return false;
1240
+ wasInsuredAction.value = true;
1241
+ }
1047
1242
  }
1048
1243
  }
1049
1244
  if (whichForm.value === formStore.insuredFormKey) {
@@ -1056,8 +1251,8 @@ export default {
1056
1251
  await dataStore.getApplicationData(route.params.taskId as string, false, false, true, wasInsuredAction.value);
1057
1252
  if (dataStore.controls.hasCalculator) {
1058
1253
  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);
1254
+ formStore.additionalInsuranceTerms.forEach(term => {
1255
+ const defaultTerm = formStore.additionalInsuranceTermsWithout.find(i => i.coverTypeId === term.coverTypeId);
1061
1256
  if (defaultTerm) {
1062
1257
  term.coverSumName = defaultTerm.coverSumName;
1063
1258
  term.coverSumId = defaultTerm.coverSumId;
@@ -1071,14 +1266,13 @@ export default {
1071
1266
  };
1072
1267
 
1073
1268
  const validateAgreement = () => {
1074
- if (dataStore.isGons || dataStore.isBolashak) {
1075
- if (whichForm.value === formStore.beneficiaryFormKey) {
1076
- // TODO уточнить
1269
+ if (whichForm.value === formStore.beneficiaryFormKey) {
1270
+ if (member.value.age !== null && Number(member.value.age) < 18) {
1077
1271
  return true;
1078
1272
  }
1079
1273
  }
1080
- if (dataStore.isKazyna || dataStore.isLiferenta) {
1081
- if (whichForm.value === formStore.beneficiaryFormKey && Number(member.value.age) < 18) {
1274
+ if (whichForm.value === formStore.insuredFormKey) {
1275
+ if (dataStore.isLifetrip && member.value.isInsuredUnderage) {
1082
1276
  return true;
1083
1277
  }
1084
1278
  }
@@ -1096,10 +1290,16 @@ export default {
1096
1290
  if (v.valid) {
1097
1291
  isSubmittingForm.value = true;
1098
1292
  const docType = member.value.documentType.ids;
1099
- if (member.value.gotFromInsis === true && (docType === '1UDL' || docType === 'SBI')) {
1293
+ if (member.value.gotFromInsis === true && (docType === '1UDL' || docType === 'SBI' || docType === 'PS')) {
1100
1294
  dataStore.isLoading = true;
1101
- const ESBDResponse = await validateESBD(docType === '1UDL' ? 1 : 3);
1295
+ const docTypeCodes = {
1296
+ '1UDL': 1,
1297
+ PS: 2,
1298
+ SBI: 3,
1299
+ };
1300
+ const ESBDResponse = await validateESBD(docTypeCodes[docType]);
1102
1301
  if (!ESBDResponse) {
1302
+ isSubmittingForm.value = false;
1103
1303
  dataStore.isLoading = false;
1104
1304
  return;
1105
1305
  }
@@ -1153,7 +1353,7 @@ export default {
1153
1353
  }
1154
1354
  otpSending.value = false;
1155
1355
  if (checked === true) {
1156
- dataStore.panel.open = false;
1356
+ dataStore.rightPanel.open = false;
1157
1357
  }
1158
1358
  };
1159
1359
 
@@ -1163,7 +1363,7 @@ export default {
1163
1363
  if (response) {
1164
1364
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
1165
1365
  if (response.otpStatus === true) {
1166
- dataStore.panel.open = false;
1366
+ dataStore.rightPanel.open = false;
1167
1367
  }
1168
1368
  }
1169
1369
  otpSending.value = false;
@@ -1177,6 +1377,15 @@ export default {
1177
1377
  if (setDefaults.percentage) {
1178
1378
  setPercentage();
1179
1379
  }
1380
+ if (setDefaults.signOfResidency) {
1381
+ setSignOfResidency();
1382
+ }
1383
+ if (setDefaults.countryOfTaxResidency) {
1384
+ setCountryOfTaxResidency();
1385
+ }
1386
+ if (setDefaults.countryOfCitizenship) {
1387
+ setCountryOfCitizenship();
1388
+ }
1180
1389
  };
1181
1390
 
1182
1391
  const setSectorCode = async () => {
@@ -1186,7 +1395,27 @@ export default {
1186
1395
  member.value.economySectorCode = defaultValue ? defaultValue : new Value();
1187
1396
  }
1188
1397
  };
1189
-
1398
+ const setSignOfResidency = async () => {
1399
+ if (member.value.id === 0 && route.query.id === '0') {
1400
+ const residents = await dataStore.getResidents();
1401
+ const defaultValue = residents.find(item => String(item.nameRu).match(new RegExp('Резидент', 'i'))) as Value;
1402
+ member.value.signOfResidency = defaultValue ? defaultValue : new Value();
1403
+ }
1404
+ };
1405
+ const setCountryOfTaxResidency = async () => {
1406
+ if (member.value.id === 0 && route.query.id === '0') {
1407
+ const taxCountries = await dataStore.getTaxCountries();
1408
+ const defaultValue = taxCountries.find(item => String(item.nameRu).match(new RegExp('Казахстан', 'i'))) as Value;
1409
+ member.value.countryOfTaxResidency = defaultValue ? defaultValue : new Value();
1410
+ }
1411
+ };
1412
+ const setCountryOfCitizenship = async () => {
1413
+ if (member.value.id === 0 && route.query.id === '0') {
1414
+ const citizenshipCountries = await dataStore.getCitizenshipCountries();
1415
+ const defaultValue = citizenshipCountries.find(item => String(item.nameRu).match(new RegExp('Казахстан', 'i'))) as Value;
1416
+ member.value.countryOfCitizenship = defaultValue ? defaultValue : new Value();
1417
+ }
1418
+ };
1190
1419
  const setPercentage = () => {
1191
1420
  if (whichForm.value === formStore.beneficiaryFormKey && member.value.id === 0 && route.query.id === '0' && member.value.percentageOfPayoutAmount === null) {
1192
1421
  if (dataStore.members.beneficiaryApp.isMultiple) {
@@ -1203,7 +1432,7 @@ export default {
1203
1432
  };
1204
1433
 
1205
1434
  const selectMember = async (index: number, update?: boolean) => {
1206
- dataStore.panel.open = false;
1435
+ dataStore.rightPanel.open = false;
1207
1436
  isButtonLoading.value = true;
1208
1437
  isChangingMember.value = true;
1209
1438
  //@ts-ignore
@@ -1212,13 +1441,19 @@ export default {
1212
1441
  isButtonLoading.value = false;
1213
1442
  };
1214
1443
 
1215
- const deleteMember = async (index: number) => {
1216
- await memberStore.deleteMember(route.params.taskId as string, whichForm.value, index);
1444
+ const openDeletionDialog = (index: number) => {
1445
+ deletionDialog.value = true;
1446
+ selectedIndex.value = index;
1447
+ };
1448
+
1449
+ const deleteMember = async () => {
1450
+ await memberStore.deleteMember(route.params.taskId as string, whichForm.value, selectedIndex.value);
1217
1451
  const currentIndex = Number(whichIndex.value);
1218
- if (index <= currentIndex) {
1452
+ if (selectedIndex.value <= currentIndex) {
1219
1453
  const newIndex = ref<number>(currentIndex - 1 > 0 ? currentIndex - 1 : 0);
1220
- await selectMember(newIndex.value, index === currentIndex ? true : undefined);
1454
+ await selectMember(newIndex.value, selectedIndex.value === currentIndex ? true : undefined);
1221
1455
  }
1456
+ deletionDialog.value = false;
1222
1457
  };
1223
1458
 
1224
1459
  const onInit = async () => {
@@ -1302,9 +1537,9 @@ export default {
1302
1537
  };
1303
1538
 
1304
1539
  watch(
1305
- () => dataStore.panel.open,
1540
+ () => dataStore.rightPanel.open,
1306
1541
  () => {
1307
- if (dataStore.panel.open === false) {
1542
+ if (dataStore.rightPanel.open === false) {
1308
1543
  isPanelOpen.value = false;
1309
1544
  isDocumentOpen.value = false;
1310
1545
  isSearchOpen.value = false;
@@ -1320,6 +1555,30 @@ export default {
1320
1555
  searchQuery.value = '';
1321
1556
  }
1322
1557
  });
1558
+ if (dataStore.isLifetrip) {
1559
+ watch(
1560
+ () => member.value.age,
1561
+ val => {
1562
+ if (val && Number(val) >= 18) {
1563
+ if (member.value.hasAgreement !== true) {
1564
+ member.value.hasAgreement = false;
1565
+ }
1566
+ } else {
1567
+ member.value.hasAgreement = true;
1568
+ }
1569
+ member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1570
+ },
1571
+ );
1572
+ watch(
1573
+ () => member.value.isInsuredUnderage,
1574
+ val => {
1575
+ if (val === true && Number(member.value.age) >= 18) {
1576
+ member.value.isInsuredUnderage = false;
1577
+ return dataStore.showToaster('error', dataStore.t('toaster.underageShouldBeLess18'), 3000);
1578
+ }
1579
+ },
1580
+ );
1581
+ }
1323
1582
 
1324
1583
  return {
1325
1584
  // State
@@ -1342,8 +1601,11 @@ export default {
1342
1601
  Value,
1343
1602
  memberDocument,
1344
1603
  familyDialog,
1604
+ deletionDialog,
1605
+ selectedIndex,
1345
1606
  selectedFamilyMember,
1346
1607
  sameAddress,
1608
+ imageDataList,
1347
1609
 
1348
1610
  // Computed
1349
1611
  whichForm,
@@ -1359,10 +1621,14 @@ export default {
1359
1621
  hasGBDFL,
1360
1622
  hasInsis,
1361
1623
  hasGKB,
1624
+ hasDocumentReader,
1625
+ hasMiddleName,
1626
+ hasRelationDegree,
1362
1627
  hasFamilyStatus,
1363
1628
  hasInsurancePay,
1364
1629
  hasSignOfIPDL,
1365
1630
  hasSameAddressToggle,
1631
+ hasMemberSearch,
1366
1632
 
1367
1633
  // Rules
1368
1634
  ageRule,
@@ -1382,9 +1648,12 @@ export default {
1382
1648
  getContragentFromGBDFL,
1383
1649
  getContragent,
1384
1650
  attachFile,
1651
+ attachDocumentReader,
1652
+ getDocumentReader,
1385
1653
  getFile,
1386
1654
  selectFamilyMember,
1387
1655
  closeFamilyDialog,
1656
+ openDeletionDialog,
1388
1657
  scrollForm,
1389
1658
  onIinInput,
1390
1659
  onOtpCodeInput,