Beispiel #1
0
        public virtual IBlobPackage PrepareDcsPackage(string senderLineName, string instanceInfosXmlPath,
                                                      string deviceInfoXmlPath, string inputFilesXmlPath,
                                                      string packageFolderPath)
        {
            Logger.Debug("Begin of prepare package from DCS to Ario...");

            // Получить основную информацию о пакете документов из DCS.
            var blobPackage = Functions.BlobPackage.Remote.CreateBlobPackage();

            blobPackage.SenderLine = senderLineName;
            if (this.GetSourceType(deviceInfoXmlPath) == Constants.Module.CaptureSourceType.Mail)
            {
                blobPackage.SourceType = BlobPackage.SourceType.Mail;
                this.FillMailInfo(blobPackage, instanceInfosXmlPath);
            }
            else
            {
                blobPackage.SourceType = BlobPackage.SourceType.Folder;
            }
            blobPackage.PackageFolderPath = packageFolderPath;

            blobPackage = this.FillBlobs(blobPackage, inputFilesXmlPath, packageFolderPath);
            if (!blobPackage.Blobs.Any() && blobPackage.MailBodyBlob == null)
            {
                throw AppliedCodeException.Create(Resources.EmptyScanPackage);
            }

            blobPackage.Save();

            Logger.Debug("Captured Package Process. Package preparation completed successfully.");

            return(blobPackage);
        }
Beispiel #2
0
        public virtual IBlobPackage FillBlobs(IBlobPackage blobPackage, string inputFilesXmlPath,
                                              string packageFolderPath)
        {
            if (!File.Exists(inputFilesXmlPath))
            {
                throw AppliedCodeException.Create(Resources.NoFilesInfoInPackage);
            }
            var fileDescriptionTagName = Constants.Module.DcsInputFilesTagNames.FileDescription;

            var filesXDoc    = System.Xml.Linq.XDocument.Load(inputFilesXmlPath);
            var fileElements = filesXDoc
                               .Element(Constants.Module.DcsInputFilesTagNames.InputFilesSection)
                               .Element(Constants.Module.DcsInputFilesTagNames.Files)
                               .Elements()
                               .ToList();

            if (!fileElements.Any())
            {
                throw AppliedCodeException.Create(Resources.NoFilesInfoInPackage);
            }

            var sentByEmail = blobPackage.SourceType == BlobPackage.SourceType.Mail;

            if (sentByEmail)
            {
                var mailBodyHtmlName = Constants.Module.DcsMailBodyName.Html;
                var mailBodyTxtName  = Constants.Module.DcsMailBodyName.Txt;

                // Тело письма.
                blobPackage.MailBodyBlob = this.GetMailBody(fileElements, packageFolderPath);

                // Фильтрация картинок из тела письма.
                var htmlBodyElement = fileElements
                                      .FirstOrDefault(x => string.Equals(x.Element(fileDescriptionTagName).Value, mailBodyHtmlName, StringComparison.InvariantCultureIgnoreCase));
                var hasHtmlBody = htmlBodyElement != null;

                // Убрать тело письма (body.html или body.txt).
                fileElements = fileElements
                               .Where(x => !string.Equals(x.Element(fileDescriptionTagName).Value, mailBodyHtmlName, StringComparison.InvariantCultureIgnoreCase) &&
                                      !string.Equals(x.Element(fileDescriptionTagName).Value, mailBodyTxtName, StringComparison.InvariantCultureIgnoreCase))
                               .ToList();

                if (blobPackage.MailBodyBlob != null && !string.IsNullOrEmpty(blobPackage.MailBodyBlob.FilePath) && hasHtmlBody)
                {
                    fileElements = this.FilterEmailBodyInlineImages(blobPackage.MailBodyBlob.FilePath, fileElements);
                }
            }

            // Получить файлы пакета документов из DCS.
            foreach (var fileElement in fileElements)
            {
                var blob = this.CreateBlobFromXelement(fileElement, packageFolderPath, sentByEmail);
                if (blob != null)
                {
                    blobPackage.Blobs.AddNew().Blob = blob;
                }
            }

            return(blobPackage);
        }
Beispiel #3
0
 public virtual void MilestonesDeleted(Sungero.Domain.Shared.CollectionPropertyDeletedEventArgs e)
 {
     if (_deleted.IsCompleted.Value)
     {
         throw AppliedCodeException.Create(ContractualDocuments.Resources.CannotDeleteCompleteContractMilestone);
     }
 }
 public override void BeforeSave(Sungero.Domain.BeforeSaveEventArgs e)
 {
     if (PersonalSettings.GetAll(s => Equals(s.Employee, _obj.Employee) && !Equals(s, _obj)).Any())
     {
         throw AppliedCodeException.Create(PersonalSettings.Resources.CantCreateMoreSetting);
     }
 }
Beispiel #5
0
 public override void BeforeDelete(Sungero.Domain.BeforeDeleteEventArgs e)
 {
     if (!Functions.Module.IsAllExternalEntityLinksDeleted(_obj))
     {
         throw AppliedCodeException.Create(Commons.Resources.HasLinkedExternalEntities);
     }
 }
Beispiel #6
0
        public virtual Docflow.IAccountingDocumentBase ImportFormalizedDocument(Docflow.Structures.Module.IByteArray xml, bool requireFtsId)
        {
            var importResult = Functions.Module.Remote.ImportFormalizedDocument(xml, requireFtsId);

            if (!importResult.IsSuccess)
            {
                throw AppliedCodeException.Create(importResult.Error);
            }

            var document = importResult.Document;

            // Вызвать обработчик изменения свойства, чтобы создалась связь с корректируемым документом
            // (с сервера несохранённые связи не передаются для оптимизации).
            if (ClientApplication.ApplicationType == ApplicationType.Desktop)
            {
                document.Corrected = document.Corrected;
            }

            var memory       = new System.IO.MemoryStream(importResult.Body);
            var publicMemory = new System.IO.MemoryStream(importResult.PublicBody);

            var version = document.LastVersion;

            version.Body.Write(memory);
            version.PublicBody.Write(publicMemory);

            return(document);
        }
        public virtual void GenerateDefaultAnswer(Company.IEmployee signatory, bool isAgent)
        {
            IPowerOfAttorney signatoryPowerOfAttorney = null;
            IPowerOfAttorney consigneePowerOfAttorney = null;
            var signatoryOtherReason = string.Empty;

            var signaturesSettings                   = Functions.OfficialDocument.GetSignatureSettings(_obj, signatory);
            var signaturesSettingWithDuties          = signaturesSettings.Where(o => Equals(o.Reason, Docflow.SignatureSetting.Reason.Duties)).FirstOrDefault();
            var signaturesSettingWithPowerOfAttorney = signaturesSettings.Where(o => Equals(o.Reason, Docflow.SignatureSetting.Reason.PowerOfAttorney)).FirstOrDefault();
            var signaturesSettingWithOtherDocument   = signaturesSettings.Where(o => Equals(o.Reason, Docflow.SignatureSetting.Reason.Other)).FirstOrDefault();

            if (signaturesSettingWithDuties == null && _obj.FormalizedServiceType != FormalizedServiceType.Waybill)
            {
                if (signaturesSettingWithPowerOfAttorney != null)
                {
                    signatoryPowerOfAttorney = Docflow.PowerOfAttorneys.As(signaturesSettingWithPowerOfAttorney.Document);
                }
                else if (signaturesSettingWithOtherDocument != null)
                {
                    signatoryOtherReason = signaturesSettingWithOtherDocument.DocumentInfo;
                }
            }

            var errorlist = Functions.AccountingDocumentBase.TitleDialogValidationErrors(_obj, signatory, null, signatoryPowerOfAttorney,
                                                                                         consigneePowerOfAttorney, signatoryOtherReason, null);
            var validationText = string.Join(Environment.NewLine, errorlist.Select(l => l.Text));

            if (errorlist.Any())
            {
                throw AppliedCodeException.Create(validationText);
            }

            // У УКД доступен только вариант "ответственный за оформление".
            var authority = Docflow.AccountingDocumentBases.Resources.PropertiesFillingDialog_HasAuthority_DealAndRegister;

            if (_obj.FormalizedServiceType == Docflow.AccountingDocumentBase.FormalizedServiceType.GeneralTransfer && _obj.IsAdjustment == true)
            {
                authority = Docflow.AccountingDocumentBases.Resources.PropertiesFillingDialog_HasAuthority_Register;
            }

            var basis      = SignatureSettings.Info.Properties.Reason.GetLocalizedValue(Docflow.SignatureSetting.Reason.Duties);
            var buyerTitle = Docflow.Structures.AccountingDocumentBase.BuyerTitle.Create();

            buyerTitle.ActOfDisagreement        = string.Empty;
            buyerTitle.Signatory                = signatory;
            buyerTitle.SignatoryPowersBase      = basis;
            buyerTitle.Consignee                = null;
            buyerTitle.ConsigneePowersBase      = string.Empty;
            buyerTitle.SignResult               = true;
            buyerTitle.SignatoryPowers          = authority;
            buyerTitle.AcceptanceDate           = Calendar.Now;
            buyerTitle.SignatoryPowerOfAttorney = signatoryPowerOfAttorney;
            buyerTitle.SignatoryOtherReason     = signatoryOtherReason;
            buyerTitle.ConsigneePowerOfAttorney = consigneePowerOfAttorney;
            buyerTitle.ConsigneeOtherReason     = null;

            this.GenerateAnswer(buyerTitle, isAgent);
        }
        public virtual void ValidateSenderLineSettingExisting(string senderLineName)
        {
            var senderLineSetting = _obj.CaptureSources
                                    .Where(x => x.SenderLineName.Trim() == senderLineName.Trim())
                                    .FirstOrDefault();

            if (senderLineSetting == null)
            {
                throw AppliedCodeException.Create(SmartProcessingSettings.Resources.NotFoundSenderLineNameFormat(senderLineName));
            }
        }
Beispiel #9
0
 public virtual void ResolutionGroupAdded(Sungero.Workflow.Interfaces.AttachmentAddedEventArgs e)
 {
     // В качестве проектов резолюции нельзя отправить поручения-непроекты.
     if (_obj.ResolutionGroup.ActionItemExecutionTasks.Any(a => a.IsDraftResolution != true))
     {
         foreach (var actionItem in _obj.ResolutionGroup.ActionItemExecutionTasks.Where(a => a.IsDraftResolution != true))
         {
             _obj.ResolutionGroup.ActionItemExecutionTasks.Remove(actionItem);
         }
         throw AppliedCodeException.Create(DocumentReviewTasks.Resources.FindNotDraftResolution);
     }
 }
        public virtual void TrackingDeleted(Sungero.Domain.Shared.CollectionPropertyDeletedEventArgs e)
        {
            if (_deleted.State.Properties.ReturnDate.OriginalValue.HasValue)
            {
                throw AppliedCodeException.Create(Docflow.Resources.CantDeleteReturnedTracking);
            }

            if (_deleted.Action == Docflow.OfficialDocumentTracking.Action.Endorsement)
            {
                throw AppliedCodeException.Create(Docflow.Resources.CantDeleteAutomaticallyTracking);
            }
        }
        public override void VersionsAdded(Sungero.Domain.Shared.CollectionPropertyAddedEventArgs e)
        {
            // Формирование имени документа при добавлении версии.
            if (_obj.State.IsInserted && !_obj.State.IsCopied &&
                _obj.DocumentKind != null && _obj.DocumentKind.GenerateDocumentName == true &&
                !_obj.Name.Equals(Resources.DocumentNameAutotext))
            {
                // Если версия документа создается из шаблона, то не заполнять Содержание.
                if (string.IsNullOrEmpty(_obj.Subject) && !e.Params.Contains(Constants.Module.CreateFromTemplate))
                {
                    _obj.Subject = _obj.Name;
                }
                else
                {
                    Functions.OfficialDocument.FillName(_obj);
                }
            }

            // Сбрасываем статус согл. с КА при создании новой версии документа из МКДО.
            if (_obj.ExternalApprovalState != null && _obj.ExchangeState != null)
            {
                _obj.ExternalApprovalState = null;
            }

            // Сбрасываем статус эл. обмена при создании новой версии.
            if (_obj.ExchangeState != null)
            {
                // Версии можно создавать и при заблокированной карточке, а в таком случае сохранить эту карточку нельзя.
                var lockInfo = Locks.GetLockInfo(_obj);
                if (lockInfo != null && lockInfo.IsLockedByOther)
                {
                    throw AppliedCodeException.Create(lockInfo.LockedMessage);
                }

                _obj.ExchangeState = null;
            }

            var storage = _obj.Storage ?? Functions.Module.GetStorageByPolicies(_obj);

            if (storage != null)
            {
                if (!Equals(_added.Body.Storage, storage))
                {
                    _added.Body.SetStorage(storage);
                }

                if (!Equals(_added.PublicBody.Storage, storage))
                {
                    _added.PublicBody.SetStorage(storage);
                }
            }
        }
        public virtual void GenerateDefaultSellerTitle(Sungero.Company.IEmployee signatory)
        {
            // Основание: Должностные обязанности.
            var powerBase = SignatureSettings.Info.Properties.Reason.GetLocalizedValue(Docflow.SignatureSetting.Reason.Duties);
            // Полномочия: Лицо, совершившее сделку и отв. за оформление.
            var power = Docflow.AccountingDocumentBases.Resources.PropertiesFillingDialog_HasAuthority_DealAndRegister;

            // Для УКД: Лицо, ответственное за оформление свершившегося события.
            if (_obj.FormalizedServiceType == Docflow.AccountingDocumentBase.FormalizedServiceType.GeneralTransfer && _obj.IsAdjustment == true)
            {
                power = Docflow.AccountingDocumentBases.Resources.PropertiesFillingDialog_HasAuthority_Register;
            }
            // Доверенность.
            IPowerOfAttorney signatoryPowerOfAttorney = null;
            // Другой документ.
            var signatoryOtherReason = string.Empty;

            var signaturesSettings                   = Functions.OfficialDocument.GetSignatureSettings(_obj, signatory);
            var signaturesSettingWithDuties          = signaturesSettings.Where(o => Equals(o.Reason, Docflow.SignatureSetting.Reason.Duties)).FirstOrDefault();
            var signaturesSettingWithPowerOfAttorney = signaturesSettings.Where(o => Equals(o.Reason, Docflow.SignatureSetting.Reason.PowerOfAttorney)).FirstOrDefault();
            var signaturesSettingWithOtherDocument   = signaturesSettings.Where(o => Equals(o.Reason, Docflow.SignatureSetting.Reason.Other)).FirstOrDefault();

            if (signaturesSettingWithDuties == null && _obj.FormalizedServiceType != FormalizedServiceType.Waybill)
            {
                if (signaturesSettingWithPowerOfAttorney != null)
                {
                    signatoryPowerOfAttorney = Docflow.PowerOfAttorneys.As(signaturesSettingWithPowerOfAttorney.Document);
                }
                else if (signaturesSettingWithOtherDocument != null)
                {
                    signatoryOtherReason = signaturesSettingWithOtherDocument.DocumentInfo;
                }
            }

            var errorlist = Functions.AccountingDocumentBase.TitleDialogValidationErrors(_obj, signatory, null,
                                                                                         signatoryPowerOfAttorney, null,
                                                                                         signatoryOtherReason, null);
            var validationText = string.Join(Environment.NewLine, errorlist.Select(l => l.Text));

            if (errorlist.Any())
            {
                throw AppliedCodeException.Create(validationText);
            }

            var sellerTitle = Docflow.Structures.AccountingDocumentBase.SellerTitle
                              .Create(signatory, powerBase, power, signatoryPowerOfAttorney, signatoryOtherReason);

            Functions.AccountingDocumentBase.GenerateSellerTitle(_obj, sellerTitle);
        }
Beispiel #13
0
        public virtual string GetSourceType(string deviceInfoXmlPath)
        {
            if (!File.Exists(deviceInfoXmlPath))
            {
                throw AppliedCodeException.Create(Resources.NoFilesInfoInPackage);
            }

            var filesXDoc = System.Xml.Linq.XDocument.Load(deviceInfoXmlPath);
            var element   = filesXDoc.Element(Constants.Module.DcsDeviceInfoTagNames.MailSourceInfo);

            if (element != null)
            {
                return(Constants.Module.CaptureSourceType.Mail);
            }
            return(Constants.Module.CaptureSourceType.Folder);
        }
Beispiel #14
0
        public virtual void ValidateSettings(string senderLineName, string instanceInfosXmlPath,
                                             string deviceInfoXmlPath, string inputFilesXmlPath,
                                             string packageFolderPath)
        {
            // Проверить общие настройки.
            var smartProcessingSettings = Sungero.Docflow.PublicFunctions.SmartProcessingSetting.GetSettings();

            if (smartProcessingSettings == null)
            {
                throw AppliedCodeException.Create(Resources.SmartProcessingSettingsNotFound);
            }
            Sungero.Docflow.PublicFunctions.SmartProcessingSetting.ValidateSettings(smartProcessingSettings);
            Logger.Debug("Validate settings. Smart processing settings validation completed successfully.");

            // Проверить, что линия настроена и для нее есть ответственный.
            Logger.DebugFormat("Validate settings. Sender line name: {0}", senderLineName);
            Sungero.Docflow.PublicFunctions.SmartProcessingSetting.ValidateSenderLineSettingExisting(smartProcessingSettings, senderLineName);
            Logger.Debug("Validate settings. Sender line setting validation completed successfully.");
        }
        /// <summary>
        /// Задать основные настройки захвата.
        /// </summary>
        /// <param name="arioUrl">Адрес Арио.</param>
        /// <param name="lowerConfidenceLimit">Нижняя граница доверия извлеченным фактам.</param>
        /// <param name="upperConfidenceLimit">Верхняя граница доверия извлеченным фактам.</param>
        /// <param name="firstPageClassifierName">Имя классификатора первых страниц.</param>
        /// <param name="typeClassifierName">Имя классификатора по типам документов.</param>
        public static void SetSettings(string arioUrl, string lowerConfidenceLimit, string upperConfidenceLimit,
                                       string firstPageClassifierName, string typeClassifierName)
        {
            var message = Functions.SmartProcessingSetting.Remote.SetSettings(arioUrl, lowerConfidenceLimit, upperConfidenceLimit,
                                                                              firstPageClassifierName, typeClassifierName);

            if (message != null)
            {
                if (message.Type == MessageTypes.Warning)
                {
                    Logger.Debug(message.Text);
                }

                if (message.Type == MessageTypes.Error || message.Type == MessageTypes.SoftError)
                {
                    throw AppliedCodeException.Create(message.Text);
                }
            }
        }
Beispiel #16
0
        /// <summary>
        /// Сгенерировать ФНС-ид (и связанные свойства) для документа.
        /// </summary>
        /// <param name="stream">Поток с XML в исходном виде.</param>
        /// <param name="rootBox">Ящик, через который будет отправлен документ.</param>
        /// <param name="counterparty">Контрагент.</param>
        /// <param name="formalizedServiceType">Тип документа (УПД, ДПТ, ДПРР).</param>
        /// <param name="isAdjustment">Корректировочный (важно только для УКД).</param>
        /// <returns>Сгенерированный XML новым потоком.</returns>
        private static System.IO.MemoryStream AddOrReplaceSellerTitleInfo(System.IO.MemoryStream stream, ExchangeCore.IBusinessUnitBox rootBox,
                                                                          Parties.ICounterparty counterparty, Sungero.Core.Enumeration formalizedServiceType,
                                                                          bool isAdjustment)
        {
            var counterpartyExchange = counterparty.ExchangeBoxes.SingleOrDefault(c => Equals(c.Box, rootBox));

            if (counterpartyExchange == null)
            {
                throw AppliedCodeException.Create(string.Format("Counterparty {0} must have exchange from box {1}", counterparty.Id, rootBox.Id));
            }

            var sellerTitleInfo = new FormalizeDocumentsParser.SellerTitleInfo();

            if (formalizedServiceType == Docflow.AccountingDocumentBase.FormalizedServiceType.GoodsTransfer)
            {
                sellerTitleInfo.DocumentType = FormalizeDocumentsParser.DocumentType.GoodsTransferDocument;
            }
            else if (formalizedServiceType == Docflow.AccountingDocumentBase.FormalizedServiceType.WorksTransfer)
            {
                sellerTitleInfo.DocumentType = FormalizeDocumentsParser.DocumentType.WorksTransferDocument;
            }
            else if (formalizedServiceType == Docflow.AccountingDocumentBase.FormalizedServiceType.GeneralTransfer)
            {
                sellerTitleInfo.DocumentType = isAdjustment ? FormalizeDocumentsParser.DocumentType.UniversalCorrectionTransferDocument : FormalizeDocumentsParser.DocumentType.UniversalTransferDocument;
            }

            if (rootBox.ExchangeService.ExchangeProvider == ExchangeCore.ExchangeService.ExchangeProvider.Diadoc)
            {
                sellerTitleInfo.Operator = FormalizeDocumentsParser.SupportedEdoOperators.Diadoc;
            }
            else
            {
                sellerTitleInfo.Operator = FormalizeDocumentsParser.SupportedEdoOperators.Synerdocs;
            }
            sellerTitleInfo.Receiver = counterpartyExchange.FtsId;
            sellerTitleInfo.Sender   = rootBox.FtsId;
            return(sellerTitleInfo.AddOrReplaceToXml(stream));
        }
        public virtual void ValidateSettings()
        {
            var arioUrlValidationMessage = Functions.SmartProcessingSetting.ValidateArioUrl(_obj);

            if (arioUrlValidationMessage != null)
            {
                throw AppliedCodeException.Create(arioUrlValidationMessage.Text);
            }

            var classifiersValidationMessage = Functions.SmartProcessingSetting.ValidateClassifiers(_obj);

            if (classifiersValidationMessage != null)
            {
                if (classifiersValidationMessage.Type == MessageTypes.Warning)
                {
                    Logger.Debug(classifiersValidationMessage.Text);
                }
                else
                {
                    throw AppliedCodeException.Create(classifiersValidationMessage.Text);
                }
            }
        }
Beispiel #18
0
        public virtual void SignAndSendDeliveryConfirmation()
        {
            var userBoxes = ExchangeCore.PublicFunctions.BusinessUnitBox.Remote
                            .GetConnectedBoxes()
                            .Where(b => b.CertificateReceiptNotifications != null && Equals(b.CertificateReceiptNotifications.Owner, Users.Current))
                            .ToList();

            if (!userBoxes.Any())
            {
                var error = Resources.SendDeliveryConfirmationBoxesNotFoundFormat(Users.Current.Name);
                throw AppliedCodeException.Create(error);
            }

            var aggregate = new List <Exception>();

            foreach (var box in userBoxes)
            {
                try
                {
                    var error = this.SendDeliveryConfirmation(box, box.CertificateReceiptNotifications, true);
                    if (!string.IsNullOrWhiteSpace(error))
                    {
                        aggregate.Add(AppliedCodeException.Create(error));
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error(ReceiptNotificationSendingTasks.Resources.ReceiptNotificationAssignmentError, ex);
                    aggregate.Add(ex);
                }
            }
            if (aggregate.Any())
            {
                var result = aggregate.Count == 1 ? aggregate.Single() : new AggregateException(aggregate);
                throw result;
            }
        }
 public override void BeforeDelete(Sungero.Domain.BeforeDeleteEventArgs e)
 {
     throw AppliedCodeException.Create(Docflow.Resources.DeleteSettingsException);
 }
 public override void BeforeDelete(Sungero.Domain.BeforeDeleteEventArgs e)
 {
     throw AppliedCodeException.Create(PersonalSettings.Resources.CantDeleteSetting);
 }
Beispiel #21
0
        public virtual void FillMailInfo(IBlobPackage blobPackage, string instanceInfosXmlPath)
        {
            if (!File.Exists(instanceInfosXmlPath))
            {
                throw AppliedCodeException.Create(Resources.FileNotFoundFormat(instanceInfosXmlPath));
            }

            var infoXDoc = System.Xml.Linq.XDocument.Load(instanceInfosXmlPath);

            if (infoXDoc == null)
            {
                return;
            }

            var mailCaptureInstanceInfoElement = infoXDoc
                                                 .Element(DcsInstanceInfosTagNames.CaptureInstanceInfoList)
                                                 .Element(DcsInstanceInfosTagNames.MailCaptureInstanceInfo);

            if (mailCaptureInstanceInfoElement == null)
            {
                return;
            }

            // Тема письма.
            var subject = this.GetAttributeStringValue(mailCaptureInstanceInfoElement, DcsInstanceInfosTagNames.Subject);

            if (subject.Length > blobPackage.Info.Properties.Subject.Length)
            {
                subject = subject.Substring(0, blobPackage.Info.Properties.Subject.Length);
            }
            blobPackage.Subject = subject;

            // Отправитель.
            var fromElement = mailCaptureInstanceInfoElement.Element(DcsInstanceInfosTagNames.From);

            if (fromElement != null)
            {
                blobPackage.FromAddress = this.GetAttributeStringValue(fromElement, DcsInstanceInfosTagNames.ContactAttributes.Address);
                blobPackage.FromName    = this.GetAttributeStringValue(fromElement, DcsInstanceInfosTagNames.ContactAttributes.Name);
            }

            // Получатели.
            var mailToElement = mailCaptureInstanceInfoElement.Element(DcsInstanceInfosTagNames.To);

            if (mailToElement != null)
            {
                var recipients = mailToElement.Elements(DcsInstanceInfosTagNames.Recipient);
                foreach (var recipient in recipients)
                {
                    var mailToRecipient = blobPackage.To.AddNew();
                    mailToRecipient.Name    = this.GetAttributeStringValue(recipient, DcsInstanceInfosTagNames.ContactAttributes.Name);
                    mailToRecipient.Address = this.GetAttributeStringValue(recipient, DcsInstanceInfosTagNames.ContactAttributes.Address);
                }
            }

            // Получатели копии.
            var copyElement = mailCaptureInstanceInfoElement.Element(DcsInstanceInfosTagNames.CC);

            if (copyElement != null)
            {
                var recipients = copyElement.Elements(DcsInstanceInfosTagNames.Recipient);
                foreach (var recipient in recipients)
                {
                    var copyRecipient = blobPackage.CC.AddNew();
                    copyRecipient.Name    = this.GetAttributeStringValue(recipient, DcsInstanceInfosTagNames.ContactAttributes.Name);
                    copyRecipient.Address = this.GetAttributeStringValue(recipient, DcsInstanceInfosTagNames.ContactAttributes.Address);
                }
            }

            blobPackage.Save();
        }