/// <summary> /// Парсер для формата файла TXT и OTK /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { //пропускаем первую строку и начинаем считывание reader.ReadLine(); string line; while ((line = reader.ReadLine()) != null) { var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); var splat = line.Trim().Split(new[] { "\t" }, StringSplitOptions.None); //по причине того,что есть файлы без поля кода товара if (splat.Count() <= 2) { rejectLine.Product = splat[0].Replace("|", ""); rejectLine.Ordered = NullableConvert.ToUInt32(splat[1]); var splat2 = NullableConvert.ToUInt32(splat[1]); rejectLine.Rejected = splat2 != null ? splat2.Value : 0; } else { rejectLine.Product = splat[1]; rejectLine.Code = splat[0]; rejectLine.Ordered = NullableConvert.ToUInt32(splat[2]); var rejected = NullableConvert.ToUInt32(splat[2]); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } } }
/// <summary> /// Парсер для формата файла DBF /// </summary> protected void ParseDBF(RejectHeader reject, string filename) { DataTable data; try { data = Dbf.Load(filename); } catch (Exception e) { var err = string.Format("Не удалось получить файл с отказами '{0}' для лога документа {1}", filename, reject.Log.Id); Logger.Warn(err, e); return; } for (var i = 0; i < data.Rows.Count; i++) { var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); rejectLine.Product = data.Rows[i][10].ToString(); rejectLine.Code = data.Rows[i][9].ToString(); rejectLine.Cost = NullableConvert.ToDecimal(data.Rows[i][13].ToString()); rejectLine.Ordered = NullableConvert.ToUInt32(data.Rows[i][14].ToString()); var rejected = NullableConvert.ToUInt32(data.Rows[i][15].ToString()); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } }
public Document Parse(string file, Document document) { var xdocument = XDocument.Load(file); document.ProviderDocumentId = xdocument.XPathSelectElement("Документы/Документ").Attribute("НомерДокумента")?.Value; document.DocumentDate = NullableConvert.ToDateTime(xdocument.XPathSelectElement("Документы/Документ").Attribute("ДатаДокумента")?.Value); foreach (var element in xdocument.XPathSelectElements("Документы/Документ/СтрокаДокумента")) { var line = document.NewLine(); line.Product = (string)element.Attribute("НоменклатураНаименованиеПолное"); line.Producer = (string)element.Attribute("Производитель"); line.Country = (string)element.Attribute("Страна"); line.Period = (string)element.Attribute("СрокГодностиДата"); line.RegistryCost = NullableConvert.ToDecimal(element.Attribute("ЦенаЗарегистрированная")?.Value); line.Certificates = (string)element.Attribute("Сертификат"); line.CertificateAuthority = (string)element.Attribute("СертификатОрган"); line.CertificatesDate = (string)element.Attribute("СертификатДатаНачала"); line.CertificatesEndDate = NullableConvert.ToDateTime(element.Attribute("СертификатДатаОкончания")?.Value); line.EAN13 = NullableConvert.ToUInt64((string)element.Attribute("Штрихкод")); line.SupplierCostWithoutNDS = decimal.Parse((string)element.Attribute("ЦенаЗакупкиБезНДС")); line.ProducerCostWithoutNDS = decimal.Parse((string)element.Attribute("ЦенаПроизводителяБезНДС")); line.RetailCost = NullableConvert.ToDecimal(element.Attribute("ЦенаРозничная")?.Value); line.SerialNumber = (string)element.Attribute("Серия"); line.Quantity = (uint?)element.Attribute("Количество"); line.VitallyImportant = element.Attribute("ЖНВП")?.Value == "Да"; line.Nds = NullableConvert.ToUInt32(element.Attribute("СтавкаНДС")?.Value.Replace("%", "")); document.Lines.Add(line); } return(document); }
public Document Parse(string file, Document document) { using (var reader = new StreamReader(file, Encoding.UTF8)) { string line; while ((line = reader.ReadLine()) != null) { var parts = line.Split('|'); if (parts.Length < 16) { continue; } if (String.IsNullOrEmpty(document.ProviderDocumentId)) { document.ProviderDocumentId = parts[3]; document.DocumentDate = NullableConvert.ToDateTime(parts[4]); } var docLine = document.NewLine(); docLine.Code = parts[5]; docLine.Product = parts[6]; docLine.Quantity = NullableConvert.ToUInt32(parts[7]); docLine.SupplierCost = NullableConvert.ToDecimal(parts[8]); docLine.SupplierCostWithoutNDS = NullableConvert.ToDecimal(parts[9]); docLine.Nds = NullableConvert.ToUInt32(parts[10]); docLine.NdsAmount = NullableConvert.ToDecimal(parts[11]); docLine.Amount = NullableConvert.ToDecimal(parts[12]); docLine.Certificates = parts[13]; docLine.Producer = parts[14]; } } return(document); }
/// <summary> /// Парсер для формата файла TXT /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding("Utf-8"))) { string line; var rejectFound = false; //Читаем, пока не кончатся строки в файле while ((line = reader.ReadLine()) != null) { var fields = line.Split(';'); if (fields[0].Trim() == "Код") { rejectFound = true; continue; } //Если мы еще не дошли до места с которого начинаются отказы, то продолжаем if (!rejectFound) { continue; } //Если мы дошли до этого места, значит все что осталось в файле - это строки с отказами fields = line.Trim().Split(';'); var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); rejectLine.Code = fields[0].Trim(); rejectLine.Product = fields[1].Trim(); rejectLine.Ordered = NullableConvert.ToUInt32(fields[2].Trim()); var rejected = NullableConvert.ToUInt32(fields[3].Trim()); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
public void Attach(DataGrid grid) { var keydown = Observable.FromEventPattern <KeyEventArgs>(grid, "KeyDown"); var textInput = Observable.FromEventPattern <TextCompositionEventArgs>(grid, "TextInput"); var lastEdit = DateTime.MinValue; var edit = textInput .Where(e => NullableConvert.ToUInt32(e.EventArgs.Text) != null && grid.SelectedItem != null) .Do(e => e.EventArgs.Handled = true) .Select(e => new Func <string, string>(v => { var text = e.EventArgs.Text; var now = DateTime.Now; if ((now - lastEdit) > inputInterval) { return(text); } else { return(v + text); } })); var backspace = keydown.Where(e => e.EventArgs.Key == Key.Back && grid.SelectedItem != null) .Do(e => e.EventArgs.Handled = true) .Select(e => new Func <string, string>(v => v.Slice(0, -2))); var delete = keydown.Where(e => e.EventArgs.Key == Key.Delete && grid.SelectedItem != null) .Do(e => e.EventArgs.Handled = true) .Select(e => new Func <string, string>(v => "")); var updated = edit.Merge(backspace).Merge(delete); updated.Subscribe(a => { UpdateValue(grid, a); lastEdit = DateTime.Now; }); //игнорировать события до тех пор пока не произошло событие редактирования //когда произошло взять одно событие и повторить, фактически это state machine //которая генерирует событие OfferCommitted только если было событие редактирования updated.Throttle(commitInterval, scheduler) .Merge(Observable.FromEventPattern <EventArgs>(grid, "CurrentCellChanged").Select(e => e.Sender)) .Merge(Observable.FromEventPattern <RoutedEventArgs>(grid, "Unloaded").Select(e => e.Sender)) .SkipUntil(updated) .Take(1) .Repeat() .ObserveOn(scheduler) .Subscribe(e => { lastEdit = DateTime.MinValue; var editor = GetEditor(grid); if (editor != null) { editor.Committed(); } else { ViewModelHelper.InvokeDataContext(grid, "OfferCommitted"); } }); }
/// <summary> /// Парсер для формата файла TXT /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; while ((line = reader.ReadLine()) != null) { if (line != "") { var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); var splat = line.Trim().Split(' '); var splatCountLast = splat.Count() - 1; var splatLast = splat[splatCountLast]; splat[splatCountLast] = ""; var product = String.Join(" ", splat, 0, splat.Count()); rejectLine.Product = product.Trim(); var ordered = splatLast.Split('>'); rejectLine.Ordered = NullableConvert.ToUInt32(ordered[0].Replace("-", "")); var received = NullableConvert.ToUInt32(ordered[1]); var rejected = rejectLine.Ordered - received; rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } } }
public void Build_report_with_ShareMoreThan() { // вторая аптека заказала у этого поставщика var order2 = CreateOrder(null, supplier); session.Save(order2); // вторая аптека заказала у другого поставщика в 199 раз больше - доля 0.5% var order3 = CreateOrder(order2.Client); order3.Items[0].Cost *= 199; session.Save(order3); Property("Type", 0); Property("ShareMoreThan", "0.5", "PERCENT"); var rep = ReadReport <SupplierMarketShareByUser>(); var rows = rep.Rows().ToArray(); var firstClient = rows.First(r => r.GetCell(2) != null && r.GetCell(2).StringCellValue == order.Client.Users[0].Id.ToString()); // доля поставщика в заказах первой аптеки 100% Assert.AreEqual(100, NullableConvert.ToDecimal(firstClient.GetCell(3).StringCellValue)); // второй аптеки нет в отчете var secondClient = rows.FirstOrDefault(r => r.GetCell(2) != null && r.GetCell(2).StringCellValue == order2.Client.Users[0].Id.ToString()); Assert.IsNull(secondClient); var result = ToText(rep); Assert.That(result, Does.Contain("Из отчета ИСКЛЮЧЕНЫ юр. лица, клиенты, адреса, по которым доля НЕ превышает 0,5%")); }
/// <summary> /// Парсер для формата файла TXT /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; while ((line = reader.ReadLine()) != null) { if (line.Contains("Заказали")) { rejectFound = true; continue; } if (line == "") { rejectFound = false; } if (!rejectFound) { continue; } var rejectLine = new RejectLine(); var fields = line.Split('\t'); reject.Lines.Add(rejectLine); rejectLine.Code = fields[0]; rejectLine.Product = fields[5]; rejectLine.Ordered = NullableConvert.ToUInt32(fields[1]); var rejected = NullableConvert.ToUInt32(fields[3]); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
/// <summary> /// Парсер для формата файла TXT /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; while ((line = reader.ReadLine()) != null) { if (line.Contains("ИД заявки")) { rejectFound = true; reader.ReadLine(); continue; } if (line == "") { rejectFound = false; } if (!rejectFound) { continue; } var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); var splat = line.Trim().Split(':'); rejectLine.Product = splat[0].Trim(); rejectLine.Ordered = NullableConvert.ToUInt32(splat[1].Replace("-", "")); var rejected = NullableConvert.ToUInt32(splat[1]); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
public Document Parse(string file, Document document) { var xDocument = XDocument.Load(file); var header = xDocument.XPathSelectElement(@"Документ/ЗаголовокДокумента"); document.ProviderDocumentId = header.XPathSelectElement("НомерДок").Value; var docDate = (string)header.XPathSelectElement("ДатаДок"); if (!String.IsNullOrEmpty(docDate)) { document.DocumentDate = Convert.ToDateTime(docDate); } else { document.DocumentDate = DateTime.Now; } foreach (var position in xDocument.XPathSelectElements(@"Документ/ТоварныеПозиции/ТоварнаяПозиция")) { var line = document.NewLine(); line.Product = (string)position.XPathSelectElement("Товар"); line.Producer = (string)position.XPathSelectElement("Изготовитель"); line.Country = (string)position.XPathSelectElement("СтранаИзготовителя"); line.Code = (string)position.XPathSelectElement("КодТовара"); line.Quantity = ParseHelper.GetUInt((string)position.XPathSelectElement("Количество")); line.SupplierCostWithoutNDS = ParseHelper.GetDecimal((string)position.XPathSelectElement("ЦенаОпт")); line.SupplierPriceMarkup = ParseHelper.GetDecimal((string)position.XPathSelectElement("НаценОпт")); line.Certificates = (string)position.XPathSelectElement("Серии/Серия/НомерСертиф"); line.CertificatesDate = (string)position.XPathSelectElement("Серии/Серия/ДатаВыдачиСертиф"); line.CertificateAuthority = (string)position.XPathSelectElement("Серии/Серия/ОрганСертиф"); line.CertificatesEndDate = NullableConvert.ToDateTime((string)position.XPathSelectElement("Серии/Серия/СрокДействияСертиф")); line.ProducerCostWithoutNDS = ParseHelper.GetDecimal((string)position.XPathSelectElement("ЦенаИзг")); line.Nds = ParseHelper.GetUInt((string)position.XPathSelectElement("СтавкаНДС")); line.Amount = ParseHelper.GetDecimal((string)position.XPathSelectElement("СуммаОптВклНДС")); line.NdsAmount = ParseHelper.GetDecimal((string)position.XPathSelectElement("СуммаНДС")); line.RetailCost = ParseHelper.GetDecimal((string)position.XPathSelectElement("ЦенаРозн")); line.EAN13 = NullableConvert.ToUInt64((string)position.XPathSelectElement("ЕАН13") ?? (string)position.XPathSelectElement("Штрихкод")); line.BillOfEntryNumber = (string)position.XPathSelectElement("ГТД"); line.Period = (string)position.XPathSelectElement("Серии/Серия/СрокГодностиТовара"); line.SerialNumber = (string)position.XPathSelectElement("Серии/Серия/СерияТовара"); line.RegistryCost = ParseHelper.GetDecimal((string)position.XPathSelectElement("ЦенаГР")); line.VitallyImportant = ParseHelper.GetBoolean((string)position.XPathSelectElement("ЖВНЛС")); if (line.VitallyImportant == null) { line.VitallyImportant = ParseHelper.GetBoolean((string)position.XPathSelectElement("ЖНВЛС")); } if (line.RegistryCost > 0) { line.VitallyImportant = true; } } return(document); }
/// <summary> /// Парсер для формата файла TXT /// для формата txt много различных типов файлов /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { try { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { //считываем весь текст из файла и проверяем на наличие слова Отказы //из-за проблемы с кодировкой в некоторых файлах //это сделано на случай страховки,если вдруг текст в файле все же не будет считываться правильно string file = reader.ReadToEnd(); if (!file.ToLower().Contains("отказаны следующие позиции")) { Logger.WarnFormat("Файл '{0}' не может быть распарсен, так как парсер {1} не может парсить данный файл из-за проблемы с кодировкой", filename, GetType().Name); } else { var parts = file.Split(new[] { "\r\n" }, StringSplitOptions.None); for (var i = 1; i < parts.Count(); i++) { var rejectFound = true; if (parts[i].Contains("По Клиент")) { rejectFound = false; } if (parts[i].Contains("По заявке")) { rejectFound = false; } if (parts[i] == "") { rejectFound = false; } if (!rejectFound) { continue; } var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); var splat = parts[i].Split(new[] { '\t' }, StringSplitOptions.None); rejectLine.Code = splat[0]; rejectLine.Product = splat[1]; var rejected = NullableConvert.ToUInt32(splat[2]); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } } } catch (Exception e) { var err = string.Format("Файл '{0}' не может быть распарсен, так как парсер {1} не может парсить данный файл так как он либо иного типа,либо с опечаткой", filename, GetType().Name); Logger.Warn(err, e); } }
public Document Parse(string file, Document document) { using (var reader = new StreamReader(file, Encoding.GetEncoding(1251))) { string readLine; var startReading = false; while ((readLine = reader.ReadLine()) != null) { if (readLine.Trim() == "[Header]") { readLine = reader.ReadLine(); var split = readLine.Split(';'); document.ProviderDocumentId = split[0]; document.DocumentDate = NullableConvert.ToDateTime(split[1]); startReading = false; } if (readLine.Trim() == "[Body]") { startReading = true; continue; } if (!startReading) { continue; } var sstParser = readLine.Split(';'); var line = document.NewLine(); line.Code = sstParser[0]; line.Product = sstParser[1]; line.Producer = sstParser[2]; line.Country = sstParser[3]; line.Quantity = (uint?)NullableConvert.ToFloatInvariant(sstParser[4]); line.ProducerCostWithoutNDS = NullableConvert.ToDecimal(sstParser[6], CultureInfo.InvariantCulture); line.SupplierCostWithoutNDS = NullableConvert.ToDecimal(sstParser[7], CultureInfo.InvariantCulture); line.Nds = (uint?)NullableConvert.ToFloatInvariant(sstParser[26]); line.NdsAmount = (uint?)NullableConvert.ToFloatInvariant(sstParser[28]); line.BillOfEntryNumber = sstParser[11]; line.Certificates = sstParser[12]; line.EAN13 = NullableConvert.ToUInt64(sstParser[16]); line.Period = sstParser[15]; line.ProducerCost = NullableConvert.ToDecimal(sstParser[5], CultureInfo.InvariantCulture); if (sstParser[25].Contains("0")) { line.VitallyImportant = false; } else if (sstParser[25].Contains("1")) { line.VitallyImportant = true; } } } return(document); }
/// <summary> /// Парсер для формата файла XLS /// </summary> protected void ParseXLS(RejectHeader reject, string filename) { HSSFWorkbook hssfwb; using (FileStream file = new FileStream(filename, FileMode.Open, FileAccess.Read)) { try { hssfwb = new HSSFWorkbook(file); } catch (Exception e) { var err = string.Format("Не удалось получить файл с отказами '{0}' для лога документа {1}", filename, reject.Log.Id); Logger.Warn(err, e); return; } } ISheet sheet = hssfwb.GetSheetAt(0); //запускаем цикл по строкам var rejectFound = false; for (var i = 0; i <= sheet.LastRowNum; i++) { var row = sheet.GetRow(i); if (row != null) { var cell = row.GetCell(0); if (cell != null && cell.ToString() == "Товар") { rejectFound = true; continue; } //проверяем ячейку на null и остальные невидимые значения if (cell == null || string.IsNullOrWhiteSpace(cell.StringCellValue)) { rejectFound = false; } if (!rejectFound) { continue; } var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); rejectLine.Product = row.GetCell(0).StringCellValue; rejectLine.Code = row.GetCell(6).NumericCellValue.ToString(); rejectLine.Producer = row.GetCell(4).StringCellValue; rejectLine.Ordered = NullableConvert.ToUInt32(row.GetCell(7).NumericCellValue.ToString()); var rejected = NullableConvert.ToUInt32(row.GetCell(8).NumericCellValue.ToString()); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
public Document Parse(string file, Document document) { var sb = new StringBuilder(); using (var sr = new StreamReader(file, Encoding.GetEncoding(1251))) { while (sr.Peek() >= 0) { var line = sr.ReadLine(); if (!String.IsNullOrEmpty(line) && line.TrimStart().StartsWith("<")) { sb.Append(line); } } } var xdocument = XDocument.Parse(sb.ToString()); if (document.Invoice == null) { document.SetInvoice(); } var header = xdocument.XPathSelectElement("DOCUMENTS/DOCUMENT/HEADER"); document.Invoice.Amount = GetDecimal(header, "doc_sum"); document.Invoice.SellerName = header.Attribute("firm_name").Value; document.Invoice.BuyerName = header.Attribute("client_name").Value; document.ProviderDocumentId = header.Attribute("doc_number").Value; document.DocumentDate = GetDate(header, "doc_date"); //header.Attribute("pay_date").Value; foreach (var element in xdocument.XPathSelectElements("DOCUMENTS/DOCUMENT/DETAIL")) { var line = document.NewLine(); line.EAN13 = NullableConvert.ToUInt64(element.Attribute("ean13_code").Value); line.Code = element.Attribute("tov_code").Value; line.Product = element.Attribute("tov_name").Value; line.Producer = element.Attribute("maker_name").Value; //line. = element.Attribute("tov_godn").Value; Срок годности line.SerialNumber = element.Attribute("tov_seria").Value; line.Quantity = (uint?)GetDecimal(element, "kolvo"); line.ProducerCostWithoutNDS = GetDecimal(element, "maker_price"); line.RegistryCost = GetDecimal(element, "reestr_price"); line.SupplierCostWithoutNDS = GetDecimal(element, "firm_price"); line.NdsAmount = GetDecimal(element, "firm_nds"); //line. = GetDecimal(element, "firm_nac");// Наценка line.Country = element.Attribute("gtd_country").Value; line.BillOfEntryNumber = element.Attribute("gtd_number").Value; //line. = element.Attribute("sert_number").Value; // Номер сертификата line.CertificatesEndDate = GetDate(element, "sert_godn"); } return(document); }
protected virtual void ReadBody(Document document, string line) { var parts = line.Split(separator.ToCharArray()); var docLine = document.NewLine(); if (CodeIndex >= 0) { docLine.Code = parts[CodeIndex]; } docLine.Product = parts[ProductIndex]; docLine.Producer = parts[ProducerIndex]; docLine.Country = GetString(parts, CountryIndex); docLine.Quantity = (uint?)GetDecimal(parts[QuantityIndex]); docLine.Unit = GetString(parts, UnitIndex); docLine.ProducerCostWithoutNDS = GetDecimal(parts, ProducerCostWithoutNdsIndex); docLine.SupplierCost = GetDecimal(parts, SupplierCostIndex); docLine.RegistryDate = GetDateTime(GetString(parts, RegistryDateIndex)); docLine.Nds = (uint?)GetDecimal(parts, NdsIndex); docLine.SupplierPriceMarkup = GetDecimal(parts, SupplierPriceMarkupIndex); docLine.SupplierCostWithoutNDS = GetDecimal(parts, SupplierCostWithoutNdsIndex); docLine.ExciseTax = GetDecimal(parts, ExciseTaxIndex); docLine.SerialNumber = GetString(parts, SerialNumberIndex); docLine.DateOfManufacture = GetDateTime(GetString(parts, DateOfManufactureIndex)); docLine.ExpireInMonths = GetInteger(GetString(parts, ExpireInMonthsIndex)); docLine.Period = GetString(parts, PeriodIndex); docLine.Certificates = GetString(parts, CertificatesIndex); docLine.CertificateAuthority = GetString(parts, CertificateAuthorityIndex); docLine.CertificatesDate = GetString(parts, CertificatesDateIndex); docLine.CertificatesEndDate = GetDateTime(GetString(parts, CertificatesEndDateIndex)); docLine.RegistryCost = GetDecimal(parts, RegistryCostIndex); docLine.BillOfEntryNumber = GetString(parts, BillOfEntryNumberIndex); if ((VitallyImportantIndex > 0) && parts.Length > VitallyImportantIndex && !String.IsNullOrEmpty(parts[VitallyImportantIndex])) { docLine.VitallyImportant = GetBool(parts[VitallyImportantIndex]); if (parts[VitallyImportantIndex].ToLower() == "да") { docLine.VitallyImportant = true; } if (parts[VitallyImportantIndex].ToLower() == "нет") { docLine.VitallyImportant = false; } } docLine.EAN13 = NullableConvert.ToUInt64(GetString(parts, EAN13Index)); docLine.CountryCode = GetString(parts, CountryCodeIndex); docLine.UnitCode = GetString(parts, UnitCodeIndex); docLine.Amount = GetDecimal(parts, AmountIndex); docLine.NdsAmount = GetDecimal(parts, NdsAmountIndex); docLine.ProducerCost = GetDecimal(parts, ProducerCostIndex); }
public void Calculate_supplier_client_id() { var intersection = session.Query <TestIntersection>() .First(i => i.Price == order.Price && i.Client == order.Client); intersection.SupplierClientId = Guid.NewGuid().ToString(); session.Save(intersection); session.Save(new TestAnalitFUpdateLog(TestRequestType.SendOrders, order.User) { RequestTime = DateTime.Now.AddDays(-1) }); //Заявка должна попасть в предыдущий период var prevOrder1 = CreateOrder(order.Client); prevOrder1.WriteTime = DateTime.Now.AddDays(-20); session.Save(prevOrder1); var prevOrder2 = CreateOrder(order.Client, order.Price.Supplier); prevOrder2.WriteTime = DateTime.Now.AddDays(-20); session.Save(prevOrder2); Property("Type", 3); var report = ReadReport <SupplierMarketShareByUser>(); var result = ToText(report); Assert.That(result, Does.Contain(intersection.SupplierClientId)); Assert.That(result, Does.Contain("Кол-во поставщиков")); Assert.That(result, Does.Contain("Кол-во сессий отправки заказов")); Assert.That(result, Does.Contain("Самая поздняя заявка")); Assert.That(result, Does.Contain("Изменение доли")); var rows = report.Rows().ToArray(); //проверяем что индексы которые используются ниже не изменились var header = rows[4]; Assert.AreEqual("Изменение доли", header.GetCell(3).StringCellValue); Assert.AreEqual("Кол-во поставщиков", header.GetCell(5).StringCellValue); Assert.AreEqual("Кол-во сессий отправки заказов", header.GetCell(6).StringCellValue); Assert.AreEqual("Самая поздняя заявка", header.GetCell(7).StringCellValue); //проверяем что в колонке Кол-во поставщиков есть данные var reportRow = rows .First(r => r.GetCell(0) != null && r.GetCell(0).StringCellValue == intersection.SupplierClientId); Assert.AreEqual(50, NullableConvert.ToDecimal(reportRow.GetCell(3).StringCellValue)); Assert.That(Convert.ToUInt32(reportRow.GetCell(5).StringCellValue), Is.GreaterThan(0)); Assert.AreEqual("1", reportRow.GetCell(6).StringCellValue); Assert.AreEqual(order.WriteTime.ToString("HH:mm:ss"), reportRow.GetCell(7).StringCellValue); }
/// <summary> /// Парсер для формата файла DBF /// </summary> protected void ParseDBF(RejectHeader reject, string filename) { var data = Dbf.Load(filename); for (var i = 0; i < data.Rows.Count; i++) { var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); rejectLine.Product = data.Rows[i][1].ToString(); rejectLine.Producer = data.Rows[i][2].ToString(); rejectLine.Ordered = NullableConvert.ToUInt32(data.Rows[i][3].ToString()); var rejected = NullableConvert.ToUInt32(data.Rows[i][4].ToString()); rejectLine.Cost = NullableConvert.ToDecimal(data.Rows[i][5].ToString()); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } }
/// <summary> /// Парсер для формата файла DBF /// </summary> protected void ParseDBF(RejectHeader reject, string filename) { var data = Dbf.Load(filename); for (var i = 0; i < data.Rows.Count; i++) { var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); rejectLine.Code = data.Rows[i][0].ToString(); rejectLine.Product = data.Rows[i][1].ToString(); var ordered = data.Rows[i][2].ToString().Split(','); rejectLine.Ordered = NullableConvert.ToUInt32(ordered[0]); var rejected = NullableConvert.ToUInt32(ordered[0]); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } }
/// <summary> /// Парсер для формата файла TXT /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; while ((line = reader.ReadLine()) != null) { if (line.Contains("К сожалению вся позиция уже отсутствует:")) { rejectFound = true; continue; } if (line == "") { rejectFound = false; } if (!rejectFound) { continue; } var index = line.IndexOf("Добавлено:"); if (index <= 0) { continue; } var first = line.Substring(0, index).Trim(); var product = first.Remove(0, 2); var rejectLine = new RejectLine(); rejectLine.Product = product; var second = line.Substring(index).Trim().Replace(",", " "); var fields = second.Split(' '); rejectLine.Cost = NullableConvert.ToDecimal(fields[7].Trim().Replace(".", ",")); var ordered = NullableConvert.ToUInt32(fields[4]); var delivered = NullableConvert.ToUInt32(fields[1].Trim()); rejectLine.Ordered = ordered; var rejected = ordered - delivered; rejectLine.Rejected = rejected != null ? rejected.Value : 0; reject.Lines.Add(rejectLine); } } }
/// <summary> /// Парсер для формата файла TXT /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; while ((line = reader.ReadLine()) != null) { if (line.Trim() == "О Т К А З Ы") { rejectFound = true; continue; } if (line.Trim() == "СФОРМИРОВАННЫЙ ЗАКАЗ") { break; } if (!rejectFound) { continue; } if (line.Length == 0) { continue; } //пропускаем заголовок if (line[0] == '¦') { continue; } //пропускаем разделители строк if (line.All(c => c == '-')) { continue; } var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); rejectLine.Product = line.Substring(0, 35).Trim(); rejectLine.Producer = line.Substring(35, 13).Trim(); rejectLine.Cost = NullableConvert.ToDecimal(line.Substring(48, 9).Trim(), CultureInfo.InvariantCulture); rejectLine.Ordered = (uint?)NullableConvert.ToFloatInvariant(line.Substring(57, 9).Trim()); var rejectedCount = (rejectLine.Ordered - (uint?)NullableConvert.ToFloatInvariant(line.Substring(66, 9).Trim())); rejectLine.Rejected = rejectedCount.GetValueOrDefault(); } } }
/// <summary> /// Парсер для формата файла CSV /// </summary> protected void ParseCSV(RejectHeader reject, string filename) { //Открываем файл, при помощи unsing, чтобы вконце си шарп отпустил занятые ресурсы. Подробнее гугли IDisposable. using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; //Читаем, пока не кончатся строки в файле while ((line = reader.ReadLine()) != null) { //Делим строку на части по разделителю. //CSV файл, который ожидает данный парсер - это эксел таблица, строки которой разделены переносом строки, а ячейки символом ";" var fields = line.Split(';'); //Ищем в ячейке место, с которого начинаются отказы в таблице if (fields[1].Trim() == "ОТКАЗАНО") { //После строчки с этой надписью, будет еще одна строка с наименованием таблицы, ее мы пропустим //И со следующей строчки будут уже идти отказы //В итоге надо пропустить 2 строчки и проставить флаг, что дальше пора считывать отказы //Отказы идут прямо до конца файла, так что в условии остановки считывания нужды нет reader.ReadLine(); rejectFound = true; continue; } //Если мы еще не дошли до места с которого начинаются отказы, то продолжаем if (!rejectFound) { continue; } //Если мы дошли до этого места, значит все что осталось в файле - это строки с отказами var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); rejectLine.Code = fields[1]; rejectLine.Product = fields[2]; rejectLine.Producer = fields[3]; rejectLine.Cost = NullableConvert.ToDecimal(fields[4].Trim()); rejectLine.Ordered = NullableConvert.ToUInt32(fields[5].Trim()); //тонкий момент - это поле является обязательным, но теоретически может отсутствовать в файле //в случае отсутствия мы записываем 0, тогда далее другие классы разберут этот случай //и сделают необходимые действия по урегулированию ситуации var rejected = NullableConvert.ToUInt32(fields[7].Trim()); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
/// <summary> /// Парсер для формата файла TXT /// В файле допущена ошибка с тем что в графе запрошено стоит ноль /// Раз неизвестно количество заказанных товаров,то невозможно вычислить отказы /// Строки, где в запрошено стоит ноль - игнорируем /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; while ((line = reader.ReadLine()) != null) { if (line.Contains("Следующие расхождения с заявкой:")) { rejectFound = true; continue; } if (line == "") { rejectFound = false; } if (!rejectFound) { continue; } var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); var first = line.Replace("Отказ по количеству: ", ""); var splat = first.Split(new[] { " - запрошено" }, StringSplitOptions.None); var product = splat[0]; var other = splat[1]; var splat2 = other.Split(new[] { ", к получению " }, StringSplitOptions.None); var ordered = NullableConvert.ToUInt32(splat2[0]); var requested = NullableConvert.ToUInt32(splat2[1]); if (ordered == 0) { continue; } var rejected = ordered - requested; rejectLine.Product = product.Trim(); rejectLine.Ordered = ordered; rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
/// <summary> /// Парсер для формата файла CSV /// </summary> protected void ParseCSV(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; //Читаем, пока не кончатся строки в файле while ((line = reader.ReadLine()) != null) { //Делим строку на части по разделителю. //CSV файл, который ожидает данный парсер - это эксел таблица, строки которой разделены переносом строки, а ячейки символом ";" var fields = line.Split(';'); if (fields.Length == 0) { continue; } //Ищем в ячейке место, с которого начинаются отказы в таблице if (fields[0].Trim() == "Номер заказа ПОСТАВЩИКу") { rejectFound = true; continue; } //Если мы еще не дошли до места с которого начинаются отказы, то продолжаем if (!rejectFound) { continue; } if (fields.Length < 11) { continue; } //Если мы дошли до этого места, значит все что осталось в файле - это строки с отказами var rejectLine = new RejectLine(); reject.Lines.Add(rejectLine); rejectLine.Code = fields[5]; rejectLine.Product = fields[6]; rejectLine.Cost = NullableConvert.ToDecimal(fields[10].Trim()); rejectLine.Ordered = NullableConvert.ToUInt32(fields[7].Trim()); var rejected = NullableConvert.ToUInt32(fields[9].Trim()); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
/// <summary> /// Парсер для формата файла TXT /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; while ((line = reader.ReadLine()) != null) { //доходим до строчки, в которой содерится слово ТОВАР и начинаем чтение if (line.Contains("ТОВАР")) { rejectFound = true; //пропускаем линию-разделения таблицы reader.ReadLine(); continue; } if (line == "") { rejectFound = false; } var rejectLine = new RejectLine(); //проверяем на наличие линий-разделения таблицы if (line.Contains("+=")) { rejectFound = false; } if (!rejectFound) { continue; } var fields = line.Split('|'); reject.Lines.Add(rejectLine); rejectLine.Product = fields[2]; rejectLine.Ordered = NullableConvert.ToUInt32(fields[5]); var rejected = NullableConvert.ToUInt32(fields[5]); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
/// <summary> /// Парсер для формата файла XML /// </summary> protected void ParseXML(RejectHeader reject, string filename) { //получаем докуме5нт XDocument xdoc = XDocument.Load(filename); XElement doc = xdoc.Element("Reject"); if (!doc.HasElements) { var err = string.Format("Не удалось получить файл с отказами '{0}' для лога документа {1}", filename, reject.Log.Id); Logger.Warn(err); return; } //парсим //получаем сначала динамику для проверки условий var xLines = doc.Elements("Line").Select(line => new { Code = line.Element("Code")?.Value, CodeCr = line.Element("CodeCr")?.Value, Product = line.Element("Product")?.Value, Producer = line.Element("Producer")?.Value, Rejected = NullableConvert.ToUInt32(line.Element("Rejected")?.Value), Ordered = NullableConvert.ToUInt32(line.Element("Ordered")?.Value), OrderId = NullableConvert.ToUInt32(line.Element("OrderId")?.Value), }).ToList(); //проверяем условия xLines = xLines.Where(s => s.Code != null && s.Product != null && s.Rejected != null && s.OrderId != null).ToList(); //подходящие эл.ты кидаем в RejectLine var xRejectLines = xLines.Select(line => new RejectLine() { Code = line.Code, CodeCr = line.CodeCr, Product = line.Product, Producer = line.Producer, Rejected = line.Rejected.Value, Ordered = line.Ordered.Value, OrderId = line.OrderId.Value, }).ToList(); //RejectLine в список и отправляем дальше. reject.Lines.AddEach(xRejectLines); }
public bool SetAssortimentInfo(ISession session, WaybillSettings settings) { if (!settings.IsConvertFormat) { return(false); } if (settings.AssortimentPriceId == null) { _log.InfoFormat("Не задан ассортиментный прайс-лист: ClientCode = {0}, Log.FileName = {1}, Log.Id = {2}", ClientCode, Log.FileName, Log.Id); return(true); } // список id товаров из накладной var productIds = Lines.Where(l => l.ProductEntity != null).Select(l => (uint?)l.ProductEntity.Id).ToArray(); var cores = session.Query <Offer>() .Where(x => x.Price.Id == settings.AssortimentPriceId.Value && productIds.Contains(x.ProductId)) .ToList(); foreach (var line in Lines) { //Сортируем по Code, чтобы каждый раз при сопоставлении выбирать одну и ту же позицию из позиций с одинаковыми ProductId и ProducerId //Предпочитаем предложения у которых совпадает цена реестра тк в прайсе могут быть позиции с разным кодом var core = cores.Where(c => line.ProductEntity != null && c.ProductId == line.ProductEntity.Id && c.CodeFirmCr == line.ProducerId) .OrderByDescending(x => x.RegistryCost == line.RegistryCost) .ThenBy(x => x.Code) .FirstOrDefault(); if (core == null) { continue; } line.AssortimentPriceInfo = new AssortimentPriceInfo { Code = NullableConvert.ToUInt32(core.Code), CodeCr = NullableConvert.ToInt32(core.CodeCr), Synonym = core.ProductSynonym?.Synonym, SynonymFirmCr = core.ProducerSynonym?.Synonym }; } return(true); }
/// <summary> /// Парсер для формата файла TXT /// </summary> protected void ParseTXT(RejectHeader reject, string filename) { using (var reader = new StreamReader(File.OpenRead(filename), Encoding.GetEncoding(1251))) { string line; var rejectFound = false; while ((line = reader.ReadLine()) != null) { if (line.Contains("Следующие расхождения с заявкой:")) { rejectFound = true; continue; } if (line == "") { rejectFound = false; } if (!rejectFound) { continue; } var rejectLine = new RejectLine(); var fields = line.Split(new[] { "; - запрошено" }, StringSplitOptions.None); var product = fields[0].Replace("Отказ по количеству:", ""); var fields2 = fields[1].Split(','); var fields3 = fields2[0].Replace("шт.", "").Trim(); var ordered = fields3.Split('.'); var fields4 = fields2[1].Replace("к получению", "").Replace("шт.", ""); var received = fields4.Split('.'); reject.Lines.Add(rejectLine); rejectLine.Product = product.Trim(); rejectLine.Ordered = NullableConvert.ToUInt32(ordered[0]); var rejected = NullableConvert.ToUInt32(ordered[0]) - NullableConvert.ToUInt32(received[0]); rejectLine.Rejected = rejected != null ? rejected.Value : 0; } } }
public Document Parse(string file, Document document) { var xdocument = XDocument.Load(file); var order = xdocument.XPathSelectElement("Order"); document.ProviderDocumentId = (string)order.XPathSelectElement("OrderId"); document.DocumentDate = NullableConvert.ToDateTime((string)order.XPathSelectElement("OrderDate")); foreach (var item in order.XPathSelectElements("Items/Item")) { var line = document.NewLine(); line.Product = (string)item.XPathSelectElement("GoodsName"); line.Code = (string)item.XPathSelectElement("ItemId"); line.EAN13 = NullableConvert.ToUInt64((string)item.XPathSelectElement("EAN13")); line.Quantity = (uint?)item.XPathSelectElement("Quantity"); line.SupplierCostWithoutNDS = (decimal?)item.XPathSelectElement("CostClear"); line.SupplierCost = (decimal?)item.XPathSelectElement("Cost"); line.Nds = (uint?)item.XPathSelectElement("STNDS"); line.NdsAmount = (decimal?)item.XPathSelectElement("NDS"); line.Amount = (decimal?)item.XPathSelectElement("SUMMA"); } return(document); }
public Document Parse(string file, Document document) { StringDecoder.DefaultEncoding = Encoding.GetEncoding(1251); var book = Workbook.Load(file); var sheet = book.Worksheets[0]; string value = sheet.Cells[9, 3].StringValue; int positionProviderDocumentId = value.IndexOf("№") + 1; int positionDate = value.IndexOf("от"); document.ProviderDocumentId = value.Substring(positionProviderDocumentId, positionDate - positionProviderDocumentId).Trim(); document.DocumentDate = DateTime.Parse(value.Substring(positionDate + 2).Trim()); foreach (var row in sheet.Cells.Rows.Values.Skip(7)) { if ((String.IsNullOrEmpty(row.GetCell(0).StringValue) || (row.GetCell(0).StringValue.Equals("#NULL!"))) && (String.IsNullOrEmpty(row.GetCell(4).StringValue) || (row.GetCell(4).StringValue.Equals("#NULL!"))) && (String.IsNullOrEmpty(row.GetCell(6).StringValue) || (row.GetCell(6).StringValue.Equals("#NULL!")))) { return(document); } var line = document.NewLine(); line.Code = row.GetCell(2).StringValue; line.EAN13 = NullableConvert.ToUInt64(row.GetCell(3).StringValue); line.Product = row.GetCell(4).StringValue; line.Unit = row.GetCell(5).StringValue; line.Quantity = Convert.ToUInt32(row.GetCell(6).Value); line.SupplierCost = Convert.ToDecimal(row.GetCell(7).StringValue); line.Amount = Convert.ToDecimal(row.GetCell(8).StringValue); line.Country = row.GetCell(9).StringValue; line.BillOfEntryNumber = row.GetCell(10).StringValue; } return(document); }