hl-core 0.0.10-beta.67 → 0.0.10-beta.69

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.
package/api/base.api.ts CHANGED
@@ -1236,6 +1236,13 @@ export class ApiClass {
1236
1236
  data: data,
1237
1237
  });
1238
1238
  },
1239
+ getOnlineChildAccess: async (data: { iinBin: string; documentType?: string, methodName?: string, childId?: string }) => {
1240
+ return await this.axiosCall<{ code: string; message: string, children: any[] }>({
1241
+ method: Methods.POST,
1242
+ url: `${this.externalServices.base}/api/ExternalServices/GetOnlineChildAccess`,
1243
+ data: data,
1244
+ });
1245
+ },
1239
1246
  getDigitalDocuments: async (data: { iin: string; code: string; processInstanceId?: string }) => {
1240
1247
  return await this.axiosCall<{ parsingResponseContent: string; digitalDocuments: any }>({
1241
1248
  method: Methods.POST,
@@ -25,7 +25,6 @@
25
25
  v-model="documentType"
26
26
  class="document-type-select"
27
27
  :items="documentItems"
28
- :readonly="$dataStore.isLifetrip"
29
28
  :label="$dataStore.t('form.documentType')"
30
29
  hide-details
31
30
  />
@@ -34,21 +33,18 @@
34
33
  v-model="otpCode"
35
34
  @keyup.enter.prevent="otpCode.length === otpLength && emitGetCode()"
36
35
  />
37
- <base-animation>
38
- <span
39
- v-if="!loading"
40
- class="text-center cursor-pointer"
41
- :class="[$styles.mutedText]"
42
- @click="emitGetCode"
43
- >
44
- Не получили код?
45
- <span class="underline underline-offset-2">Отправить код заново</span>
36
+ <span
37
+ v-if="!loading && otpSendDisabled"
38
+ class="text-center"
39
+ :class="[$styles.mutedText]"
40
+ >
41
+ Введите код цифрового документа из <span class="underline underline-offset-2">eGov Mobile</span> или <span class="underline underline-offset-2">банковского приложения</span>.
46
42
  </span>
47
- </base-animation>
48
43
  </div>
49
44
  </div>
50
45
  <div class="w-full d-flex gap-4">
51
46
  <base-btn
47
+ v-if="!otpSendDisabled"
52
48
  :disabled="loading"
53
49
  :loading="loading"
54
50
  :btn="$styles.whiteBorderBtn"
@@ -80,6 +76,10 @@ const props = defineProps({
80
76
  otpLength: {
81
77
  type: Number,
82
78
  default: 6,
79
+ },
80
+ otpSendDisabled: {
81
+ type: Boolean,
82
+ default: false,
83
83
  }
84
84
  });
85
85
  const emit = defineEmits(['getCode', 'getDigitalDocument', 'updateDigitalDocuments']);
@@ -105,16 +105,6 @@ const emitGetDocument = () => {
105
105
 
106
106
  emit('getDigitalDocument', otpCode.value);
107
107
  }
108
-
109
- const setDefaultValues = () => {
110
- if(dataStore.isLifetrip) {
111
- documentType.value = 'Passport';
112
- }
113
- }
114
-
115
- onMounted(() => {
116
- setDefaultValues()
117
- })
118
108
  </script>
119
109
 
120
110
  <style scoped>
@@ -62,11 +62,12 @@
62
62
  <script lang="ts" setup>
63
63
  import { changeBridge } from '#imports';
64
64
 
65
- import pkg from '../../package.json';
65
+ import packageJson from '../../package.json';
66
66
  const dialogSignOut = ref(false);
67
67
  const dataStore = useDataStore();
68
68
  const router = useRouter();
69
69
  const commitVersion = String(import.meta.env.VITE_COMMIT_VERSION ?? '');
70
+ const pkg = packageJson as { version: string };
70
71
 
71
72
  const handleFontSize = (action: 'increase' | 'decrease') => {
72
73
  if (action === 'increase' && dataStore.fontSize < 24) dataStore.fontSize += 2;
@@ -58,6 +58,17 @@
58
58
  append-inner-icon="mdi mdi-chevron-right"
59
59
  @append="openPanel($dataStore.t('form.signOfResidency'), [], 'signOfResidency', $dataStore.getResidents)"
60
60
  />
61
+ <base-panel-input
62
+ v-if="hasGKB"
63
+ v-model="member.relationDegree"
64
+ :value="member.relationDegree?.nameRu"
65
+ :readonly="isDisabled"
66
+ :clearable="!isDisabled"
67
+ :label="$dataStore.t('form.relations')"
68
+ :rules="$rules.objectRequired"
69
+ append-inner-icon="mdi mdi-chevron-right"
70
+ @append="openPanel($dataStore.t('form.relations'), filteredRelationsData, 'relationDegree')"
71
+ />
61
72
  <base-form-toggle
62
73
  v-if="$dataStore.isLifetrip && whichForm === 'insuredForm'"
63
74
  v-model="member.isInsuredUnderage"
@@ -65,14 +76,14 @@
65
76
  :has-border="false"
66
77
  />
67
78
  <base-panel-input
68
- v-if="whichForm === formStore.beneficiaryFormKey && $dataStore.isGons"
79
+ v-if="whichForm === formStore.beneficiaryFormKey && ($dataStore.isGons || $dataStore.isBolashak)"
69
80
  v-model="member.chooseChild"
70
81
  :value="member.chooseChild"
71
82
  :label="$dataStore.t('form.chooseChild')"
72
83
  :readonly="isDisabled"
73
84
  :clearable="!isDisabled"
74
85
  append-inner-icon="mdi mdi-chevron-right"
75
- @append="searchMember($dataStore.t('form.chooseChild'))"
86
+ @append="getFamilyInfo"
76
87
  />
77
88
  <base-form-input
78
89
  :key="String(member.signOfResidency.nameRu)"
@@ -119,8 +130,8 @@
119
130
  <base-form-input
120
131
  v-if="hasMiddleName"
121
132
  v-model.trim="member.middleName"
122
- :readonly="isDisabled || isDataFromGov || !!member.parsedDocument?.middleName"
123
- :clearable="!isDisabled && !isDataFromGov && !member.parsedDocument?.middleName"
133
+ :readonly="isDisabled || !!member.parsedDocument?.middleName || (isDataFromGov && !middleNameIsEditable)"
134
+ :clearable="(!isDisabled && !member.parsedDocument?.middleName && !isDataFromGov) || !!middleNameIsEditable"
124
135
  :label="$dataStore.t('form.middleName')"
125
136
  :rules="$rules.cyrillicNonRequired"
126
137
  />
@@ -177,8 +188,8 @@
177
188
  <base-panel-input
178
189
  v-model="member.gender"
179
190
  :value="member.gender?.nameRu"
180
- :readonly="isDisabled || isDataFromGov || !isChooseChild"
181
- :clearable="(!isDisabled && !isDataFromGov) || !!isChooseChild"
191
+ :readonly="isDisabled || isDataFromGov"
192
+ :clearable="!isDisabled && !isDataFromGov"
182
193
  :label="$dataStore.t('form.gender')"
183
194
  :rules="$rules.objectRequired"
184
195
  append-inner-icon="mdi mdi-chevron-right"
@@ -702,7 +713,7 @@
702
713
  <small class="mb-1 d-block leading-tight">Внимание, выберите этот вариант если не приходит смс от 1414</small>
703
714
  <base-btn :loading="isButtonLoading" :text="$dataStore.t('buttons.fromDD')" @click="startGettingDigitalDocument" />
704
715
  </div>
705
- <base-btn v-if="hasGKB" :loading="isButtonLoading" class="before-divider" :text="$dataStore.t('buttons.fromGKB')" @click="getFamilyInfo" />
716
+ <base-btn v-if="hasGKB" :loading="isButtonLoading" class="before-divider" :text="$dataStore.t('buttons.childData')" @click="getFamilyInfo" />
706
717
  <base-btn v-if="isNonResident" :loading="isButtonLoading" class="before-divider" :text="$dataStore.t('buttons.searchByFio')" @click="getContragent" />
707
718
  <base-form-section v-if="hasDocumentReader" class="!mt-0 before-divider">
708
719
  <base-file-input
@@ -788,9 +799,73 @@
788
799
  @yes="deleteMember"
789
800
  @no="deletionDialog = false"
790
801
  />
791
- <base-dialog v-model="familyDialog" :subtitle="$dataStore.t('dialog.familyMember')" :icon="{ mdi: 'hand-pointing-up' }" actions="familyDialog">
802
+ <base-dialog
803
+ v-model="familyDialog"
804
+ :subtitle="isOwnChild ? $dataStore.t('dialog.familyMember') : $dataStore.t('dialog.enterParentIin')"
805
+ :icon="{ mdi: 'hand-pointing-up' }"
806
+ actions="familyDialog"
807
+ >
792
808
  <template #actions>
793
- <base-family-dialog :selected="selectedFamilyMember" @selectFamilyMember="selectFamilyMember" @reset="closeFamilyDialog(true)" @addChild="addChild" />
809
+ <div class="flex flex-col gap-[36px] w-full">
810
+ <base-rounded-input
811
+ v-if="!isOwnChild"
812
+ v-model="parentIin"
813
+ :label="$dataStore.t('labels.parentIin')"
814
+ class="p-2 w-full h-[60px]"
815
+ :hide-details="true"
816
+ :maska="$maska.iin"
817
+ :readonly="childrenLoaded"
818
+ :clearable="false"
819
+ />
820
+ <v-list lines="two" v-if="formStore.children && formStore.children.length" class="w-full !py-0">
821
+ <v-list-item
822
+ v-for="familyMember of formStore.children"
823
+ :key="familyMember.id"
824
+ @click="selectedFamilyMember = familyMember"
825
+ :append-icon="familyMember && selectedFamilyMember && typeof selectedFamilyMember === 'object' && selectedFamilyMember.id === familyMember.id
826
+ ? `mdi-radiobox-marked ${$styles.greenText}`
827
+ : 'mdi-radiobox-blank text-[#636363]'"
828
+ >
829
+ <v-list-item-title :class="[$styles.greenText, $styles.textTitle]">
830
+ {{ `${familyMember.lastName} ${familyMember.firstName} ${familyMember.middleName ? familyMember.middleName : ''}` }}
831
+ </v-list-item-title>
832
+ <v-list-item-subtitle :class="[$styles.textSimple]">
833
+ <span>{{ `${$dataStore.t('form.birthDate')}:` }}</span>
834
+ {{ `${reformatDate(familyMember.birthDate!)}` }}
835
+ </v-list-item-subtitle>
836
+ </v-list-item>
837
+ </v-list>
838
+ <base-list-empty v-if="isEmpty" />
839
+ <div class="flex gap-4">
840
+ <base-btn
841
+ class="px-6"
842
+ size="sm"
843
+ :text="$dataStore.t('confirm.cancel')"
844
+ :btn="$styles.whiteBorderBtn"
845
+ :classes="$styles.blueText"
846
+ @click="closeFamilyDialog"
847
+ />
848
+ <base-btn
849
+ v-if="isOwnChild || (!isOwnChild && childrenLoaded)"
850
+ class="px-6"
851
+ size="sm"
852
+ text="Подтвердить"
853
+ :btn="$styles.blueBtn"
854
+ :loading="$dataStore.isButtonsLoading"
855
+ @click="selectFamilyMember"
856
+ />
857
+ <base-btn
858
+ v-if="!isOwnChild && !childrenLoaded"
859
+ class="px-6"
860
+ size="sm"
861
+ text="Отправить запрос"
862
+ :btn="$styles.blueBtn"
863
+ :loading="$dataStore.isButtonsLoading"
864
+ :disabled="$maska.iin.length !== parentIin.length"
865
+ @click="getChildren"
866
+ />
867
+ </div>
868
+ </div>
794
869
  </template>
795
870
  </base-dialog>
796
871
  <base-dialog v-model="documentChooseDialog" :subtitle="$dataStore.t('labels.chooseDoc')" :icon="{ mdi: 'file-document-outline' }" actions="documentChooseDialog">
@@ -850,6 +925,7 @@
850
925
  <base-digital-documents-dialog
851
926
  :document-items="documentItems"
852
927
  :loading="documentLoading"
928
+ :otp-send-disabled="$dataStore.isLifetrip && digitalDocumentOwnerType === 'child'"
853
929
  @getCode="getCode"
854
930
  @getDigitalDocument="getDigitalDocument"
855
931
  @updateDigitalDocuments="updateDigitalDocuments"
@@ -882,7 +958,7 @@ export default {
882
958
  const getMember = (whichForm: keyof typeof StoreMembers | 'slaveInsuredForm', whichIndex?: string) =>
883
959
  memberStore.getMemberFromStore(whichForm, Number((whichIndex ? whichIndex : '0') as string))!;
884
960
  const member = ref(getMember(whichForm.value, whichIndex.value));
885
- const selectedFamilyMember = ref<Api.GKB.BirthInfo | string>({});
961
+ const selectedFamilyMember = ref<Api.Child>({});
886
962
  const isPanelOpen = ref<boolean>(false);
887
963
  const memberDocument = ref<DocumentItem>();
888
964
  const isButtonLoading = ref<boolean>(false);
@@ -919,29 +995,13 @@ export default {
919
995
  if (dataStore.isPension && member.value.signOfResidency.nameRu === 'Нерезидент') {
920
996
  return false;
921
997
  }
922
- if (whichForm.value === 'beneficiaryForm') {
923
- if (Number(member.value.age) < 18) {
924
- return false;
925
- }
926
- }
927
- if (whichForm.value === 'insuredForm') {
928
- if (dataStore.isCritical) {
929
- if (Number(member.value.age) < 18) {
930
- return false;
931
- }
932
- }
933
- if (dataStore.isLifetrip) {
934
- if (member.value.isInsuredUnderage) {
935
- return false;
936
- }
937
- }
938
- }
939
998
  return true;
940
999
  });
941
1000
  const documentIssuerIsEditable = computed(() => {
942
1001
  return documentIssuerNotFoundName.value;
943
1002
  });
944
1003
  const documentIssuerNotFoundName = ref<string>('');
1004
+ const middleNameIsEditable = ref<boolean>(false);
945
1005
  const familyDialog = ref<boolean>(false);
946
1006
  const deletionDialog = ref<boolean>(false);
947
1007
  const documentChooseDialog = ref<boolean>(false);
@@ -961,12 +1021,27 @@ export default {
961
1021
  const filteredRelationsData = ref<Value[]>(dataStore.relations);
962
1022
  const currentPanelDeep = ref<string>();
963
1023
  const currentPanelSubDeep = ref<string>();
964
- const documentItems: Array<{ title: DigitalDocNames; value: DigitalDocTypes }> = [
965
- { title: 'Удостоверение личности', value: 'IdentityCard' },
966
- { title: 'Паспорт', value: 'Passport' },
967
- { title: 'Вид на жительство иностранного гражданина', value: 'Vnzh' },
968
- ];
1024
+ const selectedChild = ref<Api.Child | null>(null);
1025
+ const documentItems = computed(() => {
1026
+ if (dataStore.isLifetrip) {
1027
+ return [
1028
+ { title: 'Паспорт', value: 'Passport' },
1029
+ ]
1030
+ }
1031
+ return digitalDocumentOwnerType.value === 'adult'
1032
+ ? [
1033
+ { title: 'Удостоверение личности', value: 'IdentityCard' },
1034
+ { title: 'Паспорт', value: 'Passport' },
1035
+ { title: 'Вид на жительство иностранного гражданина', value: 'Vnzh' },
1036
+ ]
1037
+ : [
1038
+ { title: 'Свидетельство о рождении', value: 'BirthCertificate' },
1039
+ ]
1040
+ });
969
1041
  const digitalDocumentDialog = ref<boolean>(false);
1042
+ const parentIin = ref<string>('');
1043
+ const childrenLoaded = ref(false);
1044
+ const digitalDocumentOwnerType = ref('');
970
1045
  const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
971
1046
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
972
1047
  const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value));
@@ -1053,8 +1128,12 @@ export default {
1053
1128
  }
1054
1129
  return member.value.id === 0;
1055
1130
  }
1131
+ case formStore.insuredFormKey: {
1132
+ if (dataStore.isLifetrip && member.value.isInsuredUnderage) {
1133
+ return true;
1134
+ }
1135
+ }
1056
1136
  case formStore.policyholderFormKey:
1057
- case formStore.insuredFormKey:
1058
1137
  case formStore.beneficialOwnerFormKey:
1059
1138
  case formStore.policyholdersRepresentativeFormKey:
1060
1139
  return false;
@@ -1086,7 +1165,7 @@ export default {
1086
1165
  if (dataStore.isLifetrip || dataStore.isPension) {
1087
1166
  return false;
1088
1167
  }
1089
- if ((whichForm.value === formStore.beneficiaryFormKey || whichForm.value === formStore.insuredFormKey) && member.value.iin !== formStore.policyholderForm.iin) {
1168
+ if ((whichForm.value === formStore.beneficiaryFormKey || whichForm.value === formStore.insuredFormKey) && member.value.iin !== formStore.policyholderForm.iin && !hasGKB.value) {
1090
1169
  return true;
1091
1170
  }
1092
1171
  return false;
@@ -1096,10 +1175,13 @@ export default {
1096
1175
  return false;
1097
1176
  }
1098
1177
  if (whichForm.value === formStore.beneficiaryFormKey) {
1099
- if (dataStore.isBolashak) {
1178
+ if (dataStore.isBolashak || dataStore.isGons) {
1100
1179
  return false;
1101
1180
  }
1102
1181
  }
1182
+ if (member.value.age !== null && Number(member.value.age) < 18) {
1183
+ return false;
1184
+ }
1103
1185
  return true;
1104
1186
  });
1105
1187
  const hasInsurancePay = computed(() => {
@@ -1158,7 +1240,7 @@ export default {
1158
1240
  }
1159
1241
  }
1160
1242
  if (whichForm.value === formStore.beneficiaryFormKey) {
1161
- if (dataStore.isBolashak) {
1243
+ if (dataStore.isGons || dataStore.isBolashak) {
1162
1244
  return dataStore.rules.beneficiaryAgeLimit;
1163
1245
  }
1164
1246
  }
@@ -1228,6 +1310,14 @@ export default {
1228
1310
  if (route.query.tab === 'slaveInsuredForm' && route.query.id === '0') return true;
1229
1311
  return getOtpConditionByMember();
1230
1312
  });
1313
+ const isOwnChild = computed(() => {
1314
+ //в справочнике relations 9-ребенок, 12-сын, 13-дочь
1315
+ const childIds = [9, 12, 13]
1316
+ return !!childIds.includes(Number(member.value.relationDegree.ids))
1317
+ })
1318
+ const isEmpty = computed(() => {
1319
+ return isOwnChild.value ? formStore.children?.length === 0 : (childrenLoaded.value && formStore.children?.length === 0);
1320
+ })
1231
1321
 
1232
1322
  const searchMember = async (title: string = hasDocumentReader.value ? 'Получение данных со скана документа' : 'Поиск контрагента') => {
1233
1323
  if (!isDisabled.value) {
@@ -1358,7 +1448,7 @@ export default {
1358
1448
  if (dataStore.isBolashak) {
1359
1449
  if (key === 'relationDegree') {
1360
1450
  if (whichForm.value === formStore.beneficiaryFormKey) {
1361
- const beneficiaryRelations = [12, 13, 14, 15, 20, 21, 22, 23];
1451
+ const beneficiaryRelations = [9, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25];
1362
1452
  return list.filter(i => beneficiaryRelations.includes(Number(i.ids)));
1363
1453
  }
1364
1454
  if (whichForm.value === formStore.insuredFormKey) {
@@ -1367,6 +1457,14 @@ export default {
1367
1457
  }
1368
1458
  }
1369
1459
  }
1460
+ if (dataStore.isGons && key === 'relationDegree' && whichForm.value === formStore.beneficiaryFormKey) {
1461
+ const beneficiaryRelations = [9, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25];
1462
+ return list.filter(i => beneficiaryRelations.includes(Number(i.ids)));
1463
+ }
1464
+ if (dataStore.isBaiterek && key === 'relationDegree') {
1465
+ const relations = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25, 26, 27];
1466
+ return list.filter(i => relations.includes(Number(i.ids)));
1467
+ }
1370
1468
  return list;
1371
1469
  };
1372
1470
 
@@ -1553,74 +1651,68 @@ export default {
1553
1651
  };
1554
1652
 
1555
1653
  const getFamilyInfo = async () => {
1556
- if (!formStore.policyholderForm.iin || !formStore.policyholderForm.phoneNumber) return;
1557
- if (formStore.birthInfos.length === 0) {
1558
- isButtonLoading.value = true;
1559
- await dataStore.getFamilyInfo(formStore.policyholderForm.iin, formStore.policyholderForm.phoneNumber);
1560
- if (formStore.birthInfos.length !== 0) {
1561
- familyDialog.value = true;
1562
- }
1563
- if (formStore.birthInfos.length === 0 && dataStore.isGons) {
1564
- familyDialog.value = true;
1654
+ if(isButtonLoading.value) return
1655
+ if(!member.value.relationDegree?.nameRu) {
1656
+ dataStore.showToaster('error', dataStore.t('toaster.needSelectRelationDegree'))
1657
+ return
1658
+ }
1659
+
1660
+ if(isOwnChild.value) {
1661
+ if (!formStore.policyholderForm.iin) return;
1662
+ if (formStore.children.length === 0) {
1663
+ isButtonLoading.value = true;
1664
+ await dataStore.getChildren(formStore.policyholderForm.iin);
1665
+ childrenLoaded.value = true;
1565
1666
  }
1566
- } else {
1567
- familyDialog.value = true;
1568
1667
  }
1668
+ parentIin.value = '';
1669
+ familyDialog.value = true;
1569
1670
  isButtonLoading.value = false;
1570
1671
  };
1571
1672
 
1673
+ const getChildren = async () => {
1674
+ dataStore.isButtonsLoading = true
1675
+ try {
1676
+ const iinChecked = await dataStore.checkIIN(parentIin.value.replace(/-/g, ''));
1677
+ if (!iinChecked) {
1678
+ dataStore.showToaster('error', `Некорректный ИИН`);
1679
+ return;
1680
+ }
1681
+ await dataStore.getChildren(parentIin.value);
1682
+ childrenLoaded.value = true;
1683
+ } finally {
1684
+ dataStore.isButtonsLoading = false
1685
+ }
1686
+ }
1687
+
1572
1688
  const closeFamilyDialog = (resetMember = false) => {
1573
1689
  if (resetMember === true) {
1574
1690
  member.value.resetMember();
1575
1691
  }
1692
+ formStore.children = []
1693
+ childrenLoaded.value = false;
1576
1694
  familyDialog.value = false;
1577
- selectedFamilyMember.value = {};
1578
1695
  isButtonLoading.value = false;
1579
1696
  dataStore.rightPanel.open = false;
1580
1697
  isSearchOpen.value = false;
1581
- if (dataStore.isGons) {
1698
+ if (dataStore.isGons && resetMember) {
1582
1699
  member.value.chooseChild = '';
1583
1700
  }
1584
1701
  };
1585
1702
 
1586
- const addChild = () => {
1587
- member.value.resetMember();
1588
- familyDialog.value = false;
1589
- selectedFamilyMember.value = dataStore.t('form.addBeneficiary');
1590
- isButtonLoading.value = false;
1591
- dataStore.rightPanel.open = false;
1592
- isSearchOpen.value = false;
1593
- member.value.chooseChild = dataStore.t('form.addBeneficiary');
1594
- };
1595
-
1596
- const selectFamilyMember = (familyMember: Api.GKB.BirthInfo) => {
1597
- if (selectedFamilyMember.value && typeof selectedFamilyMember.value === 'object' && selectedFamilyMember.value.childIIN === familyMember.childIIN) {
1598
- selectedFamilyMember.value = {};
1599
- } else {
1600
- selectedFamilyMember.value = familyMember;
1601
- member.value.iin = reformatIin(selectedFamilyMember.value.childIIN!);
1602
- member.value.firstName = selectedFamilyMember.value.childName!;
1603
- member.value.lastName = selectedFamilyMember.value.childSurName!;
1604
- member.value.middleName = selectedFamilyMember.value.childPatronymic ?? '';
1605
- member.value.birthDate = reformatDate(selectedFamilyMember.value.childBirthDate!);
1606
- member.value.gender = dataStore.gender.find(i => {
1607
- if (typeof selectedFamilyMember.value === 'object') {
1608
- return i.id === selectedFamilyMember.value.childGender;
1609
- }
1610
- })!;
1611
- member.value.relationDegree = dataStore.relations.find(i => {
1612
- if (typeof selectedFamilyMember.value === 'object') {
1613
- return selectedFamilyMember.value.childGender === 1 ? i.nameRu === 'Сын' : i.nameRu === 'Дочь';
1614
- }
1615
- })!;
1616
- if (dataStore.isGons) {
1617
- member.value.chooseChild = `${selectedFamilyMember.value.childSurName} ${selectedFamilyMember.value.childName} ${selectedFamilyMember.value.childPatronymic ? selectedFamilyMember.value.childPatronymic : ''}`;
1618
- }
1703
+ const selectFamilyMember = () => {
1704
+ if(Object.keys(selectedFamilyMember.value).length === 0) {
1705
+ dataStore.showToaster('error', 'Нужно выбрать ребенка')
1706
+ return
1619
1707
  }
1708
+ member.value.chooseChildId = selectedFamilyMember.value.id!;
1709
+ selectedChild.value = selectedFamilyMember.value;
1710
+
1620
1711
  familyDialog.value = false;
1621
1712
  isButtonLoading.value = false;
1622
1713
  dataStore.rightPanel.open = false;
1623
1714
  isSearchOpen.value = false;
1715
+ openDigitalDocumentModal('child');
1624
1716
  };
1625
1717
 
1626
1718
  const getContragentFromGBDFL = async () => {
@@ -2133,10 +2225,39 @@ export default {
2133
2225
  return;
2134
2226
  }
2135
2227
 
2228
+ openDigitalDocumentModal('adult');
2229
+ };
2230
+
2231
+ const openDigitalDocumentModal = (type: 'child' | 'adult') => {
2232
+ digitalDocumentOwnerType.value = type;
2136
2233
  digitalDocumentDialog.value = true;
2234
+ };
2235
+
2236
+ const getCode = (documentType: string) => {
2237
+ if (!digitalDocumentOwnerType.value) return;
2238
+ if (digitalDocumentOwnerType.value === 'child') {
2239
+ getCodeForChild(documentType);
2240
+ } else {
2241
+ getCodeForAdult(documentType);
2242
+ }
2243
+ };
2244
+
2245
+ const getCodeForChild = async (documentType: string) => {
2246
+ const iin = isOwnChild.value ? formStore.policyholderForm.iin : parentIin.value;
2247
+ if(!iin) return
2248
+
2249
+ documentLoading.value = true;
2250
+ try {
2251
+ const response = await dataStore.getOnlineChildAccess(iin!, documentType, member.value.chooseChildId!);
2252
+ if (response) {
2253
+ dataStore.showToaster('success', dataStore.t('toaster.successOtp'), 3000);
2254
+ }
2255
+ } finally {
2256
+ documentLoading.value = false;
2257
+ }
2137
2258
  }
2138
2259
 
2139
- const getCode = async (documentType: string) => {
2260
+ const getCodeForAdult = async (documentType: string) => {
2140
2261
  documentLoading.value = true;
2141
2262
  try {
2142
2263
  const response = await dataStore.getOnlineAccess(member.value.iin!, documentType);
@@ -2149,14 +2270,24 @@ export default {
2149
2270
  };
2150
2271
 
2151
2272
  const getDigitalDocument = async (otpCode: string) => {
2273
+ if (!digitalDocumentOwnerType.value) return;
2274
+ let iin = '';
2275
+ if (digitalDocumentOwnerType.value === 'child') {
2276
+ iin = isOwnChild.value ? formStore.policyholderForm.iin! : parentIin.value!;
2277
+ } else {
2278
+ iin = member.value.iin!
2279
+ }
2280
+ if(!iin) return
2281
+
2152
2282
  documentLoading.value = true;
2153
2283
  try {
2154
- const response = await dataStore.getDigitalDocuments(member.value.iin!, otpCode);
2284
+ const response = await dataStore.getDigitalDocuments(iin!, otpCode);
2155
2285
 
2156
2286
  if (response?.parsingResponseContent) {
2157
2287
  const responseData = JSON.parse(response.parsingResponseContent);
2158
2288
 
2159
2289
  if (
2290
+ digitalDocumentOwnerType.value !== 'child' &&
2160
2291
  member.value.iin &&
2161
2292
  responseData.iin &&
2162
2293
  reformatIin(responseData.iin) &&
@@ -2169,6 +2300,29 @@ export default {
2169
2300
  return;
2170
2301
  }
2171
2302
 
2303
+ if (digitalDocumentOwnerType.value === 'child' && selectedChild.value && responseData) {
2304
+ const { firstName, lastName, birthDate } = selectedChild.value;
2305
+
2306
+ const birthDateMatch = birthDate && responseData.birthDate
2307
+ ? new Date(birthDate).toISOString().split('T')[0] === new Date(responseData.birthDate).toISOString().split('T')[0]
2308
+ : true;
2309
+
2310
+ if (firstName !== responseData.firstName || lastName !== responseData.lastName || !birthDateMatch) {
2311
+ dataStore.showToaster('error', 'Данные выбранного ребёнка не совпадают с полученными данными.');
2312
+ return;
2313
+ }
2314
+ }
2315
+
2316
+ if (dataStore.isLifetrip) {
2317
+ if (response.digitalDocuments.documentType.code !== 'Passport') {
2318
+ dataStore.showToaster('error', 'Допустимый тип документа — только Паспорт.');
2319
+ return;
2320
+ }
2321
+ }
2322
+
2323
+ if (responseData.firstName && responseData.lastName) {
2324
+ member.value.chooseChild = `${responseData.lastName} ${responseData.firstName} ${responseData.middleName ? responseData.middleName : ''}`;
2325
+ }
2172
2326
  if (responseData.iin) member.value.iin = reformatIin(responseData.iin);
2173
2327
  if (responseData.firstName) member.value.firstName = responseData.firstName;
2174
2328
  if (responseData.lastName) member.value.lastName = responseData.lastName;
@@ -2202,6 +2356,7 @@ export default {
2202
2356
  break;
2203
2357
  case "Passport":
2204
2358
  fileTypeCode = "PS";
2359
+ middleNameIsEditable.value = true;
2205
2360
  break;
2206
2361
  case "BirthCertificate":
2207
2362
  fileTypeCode = "SBI";
@@ -2378,6 +2533,19 @@ export default {
2378
2533
  searchQuery.value = '';
2379
2534
  }
2380
2535
  });
2536
+
2537
+ watch(familyDialog, (val) => {
2538
+ if(!val) {
2539
+ closeFamilyDialog()
2540
+ }
2541
+ });
2542
+
2543
+ watch(digitalDocumentDialog, (val) => {
2544
+ if(!val) {
2545
+ digitalDocumentOwnerType.value = ''
2546
+ }
2547
+ });
2548
+
2381
2549
  if (dataStore.isLifetrip && whichForm.value === 'insuredForm') {
2382
2550
  watch(
2383
2551
  () => member.value.age,
@@ -2452,6 +2620,14 @@ export default {
2452
2620
  },
2453
2621
  { deep: true },
2454
2622
  );
2623
+ watch(
2624
+ () => member.value.documentType,
2625
+ val => {
2626
+ if (val && val.ids !== "PS") {
2627
+ middleNameIsEditable.value = false;
2628
+ }
2629
+ }
2630
+ );
2455
2631
  onBeforeRouteLeave((to, from, next) => {
2456
2632
  if (dataStore.isDirty) {
2457
2633
  dataStore.quitDialog = true;
@@ -2527,8 +2703,11 @@ export default {
2527
2703
  imageDataList,
2528
2704
  contragents,
2529
2705
  filteredRelationsData,
2530
- documentItems,
2531
2706
  digitalDocumentDialog,
2707
+ parentIin,
2708
+ childrenLoaded,
2709
+ middleNameIsEditable,
2710
+ digitalDocumentOwnerType,
2532
2711
 
2533
2712
  // Computed
2534
2713
  whichForm,
@@ -2560,6 +2739,9 @@ export default {
2560
2739
  isChooseChild,
2561
2740
  documentIssuerIsEditable,
2562
2741
  hasDigitalDocument,
2742
+ isOwnChild,
2743
+ isEmpty,
2744
+ documentItems,
2563
2745
 
2564
2746
  // Rules
2565
2747
  ageRule,
@@ -2569,7 +2751,6 @@ export default {
2569
2751
 
2570
2752
  // Functions
2571
2753
  getToday,
2572
- addChild,
2573
2754
  searchMember,
2574
2755
  openPanel,
2575
2756
  openCustomPanel,
@@ -2602,6 +2783,7 @@ export default {
2602
2783
  getDigitalDocument,
2603
2784
  startGettingDigitalDocument,
2604
2785
  updateDigitalDocuments,
2786
+ getChildren,
2605
2787
  };
2606
2788
  },
2607
2789
  };
@@ -512,6 +512,7 @@
512
512
  <base-form-input
513
513
  v-model="contract.transferContractRegNumber"
514
514
  :label="$dataStore.t('pension.transferRegNumber')"
515
+ :rules="$rules.required"
515
516
  :readonly="isDisabled"
516
517
  :clearable="!isDisabled"
517
518
  />
@@ -2109,7 +2110,7 @@ export default defineComponent({
2109
2110
  : formatDate(i.transferContractFirstPaymentDate)?.toISOString() ?? '',
2110
2111
  // @ts-ignore
2111
2112
  transferContractCompany:
2112
- typeof i.transferContractCompany !== 'string' && 'nameRu' in i.transferContractCompany ? String(i.transferContractCompany.nameRu) : i.transferContractCompany,
2113
+ typeof i.transferContractCompany !== 'string' && 'nameRu' in i.transferContractCompany ? i.transferContractCompany.nameRu : i.transferContractCompany,
2113
2114
  transferContractCompanyId:
2114
2115
  // @ts-ignore
2115
2116
  typeof i.transferContractCompany !== 'string' && 'ids' in i.transferContractCompany ? i.transferContractCompany.ids : i.transferContractCompanyId,
@@ -498,6 +498,7 @@ export class Member extends Person {
498
498
  transferContractCompany: Value;
499
499
  digitalDocument: IDocument | null;
500
500
  chooseChild: string | null;
501
+ chooseChildId: string | null;
501
502
  identityDocument: {
502
503
  documentType: Value;
503
504
  documentNumber: string | null;
@@ -573,6 +574,7 @@ export class Member extends Person {
573
574
  confirmDocTypeRod = null,
574
575
  isNotary = false,
575
576
  chooseChild = null,
577
+ chooseChildId = null,
576
578
  ) {
577
579
  super(id, type, iin, longName, lastName, firstName, middleName, birthDate, gender, genderName, birthPlace, age);
578
580
  this.documentsList = [];
@@ -645,6 +647,7 @@ export class Member extends Person {
645
647
  this.transferContractCompany = new Value();
646
648
  this.digitalDocument = null;
647
649
  this.chooseChild = chooseChild;
650
+ this.chooseChildId = chooseChildId;
648
651
  this.identityDocument = {
649
652
  documentType: new Value(),
650
653
  documentNumber: null,
@@ -1416,6 +1419,7 @@ export class FormStoreClass {
1416
1419
  surveyByCriticalBasePolicyholder: any;
1417
1420
  };
1418
1421
  birthInfos: Types.Api.GKB.BirthInfo[];
1422
+ children: Types.Api.Child[];
1419
1423
  SaleChanellPolicy: Value;
1420
1424
  AgentData: Types.AgentData;
1421
1425
  RegionPolicy: Value;
@@ -1541,6 +1545,7 @@ export class FormStoreClass {
1541
1545
  surveyByCriticalBasePolicyholder: {},
1542
1546
  };
1543
1547
  this.birthInfos = [];
1548
+ this.children = [];
1544
1549
  this.SaleChanellPolicy = new Value();
1545
1550
  this.AgentData = {
1546
1551
  agentId: null,
@@ -916,6 +916,7 @@ export class RoleController {
916
916
  this.isHeadAdjuster() ||
917
917
  this.isArchivist() ||
918
918
  this.isSecurity() ||
919
+ this.isUnderwriter() ||
919
920
  this.isSanctioner1() ||
920
921
  this.isSanctioner2() ||
921
922
  this.isSanctioner3() ||
package/locales/ru.json CHANGED
@@ -162,6 +162,7 @@
162
162
  "siblingRelationDoc": "Необходимо вложить документы, подтверждающие родственные связи между Страхователем и Выгодоприобретателем.\nВ случае, если степень родства Выгодоприобретателя выбрано:\n Полнородный брат/сестра или Неполнородный брат/сестра - Необходимо вложить 2 документа: Свидетельство о рождении Выгодоприобретателя и Свидетельство о рождении Страхователя",
163
163
  "grandchildRelationDoc": "Необходимо вложить документы, подтверждающие родственные связи между Страхователем и Выгодоприобретателем.\nВ случае, если степень родства Выгодоприобретателя выбрано:\n Внук/Внучка - Необходимо вложить 2 документа: Свидетельство о рождении Выгодоприобретателя и Свидетельство о рождении родителя (который является ребенком страхователя) Выгодоприобретателя",
164
164
  "missingDocuments": "Необходимо вложить документы доверенность представителя и сведения о представителе",
165
+ "needSelectRelationDegree": "Сначала необходимо выбрать степень родства"
165
166
  },
166
167
  "notSignedContract": "Неподписанный Договор",
167
168
  "Contract": "Договор страхования",
@@ -216,6 +217,7 @@
216
217
  "fromGBDFL": "Государственная база данных физических лиц",
217
218
  "fromGKB": "Данные по ребенку Страхователя",
218
219
  "fromDD": "Данные из цифрового документа",
220
+ "childData": "Данные по ребенку",
219
221
  "sendSMS": "Отправить СМС",
220
222
  "sendOtp": "Отправить код подтверждения",
221
223
  "check": "Проверить",
@@ -307,7 +309,9 @@
307
309
  "searchFoundBeneficiary": "По данному ИИН уже имеется договор. Создание заявки по продукту “ГОНС” - невозможно.",
308
310
  "searchNotFoundBeneficiary": "По данному ИИН договор не найден. Нажмите “Создать” для создания новой заявки по продукту “ГОНС”",
309
311
  "searchFoundPolicyholder": "Выполните поиск договоров по БИН Страхователя",
310
- "searchNotFoundPolicyholder": "По данному БИНу не найден договор {product}.\nПроверьте правильность ввода БИН."
312
+ "searchNotFoundPolicyholder": "По данному БИНу не найден договор {product}.\nПроверьте правильность ввода БИН.",
313
+ "chooseChild": "Выберите ребенка",
314
+ "enterParentIin": "Укажите ИИН родителя"
311
315
  },
312
316
  "sign": {
313
317
  "chooseDoc": "Выберите документы для подписание",
@@ -883,7 +887,8 @@
883
887
  "eventType": "Тип СС",
884
888
  "eventDate": "Дата СС",
885
889
  "typePolicyholder": "Тип страхователя",
886
- "efoMenuItems": "Основные разделы ЕФО"
890
+ "efoMenuItems": "Основные разделы ЕФО",
891
+ "parentIin": "Введите ИИН родителя ребёнка"
887
892
  },
888
893
  "placeholders": {
889
894
  "login": "Логин",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hl-core",
3
- "version": "0.0.10-beta.67",
3
+ "version": "0.0.10-beta.69",
4
4
  "license": "MIT",
5
5
  "private": false,
6
6
  "main": "nuxt.config.ts",
@@ -58,7 +58,7 @@
58
58
  "fast-xml-parser": "4.0.12",
59
59
  "jwt-decode": "4.0.0",
60
60
  "maska": "1.5.0",
61
- "ncalayer-js-client": "1.3.4",
61
+ "ncalayer-js-client": "1.5.6",
62
62
  "pinia": "2.1.7",
63
63
  "qrcode.vue": "3.4.1",
64
64
  "typescript": "5.3.3",
@@ -2899,7 +2899,7 @@ export const useDataStore = defineStore('data', {
2899
2899
  data.append('EdsXmlId', groupId);
2900
2900
  await this.api.file.uploadXml(data);
2901
2901
  } else {
2902
- const base64EncodedSignature = await ncaLayerClient.createCAdESFromBase64(storageType, document, 'SIGNATURE', true);
2902
+ const base64EncodedSignature = await ncaLayerClient.createCMSSignatureFromBase64(storageType, document, 'SIGNATURE', true);
2903
2903
  await this.api.file.uploadDigitalCertificateNca(groupId, { Base64EncodedSignature: base64EncodedSignature });
2904
2904
  }
2905
2905
  return true;
@@ -3546,6 +3546,22 @@ export const useDataStore = defineStore('data', {
3546
3546
  this.isLoading = false;
3547
3547
  }
3548
3548
  },
3549
+ async getChildren(iin: string) {
3550
+ this.isLoading = true;
3551
+ try {
3552
+ const res = await this.api.externalServices.getOnlineChildAccess({
3553
+ iinBin: iin.replace(/-/g, ''),
3554
+ methodName: "CHILDREN"
3555
+ })
3556
+ if(res.children && res.children.length) {
3557
+ this.formStore.children = res.children;
3558
+ }
3559
+ } catch (err) {
3560
+ ErrorHandler(err);
3561
+ } finally {
3562
+ this.isLoading = false;
3563
+ }
3564
+ },
3549
3565
  async getKgd(iin: string) {
3550
3566
  try {
3551
3567
  const data = {
@@ -4221,6 +4237,19 @@ export const useDataStore = defineStore('data', {
4221
4237
  return null;
4222
4238
  }
4223
4239
  },
4240
+ async getOnlineChildAccess(iin: string, documentType: string, childId: string) {
4241
+ try {
4242
+ const data = {
4243
+ iinBin: iin.replaceAll('-', ''),
4244
+ documentType: documentType,
4245
+ childId: childId,
4246
+ }
4247
+ return await this.api.externalServices.getOnlineChildAccess(data);
4248
+ } catch (err) {
4249
+ ErrorHandler(err);
4250
+ return null;
4251
+ }
4252
+ },
4224
4253
  async getDigitalDocuments(iin: string, code: string, processInstanceId?: string) {
4225
4254
  try {
4226
4255
  const data = {
package/store/rules.ts CHANGED
@@ -332,6 +332,7 @@ export const rules = {
332
332
  return t('rules.lengthLimit', { len: limit });
333
333
  },
334
334
  validateAfterContractDate(v: any, date: any) {
335
+ if(!v || !date) return true;
335
336
  const parseDate = (str: string): Date => {
336
337
  const [day, month, year] = str.split('.');
337
338
  return new Date(Number(year), Number(month) - 1, Number(day));
package/types/index.ts CHANGED
@@ -925,6 +925,7 @@ export namespace Api {
925
925
  zagsNameKZ?: string;
926
926
  zagsNameRU?: string;
927
927
  childGender?: number;
928
+ childId?: string;
928
929
  };
929
930
  }
930
931
 
@@ -979,6 +980,13 @@ export namespace Api {
979
980
  };
980
981
  }
981
982
  }
983
+ export type Child = {
984
+ id?: string;
985
+ firstName?: string;
986
+ lastName?: string;
987
+ middleName?: string;
988
+ birthDate?: string;
989
+ }
982
990
  }
983
991
 
984
992
  export namespace Dicts {