/// <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;
                }
            }
        }
Exemple #6
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");
                }
            });
        }
Exemple #7
0
 /// <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;
             }
         }
     }
 }
Exemple #8
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;
                }
            }
        }
Exemple #11
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);
        }
Exemple #12
0
        /// <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);
        }
Exemple #17
0
        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);
        }
Exemple #18
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.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);
                }
            }
        }
Exemple #21
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.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();
         }
     }
 }
Exemple #22
0
        /// <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;
                }
            }
        }
Exemple #25
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);
        }
Exemple #28
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();
                    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;
                }
            }
        }
Exemple #29
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);
        }
Exemple #30
0
        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);
        }