protected bool MoveWaybill(string archFileName, string fileName, DataRow drCurrent, BaseDocumentReader documentReader)
        {
            using (var cleaner = new FileCleaner()) {
                var supplierId = Convert.ToUInt32(drCurrent[WaybillSourcesTable.colFirmCode]);
                try {
                    var addresses  = With.Connection(c => documentReader.ParseAddressIds(c, supplierId, archFileName, fileName));
                    var formatFile = documentReader.FormatOutputFile(fileName, drCurrent);

                    cleaner.Watch(fileName);
                    cleaner.Watch(formatFile);

                    foreach (var addressId in addresses)
                    {
                        var log = DocumentReceiveLog.LogNoCommit(supplierId,
                                                                 (uint)addressId,
                                                                 formatFile,
                                                                 _currentDocumentType.DocType,
                                                                 "Получен с нашего FTP");

                        _logger.InfoFormat("WaybillLanSourceHandler: обработка файла {0}", fileName);
                        documentReader.ImportDocument(log, fileName);
                        new WaybillService().Process(new[] { log }.ToList());
                    }
                }
                catch (Exception e) {
                    var message = "Не удалось отформатировать документ.\nОшибка: " + e;
                    _logger.ErrorFormat("WaybillLanSourceHandler: {0}, archfilename {1}, fileName {2}, error {3}", message, archFileName, fileName, e);
                    DocumentReceiveLog.Log(supplierId, null, fileName, _currentDocumentType.DocType, message);
                    return(false);
                }
            }

            return(true);
        }
        private void ImportData()
        {
            var helper = new FixtureHelper();

            using (var cleaner = new FileCleaner()) {
                var sampleData = helper.Run <SampleData>();
                cleaner.Watch(sampleData.Files.Select(x => x.LocalFileName).Where(x => x != null));
                helper.Run(new LoadSampleData(sampleData.Files));
            }
        }
Exemple #3
0
 public void Delete()
 {
     using (var cleaner = new FileCleaner()) {
         foreach (var mail in SelectedItems.ToArray())
         {
             Session.Delete(mail);
             mails.Remove(mail);
             Items.Value.Remove(mail);
             cleaner.Watch(mail.Attachments.Select(a => a.LocalFilename).Where(f => f != null));
         }
     }
     Items.Refresh();
 }
        public void Get_message_without_attachments()
        {
            cleaner.Watch("test.log");
            File.WriteAllText("test.log", "test");
            trash.Add(feedback);
            var result = feedback.Send().GetEnumerator();

            RunTask(result);
            var message = feedback.GetMessage();

            Assert.IsNull(feedback.ArchiveName);
            Assert.AreEqual("test.log", ZipHelper.lsZip(message.Attachments).Implode());
        }
Exemple #5
0
        public void Do_not_build_new_data_if_not_stale()
        {
            config.UpdateLifeTime = TimeSpan.FromMinutes(30);
            var job = GetJob();

            job.Completed();
            session.Save(job);
            FileHelper.Touch(tmpFiles.Watch(job.OutputFile(config)));

            var response = controller.Get(reset: true);

            Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK), $"user id = {user.Id}");
            Assert.AreEqual(job.Id, Convert.ToUInt32(response.Headers.GetValues("Request-Id").Implode()));
        }
        public override void ProcessData()
        {
            using (new SessionScope()) {
                var sources = CertificateSource.Queryable.Where(s => !s.IsDisabled).ToArray();
                foreach (var source in sources)
                {
                    var ftpSource = source.GetCertificateSource() as IRemoteFtpSource;
                    if (ftpSource == null)
                    {
                        continue;
                    }

                    try {
                        using (var cleaner = new FileCleaner()) {
                            Cleanup();
                            Ping();
                            var catalogFile = GetCatalogFile(source, cleaner);
                            if (catalogFile == null)
                            {
                                continue;
                            }
                            cleaner.Watch(catalogFile.LocalFileName);
                            Ping();
                            ImportCatalogFile(catalogFile, source, ftpSource);
                            Ping();
                            doNotSmapLogger.Forget(source.Id);
                        }
                    }
                    catch (Exception e) {
                        doNotSmapLogger.Error(
                            String.Format("Не удалось загрузить перекодировочную таблица сертификатов {0}", source.DecodeTableUrl),
                            e, source.Id);
                    }
                }
            }
        }
        public void Migrate()
        {
            var priceId    = localSession.Query <Price>().First().Id.PriceId;
            var supplierId = localSession.Query <Supplier>().First().Id;
            var addressId  = localSession.Query <Address>().First().Id;

            Directory.GetFiles(".", "*.txt").Each(File.Delete);
            FileHelper.InitDir("in\\update");
            localSession.Clear();
            DbHelper.Drop();
            using (var sanityCheck = new SanityCheck(clientConfig))
                sanityCheck.Check(true);

            using (var cleaner = new FileCleaner()) {
                var cmd = new UpdateCommand();
                cmd.Configure(settings, clientConfig);
                cmd.Process(() => {
                    cmd.Download();
                    var dir = Directory.CreateDirectory("in\\update");
                    cleaner.WatchDir(dir.FullName);
                    new DirectoryInfo(clientConfig.UpdateTmpDir).EnumerateFiles().Each(x => {
                        x.MoveTo(Path.Combine(dir.FullName, x.Name));
                    });
                    //идентфикаторы в тестовых данных
                    return(UpdateResult.OK);
                });

                cmd = new UpdateCommand();
                cmd.Configure(settings, clientConfig);
                cmd.Process(() => {
                    new DirectoryInfo("../../Assets/").EnumerateFiles().Each(x => cleaner.Watch(x.CopyTo(x.Name, true).FullName));
                    cmd.Migrate();
                    return(UpdateResult.OK);
                });
            }
            //идентификаторы не совпадают тк данные для переноса статичные, подделываем id для проверки
            localSession.CreateSQLQuery(@"
update Prices set PriceId = 7537 where PriceId = :priceId;
update Suppliers set Id = 234 where Id = :supplierId;
update Addresses set Id =  2575 where Id = :addressId")
            .SetParameter("priceId", priceId)
            .SetParameter("supplierId", supplierId)
            .SetParameter("addressId", addressId)
            .ExecuteUpdate();

            settings = localSession.Query <Settings>().First();
            Assert.IsNotNull(settings.Password);
            Assert.AreEqual(Taxation.Nds, settings.Waybills[0].Taxation);
            var map = localSession.Query <DirMap>().First(x => x.Supplier.Id == 18089);

            Assert.AreEqual(".\\Загрузка\\Предельные цены производителей", map.Dir);

            var order = localSession.Query <Order>().First();

            Assert.IsNotNull(order.Price);
            Assert.IsNotNull(order.Address);
            Assert.That(order.Lines[0].ResultCost, Is.GreaterThan(0));
            Assert.That(order.Lines[0].Producer, Is.Not.Null.Or.Empty);

            var sentOrder = localSession.Query <SentOrder>().First();

            Assert.IsNotNull(sentOrder.Price);
            Assert.IsNotNull(sentOrder.Address);
            Assert.That(sentOrder.Lines[0].ResultCost, Is.GreaterThan(0));
            Assert.That(sentOrder.Lines[0].Producer, Is.Not.Null.Or.Empty);

            var waybill = localSession.Query <Waybill>().First(x => x.Id == 39153110);

            Assert.IsNotNull(waybill.Supplier);
            Assert.IsNotNull(waybill.Address);
            var line = waybill.Lines.FirstOrDefault(x => x.SerialNumber == "10891996");

            Assert.AreEqual(35, line.MaxRetailMarkup);
            Assert.AreEqual(678.50, line.RetailCost);
            Assert.AreEqual(35, line.RetailMarkup);
            Assert.AreEqual(35, line.RealRetailMarkup);

            line = waybill.Lines.FirstOrDefault(x => x.SerialNumber == "10137353" &&
                                                x.Product.Contains("Ацетилсалициловой"));
            Assert.AreEqual(29.99m, line.RetailMarkup);
            Assert.AreEqual(70.21m, line.RealRetailMarkup);
            Assert.AreEqual(613.70m, line.RetailCost);

            line = waybill.Lines.FirstOrDefault(x => x.SerialNumber == "017022014");
            Assert.AreEqual(21.36m, line.RetailMarkup);
            Assert.AreEqual(49.99m, line.RealRetailMarkup);
            Assert.AreEqual(540.80m, line.RetailCost);

            line = waybill.Lines.FirstOrDefault(x => x.SerialNumber == "156014");
            Assert.AreEqual(77.63m, line.RetailMarkup);
            Assert.AreEqual(82.03m, line.RealRetailMarkup);
            Assert.AreEqual(500m, line.RetailCost);
        }
 protected string TempFile(string filename, string content)
 {
     cleaner.Watch(filename);
     File.WriteAllText(filename, content, Encoding.Default);
     return(filename);
 }
        /// <summary>
        /// Процедура формализации
        /// </summary>
        public void ThreadWork()
        {
            ProcessState = PriceProcessState.Begin;
            try {
                using (var cleaner = new FileCleaner())
                    using (NDC.Push($"PriceItemId = {ProcessItem.PriceItemId}")) {
                        //имя файла для копирования в директорию Base выглядит как: <PriceItemID> + <оригинальное расширение файла>
                        var outPriceFileName = Path.Combine(Settings.Default.BasePath,
                                                            ProcessItem.PriceItemId + Path.GetExtension(ProcessItem.FilePath));
                        //Используем идентификатор нитки в качестве названия временной папки
                        var tempPath = Path.GetTempPath() + TID + "\\";
                        //изменяем имя файла, что оно было без недопустимых символов ('_')
                        var tempFileName = tempPath + ProcessItem.PriceItemId + Path.GetExtension(ProcessItem.FilePath);
                        cleaner.Watch(tempFileName);
                        _logger.DebugFormat("Запущена нитка на обработку файла : {0}", ProcessItem.FilePath);

                        ProcessState = PriceProcessState.CreateTempDirectory;
                        FileHelper.InitDir(tempPath);

                        var max = 8;
                        for (var i = 1; i <= max; i++)
                        {
                            try {
                                ProcessState          = PriceProcessState.CallValidate;
                                formalizer            = PricesValidator.Validate(ProcessItem.FilePath, tempFileName, (uint)ProcessItem.PriceItemId);
                                formalizer.Downloaded = ProcessItem.Downloaded;
                                ProcessState          = PriceProcessState.CallFormalize;
                                formalizer.Formalize();
                                _log.SuccesLog(formalizer, ProcessItem.FilePath);
                                break;
                            }
                            catch (MySqlException e) {
                                if (i == max)
                                {
                                    throw;
                                }
                                //Duplicate entry '%s' for key %d
                                //всего скорее это значит что одновременно формализовался прайс-лист с такими же синонимами, нужно повторить попытку
                                _logger.Warn($"Повторяю формализацию прайс-листа попытка {i} из {max}", e);
                            }
                            catch (Exception e) {
                                var warning =
                                    (e as WarningFormalizeException) ?? (e.InnerException as WarningFormalizeException);
                                if (warning != null)
                                {
                                    _log.WarningLog(warning, warning.Message);
                                    break;
                                }
                                throw;
                            }
                        }

                        FormalizeOK  = true;
                        ProcessState = PriceProcessState.FinalCopy;
                        //Если файл не скопируется, то из Inbound он не удалиться и будет попытка формализации еще раз
                        if (File.Exists(tempFileName))
                        {
                            File.Copy(tempFileName, outPriceFileName, true);
                        }
                        else
                        {
                            File.Copy(ProcessItem.FilePath, outPriceFileName, true);
                        }
                        var ft = DateTime.UtcNow;
                        File.SetCreationTimeUtc(outPriceFileName, ft);
                        File.SetLastWriteTimeUtc(outPriceFileName, ft);
                        File.SetLastAccessTimeUtc(outPriceFileName, ft);
                    }
            }
            catch (ThreadAbortException e) {
                _logger.Warn(Settings.Default.ThreadAbortError, e);
                _log.ErrodLog(formalizer, new Exception(Settings.Default.ThreadAbortError));
            }
            catch (Exception e) {
                if (e is DbfException || e is XmlException)
                {
                    _logger.Warn("Ошибка при формализации прайс листа", e);
                }
                else
                {
                    _logger.Error("Ошибка при формализации прайс листа", e);
                }
                _log.ErrodLog(formalizer, e);
            }
            finally {
                ProcessState = PriceProcessState.FinalizeThread;
                _logger.InfoFormat("Нитка завершила работу с прайсом {0}: {1}.", ProcessItem.FilePath, DateTime.UtcNow.Subtract(StartDate));
                FormalizeEnd = true;
            }
        }
        protected override void ProcessAttachs(Mime mime, AddressList fromList)
        {
            //Один из аттачментов письма совпал с источником, иначе - письмо не распознано
            bool matched = false;

            /*
             * В накладных письма обрабатываются немного по-другому:
             * письма обрабатываются относительно адреса отправителя
             * и если такой отправитель найден в истониках, то все вложения
             * сохраняются относительно него.
             * Если он не найден, то ничего не делаем.
             */
            if (fromList == null)
            {
                _logger.Info("WaybillEmailSourceHandler: Адрес отправителя пуст");
            }
            if (fromList.Count == 0)
            {
                _logger.Info("WaybillEmailSourceHandler: Адреса в коллекции не обнаружены");
            }
            if (fromList.Mailboxes.Length == 0)
            {
                _logger.Info("WaybillEmailSourceHandler: Список адресов mailboxes пустой");
            }

            foreach (var mbFrom in fromList.Mailboxes)
            {
                var sources = dtSources.Select(String.Format("({0} like '*{1}*')",
                                                             WaybillSourcesTable.colEMailFrom, mbFrom.EmailAddress));
                // Адрес отправителя должен быть только у одного поставщика,
                // если получилось больше, то ищем поставщика, который доступен клиенту,
                // если таких нет или несколько, то это ошибка

                DataRow source;

                if (sources.Length > 1)
                {
                    source = SelectWaybillSourceForClient(sources, _addressId);
                    if (source == null)
                    {
                        _logger.Info(String.Format("WaybillEmailSourceHandler: На адрес \"{0}\"" +
                                                   "назначено несколько поставщиков. Определить какой из них работает с клиентом не удалось", mbFrom.EmailAddress));
                        throw new Exception(String.Format(
                                                "На адрес \"{0}\" назначено несколько поставщиков. Определить какой из них работает с клиентом не удалось", mbFrom.EmailAddress));
                    }
                }
                else if (sources.Length == 0)
                {
                    var addition = dtSources.Rows == null ? "В строках источников находится null" : String.Format("Количество записей в источниках - {0}", dtSources.Rows.Count);
                    _logger.Info(String.Format("WaybillEmailSourceHandler: Не найдено записи в источниках, соответствующей адресу {0}. {1}", mbFrom.EmailAddress, addition));
                    if (dtSources.Rows != null && dtSources.Rows.Count > 0)
                    {
                        var count1 = dtSources.Select(String.Format("({0} like '*{1}*')",
                                                                    WaybillSourcesTable.colEMailFrom, mbFrom.EmailAddress)).Length;
                        var count2 = dtSources.Select(String.Format("({0} like '%{1}%')",
                                                                    WaybillSourcesTable.colEMailFrom, mbFrom.EmailAddress)).Length;
                        _logger.Info(String.Format("WaybillEmailSourceHandler: Делаем попытку выбрать нужные записи иначе: " +
                                                   "количество через * - {0}, через % - {1}, исходное - {2}", count1, count2, sources.Count()));
                    }
                    continue;
                }
                else
                {
                    source = sources.Single();
                }

                var attachments = mime.GetValidAttachements();
                if (!attachments.Any())
                {
                    _logger.Info(String.Format("WaybillEmailSourceHandler: Отсутствуют вложения в письме от адреса {0}", mbFrom.EmailAddress));
                }
                //двойная очистка FileCleaner и Cleanup нужно оставить только одно
                //думаю Cleaner подходит лучше
                using (var cleaner = new FileCleaner()) {
                    var savedFiles = new List <string>();
                    foreach (var entity in attachments)
                    {
                        SaveAttachement(entity);
                        var correctArchive = FileHelper.ProcessArchiveIfNeeded(CurrFileName, ExtrDirSuffix);
                        matched = true;
                        if (!correctArchive)
                        {
                            DocumentReceiveLog.Log(Convert.ToUInt32(source[WaybillSourcesTable.colFirmCode]),
                                                   _addressId,
                                                   Path.GetFileName(CurrFileName),
                                                   _currentDocumentType.DocType,
                                                   "Не удалось распаковать файл",
                                                   IMAPHandler.CurrentUID);
                            Cleanup();
                            continue;
                        }
                        if (ArchiveHelper.IsArchive(CurrFileName))
                        {
                            var files = Directory.GetFiles(CurrFileName + ExtrDirSuffix +
                                                           Path.DirectorySeparatorChar, "*.*", SearchOption.AllDirectories);
                            savedFiles.AddRange(files);
                            cleaner.Watch(files);
                        }
                        else
                        {
                            savedFiles.Add(CurrFileName);
                            cleaner.Watch(CurrFileName);
                        }
                    }
                    var logs = ProcessWaybillFile(savedFiles, source);

                    var service = new WaybillService();
                    service.Process(logs);
                    if (service.Exceptions.Count > 0)
                    {
                        SendErrorLetterToSupplier(service.Exceptions.First(), mime);
                    }
                }
                Cleanup();
                source.Delete();
                dtSources.AcceptChanges();
            }             //foreach (MailboxAddress mbFrom in FromList.Mailboxes)

            if (!matched)
            {
                throw new EmailFromUnregistredMail(
                          "Для данного E-mail не найден источник в таблице documents.waybill_sources",
                          Settings.Default.ResponseDocSubjectTemplateOnUnknownProvider,
                          Settings.Default.ResponseDocBodyTemplateOnUnknownProvider);
            }
        }