From ec74511af7d05d375bea6d37a7727d95b05bc953 Mon Sep 17 00:00:00 2001 From: Mikhail Privalov Date: Thu, 16 Nov 2023 00:52:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=9E=D0=93=D0=A0=D0=9D=20(#3215)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l2-frontend/src/pages/EDS.vue | 17 ++++++++++++++++- l2-frontend/src/ui-cards/EDSDocument.vue | 17 ++++++++++++++++- l2-frontend/src/ui-cards/EDSSigner.vue | 24 +++++++++++++++++++++--- l2-frontend/src/utils.ts | 6 ++++++ 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/l2-frontend/src/pages/EDS.vue b/l2-frontend/src/pages/EDS.vue index b1d2db6fae..bde2576ddb 100644 --- a/l2-frontend/src/pages/EDS.vue +++ b/l2-frontend/src/pages/EDS.vue @@ -390,7 +390,7 @@ import usersPoint from '@/api/user-point'; import RadioFieldById from '@/fields/RadioFieldById.vue'; import DateFieldNav2 from '@/fields/DateFieldNav2.vue'; import EDSDirection from '@/ui-cards/EDSDirection.vue'; -import { convertSubjectNameToTitle } from '@/utils'; +import { convertSubjectNameToTitle, subjectNameHasOGRN } from '@/utils'; const MODES = [ { id: 'mo', label: 'Подписи медицинской организации' }, @@ -515,6 +515,16 @@ export default class EDS extends Vue { signingProcess: any; + get noOGRN() { + const cert = this.certificates.find(c => c.thumbprint === this.selectedCertificate); + + if (!cert) { + return false; + } + + return !subjectNameHasOGRN(null, cert.subjectName); + } + get accessToMO() { return (this.$store.getters.user_data.groups || []).includes('ЭЦП Медицинской организации'); } @@ -682,6 +692,11 @@ export default class EDS extends Vue { } async listSign() { + if (this.noOGRN && this.selectedSignatureMode === 'Медицинская организация') { + this.$error('Отсутствует ОГРН в сертификате'); + return; + } + if (this.signingProcess.active) { return; } diff --git a/l2-frontend/src/ui-cards/EDSDocument.vue b/l2-frontend/src/ui-cards/EDSDocument.vue index 1a322cbc2f..0c96e1c16f 100644 --- a/l2-frontend/src/ui-cards/EDSDocument.vue +++ b/l2-frontend/src/ui-cards/EDSDocument.vue @@ -129,7 +129,7 @@ v-else class="btn btn-default" href="#" - @click="sendToVI" + @click.prevent="sendToVI" > Отправить в ВИМИС @@ -166,6 +166,10 @@ export default { type: Number, required: true, }, + noOGRN: { + type: Boolean, + required: false, + }, }, data() { return { @@ -208,6 +212,13 @@ export default { ok() { return this.emptySignatures.length === 0; }, + invalidMessage() { + if (!this.noOGRN || this.selectedSignatureMode !== 'Медицинская организация') { + return null; + } + + return 'Отсутствует ОГРН в сертификате'; + }, }, watch: { emptyAllowedSignatures: { @@ -265,6 +276,10 @@ export default { this.$root.$emit('eds:reload-document', this.direction); }, async addSign(fast = false) { + if (this.invalidMessage) { + this.$error(this.invalidMessage); + return; + } if (!fast) { try { await this.$dialog.confirm( diff --git a/l2-frontend/src/ui-cards/EDSSigner.vue b/l2-frontend/src/ui-cards/EDSSigner.vue index 70923675db..f4108e3f05 100644 --- a/l2-frontend/src/ui-cards/EDSSigner.vue +++ b/l2-frontend/src/ui-cards/EDSSigner.vue @@ -60,6 +60,7 @@ :thumbprint="selectedCertificate" :direction="directionPk" :executors="executors" + :no-o-g-r-n="noOGRN" />
Подписать все вложения @@ -92,10 +94,10 @@
-

{{ message }}

+

{{ message || invalidMessage }}

@@ -106,7 +108,7 @@ import moment from 'moment'; import { debounce } from 'lodash/function'; import * as actions from '@/store/action-types'; -import { convertSubjectNameToTitle } from '@/utils'; +import { convertSubjectNameToTitle, subjectNameHasOGRN } from '@/utils'; import EDSDocument from './EDSDocument.vue'; @@ -178,6 +180,22 @@ export default { return Object.keys(r); }, + noOGRN() { + const cert = this.certificates.find(c => c.thumbprint === this.selectedCertificate); + + if (!cert) { + return false; + } + + return !subjectNameHasOGRN(null, cert.subjectName); + }, + invalidMessage() { + if (!this.noOGRN || this.selectedSignatureMode !== 'Медицинская организация') { + return null; + } + + return 'Отсутствует ОГРН в сертификате'; + }, }, watch: { commonRoles: { diff --git a/l2-frontend/src/utils.ts b/l2-frontend/src/utils.ts index 4226306bf7..7358e0a29c 100644 --- a/l2-frontend/src/utils.ts +++ b/l2-frontend/src/utils.ts @@ -371,6 +371,12 @@ export const convertSubjectNameToTitle = (object: any, subjectName: string | nul return [obj.SN, obj.G, obj.SNILS, obj.T].filter(Boolean).join(' '); }; +export const subjectNameHasOGRN = (object: any, subjectName: string | null) => { + const obj = object || convertSubjectNameToCertObject(subjectName); + + return String(obj['ОГРН'] || '').length === 13; +}; + export const validateEmail = (email: string) => Boolean( String(email || '') .toLowerCase()