hl-core 0.0.10-beta.3 → 0.0.10-beta.30

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 (50) hide show
  1. package/api/base.api.ts +259 -190
  2. package/api/interceptors.ts +3 -5
  3. package/components/Complex/TextBlock.vue +2 -0
  4. package/components/Dialog/Dialog.vue +7 -1
  5. package/components/Dialog/FamilyDialog.vue +2 -0
  6. package/components/Form/DigitalDocument.vue +52 -0
  7. package/components/Form/DynamicForm.vue +1 -0
  8. package/components/Form/FormData.vue +1 -0
  9. package/components/Form/ManagerAttachment.vue +18 -8
  10. package/components/Form/ProductConditionsBlock.vue +12 -6
  11. package/components/Input/DynamicInput.vue +2 -0
  12. package/components/Input/FormInput.vue +2 -0
  13. package/components/Input/OtpInput.vue +25 -0
  14. package/components/Input/PanelInput.vue +1 -0
  15. package/components/Input/RoundedInput.vue +2 -0
  16. package/components/Input/RoundedSelect.vue +4 -0
  17. package/components/Input/SwitchInput.vue +2 -0
  18. package/components/Input/TextInput.vue +2 -0
  19. package/components/Layout/Drawer.vue +2 -0
  20. package/components/Pages/Anketa.vue +166 -167
  21. package/components/Pages/Auth.vue +2 -0
  22. package/components/Pages/ContragentForm.vue +2 -1
  23. package/components/Pages/Documents.vue +244 -6
  24. package/components/Pages/MemberForm.vue +276 -96
  25. package/components/Pages/ProductConditions.vue +275 -96
  26. package/components/Panel/PanelHandler.vue +236 -108
  27. package/components/Transitions/Animation.vue +2 -0
  28. package/components/Utilities/Chip.vue +3 -1
  29. package/components/Utilities/JsonViewer.vue +1 -2
  30. package/composables/classes.ts +117 -42
  31. package/composables/constants.ts +33 -0
  32. package/composables/fields.ts +6 -4
  33. package/composables/index.ts +243 -7
  34. package/composables/styles.ts +8 -24
  35. package/configs/pwa.ts +1 -7
  36. package/layouts/clear.vue +1 -1
  37. package/layouts/default.vue +1 -1
  38. package/layouts/full.vue +1 -1
  39. package/locales/ru.json +34 -10
  40. package/nuxt.config.ts +10 -13
  41. package/package.json +13 -12
  42. package/plugins/head.ts +2 -1
  43. package/store/data.store.ts +380 -389
  44. package/store/member.store.ts +3 -2
  45. package/store/rules.ts +19 -0
  46. package/tsconfig.json +3 -0
  47. package/types/enum.ts +19 -2
  48. package/types/env.d.ts +2 -2
  49. package/types/form.ts +71 -74
  50. package/types/index.ts +916 -873
@@ -68,51 +68,56 @@
68
68
  v-model="member.phoneNumber"
69
69
  :label="$dataStore.t('form.phoneNumber')"
70
70
  :maska="$maska.phone"
71
- :readonly="!!isDisabled || !!isIinPhoneDisabled"
72
- :clearable="!isDisabled"
71
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!isDataFromGov"
72
+ :clearable="!isDisabled && !isIinPhoneDisabled && !isDataFromGov"
73
73
  :append-inner-icon="otpCondition ? `${$dataStore.isPension ? 'mdi-message-text' : 'mdi mdi-phone-message'}` : ''"
74
74
  @append="openCustomPanel('otp')"
75
75
  @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
76
76
  :rules="phoneRule"
77
77
  />
78
- <base-form-input
79
- v-model="member.iin"
80
- :label="$dataStore.t('form.iin')"
81
- :maska="$maska.iin"
82
- :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin"
83
- :clearable="!isDisabled"
84
- :append-inner-icon="hasMemberSearch ? (hasDocumentReader ? 'mdi mdi-credit-card-scan-outline' : 'mdi mdi-magnify') : ''"
85
- @append="searchMember"
86
- @input="onIinInput"
87
- :rules="$rules.required.concat($rules.iinRight)"
88
- />
78
+ <base-animation>
79
+ <base-form-input
80
+ v-if="!isNonResident"
81
+ v-model="member.iin"
82
+ :label="$dataStore.t('form.iin')"
83
+ :maska="$maska.iin"
84
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin || !!isDataFromGov"
85
+ :clearable="!isDisabled && !isIinPhoneDisabled && !member.parsedDocument?.iin && !isDataFromGov"
86
+ :append-inner-icon="hasMemberSearch || !isNonResident ? (hasDocumentReader ? 'mdi mdi-credit-card-scan-outline' : 'mdi mdi-magnify') : ''"
87
+ @append="searchMember"
88
+ @input="onIinInput"
89
+ :rules="isNonResident ? [] : $rules.required.concat($rules.iinRight)"
90
+ />
91
+ </base-animation>
89
92
  <base-form-input
90
93
  v-model.trim="member.lastName"
91
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.lastName"
92
- :clearable="!isDisabled"
94
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.lastName"
95
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.lastName"
93
96
  :label="$dataStore.t('form.lastName')"
94
97
  :rules="$rules.required.concat($rules.cyrillic)"
95
98
  />
96
99
  <base-form-input
97
100
  v-model.trim="member.firstName"
98
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.firstName"
99
- :clearable="!isDisabled"
101
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.firstName"
102
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.firstName"
100
103
  :label="$dataStore.t('form.firstName')"
101
104
  :rules="$rules.required.concat($rules.cyrillic)"
105
+ :append-inner-icon="isNonResident ? 'mdi mdi-magnify' : ''"
106
+ @append="searchMember"
102
107
  />
103
108
  <base-form-input
104
109
  v-if="hasMiddleName"
105
110
  v-model.trim="member.middleName"
106
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.middleName"
107
- :clearable="!isDisabled"
111
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.middleName"
112
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.middleName"
108
113
  :label="$dataStore.t('form.middleName')"
109
114
  :rules="$rules.cyrillicNonRequired"
110
115
  />
111
116
  <base-form-input
112
117
  v-if="$dataStore.isLifetrip"
113
118
  v-model.trim="member.lastNameLat"
114
- :readonly="isDisabled || isFromGBD"
115
- :clearable="!isDisabled"
119
+ :readonly="isDisabled || isDataFromGov"
120
+ :clearable="!isDisabled && !isDataFromGov"
116
121
  :label="$dataStore.t('form.lastNameLat')"
117
122
  :rules="$rules.required.concat($rules.latin)"
118
123
  :hint="$dataStore.t('labels.checkWithDoc')"
@@ -120,16 +125,16 @@
120
125
  <base-form-input
121
126
  v-if="$dataStore.isLifetrip"
122
127
  v-model.trim="member.firstNameLat"
123
- :readonly="isDisabled || isFromGBD"
124
- :clearable="!isDisabled"
128
+ :readonly="isDisabled || isDataFromGov"
129
+ :clearable="!isDisabled && !isDataFromGov"
125
130
  :label="$dataStore.t('form.firstNameLat')"
126
131
  :rules="$rules.required.concat($rules.latin)"
127
132
  :hint="$dataStore.t('labels.checkWithDoc')"
128
133
  />
129
134
  <base-form-input
130
135
  v-model="member.birthDate"
131
- :readonly="isDisabled || isFromGBD || !!member.parsedDocument?.birthDate"
132
- :clearable="!isDisabled"
136
+ :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.birthDate"
137
+ :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.birthDate"
133
138
  :label="$dataStore.t('form.birthDate')"
134
139
  :rules="birthDateRule"
135
140
  :maska="$maska.date"
@@ -161,8 +166,8 @@
161
166
  <base-panel-input
162
167
  v-model="member.gender"
163
168
  :value="member.gender?.nameRu"
164
- :readonly="isDisabled || isFromGBD"
165
- :clearable="!isDisabled && !isFromGBD"
169
+ :readonly="isDisabled || isDataFromGov"
170
+ :clearable="!isDisabled && !isDataFromGov"
166
171
  :label="$dataStore.t('form.gender')"
167
172
  :rules="$rules.objectRequired"
168
173
  append-inner-icon="mdi mdi-chevron-right"
@@ -347,7 +352,7 @@
347
352
  />
348
353
  <base-form-input v-model.trim="member.jobPlace" :label="$dataStore.t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
349
354
  </base-form-section>
350
- <base-form-section :title="$dataStore.t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
355
+ <base-form-section :title="$dataStore.t('form.placeRegistration')">
351
356
  <base-form-toggle v-if="hasSameAddressToggle" v-model="sameAddress" :disabled="isDisabled" :has-border="false" :title="$dataStore.t('form.sameAddress')" />
352
357
  <base-panel-input
353
358
  v-model="member.registrationCountry"
@@ -415,7 +420,7 @@
415
420
  />
416
421
  <base-form-input
417
422
  v-model.trim="member.registrationNumberHouse"
418
- :rules="$rules.required"
423
+ :rules="[...$rules.required, $rules.lengthLimit(member.registrationNumberHouse, 10)]"
419
424
  :readonly="isDisabled"
420
425
  :clearable="!isDisabled"
421
426
  :label="$dataStore.t('form.NumberHouse')"
@@ -447,7 +452,7 @@
447
452
  @append="openPanel($dataStore.t('form.Region'), [], 'birthRegion', $dataStore.getRegions)"
448
453
  /> -->
449
454
  </base-form-section>
450
- <base-form-section :title="$dataStore.t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
455
+ <base-form-section :title="$dataStore.t('form.documentData')">
451
456
  <base-panel-input
452
457
  v-if="gbdDocuments && gbdDocuments.length"
453
458
  value="Список документов из ГБДФЛ"
@@ -461,8 +466,8 @@
461
466
  v-model="member.documentType"
462
467
  :value="member.documentType?.nameRu"
463
468
  :label="$dataStore.t('form.documentType')"
464
- :readonly="isDisabled"
465
- :clearable="!isDisabled"
469
+ :readonly="isDisabled || isDataFromGov"
470
+ :clearable="!isDisabled && !isDataFromGov"
466
471
  :rules="$rules.objectRequired"
467
472
  append-inner-icon="mdi mdi-chevron-right"
468
473
  @append="openPanel($dataStore.t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
@@ -470,8 +475,8 @@
470
475
  <base-form-input
471
476
  v-model.trim="member.documentNumber"
472
477
  :label="$dataStore.t('form.documentNumber')"
473
- :readonly="isDisabled || !!member.parsedDocument?.documentNumber"
474
- :clearable="!isDisabled"
478
+ :readonly="isDisabled || !!member.parsedDocument?.documentNumber || isDataFromGov"
479
+ :clearable="!isDisabled && !member.parsedDocument?.documentNumber && !isDataFromGov"
475
480
  :rules="$rules.required"
476
481
  />
477
482
  <!-- <base-file-input v-if="!memberDocument" :disabled="isDisabled" :clearable="!isDisabled" @input="attachFile($event)" />
@@ -483,17 +488,42 @@
483
488
  v-model="member.documentIssuers"
484
489
  :value="member.documentIssuers?.nameRu"
485
490
  :label="$dataStore.t('form.documentIssuers')"
486
- :readonly="isDisabled || !!member.parsedDocument?.documentIssuer"
487
- :clearable="!isDisabled"
491
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssuer || isDataFromGov"
492
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssuer && !isDataFromGov"
488
493
  :rules="$rules.objectRequired"
489
494
  append-inner-icon="mdi mdi-chevron-right"
490
495
  @append="openPanel($dataStore.t('form.documentIssuers'), [], 'documentIssuers', $dataStore.getDocumentIssuers)"
491
496
  />
497
+ <base-animation>
498
+ <div v-if="hasIssuerOther" class="flex flex-col gap-[1px]">
499
+ <base-form-input
500
+ v-model="member.documentIssuers.issuerOtherName"
501
+ :label="$dataStore.t('form.issuerOtherName')"
502
+ :readonly="isDisabled"
503
+ :clearable="!isDisabled"
504
+ :rules="$rules.required.concat($rules.onlySymbols)"
505
+ />
506
+ <base-form-input
507
+ v-model="member.documentIssuers.issuerOtherNameOrig"
508
+ :label="$dataStore.t('form.issuerOtherNameOrig')"
509
+ :readonly="isDisabled"
510
+ :clearable="!isDisabled"
511
+ :rules="$rules.required"
512
+ />
513
+ <base-form-input
514
+ v-model="member.documentIssuers.issuerOtherNameRu"
515
+ :label="$dataStore.t('form.issuerOtherNameRu')"
516
+ :readonly="isDisabled"
517
+ :clearable="!isDisabled"
518
+ :rules="$rules.required.concat($rules.cyrillic)"
519
+ />
520
+ </div>
521
+ </base-animation>
492
522
  <base-form-input
493
523
  v-model="member.documentDate"
494
524
  :label="$dataStore.t('form.documentDate')"
495
- :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate"
496
- :clearable="!isDisabled"
525
+ :readonly="isDisabled || !!member.parsedDocument?.documentIssueDate || isDataFromGov"
526
+ :clearable="!isDisabled && !member.parsedDocument?.documentIssueDate && !isDataFromGov"
497
527
  :rules="$rules.required.concat($rules.date)"
498
528
  :maska="$maska.date"
499
529
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -503,8 +533,8 @@
503
533
  v-if="member.documentType.ids !== 'SBI'"
504
534
  v-model="member.documentExpire"
505
535
  :label="$dataStore.t('form.documentExpire')"
506
- :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate"
507
- :clearable="!isDisabled"
536
+ :readonly="isDisabled || !!member.parsedDocument?.documentExpireDate || isDataFromGov"
537
+ :clearable="!isDisabled && !member.parsedDocument?.documentExpireDate && !isDataFromGov"
508
538
  :rules="$rules.required.concat($rules.date)"
509
539
  :maska="$maska.date"
510
540
  append-inner-icon="mdi mdi-calendar-blank-outline"
@@ -623,24 +653,27 @@
623
653
  :disabled="isDisabled"
624
654
  :clearable="!isDisabled"
625
655
  icon="mdi-paperclip"
626
- @input="attachFile($event, '1')"
656
+ @input="attachAdditionalFile($event, '1')"
627
657
  :rules="$rules.required"
658
+ @onClear="clearAdditionalFile('1')"
628
659
  />
629
660
  <base-file-input
630
661
  :label="$dataStore.t('form.bankStatement')"
631
662
  :disabled="isDisabled"
632
663
  :clearable="!isDisabled"
633
664
  icon="mdi-paperclip"
634
- @input="attachFile($event, '10')"
665
+ @input="attachAdditionalFile($event, '10')"
635
666
  :rules="$rules.required"
667
+ @onClear="clearAdditionalFile('10')"
636
668
  />
637
669
  <base-file-input
638
670
  :label="$dataStore.t('pension.ENPFnote')"
639
671
  :disabled="isDisabled"
640
672
  :clearable="!isDisabled"
641
673
  icon="mdi-paperclip"
642
- @input="attachFile($event, '8')"
674
+ @input="attachAdditionalFile($event, '8')"
643
675
  :rules="$rules.required"
676
+ @onClear="clearAdditionalFile('8')"
644
677
  />
645
678
  </base-form-section>
646
679
  <base-form-section :title="$dataStore.t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
@@ -678,6 +711,7 @@
678
711
  <base-btn v-if="hasGBDFL" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGBDFL')" @click="getContragentFromGBDFL" />
679
712
  <base-btn v-if="hasInsis" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromInsis')" @click="getContragent" />
680
713
  <base-btn v-if="hasGKB" :loading="isButtonLoading" :text="$dataStore.t('buttons.fromGKB')" @click="getFamilyInfo" />
714
+ <base-btn v-if="isNonResident" :loading="isButtonLoading" :text="$dataStore.t('buttons.searchByFio')" @click="getContragent" />
681
715
  <base-form-section v-if="hasDocumentReader" class="!mt-0">
682
716
  <base-file-input
683
717
  :disabled="isDisabled"
@@ -702,18 +736,16 @@
702
736
  </Teleport>
703
737
  <Teleport v-if="isOtpPanelOpen && !member.hasAgreement" to="#right-panel-actions">
704
738
  <div :class="[$styles.flexColNav]">
705
- <base-fade-transition>
706
- <base-rounded-input
707
- v-if="otpCondition && member.otpTokenId"
708
- v-model="member.otpCode"
709
- :label="$dataStore.t('form.otpCode')"
710
- :maska="$maska.otp"
711
- :append-inner-icon="hasOtp ? 'mdi-cellphone-message text-[17px]' : ''"
712
- hide-details
713
- @keyup.enter.prevent="hasOtp ? checkOtp() : null"
714
- @input="onOtpCodeInput"
715
- />
716
- </base-fade-transition>
739
+ <base-animation>
740
+ <div v-if="otpCondition && member.otpTokenId" class="flex flex-col">
741
+ <base-form-section class="mt-0 py-2">
742
+ <base-otp-input v-model="member.otpCode" :length="4" @keyup.enter.prevent="hasOtp && checkOtp()" @input="onOtpCodeInput" />
743
+ </base-form-section>
744
+ <span class="text-center cursor-pointer mt-2" :class="[$styles.mutedText]" @click="sendOtp(false)"
745
+ >Не получили код? <span class="underline underline-offset-2">Отправить код заново</span></span
746
+ >
747
+ </div>
748
+ </base-animation>
717
749
  <base-btn v-if="!member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.sendOtp')" @click="sendOtp(false)" />
718
750
  <base-btn v-if="member.otpTokenId" :disabled="otpSending" :loading="otpSending" :text="$dataStore.t('buttons.check')" @click="checkOtp()" />
719
751
  </div>
@@ -721,12 +753,12 @@
721
753
  <Teleport v-if="isPositionPanelOpen" to="#right-panel-actions">
722
754
  <div :class="[$styles.scrollPage]" class="flex flex-col items-center">
723
755
  <base-rounded-input
724
- v-model="searchQuery"
725
- :label="$dataStore.t('labels.search')"
756
+ v-model.trim="searchQuery"
757
+ label="Выполните поиск должностей"
726
758
  class="w-full p-2"
727
759
  :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'"
760
+ :rules="[searchQuery.length < 4 ? $dataStore.t('rules.searchQueryLen', { len: 4 }) : true]"
761
+ append-inner-icon="mdi mdi-magnify"
730
762
  @append="searchPositions"
731
763
  />
732
764
  <base-animation>
@@ -783,6 +815,27 @@
783
815
  <base-list-empty class="w-full" v-else @click="documentChooseDialog = false" />
784
816
  </template>
785
817
  </base-dialog>
818
+ <base-dialog
819
+ v-model="fioChooseDialog"
820
+ :title="$dataStore.t('pension.contragentSelect')"
821
+ :icon="{ mdi: 'format-list-bulleted-type', color: '#A0B3D8' }"
822
+ actions="fioChooseDialog"
823
+ :persistent="false"
824
+ >
825
+ <template #actions>
826
+ <v-list lines="two" v-if="contragents && contragents.length" class="w-full !py-0">
827
+ <v-list-item v-for="person of contragents" :key="person.id" @click="getContragentClick(person)">
828
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">
829
+ {{ person.longName }}
830
+ </v-list-item-title>
831
+ <v-list-item-subtitle :class="[$styles.textSimple]">
832
+ {{ reformatDate(person.birthDate) }} - {{ person.genderName }} - Рег: {{ reformatDate(person.registrationDate) }}
833
+ </v-list-item-subtitle>
834
+ </v-list-item>
835
+ </v-list>
836
+ <base-list-empty class="w-full" v-else @click="fioChooseDialog = false" />
837
+ </template>
838
+ </base-dialog>
786
839
  </section>
787
840
  <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')" />
788
841
  </template>
@@ -790,7 +843,8 @@
790
843
  <script lang="ts">
791
844
  import { Value, DocumentItem, Member } from '../../composables/classes';
792
845
  import { uuid } from 'vue-uuid';
793
- import { StoreMembers, Enums } from '../../types/enum';
846
+ import { StoreMembers, CoreEnums } from '../../types/enum';
847
+ import type { Api, ContragentType, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
794
848
 
795
849
  export default {
796
850
  setup() {
@@ -817,9 +871,12 @@ export default {
817
871
  const isPositionPanelOpen = ref<boolean>(false);
818
872
  const isPanelLoading = ref<boolean>(false);
819
873
  const isChangingMember = ref<boolean>(false);
874
+ const isNonResident = computed(() => !useEnv().isProduction && dataStore.isPension && member.value.signOfResidency.ids === '500011.2');
875
+ const isDataFromGov = computed(() => member.value.verifyType === 'GBDFL' || member.value.verifyType === 'ESBD' || !!member.value.gosPersonData);
820
876
  const familyDialog = ref<boolean>(false);
821
877
  const deletionDialog = ref<boolean>(false);
822
878
  const documentChooseDialog = ref<boolean>(false);
879
+ const fioChooseDialog = ref<boolean>(false);
823
880
  const selectedIndex = ref<number>(0);
824
881
  const sameAddress = ref<boolean>(false);
825
882
  const panelValue = ref<Value>(new Value());
@@ -830,6 +887,9 @@ export default {
830
887
  const fileData = ref<{ file: any }>();
831
888
  const imageDataList = ref<string[]>([]);
832
889
  const isRelative = ref<boolean>(false);
890
+ const additionalDocuments = ref<any[]>([]);
891
+ const requiredDocuments = ref<string[]>(['10']);
892
+ const contragents = ref<ContragentType[]>([]);
833
893
 
834
894
  const currentPanelDeep = ref<string>();
835
895
  const currentPanelSubDeep = ref<string>();
@@ -839,7 +899,6 @@ export default {
839
899
  const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value));
840
900
  const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
841
901
  const isIinPhoneDisabled = computed(() => member.value.hasAgreement);
842
- const isFromGBD = computed(() => !!member.value.gosPersonData);
843
902
  const gbdDocuments = computed(() => {
844
903
  if (hasGBDFLDocSelection && !!member.value.gosPersonData && !!member.value.gosPersonData.documents) {
845
904
  const documents = Array.isArray(member.value.gosPersonData.documents.document)
@@ -901,7 +960,7 @@ export default {
901
960
  };
902
961
  return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
903
962
  });
904
- const hasGBDFLDocSelection = dataStore.isLifetrip && whichForm.value === formStore.policyholderFormKey;
963
+ const hasGBDFLDocSelection = dataStore.isLifetrip;
905
964
  const hasInsis = computed(() => dataStore.controls.hasInsis);
906
965
  const hasGKB = computed(() => {
907
966
  const perMemberCondition = () => {
@@ -972,7 +1031,8 @@ export default {
972
1031
  (whichForm.value === formStore.beneficiaryFormKey && member.value.iin !== formStore.policyholderForm.iin) ||
973
1032
  (dataStore.isLifetrip && whichForm.value === formStore.insuredFormKey && member.value.isInsuredUnderage),
974
1033
  );
975
- const hasWorkPositionDict = !useEnv().isProduction && dataStore.isBaiterek && dataStore.isEfoParent;
1034
+ const hasWorkPositionDict = dataStore.isBaiterek;
1035
+ const hasIssuerOther = computed(() => !useEnv().isProduction && member.value.documentIssuers && member.value.documentIssuers.nameRu === 'Другое');
976
1036
 
977
1037
  const birthDateRule = computed(() => {
978
1038
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
@@ -1051,7 +1111,6 @@ export default {
1051
1111
  case formStore.policyholderFormKey:
1052
1112
  return route.params.taskId === '0';
1053
1113
  case formStore.insuredFormKey:
1054
- if (dataStore.isPension) return route.params.taskId === '0';
1055
1114
  return route.query.id === '0';
1056
1115
  case formStore.policyholdersRepresentativeFormKey:
1057
1116
  case formStore.beneficiaryFormKey:
@@ -1084,6 +1143,10 @@ export default {
1084
1143
  };
1085
1144
 
1086
1145
  const searchPositions = async () => {
1146
+ if (searchQuery.value.length < 4) {
1147
+ dataStore.showToaster('error', dataStore.t('rules.searchQueryLen', { len: 4 }));
1148
+ return;
1149
+ }
1087
1150
  if (!isDisabled.value) {
1088
1151
  isPanelLoading.value = true;
1089
1152
  positionsList.value = await dataStore.getWorkPosition(searchQuery.value);
@@ -1122,6 +1185,7 @@ export default {
1122
1185
  isPositionPanelOpen.value = false;
1123
1186
  }
1124
1187
  if (type === 'workPosition') {
1188
+ dataStore.rightPanel.title = dataStore.t('form.jobPosition');
1125
1189
  isPositionPanelOpen.value = true;
1126
1190
  isOtpPanelOpen.value = false;
1127
1191
  isDocumentOpen.value = false;
@@ -1251,12 +1315,49 @@ export default {
1251
1315
  }
1252
1316
  };
1253
1317
 
1254
- const attachFile = (event: InputEvent, code?: string) => {
1318
+ const uploadAdditionalFiles = async (processInstanceId: string | number) => {
1319
+ const formData = new FormData();
1320
+ const information: any = [];
1321
+ const uuidV4 = uuid.v4();
1322
+ if (additionalDocuments.value) {
1323
+ Object.values(additionalDocuments.value).map((value: any) => {
1324
+ formData.append('file', value);
1325
+ const ext = value.name.substring(value.name.lastIndexOf('.'));
1326
+ const selectedDocument = dataStore.dicFileTypeList.find((i: Value) => i.code === value.code);
1327
+ information.push({
1328
+ identifier: `${uuidV4}${ext}`,
1329
+ iin: member.value.iin ? member.value.iin.replaceAll('-', '') : null,
1330
+ processInstanceId: processInstanceId,
1331
+ fileTypeCode: selectedDocument ? selectedDocument.code : null,
1332
+ fileTypeId: selectedDocument ? selectedDocument.id : null,
1333
+ fileName: value.name,
1334
+ });
1335
+ });
1336
+ formData.append('fileData', JSON.stringify(information));
1337
+ await dataStore.uploadFiles(formData, false);
1338
+ }
1339
+ };
1340
+
1341
+ const attachFile = (event: InputEvent) => {
1255
1342
  if (event.target) {
1256
- fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
1343
+ fileData.value = { file: (event.target as HTMLInputElement).files };
1257
1344
  } else {
1258
1345
  if (event.dataTransfer) {
1259
- fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
1346
+ fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1347
+ }
1348
+ }
1349
+ };
1350
+
1351
+ const attachAdditionalFile = (event: InputEvent, code: string) => {
1352
+ if (event.target) {
1353
+ const files = (event.target as HTMLInputElement).files;
1354
+ if (files && files.length && files[0]) {
1355
+ if (files[0].type !== 'application/pdf') {
1356
+ return dataStore.showToaster('error', dataStore.t('toaster.onlyPDF'), 6000);
1357
+ }
1358
+ const file = Object.assign(files[0]);
1359
+ file.code = code;
1360
+ additionalDocuments.value.push(file);
1260
1361
  }
1261
1362
  }
1262
1363
  };
@@ -1325,7 +1426,7 @@ export default {
1325
1426
  if (parsedDocument.middleName) member.value.middleName = parsedDocument.middleName;
1326
1427
  if (parsedDocument.fullName) member.value.longName = parsedDocument.fullName;
1327
1428
  if (parsedDocument.documentName && parsedDocument.documentName.startsWith('Kazakhstan - Id Card')) {
1328
- const documentType = dataStore.documentTypes.find((i: Value) => i.ids === Enums.Insis.DocTypes['1UDL']);
1429
+ const documentType = dataStore.documentTypes.find((i: Value) => i.ids === CoreEnums.Insis.DocTypes['1UDL']);
1329
1430
  if (documentType) member.value.documentType = documentType;
1330
1431
  }
1331
1432
  if (!!parsedDocument.documentIssuer) {
@@ -1429,7 +1530,9 @@ export default {
1429
1530
 
1430
1531
  const selectGbdDocument = (document: Api.GBD.Document) => {
1431
1532
  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)]);
1533
+ const documentType = dataStore.documentTypes.find(
1534
+ (i: Value) => i.ids === Object.keys(CoreEnums.GBD.DocTypes)[Object.values(CoreEnums.GBD.DocTypes).indexOf(document.type.code)],
1535
+ );
1433
1536
  if (documentType) member.value.documentType = documentType;
1434
1537
  const documentNumber = document.number;
1435
1538
  if (documentNumber) member.value.documentNumber = documentNumber;
@@ -1446,21 +1549,45 @@ export default {
1446
1549
  isSearchOpen.value = false;
1447
1550
  };
1448
1551
 
1552
+ const getContragentClick = async (contragent: ContragentType) => {
1553
+ await dataStore.serializeContragentData(member.value, contragent);
1554
+ fioChooseDialog.value = false;
1555
+ isButtonLoading.value = false;
1556
+ dataStore.rightPanel.open = false;
1557
+ isSearchOpen.value = false;
1558
+ };
1559
+
1449
1560
  const getContragent = async () => {
1450
- if (member.value.hasAgreement !== true) {
1451
- dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
1452
- dataStore.rightPanel.open = false;
1453
- isSearchOpen.value = false;
1454
- return;
1455
- }
1456
- if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
1457
- dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
1458
- dataStore.rightPanel.open = false;
1459
- isSearchOpen.value = false;
1460
- return;
1561
+ if (isNonResident.value) {
1562
+ if (!member.value.lastName || !member.value.firstName) {
1563
+ dataStore.showToaster('error', 'Заполните поля Имя и Фамилия', 3000);
1564
+ dataStore.rightPanel.open = false;
1565
+ isSearchOpen.value = false;
1566
+ return;
1567
+ }
1568
+ } else {
1569
+ if (member.value.hasAgreement !== true) {
1570
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
1571
+ dataStore.rightPanel.open = false;
1572
+ isSearchOpen.value = false;
1573
+ return;
1574
+ }
1575
+ if (!member.value.iin || member.value.iin.length !== useMask().iin.length) {
1576
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField', { text: 'ИИН' }), 5000);
1577
+ dataStore.rightPanel.open = false;
1578
+ isSearchOpen.value = false;
1579
+ return;
1580
+ }
1461
1581
  }
1462
1582
  isButtonLoading.value = true;
1463
- await dataStore.getContragent(member.value, false);
1583
+ if (isNonResident.value) {
1584
+ const response = await dataStore.getContragent(member.value, false);
1585
+ if (response) contragents.value = response.items;
1586
+ else dataStore.showToaster('error', 'Не найдено совпадений', 3000);
1587
+ fioChooseDialog.value = true;
1588
+ } else {
1589
+ await dataStore.getContragent(member.value, false);
1590
+ }
1464
1591
  isButtonLoading.value = false;
1465
1592
  dataStore.rightPanel.open = false;
1466
1593
  isSearchOpen.value = false;
@@ -1523,6 +1650,26 @@ export default {
1523
1650
  if (fileData.value && fileData.value.file) {
1524
1651
  await uploadFile(formStore.applicationData.processInstanceId);
1525
1652
  }
1653
+ if (additionalDocuments.value && additionalDocuments.value.length) {
1654
+ if (
1655
+ (!formStore.applicationData.isEnpfSum && formStore.applicationData?.pensionApp.transferContracts && formStore.applicationData?.pensionApp.transferContracts.length) ||
1656
+ (formStore.applicationData?.pensionApp.compulsoryProfMonthCount && formStore.applicationData?.pensionApp.compulsoryProfMonthCount >= 60)
1657
+ )
1658
+ requiredDocuments.value.push('8');
1659
+ if (isNonResident.value) requiredDocuments.value.push('1');
1660
+ if (requiredDocuments.value && requiredDocuments.value.length != 0) {
1661
+ const hasAllDocs = requiredDocuments.value.every(fileCode => {
1662
+ const result = additionalDocuments.value.map(i => i.code).indexOf(fileCode) !== -1;
1663
+ if (!result) {
1664
+ const missingFile = dataStore.dicFileTypeList.find((i: Value) => i.code === fileCode);
1665
+ dataStore.showToaster('error', `Необходимо вложить ${missingFile?.nameRu}`, 8000);
1666
+ }
1667
+ return result;
1668
+ });
1669
+ if (!hasAllDocs) return;
1670
+ }
1671
+ await uploadAdditionalFiles(formStore.applicationData.processInstanceId);
1672
+ }
1526
1673
  }
1527
1674
  const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value, whichIndex.value ? Number(whichIndex.value) : undefined);
1528
1675
  if (typeof member.value.id !== 'number' || (typeof member.value.id === 'number' && member.value.id > 0 === false)) {
@@ -1556,12 +1703,6 @@ export default {
1556
1703
  bankBin: member.value.bankInfo.bankName.ids,
1557
1704
  bankId: member.value.bankInfo.bankName.id,
1558
1705
  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
1706
  };
1566
1707
  const data = {
1567
1708
  ...formStore.applicationData.pensionApp,
@@ -1569,7 +1710,9 @@ export default {
1569
1710
  };
1570
1711
  const isApplicationSaved = await dataStore.setApplication(data);
1571
1712
  if (isApplicationSaved === false) return;
1572
- dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1713
+ if (formStore.applicationData.pensionApp.amount && formStore.applicationData.pensionApp.amount !== 0)
1714
+ dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1715
+ await dataStore.saveMember(member.value, 'Client', memberFromApplicaiton);
1573
1716
  }
1574
1717
  }
1575
1718
  await router.replace({
@@ -1608,6 +1751,7 @@ export default {
1608
1751
  }
1609
1752
  }
1610
1753
  if (member.value.hasAgreement !== true) {
1754
+ if (isNonResident.value) return true;
1611
1755
  dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
1612
1756
  return false;
1613
1757
  }
@@ -1622,8 +1766,12 @@ export default {
1622
1766
  isSubmittingForm.value = true;
1623
1767
  const docType = member.value.documentType.ids;
1624
1768
  if (
1769
+ !isNonResident.value &&
1625
1770
  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)
1771
+ (docType === CoreEnums.Insis.DocTypes['1UDL'] ||
1772
+ docType === CoreEnums.Insis.DocTypes.SBI ||
1773
+ docType === CoreEnums.Insis.DocTypes.PS ||
1774
+ docType === CoreEnums.Insis.DocTypes.VNZ)
1627
1775
  ) {
1628
1776
  dataStore.isLoading = true;
1629
1777
  const docTypeCodes = {
@@ -1665,6 +1813,23 @@ export default {
1665
1813
  dataStore.isLoading = false;
1666
1814
  dataStore.showToaster('error', errorMessage, 5000);
1667
1815
  }
1816
+ } else if (isNonResident.value) {
1817
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
1818
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1819
+ if (isValidIik === false) {
1820
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1821
+ member.value.bankInfo.iik = '';
1822
+ isSubmittingForm.value = false;
1823
+ return;
1824
+ }
1825
+ if (formStore.applicationData.pensionApp) {
1826
+ formStore.applicationData.pensionApp.account = member.value.bankInfo.iik;
1827
+ formStore.applicationData.pensionApp.bankBik = member.value.bankInfo.bik;
1828
+ formStore.applicationData.pensionApp.bankBin = member.value.bankInfo.bin;
1829
+ formStore.applicationData.pensionApp.bankId = member.value.bankInfo.bankName.id;
1830
+ }
1831
+ }
1832
+ const hasMemberSaved = await saveMember();
1668
1833
  } else {
1669
1834
  member.value.gotFromInsis = true;
1670
1835
  const hasMemberSaved = await saveMember();
@@ -1807,6 +1972,13 @@ export default {
1807
1972
  deletionDialog.value = false;
1808
1973
  };
1809
1974
 
1975
+ const clearAdditionalFile = (code: string) => {
1976
+ const index = additionalDocuments.value.indexOf(additionalDocuments.value.find((i: any) => i.code == code));
1977
+ if (index > -1) {
1978
+ additionalDocuments.value.splice(index, 1);
1979
+ }
1980
+ };
1981
+
1810
1982
  const onInit = async () => {
1811
1983
  // if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
1812
1984
  // await dataStore.getSignedDocList(formStore.applicationData.processInstanceId);
@@ -1823,9 +1995,9 @@ export default {
1823
1995
  if (dataStore.isLifetrip) {
1824
1996
  const documentByPriority = (() => {
1825
1997
  if (whichForm.value !== formStore.policyholderFormKey || formStore.isPolicyholderInsured === true) {
1826
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes.PS);
1998
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes.PS);
1827
1999
  }
1828
- return member.value.documentsList.find(i => i.type === Enums.Insis.DocTypes['1UDL']);
2000
+ return member.value.documentsList.find(i => i.type === CoreEnums.Insis.DocTypes['1UDL']);
1829
2001
  })();
1830
2002
  const userDocument = documentByPriority ? documentByPriority : member.value.documentsList[0];
1831
2003
  const documentType = dataStore.documentTypes.find((i: Value) => i.ids === userDocument.type);
@@ -1932,13 +2104,14 @@ export default {
1932
2104
  watch(
1933
2105
  () => member.value.age,
1934
2106
  val => {
1935
- if (val && Number(val) >= 18) {
1936
- if (member.value.hasAgreement !== true) {
2107
+ if (val) {
2108
+ if (Number(val) >= 18 && member.value.hasAgreement !== true) {
1937
2109
  member.value.hasAgreement = false;
2110
+ } else {
2111
+ member.value.hasAgreement = true;
1938
2112
  }
1939
- } else {
1940
- member.value.hasAgreement = true;
1941
2113
  }
2114
+
1942
2115
  member.value.isInsuredUnderage = Number(val) >= 18 ? false : true;
1943
2116
  },
1944
2117
  { immediate: true },
@@ -1999,11 +2172,13 @@ export default {
1999
2172
  familyDialog,
2000
2173
  deletionDialog,
2001
2174
  documentChooseDialog,
2175
+ fioChooseDialog,
2002
2176
  selectedIndex,
2003
2177
  selectedFamilyMember,
2004
2178
  sameAddress,
2005
2179
  isRelative,
2006
2180
  imageDataList,
2181
+ contragents,
2007
2182
  // Computed
2008
2183
  whichForm,
2009
2184
  whichIndex,
@@ -2013,7 +2188,6 @@ export default {
2013
2188
  isDisabled,
2014
2189
  isTask,
2015
2190
  isIinPhoneDisabled,
2016
- isFromGBD,
2017
2191
  showSaveButton,
2018
2192
  hasGBDFL,
2019
2193
  hasInsis,
@@ -2025,10 +2199,13 @@ export default {
2025
2199
  hasInsurancePay,
2026
2200
  hasSignOfIPDL,
2027
2201
  hasSameAddressToggle,
2202
+ hasIssuerOther,
2028
2203
  hasMemberSearch,
2029
2204
  hasWorkPositionDict,
2030
2205
  gbdDocuments,
2031
2206
  hasGBDFLDocSelection,
2207
+ isNonResident,
2208
+ isDataFromGov,
2032
2209
 
2033
2210
  // Rules
2034
2211
  ageRule,
@@ -2048,6 +2225,7 @@ export default {
2048
2225
  getContragentFromGBDFL,
2049
2226
  getContragent,
2050
2227
  attachFile,
2228
+ attachAdditionalFile,
2051
2229
  attachDocumentReader,
2052
2230
  getDocumentReader,
2053
2231
  getFile,
@@ -2062,6 +2240,8 @@ export default {
2062
2240
  searchPositions,
2063
2241
  selectGbdDocument,
2064
2242
  pickPosition,
2243
+ clearAdditionalFile,
2244
+ getContragentClick,
2065
2245
  };
2066
2246
  },
2067
2247
  };