private static void AddExternalSignatureInfoToBlock(StateBlock signingBlock, Sungero.Domain.Shared.ISignature signature, int?versionNumber, IOfficialDocument document) { var subject = Docflow.PublicFunctions.Module.GetSignatureCertificate(signature.GetDataSignature()).SubjectName.Format(true); var parsedSubject = ParseSignatureSubject(subject); signingBlock.AddLabel(ApprovalReviewAssignments.Resources.SignatureBlockFormat(parsedSubject.JobTitle, Docflow.Server.ModuleFunctions.GetCertificateOwnerShortName(parsedSubject), parsedSubject.OrganizationName, parsedSubject.TIN), Functions.Module.CreateHeaderStyle()); signingBlock.AddLineBreak(); signingBlock.AddLabel(Constants.Module.SeparatorText, Docflow.PublicFunctions.Module.CreateSeparatorStyle()); signingBlock.AddLineBreak(); var exchangeServiceName = GetOriginalExchangeServiceNameByDocument(document); signingBlock.AddLabel(ApprovalReviewAssignments.Resources.DocumentSignedByCounterpartyIsExchangeServiceNoteFormat(exchangeServiceName), Docflow.PublicFunctions.Module.CreateNoteStyle()); var number = versionNumber.HasValue ? versionNumber.Value.ToString() : string.Empty; var numberLabel = string.Format("{0} {1}", ApprovalReviewAssignments.Resources.StateViewVersion, number); Functions.Module.AddInfoToRightContent(signingBlock, numberLabel, Docflow.PublicFunctions.Module.CreateNoteStyle()); // Добавить информацию о валидности подписи. AddValidationInfoToBlock(signingBlock, signature); // Установить иконку. signingBlock.AssignIcon(Docflow.ApprovalReviewAssignments.Resources.ExternalSignatureIcon, StateBlockIconSize.Small); signingBlock.DockType = DockType.Bottom; }
private static void SetIconToBlock(StateBlock signingBlock, Sungero.Domain.Shared.ISignature signature) { if (signature.IsValid) { if (signature.SignatureType == Core.SignatureType.Approval) { signingBlock.AssignIcon(ApprovalTasks.Resources.Sign, StateBlockIconSize.Small); } else { signingBlock.AssignIcon(ApprovalTasks.Resources.Approve, StateBlockIconSize.Small); } } else { if (signature.ValidationErrors.Any(e => e.ErrorType == Sungero.Domain.Shared.SignatureValidationErrorType.Signature)) { signingBlock.AssignIcon(ApprovalReviewAssignments.Resources.SignatureAttributeChanged, StateBlockIconSize.Small); } else { signingBlock.AssignIcon(ApprovalReviewAssignments.Resources.SignedDataChanged, StateBlockIconSize.Small); } } }
private static void AddSignatureInfoToBlock(StateBlock signingBlock, Sungero.Domain.Shared.ISignature signature, int?versionNumber) { // Добавить подписавшего. var signatory = Sungero.Company.Employees.As(signature.Signatory); if (signatory != null) { signingBlock.AddLabel(string.Format("{0} {1}", signatory.JobTitle, Company.PublicFunctions.Employee.GetShortName(signatory, false)), Functions.Module.CreateHeaderStyle()); } else { signingBlock.AddLabel(signature.Signatory.Name, Functions.Module.CreateHeaderStyle()); } // Добавить дату подписания. var signDate = signature.SigningDate.FromUtcTime().ToUserTime(); signingBlock.AddLabel(string.Format("{0}: {1}", OfficialDocuments.Resources.StateViewDate.ToString(), Functions.Module.ToShortDateShortTime(signDate)), Functions.Module.CreatePerformerDeadlineStyle()); // Добавить замещаемого. var substitutedUser = GetSubstitutedEmployee(signature); if (!string.IsNullOrEmpty(substitutedUser)) { signingBlock.AddLineBreak(); signingBlock.AddLabel(substitutedUser); } // Добавить комментарий пользователя. var comment = GetSignatureComment(signature); if (!string.IsNullOrEmpty(comment)) { signingBlock.AddLineBreak(); signingBlock.AddLabel(Constants.Module.SeparatorText, Docflow.PublicFunctions.Module.CreateSeparatorStyle()); signingBlock.AddLineBreak(); var commentStyle = Functions.Module.CreateNoteStyle(); signingBlock.AddLabel(comment, commentStyle); } // Добавить номер версии документа. var number = versionNumber.HasValue ? versionNumber.Value.ToString() : string.Empty; var numberLabel = string.Format("{0} {1}", ApprovalReviewAssignments.Resources.StateViewVersion, number); Functions.Module.AddInfoToRightContent(signingBlock, numberLabel, Docflow.PublicFunctions.Module.CreateNoteStyle()); // Добавить информацию о валидности подписи. AddValidationInfoToBlock(signingBlock, signature); // Установить иконку. SetIconToBlock(signingBlock, signature); }
private static void AddValidationInfoToBlock(StateBlock block, Sungero.Domain.Shared.ISignature signature) { var redTextStyle = Functions.Module.CreateStyle(Sungero.Core.Colors.Common.Red); var greenTextStyle = Functions.Module.CreateStyle(Sungero.Core.Colors.Common.Green); var separator = ". "; var errorValidationText = string.Empty; var validationInfo = GetValidationInfo(signature); if (validationInfo.IsInvalidCertificate) { errorValidationText += ApprovalReviewAssignments.Resources.StateViewCertificateIsNotValid + separator; } if (validationInfo.IsInvalidData) { errorValidationText += ApprovalReviewAssignments.Resources.StateViewDocumentIsChanged + separator; } if (validationInfo.IsInvalidAttributes) { errorValidationText += ApprovalReviewAssignments.Resources.StateViewSignatureAttributesNotValid + separator; } // Если нет ошибок - выйти. if (string.IsNullOrWhiteSpace(errorValidationText)) { return; } block.AddLineBreak(); block.AddLabel(errorValidationText, redTextStyle); // Для подписи с невалидными атрибутами добавить информацию, что тело небыло изменено. if (validationInfo.IsInvalidAttributes && !validationInfo.IsInvalidData) { var trueValidationText = ApprovalReviewAssignments.Resources.StateViewDocumentIsValid + separator; block.AddLabel(trueValidationText, greenTextStyle); } }
private static string GetSignatureComment(Sungero.Domain.Shared.ISignature signature) { if (string.IsNullOrEmpty(signature.Comment)) { return(string.Empty); } var comment = signature.Comment; // Взять первые 2 строки комментария. // TODO Убрать укорачивание комментария после исправления 33192, 33195, 33196. Или укорачивать по-другому. var linesCount = comment.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Length; if (linesCount > 2) { var strings = comment.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); comment = string.Join(Environment.NewLine, strings, 0, 2); comment += "…"; } return(comment); }
private static string GetSubstitutedEmployee(Sungero.Domain.Shared.ISignature signature) { var substituted = Sungero.Company.Employees.As(signature.SubstitutedUser); if (substituted == null) { return(string.Empty); } var jobTitle = Company.PublicFunctions.Employee.GetJobTitle(substituted, DeclensionCase.Accusative); // TODO: 35010. if (System.Threading.Thread.CurrentThread.CurrentUICulture.Equals(System.Globalization.CultureInfo.CreateSpecificCulture("ru-RU"))) { jobTitle = jobTitle.ToLower(); } jobTitle = string.IsNullOrEmpty(jobTitle) ? jobTitle : string.Format("{0} ", jobTitle); return(string.Format("{0} {1}{2}", ApprovalReviewAssignments.Resources.StateViewSubstitutedUser, jobTitle, Company.PublicFunctions.Employee.GetShortName(substituted, DeclensionCase.Accusative, false))); }
/// <summary> /// Получить ошибки валидации подписи. /// </summary> /// <param name="signature">Электронная подпись.</param> /// <returns>Ошибки валидации подписи.</returns> public static Structures.ApprovalTask.SignatureValidationErrors GetValidationInfo(Sungero.Domain.Shared.ISignature signature) { var validationErrors = Structures.ApprovalTask.SignatureValidationErrors.Create(false, false, false); if (signature.IsValid) { return(validationErrors); } // Проверить, действителен ли сертификат. validationErrors.IsInvalidCertificate = signature.ValidationErrors.Any(e => e.ErrorType == Sungero.Domain.Shared.SignatureValidationErrorType.Certificate); // Проверить, были ли изменены подписываемые данные. validationErrors.IsInvalidData = signature.ValidationErrors.Any(e => e.ErrorType == Sungero.Domain.Shared.SignatureValidationErrorType.Data); // Проверить, были ли изменены атрибуты подписи. validationErrors.IsInvalidAttributes = signature.ValidationErrors.Any(e => e.ErrorType == Sungero.Domain.Shared.SignatureValidationErrorType.Signature); return(validationErrors); }