hl-core 0.0.10-beta.64 → 0.0.10-beta.66

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.
@@ -35,7 +35,7 @@
35
35
  v-model="formStore.applicationData.insuredApp.iin"
36
36
  :maska="$maska.iin"
37
37
  :readonly="isDisabled"
38
- :clearable="false"
38
+ :clearable="!isDisabled"
39
39
  :label="$dataStore.t('pension.insuredIIN')"
40
40
  append-inner-icon="mdi mdi-chevron-right"
41
41
  @append="searchMember"
@@ -75,11 +75,12 @@
75
75
  @append="searchMember($dataStore.t('form.chooseChild'))"
76
76
  />
77
77
  <base-form-input
78
+ :key="String(member.signOfResidency.nameRu)"
78
79
  v-model="member.phoneNumber"
79
80
  :label="$dataStore.t('form.phoneNumber')"
80
- :maska="$maska.phone"
81
- :readonly="!!isDisabled || !!isIinPhoneDisabled || !!isDataFromGov"
82
- :clearable="!isDisabled && !isIinPhoneDisabled && !isDataFromGov"
81
+ :maska="$dataStore.isPension && member.signOfResidency.nameRu === 'Нерезидент' ? $maska.phoneNonResident : $maska.phone"
82
+ :readonly="!!isDisabled || !!isIinPhoneDisabled"
83
+ :clearable="!isDisabled && !isIinPhoneDisabled"
83
84
  :append-inner-icon="otpCondition ? `${$dataStore.isPension ? 'mdi-message-text' : 'mdi mdi-phone-message'}` : ''"
84
85
  @append="openCustomPanel('otp')"
85
86
  @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
@@ -91,8 +92,8 @@
91
92
  v-model="member.iin"
92
93
  :label="$dataStore.t('form.iin')"
93
94
  :maska="$maska.iin"
94
- :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin || !!isDataFromGov"
95
- :clearable="!isDisabled && !isIinPhoneDisabled && !member.parsedDocument?.iin && !isDataFromGov"
95
+ :readonly="!!isDisabled || !!isIinPhoneDisabled || !!member.parsedDocument?.iin"
96
+ :clearable="!isDisabled && !isIinPhoneDisabled && !member.parsedDocument?.iin"
96
97
  :append-inner-icon="hasMemberSearch || !isNonResident ? (hasDocumentReader ? 'mdi mdi-credit-card-scan-outline' : 'mdi mdi-magnify') : ''"
97
98
  @append="searchMember"
98
99
  @input="onIinInput"
@@ -172,7 +173,7 @@
172
173
  @append="openPanel($dataStore.t('form.Country'), [], 'birthPlace', $dataStore.getCountries)"
173
174
  />
174
175
  </div>
175
- <base-form-input v-if="!$dataStore.isPension" v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule" />
176
+ <base-form-input v-if="!$dataStore.isPension" v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="false" :rules="ageRule" />
176
177
  <base-panel-input
177
178
  v-model="member.gender"
178
179
  :value="member.gender?.nameRu"
@@ -199,7 +200,7 @@
199
200
  v-model="member.relationDegree"
200
201
  :value="member.relationDegree?.nameRu"
201
202
  :readonly="isDisabled || !isChooseChild"
202
- :clearable="!isDisabled || !!isChooseChild"
203
+ :clearable="!isDisabled && !!isChooseChild"
203
204
  :label="$dataStore.t('form.relations')"
204
205
  :rules="$rules.objectRequired"
205
206
  append-inner-icon="mdi mdi-chevron-right"
@@ -820,18 +821,29 @@
820
821
  <base-list-empty class="w-full" v-else @click="fioChooseDialog = false" />
821
822
  </template>
822
823
  </base-dialog>
824
+ <base-dialog
825
+ v-model="$dataStore.quitDialog"
826
+ :title="$dataStore.t('dialog.exit')"
827
+ :subtitle="$dataStore.t('dialog.dataWillNotSave')"
828
+ :confirm="$dataStore.t('confirm.yes')"
829
+ :icon="{ mdi: 'delete-outline', color: '#FD2D39' }"
830
+ @yes="discardAndContinue"
831
+ @no="stayHere"
832
+ />
823
833
  </section>
824
834
  <base-scroll-buttons @up="scrollForm('up')" @down="scrollForm('down')" />
825
835
  </template>
826
836
 
827
837
  <script lang="ts">
838
+ import { onBeforeRouteLeave } from 'vue-router';
828
839
  import { Value, DocumentItem, Member } from '../../composables/classes';
829
840
  import { uuid } from 'vue-uuid';
830
841
  import { StoreMembers, CoreEnums } from '../../types/enum';
831
842
  import type { Api, ContragentType, Dicts, ESBDValidationType, FileActions, MultipleMember } from '../../types';
832
843
 
833
844
  export default {
834
- setup() {
845
+ emits: ['updateTab'],
846
+ setup(_: any, { emit }: any) {
835
847
  const vForm = ref<any>();
836
848
  const route = useRoute();
837
849
  const router = useRouter();
@@ -857,7 +869,48 @@ export default {
857
869
  const isPanelLoading = ref<boolean>(false);
858
870
  const isChangingMember = ref<boolean>(false);
859
871
  const isNonResident = computed(() => dataStore.isPension && member.value.signOfResidency.ids === '500011.2');
860
- const isDataFromGov = computed(() => member.value.verifyType === 'GBDFL' || member.value.verifyType === 'ESBD' || !!member.value.gosPersonData);
872
+ const initialMember = ref<Member>(new Member());
873
+ const pendingRoute = ref<any>(null);
874
+ const subMemberRoute = ref<any>(null);
875
+ const isReady = ref(false);
876
+ if (member.value.id === 0) {
877
+ setTimeout(() => {
878
+ isReady.value = true;
879
+ }, 1000);
880
+ } else {
881
+ initialMember.value = JSON.parse(JSON.stringify(member.value));
882
+ nextTick(() => {
883
+ isReady.value = true;
884
+ });
885
+ }
886
+ // временное отключение сервиса, соответственно ручной ввод тоже
887
+ // member.value.verifyType === 'GBDFL' || member.value.verifyType === 'ESBD' || !!member.value.gosPersonData
888
+ const isDataFromGov = computed(() => {
889
+ if (dataStore.isAulettiParent) {
890
+ return false;
891
+ }
892
+ if (dataStore.isPension && member.value.signOfResidency.nameRu === 'Нерезидент') {
893
+ return false;
894
+ }
895
+ if (whichForm.value === 'beneficiaryForm') {
896
+ if (Number(member.value.age) < 18) {
897
+ return false;
898
+ }
899
+ }
900
+ if (whichForm.value === 'insuredForm') {
901
+ if (dataStore.isCritical) {
902
+ if (Number(member.value.age) < 18) {
903
+ return false;
904
+ }
905
+ }
906
+ if (dataStore.isLifetrip) {
907
+ if (member.value.isInsuredUnderage) {
908
+ return false;
909
+ }
910
+ }
911
+ }
912
+ return true;
913
+ });
861
914
  const familyDialog = ref<boolean>(false);
862
915
  const deletionDialog = ref<boolean>(false);
863
916
  const documentChooseDialog = ref<boolean>(false);
@@ -950,7 +1003,7 @@ export default {
950
1003
  return true;
951
1004
  }
952
1005
  };
953
- return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGBDFL && perMemberCondition();
1006
+ return dataStore.controls.hasGBDFL && perMemberCondition();
954
1007
  });
955
1008
  const hasGBDFLDocSelection = dataStore.isLifetrip;
956
1009
  const hasInsis = computed(() => dataStore.controls.hasInsis);
@@ -972,7 +1025,7 @@ export default {
972
1025
  return false;
973
1026
  }
974
1027
  };
975
- return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
1028
+ return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
976
1029
  });
977
1030
  const hasDocumentReader = computed(() => {
978
1031
  return !!member.value.hasAgreement && !!isTask.value && (dataStore.isAULETTI || dataStore.isAulettiParent);
@@ -1025,7 +1078,12 @@ export default {
1025
1078
  );
1026
1079
  const hasWorkPositionDict = dataStore.isBaiterek;
1027
1080
  const hasIssuerOther = computed(() => (useEnv().isProduction ? dataStore.isPension : true) && member.value.documentIssuers && member.value.documentIssuers.nameRu === 'Другое');
1028
-
1081
+ const isCurrentFormMatch = computed(() => {
1082
+ if (dataStore.isPension) {
1083
+ return whichForm.value === formStore.insuredFormKey;
1084
+ }
1085
+ return whichForm.value === formStore.policyholderFormKey;
1086
+ });
1029
1087
  const birthDateRule = computed(() => {
1030
1088
  const baseDateRule = dataStore.rules.required.concat(dataStore.rules.birthDate);
1031
1089
  const byMemberAndProductRule = () => {
@@ -1082,6 +1140,9 @@ export default {
1082
1140
  if (member.value.isInsuredUnderage) {
1083
1141
  return [];
1084
1142
  }
1143
+ if (dataStore.isPension && member.value.signOfResidency.nameRu === 'Нерезидент') {
1144
+ return dataStore.rules.phoneNonResidentFormat;
1145
+ }
1085
1146
  return basePhoneRule;
1086
1147
  });
1087
1148
 
@@ -1606,7 +1667,10 @@ export default {
1606
1667
  };
1607
1668
 
1608
1669
  const validateESBD = async (docTypeNumber: number) => {
1609
- // TODO
1670
+ if (!dataStore.checkWithESBD) {
1671
+ return true;
1672
+ }
1673
+
1610
1674
  const data: ESBDValidationType = {
1611
1675
  personType: 1,
1612
1676
  iin: member.value.iin!.replaceAll('-', ''),
@@ -1624,7 +1688,21 @@ export default {
1624
1688
  resident: member.value.signOfResidency.ids === '500011.2' || member.value.signOfResidency.ids === null ? 0 : 1,
1625
1689
  countryId: member.value.countryOfTaxResidency.ids !== '500014.3' ? Number(String(member.value.countryOfTaxResidency.ids).at(-1)) : 2,
1626
1690
  };
1627
- return await dataStore.getValidateClientESBD(data);
1691
+ const ESBDResponse = await dataStore.getValidateClientESBD(data);
1692
+ if (!ESBDResponse) {
1693
+ dataStore.isLoading = false;
1694
+ isSubmittingForm.value = false;
1695
+ return false;
1696
+ }
1697
+ const initialPoint = `${member.value.iin!.replaceAll('-', '')}.`;
1698
+ const RESPONSE = ESBDMessage(ESBDResponse, initialPoint);
1699
+ let errorMessage = RESPONSE !== false ? RESPONSE : 'Что-то произошло не так';
1700
+ if (typeof ESBDResponse !== 'object' || ESBDResponse.errorCode !== 0) {
1701
+ dataStore.isLoading = false;
1702
+ dataStore.showToaster('error', errorMessage, 5000);
1703
+ return false;
1704
+ }
1705
+ return true;
1628
1706
  };
1629
1707
 
1630
1708
  const saveMember = async () => {
@@ -1797,39 +1875,26 @@ export default {
1797
1875
  SBI: 3,
1798
1876
  VNZ: 4,
1799
1877
  };
1800
- const ESBDResponse = await validateESBD(docTypeCodes[docType]);
1801
- if (!ESBDResponse) {
1802
- isSubmittingForm.value = false;
1803
- dataStore.isLoading = false;
1804
- return;
1805
- }
1806
- const initialPoint = `${member.value.iin!.replaceAll('-', '')}.`;
1807
- const RESPONSE = ESBDMessage(ESBDResponse, initialPoint);
1808
- let errorMessage = RESPONSE !== false ? RESPONSE : 'Что-то произошло не так';
1809
- if (typeof ESBDResponse === 'object' && ESBDResponse.errorCode === 0) {
1810
- member.value.verifyType = 'ESBD';
1811
- member.value.verifyDate = ESBDResponse.verifiedDate;
1812
1878
 
1813
- if (member.value.bankInfo.iik.length === useMask().iik.length) {
1814
- const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1815
- if (isValidIik === false) {
1816
- dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1817
- member.value.bankInfo.iik = '';
1818
- isSubmittingForm.value = false;
1819
- return;
1820
- }
1821
- if (formStore.pensionApp && whichForm.value === 'insuredForm') {
1822
- formStore.pensionApp.account = member.value.bankInfo.iik;
1823
- formStore.pensionApp.bankBik = member.value.bankInfo.bik;
1824
- formStore.pensionApp.bankBin = member.value.bankInfo.bin;
1825
- formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1826
- }
1879
+ const isESBDValid = await validateESBD(docTypeCodes[docType]);
1880
+ if (isESBDValid === false) return;
1881
+
1882
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
1883
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1884
+ if (isValidIik === false) {
1885
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1886
+ member.value.bankInfo.iik = '';
1887
+ isSubmittingForm.value = false;
1888
+ return;
1889
+ }
1890
+ if (formStore.pensionApp && whichForm.value === 'insuredForm') {
1891
+ formStore.pensionApp.account = member.value.bankInfo.iik;
1892
+ formStore.pensionApp.bankBik = member.value.bankInfo.bik;
1893
+ formStore.pensionApp.bankBin = member.value.bankInfo.bin;
1894
+ formStore.pensionApp.bankId = Number(member.value.bankInfo.bankName.id);
1827
1895
  }
1828
- const hasMemberSaved = await saveMember();
1829
- } else {
1830
- dataStore.isLoading = false;
1831
- dataStore.showToaster('error', errorMessage, 5000);
1832
1896
  }
1897
+ const hasMemberSaved = await saveMember();
1833
1898
  } else if (isNonResident.value) {
1834
1899
  if (member.value.bankInfo.iik.length === useMask().iik.length) {
1835
1900
  const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
@@ -1851,6 +1916,7 @@ export default {
1851
1916
  member.value.gotFromInsis = true;
1852
1917
  const hasMemberSaved = await saveMember();
1853
1918
  }
1919
+ dataStore.isDirty = false;
1854
1920
  isSubmittingForm.value = false;
1855
1921
  } else {
1856
1922
  const errors = document.querySelector('.v-input--error');
@@ -1892,6 +1958,15 @@ export default {
1892
1958
 
1893
1959
  const sendOtp = async (onInit = false) => {
1894
1960
  otpSending.value = true;
1961
+ if (isCurrentFormMatch.value && member.value.iin && member.value.iin.length === useMask().iin.length) {
1962
+ const iin = member.value.iin.replace(/-/g, '');
1963
+ const type = String(route.query.type) === 'joint' ? 25 : 19;
1964
+ const response = await dataStore.checkExistProcess(iin, dataStore.isPension ? type : constants.products[dataStore.product as keyof typeof constants.products]);
1965
+ if (response) {
1966
+ otpSending.value = false;
1967
+ return;
1968
+ }
1969
+ }
1895
1970
  const response = await memberStore.sendOtp(member.value, formStore.applicationData.processInstanceId, onInit);
1896
1971
  if (response) {
1897
1972
  if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
@@ -1965,6 +2040,12 @@ export default {
1965
2040
  };
1966
2041
 
1967
2042
  const selectMember = async (index: number, update?: boolean) => {
2043
+ if (dataStore.isDirty === true) {
2044
+ dataStore.quitDialog = true;
2045
+ //@ts-ignore
2046
+ subMemberRoute.value = { query: { ...route.query, i: index, id: getMember(route.query.tab, index).id, upd: update } };
2047
+ return;
2048
+ }
1968
2049
  dataStore.rightPanel.open = false;
1969
2050
  isButtonLoading.value = true;
1970
2051
  isChangingMember.value = true;
@@ -2206,6 +2287,55 @@ export default {
2206
2287
  },
2207
2288
  );
2208
2289
  }
2290
+ watch(
2291
+ member.value,
2292
+ () => {
2293
+ if (!isReady.value) return;
2294
+ dataStore.isDirty = true;
2295
+ },
2296
+ { deep: true },
2297
+ );
2298
+ onBeforeRouteLeave((to, from, next) => {
2299
+ if (dataStore.isDirty) {
2300
+ dataStore.quitDialog = true;
2301
+ pendingRoute.value = to;
2302
+ next(false);
2303
+ } else {
2304
+ next();
2305
+ }
2306
+ });
2307
+ const discardAndContinue = async () => {
2308
+ dataStore.quitDialog = false;
2309
+ dataStore.isDirty = false;
2310
+
2311
+ if (member.value.id === 0) {
2312
+ Object.assign(member.value, JSON.parse(JSON.stringify(initialMember.value)));
2313
+ isReady.value = false;
2314
+ }
2315
+ if (member.value.id !== 0) {
2316
+ Object.assign(member.value, JSON.parse(JSON.stringify(initialMember.value)));
2317
+ initialMember.value = new Member();
2318
+ isReady.value = false;
2319
+ }
2320
+ if (pendingRoute.value) {
2321
+ await router.replace(pendingRoute.value);
2322
+ pendingRoute.value = null;
2323
+ }
2324
+ if (dataStore.pendingTab) {
2325
+ dataStore.menu.selectedItem = dataStore.pendingTab;
2326
+ emit('updateTab', dataStore.pendingTab);
2327
+ dataStore.pendingTab = null;
2328
+ }
2329
+ if (subMemberRoute.value) {
2330
+ await router.replace(subMemberRoute.value);
2331
+ subMemberRoute.value = null;
2332
+ }
2333
+ };
2334
+ const stayHere = () => {
2335
+ dataStore.quitDialog = false;
2336
+ pendingRoute.value = null;
2337
+ dataStore.pendingTab = null;
2338
+ };
2209
2339
 
2210
2340
  return {
2211
2341
  // State
@@ -2304,6 +2434,8 @@ export default {
2304
2434
  searchPositions,
2305
2435
  selectGbdDocument,
2306
2436
  pickPosition,
2437
+ stayHere,
2438
+ discardAndContinue,
2307
2439
  getContragentClick,
2308
2440
  };
2309
2441
  },