public void AccessToDeletedTask()
        {
            Clean();

            var certificateSource = CreateRealSourceForSupplier(supplier);
            var serialNumber      = Path.GetRandomFileName();
            var catalog           = TestCatalogProduct.Queryable.First();
            var product           = TestProduct.Queryable.First(p => p.CatalogProduct == catalog);

            var documentLine = CreateBodyLine(serialNumber, product);

            var realDocumentLine = Document.Find(documentLine.Waybill.Id).Lines[0];

            var task = new CertificateTask(certificateSource, realDocumentLine);

            task.Save();

            Assert.That(task.Id, Is.GreaterThan(0));
            task.Delete();

            Assert.That(task.Id, Is.GreaterThan(0));
            Assert.That(task.CertificateSource, Is.Not.Null);
            Assert.That(task.CatalogProduct, Is.Not.Null);
            Assert.That(task.SerialNumber, Is.Not.Null.Or.Empty);

            var deletedTask = CertificateTask.Queryable.FirstOrDefault(t => t.Id == task.Id);

            Assert.That(deletedTask, Is.Null);
            Assert.That(task.SerialNumber, Is.Not.Null.Or.Empty);
        }
Example #2
0
        private void OnTaskError(CertificateTask task, Exception exception)
        {
            var errorInfo = FindError(task, exception);

            if (errorInfo.NeedSendError())
            {
                _logger.ErrorFormat("Ошибка при обработки задачи для сертификата {0} : {1}", task, exception);
            }
            else
            {
                _logger.WarnFormat("Ошибка при обработки задачи для сертификата {0} : {1}", task, exception);
            }
            using (new TransactionScope()) {
                task.DocumentLine.CertificateError = exception.ToString();
                ActiveRecordMediator.Save(task.DocumentLine);
                task.Delete();
            }
        }
Example #3
0
        private void CreateCertificate(CertificateTask task, ICertificateSource source, IEnumerable <CertificateFile> files)
        {
            var savedFiles = new List <CertificateFile>();

            using (var transaction = new TransactionScope(OnDispose.Rollback)) {
                var certificate = Certificate.Queryable.FirstOrDefault(
                    c => c.CatalogProduct.Id == task.CatalogProduct.Id && c.SerialNumber == task.SerialNumber);

                if (certificate == null)
                {
                    certificate = new Certificate {
                        CatalogProduct = task.CatalogProduct,
                        SerialNumber   = task.SerialNumber
                    };
                    _logger.DebugFormat("При обработке задачи {0} будет создан сертификат", task);
                }
                else
                {
                    _logger.DebugFormat("При обработке задачи {0} будет использоваться сертификат c Id:{1}", task, certificate.Id);
                }

                foreach (var file in files)
                {
                    file.CertificateSource = task.CertificateSource;
                    var exist = Find(file) ?? file;
                    certificate.NewFile(exist);
                    if (exist != file)
                    {
                        exist.LocalFile = file.LocalFile;
                        _logger.DebugFormat("При обработке задачи {0} будет использоваться файл сертификата {1}", task, exist);
                    }
                    else
                    {
                        _logger.DebugFormat("При обработке задачи {0} будет создан файл сертификата {1}", task, exist);
                    }
                    savedFiles.Add(exist);
                }

                certificate.Save();

                task.Delete();

                var session = ActiveRecordMediator.GetSessionFactoryHolder().CreateSession(typeof(ActiveRecordBase));
                try {
                    session.CreateSQLQuery(@"
	update
		documents.Certificates c,
		catalogs.Products p,
		documents.DocumentBodies db
	set
		db.CertificateId = c.Id
	where
		c.Id = :certificateId
		and p.CatalogId = c.catalogId
		and db.ProductId is not null
		and db.SerialNumber is not null
		and db.ProductId = p.Id
		and db.SerialNumber = :serialNumber
		and db.CertificateId is null;
		"        )
                    .SetParameter("certificateId", certificate.Id)
                    .SetParameter("serialNumber", task.DocumentLine.SerialNumber)
                    .ExecuteUpdate();
                }
                finally {
                    ActiveRecordMediator.GetSessionFactoryHolder().ReleaseSession(session);
                }

                transaction.VoteCommit();
            }


            foreach (var file in savedFiles)
            {
                var fileName     = file.RemoteFile;
                var fullFileName = Path.Combine(Settings.Default.CertificatePath, fileName);

                try {
                    if (File.Exists(fullFileName))
                    {
                        File.Delete(fullFileName);
                        _logger.InfoFormat(
                            "Будет произведено обновление файла сертификата {0} с Id {1} для сертификата {2}",
                            file.LocalFile,
                            file.Id,
                            task);
                    }

                    File.Copy(file.LocalFile, fullFileName);
                }
                catch (Exception exception) {
                    _logger.WarnFormat(
                        "При копировании файла {0} для сертификата {1} возникла ошибка: {2}",
                        file.LocalFile,
                        task,
                        exception);
                }
            }
        }
Example #4
0
        private void ProcessTask(CertificateTask certificateTask)
        {
            var session = ActiveRecordMediator.GetSessionFactoryHolder().CreateSession(typeof(ActiveRecordBase));

            try {
                //мы можем создать дублирующиеся задачи
                //по этому одна из предыдущих задач может уже загрузить сертификаты
                //если это так то ничего делать не нужно
                session.Refresh(certificateTask.DocumentLine);
                if (certificateTask.DocumentLine.Certificate != null)
                {
                    return;
                }

                var source = DetectSource(certificateTask);

                if (source == null)
                {
                    _logger.ErrorFormat("Для задачи сертификата {0} не был найден источник", certificateTask);
                    using (new TransactionScope()) {
                        certificateTask.Delete();
                    }
                    return;
                }
                var files = source.CertificateSourceParser.GetCertificateFiles(certificateTask, session);
                if (files.Count == 0)
                {
                    _logger.WarnFormat("Для задачи сертификата {0} не были получены файлы", certificateTask);
                    using (new TransactionScope()) {
                        certificateTask.Delete();
                    }
                    return;
                }

                try {
                    CreateCertificate(certificateTask, source.CertificateSourceParser, files);
                }
                finally {
                    foreach (var certificateFileEntry in files)
                    {
                        if (File.Exists(certificateFileEntry.LocalFile))
                        {
                            try {
                                File.Delete(certificateFileEntry.LocalFile);
                            }
                            catch (Exception exception) {
                                _logger.WarnFormat(
                                    "Для задачи сертификата {0} возникла ошибка при удалении локального файла {1}: {2}",
                                    certificateTask,
                                    certificateFileEntry.LocalFile,
                                    exception);
                            }
                        }
                    }
                    var directoryName = Path.GetDirectoryName(files.Last(f => !String.IsNullOrEmpty(f.LocalFile)).LocalFile);
                    try {
                        if (!String.IsNullOrEmpty(directoryName) &&
                            Directory.Exists(directoryName) &&
                            Directory.GetDirectories(directoryName).Length == 0 &&
                            Directory.GetFiles(directoryName).Length == 0)
                        {
                            Directory.Delete(directoryName);
                        }
                    }
                    catch (Exception exception) {
                        _logger.WarnFormat(
                            "Для задачи сертификата {0} возникла ошибка при удалении локальной директории {1}: {2}",
                            certificateTask,
                            directoryName,
                            exception);
                    }
                }
            }
            finally {
                ActiveRecordMediator.GetSessionFactoryHolder().ReleaseSession(session);
            }
        }