Esempio n. 1
0
        private void LoadDiscsFromReader(SpreadsheetReader reader, LoadResult result)
        {
            //проверка наличия в файле единственного листа с заказом
            reader.CurrentSheet = 0;
            int numOfFields = 9;

            List<RmsAuto.Store.Cms.Entities.Disc> t = new List<RmsAuto.Store.Cms.Entities.Disc>();
            for (int r = 1; r < reader.RecordCount; r++)
            {
                string[] rec = new string[numOfFields];
                for (int i = 0; i < numOfFields; i++)
                    rec[i] = reader[r, i];

                rec = rec.Each(s => s.Trim()).ToArray();

                if (rec.All(s => s == ""))
                    continue;

                if (rec.All(s => string.IsNullOrEmpty(s)))
                {
                    break;
                }

                var t1 = new RmsAuto.Store.Cms.Entities.Disc();

                for (int c = 0; c < numOfFields; c++)
                {
                    string value = rec[c];
                    try
                    {
                        switch (c)
                        {
                            case 0: t1.Manufacturer = value; break;
                            case 1: t1.ModelName = value; break;
                            case 2: t1.PartNumber = value; break;
                            case 3: t1.Width = Decimal.Parse(value); break;
                            case 4: t1.Diameter = Decimal.Parse(value); break;
                            case 5: t1.Gab = Decimal.Parse(value); break;
                            case 6: t1.PCD = value; break;
                            case 7: t1.Dia = Decimal.Parse(value); break;
                        }
                    }
                    catch
                    {
                        //TODO допилить обработку ошибок
                    }
                }
                t.Add(t1);
            }

            using (CmsDataContext cms = new CmsDataContext())
            {
                try
                {
                    cms.Connection.Open();
                    cms.Transaction = cms.Connection.BeginTransaction();
                    var current = cms.Discs.Select(x => x).ToList();
                    current.Sort(new DiscComparer());
                    t.Sort(new DiscComparer());

                    t = t.Select(x => x).Distinct(new DiscComparer()).ToList();

                    //Пробегаем по каждому объекту каталога и смотрим какая у него была картинка
                    foreach (var RefObj in t)
                    {
                        var tmp = current.Where(x => x.PartNumber == RefObj.PartNumber).FirstOrDefault();
                        RefObj.ImageUrl = tmp != null && tmp.ImageUrl.HasValue ? tmp.ImageUrl : (int)NoPhotoID.Disc;
                    }

                    // "мерджим" старое и новое
                    t = t.UnionAndDistinct<RmsAuto.Store.Cms.Entities.Disc>(current, new DiscComparer());

                    cms.Discs.DeleteAllOnSubmit(current);
                    cms.Discs.InsertAllOnSubmit(t);
                    cms.SubmitChanges(ConflictMode.ContinueOnConflict);
                    cms.Transaction.Commit();
                    Response.Redirect(Request.Url.ToString());
                }
                catch (ChangeConflictException)
                {
                    //TODO допилить обработку ошибок
                    //Если не удалось изменить какую-то одну запись это не значит что нужно делать откат всего
                }
                catch (Exception)
                {
                    cms.Transaction.Rollback();
                    //ShowMessage("Указано неиспользуемое имя бренда");
                    Logger.WriteError("Ошибка при сохранении результатов загрузки дисков", EventLogerID.BLException, EventLogerCategory.BLError);
                }
                finally
                {
                    if (cms.Connection.State == System.Data.ConnectionState.Open) { cms.Connection.Close(); }
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Разбор Excel файла
        /// </summary>
        /// <param name="reader">объект чтения</param>
        private void LoadOrderFromReader( SpreadsheetReader reader )
        {
            Dictionary<SparePartPriceKey, int> groupRows = new Dictionary<SparePartPriceKey, int>();
            //проверка наличия в файле единственного листа с заказом
            reader.CurrentSheet = 0;
            if (reader.SheetCount > 1)
            {
                AddError(ErrorReason.SingleSheetRequired, "");
                return;
            }
            if (reader.RecordCount <= _first_row)
            {
                AddError(ErrorReason.EmptyOrder, _first_row.ToString() );
                return;
            }
            //импорт номера заказа
            try
            {
                string orderNum = reader[_order_num_cell.Y, _order_num_cell.X];
                CustOrderNum = (orderNum ?? "").Trim();
                Session["CustOrderNum"] = CustOrderNum;
            }
            catch
            {
                AddError(ErrorReason.InvalidOrderNumber, "");
                return;
            }
            int ItemsRead = 0;
            rowsOK.Clear();
            rowsAccept.Clear();
            rowsER.Clear();
            rowsERQty.Clear();
            //импорт строк заказа
            using (var DC = new DCFactory<StoreDataContext>())
            {
                var userSet = DC.DataContext.spSelUserSetting(SiteContext.Current.User.UserId).FirstOrDefault();
                RmsAuto.Acctg.ClientGroup _clientGroup = SiteContext.Current.CurrentClient.Profile.ClientGroup;
                decimal _personalMarkup = SiteContext.Current.CurrentClient.Profile.PersonalMarkup;
                byte PrcExcessPrice = userSet == null ? (byte)0 : userSet.PrcExcessPrice;
                _txtPrc.Text = string.Format(Resources.CartImport.PrcExcessPrice + ": <b>{0}</b>", PrcExcessPrice);

                CheckExcelRestrictions(reader.RecordCount - 5/* т.к. в шапке 5 строк, а reader.RecordCount - общее кол-во строк в файле */);

                for (int r = _first_row; r < reader.RecordCount; r++)
                {
                    string[] rec = {
                        reader[r, 0], reader[r, 1], reader[r, 2],
                        reader[r, 3], reader[r, 4], reader[r, 5],
                        reader[r, 6], reader[r, 7] };

                    rec = rec.Each(s => s.Trim()).ToArray();

                    if (rec.All(s => s == ""))
                        continue;

                    if (rec.All(s => string.IsNullOrEmpty(s)))
                    {
                        if (r == _first_row)
                        {
                            AddError(ErrorReason.EmptyOrder, r.ToString());
                        }
                        break;
                    }
                    ItemsRead++;
                    bool recIsValid = true;
                    string errorText = "";
                    int supplierId = 0;
                    if (!int.TryParse(rec[1], out supplierId))
                    {
                        errorText += TextError(ErrorReason.InvalidSupplierID, "") + "<br />";
                        recIsValid = false;
                    }
                    string manufacturer = rec[2];
                    if (string.IsNullOrEmpty(manufacturer))
                    {
                        errorText += TextError(ErrorReason.InvalidPartNumber, "") + "<br />";
                        recIsValid = false;
                    }
                    string partNumber = rec[3];
                    if (string.IsNullOrEmpty(partNumber))
                    {
                        errorText += TextError(ErrorReason.InvalidPartNumber, "") + "<br />";
                        recIsValid = false;
                    }
                    int quantity = 0;
                    if (!int.TryParse(rec[4], out quantity))
                    {
                        errorText += TextError(ErrorReason.InvalidQuantity, "") + "<br />";
                        recIsValid = false;
                    }
                    string referenceID = rec[6] ?? "";
                    if (referenceID.Length > ShoppingCartAddItem.ReferenceIDLength)
                    {
                        referenceID = referenceID.Substring(0, ShoppingCartAddItem.ReferenceIDLength);
                    }
                    bool strictlyThisNumber = !string.IsNullOrEmpty(rec[5]);
                    decimal priceClient = 0M;
                    if (!string.IsNullOrEmpty(rec[7]) && !decimal.TryParse(rec[7], out priceClient))
                    {
                        errorText += TextError(ErrorReason.InvalidPrice, "") + "<br />";
                        recIsValid = false;
                    }
                    SparePartFranch part = null;
                    // проверка существования элемента
                    if (recIsValid)
                    {
                        try
                        {
                            SparePartPriceKey SPPK = new SparePartPriceKey(manufacturer, partNumber, supplierId);
                            part = SparePartsDac.Load(DC.DataContext, SPPK);
                            if (part == null)
                            {
                                recIsValid = false;
                                errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />";
                            }
                        }
                        catch (ArgumentNullException e)
                        {
                            recIsValid = false;
                            errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />";
                        }
                        catch (InvalidOperationException e)
                        {
                            recIsValid = false;
                            errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />";
                        }
                    }
                    if (recIsValid)
                    {
                        SparePartPriceKey SPPK = new SparePartPriceKey(manufacturer, partNumber, supplierId);
                        // набор сгруппированной корзины для количественного анализа
                        if (groupRows.ContainsKey(SPPK))
                        {
                            groupRows[SPPK] += quantity;
                        }
                        else
                        {
                            groupRows.Add(SPPK, quantity);
                        }
                        // проверка цены
                        decimal priceCurr = part.GetFinalSalePrice(_clientGroup, _personalMarkup);
                        decimal pPrc = priceClient == 0 ? 0M : (priceCurr - priceClient) * 100 / priceClient;
                        // формирование положительного и подверждающего списков
                        if ( /*priceClient == 0 ||*/ (priceClient + Math.Round(priceClient * PrcExcessPrice / 100, 2) >= priceCurr))
                        {
                            rowsOK.Add(new CartImportRow
                            {
                                rowID = Guid.NewGuid(),
                                manufacturer = manufacturer,
                                partNumber = partNumber,
                                supplierId = supplierId,
                                referenceID = referenceID,
                                deliveryPeriod = part.DisplayDeliveryDaysMin.ToString() + "-" + part.DisplayDeliveryDaysMax.ToString(),
                                itemName = part.PartDescription,
                                priceClient = priceClient,
                                priceCurr = priceCurr,
                                pricePrc = string.Format("{0:#####0.00}", pPrc),
                                quantity = quantity,
                                rowN = rec[0] ?? "",
                                strictlyThisNumber = strictlyThisNumber
                            });
                        }
                        else
                        {
                            // Если обнаружен факт превышения цены, то проверяем является ли текущий пользователь
                            // "особым" пользователем, который имеет право загружать детали по "вчерашней" цене
                            // и если это так то вычисляем "вчерашнюю" цену добавляем к ней допустимый % превышения
                            // для этого пользователя и записываем в специальное поле (если оно заполнено то в цену
                            // в заказ пойдет цена из этого поля)
                            decimal? priceClientYesterday = null;
                            bool isErrorPrice = false;
                            if (SpecialUsers.Contains(SiteContext.Current.User.UserId) && OwnStores != null && OwnStores.Contains(part.SupplierID))
                            {
                                using (var dc = new dcCommonDataContext())
                                {
                                    try
                                    {
                                        //получаем список "вчерашних" и сегодняшних цен фтп для сравнения
                                        //если загрузка производится в понедельник, то "вчерашние" цены фтп должны браться по пятнице, субботе и воскресенью
                                        #region === old stored procedure ===
                                        //string queryTemplate = "exec srvdb4.az.dbo.spGetPricesOnDate @Number = '{0}', @Brand = '{1}', @Date = '{2}', @PriceColumn = {3}";
                                        #endregion
                                        string queryTemplate = "exec srvdb4.az.dbo.spGetPricesOnPeriod @Number='{0}', @Brand='{1}', @DateFrom='{2}', @DateTo='{3}', @PriceColumn={4}";
                                        DateTime dateFrom = (DateTime.Now.DayOfWeek == DayOfWeek.Monday) ? DateTime.Now.AddDays(-3) : DateTime.Now.AddDays(-1);
                                        DateTime dateTo = DateTime.Now;
                                        List<decimal> prices = dc.ExecuteQuery<decimal>(
                                            string.Format(queryTemplate,
                                                part.PartNumber,
                                                part.Manufacturer,
                                                dateFrom.ToString("yyyyMMdd"),
                                                dateTo.ToString("yyyyMMdd"),
                                                (int)SiteContext.Current.CurrentClient.Profile.ClientGroup))
                                            .ToList<decimal>();

                                        //для каждой из цен производим сравнение с ценой клиента в 'Excel' +- 1 копейка (чтобы учесть возможные погрешности при округлении)
                                        foreach (var price in prices)
                                        {
                                            decimal pExcell = Math.Round(priceClient, 2);	//цена клиента в 'Excel'
                                            decimal pFtp = Math.Round(price, 2);			//одна из вчерашних цен нашего Ftp
                                            if (pExcell > 0 && (pExcell == pFtp ||
                                                pExcell == (pFtp - 0.01M) ||
                                                pExcell == (pFtp + 0.01M)))
                                            {
                                                //добавляем допустимый % превышения (доли копеек отбрасываем)
                                                priceClientYesterday = pFtp + pFtp * PrcExcessPrice / 100;
                                                priceClientYesterday = decimal.Truncate((decimal)priceClientYesterday * 100) / 100;
                                                break;
                                            }
                                        }
                                        //если ни одного совпадения не найдено, то позиция отваливается с ошибкой "Несоответствие цены ФТП-прайсу"
                                        isErrorPrice = (prices.Count() > 0 && !priceClientYesterday.HasValue);
                                    }
                                    catch (Exception ex)
                                    {
                                        Logger.WriteError(@"При вычислении 'Вчерашней' цены произошла ошибка!", EventLogerID.UnknownError, EventLogerCategory.UnknownCategory, ex);
                                    }
                                    finally
                                    {
                                        if (dc.Connection.State == System.Data.ConnectionState.Open)
                                            dc.Connection.Close();
                                    }
                                }
                            }
                            if (isErrorPrice)
                            {
                                rowsER.Add(new CartImportRowError()
                                {
                                    order = 20,
                                    error = Resources.CartImport.InvalidFtpPrice /*"Несоответствие цены ФТП-прайсу"*/,
                                    manufacturer = rec[2],
                                    partNumber = rec[3],
                                    supplierId = rec[1],
                                    priceClient = rec[7],
                                    quantity = rec[4],
                                    referenceID = rec[6],
                                    rowN = rec[0],
                                    strictlyThisNumber = rec[5]
                                });
                            }
                            else
                            {
                                rowsAccept.Add(new CartImportRow
                                {
                                    rowID = Guid.NewGuid(),
                                    manufacturer = manufacturer,
                                    partNumber = partNumber,
                                    supplierId = supplierId,
                                    referenceID = referenceID,
                                    deliveryPeriod = part.DisplayDeliveryDaysMin.ToString() + "-" + part.DisplayDeliveryDaysMax.ToString(),
                                    itemName = part.PartDescription,
                                    priceClient = priceClient,
                                    priceCurr = priceCurr,
                                    pricePrc = priceClient == 0 ? "100.00" : (PrcExcessPrice == 0
                                        ? pPrc < 0.01M ? "<0.01" : string.Format("{0:#####0.00}", pPrc)
                                        : pPrc > PrcExcessPrice && pPrc < (PrcExcessPrice + 0.01M)
                                            ? string.Format(">{0:#0.00}", PrcExcessPrice)
                                            : string.Format("{0:#####0.00}", pPrc)),
                                    quantity = quantity,
                                    rowN = rec[0] ?? "",
                                    strictlyThisNumber = strictlyThisNumber,
                                    priceClientYesterday = priceClientYesterday
                                });
                            }
                        }
                    }
                    else
                    {
                        rowsER.Add(new CartImportRowError()
                        {
                            order = 20,
                            error = errorText,
                            manufacturer = rec[2],
                            partNumber = rec[3],
                            supplierId = rec[1],
                            priceClient = rec[7],
                            quantity = rec[4],
                            referenceID = rec[6],
                            rowN = rec[0],
                            strictlyThisNumber = rec[5]
                        });
                    }
                }
                // количественные проверки
                foreach (SparePartPriceKey SPPK in groupRows.Keys)
                {
                    string errorText = "";
                    SparePartFranch part = SparePartsDac.Load(DC.DataContext, SPPK);
                    if (groupRows[SPPK] < part.DefaultOrderQty)
                    {
                        // Минимальное необходимое количество для заказа
                        errorText += String.Format(
                            Resources.CartImport.MinOrderQuantity
                            /*"минимальное необходимое количество для заказа: {0}"*/,
                            part.MinOrderQty);
                    }
                    else if (groupRows[SPPK] % part.DefaultOrderQty != 0)
                    {
                        // Количество должно быть кратным числу деталей в комплекте
                        errorText += Resources.CartImport.ShallDivisibleQuantity /*"количество должно быть кратным числу деталей в комплекте ("*/ +
                        part.DefaultOrderQty
                        .Progression(part.DefaultOrderQty, 5)
                        .Select(i => i.ToString())
                        .Aggregate((acc, s) => acc + "," + s) + Resources.CartImport.etc_withRightBracket /*" и т.д.)"*/;
                    }
                    if (part.QtyInStock.GetValueOrDefault() > 0 && groupRows[SPPK] > part.QtyInStock)
                    {
                        // Количество превышает допустимый лимит
                        errorText += String.Format(
                            Resources.CartImport.QuantityExceedsAvailable
                            /*"заказанное количество превышает остатки склада, доступно: {0}"*/,
                            part.QtyInStock);
                    }
                    if (!string.IsNullOrEmpty(errorText))
                    {
                        // при наличии ошибок перекидываем из успешных списков в список количественных ошибок
                        var tAcc = rowsAccept.Where(t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId).ToList();
                        AddToERQty(false, errorText, rowsAccept, tAcc);
                        var tOK = rowsOK.Where(t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId).ToList();
                        AddToERQty(true, errorText, rowsOK, tOK);
                    }
                }
            }
        }
Esempio n. 3
0
        private void LoadOrderFromReaderFranch(SpreadsheetReader reader)
        {
            Dictionary<SparePartPriceKey, int> groupRows = new Dictionary<SparePartPriceKey, int>();
            //проверка наличия в файле единственного листа с заказом
            reader.CurrentSheet = 0;
            if (reader.SheetCount > 1)
            {
                AddError(ErrorReason.SingleSheetRequired, "");
                return;
            }
            if (reader.RecordCount <= _first_row)
            {
                AddError(ErrorReason.EmptyOrder, _first_row.ToString());
                return;
            }
            //импорт номера заказа
            try
            {
                string orderNum = reader[_order_num_cell.Y, _order_num_cell.X];
                CustOrderNum = (orderNum ?? "").Trim();
                Session["CustOrderNum"] = CustOrderNum;
            }
            catch
            {
                AddError(ErrorReason.InvalidOrderNumber, "");
                return;
            }
            int ItemsRead = 0;
            rowsOK.Clear();
            rowsAccept.Clear();
            rowsER.Clear();
            rowsERQty.Clear();
            parts.Clear();
            //импорт строк заказа
            using (var FDC = new DCFactory<StoreDataContext>())
            {
                //StoreDataContext DC = new StoreDataContext();
                StoreDataContext DC = FDC.DataContext;
                var userSet = DC.spSelUserSetting(SiteContext.Current.User.UserId).FirstOrDefault();
                RmsAuto.Acctg.ClientGroup _clientGroup = SiteContext.Current.CurrentClient.Profile.ClientGroup;
                decimal _personalMarkup = SiteContext.Current.CurrentClient.Profile.PersonalMarkup;
                byte PrcExcessPrice = userSet == null ? (byte)0 : userSet.PrcExcessPrice;
                _txtPrc.Text = string.Format("{0}: <b>{1}</b>", Resources.CartImport.PrcExcessPrice, PrcExcessPrice);

                for (int r = _first_row; r < reader.RecordCount; r++)
                {
                    string[] rec = {
                    reader[r, 0], reader[r, 1], reader[r, 2],
                    reader[r, 3], reader[r, 4], reader[r, 5],
                    reader[r, 6], reader[r, 7] };

                    rec = rec.Each(s => s.Trim()).ToArray();

                    if (rec.All(s => s == ""))
                        continue;

                    if (rec.All(s => string.IsNullOrEmpty(s)))
                    {
                        if (r == _first_row)
                        {
                            AddError(ErrorReason.EmptyOrder, r.ToString());
                        }
                        break;
                    }
                    ItemsRead++;
                    bool recIsValid = true;
                    string errorText = "";
                    int supplierId = 0;
                    if (!int.TryParse(rec[1], out supplierId))
                    {
                        errorText += TextError(ErrorReason.InvalidSupplierID, "") + "<br />";
                        recIsValid = false;
                    }
                    string manufacturer = rec[2];
                    if (string.IsNullOrEmpty(manufacturer))
                    {
                        errorText += TextError(ErrorReason.InvalidPartNumber, "") + "<br />";
                        recIsValid = false;
                    }
                    string partNumber = rec[3];
                    if (string.IsNullOrEmpty(partNumber))
                    {
                        errorText += TextError(ErrorReason.InvalidPartNumber, "") + "<br />";
                        recIsValid = false;
                    }
                    int quantity = 0;
                    if (!int.TryParse(rec[4], out quantity))
                    {
                        errorText += TextError(ErrorReason.InvalidQuantity, "") + "<br />";
                        recIsValid = false;
                    }
                    string referenceID = rec[6] ?? "";
                    if (referenceID.Length > ShoppingCartAddItem.ReferenceIDLength)
                    {
                        referenceID = referenceID.Substring(0, ShoppingCartAddItem.ReferenceIDLength);
                    }
                    bool strictlyThisNumber = !string.IsNullOrEmpty(rec[5]);
                    decimal priceClient = 0M;
                    if (!string.IsNullOrEmpty(rec[7]) && !decimal.TryParse(rec[7], out priceClient))
                    {
                        errorText += TextError(ErrorReason.InvalidPrice, "") + "<br />";
                        recIsValid = false;
                    }

                    SparePartFranch part = null;
                    // проверка существования элемента
                    if (recIsValid)
                    {
                        try
                        {
                            SparePartPriceKey SPPK = new SparePartPriceKey(manufacturer, partNumber, supplierId);
                            //part = SparePartsDac.Load(DC, SPPK);
                            part = SparePartsDacFranch.Load(DC, SPPK);
                            if (part == null)
                            {
                                recIsValid = false;
                                errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />";
                            }
                        }
                        catch (ArgumentNullException e)
                        {
                            recIsValid = false;
                            errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />";
                        }
                        catch (InvalidOperationException e)
                        {
                            recIsValid = false;
                            errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />";
                        }
                        catch (Exception e)
                        {
                            Response.Write(e.StackTrace.ToString());
                            errorText += e.StackTrace.ToString();
                        }
                    }
                    if (recIsValid)
                    {
                        SparePartPriceKey SPPK = new SparePartPriceKey(manufacturer, partNumber, supplierId);
                        // набор сгруппированной корзины для количественного анализа
                        if (groupRows.ContainsKey(SPPK))
                        {
                            groupRows[SPPK] += quantity;
                        }
                        else
                        {
                            groupRows.Add(SPPK, quantity);
                        }

                        parts.Add(part);

                        // проверка цены
                        decimal priceCurr = part.GetFinalSalePrice(_clientGroup, _personalMarkup);
                        decimal pPrc = priceClient == 0 ? 0M : (priceCurr - priceClient) * 100 / priceClient;
                        // формирование положительного и подверждающего списков
                        if (/*priceClient == 0 ||*/ (priceClient + Math.Round(priceClient * PrcExcessPrice / 100, 2) >= priceCurr))
                        {
                            rowsOK.Add(new CartImportRow
                            {
                                rowID = Guid.NewGuid(),
                                manufacturer = manufacturer,
                                partNumber = partNumber,
                                supplierId = supplierId,
                                referenceID = referenceID,
                                deliveryPeriod = part.DisplayDeliveryDaysMin.ToString() + "-" + part.DisplayDeliveryDaysMax.ToString(),
                                itemName = part.PartDescription,
                                priceClient = priceClient,
                                priceCurr = priceCurr,
                                pricePrc = string.Format("{0:#####0.00}", pPrc),
                                quantity = quantity,
                                rowN = rec[0] ?? "",
                                strictlyThisNumber = strictlyThisNumber
                            });
                        }
                        else
                        {
                            rowsAccept.Add(new CartImportRow
                            {
                                rowID = Guid.NewGuid(),
                                manufacturer = manufacturer,
                                partNumber = partNumber,
                                supplierId = supplierId,
                                referenceID = referenceID,
                                deliveryPeriod = part.DisplayDeliveryDaysMin.ToString() + "-" + part.DisplayDeliveryDaysMax.ToString(),
                                itemName = part.PartDescription,
                                priceClient = priceClient,
                                priceCurr = priceCurr,
                                pricePrc = priceClient == 0 ? "100.00" : (PrcExcessPrice == 0
                                    ? pPrc < 0.01M ? "<0.01" : string.Format("{0:#####0.00}", pPrc)
                                    : pPrc > PrcExcessPrice && pPrc < (PrcExcessPrice + 0.01M)
                                        ? string.Format(">{0:#0.00}", PrcExcessPrice)
                                        : string.Format("{0:#####0.00}", pPrc)),
                                quantity = quantity,
                                rowN = rec[0] ?? "",
                                strictlyThisNumber = strictlyThisNumber
                            });
                        }
                    }
                    else
                    {
                        rowsER.Add(new CartImportRowError()
                        {
                            order = 20,
                            error = errorText,
                            manufacturer = rec[2],
                            partNumber = rec[3],
                            supplierId = rec[1],
                            priceClient = rec[7],
                            quantity = rec[4],
                            referenceID = rec[6],
                            rowN = rec[0],
                            strictlyThisNumber = rec[5]
                        });
                    }
                }

                //количественные проверки
                foreach (SparePartPriceKey SPPK in groupRows.Keys)
                {
                    string errorText = "";
                    //SparePartFranch part = SparePartsDac.Load(DC, SPPK);
                    //SparePartFranch part = SparePartsDacFranch.Load(DC, SPPK);
                    SparePartFranch part = parts.Where(x => x.Manufacturer.ToLower() == SPPK.Mfr.ToLower() && x.PartNumber.ToLower() == SPPK.PN.ToLower() && x.SupplierID == SPPK.SupplierId).SingleOrDefault();

                    if (groupRows[SPPK] < part.DefaultOrderQty)
                    {
                        // Минимальное необходимое количество для заказа
                        errorText += String.Format(
                            Resources.CartImport.MinOrderQuantity
                            /*"минимальное необходимое количество для заказа: {0}"*/,
                            part.MinOrderQty);
                    }
                    else if (groupRows[SPPK] % part.DefaultOrderQty != 0)
                    {
                        // Количество должно быть кратным числу деталей в комплекте
                        errorText += Resources.CartImport.ShallDivisibleQuantity /*"количество должно быть кратным числу деталей в комплекте ("*/ +
                        part.DefaultOrderQty
                        .Progression(part.DefaultOrderQty, 5)
                        .Select(i => i.ToString())
                        .Aggregate((acc, s) => acc + "," + s) + Resources.CartImport.etc_withRightBracket /*" и т.д.)"*/;
                    }
                    if (part.QtyInStock.GetValueOrDefault() > 0 && groupRows[SPPK] > part.QtyInStock)
                    {
                        // Количество превышает допустимый лимит
                        errorText += String.Format(
                            Resources.CartImport.QuantityExceedsAvailable
                            /*"заказанное количество превышает остатки склада, доступно: {0}"*/,
                            part.QtyInStock);
                    }
                    if (!string.IsNullOrEmpty(errorText))
                    {
                        // при наличии ошибок перекидываем из успешных списков в список количественных ошибок
                        var tAcc = rowsAccept.Where(t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId).ToList();
                        AddToERQty(false, errorText, rowsAccept, tAcc);
                        var tOK = rowsOK.Where(t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId).ToList();
                        AddToERQty(true, errorText, rowsOK, tOK);
                    }
                }
            }
        }
        public static List <Cell> FindCells(string Range, WorksheetPart worksheetPart)
        {
            Worksheet worksheet = worksheetPart.Worksheet;
            SheetData sheetData = worksheet.GetFirstChild <SheetData>();

            Range = Range.Replace("$", "");
            string FirstReference = Range.Split(':')[0], LastReference = Range.Split(':')[1];


            uint FirstrowIndex = SpreadsheetReader.RowFromReference(FirstReference);

            uint LastrowIndex = SpreadsheetReader.RowFromReference(LastReference);

            int FirstcolumnIndex = SpreadsheetReader.GetColumnIndex(SpreadsheetReader.ColumnFromReference(FirstReference));
            int LastcolumnIndex  = SpreadsheetReader.GetColumnIndex(SpreadsheetReader.ColumnFromReference(LastReference));

            IEnumerable <Row> match = sheetData.Elements <Row>().Where(r => r.RowIndex.Value >= FirstrowIndex && r.RowIndex.Value <= LastrowIndex);

            List <Cell> listCells = new List <Cell>();

            foreach (Row row in match)
            {
                foreach (Cell cell in row)
                {
                    if (SpreadsheetReader.GetColumnIndex(SpreadsheetReader.ColumnFromReference(cell.CellReference.Value)) >= FirstcolumnIndex && SpreadsheetReader.GetColumnIndex(SpreadsheetReader.ColumnFromReference(cell.CellReference.Value)) <= LastcolumnIndex)
                    {
                        if (cell.CellValue != null)
                        {
                            double d;
                            if (cell.DataType != null)
                            {
                                if (cell.DataType.Value == CellValues.Number || cell.DataType.Value == CellValues.SharedString)
                                {
                                    listCells.Add(cell);
                                }
                                if (cell.DataType.Value == CellValues.String)
                                {
                                    if (double.TryParse(cell.CellValue.Text, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CreateSpecificCulture("en-US"), out d))
                                    {
                                        listCells.Add(cell);
                                    }
                                }
                            }
                            else if (double.TryParse(cell.CellValue.Text, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CreateSpecificCulture("en-US"), out d))
                            {
                                listCells.Add(cell);
                            }
                        }
                        else if (cell.CellFormula != null)
                        {
                            listCells.Add(cell);
                        }
                    }
                }
            }

            return(listCells);
        }
Esempio n. 5
0
        /// <summary>
        /// Разбор Excel файла
        /// </summary>
        /// <param name="reader">объект чтения</param>
        private void LoadStatusesFromReader(SpreadsheetReader reader)
        {
            //проверка наличия в файле единственного листа с заказом
            reader.CurrentSheet = 0;
            if (reader.SheetCount > 1)
            {
                AddError(ErrorReason.SingleSheetRequired, "");
                return;
            }

            int numOfFields = 9;

            // ID текущего менеджера по идее
            int managerUserID = SiteContext.Current.User.UserId;

            for (int r = 1; r < reader.RecordCount; r++)
            {
                string[] rec = new string[numOfFields];
                for (int i = 0; i < numOfFields; i++)
                {
                    rec[i] = reader[r, i];
                }

                rec = rec.Each(s => s.Trim()).ToArray();

                if (rec.All(s => s == "")) { continue; }

                if (rec.All(s => string.IsNullOrEmpty(s))) { break; }

                _res.Add(new TempOLStatuse()
                {
                    ManagerUserID = managerUserID,
                    SupplierID = rec[1],
                    Manufacturer = rec[2],
                    PartNumber = rec[3],
                    Qty = rec[4],
                    AcctgOrderLineID = rec[5],
                    CurrentStatus = byte.Parse(rec[6]),
                    NewStatus = rec[7],
                    OrderID = rec[8],

                });
            }
        }
Esempio n. 6
0
 protected string GetNextColumn(string colname)
 {
     return(SpreadsheetReader.GetColumnName(colname, 1));
 }
Esempio n. 7
0
 public bool SetWorksheet(string sheetName)
 {
     _worksheet = SpreadsheetReader.GetWorksheetPartByName(_doc, sheetName);
     return(_worksheet != null);
 }
Esempio n. 8
0
        private void LoadTiresFromReader(SpreadsheetReader reader, LoadResult result)
        {
            //проверка наличия в файле единственного листа с заказом
            reader.CurrentSheet = 0;
            int numOfFields = 9;

            List<RmsAuto.Store.Cms.Entities.Battery> t = new List<RmsAuto.Store.Cms.Entities.Battery>();
            for (int r = 1; r < reader.RecordCount; r++)
            {
                string[] rec = new string[numOfFields];
                for (int i = 0; i < numOfFields; i++)
                    rec[i] = reader[r, i];

                rec = rec.Each(s => s.Trim()).ToArray();

                if (rec.All(s => s == ""))
                    continue;

                if (rec.All(s => string.IsNullOrEmpty(s)))
                {
                    break;
                }

                var t1 = new RmsAuto.Store.Cms.Entities.Battery();

                for (int c = 0; c < numOfFields; c++)
                {
                    string value = rec[c];
                    try
                    {
                        switch (c)
                        {
                            case 0: t1.Manufacturer = value; break;
                            case 1: t1.ModelName = value; break;
                            case 2: t1.PartNumber = value; break;
                            case 3: t1.Capacity = Decimal.Parse(value); break;
                            case 4: t1.polarity = value; break;
                            case 5: t1.cleat = value; break;
                            case 6: t1.Size = value; break;
                        }
                    }
                    catch
                    {
                        //TODO допилить обработку ошибок
                    }
                }
                t.Add(t1);
            }

            using (CmsDataContext cms = new CmsDataContext())
            {
                try
                {
                    cms.Connection.Open();
                    cms.Transaction = cms.Connection.BeginTransaction();
                    var current = cms.Batteries.Select(x => x).ToList();
                    current.Sort(new BatteryComparer());
                    t.Sort(new BatteryComparer());

                    t = t.Select(x => x).Distinct(new BatteryComparer()).ToList();

                    //Пробегаем по каждому объекту каталога и смотрим какая у него была картинка
                    foreach (var RefObj in t)
                    {
                        var tmp = current.Where(x => x.PartNumber == RefObj.PartNumber).FirstOrDefault();
                        RefObj.ImageUrl = tmp != null && tmp.ImageUrl.HasValue ? tmp.ImageUrl : (int)NoPhotoID.Battery;
                    }

                    t = t.UnionAndDistinct<RmsAuto.Store.Cms.Entities.Battery>(current, new BatteryComparer());

                    cms.Batteries.DeleteAllOnSubmit(current);
                    cms.Batteries.InsertAllOnSubmit(t);
                    cms.SubmitChanges(ConflictMode.ContinueOnConflict);
                    cms.Transaction.Commit();
                }
                catch (ChangeConflictException)
                {
                    //TODO допилить обработку ошибок
                }
                catch (Exception)
                {
                    cms.Transaction.Rollback();
                    Logger.WriteError("Ошибка при сохранении результатов загрузки аккумуляторов", EventLogerID.BLException, EventLogerCategory.BLError);
                }
                finally
                {
                    if (cms.Connection.State == System.Data.ConnectionState.Open) { cms.Connection.Close(); }
                }
            }
        }
Esempio n. 9
0
        private void ReadTables(CremaDataSet dataSet, IDataBase dataBase, string filename, string itemNames)
        {
            var sheetNames = SpreadsheetReader.ReadSheetNames(filename);
            var tableInfos = dataBase.Dispatcher.Invoke(() =>
            {
                var query = from table in dataBase.TableContext.Tables
                            let tableName2 = SpreadsheetUtility.Ellipsis(table.Name)
                                             join sheetName in sheetNames on tableName2 equals sheetName
                                             where table.Name.GlobMany(itemNames) || table.Path.GlobMany(itemNames)
                                             orderby table.Name
                                             select table.TableInfo;

                return(query.ToArray());
            });

            var typeInfos = dataBase.Dispatcher.Invoke(() =>
            {
                var query = from table in dataBase.TableContext.Tables
                            let tableName2 = SpreadsheetUtility.Ellipsis(table.Name)
                                             join sheetName in sheetNames on tableName2 equals sheetName
                                             where table.Name.GlobMany(itemNames) || table.Path.GlobMany(itemNames)
                                             from column in table.TableInfo.Columns
                                             where CremaDataTypeUtility.IsBaseType(column.DataType) == false
                                             let type = dataBase.TypeContext[column.DataType] as IType
                                                        where type != null
                                                        select type.TypeInfo;

                return(query.Distinct().ToArray());
            });

            foreach (var item in typeInfos)
            {
                dataSet.Types.Add(item);
            }

            foreach (var item in tableInfos)
            {
                if (item.TemplatedParent != string.Empty)
                {
                    continue;
                }
                if (item.ParentName == string.Empty)
                {
                    dataSet.Tables.Add(item);
                }
                else
                {
                    dataSet.Tables[item.ParentName].Childs.Add(item);
                }
            }

            foreach (var item in tableInfos)
            {
                if (item.TemplatedParent != string.Empty && item.ParentName == string.Empty)
                {
                    var dataTable = dataSet.Tables[item.TemplatedParent];
                    dataTable.Inherit(item.TableName);
                }
            }

            var progress = new ConsoleProgress(this.Out)
            {
                Style = ConsoleProgressStyle.None
            };

            using (var reader = new SpreadsheetReader(filename))
            {
                reader.Read(dataSet, progress);
            }
        }
 public void Read(CremaDataSet dataSet)
 {
     using var reader = new SpreadsheetReader(this.Path);
     reader.Read(dataSet);
 }