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)); } }
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()); }
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); } }