hl-core 0.0.7-beta.14 → 0.0.7-beta.16

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.
@@ -0,0 +1,983 @@
1
+ <template>
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">
4
+ <base-form-section :title="$t('form.personalData')">
5
+ <base-form-input
6
+ v-model="member.iin"
7
+ :label="$t('form.iin')"
8
+ maska="###-###-###-###"
9
+ :readonly="isDisabled || isIinPhoneDisabled"
10
+ :clearable="!isDisabled"
11
+ append-inner-icon="mdi mdi-magnify"
12
+ @append="searchMember"
13
+ :rules="$rules.required.concat($rules.iinRight)"
14
+ ></base-form-input>
15
+ <base-form-input
16
+ v-model="member.phoneNumber"
17
+ :label="$t('form.phoneNumber')"
18
+ maska="+7 (7##) ### ## ##"
19
+ :readonly="isDisabled || isIinPhoneDisabled"
20
+ :clearable="!isDisabled"
21
+ :append-inner-icon="otpCondition ? 'mdi mdi-phone-message' : ''"
22
+ @append="sendOtp(false)"
23
+ @keyup.enter.prevent="otpCondition ? sendOtp(false) : null"
24
+ :rules="$rules.required.concat($rules.phoneFormat)"
25
+ ></base-form-input>
26
+ <base-fade-transition>
27
+ <base-form-input
28
+ v-if="otpCondition && member.otpTokenId"
29
+ v-model="member.otpCode"
30
+ :label="$t('form.otpCode')"
31
+ maska="# # # #"
32
+ :append-inner-icon="hasOtp ? 'mdi mdi-check' : ''"
33
+ @keyup.enter.prevent="hasOtp ? checkOtp() : null"
34
+ ></base-form-input>
35
+ </base-fade-transition>
36
+ <base-form-input
37
+ v-model="member.lastName"
38
+ :readonly="isDisabled || isFromGBD"
39
+ :clearable="!isDisabled"
40
+ :label="$t('form.lastName')"
41
+ :rules="$rules.required.concat($rules.cyrillic)"
42
+ ></base-form-input>
43
+ <base-form-input
44
+ v-model="member.firstName"
45
+ :readonly="isDisabled || isFromGBD"
46
+ :clearable="!isDisabled"
47
+ :label="$t('form.firstName')"
48
+ :rules="$rules.required.concat($rules.cyrillic)"
49
+ ></base-form-input>
50
+ <base-form-input
51
+ v-model="member.middleName"
52
+ :readonly="isDisabled || isFromGBD"
53
+ :clearable="!isDisabled"
54
+ :label="$t('form.middleName')"
55
+ :rules="$rules.required.concat($rules.cyrillic)"
56
+ ></base-form-input>
57
+ <base-form-input
58
+ v-model="member.birthDate"
59
+ :readonly="isDisabled || isFromGBD"
60
+ :clearable="!isDisabled"
61
+ :label="$t('form.birthDate')"
62
+ :rules="$rules.required.concat($rules.birthDate)"
63
+ maska="##.##.####"
64
+ append-inner-icon="mdi mdi-calendar-blank-outline"
65
+ ></base-form-input>
66
+ <base-form-input
67
+ v-model="member.age"
68
+ :label="$t('form.age')"
69
+ :readonly="isDisabled || isFromGBD"
70
+ :clearable="!isDisabled"
71
+ :rules="$rules.required.concat($rules.numbers)"
72
+ ></base-form-input>
73
+ <base-panel-input
74
+ v-model="member.gender"
75
+ :value="member.gender.nameRu"
76
+ :readonly="isDisabled || isFromGBD"
77
+ :clearable="!isDisabled"
78
+ :label="$t('form.gender')"
79
+ :rules="$rules.objectRequired"
80
+ append-inner-icon="mdi mdi-chevron-right"
81
+ @append="openPanel($t('form.gender'), $dataStore.gender, 'gender')"
82
+ ></base-panel-input>
83
+ <base-panel-input
84
+ v-model="member.familyStatus"
85
+ :value="member.familyStatus.nameRu"
86
+ :readonly="isDisabled"
87
+ :clearable="!isDisabled"
88
+ :label="$t('form.familyStatus')"
89
+ :rules="$rules.objectRequired"
90
+ append-inner-icon="mdi mdi-chevron-right"
91
+ @append="openPanel($t('form.familyStatus'), [], 'familyStatus', $dataStore.getFamilyStatuses)"
92
+ ></base-panel-input>
93
+ <base-panel-input
94
+ v-if="(whichForm === formStore.beneficiaryFormKey || whichForm === formStore.insuredFormKey) && member.iin !== formStore.policyholderForm.iin"
95
+ v-model="member.relationDegree"
96
+ :value="member.relationDegree.nameRu"
97
+ :readonly="isDisabled"
98
+ :clearable="!isDisabled"
99
+ :label="$t('form.relations')"
100
+ :rules="$rules.objectRequired"
101
+ append-inner-icon="mdi mdi-chevron-right"
102
+ @append="openPanel($t('form.relations'), [], 'relationDegree', $dataStore.getRelationTypes)"
103
+ ></base-panel-input>
104
+ <base-form-input
105
+ v-if="whichForm === formStore.beneficiaryFormKey"
106
+ v-model="member.percentageOfPayoutAmount"
107
+ :readonly="isDisabled"
108
+ :clearable="!isDisabled"
109
+ :label="$t('form.percentageOfPayoutAmount')"
110
+ :rules="$rules.required.concat($rules.numbers)"
111
+ ></base-form-input>
112
+ <base-form-toggle v-if="$dataStore.isGons" :disabled="isDisabled" :has-border="false" v-model="member.isPdl" :title="$dataStore.t('isMemberIPDL')"></base-form-toggle>
113
+ </base-form-section>
114
+ <base-form-section :title="$t('policyholdersRepresentative.PowerOfAttorney')" v-if="whichForm === formStore.policyholdersRepresentativeFormKey">
115
+ <base-form-input
116
+ v-model="member.fullNameRod"
117
+ :label="$t('policyholdersRepresentative.NameParentCase')"
118
+ :readonly="isDisabled"
119
+ :clearable="!isDisabled"
120
+ :rules="$rules.required"
121
+ ></base-form-input>
122
+ <base-form-input
123
+ v-model="member.confirmDocTypeKz"
124
+ :label="$t('policyholdersRepresentative.basisDocKz')"
125
+ :readonly="isDisabled"
126
+ :clearable="!isDisabled"
127
+ :rules="$rules.required"
128
+ ></base-form-input>
129
+ <base-form-input
130
+ v-model="member.confirmDocType"
131
+ :label="$t('policyholdersRepresentative.basisDocRu')"
132
+ :readonly="isDisabled"
133
+ :clearable="!isDisabled"
134
+ :rules="$rules.required"
135
+ ></base-form-input>
136
+ <base-form-input
137
+ v-model="member.confirmDocTypeRod"
138
+ :label="$t('policyholdersRepresentative.basisDocRuParentCase')"
139
+ :readonly="isDisabled"
140
+ :clearable="!isDisabled"
141
+ :rules="$rules.required"
142
+ ></base-form-input>
143
+ <base-form-input
144
+ v-model="member.confirmDocNumber"
145
+ :label="$t('policyholdersRepresentative.numberDoc')"
146
+ :readonly="isDisabled"
147
+ :clearable="!isDisabled"
148
+ :rules="$rules.required"
149
+ ></base-form-input>
150
+ <base-form-input
151
+ v-model="member.confirmDocIssueDate"
152
+ :label="$t('form.documentDate')"
153
+ :readonly="isDisabled"
154
+ :clearable="!isDisabled"
155
+ :rules="$rules.date"
156
+ maska="##.##.####"
157
+ append-inner-icon="mdi mdi-calendar-blank-outline"
158
+ ></base-form-input>
159
+ <base-form-input
160
+ v-model="member.confirmDocExpireDate"
161
+ :label="$t('form.documentExpire')"
162
+ :readonly="isDisabled"
163
+ :clearable="!isDisabled"
164
+ :rules="$rules.date"
165
+ maska="##.##.####"
166
+ append-inner-icon="mdi mdi-calendar-blank-outline"
167
+ ></base-form-input>
168
+ <base-form-input v-model="member.migrationCard" :label="$t('policyholdersRepresentative.numberVisa')"></base-form-input>
169
+ <base-form-input
170
+ v-model="member.migrationCardIssueDate"
171
+ :label="$t('form.documentDate')"
172
+ :readonly="isDisabled"
173
+ :clearable="!isDisabled"
174
+ :rules="$rules.date"
175
+ maska="##.##.####"
176
+ append-inner-icon="mdi mdi-calendar-blank-outline"
177
+ ></base-form-input>
178
+ <base-form-input
179
+ v-model="member.migrationCardExpireDate"
180
+ :label="$t('form.documentExpire')"
181
+ :readonly="isDisabled"
182
+ :clearable="!isDisabled"
183
+ :rules="$rules.date"
184
+ maska="##.##.####"
185
+ append-inner-icon="mdi mdi-calendar-blank-outline"
186
+ ></base-form-input>
187
+ <base-form-toggle
188
+ v-model="formStore.policyholdersRepresentativeForm.isNotary"
189
+ :disabled="isDisabled"
190
+ :has-border="false"
191
+ :title="$t('policyholdersRepresentative.confirmAuthority')"
192
+ ></base-form-toggle>
193
+ <base-form-input
194
+ v-model="member.notaryLongName"
195
+ :label="$t('policyholdersRepresentative.name')"
196
+ :readonly="isDisabled"
197
+ :clearable="!isDisabled"
198
+ :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required : []"
199
+ ></base-form-input>
200
+ <base-form-input
201
+ v-model="member.notaryLicenseNumber"
202
+ :label="$t('policyholdersRepresentative.numberLicense')"
203
+ :readonly="isDisabled"
204
+ :clearable="!isDisabled"
205
+ :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required : []"
206
+ ></base-form-input>
207
+ <base-form-input
208
+ v-model="member.notaryLicenseIssuer"
209
+ :label="$t('policyholdersRepresentative.documentIssuers')"
210
+ :readonly="isDisabled"
211
+ :clearable="!isDisabled"
212
+ :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required : []"
213
+ ></base-form-input>
214
+ <base-form-input
215
+ v-model="member.notaryLicenseDate"
216
+ :label="$t('form.documentDate')"
217
+ :readonly="isDisabled"
218
+ :clearable="!isDisabled"
219
+ :rules="formStore.policyholdersRepresentativeForm.isNotary ? $rules.required.concat($rules.date) : []"
220
+ maska="##.##.####"
221
+ append-inner-icon="mdi mdi-calendar-blank-outline"
222
+ ></base-form-input>
223
+ </base-form-section>
224
+ <base-form-section :title="$t('form.jobData')" v-if="$dataStore.hasJobSection(whichForm)">
225
+ <base-form-input v-model="member.job" :label="$t('form.job')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
226
+ <base-form-input v-model="member.jobPosition" :label="$t('form.jobPosition')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
227
+ <base-form-input v-model="member.jobPlace" :label="$t('form.jobPlace')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required"></base-form-input>
228
+ </base-form-section>
229
+ <base-form-section :title="$t('form.placeRegistration')" v-if="$dataStore.hasPlaceSection(whichForm)">
230
+ <base-panel-input
231
+ v-model="member.registrationCountry"
232
+ :value="member.registrationCountry.nameRu"
233
+ :readonly="isDisabled"
234
+ :clearable="!isDisabled"
235
+ :label="$t('form.Country')"
236
+ :rules="$rules.objectRequired"
237
+ append-inner-icon="mdi mdi-chevron-right"
238
+ @append="openPanel($t('form.Country'), [], 'registrationCountry', $dataStore.getCountries)"
239
+ ></base-panel-input>
240
+ <base-fade-transition>
241
+ <div class="flex flex-col gap-[1px]" v-if="member.registrationCountry.nameRu === 'Казахстан' || member.registrationCountry.nameRu === null">
242
+ <base-panel-input
243
+ v-model="member.registrationProvince"
244
+ :value="member.registrationProvince.nameRu"
245
+ :label="$t('form.Province')"
246
+ :readonly="isDisabled"
247
+ :clearable="!isDisabled"
248
+ :rules="$rules.objectRequired"
249
+ append-inner-icon="mdi mdi-chevron-right"
250
+ @append="openPanel($t('form.Province'), [], 'registrationProvince', $dataStore.getStates, 'registrationCountry')"
251
+ ></base-panel-input>
252
+ <base-panel-input
253
+ v-model="member.registrationRegionType"
254
+ :value="member.registrationRegionType.nameRu"
255
+ :label="$t('form.RegionType')"
256
+ :readonly="isDisabled"
257
+ :clearable="!isDisabled"
258
+ :rules="$rules.objectRequired"
259
+ append-inner-icon="mdi mdi-chevron-right"
260
+ @append="openPanel($t('form.RegionType'), [], 'registrationRegionType', $dataStore.getLocalityTypes)"
261
+ ></base-panel-input>
262
+ <base-panel-input
263
+ v-if="member.registrationRegionType.nameRu !== 'город'"
264
+ v-model="member.registrationRegion"
265
+ :value="member.registrationRegion.nameRu"
266
+ :label="$t('form.Region')"
267
+ :readonly="isDisabled"
268
+ :clearable="!isDisabled"
269
+ :rules="$rules.objectRequired"
270
+ append-inner-icon="mdi mdi-chevron-right"
271
+ @append="openPanel($t('form.Region'), [], 'registrationRegion', $dataStore.getRegions, 'registrationProvince')"
272
+ ></base-panel-input>
273
+ <base-panel-input
274
+ v-model="member.registrationCity"
275
+ :value="member.registrationCity.nameRu"
276
+ :label="$t('form.City')"
277
+ :readonly="isDisabled"
278
+ :clearable="!isDisabled"
279
+ :rules="$rules.objectRequired"
280
+ append-inner-icon="mdi mdi-chevron-right"
281
+ @append="openPanel($t('form.City'), [], 'registrationCity', $dataStore.getCities, 'registrationProvince')"
282
+ ></base-panel-input>
283
+ <!-- <base-form-input v-if="$dataStore.isGons" v-model="member.postIndex" :readonly="isDisabled"
284
+ :clearable="!isDisabled" :label="$t('form.postIndex')" maska="######"></base-form-input> -->
285
+ <base-form-input v-model="member.registrationQuarter" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.Quarter')"></base-form-input>
286
+ <base-form-input v-model="member.registrationMicroDistrict" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.MicroDistrict')"></base-form-input>
287
+ <base-form-input
288
+ v-model="member.registrationStreet"
289
+ :rules="$rules.required"
290
+ :readonly="isDisabled"
291
+ :clearable="!isDisabled"
292
+ :label="$t('form.Street')"
293
+ ></base-form-input>
294
+ <base-form-input
295
+ v-model="member.registrationNumberHouse"
296
+ :rules="$rules.required"
297
+ :readonly="isDisabled"
298
+ :clearable="!isDisabled"
299
+ :label="$t('form.NumberHouse')"
300
+ ></base-form-input>
301
+ <base-form-input v-model="member.registrationNumberApartment" :readonly="isDisabled" :clearable="!isDisabled" :label="$t('form.NumberApartment')"></base-form-input>
302
+ </div>
303
+ </base-fade-transition>
304
+ </base-form-section>
305
+ <base-form-section :title="$t('form.birthData')" v-if="$dataStore.hasBirthSection(whichForm)">
306
+ <base-panel-input
307
+ v-model="member.birthPlace"
308
+ :value="member.birthPlace.nameRu"
309
+ :label="$t('form.Country')"
310
+ :readonly="isDisabled"
311
+ :clearable="!isDisabled"
312
+ :rules="$rules.objectRequired"
313
+ append-inner-icon="mdi mdi-chevron-right"
314
+ @append="openPanel($t('form.Country'), [], 'birthPlace', $dataStore.getCountries)"
315
+ ></base-panel-input>
316
+ <!-- TODO -->
317
+ <!-- <base-panel-input
318
+ v-model="member.birthRegion"
319
+ :value="member.birthRegion.nameRu"
320
+ :label="$t('form.Region')"
321
+ :readonly="isDisabled"
322
+ :clearable="!isDisabled"
323
+ :rules="$rules.objectRequired"
324
+ append-inner-icon="mdi mdi-chevron-right"
325
+ @append="openPanel($t('form.Region'), [], 'birthRegion', $dataStore.getRegions)"
326
+ ></base-panel-input> -->
327
+ </base-form-section>
328
+ <base-form-section :title="$t('form.documentData')" v-if="$dataStore.hasDocumentSection(whichForm)">
329
+ <base-panel-input
330
+ v-model="member.documentType"
331
+ :value="member.documentType.nameRu"
332
+ :label="$t('form.documentType')"
333
+ :readonly="isDisabled"
334
+ :clearable="!isDisabled"
335
+ :rules="$rules.objectRequired"
336
+ append-inner-icon="mdi mdi-chevron-right"
337
+ @append="openPanel($t('form.documentType'), [], 'documentType', $dataStore.getDocumentTypes)"
338
+ ></base-panel-input>
339
+ <base-form-input
340
+ v-model="member.documentNumber"
341
+ :label="$t('form.documentNumber')"
342
+ :readonly="isDisabled"
343
+ :clearable="!isDisabled"
344
+ :rules="$rules.required"
345
+ ></base-form-input>
346
+ <base-file-input v-if="!memberDocument" :disabled="isDisabled" :clearable="!isDisabled" @input="attachFile($event)"></base-file-input>
347
+ <base-empty-form-field v-if="memberDocument" @click="!isDisabled && openCustomPanel('document')" class="justify-between">
348
+ {{ `${memberDocument.fileTypeName} - ${memberDocument.fileName}` }}
349
+ <i class="cursor-pointer mdi mdi-file-document mr-6 text-[#a0b3d8] text-xl"></i>
350
+ </base-empty-form-field>
351
+ <base-panel-input
352
+ v-model="member.documentIssuers"
353
+ :value="member.documentIssuers.nameRu"
354
+ :label="$t('form.documentIssuers')"
355
+ :readonly="isDisabled"
356
+ :clearable="!isDisabled"
357
+ :rules="$rules.objectRequired"
358
+ append-inner-icon="mdi mdi-chevron-right"
359
+ @append="openPanel($t('form.documentIssuers'), [], 'documentIssuers', $dataStore.getDocumentIssuers)"
360
+ ></base-panel-input>
361
+ <base-form-input
362
+ v-model="member.documentDate"
363
+ :label="$t('form.documentDate')"
364
+ :readonly="isDisabled"
365
+ :clearable="!isDisabled"
366
+ :rules="$rules.required.concat($rules.date)"
367
+ maska="##.##.####"
368
+ append-inner-icon="mdi mdi-calendar-blank-outline"
369
+ ></base-form-input>
370
+ <base-fade-transition>
371
+ <base-form-input
372
+ v-if="member.documentType.ids !== 'SBI' && member.documentType.ids !== 'VNZ'"
373
+ v-model="member.documentExpire"
374
+ :label="$t('form.documentExpire')"
375
+ :readonly="isDisabled"
376
+ :clearable="!isDisabled"
377
+ :rules="$rules.required.concat($rules.date)"
378
+ maska="##.##.####"
379
+ append-inner-icon="mdi mdi-calendar-blank-outline"
380
+ ></base-form-input>
381
+ </base-fade-transition>
382
+ <base-panel-input
383
+ v-model="member.signOfResidency"
384
+ :value="member.signOfResidency.nameRu"
385
+ :label="$t('form.signOfResidency')"
386
+ :readonly="isDisabled"
387
+ :clearable="!isDisabled"
388
+ :rules="$rules.objectRequired"
389
+ append-inner-icon="mdi mdi-chevron-right"
390
+ @append="openPanel($t('form.signOfResidency'), [], 'signOfResidency', $dataStore.getResidents)"
391
+ ></base-panel-input>
392
+ <base-panel-input
393
+ v-model="member.countryOfTaxResidency"
394
+ :value="member.countryOfTaxResidency.nameRu"
395
+ :label="$t('form.countryOfTaxResidency')"
396
+ :readonly="isDisabled"
397
+ :clearable="!isDisabled"
398
+ :rules="$rules.objectRequired"
399
+ append-inner-icon="mdi mdi-chevron-right"
400
+ @append="openPanel($t('form.countryOfTaxResidency'), [], 'countryOfTaxResidency', $dataStore.getTaxCountries)"
401
+ ></base-panel-input>
402
+ <base-fade-transition>
403
+ <base-panel-input
404
+ v-if="member.countryOfTaxResidency.ids === '500014.3'"
405
+ v-model="member.addTaxResidency"
406
+ :value="member.addTaxResidency.nameRu"
407
+ :label="$t('form.addTaxResidency')"
408
+ :readonly="isDisabled"
409
+ :clearable="!isDisabled"
410
+ :rules="$rules.objectRequired"
411
+ append-inner-icon="mdi mdi-chevron-right"
412
+ @append="openPanel($t('form.addTaxResidency'), [], 'addTaxResidency', $dataStore.getAdditionalTaxCountries)"
413
+ ></base-panel-input>
414
+ </base-fade-transition>
415
+ <base-panel-input
416
+ v-model="member.signOfIPDL"
417
+ :value="member.signOfIPDL.nameRu"
418
+ :label="$t('form.signOfIPDL')"
419
+ :readonly="isDisabled"
420
+ :clearable="!isDisabled"
421
+ :rules="$rules.objectRequired"
422
+ append-inner-icon="mdi mdi-chevron-right"
423
+ @append="openPanel($t('form.signOfIPDL'), $dataStore.ipdl, 'signOfIPDL')"
424
+ ></base-panel-input>
425
+ <base-panel-input
426
+ v-model="member.countryOfCitizenship"
427
+ :value="member.countryOfCitizenship.nameRu"
428
+ :label="$t('form.countryOfCitizenship')"
429
+ :readonly="isDisabled"
430
+ :clearable="!isDisabled"
431
+ :rules="$rules.objectRequired"
432
+ append-inner-icon="mdi mdi-chevron-right"
433
+ @append="openPanel($t('form.countryOfCitizenship'), [], 'countryOfCitizenship', $dataStore.getCitizenshipCountries)"
434
+ ></base-panel-input>
435
+ <base-panel-input
436
+ v-model="member.economySectorCode"
437
+ :value="member.economySectorCode.nameRu"
438
+ :label="$t('form.economySectorCode')"
439
+ :readonly="isDisabled"
440
+ :clearable="!isDisabled"
441
+ :rules="$rules.objectRequired"
442
+ append-inner-icon="mdi mdi-chevron-right"
443
+ @append="openPanel($t('form.economySectorCode'), [], 'economySectorCode', $dataStore.getSectorCodeList)"
444
+ ></base-panel-input>
445
+ </base-form-section>
446
+ <base-form-section :title="$t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
447
+ <base-form-input
448
+ v-model="member.homePhone"
449
+ maska="+7 (7##) ### ## ##"
450
+ placeholder="+7 7"
451
+ :label="$t('form.homePhone')"
452
+ :readonly="isDisabled"
453
+ :clearable="!isDisabled"
454
+ :rules="whichForm === formStore.beneficiaryFormKey ? [] : $rules.phoneFormat"
455
+ ></base-form-input>
456
+ <base-form-input v-model.trim="member.email" :label="$t('form.email')" :rules="$rules.email"></base-form-input>
457
+ </base-form-section>
458
+ </v-form>
459
+ <base-btn v-if="!isDisabled && isTask && $dataStore.isInitiator()" :loading="isButtonLoading || isSubmittingForm" :text="$t('buttons.save')" @click="submitForm"></base-btn>
460
+ <Teleport v-if="isPanelOpen" to="#panel-actions">
461
+ <div :class="[$libStyles.scrollPage]" class="flex flex-col items-center">
462
+ <base-rounded-input v-model="searchQuery" :label="$t('labels.search')" class="w-full p-2" :hide-details="true"></base-rounded-input>
463
+ <div v-if="panelList && isPanelLoading === false" class="w-full flex flex-col gap-2 p-2">
464
+ <base-panel-select-item :text="$t('form.notChosen')" :selected="panelValue.nameRu === null" @click="pickPanelValue(new Value())"></base-panel-select-item>
465
+ <base-panel-select-item
466
+ v-for="(item, index) of panelList.filter(i => i.nameRu && (i.nameRu as string).match(new RegExp(searchQuery, 'i')))"
467
+ :key="index"
468
+ :text="item.nameRu as string"
469
+ :selected="item.nameRu === panelValue.nameRu"
470
+ @click="pickPanelValue(item)"
471
+ ></base-panel-select-item>
472
+ </div>
473
+ <base-loader v-if="isPanelLoading" class="absolute mt-10" :size="50"></base-loader>
474
+ </div>
475
+ </Teleport>
476
+ <Teleport v-if="isSearchOpen" to="#panel-actions">
477
+ <div :class="[$libStyles.flexColNav]">
478
+ <base-btn v-if="$dataStore.controls.hasGBDFL" :loading="isButtonLoading" :text="$t('buttons.fromGBDFL')" @click="getContragentFromGBDFL"></base-btn>
479
+ <base-btn v-if="$dataStore.controls.hasInsis" :loading="isButtonLoading" :text="$t('buttons.fromInsis')" @click="getContragent"></base-btn>
480
+ </div>
481
+ </Teleport>
482
+ <Teleport v-if="isDocumentOpen" to="#panel-actions">
483
+ <div :class="[$libStyles.flexColNav]">
484
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Открыть" @click="getFile('view')"></base-btn>
485
+ <base-btn :disabled="documentLoading" :loading="documentLoading" text="Скачать" @click="getFile('download')"></base-btn>
486
+ </div>
487
+ </Teleport>
488
+ </section>
489
+ </template>
490
+
491
+ <script lang="ts">
492
+ import { LocationQueryValue } from 'vue-router';
493
+ import { Value, DocumentItem } from '@/composables/classes';
494
+ import { uuid } from 'vue-uuid';
495
+
496
+ export default {
497
+ setup() {
498
+ type FileActions = 'view' | 'download';
499
+
500
+ const vForm = ref<any>();
501
+ const route = useRoute();
502
+ const router = useRouter();
503
+ const dataStore = useDataStore();
504
+ const formStore = useFormStore();
505
+ const memberStore = useMemberStore();
506
+ const getMember = (whichForm: LocationQueryValue | LocationQueryValue[], whichIndex?: LocationQueryValue | LocationQueryValue[]) =>
507
+ memberStore.getMemberFromStore(whichForm as keyof typeof formStore, Number((whichIndex ? whichIndex : '0') as string))!;
508
+ const member = ref(getMember(route.query.tab, route.query.i));
509
+ const isPanelOpen = ref<boolean>(false);
510
+ const memberDocument = ref<DocumentItem>();
511
+ const isButtonLoading = ref<boolean>(false);
512
+ const isSubmittingForm = ref<boolean>(false);
513
+ const documentLoading = ref<boolean>(false);
514
+ const isSearchOpen = ref<boolean>(false);
515
+ const isDocumentOpen = ref<boolean>(false);
516
+ const isPanelLoading = ref<boolean>(false);
517
+ const panelValue = ref<Value>(new Value());
518
+ const panelList = ref<Value[]>([]);
519
+ const currentPanel = ref<keyof typeof member.value>();
520
+ const searchQuery = ref<string>('');
521
+ const fileData = ref<{ file: any }>();
522
+
523
+ const whichForm = computed(() => route.query.tab);
524
+ const whichIndex = computed(() => route.query.i);
525
+ const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === 7);
526
+ const isDisabled = computed(() => !memberStore.isStatementEditible(whichForm.value as string));
527
+ const isTask = computed(() => route.params.taskId === '0' || dataStore.isTask());
528
+ const isIinPhoneDisabled = computed(() => formStore.applicationData && 'regNumber' in formStore.applicationData && whichForm.value === formStore.policyholderFormKey);
529
+ const isFromGBD = computed(() => !!member.value.gosPersonData);
530
+
531
+ const getOtpConditionByMember = () => {
532
+ switch (whichForm.value) {
533
+ case formStore.policyholderFormKey:
534
+ return route.params.taskId === '0';
535
+ case formStore.policyholdersRepresentativeFormKey:
536
+ return route.query.id === '0';
537
+ case formStore.insuredFormKey:
538
+ return route.query.id === '0';
539
+ case formStore.beneficiaryFormKey:
540
+ return route.query.id === '0';
541
+ case formStore.beneficialOwnerFormKey:
542
+ return route.query.id === '0';
543
+ }
544
+ };
545
+ const otpCondition = computed(() => {
546
+ // Add conditions by product
547
+ if (member.value.hasAgreement) return false;
548
+ if (!member.value.phoneNumber || (member.value.phoneNumber && member.value.phoneNumber.length !== 18)) return false;
549
+ return getOtpConditionByMember();
550
+ });
551
+
552
+ const searchMember = async () => {
553
+ if (!isDisabled.value) {
554
+ dataStore.panelAction = null;
555
+ dataStore.panel.title = 'Поиск клиента';
556
+ dataStore.panel.open = true;
557
+ isSearchOpen.value = true;
558
+ isDocumentOpen.value = false;
559
+ isPanelOpen.value = false;
560
+ } else {
561
+ dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
562
+ }
563
+ };
564
+
565
+ const openCustomPanel = (type: 'document' = 'document') => {
566
+ dataStore.panelAction = null;
567
+ if (type === 'document' && memberDocument.value) {
568
+ dataStore.panel.title = memberDocument.value.fileTypeName!;
569
+ isDocumentOpen.value = true;
570
+ isSearchOpen.value = false;
571
+ isPanelOpen.value = false;
572
+ }
573
+ dataStore.panel.open = true;
574
+ };
575
+
576
+ const openPanel = async (title: string, list: Value[], key: string, asyncFunction?: Function, filterKey?: string) => {
577
+ if (!isDisabled.value) {
578
+ isSearchOpen.value = false;
579
+ isDocumentOpen.value = false;
580
+ // Feature
581
+ // const notAllowedToChange = ['gender', 'documentType', 'documentIssuers'];
582
+ // if (member.value.gotFromInsis === false && notAllowedToChange.includes(key)) {
583
+ // dataStore.showToaster('error', 'Запрещенео менять значения этого поля');
584
+ // return;
585
+ // }
586
+ searchQuery.value = '';
587
+ currentPanel.value = key as keyof typeof member.value;
588
+ isPanelOpen.value = true;
589
+ dataStore.panelAction = null;
590
+ dataStore.panel.open = true;
591
+ dataStore.panel.title = title;
592
+
593
+ let newList = list;
594
+ if (asyncFunction) {
595
+ isPanelLoading.value = true;
596
+ newList = await asyncFunction(filterKey, member.value);
597
+ }
598
+ panelList.value = newList;
599
+ panelValue.value = member.value[currentPanel.value];
600
+ isPanelLoading.value = false;
601
+ } else {
602
+ dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
603
+ }
604
+ };
605
+
606
+ const pickPanelValue = (item: Value) => {
607
+ if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
608
+ dataStore.panel.open = false;
609
+ isPanelOpen.value = false;
610
+ // @ts-ignore
611
+ member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
612
+ } else {
613
+ dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
614
+ }
615
+ };
616
+
617
+ const uploadFile = async (processInstanceId: string | number) => {
618
+ const selectedDocument = dataStore.dicFileTypeList.find((i: Value) => i.nameRu === member.value.documentType.nameRu);
619
+ const formData = new FormData();
620
+ const information: any = [];
621
+ const uuidV4 = uuid.v4();
622
+ if (fileData.value) {
623
+ Object.values(fileData.value.file).map((value: any) => {
624
+ formData.append('file', value);
625
+ const ext = value.name.substr(value.name.lastIndexOf('.'));
626
+ information.push({
627
+ identifier: `${uuidV4}${ext}`,
628
+ iin: member.value.iin ? member.value.iin.replaceAll('-', '') : null,
629
+ processInstanceId: processInstanceId,
630
+ fileTypeCode: selectedDocument ? selectedDocument.code : null,
631
+ fileTypeId: selectedDocument ? selectedDocument.id : null,
632
+ fileName: value.name,
633
+ });
634
+ });
635
+ formData.append('fileData', JSON.stringify(information));
636
+ await dataStore.uploadFiles(formData, false);
637
+ }
638
+ };
639
+
640
+ const attachFile = (event: InputEvent) => {
641
+ if (event.target) {
642
+ fileData.value = { file: (event.target as HTMLInputElement).files };
643
+ } else {
644
+ if (event.dataTransfer) {
645
+ fileData.value = { file: (event.dataTransfer as DataTransfer).files };
646
+ }
647
+ }
648
+ };
649
+
650
+ const getFile = async (type: FileActions) => {
651
+ if (memberDocument.value) {
652
+ documentLoading.value = true;
653
+ const fileExtension = memberDocument.value.fileName!.match(/\.([0-9a-z]+)(?:[\?#]|$)/i)![1];
654
+ await dataStore.getFile(memberDocument.value, type, fileExtension);
655
+ documentLoading.value = false;
656
+ }
657
+ };
658
+
659
+ const getContragentFromGBDFL = async () => {
660
+ if (member.value.hasAgreement === false) {
661
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
662
+ return;
663
+ }
664
+ if (!member.value.iin || member.value.iin.length !== 15 || !member.value.phoneNumber || member.value.phoneNumber.length !== 18) {
665
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'Номер телефона, ИИН'), 5000);
666
+ return;
667
+ }
668
+ isButtonLoading.value = true;
669
+ await dataStore.getContragentFromGBDFL(member.value.iin, member.value.phoneNumber, whichForm.value, whichIndex.value ? Number(whichIndex.value) : null);
670
+ member.value.gotFromInsis = true;
671
+ isSearchOpen.value = false;
672
+ dataStore.panel.open = false;
673
+ isButtonLoading.value = false;
674
+ };
675
+
676
+ const getContragent = async () => {
677
+ if (member.value.hasAgreement === false) {
678
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'), 3000);
679
+ return;
680
+ }
681
+ if (!member.value.iin || member.value.iin.length !== 15) {
682
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', 'ИИН'), 5000);
683
+ return;
684
+ }
685
+ isButtonLoading.value = true;
686
+ await dataStore.getContragent(member.value, whichForm.value, whichIndex.value, false);
687
+ isSearchOpen.value = false;
688
+ dataStore.panel.open = false;
689
+ isButtonLoading.value = false;
690
+ };
691
+
692
+ const validateESBD = async (docTypeNumber: number) => {
693
+ const data = {
694
+ personType: 1,
695
+ iin: member.value.iin!.replaceAll('-', ''),
696
+ lastName: member.value.lastName,
697
+ firstName: member.value.firstName,
698
+ middleName: member.value.middleName,
699
+ birthDate: member.value.getDateByKey('birthDate'),
700
+ sex: member.value.gender.id,
701
+ docType: docTypeNumber,
702
+ docNumber: member.value.documentNumber,
703
+ docIssuedDate: member.value.getDateByKey('documentDate'),
704
+ docIssuedBy: member.value.documentIssuers.nameRu,
705
+ activityKindId: 0,
706
+ economicsSectorId: Number((member.value.economySectorCode.ids! as string).at(-1)),
707
+ resident: member.value.signOfResidency.ids === '500011.2' || member.value.signOfResidency.ids === null ? 0 : 1,
708
+ countryId: Number((member.value.countryOfTaxResidency.ids! as string).at(-1)),
709
+ };
710
+ return await dataStore.getValidateClientESBD(data);
711
+ };
712
+
713
+ const saveMember = async () => {
714
+ const hasSaved = await dataStore.saveContragent(member.value, whichForm.value, whichIndex.value, true);
715
+ if (hasSaved === false) {
716
+ dataStore.isLoading = false;
717
+ return false;
718
+ }
719
+ const isInsured = formStore.isPolicyholderInsured;
720
+ if (whichForm.value == formStore.policyholderFormKey) {
721
+ if (route.params.taskId === '0') {
722
+ try {
723
+ const taskId = await dataStore.startApplication(member.value);
724
+ if (taskId) {
725
+ await dataStore.getApplicationData(taskId, false, false, false, false);
726
+ await router.replace({
727
+ name: route.name!,
728
+ params: { taskId },
729
+ query: { ...route.query },
730
+ });
731
+ dataStore.showToaster('success', dataStore.t('toaster.successStatementCreation'));
732
+ } else {
733
+ formStore.applicationData = { processInstanceId: 0 };
734
+ return;
735
+ }
736
+ dataStore.isLoading = false;
737
+ } catch (err) {
738
+ formStore.applicationData = { processInstanceId: 0 };
739
+ dataStore.isLoading = false;
740
+ return;
741
+ }
742
+ }
743
+ if (fileData.value && fileData.value.file) {
744
+ await uploadFile(formStore.applicationData.processInstanceId);
745
+ }
746
+ }
747
+ const memberFromApplicaiton = memberStore.getMemberFromApplication(whichForm.value as keyof typeof formStore, whichIndex.value ? Number(whichIndex.value) : undefined);
748
+ const isSaved = await dataStore.saveMember(member.value, memberStore.getMemberCode(whichForm.value as keyof typeof formStore), memberFromApplicaiton);
749
+ if (!isSaved) return false;
750
+ if (whichForm.value === formStore.policyholderFormKey && isInsured === true) {
751
+ formStore.insuredForm[0] = formStore.policyholderForm;
752
+ const isInsuredSaved = await dataStore.saveMember(
753
+ member.value,
754
+ memberStore.getMemberCode(formStore.insuredFormKey as keyof typeof formStore),
755
+ memberStore.getMemberFromApplication(formStore.insuredFormKey as keyof typeof formStore, formStore.insuredFormIndex),
756
+ );
757
+ if (!isInsuredSaved) return false;
758
+ }
759
+ await router.replace({
760
+ name: route.name!,
761
+ query: { ...route.query, id: member.value.id },
762
+ });
763
+ await dataStore.getApplicationData(route.params.taskId, false, false, false, false);
764
+ if (dataStore.controls.hasCalculator) {
765
+ if (dataStore.additionalInsuranceTermsWithout && dataStore.additionalInsuranceTermsWithout.length !== 0) {
766
+ dataStore.additionalInsuranceTerms.forEach((term: any) => {
767
+ const defaultTerm = dataStore.additionalInsuranceTermsWithout.find((i: any) => i.coverTypeId === term.coverTypeId);
768
+ if (defaultTerm) {
769
+ term.coverSumName = defaultTerm.coverSumName;
770
+ term.coverSumId = defaultTerm.coverSumId;
771
+ }
772
+ });
773
+ }
774
+ }
775
+ dataStore.showToaster('success', dataStore.t('toaster.successSaved'));
776
+ dataStore.isLoading = false;
777
+ window.scrollTo({ top: 0, behavior: 'smooth' });
778
+ };
779
+
780
+ const submitForm = async () => {
781
+ if (member.value.hasAgreement === false) {
782
+ dataStore.showToaster('error', dataStore.t('toaster.needAgreement'));
783
+ return;
784
+ }
785
+ await vForm.value.validate().then(async (v: { valid: Boolean; errors: any }) => {
786
+ if (v.valid) {
787
+ isSubmittingForm.value = true;
788
+ const docType = member.value.documentType.ids;
789
+ if (member.value.gotFromInsis === true && (docType === '1UDL' || docType === 'SBI')) {
790
+ dataStore.isLoading = true;
791
+ const ESBDResponse = await validateESBD(docType === '1UDL' ? 1 : 3);
792
+ if (!ESBDResponse) {
793
+ dataStore.isLoading = false;
794
+ return;
795
+ }
796
+ const initialPoint = `${member.value.iin!.replaceAll('-', '')}.`;
797
+ const RESPONSE = ESBDMessage(ESBDResponse, initialPoint);
798
+ let errorMessage = RESPONSE !== false ? RESPONSE : 'Что-то произошло не так';
799
+ if (ESBDResponse.errorCode === 0) {
800
+ member.value.verifyType = 'ESBD';
801
+ member.value.verifyDate = ESBDResponse.verifiedDate;
802
+ const hasMemberSaved = await saveMember();
803
+ } else {
804
+ dataStore.isLoading = false;
805
+ dataStore.showToaster('error', errorMessage, 5000);
806
+ }
807
+ } else {
808
+ member.value.gotFromInsis = true;
809
+ const hasMemberSaved = await saveMember();
810
+ }
811
+ isSubmittingForm.value = false;
812
+ } else {
813
+ const errors = document.querySelector('.v-input--error');
814
+ if (errors) {
815
+ const errorText = errors.querySelector('.v-label.v-field-label');
816
+ if (errorText) {
817
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', errorText.innerHTML?.replace(/[-<>!//.]/g, '')));
818
+ } else {
819
+ const errorFieldText = errors.querySelector('.v-input__control');
820
+ if (errorFieldText) {
821
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', errorFieldText.innerHTML?.replace(/[-<>!//.]/g, '')));
822
+ }
823
+ }
824
+ errors.scrollIntoView({
825
+ behavior: 'smooth',
826
+ block: 'center',
827
+ inline: 'nearest',
828
+ });
829
+ }
830
+ }
831
+ });
832
+ };
833
+
834
+ const checkOtp = async () => {
835
+ if (!member.value.otpCode || member.value.iin?.length !== 15 || member.value.phoneNumber?.length !== 18) {
836
+ dataStore.showToaster('error', dataStore.t('toaster.errorFormField').replace('{text}', dataStore.t('form.otpCode')), 3000);
837
+ return;
838
+ }
839
+ const checked = await memberStore.checkOtp(member.value);
840
+ if (typeof checked !== 'undefined') {
841
+ member.value.hasAgreement = checked;
842
+ }
843
+ };
844
+
845
+ const sendOtp = async (onInit = false) => {
846
+ const response = await memberStore.sendOtp(member.value, formStore.applicationData.processInstanceId, onInit);
847
+ if (response) {
848
+ if (member.value.hasAgreement === null) member.value.hasAgreement = response.otpStatus;
849
+ }
850
+ };
851
+
852
+ const onInit = async () => {
853
+ if (route.params.taskId === '0' || (route.params.taskId !== '0' && dataStore.isProcessEditable(formStore.applicationData.statusCode))) {
854
+ await dataStore.getSignedDocList(formStore.applicationData.processInstanceId);
855
+ }
856
+ if (getOtpConditionByMember()) {
857
+ await sendOtp(true);
858
+ } else {
859
+ if (member.value.hasAgreement === null) member.value.hasAgreement = true;
860
+ }
861
+ if (route.query.id !== '0' && !member.value.id) {
862
+ await dataStore.getContragentById(route.query.id, whichForm.value, true);
863
+ }
864
+ if (member.value.id && route.query.id === '0') {
865
+ await router.replace({
866
+ name: route.name!,
867
+ query: { ...route.query, id: member.value.id },
868
+ });
869
+ }
870
+ if (member.value.id) {
871
+ const filteredDocuments: DocumentItem[] = dataStore.getFilesByIIN(member.value.iin!.replace(/-/g, '')) as DocumentItem[];
872
+ if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
873
+ }
874
+ };
875
+
876
+ onMounted(async () => {
877
+ await onInit();
878
+ });
879
+
880
+ onBeforeRouteUpdate(to => {
881
+ if ('tab' in to.query && to.query.tab !== 'productConditions') {
882
+ member.value = getMember(to.query.tab, to.query.i);
883
+ }
884
+ });
885
+
886
+ watch(
887
+ () => member.value.percentageOfPayoutAmount,
888
+ val => {
889
+ if (val) {
890
+ if (val < 0) {
891
+ member.value.percentageOfPayoutAmount = 0;
892
+ dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
893
+ } else if (val > 100) {
894
+ member.value.percentageOfPayoutAmount = 100;
895
+ dataStore.showToaster('error', dataStore.t('toaster.incorrectInput'), 1000);
896
+ }
897
+ }
898
+ },
899
+ );
900
+
901
+ watch(
902
+ () => member.value.birthDate,
903
+ val => {
904
+ if (val && val.length === 10) {
905
+ const calculatedAge = member.value.getAgeByBirthDate();
906
+ if (calculatedAge) member.value.age = calculatedAge;
907
+ }
908
+ },
909
+ );
910
+
911
+ watch(
912
+ () => member.value.otpCode,
913
+ async () => {
914
+ if (member.value.otpCode && member.value.otpCode.length === 7) {
915
+ await checkOtp();
916
+ }
917
+ },
918
+ );
919
+
920
+ watch(
921
+ () => dataStore.panel.open,
922
+ () => {
923
+ if (dataStore.panel.open === false) {
924
+ isPanelOpen.value = false;
925
+ isDocumentOpen.value = false;
926
+ isSearchOpen.value = false;
927
+ dataStore.panelAction = null;
928
+ }
929
+ },
930
+ { immediate: true },
931
+ );
932
+
933
+ watch(searchQuery, () => {
934
+ if (searchQuery.value === null) {
935
+ searchQuery.value = '';
936
+ }
937
+ });
938
+
939
+ return {
940
+ // State
941
+ vForm,
942
+ formStore,
943
+ memberStore,
944
+ member,
945
+ isPanelOpen,
946
+ isSearchOpen,
947
+ isDocumentOpen,
948
+ isPanelLoading,
949
+ isButtonLoading,
950
+ isSubmittingForm,
951
+ documentLoading,
952
+ panelValue,
953
+ panelList,
954
+ searchQuery,
955
+ Value,
956
+ memberDocument,
957
+
958
+ // Computed
959
+ whichForm,
960
+ whichIndex,
961
+ otpCondition,
962
+ hasOtp,
963
+ isDisabled,
964
+ isTask,
965
+ isIinPhoneDisabled,
966
+ isFromGBD,
967
+
968
+ // Functions
969
+ searchMember,
970
+ openPanel,
971
+ openCustomPanel,
972
+ pickPanelValue,
973
+ submitForm,
974
+ checkOtp,
975
+ sendOtp,
976
+ getContragentFromGBDFL,
977
+ getContragent,
978
+ attachFile,
979
+ getFile,
980
+ };
981
+ },
982
+ };
983
+ </script>